Disableステートメント
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 62/90。
disable 文は、名前付きブロック(forever ループ、begin-end ブロック、またはタスクなど)の実行を停止します。これは、通常であれば永久に実行され続けるループから抜け出すのに便利です。
構文:
disable block_name;ブロックには名前を付ける必要があります。
Foreverループを使用した無効化
begin : counter // counterは、このブロックにcounterという名前を付けます。
forever begin
#10 count = count + 1;
if (count == 5) begin
disable counter; // disable counterは、その名前付きブロック全体を停止させます。
end
end
endforeverループは、counterという名前のブロックの中にあります。disable counterステートメントは、ループの中に配置されています。countが5に達すると、disable counterが実行され、ブロックcounter全体を停止させます。これにより、foreverループも即座に停止します。
別のブロックで無効化する
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ループを停止するのに便利です | そうしないと、ループは停止しません |
チャレンジ
永遠に実行されるカウンタを持つモジュールが与えられています。
行うべきこと:
各コメントを正しいコードに置き換えて、空のブロックを完成させてください:
- 50時間単位待機するために
#50;を追加します - counterブロックを停止するために
disable counter;を追加します - メッセージを表示するために
$display("Counter stopped");を追加します - シミュレーションを終了するために
$finish;を追加します
チートシート
disable 文は、名前付きブロック(例:forever ループ)の実行を停止します。ブロックは、begin : block_name を使用してラベルを付ける必要があります。
ブロック内部からの無効化(Disable):
begin : counter
forever begin
#10 count = count + 1;
if (count == 5) disable counter;
end
end別のブロックからの無効化(Disable):
begin : counter
forever begin
#10 count = count + 1;
end
end
initial begin
#50;
disable counter; // 外部から名前付きブロックを停止します
end自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。