Menu
CoddyTech

センシティビティリスト

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の立ち上がりエッジで実行される必要があります。

自分で試してみよう

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

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ