Menu
CoddyTech

Disableステートメント

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 62/90。

disable文は、(foreverループ、begin-endブロック、タスクなどの)名前付きブロックの実行を停止します。そうしないと無限に実行され続けるループから抜け出すのに便利です。

構文:

disable block_name;

ブロックには名前のラベルを付ける必要があります。

foreverループで無効化する

initial begin : counter // counter はこのブロックに counter という名前を付けます。
  forever begin
    #10 count = count + 1;
    if (count == 5) begin
      disable counter;   // disable counter は、名前が付けられたそのブロック全体を停止します。
    end
  end
end

foreverループは、名前付きブロックcounterの中にあります。disable counter文はループの内側に置かれています。countが5に達すると、disable counterが実行され、ブロック全体counterが停止します。その結果、foreverループもただちに停止します。

別のブロックから無効にする

initial begin : counter
  forever begin
    #10 count = count + 1;
  end
end

initial begin
  #50;
  disable counter;   // 外部からcounterブロックを停止する
end

ここでは、foreverループが名前付きブロックcounter内で連続して実行されます。disable counter文は別のinitialブロックに配置されています。50時間単位後にdisable counterが実行され、counterブロックを停止します。これにより、外側からforeverループが終了します。

重要なルール

ルール説明
ブロックには名前を付ける必要があるbegin : block_name
Disableは実行を直ちに停止するその時点でコードが停止する
どこからでも使用できるモジュール内のどのブロックからでも
foreverループを停止するのに便利そうしないと、ループは停止しない
challenge icon

チャレンジ

カウンターが無限に実行されるモジュールが与えられています。 

やること:

各コメントを正しいコードに置き換えて、空のブロックを完成させてください。

  1. #50;を追加して、50タイムユニット待ちます
  2. disable counter;を追加して、カウンターブロックを停止します
  3. $display("Counter stopped");を追加して、メッセージを表示します
  4. $finish;を追加して、シミュレーションを終了します

自分で試してみよう

module disable_challenge;
  integer count;
  
  initial begin
    count = 0;
    fork
      begin : counter
        forever begin
          #10 count = count + 1;
          $display("count = %d", count);
        end
      end
      
      begin
        // ステップ 1: 50 時間単位待つ
        
        // ステップ 2: counter ブロックを無効にする
        
        // ステップ 3: "Counter stopped" を表示する
        
        // ステップ 4: シミュレーションを終了する
        
      end
    join
  end
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ