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

4位加法器测试问题:carry_out始终为x无法打印结果

4位加法器测试问题分析

我正在制作并测试一个4位加法器,打算用wait语句,通过检查sum和carry_out是否>=0来判断电路是否完成计算。电路输入通过命令行参数传入,这个4位加法器是用已经测试通过的全加器模块搭建的。

full_adder.v

//Behavioral Verilog
module full_adder (input a, input b, input cin, output s, output cout);
    assign s = a ^ b ^ cin;
    assign cout = (a && b) || (a && cin) || (b && cin);
endmodule

4_bit_adder.v

module four_bit_adder(input [0:3] x, input [0:3] y, input carry_in, output [0:3] sum, output carry_out);
    full_adder add1(x[0], y[0], sum[0], carry_in, carry1);
    full_adder add2(x[1], y[1], sum[1], carry1, carry2);
    full_adder add3(x[2], y[2], sum[2], carry2, carry3);
    full_adder add4(x[3], y[3], sum[3], carry3, carry_out);
endmodule

4_bit_adder_tester.v

module four_bit_adder_test;
    reg [0:3]x;
    reg [0:3]y;
    reg carry_in;
    wire sum;
    wire carry_out;
    four_bit_adder adder(x, y, carry_in, sum, carry_out);

    initial begin
        $display("Here");
        if (!$value$plusargs("x=%d", x)) begin
            $display("ERROR: please specify +x=<value> to start.");
            $finish;
        end   
        if (!$value$plusargs("y=%d", y)) begin
            $display("ERROR: please specify +y=<value> to start.");
            $finish;
        end
        if (!$value$plusargs("carry_in=%d", carry_in)) begin
            $display("ERROR: please specify +carry_in=<value> to start.");
            $finish;
        end
        wait(sum >= 0 && carry_out>= 0) $display("sum=%d, carry_out=%d", sum, carry_out);
        $finish;
    end
endmodule

现在的问题是carry_out始终为x,导致sum和carry_out的结果没法打印。我检查过电路逻辑,觉得是正确的,请问这种测试Verilog代码的方式是否有效?


问题分析与解答

1. 测试方式完全无效

你用wait(sum >= 0 && carry_out >= 0)的逻辑存在本质错误:

  • Verilog的线网类型(wire)未正确连接时默认值为z(高阻态),属于四值逻辑(0、1、x、z)范畴,和整数>=0的比较结果是未知态x,永远无法满足wait的触发条件。
  • 测试模块中sum的声明错误:four_bit_adder的sum是4位总线,但测试代码里写成了单比特wire sum;,端口不匹配直接导致sum值异常。

2. 加法器模块的核心错误

你的four_bit_adder模块中,全加器的端口顺序完全颠倒了!full_adder的端口定义是(input a, input b, input cin, output s, output cout),但例化时把sum[0]当成了cin输入、carry_in当成了s输出,这种端口错位是carry_out始终为x的根本原因。

3. 正确的修正方案

修正后的4_bit_adder.v

module four_bit_adder(input [0:3] x, input [0:3] y, input carry_in, output [0:3] sum, output carry_out);
    // 声明中间进位信号
    wire carry1, carry2, carry3;
    // 按照full_adder的端口顺序正确例化:a, b, cin, s, cout
    full_adder add1(x[0], y[0], carry_in, sum[0], carry1);
    full_adder add2(x[1], y[1], carry1, sum[1], carry2);
    full_adder add3(x[2], y[2], carry2, sum[2], carry3);
    full_adder add4(x[3], y[3], carry3, sum[3], carry_out);
endmodule

修正后的4_bit_adder_tester.v

module four_bit_adder_test;
    reg [0:3]x;
    reg [0:3]y;
    reg carry_in;
    // 匹配模块的4位sum输出
    wire [0:3] sum;
    wire carry_out;
    four_bit_adder adder(x, y, carry_in, sum, carry_out);

    initial begin
        $display("Starting test...");
        if (!$value$plusargs("x=%d", x)) begin
            $display("ERROR: please specify +x=<value> to start.");
            $finish;
        end   
        if (!$value$plusargs("y=%d", y)) begin
            $display("ERROR: please specify +y=<value> to start.");
            $finish;
        end
        if (!$value$plusargs("carry_in=%d", carry_in)) begin
            $display("ERROR: please specify +carry_in=<value> to start.");
            $finish;
        end
        // 组合逻辑无需wait,输入稳定后直接打印结果
        $display("x=%d, y=%d, carry_in=%d", x, y, carry_in);
        $display("sum=%d, carry_out=%d", sum, carry_out);
        $finish;
    end
endmodule

总结

你当前的测试方式完全无效,根源在于端口连接错误和对Verilog四值逻辑、组合逻辑行为的误解。修正端口顺序并去掉错误的wait语句后,测试即可正常工作。

内容的提问来源于stack exchange,提问作者Adam Ashkenazy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:50:46