Menu
Coddy logo textTech

センシティビティリスト

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

センシティビティ・リストは、alwaysブロックにいつ実行するかを伝えます。これは、@記号の後の括弧の中に記述されます。

センシティビティリストは、alwaysブロックをトリガーするシグナルまたはイベントのセットです。リスト内のいずれかのシグナルが変化すると、ブロックが実行されます。

構文:

always @(sensitivity_list) begin
  // リスト内の信号が変化したときにコードが実行されます
end

感度リストの種類

種類構文ブロックが実行されるタイミング
すべての信号(組合せ回路)always @(*)内部のいずれかの信号が変化したとき
特定の信号always @(a or b)a または b が変化したとき
エッジトリガ(順序回路)always @(posedge clk)クロックの立ち上がりエッジ時
複数のエッジalways @(posedge clk or posedge reset)クロックエッジまたはリセットエッジ時

オプション 1: すべての信号 (*)

組合せ回路において最も安全で一般的な方法です。

always @(*) begin
  out = a & b;   // a または b が変化したときに実行されます
end

* は、ブロック内で読み取られるすべての信号を自動的に含めます。

オプション 2: 特定の信号

always @(a or b) begin
  out = a & b;   // a または b が変化したときに実行されます
end

信号を忘れると、ラッチ(意図しないメモリ)が発生します。

オプション 3: エッジトリガ (posedge)

always @(posedge clk) begin
  q <= d;        // クロックの立ち上がりエッジで実行
end

立ち上がりエッジには posedge を、立ち下がりエッジには negedge を使用します。

オプション 4: 複数のエッジ

always @(posedge clk or posedge reset) begin
  if (reset)
    q <= 0;
  else
    q <= d;
end

クロックエッジまたはリセットエッジで動作します。

よくある間違い

間違い間違いの理由
always @(a or b or c) ですが d を使用しているd が不足している → ラッチの生成
always @(posedge clk or reset)reset に posedge が不足している
always @(clk)フリップフロップには posedge clk を使用すべきです
challenge icon

チャレンジ

実行すること:

  1. このフリップフロップを動作させるために、正しいセンシティビティリストを追加してください。このブロックは clk の立ち上がりエッジで実行される必要があります。

チートシート

センシティビティ・リスト(感度リスト)は @ の後に続き、always ブロックがいつ実行されるかを定義します:

always @(sensitivity_list) begin
  // リストされた信号が変化したときに実行されます
end
タイプ構文トリガーの条件
すべての信号always @(*)読み取られたいずれかの信号が変化したとき
特定の信号always @(a or b)a または b が変化したとき
立ち上がりエッジalways @(posedge clk)clk の立ち上がりエッジ
複数のエッジalways @(posedge clk or posedge reset)いずれかのエッジが発生したとき

組合せ回路には @(*) を使用し、順序回路には posedge/negedge を使用します:

// 組合せ回路
always @(*) begin
  out = a & b;
end

// 順序回路(非同期リセット付きフリップフロップ)
always @(posedge clk or posedge reset) begin
  if (reset) q <= 0;
  else       q <= d;
end

よくある間違い: 特定のリストに信号が欠けているとラッチが発生する、フリップフロップに対して always @(posedge clk) の代わりに always @(clk) と記述する、複数のエッジリストで reset の前の posedge を省略する、などが挙げられます。

自分で試してみよう

module flipflop (
  input clk,
  input d,
  output reg q
);
  
  always @(______) begin
    q <= d;
  end

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン