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

时间:2019-03-08 04:30:42

标签: 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;
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

1 个答案:

答案 0 :(得分:1)

关于为什么全部获得'x的一些注意事项:

  1. 您永远不会运行时钟,需要添加类似以下内容的时钟来进行切换:
     initial begin
       clk = 1'b0;
       forever #5 clk = ~clk;
     end
  1. 您永远不会断言readwrite这是写入内存模块所必需的(您在第20行将其设置为0,并且从不更改它)。无需写入,memory将为每个元素保留其原始值'x

除此之外,您的模块还有其他一些问题:

  1. 使用隐式敏感列表(而不是always @(memory[inA])使用always @(*)
  2. 使用非阻塞分配进行内存写入(memory[inA] <= inB
  3. 请考虑在打印语句中使用$monitor而不是$display来避免计时问题,并且只需要在测试台中initial块的开头调用它({{3 }})
  4. 您的rstenable均未连接任何东西。

可以在这里找到存储单元实现的另一个示例: http://referencedesigner.com/tutorials/verilog/verilog_09.php