センシティビティリスト
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;
endclockの`edge`またはresetの`edge`で実行されます。
よくある間違い
| 間違い | 間違っている理由 |
|---|---|
always @(a or b or c) と記述しているが d も使用している | d が欠落している → シミュレーションで出力が古いままになります (シミュレーションと合成の不一致) |
always @(posedge clk or reset) | reset に対する posedge が不足している |
always @(clk) | フリップフロップには posedge clk を使用する必要があります |
チャレンジ
作業手順:
- このフリップフロップを正常に動作させるために、正確な感応リスト(sensitivity list)を追加してください。このブロックは
clkの立ち上がりエッジ(rising edge)で実行される必要があります。
自分で試してみよう
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。