我的测试台总是显示 X 作为输出

时间:2021-06-20 16:47:18

标签: module verilog system-verilog test-bench

我无法识别错误,但所有代码在逻辑和语法上似乎都是正确的。测试平台中 sumcarry 的值始终为 X。 有两个模块,一个用于 8 位加法器,另一个用于 16 位加法器:

module adder_8(in1 , in2 , cin , sum , carry);

input [7:0] in1 , in2;
input cin;
output reg [7:0] sum;
output reg carry;

always @(in1 or in2) begin
    {carry , sum} = in1 + in2 + cin;
end
endmodule

module adder_16(input_a , input_b , c , summation , cout);

input [15:0] input_a , input_b;
input c;
output [15:0] summation;
output cout;

wire t1;

adder_8 inst1 (input_a[7:0] , input_b[7:0] , c , summation[7:0] , t1);
adder_8 inst2 (input_a[15:8] , input_b[15:8] , t1 , summation[15:8] , cout);

endmodule

测试平台文件是:

module testbench;

reg [15:0] a,b;

wire [15:0] sum;
wire carry;

parameter zero = 1'b0;

adder_16 ex(a , b , zero , sum , carry);

initial begin

    $monitor($time," A = %d , B = %d sum = %d carry = %b", a , b , sum , carry);

    #10 a = 16'd 100; b = 16'd 100;

    #10 a = 16'd 50; b = 16'd 20;

    #20 $finish;

end
endmodule

我非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

cin 中的敏感度列表中缺少

always @(in1 or in2)。它应该是 always @(in1 or in2 or cin) 以补充标准的 1995 版。该标准的 2001 版将其改进为 always @*(或自动敏感度列表的同义词 always @(*)

如果您的目标是 SystemVerilog,请使用 always_comb(无 @ 或信号列表)。这将添加一个额外的编译时检查,以确保不会在另一个 always 块中分配逻辑,这会使代码成为非合成器。