ブロッキング代入
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 49/90。
Verilogには、手続き的代入(procedural assignment)に2つのタイプがあります。blocking(=)とnon-blocking(<=)です。このレッスンでは、blocking assignmentに焦点を当てます。
Blocking assignmentは=演算子をusesします。現在のassignmentが完了するまで次の文の実行をブロックするため、「blocking」と呼ばれます。コードは順番に1 stepずつ実行されます。
構文:
variable = expression;Blocking assignment を使用するタイミング
Blocking assignment(=)は組み合わせ論理(クロック(no clock)や記憶素子(no memory)を持たず、入力が変化すると即座に出力が変化する回路)に使用されます。
組み合わせ論理の例:
- AND / OR / XOR ゲート
- 加算器と減算器
- マルチプレクサ
- デコーダ
Verilogの例:
always @(*) begin
sum = a + b; // ブロッキング代入
carry = a & b; // ブロッキング代入
endAlways ブロック内の Blocking(組み合わせ回路)
always @(*) begin
temp = a & b; // ステップ1
out = temp | c; // ステップ2(ステップ1のtempを使用)
end順番が重要です。組み合わせ論理回路の場合はこれで問題ありません。
ブロッキング vs ノンブロッキング
ブロッキング (=) | ノンブロッキング (<=) | |
|---|---|---|
| 実行 | 順番に1つずつ | 一斉に同時に |
| 次の行は待機するか? | はい | いいえ |
| 用途 (uses) | 組合せ回路 (Combinational logic) | 順序回路 (Sequential logic / フリップフロップ) |
重要: フリップフロップに Blocking(ブロッキング代入)を使用しないでください
チャレンジ
一時変数を使用して x と y の値を入れ替える(swap する)ために、不足しているブロッキング代入を追加してください。
手順:
xの値をtempに代入します (xをtempに保存します)yの値をxに代入します (yをxに移動します)tempの値をyに代入します (保存されたxをyに移動します)
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。