Verilog Testbench无法通过wire/reg传递十进制值问题咨询
解决Verilog Testbench十进制数值传递问题
我来帮你搞定这个Verilog testbench的问题,先梳理下现有代码里的小坑,再一步步给出可行的解决方案:
先修正summation.v模块的问题
你的求和模块里有两个容易导致错误的点:敏感列表不完整、冗余寄存器使用。修正后的代码如下:
module summation(a, b, c); input [3:0] a; input [3:0] b; output reg[7:0] c; always @(a or b) begin // 敏感列表必须包含a和b,否则b变化时模块不会更新输出 c = a + b; // 组合逻辑用阻塞赋值更符合设计习惯 end endmodule
解释:原来的敏感列表只加了a,当b的值改变时,模块不会触发计算;另外你定义的anum、bnum完全是冗余的,直接用输入端口计算即可,减少不必要的寄存器开销。
完整的summationtest.v(支持十进制输入传递)
你原来的testbench没写完,这里给出完整的实现,直接支持十进制数值的传递和验证:
module summationtest; reg[3:0] a; reg[3:0] b; wire[7:0] c; // 用wire连接DUT的输出端口 // 实例化待测试的求和模块(DUT) summation dut( .a(a), .b(b), .c(c) ); initial begin // 直接用十进制数值给reg变量赋值,Verilog默认就是十进制格式 a = 3; // 十进制3,对应4位二进制0011 b = 5; // 十进制5,对应4位二进制0101 #10; // 等待10个时间单位,让模块完成计算 $display("a = %d, b = %d, c = %d", a, b, c); // %d表示以十进制格式打印数值 // 测试另一组十进制输入 a = 9; b = 7; #10; $display("a = %d, b = %d, c = %d", a, b, c); // 结束仿真 $finish; end endmodule
关键知识点说明
- 十进制数值传递:Verilog中给
reg或wire赋值时,直接写数字默认就是十进制(比如a = 10;就是十进制10)。如果需要使用其他进制,才需要加后缀标识(比如16'hA是十六进制,4'b1010是二进制)。 - Testbench核心结构:必须实例化待测试的模块(DUT),用
reg类型连接DUT的输入端口(因为要在initial/always块中赋值),用wire类型连接DUT的输出端口。 - 仿真验证技巧:用
#添加时间延迟,确保模块有足够时间完成计算;用$display或$monitor打印结果,%d格式符会自动把二进制数值转换成十进制显示,方便直观验证。
仿真运行示例(以Icarus Verilog为例)
如果用Icarus Verilog工具仿真,执行以下命令即可看到十进制结果:
iverilog -o summation_sim summation.v summationtest.v vvp summation_sim
运行后会输出类似这样的结果:
a = 3, b = 5, c = 8 a = 9, b = 7, c = 16
内容的提问来源于stack exchange,提问作者mislam
相关产品推荐
相关产品推荐

