タイミングの計算式と経験則
セットアップとホールドの不等式、スラックからのfmax、同期化回路のMTBF、I/Oタイミングバジェット、DDRウィンドウの計算、パイプライン化の効果、固定小数点のビット幅増加を、すべてプレーンテキストで示します。
このページは、タイミングレポートやインターフェースバジェットの背後にある計算をまとめたものです。ツールの数値を手で検算したい、あるいはツールがまだない段階で設計の規模を見積もりたいエンジニアのためのものです。記号は冒頭で一度定義し、以降で再利用します。すべての式は電卓やスクリプトに貼り付けられるようプレーンテキストで書いています。
記号
| 記号 | 意味 | 典型値(ミッドレンジFPGA、28 nm〜16 nm) |
|---|---|---|
| T | クロック周期 | 5〜10 ns |
| t_cko | 発射側フロップのクロック・出力間遅延 | 0.2〜0.5 ns |
| t_logic | 配線を含む組み合わせ論理の遅延 | 設計による |
| t_su、t_h | 捕捉側フロップのセットアップ要件とホールド要件 | それぞれ0.05〜0.2 ns |
| t_skew | 捕捉クロック到着時刻マイナス発射クロック到着時刻 | グローバルネットで±0.1〜0.3 ns |
| t_j | ピーク間クロックジッタ、またはツールの不確かさ | 0.05〜0.2 ns |
| WNS、TNS | 最悪負スラック、合計負スラック | レポートから |
セットアップとホールドの不等式
Setup: t_cko + t_logic(max) + t_su + t_j <= T + t_skew
Hold: t_cko + t_logic(min) >= t_h + t_skew + t_j
正のスキュー(捕捉クロックが遅れて到着する)はセットアップに有利でホールドに不利です。ホールドは周期に依存しないため、ホールド違反はクロック周波数を下げても直りません。ツールは配線遅延を追加してホールドを修正し、別のスラックとして報告します。
Setup slack = T + t_skew - (t_cko + t_logic(max) + t_su + t_j)
Hold slack = t_cko + t_logic(min) - (t_h + t_skew + t_j)
レポートからのfmax
fmax = 1 / (T - WNS) # WNS is negative when failing
例: 10 nsの制約でWNSが−0.8 nsなら、fmaxは1 / 10.8 nsで92.6 MHzです。WNSが+1.2 nsなら設計は1 / 8.8 ns、すなわち113.6 MHzで動けますが、それは他のすべてのパスにも少なくとも同じだけのスラックがある場合だけで、レポートはそれを保証しません。TNSは全体としてどれだけ離れているかを示します。WNSが小さくTNSが大きいなら、直すべきパスは1本ではなく多数あります。
| 経験則 | 値 |
|---|---|
| 28 nmファブリックで100 MHzあたりの論理段数 | フロップ間で約8〜10 LUT |
| 同じファブリックで300 MHzでの論理段数 | 2〜3 |
| 混雑した設計で周期のうち配線に費やされる割合 | 50〜70% |
| ネットが論理1段分のコストになり始めるファンアウト | 約32(ばらつきが大きい) |
同期化回路のMTBF
2段フロップの同期化回路では、準安定状態(メタステーブル)による故障の平均間隔は通常次のようにモデル化されます。
MTBF = exp(t_r / tau) / (T_0 * f_clk * f_data)
ここでt_rは1段目のフロップが解決に使える時間(捕捉周期1つから2段目のセットアップと両者間の配線を引いたもの)、tauはフロップの解決時定数、T_0はフロップに依存するウィンドウ定数、f_clkは捕捉クロック周波数、f_dataは入力が変化する速度です。
計算例(例示用の定数で、特定ベンダーの値ではありません):
tau = 20 ps
T_0 = 50 ps
f_clk = 200 MHz, so T = 5 ns
f_data = 50 MHz
t_r = 5 ns - 0.3 ns (setup plus routing) = 4.7 ns
exp(4.7 ns / 20 ps) = exp(235) = about 1.15e102
denominator = 50e-12 * 200e6 * 50e6 = 5e5
MTBF = about 2.3e96 seconds
同じ計算をフロップ1段だけ(t_rがほぼゼロ)で行うとMTBFは秒単位になり、これが1段では決して足りない理由です。ベンダーはtauとT_0をファミリごとに公開しています。AMDではASYNC_REGを設定すると、Vivadoのreport_synchronizer_mtbfでこれらを参照できます。3段目のフロップを追加すると指数の分子がほぼもう1周期分増えるため、400 MHz以上では3段が一般的です。
I/Oタイミングバジェット
システム同期(ボードから共有されるクロック)
Input setup check: t_clk_to_fpga + t_co(ext) + t_pcb(data) + t_su(fpga) <= T + t_pcb(clk)
Input hold check: t_co(ext,min) + t_pcb(data,min) >= t_h(fpga) + t_pcb(clk) - t_pcb(clk,min)
制約ファイルに書く値は次の通りです。外部デバイスのデータシートがt_co(max)とt_co(min)を、ボードが配線遅延を与えます。
set_input_delay -max = t_co(ext,max) + t_pcb(data,max) - t_pcb(clk,min)
set_input_delay -min = t_co(ext,min) + t_pcb(data,min) - t_pcb(clk,max)
set_output_delay -max = t_su(ext) + t_pcb(data,max) - t_pcb(clk,min)
set_output_delay -min = -t_h(ext) + t_pcb(data,min) - t_pcb(clk,max)
出力の-minの値は通常負になります。FR-4のマイクロストリップではボード配線はおよそ6〜7 ps/mmなので、50 mmの長さ差は約0.3 nsです。
ソース同期(データと一緒に転送されるクロック)
外部クロックとデータは一緒に伝わるので、ボード遅延は打ち消され、両者の間のスキューだけが問題になります。
Data valid window at the FPGA pin = T_bit - t_skew(ext) - t_pcb_mismatch - t_jitter
Required window = t_su(fpga) + t_h(fpga) # from the datasheet, per I/O standard
Margin = valid window - required window
入力遅延素子(AMDのIDELAY、Alteraの動的位相シフト、LatticeのDLL)を使うか、PLLの位相をずらして、捕捉エッジをウィンドウの中央に置いてください。エッジ整列のインターフェースには90度のシフトが必要で、センター整列のものには不要です。
DDRのデータ有効ウィンドウ
ダブルデータレートでは、1ビットは周期の半分しか続きません。
T_bit = T / 2
Window = T_bit - t_dvw_loss
t_dvw_loss = t_skew(driver) + t_pcb_mismatch + t_duty_error + t_jitter
ピンあたり800 Mb/s(400 MHz DDR、T = 2.5 ns)での例:
T_bit = 1.25 ns
driver skew = 0.20 ns
PCB mismatch = 0.05 ns (within 8 mm)
duty error = 0.10 ns (4 %)
jitter = 0.10 ns
window = 1.25 - 0.45 = 0.80 ns
t_su + t_hが0.40 nsのFPGA入力なら、中央に合わせた後に両側0.20 nsずつ残ります。これは実用になりますが、キャリブレーションなしには温度ドリフトの余地がありません。メモリコントローラがキャリブレーションを行うのはまさにこのためです。
パイプライン化の効果の見積もり
遅延Dの組み合わせ論理ブロックをN段の均等なステージに分割すると:
T_new = D / N + t_cko + t_su + t_overhead
Speedup = (D + t_cko + t_su) / T_new
Latency = N cycles
オーバーヘッド項(レジスタ遅延と、縮まない配線)は28 nmファブリックで通常0.5〜0.8 nsで、これが有効なNの上限を決めます。1段から2段にするとfmaxはおよそ2倍になります。4段から8段にしても、オーバーヘッドが支配的になるため20%以上の改善はまれです。ブロックがループ内で自分自身にフィードバックする場合、パイプライン化は効きません。アキュムレータではループをまたぐリタイミングが不可能で、別のアルゴリズムが必要です。
固定小数点のビット幅増加
幅はビット単位で、特に断らない限り符号付き2の補数です。
| 演算 | 結果の幅 | 備考 |
|---|---|---|
| a + b、ともにNビット | N + 1 | キャリー1ビット |
| NビットのM項の和 | N + ceil(log2(M)) | 1024サンプルのアキュムレータは10ビット増える |
| a × b、NビットとMビット、符号なし | N + M | |
| a × b、NビットとMビット、符号付き | N + M - 1 | 最小値×最小値の1ケースだけはN + Mが必要。大半のツールはN + Mのまま |
| Kビットの定数との乗算 | N + K | |
| Cビット係数Mタップ、NビットデータのFIR | N + C + ceil(log2(M)) | 丸めを行う前の値 |
| sビット左シフト | N + s | |
| 小数部Fビットの切り捨て | N - F | LSBの半分のマイナスのバイアスが入る。中心に戻すには偶数丸めか、落とすビットに1を加える |
演算の間はフル幅を保ち、最後に一度だけ丸めてください。段ごとの丸めはフロップの数では安上がりですが、バイアスが積み重なり、IIRフィルタではリミットサイクルを引き起こすことがあります。
出典
- UG949: UltraFast Design Methodology Guide, timing closure chapter
- UG906: Vivado Design Analysis and Closure Techniques
- Quartus Prime Pro Edition User Guide: Timing Analyzer (document 683243)
- C. Cummings, “Clock Domain Crossing (CDC) Design and Verification Techniques Using SystemVerilog”, SNUG 2008
- 当サイトの関連ページ: /reference/xdc-sdc-constraints/ と /reference/reset-and-cdc-patterns/