为什么带时钟的SIM卡永远不会完成?

时间:2013-07-28 22:26:52

标签: simulation verilog

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

always #10 clk = ~clk;

为什么在完成所有initial代码后SIM卡无法完成?

module test;

  reg clk;

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

  always #10 clk = ~clk;

endmodule

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

2 个答案:

答案 0 :(得分:2)

当您使用always阻止时,您需要在$finish个某个区块中使用initial语句来完成SIM卡。

固定代码:

module test;

  reg clk;

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

  always #10 clk = ~clk;

endmodule

Sim结果在此处:http://www.edaplayground.com/s/4/16

也就是说,如果您的环境中还有一个SystemVerilog program,那么在initial块中的所有program代码完成后,SIM卡将自动完成。来自IEEE 1800-2012标准的第24.3节:

  

当程序中的所有初始程序都达到目的时,   该程序应立即终止所有后代线程   该计划的初始程序。如果至少有一个   至少一个程序块内的初始程序,整个程序   模拟应通过对$finish的隐式调用终止   系统任务在所有线程及其所有后代之后立即执行   线程源自所有程序中的所有初始过程   结束了。

答案 1 :(得分:1)

initialalways之间没有根本区别:always只是initial forever。只要计划将来执行任何事情,模拟将继续(除非明确停止);你的陈述不断重新安排时钟分配,因此sim永远不会停止。关于initial确实存在 nothing 特别之处:它甚至不能保证在任何always块之前运行。

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