Menu
Coddy logo textTech

ブロッキング代入

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;    // ブロッキング代入
end

Always ブロック内の Blocking(組み合わせ回路)

always @(*) begin
  temp = a & b;    // ステップ1
  out = temp | c;  // ステップ2(ステップ1のtempを使用)
end

順番が重要です。組み合わせ論理回路の場合はこれで問題ありません。

ブロッキング vs ノンブロッキング

 ブロッキング (=)ノンブロッキング (<=)
実行順番に1つずつ一斉に同時に
次の行は待機するか?はいいいえ
用途 (uses)組合せ回路 (Combinational logic)順序回路 (Sequential logic / フリップフロップ)

重要: フリップフロップに Blocking(ブロッキング代入)を使用しないでください

challenge icon

チャレンジ

一時変数を使用して xy の値を入れ替える(swap する)ために、不足しているブロッキング代入を追加してください。

手順:

  1. x の値を temp に代入します (xtemp に保存します)
  2. y の値を x に代入します (yx に移動します)
  3. temp の値を y に代入します (保存された xy に移動します)

自分で試してみよう

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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン