无法从/在 SRAM 中加载/存储数据:读取数据未知

Posted

技术标签:

【中文标题】无法从/在 SRAM 中加载/存储数据:读取数据未知【英文标题】:Cannot load/store data from/in SRAM: read data is unknown 【发布时间】:2020-12-01 11:12:25 【问题描述】:

我有一个与 SRAM 存储器的 Verilog 实现相关的问题。模块sram_1port 应该是一个时钟寻址可寻址 SRAM 存储器,它有一个读使能信号和一个写使能信号。模块control_sram 应该读取/写入SRAM 中的数据。数据连续存储在连续的内存地址上。当我尝试模拟电路行为时会出现问题,因此rd_data 信号在整个模拟过程中是不确定的。因此,内存内容无法输出,我什至不知道为什么。是数据存储有问题,还是应该输出内容,还是两者都有问题?

module sram_1port(
    input clk,
    input [15:0] address,
    input wr,rd,
    input [2:0] wr_data,
    output reg [2:0] rd_data
);

reg [2:0] mem_reg [15:0];

always @ (posedge clk) begin
    if(wr) mem_reg[address] <= wr_data;
    else if(rd) rd_data <= mem_reg[address];
end

endmodule
//automaton
module control_sram(
    input clk, wr, rd,
    input [2:0] wr_data,//read 1 instruction/clk
    output [2:0] rd_data,//output
    output reg [15:0] out//outputs address
);

reg [15:0] address,address_rd,address_wr;

initial address = 16'd0;
initial address_wr = 16'd0;
initial address_rd = 16'd0;

sram_1port i0(.clk(clk),.address(address),.wr(wr),
.rd(rd),.wr_data(wr_data),.rd_data(rd_data));

always @(posedge clk) begin
    if(wr) begin
        address_wr = address_wr + 1;
        address = address_wr;
        address_rd = 16'd0;
    end
    else if(rd) begin
        address_rd = address_rd + 1;
        address = address_rd;
        address_wr = 16'd0;
    end
end

always @ * out = address;

endmodule
//tb for control_sram
module control_sram_tb(
    output reg clk,wr,rd,
    output reg [2:0] wr_data,
    output [2:0] rd_data,
    output [15:0] out
);

control_sram cut(.clk(clk),.wr(wr),.rd(rd),.wr_data(wr_data),
.rd_data(rd_data),.out(out));

initial $dumpvars(0,control_sram_tb);

initial begin
    clk = 1'd1;
    repeat (260000)
    #100 clk = ~clk;
end

initial begin
    wr_data = 3'd1;
    #3000000 wr_data = 3'd2;
    #1000000 wr_data = 3'd1;
    #3000000 wr_data = 3'd0;
    #2000000 wr_data = 3'd3;
    #1000000 wr_data = 3'd1;
end

initial begin
    rd = 1'b0;
    #13000000 rd = 1'b1;
end

initial begin
    wr = 1'b1;
    #13000000 wr = 1'b0;
end

endmodule
 

【问题讨论】:

【参考方案1】:

当我运行您的仿真时,我看到 rd_data 在 13_000_200ns 时间从 X 变为 1,并在 1 保持 3_000ns,然后它返回到 X。如果您将波形放大到该位置,您应该会看到时间间隔。如果您在 icarus 中没有看到,请使用不同的模拟器在 edaplayground 上运行您的模拟。

另外,你声明你的内存 (mem_reg) 有 16 个位置 ([15:0])。但是,我看到您的 address 采用 17、18、19 等值进行写入和读取。您试图访问不在您记忆中的位置似乎很奇怪。当您为读取执行此操作时,您会得到 X(如预期的那样)。看来您只需要一个 4 位地址,而不是 16 位地址。

【讨论】:

我认为 [2:0] mem_reg [15:0] 分配 2^(15-0+1) 个条目,每个条目 3 位。谢谢!

以上是关于无法从/在 SRAM 中加载/存储数据:读取数据未知的主要内容,如果未能解决你的问题,请参考以下文章

数据未在 JQGrid 中加载

Google BigQuery:当我从存储中加载数据时出现“string_field_0”

无法在python中加载json文件[重复]

无法在 C# 中加载 XML

无法从缓存 okHttp 和改造中加载数据

Core Data 应用程序不会从持久存储中加载数据