Menu
Coddy logo textTech

Sensitivity List

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

センシティビティリストは、alwaysブロックにいつ実行するかを指示します。これは@記号の後のかっこ内に記述します。

センシティビティリストは、alwaysブロックをトリガーする信号またはイベントの集合です。リスト内のいずれかの信号がchangesすると、ブロックがexecutesします。

構文:

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

感度リストの種類

種類構文ブロックが executes するタイミング
すべての signals(組み合わせ回路)always @(*)内部のいずれかの信号が changes したとき
特定の signalsalways @(a or b)a または b が changes したとき
エッジトリガー(順序回路)always @(posedge clk)clock の rising edge で
複数の edgesalways @(posedge clk or posedge reset)clock edge または reset edge で

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

組み合わせ論理にとって最も安全で、最も一般的です。

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

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

オプション 2: 特定の信号

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

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

オプション 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

clock edge または reset edge で Runs。

よくある間違い

間違いなぜ間違いか
always @(a or b or c) だが、dを使用しているdが不足 → シミュレーションでoutputが古いままになる(sim/synthの不一致)
always @(posedge clk or reset)resetにposedgeがない
always @(clk)flip-flopにはposedge clkを使用する必要がある
challenge icon

チャレンジ

行うこと:

  1. このフリップフロップが動作するように、正しい感度リストを追加してください。ブロックは clk の立ち上がりエッジで実行される必要があります。

自分で試してみよう

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

endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

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