【シンクロナイザ】非同期リセットで発生する問題とその対策

自分がFPGA回路設計を行う場合、できるだけ非同期リセットは使用しないようにしています。非同期リセットは解除タイミングによっては問題を生じる可能性があるからです。

対策は分かっているのですが、「何で問題が起きるの?その対策でいい理由は?」と聞かれて答えられなかったので、整理しておきます。

セットアップ時間/ホールド時間

クロック同期回路ではフリップフロップ(FF)が使用されます。
D-FF セットアップ時間 ホールド時間
FFに入力するクロックとデータには波形変化タイミングの制約として、「セットアップ時間」と「ホールド時間」が存在します。この制約が前提になります。

  • セットアップ時間
  • データはクロック変化点よりもセットアップ時間だけ前に値が確定している必要があります。

  • ホールド時間
  • データはクロック変化点よりもホールド時間だけ後まで値を保持する必要があります。
    セットアップ時間 ホールド時間

    セットアップ/ホールド時間違反

    セットアップ/ホールド時間の前提を守れない場合を、”セットアップ/ホールド時間違反”と呼びます。この話題自体はリセットに限らず、非同期クロック間の信号受け渡しの話になるのですが、今回は非同期リセットに話題を絞ります。

    下図はセットアップ/ホールド時間を守れており、問題なくリセット解除が行えた場合です。
    非同期リセット セットアップ時間 ホールド時間
    次は違反時です。この場合クロックの立ち上がりと非同期リセット解除がほぼ同時のため、リセットが解除されるかどうかが不定になります。通常FFが1つという回路はほぼあり得ないため、現象発生の結果として、1クロック間だけ「リセットが解除されたFF」と「リセット未解除のFF」が同居することになります。
    非同期リセット セットアップ時間 ホールド時間 違反

    誤動作例:リセット解除直後のカウンタ値参照に失敗

    以下仕様の回路があったとします。

  • 4itカウンタ
  • リセット解除後にカウントアップ開始。最大までカウントしたらカウントアップ停止。

  • enable信号制御
  • リセット解除後、4bitカウンタが0だったらアサート。

    期待する波形は次です。
    セットアップ時間 ホールド時間 違反なし

    これに対しセットアップ/ホールド時間違反が発生したと仮定し、リセット解除タイミングをずらしてみます。
    セットアップ時間 ホールド時間 違反時
    この場合4bitカウンタが0の時間、enable信号制御回路はリセットが入力されているため、カウンタ0を検出できません。enable信号制御回路のリセットが解除された時点では既にカウンタは進んでおり、且つカウンタは最大まで進むと動作停止するため、enable信号はアサートされるタイミングがなくなってしまいます。

    メタステーブル

    セットアップ/ホールド時間を違反した場合、リセット解除タイミングがズレる問題とは別に、「FF出力がバタついて、一定期間後にHigh/Lowのどちらかに落ち着く」といった現象が発生することがあります。これがメタステーブルです。メタステーブル発生の場合、最終的にHigh/Lowのどちらになるかは不定です。

    D-FF 非同期リセット メタステーブル

    メタステーブルの更に厄介な点は”一定期間”というところで、その期間はその時々により異なります。場合によっては発生期間が長くなり、1クロック以内に収束しません。その場合、メタステーブルが発生したFFの後段までバタつきが伝搬してしまいます。連結された2つのFFを考えます。
    D-FF メタステーブル
    前段のFFでメタステーブルが発生し、且つクロック周期よりも発生期間が長かった場合の例です。後段の出力に信号のバタつきが現れる結果となります。
    D-FF 非同期リセット メタステーブル

    誤動作例:FF初期値異常

    4bitカウンタを考えます。リセット中は全ビット1。リセット解除後にカウントダウンを開始し、カウント0で停止するとします。今回は正常波形と異常波形を同時に記載します。

    メタステーブル 波形例
    “counter”が正常動作時です。リセット解除後カウントダウンを開始し、16クロック後に0となり停止します。
    次に”counter_metastable”がメタステーブル発生時の動作例です。非同期リセット解除時点でカウンタの0bit目と2bit目にメタステーブルが発生し、0に収束したとします。これにより、初期値が”1010″と同等の動作となってしまい、期待する動作ではなくなってしまいます。

    解決法:FFシンクロナイザ

    対策としては、リセット期間中のFF出力値とは逆論理の値を入力としたFFを用意し、その後段に複数のFFを接続します。連結された最終段のFF出力を同期化リセットとして、内部回路で使用するという手法です。
    非同期リセット 同期化 対策 FFシンクロナイザ
    FFシンクロナイザを使用して同期化リセットを生成した場合の波形例です。最後のSRSTnを各回路にて使用することで、解除タイミングの統一化とメタステーブル伝搬防止を実現できます。
    FFシンクロナイザ 非同期リセット 対策 同期化 波形
    注意点として、同期化用に2つのFFを追加していますが、メタステーブルの継続時間が2クロック周期以上になると、この回路では対応できません。その場合、もう1つFFを追加することになりますが、それでも3クロック周期以上でアウトです。

    メタステーブルは発生確率0%というのは不可能なのですが、長い発生時間ほど発生し難いという特性があるため、一般的には2つ、念には念をいれるなら3つのFFを連結することで、実用レベルでは問題がなくなります。

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする