Disableステートメント
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 62/90。
disable ステートメントは、名前付きブロック(forever ループ、begin-end ブロック、タスクなど)の実行を停止します。これは、通常は永久に実行され続けるループから抜け出すのに便利です。
構文:
disable block_name;ブロックには名前のラベルが付いている必要があります。
Forever ループによる Disable
initial begin : counter // counter はブロックに counter という名前を付けます。
forever begin
#10 count = count + 1;
if (count == 5) begin
disable counter; // disable counter はその名前付きブロック全体を停止します。
end
end
endforever ループは counter という名前の付いた block 内にあります。disable counter ステートメントはループの内側に配置されています。count が 5 に達すると、disable counter が実行され、counter block 全体が停止します。これにより、forever ループも直ちに停止します。
Disable in a Separate Block
initial begin : counter
forever begin
#10 count = count + 1;
end
end
initial begin
#50;
disable counter; // 外側から counter ブロックを停止する
endここでは、forever ループが名前付きブロック counter の内部で継続的に実行されます。disable counter ステートメントは別の initial ブロックに配置されています。50 time units の経過後、disable counter が実行されて counter ブロックを停止します — これにより、外部から forever ループが終了します。
重要なルール
| ルール | 説明 |
|---|---|
block に名前をつける必要がある | begin : block_name |
disable は実行を直ちに停止する | コードはその瞬間に停止する |
| どこからでも使用可能 | module 内の任意の block から |
forever ループの停止に便利 | そうしないと絶対に停止しない |
チャレンジ
無限に実行されるカウンタを持つモジュールが与えられています。
作業内容:
各コメントを正しいコードに置き換えて、空のブロックを完成させてください:
- 50 時間単位待機するために
#50;を追加する counterブロックを停止するためにdisable counter;を追加する- メッセージを表示するために
$display("Counter stopped");を追加する - シミュレーションを終了するために
$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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。