Altifigence Academy

14 / 37 · 概念

フリップフロップ・enable・制御の優先順位

保持・ロード・リセットを次状態式で定め、意図しないクロックゲーティングを避けます。

レジスタは次状態関数の結果を記憶します

クロックエッジ直前の値を QkQ_k、エッジで取り込む入力を DkD_k、更新後を Qk+1Q_{k+1} とします。reset を優先し、その次が enable のレジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るは次の式に従います。

Qk+1={0rk=1Dkrk=0, ek=1Qkrk=0, ek=0Q_{k+1}=\begin{cases} 0 & r_k=1\\ D_k & r_k=0,\ e_k=1\\ Q_k & r_k=0,\ e_k=0 \end{cases}

enable が 0 なら、入力 D が変わっても記憶値は保たれます。順序 RTL でこの保持経路を省略することと、組合せ回路で代入を忘れることは異なります。順序ブロックの保持動作はレジスタ仕様の一部です。

SystemVerilog
module enabled_register (
  input logic clk, rst, en,
  input logic [7:0] d,
  output logic [7:0] q
);
  always_ff @(posedge clk) begin
    if (rst) q <= 8'b0;
    else if (en) q <= d;
  end
endmodule

これは同期式 active-high リセットです。reset と enable が同時に 1 のエッジでは、0 が記憶されます。順番を変えると機能も変わるので、優先順位はコメントだけでなくコードとテストにも残します。

下の各列は一つの立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの観測記録です。入力はエッジ直前、名前に「更新後」とある状態は更新直後の値です。列の並びはサンプル順を示し、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るを描いたものではありません。初期 Q=0xA5 で、最初の列は保持、次は書込み、三つ目は reset と enable の同時有効です。

reset・enable・保持の優先順位
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
エッジ2345E0 → E1 → E2 → E3
reset0.10
enable01.0
D2.343C → 99 → 77
更新後 Q234.A5 → 3C → 00

enable はクロックを直接切る信号ではありません

gated_clk = clk & en のような組合せ式を勝手にクロックにすると、en の変化で短いパルスや予期しないエッジが生じる場合があります。clock enable の RTL をどのセルへ割り当てるかは合成・実装フローの役割です。省電力のクロックゲーティングは、適切なセルとタイミング検証を前提に別途設計します。

優先順位は reset・load・enable などの制御が重なるときに現れます。一つずつ有効にするだけでは不十分です。例えば q=A5 で en=0、d=3C なら保持し、次のエッジで en=1 なら 3C を記憶しなければなりません。

自分で考えてみましょう

q=0xA5 から rst=1、en=1、d=0x3C のエッジを通り、その次を rst=0、en=0 とします。各エッジ後の q は何ですか。

解説を見る

最初のエッジではリセットが優先され 0、次は enable が 0 なのでそのまま 0 です。リセットを en の内側に実装すると en=0 でのリセットを見逃すため、その組合せも別途検査します。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。