Menu
Coddy logo textTech

Non Blocking Assignment

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

前のレッスンでは、ステップごとに実行されるblocking assignment=)について学びました。今回は、すべてを一度に並列で実行するnon-blocking assignment<=)について学びます。

Non-blocking assignment は <= 演算子を使用します。次の文の実行をblock しないため、「non-blocking」と呼ばれます。ブロック内の All non-blocking assignment は同時に実行されます。

構文:

variable <= expression;

Non-Blocking Assignment を使用するタイミング

Non-blocking assignment(<=)はsequential logicに使用します。これは、クロックを使用し、メモリを持つ回路です。出力はクロックエッジ(通常は立ち上がりエッジ)のときだけ変化します。

順序論理の例:

  • フリップフロップ
  • レジスタ
  • カウンタ
  • 状態機械
  • シフトレジスタ

Verilogの例:

initial begin
  a <= 5;      // スケジュールされたが、まだ実行されていない
  b <= a + 2;  // スケジュールされた、a の古い値を使用
  c <= b * 3;  // スケジュールされた、b の古い値を使用
end

3つの代入はすべて、old の値を使用して同時に行われます。時間ステップの終わりに、すべての更新が一緒に行われます。

Alwaysブロック内のNon-Blocking(順序論理)

Non-blockingは順序論理に使用されます。順序論理とは、クロックを使用し、メモリを持つ回路(フリップフロップ、レジスタ、カウンタ)のことです。

always @(posedge clk) begin
  q <= d;           // クロックエッジで q が d を取得する
  count <= count + 1; // クロックエッジで count がインクリメントする
end

両方の代入は、clock edge より前の values を使用して、同時に行われます。

まとめ

ルール説明
逐次論理には <= を使用するalways @(posedge clk)
組み合わせ論理には = を使用するalways @(*)
Non-blocking は並列に実行されるAll の代入は一度に行われる
Values は time step の end に更新される即座ではない
challenge icon

チャレンジ

Non-Blocking Assignmentを完成させる

この2ビットのシフトレジスタが動作するように、不足しているnon-blocking assignmentsをAddしてください。

仕組み:

  • 各clock edgeで、q1 gets d
  • q2 gets q1のold value

行うこと:

  1. dq1にAssignする(non-blocking)
  2. q1q2にAssignする(non-blocking)

自分で試してみよう

module shift_register (
  input clk,
  input reset,
  input d,
  output reg q1,
  output reg q2
);
  
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      q1 <= 0;
      q2 <= 0;
    end else begin
      // TODO: シフトロジックを追加
      // ステップ1: d を q1 に代入(ノンブロッキング)
      // ステップ2: q1 を q2 に代入(ノンブロッキング)
    end
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ