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

ブロックを使用している場合、シムを終了するにはブロックの 1 つにステートメントalwaysが必要です。$finishinitial

固定コード:

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

プログラム内のすべての初期プロシージャーが終了すると、そのプログラムは、そのプログラム内の初期プロシージャーのすべての子孫スレッドを直ちに終了します。少なくとも 1 つのプログラム ブロック内に少なくとも 1 つの初期プロシージャがある場合、$finish すべてのプログラム内のすべての初期プロシージャに由来するすべてのスレッドとそのすべての子孫スレッドが終了した直後に、システム タスクへの暗黙的な呼び出しによってシミュレーション全体が終了します。 .

于 2013-07-28T22:26:51.903 に答える
1

と の間に基本的な違いはありinitialませalwaysん。将来の実行がスケジュールされている限り、シミュレーションは続行されます (明示的に停止されない限り)。あなたのステートメントは継続的に時計の割り当てを再スケジュールするので、シムは決して止まりません。について特別なことは何もありません。ブロックの前に実行されることさえ保証されていません。alwaysinitial foreverinitialalways

これはSVの質問ではありませんでしたが(私は何も知りません)、初期コードが終了したときにsimを自動的に終了することについてのVLのコメントを見て興味を持ちました. これは Verilog との互換性を損なうので、これを確認する LRM のリファレンスを見てみたいと思います。

于 2013-07-29T08:50:09.483 に答える