我无法识别错误,但所有代码在逻辑和语法上似乎都是正确的。测试平台中 sum
和 carry
的值始终为 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
我非常感谢您的帮助。
答案 0 :(得分:1)
cin
中的敏感度列表中缺少 always @(in1 or in2)
。它应该是 always @(in1 or in2 or cin)
以补充标准的 1995 版。该标准的 2001 版将其改进为 always @*
(或自动敏感度列表的同义词 always @(*)
。
如果您的目标是 SystemVerilog,请使用 always_comb
(无 @
或信号列表)。这将添加一个额外的编译时检查,以确保不会在另一个 always 块中分配逻辑,这会使代码成为非合成器。