verilog - 为什么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
解决方案
关于为什么你得到所有的一些事情'x
:
- 您永远不会运行时钟,您需要添加以下内容才能切换时钟:
initial begin
clk = 1'b0;
forever #5 clk = ~clk;
end
- 您永远不会断言
readwrite
写入内存模块所需的内容(您将其设置为0
第 20 行并且永远不会更改它)。在不被写入的情况下,将为每个元素memory
保留其原始值'x
除此之外,您的模块还有一些其他问题:
- 使用隐式敏感列表(而不是
always @(memory[inA])
usealways @(*)
) - 对内存写入使用非阻塞分配 (
memory[inA] <= inB
) - 考虑使用
$monitor
而不是$display
打印语句以避免时间问题,并且您只需要initial
在测试台中的块开始处调用它(http://referencedesigner.com/tutorials/verilog/verilog_09.php) - 你
rst
和enable
没有连接到任何东西。
可以在此处找到内存单元实现的另一个示例: 数据内存单元
推荐阅读
- mysql - 更优雅的连接方式?
- sql - regexp_substr 中的 sub# 是什么意思
- flutter - 如何解决子重复错误?
- azure-ad-b2c - Azure B2C 登录提示不正确
- vba - VBA(32 位)调用 x86(32 位)DLL (C++) 继续失败并显示“类型不匹配”
- python - 如何比较两个不同数据框中的系列值并插入新值?
- r - 使用 glmmTMB 拟合具有两个分类变量之间交互作用的混合模型
- c++ - glTF 骨骼矩阵是在局部空间还是模型空间中指定的?
- rundeck - Rundeck Job List View插件安装问题
- java - 带有自定义数组列表的空对象引用。在哪里实例化?