【问题标题】:Why does my sim with a clock never finish?为什么我的带时钟的 sim 卡永远不会完成?
【发布时间】:2013-07-28 22:26:51
【问题描述】:

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

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

【问题讨论】:

    标签: simulation verilog


    【解决方案1】:

    当您使用always 块时,您需要在initial 块之一中包含$finish 语句才能完成模拟。

    固定代码:

    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,则在您的 program 块中的所有 initial 代码完成后,sim 将自动完成。来自IEEE 1800-2012 标准的第 24.3 节:

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

    【讨论】:

    • 另外$stop 语句可能有用
    • @Qui, $stop 语句不会结束 sim,而是暂停它。来自标准:$stop 系统任务导致模拟暂停。这是对EDA Playground 的测试。也就是说,一些模拟器,比如 VeriWell,会在调用 $stop 时完成模拟。
    • @VictorLyuboslavsky:我知道$stop 语句的工作原理。我刚刚指出它也可能有用(例如,如果您不想在模拟完成后关闭模拟器(ModelSim))。
    • @Qui,我很抱歉。我不知道你所说的“有用”是什么意思。
    【解决方案2】:

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

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

    【讨论】:

    • 我在回答中添加了 LRM 参考。
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多