センシティビティリスト
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 を使用すべきです |
チャレンジ
実行すること:
- このフリップフロップを動作させるために、正しいセンシティビティリストを追加してください。このブロックは
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。