首页 > 解决方案 > 我看不到记忆的内容

问题描述

当我尝试模拟一个应该处理从 SRAM 存储器获取的数据的电路时,我遇到了问题。首先,SRAM存储器中充满了数据,如果查看最后一个测试台可以看出这一点,然后存储的数据将由自动机处理。然后,在某些特定情况下,输出将存储在另一个 SRAM 存储器中。因此,在仿真时,电路会以一种奇怪的方式运行,因为表示从第一个 SRAM 存储器读取数据的 rd_data_instrucions 始终未定义。因此,取决于 rd_data_instructions 的所有其他信号也未定义。代码发布在这里。

PS:模块 sram_1port_instructions 和 sram_1port_data 应该作为时钟 SRAM,具有写使能信号,因此当 wr_en 为高电平时,内存存储接收到的数据(wr_data),当 wr_en 为低电平时,内存可以输出数据(rd_data)。模块用户代表一个“接口”,它有助于写入过程,因此写入 SRAM 指令存储器不需要存储数据的地址,因为该模块提供了一种增加存储器“写地址指针”的机制。此外,我们可以看到该模块对应的测试平台。然后,我们可以看到另一个内存的对应模块,它是为输出存储而创建的,以及一个旨在促进读取过程的模块(即类似于前面的情况,但是,它不是促进写作过程,而是简化了阅读)。最后但并非最不重要的一点是,我们可以区分一个叉骨模块,它应该互连所有先前的模块以创建一个数字系统。因此,自动机从 SRAM 指令存储器中获取数据,然后输出一些存储在另一个存储器中的数据。最后,可以从 SRAM 数据存储器中读取结果。当我尝试模拟系统时会出现问题,因为我在尝试读取某些信号时遇到困难,例如 rd_data_instructions,它应该显示以前存储的 SRAM 指令存储器中的值,隐含的“in”信号,它应该提供输入自动机等等。在叉骨模块中,我使用了一个标有“开始”的特殊信号 它将写使能设置为 0,以便 SRAM 存储器为读取过程做好准备。这个特殊的信号实际上触发了自动机,通过“输入”来自内存的输入数据。

//wishbone module
module wishbone(
    input clk,rst,start,
    output reg [2:0]in,
    output reg wr_en_instructions,wr_en_display,
    input [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
    output reg [3:0] wr_data_display,
    output [2:0] rd_data_instructions,
    output [3:0] rd_data_display,//created for user, in order to make possible the display
    output [12:0]o
);

reg [15:0] pointer_instructions,pointer_display;

initial wr_en_instructions = 1'b1;

control_unit i0(.clk(clk),.rst(rst),.in(in),.o(o));
user i1(.clk(clk),.wr_en(wr_en),.address_in(pointer_instructions),.wr_data(wr_data_instructions),.rd_data(rd_data_instructions));
display i2(.clk(clk),.wr_en(wr_en_display),.address_in(pointer_display),.wr_data(wr_data_display),.rd_data(rd_data_display));
integer i = 0;
always @ * begin
    wr_en_display = ~wr_en_instructions;
end
always @(posedge clk) begin
    if(start) begin
        pointer_instructions <= 16'b0;
        pointer_display <= 16'b0;
        wr_en_instructions <= 1'b0;
    end
    else begin
        $display(rd_data_instructions);
        if(!wr_en_instructions) begin
            if(rd_data_instructions == 3'b1xx) begin
                wr_en_instructions <= 1'b1;//???
            end
            else if(rd_data_instructions == 3'b010) begin
                in <= rd_data_instructions;
                wr_data_display <= o;
                pointer_instructions <= pointer_instructions + 1;
                pointer_display <= pointer_display + 1;
            end
            else begin
                in <= rd_data_instructions;
                pointer_instructions <= pointer_instructions + 1;
            end
        end
        else begin
            i = i + 1;
        end
    end
end

endmodule

//testbench for top module
module wishbone_tb(
    output reg clk,rst,start,
    output [2:0]in,
    output wr_en_instructions,wr_en_display,
    output reg [2:0] wr_data_instructions,//created for usr, in order to make possible to write data
    output [3:0] wr_data_display,
    output [2:0] rd_data_instructions,
    output [3:0] rd_data_display,//created for user, in order to make possible the display
    output [12:0]o
);

wishbone cut(
    .clk(clk),.rst(rst),.start(start),
    .in(in),
    .wr_en_instructions(wr_en_instructions),.wr_en_display(wr_en_display),
    .wr_data_instructions(wr_data_instructions),
    .wr_data_display(wr_data_display),
    .rd_data_instructions(rd_data_instructions),
    .rd_data_display(rd_data_display),
    .o(o)
);

initial $dumpvars(0,wishbone_tb);

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

initial begin
    rst = 1'b1;
    #400 rst = 1'b0;
end

initial begin
    start = 1'b0;
    #13000400 start = 1'b1;
    #400 start = 1'b0;
end

initial begin
    wr_data_instructions = 3'd1;
    #3000400 wr_data_instructions = 3'd2;
    #1000000 wr_data_instructions = 3'd1;
    #3000000 wr_data_instructions = 3'd0;
    #2000000 wr_data_instructions = 3'd3;
    #1000000 wr_data_instructions = 3'd1;
    #3000000 wr_data_instructions = 3'd4;//halt
end

endmodule

标签: memoryverilogsimulationinstantiationicarus

解决方案


推荐阅读