センシティビティリスト
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の立ち上がりエッジで実行される必要があります。
自分で試してみよう
module flipflop (
input clk,
input d,
output reg q
);
always @(______) begin
q <= d;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ