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
endforeverループは、名前付きブロック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ループを停止するのに便利 | そうしないと、ループは停止しない |
チャレンジ
カウンターが無限に実行されるモジュールが与えられています。
やること:
各コメントを正しいコードに置き換えて、空のブロックを完成させてください。
#50;を追加して、50タイムユニット待ちます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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ