你这根本用不到时钟。
equal应该是一直为1的。如果不为1则认为有错。
下面的代码没有编译过,估计会有语法错误,你自己调试一下吧。思路就是用穷举法来试。
另外,一个加法器没什么好验证的吧。。。因为验证的逻辑本身就是个“加法器”,就好比是用待验证的东西来验证待验证的东西本身,没什么意义。
`timescale 1ns/100ps
module tb();
reg [16:0] a_reg;
reg [16:0] b_reg;
reg [1:0] cin_reg;
reg [15:0] sum_reg;
reg carry_reg;
wire [15:0] sum;
wire carry;
wire equal;
initial begin
a_reg=0;
b_reg=0;
cin_reg=0;
sum_reg=0;
carry_reg=0;
#100;
for(cin_reg=0;cin_reg<=1;cin_reg=cin_reg+1)
for(a_reg=0;a_reg<={16{1'b1}};a_reg=a_reg+1) begin
for(b_reg=0;b_reg<={16{1'b1}};b_reg=b_reg+1) begin
{carry_reg, sum_reg} = a_reg[15:0] + b_reg[15:0] + cin_reg[0];
#1;
end
end
end
#100;
$stop;
end
counter_16 u_counter_6(
.cout(carry),
.sum(sum),
.a(a_reg[15:0]),
.b(b_reg[15:0]),
.cin(cin_reg[0])
);
assign equal = carry==carry_reg && sum==sum_reg;
endmodule
adder模块的编写有问题,默认的输入信号a、b、cin是wire的类型,wire类型是不能相加的啊。
可以考虑把定义临时变量为reg类型,然后在时钟的上升沿把a、b、cin的值锁存到临时变量里,再进行计算。