您好我正在尝试为我的verilog代码测试所有可能的输入案例。我用for循环设置了它。
for(sel = 0;sel < 4;sel=sel+1) begin
for(a = 0;a < 8;a=a+1) begin
for(b = 0;b < 8;b=b+1) begin
#50;
end
end
end
它提前工作但我必须改变一些东西或者Isim可能有错误。 我也初始化了a,b和sel。
reg [2:0] a;
reg [2:0] b;
reg [1:0] sel;
但是当我尝试模拟tb文件时,它只会反复循环通过b! 为什么会这样?我已经玩了一段时间而且没有运气。
此外,当我将b界限更改为&lt; 7时,它将开始循环通过a,但我必须将界限更改为&lt; 7以循环通过sel。虽然这部分有效,但它会跳过a和b的111和11的情况。
此外,我决定手动测试所有情况下的位,并显示正确的结果。
答案 0 :(得分:2)
您有一个无限循环,因为您的结束条件(b < 8
)始终为真。您可以使用以下代码轻松证明这一点。你可以看到0-7重复多次:
module tb;
reg [2:0] b;
initial begin
for (b = 0;b < 8;b=b+1) begin
$display(b);
#50;
end
end
initial #1000 $finish;
endmodule
/*
Output:
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
0
1
2
3
*/
由于您将b
声明为3位信号,因此其值范围为0到7.因此,b始终小于8.当b = 7时,b + 1 = 0 ,而不是8。
将8更改为7仅显示0-6一次,因为结束条件(b < 7
)变为false。
这是一种从0循环到7次的方法:
module tb;
reg [2:0] b;
initial begin
b = 0;
repeat (8) begin
$display(b);
#50;
b=b+1;
end
end
endmodule
另一种常见方法是将b
声明为integer
而不是3位reg
。然后for (b = 0;b < 8;b=b+1) begin
循环0-7一次,因为b可以增加到8. integer
是32位有符号值(参见IEEE Std 1800-2012,第6.11节“整数”数据类型)。