Menu
Coddy logo textTech

センシティビティリスト

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

感度リスト(sensitivity list)は、always ブロックにいつ実行するかを伝えます。これは @ 記号の後の括弧内に記述します。

感度リスト (sensitivity list) は、always ブロックをトリガーする signals やイベントのセットです。list 内のいずれかのシグナルが changes すると、ブロックが executes されます。

構文:

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

感応リスト(Sensitivity List)の種類

タイプ構文ブロックが実行されるタイミング
すべての信号 (combinational)always @(*)内部のいずれかの signal が変更されたとき (changes)
特定の信号always @(a or b)a または b が変更されたとき (changes)
エッジトリガー (sequential)always @(posedge clk)clock の立ち上がりエッジ (rising edge)
複数のエッジalways @(posedge clk or posedge reset)clock の edge または reset の edge

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

組み合わせ論理(combinational logic)において、最も安全で最も一般的な方法です。

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

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

オプション 2: 特定の Signals

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

信号を忘れると、その信号が changes した when にシミュレーションで output が更新されなくなるため、シミュレーションは合成されたハードウェアと一致しなくなります。

Option 3: Edge Trigger (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

clockの`edge`またはresetの`edge`で実行されます。

よくある間違い

間違い間違っている理由
always @(a or b or c) と記述しているが d も使用しているd が欠落している → シミュレーションで出力が古いままになります (シミュレーションと合成の不一致)
always @(posedge clk or reset)reset に対する posedge が不足している
always @(clk)フリップフロップには posedge clk を使用する必要があります
challenge icon

チャレンジ

作業手順:

  1. このフリップフロップを正常に動作させるために、正確な感応リスト(sensitivity list)を追加してください。このブロックは clk の立ち上がりエッジ(rising edge)で実行される必要があります。

自分で試してみよう

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

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン