首页 > 解决方案 > 为什么iverilog 抱怨我的测试平台模块?

问题描述

我正在为我的 CompSci 类编写一个 verilog 模块,这个模块特别是数据内存模块。从结构和分析上讲,我正在研究它,它应该基于我拥有的其他文件工作,但我不确定为什么这个文件特别表现出来并给了我所有的 x。希望有一双新的眼睛可以帮助找到我错过的错误。提前致谢。

数据存储器.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

标签: verilogiverilog

解决方案


关于为什么你得到所有的一些事情'x

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

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

  1. 使用隐式敏感列表(而不是always @(memory[inA])use always @(*)
  2. 对内存写入使用非阻塞分配 ( memory[inA] <= inB)
  3. 考虑使用$monitor而不是$display打印语句以避免时间问题,并且您只需要initial在测试台中的块开始处调用它(http://referencedesigner.com/tutorials/verilog/verilog_09.php
  4. rstenable没有连接到任何东西。

可以在此处找到内存单元实现的另一个示例: 数据内存单元


推荐阅读