はじめに
FPGA 設計がタイミング制約 (timing constraints) を満たせない場合、まずクリティカルパス (critical path) をじっくり調べたくなるでしょう。そのために使うのが、各パス (path) 上にあるさまざまなロジック素子の遅延を示すタイミングレポートです。
Intel の FPGA をあまり使い込んでいないと、このレポートの出し方がすぐには分からないかもしれません。さらに悪いことに、知らないうちに間違ったレポートを見ている可能性もあります。
まず押さえておきたいのは、マルチコーナータイミング解析の考え方です。FPGA のタイミング検証では、タイミング制約を 4 つのケースで満たすことを確認するのが一般的です。最低/最高温度と、「スロー (slow)」「ファスト (fast)」のタイミングモデルの組み合わせです。つまり、4 つの組み合わせ、いわゆる 4 つのコーナーで解析が行われるわけです。
ですから、クリティカルパスを調べるときには、4 つのコーナーすべてのタイミングレポートを確認することが大切です。この点は見落とされがちです。たとえば TimeQuest は通常、1 つのコーナーについてだけタイミングレポートを作成します。
そこで、この記事では、意味のあるレポートを取得する方法を説明します。例は Quartus Prime 17.1 Lite を基にしています。
関連する記事を 2 つ紹介しておきます。1 つは、入出力制約とタイミングレポートの関係を解説した記事、もう 1 つは TimeQuest で Tcl スクリプト (script) をちょっと試してみた記事です。
重要: このページでは、セットアップの要件を確認するタイミングレポートの取得方法を説明します。ただし、ホールド (hold)、リカバリ (recovery)、リムーバル (removal) の各タイミングレポートも生成できます。これらのレポートでも、タイミング制約を満たしていないことが明らかになる場合があります。
マルチコーナーレポートの作成: スクリプト (script) で手早く
まず、次の Tcl スクリプトを、たとえば timing.tcl というファイルに保存します。
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-panel_name "Critical paths"
}
タイミングレポートがセットアップのみに限定されていることに注意してください。
「multi_corner」フラグに惑わされないでください。report_timing の 1 回の呼び出しは、1 つのコーナーだけを対象にしています。このフラグが実際に何かを変えるのかどうかは、はっきりしません。
そこで、上のスクリプトは foreach_in_collection で 4 つすべての動作条件をループし、コーナーごとに個別のレポートを生成しています。
それでは、実際にやってみましょう。
- Quartus の Task ペインで TimeQuest グループを展開し、TimeQuest Timing Analyzer を開きます。
- TimeQuest Timing Analyzer のメニューバーから Script > Run Tcl Script… を選び、Tcl スクリプト (たとえば timing.tcl) を選択します。
- Report ペインに「Critical paths」というエントリが追加されます。Multi-Corner Summary をクリックすると、メインペインにパスのリストと詳細が表示されます。
- パスに関する情報をすべてテキストファイルへ出力するには、Multi-Corner Summary を右クリックして「Export…」を選択します。出力ファイル名は「.rpt」という拡張子にしてください。HTML レポートはサポートされていません (HTML を選ぶと空のファイルになります)。
同じエントリ内に、コーナーごとのレポートも 4 つ表示されます。Quartus の古いバージョンでは、このコーナー別レポートしか表示されません (つまり、Multi-Corner Summary はありません)。
HTML / テキストレポートのみを生成する
Quartus のツールは見やすい HTML レポートを生成できます。TimeQuest の GUI で見るよりずっと読みやすいでしょう。ただし残念ながら、それぞれのレポートは 1 つのコーナーしかカバーしていません。次のスクリプトは、4 つのコーナーそれぞれについて別々の HTML レポートを生成します (生成されるファイルは、JQuery スクリプトや CSS など、たくさんあります。見た目は豪華ですが、マルチコーナーレポートではありません)。
次のスクリプトを timing-html.tcl として保存してみてください。
#project_open myproj
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-file "timing_paths_$op.html" \
-panel_name "Critical paths for $op"
}
テキスト形式のレポートが必要な場合は、-file オプションの引数を変更し、拡張子を「.html」の代わりに「.rpt」または「.txt」にします。
スクリプト先頭でコメントアウトしてある project_open コマンドに注目してください。このコメントを解除し、「myproj」を実際のプロジェクト名に置き換えれば、シェルのコマンドラインから次のようにして HTML レポートを生成できます。
$ /path/to/quartus/bin/quartus_sta -t timing-html.tcl
ただし、この方法でマルチコーナーレポートを生成する方法は見つけられていません。
コンパイルのたびにこれらのレポートを自動生成したい場合 (推奨します)、QSF ファイルに次のような行を追加します。
set_global_assignment -name TIMEQUEST_REPORT_SCRIPT relative/path/to/timing-html.tcl
QSF ファイルに Tcl スクリプトをこのように組み込んだときは、スクリプト内で project_open を使わないようにしてください。
GUI だけを使う方法
クリック操作だけでもマルチコーナーレポートを取得できます。
- Quartus の Task ペインで TimeQuest グループを展開し、TimeQuest Timing Analyzer を開きます。
- Timing Analyzer の Tasks ペインで「Update Timing Netlist」をダブルクリックします。
- 同じペインで「Custom Reports」までスクロールダウンし、「Report Timing…」をダブルクリックします。
- ダイアログボックスが開きます。解析の種類として setup、hold、recovery、removal のいずれかを選択します。それ以外はデフォルトのままでかまいません。下部にある「Report Timing」をクリックします。
- Report ペインに「Report Timing」というエントリが追加されます。このエントリを展開して右クリックし、表示されたメニューで「Generate in All Corners」をクリックします。
- 「Multi Corner Summary」グループをクリックします。必要に応じて、上で説明した手順でレポートをエクスポートしてください。