FPGAタイミングチャート完全ガイド — 読み方・描き方から静的タイミング解析まで
タイミングチャートとは — FPGA設計における重要性
タイミングチャート(タイミングダイアグラム)は、デジタル回路における各信号の時間的な変化を視覚的に表現した図です。FPGA設計において、タイミングチャートは回路の動作を理解し、検証するための最も基本的かつ重要なツールの一つです。
FPGA(Field-Programmable Gate Array)では、すべての論理動作がクロック信号に同期して行われます。各フリップフロップがいつデータを取り込み、いつ出力を更新するのか、そしてそれらの信号が組み合わせ回路を通過するのにどれだけの時間がかかるのかを正確に把握しなければ、設計した回路が意図通りに動作する保証はありません。
タイミングチャートを正しく読み、描けるようになることは、FPGA設計者にとって必須のスキルです。本記事では、タイミングチャートの基本概念から実践的な活用方法まで、体系的に解説していきます。
なぜFPGA設計でタイミングが重要なのか
- 同期設計の基本:FPGA内部のすべてのレジスタはクロックエッジでデータをサンプリングするため、データが正しいタイミングで安定している必要がある
- 高速動作の実現:クロック周波数を上げるほどタイミングマージンは厳しくなり、正確なタイミング設計が不可欠になる
- 信頼性の確保:タイミング違反はメタステーブル状態を引き起こし、回路の誤動作や予測不能な挙動につながる
- 外部デバイスとの接続:メモリ(DDR)やADC/DAC、通信インターフェースなど、外部デバイスとの接続ではインターフェース仕様のタイミング要件を満たす必要がある
タイミングチャートの読み方
タイミングチャートを正しく読むためには、まず各信号の表現方法を理解する必要があります。ここでは、デジタル回路で使われる基本的な信号の表記法を解説します。
クロック信号
クロック信号は、デジタル回路の動作基準となる周期的な矩形波です。一定の周期でHigh(1)とLow(0)を繰り返します。
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
CLK: │ │ │ │ │ │ │ │ │ │
────┘ └───┘ └───┘ └───┘ └───┘ └───
↑ ↑ ↑ ↑ ↑
立ち上がり 立ち上がり 立ち上がり 立ち上がり 立ち上がり
エッジ エッジ エッジ エッジ エッジ
クロック信号の重要な要素は以下の通りです。
- 立ち上がりエッジ(posedge):信号がLowからHighに遷移する瞬間。多くの同期回路ではこのエッジでデータをサンプリングする
- 立ち下がりエッジ(negedge):信号がHighからLowに遷移する瞬間。DDRメモリなどでは両エッジを使用する
- クロック周期(Period):立ち上がりエッジから次の立ち上がりエッジまでの時間。周波数の逆数で表される
- デューティ比:1周期におけるHigh期間の割合。通常は50%だが、用途により異なる場合がある
デジタル信号のレベル表現
デジタル信号には、High/Low以外にもいくつかの特殊な状態があります。
High (1): ──────────
(高い位置の水平線)
Low (0): ──────────
(低い位置の水平線)
遷移: ────┐ ┌────
│ │ (垂直線で立ち上がり・立ち下がりを表現)
────┘ └────
不定値(X): ──╳╳╳╳╳╳──
(クロスハッチまたはX記号で表現)
ハイインピーダンス(Z):
────────────
(中間レベルの水平線で表現)
- 不定値(X):信号の値が0なのか1なのか不明な状態。シミュレーション上ではリセット前の初期状態や、タイミング違反発生時に現れる
- ハイインピーダンス(Z):出力がドライブされていない状態。トライステートバッファの非アクティブ時やバス信号で出現する
バス信号(多ビット信号)の表現
複数ビットの信号(バス)は、個別ビットを描くと煩雑になるため、まとめて表記します。
╱────╲ ╱────╲ ╱────╲ ╱────╲
DATA[7:0]: │ 0x00 │ │ 0x55 │ │ 0xAA │ │ 0xFF │
╲────╱ ╲────╱ ╲────╱ ╲────╱
バス信号では、値が遷移する箇所を交差する斜め線で表し、安定している期間に値を記載します。これにより、どのタイミングでどのデータが有効であるかを一目で把握できます。
セットアップタイムとホールドタイム
フリップフロップが正しくデータを取り込むためには、クロックエッジの前後でデータが安定していなければなりません。この安定期間を規定するのが、セットアップタイムとホールドタイムです。
セットアップタイム(tsu)
セットアップタイムとは、クロックの有効エッジ(通常は立ち上がりエッジ)の前に、データ入力が安定していなければならない最小時間のことです。
tsu
├────────┤
│ │
DATA: ────╱────────────────────────
↑安定開始 ↑CLKエッジ
│
┌───┐ │
CLK: │ │ │
────┘ └──────│───────────────
↑
立ち上がりエッジ
セットアップタイムが満たされない場合、フリップフロップはデータを正しくラッチできず、出力が不定(メタステーブル状態)になる可能性があります。
ホールドタイム(th)
ホールドタイムとは、クロックの有効エッジの後に、データ入力が安定していなければならない最小時間のことです。
th
├────────┤
│ │
DATA: ──────────────────╲─────────
↑CLKエッジ ↑変化可能
│
┌───┐ │
CLK: │ │ │
────┘ └───│─────────────────
↑
立ち上がりエッジ
ホールドタイム違反は、クロックエッジの直後にデータが変化してしまう場合に発生します。これはクロックスキューが大きい場合や、組み合わせ回路の遅延が極端に短い場合に問題となります。
メタステーブル状態
セットアップタイムまたはホールドタイムの違反が発生すると、フリップフロップはメタステーブル状態に陥る可能性があります。これは出力がHighでもLowでもない中間電圧に留まる状態で、以下の問題を引き起こします。
- 出力値が不確定になり、後段の回路が誤動作する
- メタステーブル状態の持続時間は確率的であり、予測不能
- 複数のフリップフロップが異なる値として解釈し、システム全体の整合性が崩壊する
正常動作:
Q: ────────┐
└────────────── (明確な遷移)
メタステーブル状態:
Q: ────────~~~~┐
?? └────── (不安定な中間状態の後、
いずれかの値に収束)
伝搬遅延(Propagation Delay)
伝搬遅延は、信号がある回路要素を通過するのに要する時間です。FPGA設計では、複数の種類の遅延を理解しておく必要があります。
主要な遅延パラメータ
- tco(Clock-to-Output Delay):フリップフロップのクロックエッジから出力Qが変化するまでの遅延時間
- tpd(Propagation Delay):組み合わせ回路の入力変化から出力変化までの遅延時間
- tnet(Net Delay / Routing Delay):FPGA内部の配線による遅延時間
- tsu(Setup Time):次段フリップフロップのセットアップタイム要件
データパスの遅延解析
同期回路におけるレジスタ間のデータパス遅延は、以下の要素の合計です。
┌─────┐ tco ┌─────────────┐ tpd ┌─────┐
│ FF1 │──────────→│組み合わせ回路│─────────→│ FF2 │
│ │ │ │ │ │
└─────┘ └─────────────┘ └─────┘
↑ ↑
CLK CLK
データパス遅延 = tco + tpd(組み合わせ) + tnet(配線)
タイミング条件: tco + tpd + tnet + tsu ≦ T_clk
(T_clk = クロック周期)
この条件が満たされなければ、データがFF2のセットアップタイム要件を満たすことができず、タイミング違反が発生します。
遅延の具体例
以下に、一般的なFPGA(例:Xilinx 7シリーズ)における代表的な遅延値を示します。
- フリップフロップ tco:約0.2〜0.5 ns
- LUT(6入力)伝搬遅延:約0.1〜0.3 ns
- 配線遅延:約0.1〜2.0 ns(配線長に依存)
- セットアップタイム:約0.1〜0.3 ns
例えば、200MHzで動作する回路(クロック周期 = 5.0 ns)の場合、データパス全体の遅延がセットアップタイムを含めて5.0 ns以内に収まる必要があります。
クロック周波数とタイミング制約
FPGA設計では、回路が動作できる最大クロック周波数(Fmax)を理解し、適切なタイミング制約を設定することが極めて重要です。
Fmaxの計算
最大動作周波数は、最も遅延の大きいデータパス(クリティカルパス)によって決まります。
Fmax = 1 / T_min
T_min = tco_max + tpd_max + tnet_max + tsu
例: tco = 0.4ns, tpd = 1.2ns, tnet = 0.8ns, tsu = 0.3ns の場合
T_min = 0.4 + 1.2 + 0.8 + 0.3 = 2.7 ns
Fmax = 1 / 2.7ns ≈ 370 MHz
クリティカルパス
クリティカルパスとは、回路内のすべてのレジスタ間データパスのうち、最も遅延が大きいパスのことです。このパスがFmaxを決定するため、性能向上にはクリティカルパスの最適化が不可欠です。
パスA: FF1 → LUT → LUT → FF2 遅延: 2.1 ns
パスB: FF3 → LUT → LUT → LUT → FF4 遅延: 3.5 ns ← クリティカルパス
パスC: FF5 → LUT → FF6 遅延: 1.2 ns
→ Fmax = 1 / (3.5 ns + マージン) で制限される
タイミング制約の記述
Xilinx Vivadoでは、XDC(Xilinx Design Constraints)ファイルにタイミング制約を記述します。
# クロック定義(100MHz)
create_clock -period 10.000 -name sys_clk [get_ports clk]
# 入力遅延制約
set_input_delay -clock sys_clk -max 3.0 [get_ports {data_in[*]}]
set_input_delay -clock sys_clk -min 1.0 [get_ports {data_in[*]}]
# 出力遅延制約
set_output_delay -clock sys_clk -max 2.0 [get_ports {data_out[*]}]
set_output_delay -clock sys_clk -min 0.5 [get_ports {data_out[*]}]
# クロックグループ(非同期クロック間)
set_clock_groups -asynchronous \
-group [get_clocks sys_clk] \
-group [get_clocks pcie_clk]
# フォルスパス(タイミング解析対象外)
set_false_path -from [get_cells config_reg[*]]
タイミング解析の種類
FPGA設計におけるタイミング検証には、大きく分けて2つのアプローチがあります。
静的タイミング解析(STA: Static Timing Analysis)
STAは、シミュレーションを行わずに回路のすべてのタイミングパスを網羅的に解析する手法です。
- 利点:テストベクタが不要で、すべてのパスを網羅的に検証できる
- 利点:解析速度が高速で、大規模な回路にも適用可能
- 利点:ワーストケース(最悪条件)での解析が容易
- 制限:回路の機能的な正しさは検証できない
- 制限:グリッチやレース条件の検出には限界がある
STAでは、各パスについて以下の2つのチェックを行います。
- セットアップチェック:データがクロックエッジ前にセットアップタイムを満たして安定しているか
- ホールドチェック:データがクロックエッジ後にホールドタイムを満たして安定しているか
セットアップスラック = T_clk - (tco + tpd + tnet + tsu)
スラック > 0 → タイミングを満たす(PASS)
スラック = 0 → ギリギリ(マージンなし)
スラック < 0 → タイミング違反(FAIL)
ホールドスラック = (tco_min + tpd_min) - th
スラック > 0 → タイミングを満たす(PASS)
スラック < 0 → タイミング違反(FAIL)
動的シミュレーション
動的シミュレーションは、テストベクタを使って回路の動作を時間軸に沿ってシミュレーションする手法です。
- RTLシミュレーション:遅延なしでの機能検証。論理的な正しさの確認に使用
- ゲートレベルシミュレーション:合成後のネットリストに実際の遅延情報(SDF)を付与して実行。タイミングを含めた動作検証が可能
- ポストP&Rシミュレーション:配置配線後の実際の遅延を使ったシミュレーション。最も実際の動作に近い結果が得られる
一般的なFPGA設計フローでは、STAを主要なタイミング検証手法として使用し、必要に応じてゲートレベルシミュレーションを補助的に行います。
タイミングチャートの描き方
正確で読みやすいタイミングチャートを描くためには、いくつかの基本ルールを守る必要があります。
基本的な描画ルール
- クロック信号を最上部に配置する:すべての信号の基準となるクロックは一番上に描く
- 入力信号を上部、出力信号を下部に配置する:信号の流れが上から下になるように配置する
- 因果関係を矢印で示す:どのクロックエッジでどの信号が変化するかを矢印で明示する
- 遅延を正確に反映する:クロックエッジから信号変化までの遅延を視覚的に表現する
- 安定期間とセットアップ/ホールドウィンドウを明示する:データが有効な期間をハッチングや色分けで表現する
信号遷移の表現方法
即座の遷移(理想的):
────┐
└────
現実的な遷移(有限の遷移時間):
────╲
╲────
複数ビットバスの遷移:
╱────╲╱────╲
│ Val1 ││ Val2 │
╲────╱╲────╱
不定期間:
╱╳╳╳╳╲╱────╲
│ ?? ││ 有効 │
╲╳╳╳╳╱╲────╱
D-フリップフロップのタイミングチャート例
┌───┐ ┌───┐ ┌───┐ ┌───┐
CLK: │ │ │ │ │ │ │ │
────┘ └───┘ └───┘ └───┘ └───
D: ──0──────1───────────0───────1────────
│ │ │ │
↓ ↓ ↓ ↓
Q: ──X──0──────1───────────0───────1────
↑tco ↑tco ↑tco ↑tco
この例では、D入力の値がクロックの立ち上がりエッジで取り込まれ、tco(Clock-to-Output遅延)の後にQ出力に反映されています。
実践例 — カウンタ回路とステートマシン
3ビットカウンタのタイミングチャート
以下は、リセット付き3ビットアップカウンタのタイミングチャートです。
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
CLK: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
────┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──
RST: ────────┐
└──────────────────────────────────────────────────
EN: ────────────────────────────────────────────────────────────
COUNT ╱ XXX ╲╱ 000 ╲╱ 001 ╲╱ 010 ╲╱ 011 ╲╱ 100 ╲╱ 101 ╲╱ 110 ╲╱ 111 ╲
[2:0]:╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱
リセット信号がアクティブの間はカウンタ値が000に初期化され、リセット解除後の各クロックエッジでカウント値が1ずつ増加しています。
対応するVerilogコード
module counter_3bit (
input wire clk,
input wire rst,
input wire en,
output reg [2:0] count
);
always @(posedge clk) begin
if (rst)
count <= 3'b000;
else if (en)
count <= count + 1'b1;
end
endmodule
ステートマシンのタイミングチャート
以下は、簡単な3状態のMoore型ステートマシン(IDLE → ACTIVE → DONE)のタイミングチャートです。
┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐
CLK: │ │ │ │ │ │ │ │ │ │ │ │ │ │
────┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──
START:────┐ ┌──────
└───────────────────────────────────┘
STATE:╱IDLE╲╱ACTV╲╱ACTV╲╱ACTV╲╱DONE╲╱IDLE╲╱ACTV╲
╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱╲ ╱
BUSY: ────┐ ┌──────┐
└──────────────────────────┘ └─────
DONE: ┌──────┐
────────────────────────┘ └────────────
START信号のアサートにより、IDLE状態からACTIVE状態に遷移し、処理完了後にDONE状態を経てIDLEに戻ります。BUSY出力はACTIVE状態で、DONE出力はDONE状態でそれぞれアクティブになっています。
ステートマシンのVerilogコード
module fsm_example (
input wire clk,
input wire rst,
input wire start,
output reg busy,
output reg done
);
localparam IDLE = 2'b00;
localparam ACTIVE = 2'b01;
localparam DONE_S = 2'b10;
reg [1:0] state;
reg [1:0] wait_count;
always @(posedge clk) begin
if (rst) begin
state <= IDLE;
wait_count <= 0;
end else begin
case (state)
IDLE: begin
if (start)
state <= ACTIVE;
end
ACTIVE: begin
if (wait_count == 2'd2)
state <= DONE_S;
else
wait_count <= wait_count + 1;
end
DONE_S: begin
state <= IDLE;
wait_count <= 0;
end
default: state <= IDLE;
endcase
end
end
always @(*) begin
busy = (state == ACTIVE);
done = (state == DONE_S);
end
endmodule
タイミング違反の原因と対策
タイミング違反が発生した場合、その原因を特定し、適切な対策を講じることが重要です。
主な原因
- 組み合わせ回路の段数が多すぎる:レジスタ間に挟まる論理段数が多いと、伝搬遅延が増大する
- 配線遅延が大きい:FPGA上で物理的に離れたリソース間の配線は遅延が大きくなる
- ファンアウトが大きい:1つの信号が多数のロードを駆動すると、遅延が増大する
- クロックスキュー:同じクロックドメイン内でクロック到達時間に差があると、実効的なマージンが減少する
対策1: パイプライン化
長い組み合わせ回路の途中にレジスタを挿入して、1クロックサイクルあたりの遅延を削減する手法です。
パイプライン化前:
FF1 → [長い組み合わせ回路(遅延: 8ns)] → FF2
→ Fmax = 1/8ns = 125MHz
パイプライン化後(2段パイプライン):
FF1 → [組み合わせ回路A(4ns)] → FF_pipe → [組み合わせ回路B(4ns)] → FF2
→ Fmax = 1/4ns = 250MHz(ただしレイテンシは2クロック)
パイプライン化により動作周波数は向上しますが、データが入力から出力まで到達するレイテンシは増加します。スループットが重要なアプリケーションでは非常に有効な手法です。
対策2: リタイミング
リタイミングは、回路の機能を変えずにレジスタの位置を移動させることで、各パスの遅延バランスを改善する手法です。合成ツールが自動的に行う場合もありますが、設計者が意図的に行うことも重要です。
リタイミング前:
FF1 → [回路A: 1ns] → FF2 → [回路B: 5ns] → FF3
→ クリティカルパス = 5ns
リタイミング後:
FF1 → [回路A: 1ns] → [回路B前半: 2ns] → FF2' → [回路B後半: 3ns] → FF3
→ クリティカルパス = 3ns
対策3: クロックドメインクロッシング(CDC)
異なるクロックドメイン間で信号を受け渡す場合、特別な対策が必要です。非同期クロック間では、セットアップ/ホールドタイムの保証ができないため、メタステーブル対策が不可欠です。
CDC対策の主な手法
- 2段フリップフロップ同期化(ダブルFF):最も基本的な手法。受信側クロックドメインで2段のフリップフロップを通すことで、メタステーブル状態が伝搬するリスクを低減する
- 非同期FIFO:データバスのCDCにはグレイコードポインタを使用した非同期FIFOが有効。複数ビットの安全な受け渡しが可能
- ハンドシェイク方式:req/ack信号による確認付きデータ転送。低速だが確実
2段フリップフロップ同期化:
CLK_A ドメイン: CLK_B ドメイン:
┌──────┐ ┌──────┐ ┌──────┐
│ FF_A │───────────────→│ FF_B1│───→│ FF_B2│──→ 同期済み信号
│ │ 非同期信号 │(meta │ │(安定)│
└──────┘ │ 可能)│ └──────┘
↑ └──────┘ ↑
CLK_A ↑ CLK_B
CLK_B
ツール紹介 — タイミング解析と波形確認
実際のFPGA開発では、各ベンダーが提供するツールを使用してタイミング解析と波形の確認を行います。
Xilinx Vivado
Xilinx(現AMD)のFPGA開発統合環境であるVivadoは、強力なタイミング解析機能を備えています。
- Timing Summary:合成・配置配線後のタイミングサマリーレポート。WNS(Worst Negative Slack)やTNS(Total Negative Slack)を確認できる
- Timing Report:
report_timing_summaryコマンドで詳細なタイミングレポートを生成。クリティカルパスの詳細な遅延内訳が確認可能 - Schematic Viewer:タイミングパスをスケマティック上で視覚的に確認できる
- ILA(Integrated Logic Analyzer):実機上での信号波形をキャプチャして確認できる。デバッグに不可欠なツール
# Vivado Tclコマンド例
# タイミングサマリーレポート
report_timing_summary -delay_type min_max -report_unconstrained \
-check_timing_verbose -max_paths 10 -input_pins \
-file timing_summary.rpt
# クリティカルパスの詳細レポート
report_timing -from [get_cells {module_a/reg_*}] \
-to [get_cells {module_b/reg_*}] \
-delay_type max -nworst 5 -file critical_paths.rpt
# クロック関係のレポート
report_clock_interaction -file clock_interaction.rpt
Intel Quartus Prime
Intel(旧Altera)のFPGA開発ツールであるQuartus Primeも、包括的なタイミング解析機能を提供します。
- TimeQuest Timing Analyzer:STAエンジンによるタイミング解析。SDC(Synopsys Design Constraints)形式の制約ファイルを使用
- Timing Closure Recommendations:タイミング違反の修正提案を自動生成
- SignalTap Logic Analyzer:実機デバッグ用の内蔵ロジックアナライザ
- Chip Planner:FPGA内部のリソース配置を視覚的に確認・編集できる
ModelSim / QuestaSim
Mentor Graphics(現Siemens EDA)のHDLシミュレータは、タイミングチャートの確認に広く使用されています。
- 波形ビューア:シミュレーション結果の波形を詳細に表示。ズーム、カーソル測定、信号のグループ化が可能
- SDF逆注釈:SDFファイルを使用したゲートレベルのタイミングシミュレーションに対応
- アサーション検証:SystemVerilog Assertions(SVA)を使用したタイミングプロパティの検証が可能
# ModelSim シミュレーション実行例
# RTLシミュレーション
vlib work
vlog -sv design.sv testbench.sv
vsim -t 1ps work.testbench
add wave -position insertpoint sim:/testbench/*
run 1us
# ゲートレベルシミュレーション(SDF付き)
vsim -t 1ps -sdftyp /testbench/uut=design_timing.sdf work.testbench
その他の有用なツール
- Verilator:高速なオープンソースVerilogシミュレータ。大規模設計のRTLシミュレーションに適している
- GTKWave:オープンソースの波形ビューア。VCD/FST形式の波形ファイルを表示できる
- WaveDrom:JSON記述からタイミングチャートをSVG画像として生成するツール。ドキュメント用のきれいなタイミングチャート作成に便利
- Cocotb:Pythonベースのテストベンチフレームワーク。Pythonでテストベクタを記述し、シミュレータと連携して動作検証を行える
まとめ
タイミングチャートは、FPGA設計におけるデバッグと検証の基盤です。本記事で解説した内容を整理すると、以下の重要なポイントが挙げられます。
- 基本概念の理解:クロック信号、エッジ、High/Low/X/Zの表記を正確に読み取れること
- セットアップ・ホールドタイムの把握:フリップフロップの動作要件を理解し、違反がメタステーブル状態を引き起こすことを認識すること
- 遅延解析の実施:tco、tpd、配線遅延を考慮したデータパス解析ができること
- タイミング制約の適切な設定:SDC/XDC制約を正しく記述し、ツールに適切な情報を与えること
- STAレポートの読解:スラック値を理解し、タイミング違反の原因を特定できること
- 対策手法の適用:パイプライン化、リタイミング、CDC対策を適切に選択できること
FPGA設計の品質と信頼性は、タイミング設計の正確さに大きく依存します。タイミングチャートを正しく読み描きし、タイミング解析ツールを使いこなすことで、高性能で安定した回路設計が実現できるでしょう。