为什么这个 for 循环包含延迟而不是 运行 完成?
Why does this for loop containing a delay not run to completion?
我有两个测试台:
// test_a.v
module test_a;
initial
begin
for (int i = 0; i < 128; i++) begin
$display("hello");
#10;
end
end
endmodule
// test_b.v
module test_b;
initial
begin
#50;
$finish();
end
endmodule
我这样构建和 运行 是这样的:
iverilog -g2012 -o icarus.out test_a.v test_b.v
vvp icarus.out
...然后看到这个输出:
hello
hello
hello
hello
hello
hello
但到此为止。为什么我没有收到 128 个“hello”?我猜想 test_b.v
中的 $finish()
会导致 test_a.v
提前退出,但这是预期的吗?
很可能是您未显示的一段代码有问题。在初始块之后添加最终块可能会提供一些线索。
final $display($realtime);
不幸的是,Icarus Verilog 没有通知您它已命中 $finish
而只是打印 Done
。因此,您可能想要搜索其他 $finish
任务并在其前面放置一个 $display
语句。
更新:
根据您更新的代码,所有模块共享相同的模拟时间全局概念,开始和 end-of-time。当一个模块执行$finish
时,就是整个模拟的end-of-time。按照您的编码方式,无论您看到 5 个还是 6 个“hello”,都存在竞争条件。
我有两个测试台:
// test_a.v
module test_a;
initial
begin
for (int i = 0; i < 128; i++) begin
$display("hello");
#10;
end
end
endmodule
// test_b.v
module test_b;
initial
begin
#50;
$finish();
end
endmodule
我这样构建和 运行 是这样的:
iverilog -g2012 -o icarus.out test_a.v test_b.v
vvp icarus.out
...然后看到这个输出:
hello
hello
hello
hello
hello
hello
但到此为止。为什么我没有收到 128 个“hello”?我猜想 test_b.v
中的 $finish()
会导致 test_a.v
提前退出,但这是预期的吗?
很可能是您未显示的一段代码有问题。在初始块之后添加最终块可能会提供一些线索。
final $display($realtime);
不幸的是,Icarus Verilog 没有通知您它已命中 $finish
而只是打印 Done
。因此,您可能想要搜索其他 $finish
任务并在其前面放置一个 $display
语句。
更新:
根据您更新的代码,所有模块共享相同的模拟时间全局概念,开始和 end-of-time。当一个模块执行$finish
时,就是整个模拟的end-of-time。按照您的编码方式,无论您看到 5 个还是 6 个“hello”,都存在竞争条件。