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

4位行波进位加法器特定输入测试失败问题排查

4位行波进位加法器测试失败的排查与修复

问题根源:位向量索引方向不匹配

你的代码中,四位信号x、y、sum都定义为[0:3],这意味着x[0]是最低位(LSB),x[3]是最高位(MSB)。但你输入测试用例时,是按照常规二进制写法(最左侧为最高位)输入的,比如input1=1000,这会导致Verilog将1000解析为x[0]=1, x[1]=0, x[2]=0, x[3]=0,对应十进制值为1,而非你预期的8。

同时,测试代码中x + y + carry_in的计算是基于Verilog对[0:3]向量的数值解析,虽和电路实际计算逻辑一致,但和你预期的输入含义完全相反,最终导致测试判定失败。

修复方案

最直观的修复是将所有四位信号的位宽定义改为[3:0](最高位在前,符合常规二进制书写习惯):

修改four-bit-adder.v

`include "one-bit-adder.v"
module four_bit_adder(input [3:0] x, input [3:0] y, input carry_in, output [3:0] sum, output carry_out, output overflow);
    wire c1, c2, c3;
    // 加法器连接顺序不变,x[0]仍为最低位,对应常规二进制的最右侧位
    one_bit_adder add1(x[0], y[0], carry_in, sum[0], c1);
    one_bit_adder add2(x[1], y[1], c1, sum[1], c2);
    one_bit_adder add3(x[2], y[2], c2, sum[2], c3);
    one_bit_adder add4(x[3], y[3], c3, sum[3], carry_out);
    assign overflow = c3 ^ carry_out;
endmodule

修改four-bit-adder-test.v

`include "four-bit-adder.v"
module four_bit_adder_test;
    reg [3:0]x;
    reg [3:0]y;
    reg carry_in;
    wire [3:0]sum;
    wire carry_out;
    wire overflow;
    four_bit_adder adder(x, y, carry_in, sum, carry_out, overflow);

    initial begin
        if (!$value$plusargs("x=%b", x)) begin
            $display("ERROR: please specify +x=<value> to start.");
            $finish;
        end   
        if (!$value$plusargs("y=%b", y)) begin
            $display("ERROR: please specify +y=<value> to start.");
            $finish;
        end
        if (!$value$plusargs("carry_in=%b", carry_in)) begin
            $display("ERROR: please specify +carry_in=<value> to start.");
            $finish;
        end
        
        $display("Expected: %b + %b + %b = %b", x, y, carry_in, {carry_out, sum});
        #1 // 等待输出稳定
        if ( {carry_out, sum} == x + y + carry_in )
            $display("PASSED: sum=%b, carry_out=%b", sum, carry_out);
        else    
            $display("FAILED: sum=%b, carry_out=%b", sum, carry_out);
    end

endmodule

验证测试用例

以第一个测试用例为例:

  • 输入x=1000(十进制8)、y=0110(十进制6)、carry_in=1
  • 预期结果:8+6+1=15,对应二进制01111(carry_out=0,sum=1111),修改后电路输出完全匹配预期,测试会通过。

第二个测试用例x=1000、y=0001、carry_in=1:

  • 8+1+1=10,对应二进制01010(carry_out=0,sum=1010),同样会匹配电路输出。

补充说明

若坚持使用[0:3]的位序定义,也可将测试用例的输入位序反转(比如1000改为0001),但这种方式不符合常规二进制书写习惯,易引发混淆,不推荐。

内容的提问来源于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.10 21:36:00