为什么iverilog抱怨我的测试台模块?

为什么iverilog抱怨我的测试台模块?,verilog,iverilog,Verilog,Iverilog,我正在为我的CompSci类编写一个verilog模块,这个模块就是数据存储模块。从结构和分析上看,我正在看它,它应该基于我拥有的其他文件工作,但我不确定为什么这一个特别地起作用,并给我所有的x。希望一双新的眼睛能帮助我发现我错过的错误。提前谢谢 datamem.v: module datamem(Ina, Inb, enable, readwrite, dataOut, clk, rst); input wire [31:0] Ina; input wire [31:0] Inb; inpu

我正在为我的CompSci类编写一个verilog模块,这个模块就是数据存储模块。从结构和分析上看,我正在看它,它应该基于我拥有的其他文件工作,但我不确定为什么这一个特别地起作用,并给我所有的x。希望一双新的眼睛能帮助我发现我错过的错误。提前谢谢

datamem.v:

module datamem(Ina, Inb, enable, readwrite, dataOut, clk, rst);

input wire [31:0] Ina;
input wire [31:0] Inb;
input wire enable;
input wire readwrite;
input wire clk;
input wire rst;

reg [31:0] memory[0:65535];
output reg [31:0] dataOut;

always @(memory[Ina]) begin
        dataOut = memory[Ina];
    end

always @(posedge clk) begin
    if(1'b1 == readwrite) begin
        memory[Ina] = Inb;
    end
end

endmodule
datamem_tb.v:

module datamem_tb();

reg [31:0] Ina;
reg [31:0] Inb;
reg enable;
reg readwrite;
reg clk;
reg rst;

wire [31:0] dataOut;

datamem DUT (Ina, Inb, enable, readwrite, dataOut, clk, rst);

initial
begin

    Ina <= 32'd0;
    Inb <= 32'd0;
    enable <= 0;
    readwrite <= 0;

    #20 Ina <= 32'd1234;
    #20 Inb <= 32'd1234;
    #20 Ina <= 32'd0517;
    #20 Inb <= 32'd10259;

end

always @(Ina or Inb)
    #1 $display("| Ina = %d | Inb = %d | dataOut = %d |", Ina, Inb, dataOut);

endmodule
module datamem_tb();
reg[31:0]Ina;
reg[31:0]Inb;
注册启用;
reg读写;
注册时钟;
注册rst;
连线[31:0]数据输出;
数据存储器DUT(Ina、Inb、启用、读写、数据输出、时钟、rst);
最初的
开始

关于为什么你会得到所有的
'x
,有几点:

  • 如果从未运行过时钟,则需要添加以下内容以切换时钟:
  • 您从不断言写入内存模块所需的
    readwrite
    (您在第20行将其设置为
    0
    ,并且从不更改它)。如果不写入,
    内存
    将为每个元素保留其原始值
    'x
  • 除此之外,您的模块还有一些其他问题:

  • 使用隐式敏感列表(而不是
    always@(内存[inA])
    使用
    always@(*)
  • 对内存写入使用非阻塞分配(
    memory[inA]
    
         initial begin
           clk = 1'b0;
           forever #5 clk = ~clk;
         end