我试着做一个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);
endmodule4_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);
endmodule4_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变量永远不会被打印出来。我试着打印出carry_out的值,我认为我的电路中的逻辑应该能工作。这是测试Verilog代码的有效方法吗?
发布于 2022-11-21 01:53:05
这不是一种推荐的测试方法,因为如果数据不正确,则没有输出。
更好的方法是检查输出是否与您期望的匹配。
$display("Expected %b + %b + %b = %b", x,y,carry_in, {x+y+carry_in});
#1 // let output propagate
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这让你更好地了解了出了什么问题。您将看到输出是z,这意味着您没有正确地连接东西。
同时,消除所有的警告信息。
发布于 2022-11-21 12:11:03
您需要密切关注您的模拟器日志文件,因为应该有警告消息,这将指出您的代码中的问题。例如,在EDA游乐场上,我看到了这样的警告:
Warning-[PCWM-W] Port connection width mismatch
testbench.sv, 21
"four_bit_adder adder(x, y, carry_in, sum, carry_out);"
The following 1-bit expression is connected to 4-bit port "sum" of module
"four_bit_adder", instance "adder".
Expression: sum
Instantiated module defined at: "testbench.sv", 8当您更改时,警告就会消失:
wire sum;至:
wire [0:3] sum;您可以使用wait,但是您应该考虑表达式不为真的情况。在这种情况下,您可以添加一个testbench超时,它在合理的时间之后干净地结束模拟。例如,在initial中添加第二个four_bit_adder_test块
initial begin
#50 $display("Error: timeout");
$finish;
endhttps://stackoverflow.com/questions/74512333
复制相似问题