ブロッキング代入
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 49/90。
Verilogには2種類の手続き代入があります:ブロッキング (=) と ノンブロッキング (<=) です。このレッスンでは、ブロッキング代入に焦点を当てます。
ブロッキング代入は = 演算子を使用します。現在の代入が完了するまで次の文の実行をブロックするため、「ブロッキング」と呼ばれます。コードは順番に、一歩ずつ実行されます。
構文:
variable = expression;ブロッキング代入を使用するタイミング
ブロッキング代入(=)は、組合せ論理に使用されます。これは、入力が変化すると出力が即座に変化する、クロックなし、メモリなしの回路です。
組合せ論理の例:
- AND / OR / XOR ゲート
- 加算器と減算器
- マルチプレクサ
- デコーダ
Verilogの例:
always @(*) begin
sum = a + b; // ブロッキング代入
carry = a & b; // ブロッキング代入
endAlwaysブロックにおけるブロッキング代入 (組合せ回路)
always @(*) begin
temp = a & b; // ステップ 1
out = temp | c; // ステップ 2 (ステップ 1 の temp を使用)
end順序が重要です。これは組合せ論理においては問題ありません。
ブロッキング vs ノンブロッキング
ブロッキング (=) | ノンブロッキング (<=) | |
|---|---|---|
| 実行 | 順次実行 | 一斉に実行 |
| 次の行は待機するか? | はい | いいえ |
| 用途 | 組合せ回路 | 順序回路 (フリップフロップ) |
重要:フリップフロップにはブロッキングを使用しないでください
チャレンジ
一時変数を使用して、x と y の値を入れ替えるために不足しているブロッキング代入を追加してください。
手順:
xの値をtempに代入します (x を temp に保存します)yの値をxに代入します (y を x に移動します)tempの値をyに代入します (保存された x を y に移動します)
チートシート
ブロッキング代入 (=) は順次実行されます。つまり、各文は次の文が始まる前に完了します。always @(*) ブロック内の 組合せ回路 に使用されます。
always @(*) begin
temp = a & b; // ステップ 1
out = temp | c; // ステップ 2 (更新された temp を使用)
endブロッキング (=) |
ノンブロッキング (<=) |
|
|---|---|---|
| 実行 | 一つずつ順番に | すべて同時に |
| 用途 | 組合せ回路 | 順序回路 (フリップフロップ) |
自分で試してみよう
module swap;
reg x, y;
reg temp;
initial begin
x = 1;
y = 0;
$display("Before swap: x=%d, y=%d", x, y);
// TODO: ステップ 1 - x を temp に代入
// TODO: ステップ 2 - y を x に代入
// TODO: ステップ 3 - temp を y に代入
$display("After swap: x=%d, y=%d", x, y);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。