Menu
Coddy logo textTech

ブロッキング代入

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 49/90。

Verilogには2種類の手続き代入があります:ブロッキング (=) と ノンブロッキング (<=) です。このレッスンでは、ブロッキング代入に焦点を当てます。

ブロッキング代入は = 演算子を使用します。現在の代入が完了するまで次の文の実行をブロックするため、「ブロッキング」と呼ばれます。コードは順番に、一歩ずつ実行されます。

構文:

variable = expression;

ブロッキング代入を使用するタイミング

ブロッキング代入(=)は、組合せ論理に使用されます。これは、入力が変化すると出力が即座に変化する、クロックなしメモリなしの回路です。

組合せ論理の例:

  • AND / OR / XOR ゲート
  • 加算器と減算器
  • マルチプレクサ
  • デコーダ

Verilogの例:

always @(*) begin
  sum = a + b;      // ブロッキング代入
  carry = a & b;    // ブロッキング代入
end

Alwaysブロックにおけるブロッキング代入 (組合せ回路)

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

順序が重要です。これは組合せ論理においては問題ありません。

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

 ブロッキング (=)ノンブロッキング (<=)
実行順次実行一斉に実行
次の行は待機するか?はいいいえ
用途組合せ回路順序回路 (フリップフロップ)

重要:フリップフロップにはブロッキングを使用しないでください

challenge icon

チャレンジ

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

手順:

  1. x の値を temp に代入します (x を temp に保存します)
  2. y の値を x に代入します (y を x に移動します)
  3. 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
quiz icon腕試し

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

基礎のすべてのレッスン