2

我在我的模块中添加了一个时钟发生器,现在模拟永远不会完成。

always #10 clk = ~clk;

为什么在所有initial代码完成后sim没有完成?

module test;

  reg clk;

  initial begin
    clk = 0;
    $display("Hello");
  end

  always #10 clk = ~clk;

endmodule

EDA Playground 上的模拟结果:http ://www.edaplayground.com/s/4/15

4

2 回答 2

3

当你使用一个always块时,你需要在你的一个块中有$finish语句initial来完成模拟。

固定代码:

module test;

  reg clk;

  initial begin
    clk = 0;
    $display("Hello");
    $finish();  // <-- FIX
  end

  always #10 clk = ~clk;

endmodule

模拟结果在这里:http ://www.edaplayground.com/s/4/16

也就是说,如果您的环境中还有 SystemVerilog ,则在您的块中的所有代码program完成后,sim 将自动完成。来自IEEE 1800-2012标准的第 24.3 节:initialprogram

当一个程序中的所有初始过程都已结束时,该程序应立即终止该程序中初始过程的所有后代线程。如果在至少一个程序块中至少存在一个初始过程,则整个模拟应在$finish 源自所有程序中的所有初始过程的所有线程及其所有派生线程结束后立即通过对系统任务的隐式调用终止.

于 2013-07-28T22:26:51.903 回答
1

initialalways:之间没有根本区别,always只是initial forever. 只要有任何事情被安排在未来执行,那么模拟就会继续(除非它被明确停止);您的语句不断重新安排时钟分配,因此 sim 永远不会停止。真的没有什么特别的initial:它甚至不能保证在任何always块之前运行。

这不是一个 SV 问题(我对此一无所知),但我有兴趣看到 VL 关于在初始代码完成时自动完成 sim 的评论。这会破坏 Verilog 的兼容性,我有兴趣看到证实这一点的 LRM 参考。

于 2013-07-29T08:50:09.483 回答