为什么这个 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 提前退出,但这是预期的吗?

https://www.edaplayground.com/x/JjJR

很可能是您未显示的一段代码有问题。在初始块之后添加最终块可能会提供一些线索。

final $display($realtime);

不幸的是,Icarus Verilog 没有通知您它已命中 $finish 而只是打印 Done。因此,您可能想要搜索其他 $finish 任务并在其前面放置一个 $display 语句。

更新:

根据您更新的代码,所有模块共享相同的模拟时间全局概念,开始和 end-of-time。当一个模块执行$finish时,就是整个模拟的end-of-time。按照您的编码方式,无论您看到 5 个还是 6 个“hello”,都存在竞争条件。