タイミング収束と制約
静的タイミング解析の仕組み、XDCとSDC制約がツールに伝えること、クロック領域を安全にまたぐ方法、そして設計を収束させるリセットとパイプライン化の習慣を解説します。
概要
シミュレーションでは正しく動く設計でも、信号がフリップフロップに遅すぎたり早すぎたりして到着すると、ボード上では失敗することがあります。静的タイミング解析(STA)は、何もシミュレーションせずに、すべてのレジスタ間パスをクロックに対して検査します。どのクロックが存在し、どのパスが重要かをSTAに伝えるのが、作成する制約です。このハブは、初めて赤いタイミングレポートに出会ったエンジニアと、制約ファイルを理解せずにコピーしたことのあるすべての方のためのものです。
タイミング収束とは、そのレポートを読み、失敗が本物かどうかを判断し、制約か論理のどちらかを修正するループです。ループの大半はツールではなく判断であり、設計を始められる人と設計を終えられる人を分けるスキルです。
重要な考え方
セットアップ、ホールド、STAが計算するもの
各フリップフロップは、クロックエッジの前にセットアップ時間、後にホールド時間のあいだ、データ入力が安定している必要があります。レジスタAからレジスタBへのパスについて、STAはAのクロック・出力間遅延と、両者の間の論理遅延および配線遅延を足し合わせ、その合計を、クロック周期からBのセットアップ時間を引き、AとBの間のクロックスキューで補正した値と比較します。残った分がスラックです。セットアップスラックが負なら、論理に対してクロックが速すぎます。ホールドスラックが負なら、エッジの直後にデータが変化しすぎたということで、通常はクロック領域をまたぐ場合や大きなスキューがある場合にしか起こらず、ルーターが遅延を追加して大半を修正します。ツールは最悪負スラック(WNS)と、失敗したすべてのパスの合計(TNS)を報告します。1本のパスでのごく小さなWNSと、何千本ものパスでの巨大なTNSは、別の問題です。
制約: XDCとSDC
AMDのXDCも、Altera、Lattice、Microchip、オープンソースツールが使うSDCも、Tclで書かれるSynopsysの設計制約言語の子孫です。最低限必要なのは、すべての入力クロックに対するcreate_clockと、論理で派生させたものすべてに対する生成クロックです。それに加えて、入力遅延と出力遅延がボードを記述し、set_clock_groupsはどのクロック同士が無関係かを宣言してその間のパスが解析されないようにし、set_false_pathは決して問題にならないためSTAが無視すべきパスを除外し、set_multicycle_pathはパスが複数サイクルを持つことをツールに伝えます。例外はひとつひとつが約束です。本物のパスにフォールスパスを設定すると本物の失敗が隠され、ツールは警告してくれません。
クロックドメイン間の乗り換え
あるクロック領域から別の領域へ移る信号は、受信側フリップフロップのセットアップ窓の最中に到着することがあり、その出力を際限のない時間にわたって準安定状態(メタステーブル)に置きます。1ビットに対する標準的な対策は、受信側領域で2段のフリップフロップを直列に並べることで、1段目に丸々1クロック周期の整定時間を与えます。平均故障間隔はその整定時間に対して指数関数的に増大し、ベンダーは年単位で示しています。複数ビットの値には2段フリップフロップの手法は使えません。ビットごとに異なるサイクルで整定する可能性があるからです。ポインタにはグレイコードカウンタを、たまに送るワードにはリクエストとアクノリッジによるハンドシェイクを、ストリームには非同期FIFOを使ってください。乗り換え部分はset_clock_groupsか、データパス限定オプション付きのset_max_delayで制約し、STAがそこで失敗もせず、実際のパス遅延を無視もしないようにします。ベンダーツールは認識できるCDC構造を報告でき、リリースのたびにクリーンなCDCレポートを得ておく価値があります。
リセット戦略、パイプライン化、リタイミング
非同期リセットのアサートは問題ありませんが、非同期の解除はそれ自体がCDC問題です。フリップフロップごとに異なるエッジでリセットから抜ける可能性があるからです。解除は領域ごとに2段フリップフロップのリセット同期化回路で同期させ、ベンダーのフリップフロップが安価にサポートしている場合はFPGA論理では同期リセットを優先してください。長すぎるパスに対するパイプライン化とは、途中にレジスタを追加し、1サイクル分のレイテンシ増を受け入れることです。リタイミングは合成ツールにレジスタを論理をまたいで移動させるもので、算術演算にはよく効き、レジスタにリセットや初期値があるとうまくいきません。フロアプランニングと配置制約は、論理そのものを浅くした後の、最後の手段です。
どこから始めるか
- /learn/beginner/04-registers-clocks-and-state/は、単一フリップフロップのレベルでセットアップとホールドを説明します。
- /learn/beginner/08-counters-timers-and-debouncing/は、ボタンを同期化します。これが最初のCDCです。
- /learn/beginner/10-from-rtl-to-board/は、最初の制約ファイルを書き、最初のタイミングレポートを読みます。
タイミングレポートの読み方、ボード用の完全なXDC、形式的証明付きの非同期FIFOに関する中級レッスンは準備中です。
ツールとベンダー
| ベンダー | 制約フォーマット | タイミング解析ツール | CDCレポート | ハブ |
|---|---|---|---|---|
| AMD | XDC | Vivado report_timing_summary | report_cdc、report_clock_interaction | /vendors/amd/ |
| Altera | SDC | Quartus Prime Timing Analyzer | Timing Analyzer内のクロックドメイン間レポート | /vendors/altera/ |
| Microchip | SDC | Libero SoCのSmartTime | 限定的、解析ツールのレポートに依存 | /vendors/microchip/ |
| Lattice | SDC(Radiant)、SDC付きLPF(Diamond) | Radiant Timing Analyzer | 限定的 | /vendors/lattice/ |
| オープンソース | nextpnrのSDCサブセット | nextpnr内蔵 | なし | /vendors/opensource/ |
よくある間違い
- 制約なしで実行し、クリーンなレポートをタイミングが満たされた証拠として扱う。
- フォーラムの回答にあったフォールスパスを、実データを運ぶパスにコピーする。
- 複数ビットのバスを、ビットごとに2段同期化回路を置いて同期させる。
- 同期化回路なしで非同期リセットを解除し、ステートマシンが同時に2つの状態で始まるのを目にする。
- クロックイネーブルを使わずにANDゲートでクロックをゲートする。
- 論理の深さを減らす前に配置制約を追加する。
- 「ルーターが直してくれる」からと、不確かなホールド違反を無害と見なす。直るのは大半であって、すべてではありません。
さらに深く
- AMD UG903, Vivado Design Suite User Guide: Using Constraints: XDCのリファレンス。
- AMD UG906, Design Analysis and Closure Techniques: レポートの読み方と収束ループ。
- Cummings, “Clock Domain Crossing (CDC) Design and Verification Techniques Using SystemVerilog”: CDCに関する標準的な実践論文。
- Cummings and Mills, “Synchronous Resets? Asynchronous Resets?”: リセットに関するほとんどの指針の源流となった論文。
- Ginosar, “Metastability and Synchronizers: A Tutorial”: 物理とMTBFの計算。