You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:31:39