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
相关产品推荐
相关产品推荐

