Memory Can';在模拟中访问RAM内容时看不到任何内容

Memory Can';在模拟中访问RAM内容时看不到任何内容,memory,verilog,simulation,hdl,icarus,Memory,Verilog,Simulation,Hdl,Icarus,我在设计SRAM内存时遇到了一个问题。更具体地说,内存是计时的,有一个写启用-高时,可以写数据,低时,可以读取数据-一个地址输入,指定写入/读取数据的内存地址。然后,我创建了一个名为user的模块,它简化了写操作;因此,在写入数据时不需要提供存储器地址 我的问题发生在我尝试模拟电路时,因为在访问内存内容时看不到任何东西。在测试台中,我指定了一些要存储在内存中的值,然后,我提取了数据,但没有成功 我把代码附在这里 //stores instructions module sram_1port_in

我在设计SRAM内存时遇到了一个问题。更具体地说,内存是计时的,有一个写启用-高时,可以写数据,低时,可以读取数据-一个地址输入,指定写入/读取数据的内存地址。然后,我创建了一个名为
user
的模块,它简化了写操作;因此,在写入数据时不需要提供存储器地址

我的问题发生在我尝试模拟电路时,因为在访问内存内容时看不到任何东西。在测试台中,我指定了一些要存储在内存中的值,然后,我提取了数据,但没有成功

我把代码附在这里

//stores instructions
module sram_1port_instructions(
    input clk,//clocked memory
    input wr_en,//when high, data is writeen, otherwise is read
    input [15:0] address_in,//suppose timer cannot count more than 13ms
    input [2:0] wr_data,//3 bit instructions
    output reg [2:0] rd_data
);

reg [2:0] memory [2 ** 15 - 1 : 0];

always @(posedge clk) begin
    if(wr_en) memory[address_in] <= wr_data;
    else rd_data <= memory[address_in];
end

endmodule

//user interface designed for the first memory
module user(
    input clk,
    input wr_en,
    input [15:0] address_in,
    input [2:0] wr_data,
    output [2:0] rd_data
);

reg [15:0] pointer,address;

initial pointer = 16'd0;

sram_1port_instructions i0(.clk(clk),.wr_en(wr_en),.address_in(address_in),.wr_data(wr_data),.rd_data(rd_data));

always @(posedge clk) begin
    if(wr_en) begin
        address <= pointer;
        pointer <= pointer + 1;
    end 
    else address <= address_in;
end

endmodule

//user tb
module user_tb(
    output reg clk, wr_en, 
    output reg [15:0] address_in,
    output reg [2:0] wr_data,
    output [2:0] rd_data
);

user cut(.clk(clk),.wr_en(wr_en),.address_in(address_in),.wr_data(wr_data),.rd_data(rd_data));

initial $dumpvars(0,user_tb);

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

initial begin
    wr_en = 1'd1;
    #100000 wr_en = 1'd0;
end

integer i;

initial begin
    wr_data = 3'd0;
    for(i = 1;i < 500;i = i + 1) begin
    #200 wr_data = i;
    end
end

initial begin
    address_in = 16'd0;
    #100000 address_in = 16'd0;
    for(i = 1;i < 500;i = i + 1) begin
    #200 address_in = i;
    end
end

endmodule
//存储指令
模块sram_1端口_说明(
输入时钟,//时钟存储器
输入wr_en,//高时,数据写入,否则读取
在中输入[15:0]地址。\u,//假设计时器的计数不能超过13毫秒
输入[2:0]wr_数据,//3位指令
输出reg[2:0]rd_数据
);
reg[2:0]内存[2**15-1:0];
始终@(posedge clk)开始

当我运行模拟并查看波形时,如果(wr_en)内存[address_in],我会看到
rd_data
=3次100000。此时,您读取了地址0,这是您写入地址0的最后一个值。否则,对其他地址的所有读取将返回X(未知)。当您执行所有写入操作时,您只向地址0进行写入。从时间=0到时间=100000,
wr\u en
=1,
中的
地址=0(在
sram\u 1port\u指令
模块内)。当您查看VCD文件中的波形时,可以看到这一点。
wr_data
每个时钟周期都会更改,但每个周期都会写入相同的地址

但是,在
用户
中,如果将
地址
信号连接到
sram\u 1port\u指令
模块的
端口中的to
地址,则将写入不同的地址

更改:

sram_1port_instructions i0(.clk(clk),.wr_en(wr_en),.address_in(address_in),.wr_data(wr_data),.rd_data(rd_data));
致:

您的代码将
信号中的常量
地址_连接到
端口中的
地址_


当我进行更改时,我看到所有不同的值都从RAM中读取。

当我运行您的模拟并查看波形时,我看到
rd_数据
=3次100000。此时,您读取了地址0,这是您写入地址0的最后一个值。否则,对其他地址的所有读取将返回X(未知)。当您执行所有写入操作时,您只向地址0进行写入。从时间=0到时间=100000,
wr\u en
=1,
中的
地址=0(在
sram\u 1port\u指令
模块内)。当您查看VCD文件中的波形时,可以看到这一点。
wr_data
每个时钟周期都会更改,但每个周期都会写入相同的地址

但是,在
用户
中,如果将
地址
信号连接到
sram\u 1port\u指令
模块的
端口中的to
地址,则将写入不同的地址

更改:

sram_1port_instructions i0(.clk(clk),.wr_en(wr_en),.address_in(address_in),.wr_data(wr_data),.rd_data(rd_data));
致:

您的代码将
信号中的常量
地址_连接到
端口中的
地址_

当我进行更改时,我看到所有不同的值都从RAM中读取