Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl...

98
Vivado Design Suite ユーザー ガイド Tcl ス ク リ プ ト 機能の使用 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に よっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきまし ては、必ず最新英語版をご参照ください。 UG894 (v2017.4) 2017 年 12 月 20 日

Transcript of Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl...

Page 1: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

Vivado Design Suite ユーザー ガイド

Tcl スクリプ ト機能の使用

UG894 (v2017.3) 2017 年 10 月 4 日

この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきましては、必ず最新英語版をご参照ください。

UG894 (v2017.4) 2017 年 12 月 20 日

Page 2: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

Tcl スクリプ ト機能の使用 2UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.com

改訂履歴

次の表に、 この文書の改訂履歴を示します。

日付 バージョ ン 改訂内容

2017 年 10 月 4 日 2017.3 「タ イ ミ ング パス オブジェク ト 」 を追加。

「get_property およびリ ス トの並べ替え」 を追加。

2017 年 4 月 5 日 2017.1 Vivado Design Suite の 新バージ ョ ン (2017.1) と Tcl Store GUI を反映して資料全体でスク

リーンシ ョ ッ ト をアップデート。

「外部プログラムの呼び出し」 に Windows の例を追加。

「Tcl スク リプ トの初期化」 に情報を追加。

Vivado Design Suite スタート アップ スク リプ トの名前を Vivado_init.tcl に変更。

UG894 (v2017.4) 2017 年 12 月 20 日

2017/12/20: Vivado® Design Suite 2017.4 リリース。内容の変更なし。

Page 3: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

Tcl スクリプ ト機能の使用 3UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.com

目次

改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

第 1章: Vivado での Tcl スクリプ ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Tcl の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

ヘルプ情報の入手 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

プラ ッ ト フォームによる Tcl 動作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

コンパイルおよびレポート生成のスク リプ ト例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Tcl スク リプ トの読み込みと実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Tcl スク リプ トの記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

デザイン オブジェク トへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

オブジェク トの リ ス トの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

出力先の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

ループの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

エラー処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

環境変数へのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

外部プログラムの呼び出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Vivado IDE (統合設計環境)/Tcl モード vs バッチ モード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

カスタム デザイン ルール チェッ ク (DRC) の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

ザイ リ ンクス Tcl Store. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Tcl スク リプ ト記述のヒン ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

付録 A: その他のリソースおよび法的通知ザイ リ ンクス リ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

ソ リ ューシ ョ ン センター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Documentation Navigator およびデザイン ハブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

参考資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

ト レーニング リ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

お読みください: 重要な法的通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

UG894 (v2017.4) 2017 年 12 月 20 日

Page 4: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1章

Vivado での Tcl スクリプ ト

概要

Tcl (ツール コマンド言語) は、 さまざまなデザイン ツールおよびデザイン データにアクセスするための、 変数、 プ

ロシージャ (procs)、 制御構造を含むインタープリ ター型プログラ ミ ング言語です。

ヒン ト : 詳細は、 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 1] を参照するか、

「<command> -help」 と入力してください。

Vivado® Design Suite の起動方法および使用方法の詳細は、 『Vivado Design Suite ユーザー ガイ ド : 入門』 (UG910) [参

照 2] を参照してください。

この言語は新しい関数呼び出しで簡単に拡張できるので、 1990 年代初期に開発されて以来、 新しいツールやテク ノ

ロジをサポートするため拡張されてきています。 多くの EDA ベンダーが標準の API (アプリ ケーシ ョ ン プログラ ミ

ング インターフェイス) と してアプリ ケーシ ョ ンを制御および拡張するために導入しています。

ザイ リ ンクスでは、 Vivado Design Suite のネイティブ プログラ ミ ング言語と して Tcl を導入しているので、 この業界

標準言語に精通している設計者であれば簡単に取り入れ、 理解できます。 Vivado Design Suite の Tcl インタープリ

ターは、 アプ リ ケーシ ョ ンの制御、 デザイン オブジェク トおよびプロパティへのアクセス、 カスタム レポートの作

成を実行するための、 Tcl の機能と柔軟性を提供しています。 Tcl を使用する と、 デザインの特定の要件に合わせて

デザイン フローを変更できます。

Tcl には、 ローカル ファ イル システムのファイルに対して読み出しおよび書き込みを実行するビルト イン コマンド

が含まれます。 これによ り、 動的にディ レク ト リ を作成し、 FPGA デザイン プロジェク ト を開始して、 プロジェク

トにファ イルを追加したり、 合成およびインプリ メンテーシ ョ ンを実行できます。 デザイン プロジェク トからデバ

イス リ ソースの使用率や QoR (結果の質) に関するカスタマイズ レポート を生成し、 企業内で共有できます。

また、 Tcl を使用して、 新しい設計手法を試したり、 既存の問題を回避したり、 必要に応じてデザイン オブジェク ト

の挿入および削除、 プロパティの変更を実行でき。 デザイン フローの確立された部分を再実行するためのスク リプ

ト を記述し、 プロセスを標準化できます。

このガイ ドで説明する Tcl コマンドおよびスク リプ ト例のほとんどは、 Vivado Design Suite 特定のものです。 Vivado

特定の Tcl コマンドの詳細は、 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 1] を参照する

か、 または Vivado ツールのヘルプ機能を使用してください。

Vivado IDE では、 ザイ リ ンクス デザイン制約 (XDC) を使用してデザイン制約を指定します。 XDC は Vivado で使用

可能な Tcl コマンドのサブセッ トに基づいており、 Tcl と同様に解釈されます。 XDC コマンドには、 主にタイ ミ ング

制約、 物理制約、 オブジェク ト クエ リ、 およびいくつかの Tcl ビルト イン コマンド (set、 list、 および expr) が

あ り ます。DSP 関数の詳細は、『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 3] を参照してくださ

い。 Tcl スク リプ ト とは異なり、 XDC ファ イルは Vivado IDE で管理されるので、 グラフ ィカル インターフェイスで

の制約の変更は元の XDC ファ イルに保存されます。 そのため、 XDC ファ イルでは XDC コマンドのみを使用できま

す。 制約の記述にほかの Tcl コマンドを使用する必要がある場合は、 Tcl スク リプ ト を使用する必要があ り ます。

Tcl スクリプ ト機能の使用 4UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 5: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Vivado ツールでは、 vivado.jou というジャーナル ファ イルが Vivado を起動したディ レク ト リに作成されます。

ジャーナル ファイルにはセッシ ョ ン中に実行された Tcl コマンドが記録されるので、 このファイルから新しい Tcl ス

ク リプ ト を作成できます。

ログ ファ イル (vivado.log) も作成され、 実行されたコマンドの出力が含まれます。 ジャーナル ファ イルと ログ

ファ イルは、 実行されたコマンドおよびその結果を確認するのに有益です。

Vivado Design Suite にビルト インされている Tcl インタープリ ターによ り、 追加の Tcl コマンドが提供されています。

Tcl ビルト イン コマンドについては、 Tcl のオープン ソース ベースおよび資料を管理している Tcl Developer Xchange

サイ ト [参照 8] を参照してください。

Tcl プログラ ミ ング言語の入門チュート リ アルは、 http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html を参照してくださ

い。 また、 Tclers ’Wiki (http://wiki.tcl.tk) にいくつかのサンプル スク リプ トがあ り ます。

このガイ ドでは、 Tcl コマンドおよび Tcl スク リプ トの例、 および Vivado Design Suite での戻り値を示します。 これら

のコマンド例とその戻り値は、 次の形式で記述されています。

• Tcl コマンドおよびスク リプ ト例

puts $outputDir

• Tcl コンソールへの出力または Tcl コマンドの結果

./Tutorial_Created_Data/cpu_output

Tcl スクリプ ト機能の使用 5UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 6: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Tcl の概要

Tcl スク リプ トは、 改行またはセミ コロンで区切られた一連の Tcl コマンドです。 Tcl コマンドは、 スペースまたはタ

ブで区切られた単語の文字列です。 Tcl インタープリ ターはコマンド ラインを単語に分割し、 必要に応じてコマンド

および変数置換を実行します。 コマンド ラ インは左から右に読み込まれ、 各単語が完全に評価されてから次の単語

が評価されます。 コマンドおよび変数置換は、 左から右に実行されます。

単語は、 1 つの単語または中かっこ ({}) またはダブルクォーテーシ ョ ン (“”) で囲まれた複数の単語です。 中かっこま

たはダブルクォーテーシ ョ ン内のセミ コロン、 中かっこ、 タブ、 スペース、 改行は、 通常の文字と して処理されま

すが、 バッ クスラ ッシュ (\) はこの後説明するよ うに、 中かっこまたはダブルクォーテーシ ョ ン内でも特殊文字と し

て処理されます。

初の単語はコマンド と して扱われ、 その後の単語は引数と してコマンドに渡されます。

set outputDir ./Tutorial_Created_Data/cpu_output

この例では、 初の単語は Tcl set コマンドで、 値を割り当てるために使用します。 2 番目の単語は変数名

(outputDir)、 3 番目の単語は変数値 (./Tutorial_Created_Data/cpu_output) と して set コマンドに渡され

ます。

単語にバッ クスラ ッシュ (\) が使用されている場合、 Tcl インタープリ ターによ りバッ クスラ ッシュ置換が実行され

ます。 ほとんどの場合、 バッ クスラ ッシュの次の文字は標準文字と して処理されます。 これを使用して、 ダブル

クォーテーシ ョ ン、 中かっこ、 ドル記号などの特殊文字を文字列に追加できます。 Tcl インタープリ ターでバッ クス

ラ ッシュ文字がどのよ うに処理されるかは、 Tcl/Tk のリ ファレンスを参照してください。

puts $outputDir ./Tutorial_Created_Data/cpu_output puts \$outputDir $outputDir

中かっこ とダブルクォーテーシ ョ ン マークの使用法も異なり ます。 中かっこ内の文字に対しては、 置換は実行され

ません。 中かっこ内の単語や文字列はそのまま処理され、 変数またはコマンド置換のために評価されません。 次の

例に示すよ うに、 単語は中かっこに囲まれたそのままの文字列 (中かっこは含まない) とな り ます。 ダブルクォー

テーシ ョ ンに囲まれた文字列は評価され、 変数およびコマンド置換が必要に応じて実行されます。 ダブルクォー

テーシ ョ ンに囲まれた文字列に対してコマンド置換、 変数置換、 およびバッ クスラ ッシュ置換が実行されます。

puts {The version of Vivado Design Suite is [version -short]}The version of Vivado Design Suite is [version -short]

puts "The version of Vivado Design Suite is [version -short]"The version of Vivado Design Suite is 2016.1

上記の例で、ダブルクォーテーシ ョ ンを使用した 2 番目の例では [version -short] コマンドが戻り値で置換され

ていますが、 中かっこを使用した 1 番目の例では置換が実行されていないこ とに注目してください。 文字列を囲む

場合には、 このこ とに注意してダブルクォーテーシ ョ ンまたは中かっこを選択してください。

変数に値を代入するには、 set コマンドを使用します。 変数を参照するには、 変数名の前にドル記号 ($) を付けて指

定します。 単語がドル記号で開始している場合、 Tcl インタープリ ターで変数置換が実行され、 変数が現在その変数

に保存されている値に置換されます。 Tcl では、 $ は予約語です。

set outputDir ./Tutorial_Created_Data/cpu_outputputs $outputDir./Tutorial_Created_Data/cpu_output

Tcl スクリプ ト機能の使用 6UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 7: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

角かっこ ([ ]) を使用する と、 コマンド内にコマンドをネス トできます。 ネス ト されたコマンドは、 左から右にボ ト

ムアップに評価されます。 角かっこ内の文字列が新しい Tcl スク リプ ト と して反復的に処理されます。 ネス ト された

コマンドに、 さ らにコマンドをネス ト させるこ と もできます。 ネス ト されたコマンドの結果がその上位のコマンド

に渡されてから、 その上位のコマンドが処理されます。

set listCells [lsort [get_cells]]

上記の例では、 現在のデザインの 上位にあるセル オブジェク トがアルファベッ ト順に並べ替えられ、 そのリ ス ト

が listCells 変数に代入されます。 まず get_cells コマンドが実行され、 返されたオブジェク トが lsort コマ

ンドで並べ替えられて、 並べ替えが終了した リ ス トが変数に代入されます。

ただし Vivado Design Suite では、角かっこの処理は標準の Tcl と多少異なり ます。角かっこは Verilog および VHDL の

名前 (ネッ ト 、 インスタンスなど) では標準文字と して処理され、 通常はバスやインスタンスの配列など、 ベクター

の 1 つまたは複数の要素を示します。 Vivado ツールでは、 角かっこがネッ ト リ ス ト オブジェク ト名の一部である場

合はボ ト ムアップに評価されません。

次の 3 つのコマンドは同等です。

1.) set list_of_pins [get_pins transformLoop[0].ct/xOutReg_reg/CARRYOUT[*] ]2.) set list_of_pins [get_pins {transformLoop[0].ct/xOutReg_reg/CARRYOUT[*] } ]3.) set list_of_pins [get_pins transformLoop\[0\].ct/xOutReg_reg/CARRYOUT\[*\] ]

1) では、 外側の角かっこは標準の Tcl と同様にコマンドのネス ト ([get_pins]) を表しますが、 内側の角かっこは

Vivado ツールでは指定したオブジェク ト名の一部と して処理されます (transformLoop[0])。 Vivado Design Suite

ではこれが自動的に処理されますが、 一部の文字に限られます。 これらの文字は次のいずれかの形式にする必要が

あ り、 それ以外の場合は角かっこは標準の Tcl と同様に評価されます。

• star: [*]: 任意の数のビッ ト またはインスタンスを示すワイルドカードです。

• integer: [12]: 特定のビッ ト またはインスタンスを指定します。

2) では、 中かっこを使用して内側の角かっこ内の文字列がコマンド置換されないよ うにしており、 オブジェク ト名

の一部と して処理されます (transformLoop[0])。

3) では、 バッ クスラ ッシュを使用して角かっこを特殊文字でなく標準文字と して評価するよ う指定しており、 コマ

ンド置換は実行されません。

2) および 3) は角かっこが適切に処理されるよ うにする方法を示していますが、 中かっこまたはバッ クスラ ッシュを

手動で追加する必要があ り ます。 1) は、 これが Vivado Design Suite で自動的に処理されるこ とを示しています。

Tcl スク リプ トにコ メン ト を追加するには、 行を # で開始します。 # の後に続く次の改行までの文字は、 無視されま

す。 行の 後にコ メン ト を追加するには、 次の例に示すよ うに、 コマンドの 後にセミ コロン ( ; ) を記述し、 その後

に # を追加してコ メン ト を記述します。

# This is a commentputs "This is a command"; # followed by a comment

ヘルプ情報の入手

Tcl コンソールでヘルプ情報を取得できます。すべての Vivado コマンドで -help オプシ ョ ンがサポート されており、

コマンド ラインの任意の位置で使用できます。

次に例を示します。

Tcl スクリプ ト機能の使用 7UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 8: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Vivado% create_clock -helpVivado% create_clock -name CLK1 -period 10 -help

また、 help コマンドを使用してもヘルプ情報を表示できます。 help コマンドでコマンド名を指定する と (help

<command>)、 <command> -help を使用した場合と同じ情報が表示されます。

Vivado% help create_clock

help コマンドで -args オプシ ョ ンを使用する と、 引数の簡単な説明のみを表示できます。

Vivado% help create_clock -args

create_clock

Description: Create a clock object

Syntax: create_clock -period <arg> [-name <arg>] [-waveform <args>] [-add] [-quiet] [-verbose] [<objects>]

Returns: new clock object

Usage: Name Description ------------------------ -period Clock period: Value > 0 [-name] Clock name [-waveform] Clock edge specification [-add] Add to the existing clock in source_objects [-quiet] Ignore command errors [-verbose] Suspend message limits during command execution [<objects>] List of clock source ports, pins or nets

また、 -syntax オプシ ョ ンを使用する と、 コマンド構文のみを表示できます。

Vivado% help create_clock -syntax

create_clock

Syntax: create_clock -period <arg> [-name <arg>] [-waveform <args>] [-add] [-quiet][-verbose] [<objects>]

help コマンドを使用する と、 特定のコマンドのヘルプ情報だけでなく、 コマンドのカテゴ リおよびプロジェク トの

ク ラスに関する情報も表示できます。 カテゴ リの リ ス ト を取得するには、 help コマンドを引数またはオプシ ョ ンを

使用せずに実行します。 次に、 コマンド カテゴ リの一部を示します。

Vivado% help

ChipScopeDRCFileIOFloorplanGUIControlIPFlowObjectPinPlanning

Tcl スクリプ ト機能の使用 8UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 9: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

PowerProjectPropertyAndParameterReportSDCSimulationTclBuiltInTimingToolLaunchToolsXDC

各カテゴ リのコマンドの リ ス ト を取得するには、 -category オプシ ョ ンを使用します。 たとえば、 次のコマンドを

実行する と、 Tools カテゴ リのすべてのコマンドが表示されます。

Vivado% help -category tools

Topic Descriptionlink_design Open a netlist designlist_features List available features.load_features Load Tcl commands for a specified feature.opt_design Optimize the current netlist. This will perform the retarget,

propconst, and sweep optimizations by default.phys_opt_design Optimize the current placed netlist.place_design Automatically place ports and leaf-level instancesroute_design Route the current designsynth_design Synthesize a design using Vivado Synthesis and open that design

プラッ ト フォームによる  Tcl 動作

使用するプラ ッ ト フォーム (32 ビッ ト または 64 ビッ ト ) によって、 Tcl の動作が異なる場合がまれにあ り ます。 これ

は Vivado ではなく Tcl に関連しています。

たとえば、 大きな整数のリ ス ト を並べ替える場合、 次のコマンドを使用するこ とが考えられます。

vivado% lsort $list -integer

このコマンドは、 スク リプ ト を 32 ビッ ト マシンで実行しているか、 64 ビッ ト マシンで実行しているかによって動

作が異なり ます。 これは、 32 ビッ ト プラ ッ ト フォームと 64 ビッ ト プラ ッ ト フォームで整数のコード記述が異なる

からです。

win32, win64, lnx32: sizeof(int) is 4byteslnx64: sizeof(int) is 8bytes

この例の問題を回避するには、 lsort コマンドの -command オプシ ョ ンを使用し、 並べ替えを実行するカスタム プ

ロシージャを使用するのが 1 つの方法です。

Tcl スクリプ ト機能の使用 9UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 10: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

コンパイルおよびレポート生成のスクリプ ト例

非プロジェク ト  フローでのコンパイル

次に、 非プロジェク ト デザイン フローを定義する Tcl スク リプ トの例を示します。

このサンプル スク リプ トでは reportCriticalPaths という カスタム コマンドが使用されており、 Vivado Design

Suite にカスタム コマンドやプロシージャを追加できるこ とを示しています。 reportCriticalPaths の内容は、

「Tcl プロシージャの定義」 を参照して ください。

# STEP#1: define the output directory area.#set outputDir ./Tutorial_Created_Data/cpu_output file mkdir $outputDir## STEP#2: setup design sources and constraints#read_vhdl -library bftLib [ glob ./Sources/hdl/bftLib/*.vhdl ]read_vhdl ./Sources/hdl/bft.vhdlread_verilog [ glob ./Sources/hdl/*.v ]read_verilog [ glob ./Sources/hdl/mgt/*.v ]read_verilog [ glob ./Sources/hdl/or1200/*.v ]read_verilog [ glob ./Sources/hdl/usbf/*.v ]read_verilog [ glob ./Sources/hdl/wb_conmax/*.v ]read_xdc ./Sources/top_full.xdc## STEP#3: run synthesis, write design checkpoint, report timing, # and utilization estimates#synth_design -top top -part xc7k70tfbg676-2write_checkpoint -force $outputDir/post_synth.dcpreport_timing_summary -file $outputDir/post_synth_timing_summary.rptreport_utilization -file $outputDir/post_synth_util.rpt## Run custom script to report critical timing pathsreportCriticalPaths $outputDir/post_synth_critpath_report.csv## STEP#4: run logic optimization, placement and physical logic optimization, # write design checkpoint, report utilization and timing estimates#opt_designreportCriticalPaths $outputDir/post_opt_critpath_report.csvplace_designreport_clock_utilization -file $outputDir/clock_util.rpt## Optionally run optimization if there are timing violations after placementif {[get_property SLACK [get_timing_paths -max_paths 1 -nworst 1 -setup]] < 0} { puts "Found setup timing violations => running physical optimization" phys_opt_design}write_checkpoint -force $outputDir/post_place.dcpreport_utilization -file $outputDir/post_place_util.rptreport_timing_summary -file $outputDir/post_place_timing_summary.rpt## STEP#5: run the router, write the post-route design checkpoint, report the routing

Tcl スクリプ ト機能の使用 10UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 11: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# status, report timing, power, and DRC, and finally save the Verilog netlist.#route_designwrite_checkpoint -force $outputDir/post_route.dcpreport_route_status -file $outputDir/post_route_status.rptreport_timing_summary -file $outputDir/post_route_timing_summary.rptreport_power -file $outputDir/post_route_power.rptreport_drc -file $outputDir/post_imp_drc.rptwrite_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true## STEP#6: generate a bitstream# write_bitstream -force $outputDir/cpu.bit

サンプル スクリプ トの詳細

上記のサンプル スク リプ トは、 次の段階から構成されています。

• 手順 1: 変数 $outputDir を定義して出力ディ レク ト リ を指定し、 そのディ レク ト リ を実際に作成します。

$outputDir 変数は、 スク リプ トで必要に応じて参照されます。

• 手順 2: デザインを記述する VHDL および Verilog ファ イルと、 デザインの物理制約およびタイ ミ ング制約を含

む XDC ファ イルを読み込みます。 合成済みネッ ト リ ス ト (EDIF または NGC) を読み込む場合は、 read_edif

コマンドを使用します。

Vivado Design Suite では、 デザイン制約を使用してデザインの物理特性およびタイ ミ ング特性を定義します。

read_xdc コマンドは XDC 制約ファイルを読み込み、 読み込まれた制約ファイルが合成およびインプリ メン

テーシ ョ ンに適用されます。

重要: Vivado Design Suite では、 UCF フォーマッ トはサポート されません。 UCF 制約を XDC コマンドに移行する方法

は、 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911) [参照 4] を参照してください。

read_* Tcl コマンドは、 非プロジェク ト モードで使用し、 Vivado Design Suite でディ スク上のファイルを読み

込んでメモ リ内にデザイン データベースを構築します。 ファ イルがコピーされたり、 プロジェク ト モードでの

よ うにファ イルの依存関係が作成されるこ とはあ り ません。 非プロジェク ト モードでのすべての操作は、

Vivado ツール内のインメモ リ データベースに対して実行されます。 そのため、 非プロジェク ト モードは非常に

柔軟ですが、 ユーザーがソース デザイン ファ イルの変更を管理し、 それに応じてデザインをアップデートする

必要があ り ます。 プロジェク ト モードまたは非プロジェク ト モードを使用した Vivado Design Suite の実行に関

する詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの概要』 (UG892) [参照 5] を参照してくださ

い。

• 手順 3: デザインを指定のターゲッ ト デバイス用に合成します。

HDL デザイン ファ イルをコンパイルし、 XDC ファ イルに含まれるタイ ミ ング制約を適用し、 ロジッ クをザイ リ

ンクス プリ ミ ティブにマップして、 メモ リ内にデザイン データベースを作成します。 Vivado ツールをバッチ

モードで実行している場合でも、 Tcl シェル モードで対話的に Tcl コマンドを実行している場合でも、 グラフ ィ

カル モードでデザイン データを Vivado 統合設計環境 (IDE) で表示している場合でも、 メモ リ内のデザインは

Vivado ツール内に存在します。

合成が完了したら、 チェッ クポイン ト を保存します。 この時点では、 デザインはタイ ミ ング制約および物理制

約が適用された未配置の合成済みネッ ト リ ス トです。 タイ ミ ングやリ ソース使用率など、 さまざまなレポート

を作成する と、 デザインを理解するのに有益です。

Tcl スクリプ ト機能の使用 11UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 12: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

このサンプル スク リプ トでは、 reportCriticalPaths とい う カスタム コマンドを使用して、 TNS、 WNS、

違反を CSV ファ イルにレポート します。 これによ り、 ク リ ティカルなパスをすばやく特定できます。

合成後に read_xdc または source コマンドを使用して読み込まれた XDC ファ イルは、インプ リ メンテーシ ョ

ンにのみ適用されます。 それらのファイルは、 その後デザイン チェッ クポイン ト を保存した場合にネッ ト リ ス

ト と共に保存されます。

• 手順 4: 配置配線の準備と してロジッ ク 適化を実行します。 適化の目的は、 ターゲッ ト パーツの物理リ ソー

スに配置する前にロジッ ク デザインを簡略化するこ とです。 適化後、 タイ ミ ング ド リブン配置を実行しま

す。

各手順の後、 reportCriticalPaths コマンドを実行して新しい CSV ファ イルを生成します。 デザインの異

なる段階からの複数の CSV ファ イルを使用する と、 カスタム タイ ミ ング サマリ スプレッ ドシート を作成でき、

インプ リ メンテーシ ョ ンの各段階でタイ ミ ングがどのよ うに向上したかを理解するのに役立ちます。

配置が完了したら、 get_timing_paths コマンドを使用して配置済みデザインのワース ト タイ ミ ング パスの

SLACK プロパティを取得します。 report_timing コマンドを使用する と、 ワース ト スラ ッ クを含むタイ ミ ン

グ パスの詳細なテキス ト形式レポートが生成されますが、 get_timing_paths コマンドを使用する と、 同じ

タイ ミ ング パスが Tcl オブジェク ト と して、 パスの主なタイ ミ ング特性に対応するプロパティ と共に返されま

す。 SLACK プロパティは指定したタイ ミ ング パス (この例の場合はワース ト パス) のスラ ッ クを返します。 ス

ラ ッ クが負の場合、 物理 適化を実行して、 配置タイ ミ ング違反の解決を試みます。

手順 4 の 後にチェッ クポイン ト を保存し、 デザインのタイ ミ ング サマリ とデバイス使用率をレポート します。

これによ り、 配線前と配線後のタイ ミ ングを比較し、 配線のタイ ミ ングへの影響を評価できます。

• 手順 5: タイ ミ ング ド リブン配線を実行し、 チェッ クポイン ト を保存します。 これでメモ リ内のデザインが配線

されたので、 追加のレポート を生成して、 消費電力、 デザイン ルール違反、 終的なタイ ミ ングに関する重要

な情報を入手できます。 レポートはファイルに出力しておいて後で確認できるほか、 Vivado IDE に表示してイ

ンタラ クティブに確認するこ と もできます。 その後、 タイ ミ ング シ ミ ュレーシ ョ ン用に Verilog ネッ ト リ ス ト を

エクスポート します。

• 手順 6: デザインをザイ リ ンクス FPGA にプログラムするビッ ト ス ト リームを生成します。

プロジェク ト  フローでのコンパイル

次に、 プロジェク ト フローでデザインを合成し、 ビッ ト ス ト リーム生成までのインプリ メンテーシ ョ ンを実行する

スク リプ ト例を示します。 この例では、 Vivado インス トール ディ レク ト リにある CPU サンプル デザインを使用し

ています。

## STEP#1: define the output directory area.#set outputDir ./Tutorial_Created_Data/cpu_projectfile mkdir $outputDircreate_project project_cpu_project ./Tutorial_Created_Data/cpu_project \ -part xc7k70tfbg676-2 -force## STEP#2: setup design sources and constraints#add_files -fileset sim_1 ./Sources/hdl/cpu_tb.vadd_files [ glob ./Sources/hdl/bftLib/*.vhdl ]add_files ./Sources/hdl/bft.vhdladd_files [ glob ./Sources/hdl/*.v ]add_files [ glob ./Sources/hdl/mgt/*.v ]add_files [ glob ./Sources/hdl/or1200/*.v ]add_files [ glob ./Sources/hdl/usbf/*.v ]

Tcl スクリプ ト機能の使用 12UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 13: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

add_files [ glob ./Sources/hdl/wb_conmax/*.v ]add_files -fileset constrs_1 ./Sources/top_full.xdcset_property library bftLib [ get_files [ glob ./Sources/hdl/bftLib/*.vhdl ]]## Physically import the files under project_cpu.srcs/sources_1/imports directoryimport_files -force -norecurse ## Physically import bft_full.xdc under project_cpu.srcs/constrs_1/imports directoryimport_files -fileset constrs_1 -force -norecurse ./Sources/top_full.xdc# Update compile order for the fileset 'sources_1'set_property top top [current_fileset]update_compile_order -fileset sources_1update_compile_order -fileset sim_1## STEP#3: run synthesis and the default utilization report.#launch_runs synth_1wait_on_run synth_1## STEP#4: run logic optimization, placement, physical logic optimization, route and# bitstream generation. Generates design checkpoints, utilization and timing# reports, plus custom reports.set_property STEPS.PHYS_OPT_DESIGN.IS_ENABLED true [get_runs impl_1]set_property STEPS.OPT_DESIGN.TCL.PRE [pwd]/pre_opt_design.tcl [get_runs impl_1]set_property STEPS.OPT_DESIGN.TCL.POST [pwd]/post_opt_design.tcl [get_runs impl_1]set_property STEPS.PLACE_DESIGN.TCL.POST [pwd]/post_place_design.tcl [get_runs impl_1]set_property STEPS.PHYS_OPT_DESIGN.TCL.POST [pwd]/post_phys_opt_design.tcl [get_runs impl_1]set_property STEPS.ROUTE_DESIGN.TCL.POST [pwd]/post_route_design.tcl [get_runs impl_1]launch_runs impl_1 -to_step write_bitstreamwait_on_run impl_1 puts "Implementation done!"

サンプル スクリプ トの詳細

• 手順 1: create_project コマンドでプロジェク ト を作成します。 プロジェク ト ディ レク ト リおよびターゲッ

ト デバイスが指定されています。 指定したプロジェク ト ディ レク ト リが存在しない場合は、 自動的に作成され

ます。

この例では、 さまざまなレポート を保存する出力ディ レク ト リは、 プロジェク ト ディ レク ト リ と同じです。

• 手順 2: プロジェク トで使用されるすべてのファイルを宣言し、 プロジェク トに追加します。 これには、

add_files コマンドを使用します。 ファ イルをプロジェク トに追加する と、 特定のファイルセッ トに追加され

ます。 ファ イルセッ トは、 目的別にファイルをグループ化するコンテナーです。 このスク リプ ト例では、 ほと

んどのファイルはデフォルトのファ イルセッ ト (sources_1) に追加されますが、 Verilog テス ト テス トベンチ

cpu_tb.v のみはデフォルトのシ ミ ュレーシ ョ ン ファ イルセッ ト sim_1 に追加されます。

ファ イルは、 import_files コマンドを使用してプロジェク ト ディレク ト リにもコピーします。 これによ り、

プロジェク トでソース ファ イルのローカル コピーが使用され、 元のソース ファ イルは参照されません。

• 手順 3: バッ クグランドで合成 run を起動し、 デザインを合成します (launch_run synth_1)。 Vivado IDE によ

り必要なスク リプ トがすべて自動的に生成され、 別の Vivado セッシ ョ ンで合成が実行されます。 合成 run は別

のプロセスで実行されるので、 現在のスク リプ ト を続行する前に合成 run が完了するのを待つ必要があ り ます。

これには、 wait_on_run コマンドを使用します。

合成 run が完了したら、 open_run synth_1 コマンドを使用して結果をメモ リに読み込むこ とができます。 制

約のないチェッ クポイン トが、 合成を実行したプロジェク ト ディ レク ト リに保存されます。 この例では、

チェッ クポイン トは次のディ レク ト リに保存されます。

./Tutorial_Created_Data/cpu_project/project_cpu.runs/synth_1/top.dcp

Tcl スクリプ ト機能の使用 13UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 14: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

注記:合成 run のデフォルト名は synth_1、 インプリ メンテーシ ョ ン run のデフォルト名は impl_1 です。

create_run コマンドを使用して、 追加の run を作成できます。

• 手順 4: launch_run コマンドを使用してインプリ メンテーシ ョ ンを実行します。 配置前の 適化からビッ ト ス

ト リーム生成までの完全な配置配線フローを、 1 つのコマンドで実行できます。 このスク リプ ト例では、 ビッ ト

ス ト リーム生成までのインプ リ メンテーシ ョ ンが実行されます (launch_run impl_1 -to_step

write_bitstream)。

STEPS.PHYS_OPT_DESIGN.IS_ENABLED プロパティによ り、 オプシ ョ ンの phys_opt_design がイネーブルに

なっています。 ユーザー定義の条件によ り インプリ メンテーシ ョ ン コマンドをダイナミ ッ クに呼び出すこ とができ

る非プロジェク ト フローとは異なり、 プロジェク ト フローの run は実行する前に設定する必要があ り ます。 そのた

め、 非プロジェク ト フローの例とは異なり、 この例では配置後のタイ ミ ング スラ ッ ク値をチェッ クせずに物理ロ

ジッ ク 適化がイネーブルに設定されています。

run の Tcl フッ ク プロパティ STEPS.<STEPNAME>.TCL.PRE および STEPS.<STEPNAME>.TCL.POST を使用する

と、 各インプ リ メンテーシ ョ ン段階の前後にさまざまなレポートが生成できます。 これらのプロパティを使用する

と、 run 構造を使用したと きにフローで Tcl スク リプ ト をいつ実行するかを指定できます。 詳細は、 「Tcl フッ ク スク

リプ トの定義」 を参照してください。

インプ リ メンテーシ ョ ン run は別の Vivado セッシ ョ ンで実行されるので、 Tcl 変数およびプロシージャをスク リプ ト

で使用するには、 それらをそのセッシ ョ ンで初期化する必要があ り ます。 これには、 いくつかの方法があ り ます。

• 方法 1: Tcl 変数およびプロシージャを Vivado_init.tcl で定義します ( 「Tcl スク リプ トの初期化」 を参照)。

この方法で変数およびプロシージャを定義する と、 すべての プロジェク トおよびセッシ ョ ンに適用されます。

• 方法 2: 変数およびプロシージャを含む Tcl スク リプ ト を、 run で使用する制約セッ トに追加します。 デザインを

メモ リに読み込んだと きに、 制約の一部と して読み込まれます。

• 方法 3: STEPS.OPT_DESIGN.TCL.PRE で変数およびプロシージャを含む Tcl スク リプ ト を設定します。 このス

ク リプ トは、 OPT_DESIGN をイネーブルにした場合にのみ読み込まれます。 デフォルトでは、 true に設定され

ています。

先ほど示したスク リプ ト例では、 方法 3 を使用しています。 変数およびプロシージャを含む Tcl スク リプ トは、 イン

プ リ メンテーシ ョ ン段階で次のよ うに指定されています。

set_property STEPS.OPT_DESIGN.TCL.PRE [pwd]/pre_opt_design.tcl [get_runs impl_1]set_property STEPS.OPT_DESIGN.TCL.POST [pwd]/post_opt_design.tcl [get_runs impl_1]set_property STEPS.PLACE_DESIGN.TCL.POST [pwd]/post_place_design.tcl [get_runs impl_1]set_property STEPS.PHYS_OPT_DESIGN.TCL.POST [pwd]/post_phys_opt_design.tcl [get_runs impl_1]set_property STEPS.ROUTE_DESIGN.TCL.POST [pwd]/post_route_design.tcl [get_runs impl_1]

インプ リ メンテーシ ョ ン run は、 コンパイル Tcl スク リプ トが実行されるディ レク ト リ とは異なるプロジェク トのサ

ブディ レク ト リで実行されるので、 Tcl スク リプ トは絶対パスで指定する必要があ り ます。

• pre_opt_design.tcl

############## pre_opt_design.tcl ##################set outputDir [file dirname [info script]]/Tutorial_Created_Data/cpu_projectsource [file dirname [info script]]/reportCriticalPaths.tcl#report_timing_summary -file $outputDir/post_synth_timing_summary.rptreport_utilization -file $outputDir/post_synth_util.rptreportCriticalPaths $outputDir/post_synth_critpath_report.csv

初の 2 行では、 インプリ メンテーシ ョ ン run の後の方のいくつかのスク リプ トで使用される変数およびプロ

シージャを初期化します。 次の 3 行では、 タイ ミ ング レポート と使用率レポート を生成します。 インプリ メン

テーシ ョ ンのはじめにタイ ミ ング解析を実行し、 配置配線で使用されるタイ ミ ング制約をチェッ ク し、 大きな

Tcl スクリプ ト機能の使用 14UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 15: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

違反がないこ とを確認するこ とが推奨されます。 reportCriticalPaths レポートは、 デザインのワース ト

パスに関する詳細を示します。 この Tcl プロシージャについては、 「Tcl プロシージャの定義」 で詳細に説明しま

す。

• post_opt_design.tcl

############## post_opt_design.tcl ################### Run custom script to report critical timing pathsreportCriticalPaths $outputDir/post_opt_critpath_report.csv

outputDir 変数および reportCriticalPaths プロシージャは、 同じ Vivado セッシ ョ ンの run で既に読み込

まれている pre_opt_design.tcl で定義されているので、 このスク リプ トでは定義する必要はあ り ません。

opt_design の後にもタイ ミ ング レポート と使用率レポート を生成するこ とが推奨されます。

• post_place_design.tcl

############## post_place_design.tcl ##################report_clock_utilization -file $outputDir/clock_util.rpt

配置後、 クロ ッ ク リ ソースの使用率およびデバイスでの位置を確認できます。 フローの後の方では解決できな

い大きなタイ ミ ング違反を検出するため、 タイ ミ ング解析を実行するこ とが推奨されます。

• post_phys_opt_design.tcl

############## post_phys_opt_design.tcl ##################report_utilization -file $outputDir/post_phys_opt_util.rptreport_timing_summary -file $outputDir/post_phys_opt_timing_summary.rpt

配置後と同様、 フローのこの段階でもタイ ミ ング レポート を確認するこ とが重要です。

• post_route_design.tcl

############## post_route_design.tcl ##################report_route_status -file $outputDir/post_route_status.rptreport_timing_summary -file $outputDir/post_route_timing_summary.rptreport_power -file $outputDir/post_route_power.rptreport_drc -file $outputDir/post_imp_drc.rptwrite_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true

配線後のタイ ミ ング解析では、 配線済みの実際のネッ ト遅延が使用されるので、 タイ ミ ングのサインオフのた

め確認する必要があ り ます。 配線ステータス レポートには、 配線問題の数が示されます。 配線問題がある場合、

DRC レポート を生成する とそれらの問題を特定するのに役立ちます。

注記: フッ ク スク リプ トでインプリ メンテーシ ョ ン段階を実行している場合、 Tcl 変数 ACTIVE_STEP を使用す

る とレポートのファ イル名を固有にするなどを実行できます。変数 ACTIVE_STEP は、 run 構造の使用中 Vivado

によ り自動的にアップデート されます。 詳細は、 「段階間でのフッ ク スク リプ トの共有」 を参照して ください。

注記:上記のスク リプ トで配線後に生成される Tcl レポートのほとんどは、 run でも自動的に生成されます。 ま

た、 プロジェク ト フローを使用している場合は、 フローの各段階の後にデザイン チェッ クポイン ト も自動的に

生成されるので、 スク リプ トで write_checkpoint コマンドを呼び出す必要はあ り ません。 すべてのチェッ

クポイン ト とデフォルトのレポートは、 インプリ メンテーシ ョ ン run ディ レク ト リにあ り ます。

Tcl スクリプ ト機能の使用 15UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 16: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

./Tutorial_Created_Data/cpu_project/project_cpu.runs/impl_1/top_opt.dcptop_placed.dcptop_physopt.dcptop_routed.dcp

top_clock_utilization_placed.rpttop_control_sets_placed.rpttop_utilization_placed.rpttop_io_placed.rpttop_drc_routed.rpttop_power_routed.rpttop_route_status.rpttop_timing_summary_routed.rpt

インプ リ メンテーシ ョ ン run が完了したら、 open_run impl_1 コマンドを使用してインプリ メン ト済みデザ

インを メモ リに読み込むこ とができます。

Tcl スクリプ トの読み込みと実行

Vivado Design Suite では、デザイン セッシ ョ ン中に Tcl スク リプ ト を読み込んで実行するのに複数の方法があ り ます。

ツールを起動したと きにスク リプ ト ファ イルが自動的に読み込まれるよ うにするか、 Tcl コマンド ラインで source

コマンドを使用して読み込むか、 Vivado IDE のメニューに追加します。

Tcl スクリプ トの初期化

Vivado Design Suite で Tcl スク リプ トが自動的に読み込まれるよ うにするには、 Vivado_init.tcl ファ イルで定義

します。 この方法は、 新しいコマンドを定義する Tcl プロシージャを記述し、 Vivado のすべてのセッシ ョ ンで使用で

きるよ うにする場合に有益です。

注記: 2017.1 から、 Vivado Design Suite のスタート アップ スク リプ トの名前が Vivado_init.tcl に変更されていま

す。 これまでのバージ ョ ンでは、 init.tcl とい う名前でした。 Vivado_init.tcl が存在せず init.tcl がある

場合は、 init.tcl が使用され、 ファ イルが古いこ とを示すメ ッセージが表示されます。

Vivado ツールを起動する と、 Tcl 初期化スク リプ トが次の場所でリ ス ト されている順に検索されます。

1. ツールのインス トール ディレク ト リ : <installdir>/Vivado/version/scripts/Vivado_init.tcl

<installdir> は Vivado Design Suite のインス トール ディ レク ト リです。

2. ローカル ユーザー ディ レク ト リ (Vivado ツールのバージ ョ ンによって異なる ):

° Windows 7: %APPDATA%/Xilinx/Vivado/<VivadoVersion>/Vivado_init.tcl

例: %APPDATA%/Xilinx/Vivado/2017.1/Vivado_init.tcl

° Linux: $HOME/.Xilinx/Vivado/<VivadoVersion>/Vivado_init.tcl

例: $HOME/.Xilinx/Vivado/2017.1/Vivado_init.tcl

3. ローカル ユーザー ディ レク ト リ (Vivado ツールのバージ ョ ンによって異なる ):

° Windows 7: %APPDATA%/Xilinx/Vivado/Vivado_init.tcl

Tcl スクリプ ト機能の使用 16UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 17: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

° Linux: $HOME/.Xilinx/Vivado/Vivado_init.tcl

Vivado_init.tcl が複数の場所で見つかった場合は、 上記の順序で読み込まれます。

インス トール ディレク ト リにある Vivado_init.tcl ファ イルを使用する と、 企業またはデザイン グループです

べてのユーザーに対して共通の初期化スク リプ ト をサポートできます。 そのインス トール ディ レク ト リから Vivado

ツールを起動する と、 共通の Vivado_init.tcl スク リプ トが使用されます。

ホーム ディレク ト リにある Vivado_init.tcl ファ イルを使用する と、 各ユーザーがそれぞれコマンドを追加した

り、 デザイン要件を満たすためにツールのインス トール ディレク ト リに含まれるコマンドを変更できます。

Vivado_init.tcl ファ イルは標準の Tcl スク リプ ト ファ イルで、 Vivado ツールでサポート されるどの Tcl コマン

ドでも含めるこ とができます。 source コマンドを追加して、 Vivado_init.tcl から別の Tcl スク リプ ト ファ イ

ルを読み込むこ と もできます。

注記: Vivado_init.tcl は <program>_init.tcl という命名規則に従っています。 サポート されるほかのプログラム

名は、 xsim および vivado_lab です。 たとえば、 Vivado シ ミ ュレータ はスタート アップ時に xsim_init.tcl という

ファ イルを検索します。

Tcl スクリプ トの読み込み

source コマンドを使用する と、 Tcl スク リプ ト ファ イルを Vivado ツールに手動で読み込むこ とができます。

source <filename>

<filename> はファイル名とファ イルの相対パスまたは絶対パスを指定します。 パスをファ イル名の一部と して指

定しない場合は、 現在の作業ディ レク ト リ または Vivado Design Suite ツールを起動したディレク ト リにファ イルが作

成されます。

Vivado IDE で Tcl スク リプ ト を読み込むには、 [Tools] → [Run Tcl Script] をク リ ッ ク します。

デフォルトでは、 ファ イルの各行が Tcl コンソールに表示されます。 表示されないよ うにするには、 -notrace オプ

シ ョ ンを使用します。 これは、 Vivado Tcl インタープリ ターに特有のオプシ ョ ンです。

source <filename> -notrace

制約セッ トでの Tcl スクリプ トの使用

Tcl スク リプ トは、 通常の XDC ファ イルと同様に、 プロジェク トの制約セッ トに追加できます。 ただし、 XDC ファ

イルはツールで管理されますが、 Tcl スク リプ トはツールで管理されません。 Tcl スク リプ トで定義された制約が

ツールで変更されても、 Tcl スク リプ トに自動的には保存されません。 変更を保存するには、 メモ リの制約をすべて

ファイルにエクスポート し、 このファ イルを使用してスク リプ ト を手動でアップデートする必要があ り ます。 デザ

インを メモ リで開く と (open_run)、 XDC ファ イルの後に Tcl スク リプ トが読み込まれます。 これは、 非プロジェク

ト フローで read_xdc を使用して XDC ファ イルを読み込んだ後に Tcl スク リプ ト を実行するのと同等です。 制約

セッ トでの XDC ファ イルおよび Tcl スク リプ トの使用については、 『Vivado Design Suite ユーザー ガイ ド : 制約の使

用』 (UG903) [参照 3] を参照してください。

Tcl フック  スクリプ トの定義

非プロジェク ト フローでは、 synth_design コマンド実行の前後など、 フローのどの時点でも Tcl スク リプ ト を読

み込むこ とができます。 プロジェク ト ベース フローでも、 Vivado IDE を使用するか、 set_property コマンドを使

用して合成 run またはインプリ メンテーシ ョ ン run にプロパティを設定するこ とによ り、 これを実行できます。 Tcl

Tcl スクリプ ト機能の使用 17UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 18: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

フッ ク スク リプ ト を使用する と、 合成 run またはインプリ メンテーシ ョ ン run、 あるいはインプリ メンテーシ ョ ンの

任意の段階の前 (tcl.pre) および後 (tcl.post) にカスタム Tcl スク リプ ト を実行できます。

合成 run またはインプリ メンテーシ ョ ン run を起動する と、 定義済みの Tcl スク リプ トが使用され、 選択したス ト ラ

テジに基づいて標準デザイン フローが処理されます。 Tcl フッ ク スク リプ トによ り この標準フローをカスタマイズ

できます。 任意の段階で Tcl スク リプ ト を実行できるので、 有益です。 デザイン フローの各段階の前後でフッ ク ス

ク リプ ト を実行できます。 一般的に、 次のよ うな使用法があ り ます。

• カスタム レポート : タイ ミ ング、 消費電力、 リ ソース使用率、 またはユーザー定義の Tcl レポート。

• フローの一部でのみタイ ミ ング制約を変更。

• ネッ ト リ ス ト 、 制約、 またはデバイス プログラムを変更。

GUI では、デザイン run を右ク リ ッ ク して [Change Run Settings] をク リ ッ クする と、Tcl フッ ク スク リプ ト を指定でき

ます。 [Design Runs] ウ ィンド ウで run を右ク リ ッ ク して [Change Run Settings] をク リ ッ ク し、 [Design Run Settings] ダ

イアログ ボッ クスを開きます。 [tcl.pre] および [tcl.post] オプシ ョ ンを使用して Tcl フッ ク スク リプ ト を指定

します。

合成 run またはインプリ メンテーシ ョ ン run にプロパティが設定され、 run の前 (tcl.pre) または後 (tcl.post) に

実行するスク リプ トが指定されます (図 1)。 Tcl コンソールまたは Tcl スク リプ トの一部と して、 合成 run またはイン

プ リ メンテーシ ョ ン run に直接このプロパティを設定するこ と も可能です。

X-Ref Target - Figure 1

図 1: Tcl フ ック  スクリプ トの指定

Tcl スクリプ ト機能の使用 18UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 19: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

合成 run に設定するプロパティは、 次のとおりです。

STEPS.SYNTH_DESIGN.TCL.PRESTEPS.SYNTH_DESIGN.TCL.POST

たとえば、 合成前に report.tcl スク リプ ト を実行するには、 次のよ うに設定します。

set_property STEPS.SYNTH_DESIGN.TCL.PRE {C:/Data/report.tcl} [get_runs synth_1]

インプ リ メンテーシ ョ ン run では、 インプリ メンテーシ ョ ン プロセスの各段階 ( 適化、 消費電力 適化、 配置、 配

置後の消費電力 適化、 物理 適化、 配線、 ビッ ト ス ト リーム生成) の前後に Tcl スク リプ ト を実行できます。 これ

らのプロパティは、 次のとおりです。

STEPS.OPT_DESIGN.TCL.PRESTEPS.OPT_DESIGN.TCL.POSTSTEPS.POWER_OPT_DESIGN.TCL.PRESTEPS.POWER_OPT_DESIGN.TCL.POSTSTEPS.PLACE_DESIGN.TCL.PRESTEPS.PLACE_DESIGN.TCL.POSTSTEPS.POST_PLACE_POWER_OPT_DESIGN.TCL.PRESTEPS.POST_PLACE_POWER_OPT_DESIGN.TCL.POSTSTEPS.PHYS_OPT_DESIGN.TCL.PRESTEPS.PHYS_OPT_DESIGN.TCL.POSTSTEPS.ROUTE_DESIGN.TCL.PRESTEPS.ROUTE_DESIGN.TCL.POSTSTEPS.WRITE_BITSTREAM.TCL.PRESTEPS.WRITE_BITSTREAM.TCL.POST

重要: tcl.pre および tcl.post スク リプ ト内のパスは、 プロジェク トの関連する run ディ レク ト リ

<project>/<project.runs>/<run_name> を基準と します。 現在のプロジェク ト または現在の run の

DIRECTORY プロパティを使用して、 Tcl フッ ク スク リプ ト内の相対パスを定義できます。 get_property DIRECTORY [current_project]

get_property DIRECTORY [current_run]

段階間でのフック  スクリプ トの共有

フッ ク スク リプ トが段階に依存せず、 インプリ メンテーシ ョ ン段階の一連のレポート を生成するのみの場合、 段階

ごとにスク リプ ト を複製して、 そのインプリ メンテーシ ョ ン段階に合わせてレポート ファ イル名のみを変更する と

いうのは効率がよ くあ り ません。 すべてのインプリ メンテーシ ョ ン段階でフッ ク スク リプ ト を共有し、 Tcl 変数

ACTIVE_STEP を使用してレポート ファ イル名を構築する方法をお勧めします。 この方法では、 各段階に別のファ

イル名を付けるこ とができます。

プロジェク ト モードでは、 run 構造から run を実行する と き、 実行するインプリ メンテーシ ョ ン段階に合わせて Tcl

変数 ACTIVE_STEP が自動的にアップデート されます。

注記: Tcl 変数 ACTIVE_STEP は、 プロジェク ト モードで run 構造を使用する と きのみ使用できます。

次に、 Tcl 変数 ACTIVE_STEP を使用したフッ ク スク リプ トの例を示します。

set step $ACTIVE_STEPreport_timing_summary -file tim_summary_${step}.rptif {$step == {route_design}} { report_route_status -file route_status.rpt}

Tcl スクリプ ト機能の使用 19UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 20: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

GUI のカスタマイズ

[Tools] → [Custom Commands] → [Customize Commands] を使用して、 Vivado IDE のメ イン メニューおよびツールバー

にシステムまたはユーザー定義の Tcl コマンドを追加できます。 メニューにカスタム コマンドを追加する方法の詳

細は、『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893) [参照 6] のこのセクシ ョ ンを参照してくださ

い。

Tcl スクリプ トの記述

Tcl スク リプ ト を記述する際は、 ユーザーの使いやすさに焦点を置く必要があ り ます。 つま り、 ヘルプやインタラ ク

ティブ コマンド ライン引数を提供するなど、 Vivado に組み込まれているコマンド と同じよ うに使用できるよ うにす

るのが理想的です。 get_* コマンドを使用した後に Vivado オブジェク トのが空かど うかなど、 まれな状況もすべて

考慮する必要があ り ます。 Tcl コードを記述する際は、 コードで使用される下位プロシージャを作成するのも一般的

です。 プロシージャ とグローバル変数の名前の競合を回避するには、 独自の名前空間内でコードを記述し、 名前の

競合を 小限に抑えるよ うにするこ とをお勧めします。

Tcl プロシージャの定義

Vivado Design Suite には、 完全な Tcl インタープリ ターがビルト インされており、 新しいカスタム コマンドやプロ

シージャを簡単に作成できます。 Tcl スク リプ ト を記述して Vivado IDE から読み込んで実行したり、 プロシージャを

記述して、 引数を取り、 エラーをチェッ ク して、 結果を返す新しい Tcl コマンド と して使用できます。

Tcl プロシージャは proc コマンドで指定します。 プロシージャ名、 引数のリ ス ト、 実行するコードの本文を引数と

して指定します。 次に、 プロシージャ定義の簡単な例を示します。

proc helloProc { arg1 } {# This is a comment inside the body of the procedureputs "Hello World! Arg1 is $arg1"

}

ヒン ト : このプロシージャの定義では引数は 1 つなので中かっこで囲む必要はあ り ませんが、 中かっこを使用するこ

とでプロシージャ定義がわかりやすくな り ます。 引数が複数ある場合は、 中かっこは必須です。

通常プロシージャでは、 定義済みの引数と、 オプシ ョ ンでデフォルト値を指定します。 引数にデフォルト値がある

場合、 その前の必須の引数がすべて指定されていれば、 プロシージャを呼び出したと きにその引数を指定する必要

はあ り ません。 プロシージャは、 return コマンドを使用して値を返すよ う指定していない場合、 空のリ ス ト を返

します。

次の例では、 3 つの定義済み引数を持つ reportWorstViolations というプロシージャを定義しています。

proc reportWorstViolations { nbrPaths corner delayType } {report_timing -max_paths $nbrPaths -corner $corner -delay_type $delayType -nworst 1

}

プロシージャを実行する際、 次の例に示すよ うに、 すべての引数を指定する必要があ り ます。

%> reportWorstViolations 2 Slow max%> reportWorstViolations 10 Fast min

Tcl スクリプ ト機能の使用 20UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 21: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次の例では、 同じプロシージャで 3 つの引数のうち 後の 2 つにデフォルト値があ り ます。 corner のデフォルト値

は Slow、 delayType のデフォルト値は Max です。 プロシージャの定義でデフォルト値が設定されているので、 プ

ロシージャを呼び出す際は corner および delayType 引数の指定はオプシ ョ ンです。

proc reportWorstViolations { nbrPaths { corner Slow } { delayType Max } } {report_timing -max_paths $nbrPaths -corner $corner -delay_type $delayType -nworst 1

}

このプロシージャを実行する際は、 次のすべての呼び出し方法が有効です。

%> reportWorstViolations 2%> reportWorstViolations 10 Fast%> reportWorstViolations 10 Slow Min

次のプロシージャの例には必須の引数 nbrPath があ り ますが、 それ以外にも追加の引数を指定できます。 この場

合、 プロシージャを定義する際に引数のリ ス ト と して Tcl キーワード args を使用します。 args キーワードは、 任

意の数の要素 (0 を含む) を含む Tcl リ ス ト を示します。

proc reportWorstViolations { nbrPaths args } {eval report_timing -max_paths $nbrPaths $args

}

Tcl コマンドを実行する際、 Tcl コマンドで使用可能なまたは必須のコマンド ライン引数の代わりに変数置換を使用

できます。 この場合、 Tcl eval コマンドを使用してコマンドの一部と して Tcl 変数を含めたコマンド ラインを評価

する必要があ り ます。 上記の例では、 引数のリ ス ト変数 ($args) が report_timing コマンドに変数と して渡され

るので、 eval コマンドが必要です。

プロシージャを実行する際は、 次のいずれの形式でも機能します。

%> reportWorstViolations 2%> reportWorstViolations 1 -to [get_ports]%> reportWorstViolations 10 -delay_type min_max -nworst 2

初の例では、 値 2 が $nbrPaths 引数に渡され、 -max_paths に適用されます。 2 番目と 3 番目の例では、 それぞ

れ 1 と 10 が -max_paths に適用され、 その後の文字列は $args に代入されます。

次の例は、 非プロジェク ト モードのサンプル スク リプ トで使用されていた reportCriticalPaths コマンドを示

します。 このプロシージャでは 1 つの引数 $filename が使用され、 コ メン トで各セクシ ョ ンを説明しています。

#------------------------------------------------------------------------# reportCriticalPaths#------------------------------------------------------------------------# This function generates a CSV file that provides a summary of the first# 50 violations for both Setup and Hold analysis. So a maximum number of # 100 paths are reported.#------------------------------------------------------------------------proc reportCriticalPaths { fileName } {# Open the specified output file in write modeset FH [open $fileName w]

# Write the current date and CSV format to a file headerputs $FH "#\n# File created on [clock format [clock seconds]]\n#\n"puts $FH "Startpoint,Endpoint,DelayType,Slack,#Levels,#LUTs"

# Iterate through both Min and Max delay typesforeach delayType {max min} {# Collect details from the 50 worst timing paths for the current analysis # (max = setup/recovery, min = hold/removal)

Tcl スクリプ ト機能の使用 21UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 22: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# The $path variable contains a Timing Path object.foreach path [get_timing_paths -delay_type $delayType -max_paths 50 -nworst 1] {# Get the LUT cells of the timing pathsset luts [get_cells -filter {REF_NAME =~ LUT*} -of_object $path]

# Get the startpoint of the Timing Path objectset startpoint [get_property STARTPOINT_PIN $path]# Get the endpoint of the Timing Path objectset endpoint [get_property ENDPOINT_PIN $path]# Get the slack on the Timing Path objectset slack [get_property SLACK $path]# Get the number of logic levels between startpoint and endpointset levels [get_property LOGIC_LEVELS $path]

# Save the collected path details to the CSV fileputs $FH "$startpoint,$endpoint,$delayType,$slack,$levels,[llength $luts]"

}}# Close the output fileclose $FHputs "CSV file $fileName has been created.\n"return 0

}; # End PROC

Tcl スクリプ ト機能の使用 22UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 23: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

コマンド  ライン引数の解析

外部パラ メーターまたは引数を使用するプロシージャを記述する と、 プロシージャの使用範囲が広がり、 無駄な

コードを記述する必要性を軽減できます。 1 つのプロシージャで複数のコンテキス ト を処理できるよ うにする と、 重

複したコードを含む複数のプロシージャ と同じ範囲のコンテキス ト を 1 つのプロシージャで網羅でき、 使用および

管理が簡単になり ます。

これは、 プロシージャをインタラ クティブに使用する場合に特に有益です。 一部のコマンド ライン オプシ ョ ンをほ

かの Vivado コマンド と同じよ うに指定できる と、 ユーザーにとって便利です。

Tcl では、 これを args 変数を使用して簡単に適用できます。 プロシージャの引数リ ス ト内で使用される args キー

ワードは、 任意の数の要素 (0 を含む) を示します。 args 変数は、 ほかの Tcl リ ス ト と同様に処理および解析可能な

Tcl リ ス トです。

コマンド ライン引数を解析する方法は複数あ り ます。 次に、 その 1 つの例を示します。

01 proc lshift listVar {02 upvar 1 $listVar L03 set r [lindex $L 0]04 set L [lreplace $L [set L 0] 0]05 return $r06 }07 08 09 proc myproc { args } {10 11 #-------------------------------------------------------12 # Process command line arguments13 #-------------------------------------------------------14 set error 015 set help 016 set verbose 017 set ports {}18 # if {[llength $args] == 0} { incr help }; # Uncomment if necessary19 while {[llength $args]} {20 set flag [lshift args]21 switch -exact -- $flag {22 -p -23 -ports {24 set ports [lshift args]25 }26 -v -27 -verbose {28 set verbose 129 }30 -h -31 -help {32 incr help33 }34 default {35 if {[string match "-*" $flag]} {36 puts " ERROR - option '$flag' is not a valid option."37 incr error38 } else {39 puts "ERROR - option '$flag' is not a valid option."40 incr error41 }

Tcl スクリプ ト機能の使用 23UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 24: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

42 }43 }44 }45 46 if {$help} {47 set callerflag [lindex [info level [expr [info level] -1]] 0]48 # <-- HELP49 puts [format {50 Usage: %s51 [-ports|-p <listOfPorts>]52 [-verbose|-v]53 [-help|-h]54 55 Description: xxxxxxxxxxxxxxxxxxx.56 xxxxxxxxxxxxxxxxxxx.57 58 Example:59 %s -port xxxxxxxxxxxxxxx60 61 } $callerflag $callerflag ]62 # HELP -->63 return -code ok {}64 }65 66 # Check validity of arguments. Increment $error to generate an error67 68 if {$error} {69 return -code error {Oops, something is not correct}70 }71 72 # Do something73 74 return -code ok {}75 }

説明:

1. 行 1 ~ 6: リ ス トの 初の要素を削除するプロシージャ lshift を定義します。

2. 行 9: 複数の要素を指定可能な 1 つの引数 args を使用する myproc を定義します。 このコード例では、myproc

は-ports <string>、 -verbose、 -help の 3 つのコマンド ライン オプシ ョ ンをサポート します。

3. 行 19 ~ 44: すべてのコマンド ラ イン引数をループします。 すべての引数が処理される と、 args 変数は空にな

り ます。

4. 行 20: 処理が必要なコマンド ライン引数を flag 変数に保存します。 lshift プロシージャを使用して、 args

変数から引数を取得および削除します。

5. 行 21 ~ 43: flag 変数の内容を、 有効なすべての引数に対してチェッ ク します。 switch 文には -exact オプシ ョ

ンが使用されており、 flag の内容が完全なオプシ ョ ン名に対してチェッ ク されます。 たとえば、 ポート を定義

するには、 -p または -ports を指定する必要があ り ます。

-p/-ports オプシ ョ ンではコマンド ラ イン引数が指定され、 lshift args (行 24) によ り読み出され、 削除され

ます。

-v/-verbose オプシ ョ ンはブール値で、 args からの引数は必要あ り ません (行 28)。

行 31 ~33: -h/-help オプシ ョ ンをチェッ ク します。

Tcl スクリプ ト機能の使用 24UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 25: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

行 36 ~38: 「-」 で開始するすべてのコマンド ラ イン引数をチェッ ク します。 このプロシージャ例では、 サポー

ト されません。

行 39 ~40: 「-」 で開始しないすべてのコマンド ラ イン引数をチェッ ク します。 このプロシージャ例では、 サ

ポート されません。

6. 行 46 ~64:-h/-help が指定されている場合に、 組み込まれているヘルプ情報を表示します。 プロシージャにヘ

ルプ情報を組み込む必要がない場合は、 これらの行と行 30 ~ 33 は削除できます。

7. 行 68 ~70:エラーが発生していないかをチェッ ク します。 通常、 引数が有効であるかをチェッ クする追加コード

は、 行 68 よ り前に記述する必要があ り ます。 指定されたコマンド ライン オプシ ョ ンが互換していないなど、

エラーが発生している場合は、 error 変数がインク リ メン ト され、 行 69 が実行されます。

8. 行 73 以降: コードを追加します。

上記のコードはコマンド ラ イン引数を解析し、 サポート されているオプシ ョ ンと完全に一致しているかを調べてい

ますが (行 21)、 コマンド ライン引数が完全に一致しているかを調べるよ り も、 条件式に一致しているかを調べる方

が有益な場合もあ り ます。 これには、 行 21 で -exact オプシ ョ ンの代わりに -glob オプシ ョ ンを使用します。 次

に例を示します。

21 switch -glob -- $flag {22 -p* -23 -ports {24 set ports [lshift args]25 }26 -v* -27 -verbose {28 set verbose 129 }30 -h* -31 -help {32 incr help33 }34 default {35 if {[string match "-*" $flag]} {36 puts " ERROR - option '$flag' is not a valid option."37 incr error38 } else {39 puts "ERROR - option '$flag' is not a valid option."40 incr error41 }42 }43 }

行 22、 26、 および 30 では、 ワイルドカード と してアスタ リ スク (*) が使用されています。 この場合、 -pfoo など、

-p で開始するすべての文字列が、 ポート を定義する有効なコマンド ライン オプシ ョ ンとな り ます。

上記のプロシージャ例 myproc はインタラ クティブ コマンド と して機能しますが、 引数の解析のためランタイム

オーバーヘッ ドがあ り ます。 何回も呼び出される下位プロシージャでは、 ランタイム オーバーヘッ ドが問題となる

こ とがあ り ます。 プロシージャにコマンド ラ イン引数を追加するのに別の方法を使用して、 ランタイム オーバー

ヘッ ドを削減できます。 これには、 Tcl 配列にコマンド ライン引数のリ ス ト を割り当てます。 ただし、 各コマンド

ライン オプシ ョ ンに 1 つの引数しか使用できません。 次に例を示します。

01 proc myproc2 { args } {02 # Default values03 set defaults [list -p 123 -v 0]04 # First, assign default values

Tcl スクリプ ト機能の使用 25UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 26: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

05 array set options $defaults06 # Then, override with user choice07 array set options $args08 09 set ports $options(-p)10 set verbose $options(-v)11 set error 012 13 # Check validity of arguments. Increment $error to generate an error14 15 if {$error} {16 return -code error {Oops, something is not correct}17 }18 19 # Do something20 21 return -code ok {}22 }

説明:

1. 行 1: 複数の要素を指定可能な 1 つの引数 args を使用する myproc2 を定義します。args は後ほど Tcl 配列を設

定するのに使用されるので、 引数の数は偶数にする必要があ り ます。

2. 行 3: さまざまなオプシ ョ ンのデフォルト値を指定します。 各オプシ ョ ンには、 1 つの引数のみ指定できます。

3. リ ス トのフォーマッ トは、 次のとおりです。

<option1> <valueForOption1> <option2> <valueForOption2> … <optionN> <valueForOptionN>

4. 行 5: Tcl 配列 options をデフォルト値で初期化します。

5. 行 7: args 変数の値でデフォルト値を置き換えます。

6. 行 9 ~ 10: 各オプシ ョ ンの値を $options(<option>) で読み出します。次のコードを使用して、オプシ ョ ンが

存在するかをチェッ クするこ と も可能です。

if [info exists options(<option>)] { … }

注記: フラグと して機能する値のないコマンド ラ イン オプシ ョ ンは、 0 または 1 などの値を渡すこ とによ り簡単にイ

ンプ リ メン トできます。 上記のプロシージャ例では、 フラグ -v は 「myproc2 -v 1」 を使用してオンにできます。

ローカル変数とグローバル変数

プロシージャ内で作成された変数はローカルで、 関数のスタッ ク内で実行時に作成されます。 ローカル変数はプロ

シージャ内でのみアクセス可能で、 変数名がプロシージャ外の変数名と競合するこ とはあ り ません。 たとえば、 プ

ロシージャ内で作成されたローカル変数 foo とプロシージャ外で作成された foo とは別のもので、 これらの変数に

はそれぞれ独立したコンテキス トがあ り ます。 ローカル変数は、 ほかの変数と同様に set Tcl キーワードで作成しま

す。

プロシージャの引数と して定義されたパラ メーターは、 デフォルトでローカル変数となり ます。 プロシージャが呼

び出される と (例: reportCriticalPaths $myfilename)、 呼び出し変数 (例: $myfilename) はプロシージャの

スタ ッ ク内にコピーされます。 この場合、 呼び出し変数が多数の要素を含む Tcl リ ス トである と、 ランタイムおよび

メモ リ使用量が増加します。 呼び出し変数の内容を変更するこ とが必要な場合もあ り ます。 Tcl では、 変数の内容を

渡す代わりに、 変数名を参照と して渡す方法があ り ます。 変数が参照と して渡される と、 プロシージャ内での変数

の変更によ り、 呼び出し空間内の呼び出し変数も直接変更されます。 参照と して渡すパラ メーターを定義するには、

プロシージャの本文でキーワード upvar を使用します。 前述の lshift ではこの手法を使用しています。

proc lshift {listVar} {

Tcl スクリプ ト機能の使用 26UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 27: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

upvar 1 $listVar L set r [lindex $L 0] set L [lreplace $L [set L 0] 0] return $r }

サンプル プロシージャ myproc では、 変数の内容 $args ではなく変数名 args を渡すこ とによ り、 lshift を呼び

出しています。

グローバル変数は、 プロシージャ外で作成された変数で、 グローバル名前空間に属しています。 プロシージャ内で

グローバル変数を参照するには、 global キーワードを使用し、 その後に変数名を記述します。

proc printEnv {} { global env foreach var [lsort [array names env]] { puts " $var = $env($var)" }}

上記の例では、 システム環境変数を表示する printEnv というプロシージャを定義しています。 Tcl 配列 env は、

Vivado ツールの起動時に初期化されるグローバル変数です。 printEnv プロシージャでは、 global env コマンド

を使用して env 変数を参照しています。 グローバル変数を定義したら、 ローカル変数と同様にアクセスできます。

グローバル変数は、 読み出しおよび変更できます。

グローバル変数は、 名前空間の修飾子を指定してアクセスするこ と もできます。 グローバル名前空間の修飾子は

「::」 なので、 プロシージャでグローバル変数 env を参照するには 「::env」 を使用します。 構文は、 どのグロー

バル変数でも同じです。 次に例を示します。

proc printEnv {} { foreach var [lsort [array names ::env]] { puts " $var = $::env($var)" }}

printEnv では env 変数への完全パスを指定しているので、 global env を宣言する必要はあ り ません。

注記: グローバル変数はプロシージャの範囲外で作成された変数名に依存するので、 グローバル変数の使用はお勧め

しません。 プロシージャに大きな Tcl リ ス ト を渡す必要性を回避するため、 グローバル変数が使用されるこ とがあ り

ます。 グローバル変数を使用する前に、 upvar 手法を考慮してみてください。

注記: プロジェク ト モードで run 基盤を使用する場合は、 フッ ク スク リプ ト を使用して Vivado 環境内で定義された

グローバル変数を共有するこ とはできません。 推奨されるスク リプ ト間での情報の共有方法については、 「ユーザー

入力の取得」 を参照してください。

注記: close_project および close_design コマンドでは、 Tcl インタープリ ターのステートは変更されません。

すべてのグローバル変数およびユーザーの作成した名前空間は、 これらのコマンドを実行後にもそのまま保持され

ます。

プロシージャの名前空間

デフォルトでは、 Tcl インタープリ ター内で作成されたプロシージャはグローバル名前空間内に作成されます。 この

欠点は、 異なるソースからの複数の Tcl スク リプ トが使用される場合に、 プロシージャ名または変数名の競合が発生

する可能性があるこ とです。 また、 一部のプロシージャのみで使用される、 ユーザーが直接アクセスするこ とを意

図しないプロシージャが、 グローバル名前空間に含まれるこ とになる可能性もあ り ます。

Tcl では、 すべての変数およびプロシージャをグローバル名前空間内で定義する代わりに、 範囲を制限した変数およ

びプロシージャを含む名前空間がサポート されています。 名前空間はネス ト させるこ とができ、 範囲のレベル数の

制限なしで、 名前空間内に別の名前空間を定義できます。 名前空間は、 プロシージャ名および変数名に新しい構文

を追加します。 2 つのコロン (::) で、 変数名またはプロシージャ名と名前空間名を区切り ます。

Tcl スクリプ ト機能の使用 27UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 28: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次の例に、 名前空間の作成方法とその名前空間にプロシージャおよび変数を割り当てる方法を示します。 この例で

は、2 つのパブリ ッ ク プロシージャ (push および pop) を含む小さなスタ ッ クの機能を再生する名前空間 foo を作成

しています。

Tcl スクリプ ト機能の使用 28UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 29: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

01 namespace eval foo {02 variable stack [list]03 variable count 004 variable params05 array set params [list var1 value1 var2 value2 var3 value3]06 07 namespace export push pop08 09 proc push { args } {10 variable stack11 variable count12 lappend stack $args13 incr count14 }15 16 proc pop {} {17 variable stack18 variable count19 if {[llength $stack] > 0} {20 set value [lindex $stack end]21 set stack [lrange $stack 0 end-1]22 incr count -123 return $value24 } else {25 error " no more element in the stack"26 }27 }28 29 }30 31 proc foo::dump {} {32 variable stack33 variable count34 if {[llength $stack] > 0} {35 puts " There are $count element(s) in the stack:"36 foreach element $stack {37 puts " $element"38 }39 return 040 } else {41 error " no element in the stack"42 }43 }44 45 namespace import foo::*

説明:

1. 次のコマンドを使用して名前空間を定義します。

namespace eval <name> { … }

2. 行 1 は名前空間 foo を定義し、 行 29 は名前空間定義の閉じかっこです。

3. 名前空間内の変数は、 variable コマンドで作成します (行 2 ~ 4)。

variable <varname> ?<varvalue>?

Tcl 配列を variable コマンドで初期化するこ とはできません。 まず作成し (行 4)、 その後で初期化する必要が

あ り ます (行 5)。

Tcl スクリプ ト機能の使用 29UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 30: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

注記:名前空間内で変数を定義するのに set コマンドを使用しないでください。 そのよ うにする と、 グローバル

名前空間に同じ変数名がある場合に Tcl インタープリ ターで混同される可能性があ り ます。

4. プロシージャは、 名前空間定義の中または外に作成できます。 コマンド namespace eval … { … } 内でプロ

シージャを作成した場合、 名前に名前空間の修飾子 (この例では foo::) は必要あ り ません。

行 9 および 16: 名前空間定義内に push および pop を作成します。

5. プロシージャを名前空間定義外で作成し、 プロシージャ名に完全な名前空間修飾子を付けて名前空間に追加す

るこ と もできます。 上記の例では、 プロシージャ dump を名前空間定義外で作成し、 名前空間 foo に追加してい

ます (行 31)。

6. 行 10~11、 17~18、 32~33: プロシージャで、 キーワード variable を使用して名前空間内で作成された変数

を参照します。

7. 名前空間内で作成されたプロシージャは、 完全な名前空間修飾子 (foo::push、 foo::pop、 foo::dump など)

を使用してアクセスできます。 同じ名前空間内のプロシージャを参照する場合は、 名前空間修飾子は必要あ り

ません。 たとえば、 dump で push を呼び出す必要がある場合、 foo::push ではなく push を指定します。

8. 行 7: 名前空間では、 パブリ ッ クおよびプライベート プロシージャ という概念がサポート されます。 名前空間内

のすべてのプロシージャは完全な名前空間修飾子を使用してアクセスできますが、 コマンド namespace

export... を使用する と、 どのプロシージャを名前空間外にエクスポートするかを指定できます。 プロシー

ジャ名をエクスポートする と、コマンド namespace import... (行 45) を使用してグローバル名前空間にイン

ポートできます。 このよ うにする と、 プロシージャを完全な名前空間修飾子を指定せずに直接呼び出すこ とが

できるよ うになり ます。

次に、 名前空間 foo の使用例を示します。

vivado% foo::push This is a test1vivado% foo::push {This is another line}2vivado% push This is the third line3vivado% foo::dump There are 3 element(s) in the stack: This is a test {This is another line} This is the third line0

Tcl スクリプ ト機能の使用 30UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 31: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

vivado% puts "The last element stacked is: [foo::pop]"The last element stacked is: This is the third linevivado% puts "The previous element stacked is: [pop]"The previous element stacked is: {This is another line}vivado% foo::dump There are 1 element(s) in the stack: This is a test0vivado% dumpinvalid command name "dump"

テンプレート  スクリプ ト

次に、 先ほど説明した概念に基づくテンプレート スク リプ ト を示します。 このスク リプ トでは、 次を示します。

1. プライベート名前空間を使用するこ とによ り、 グローバル名前空間の汚染を回避 (lshift は名前空間 foo 内の

みで使用可能)。

2. コマンド ライン引数の処理 (-help および -version でスク リプ トのバージ ョ ンを示すなど)。

3. return -error (または error) コマンドを使用して必要に応じて Tcl エラーを生成。

namespace eval foo { namespace export myproc variable version 1.0}

proc foo::lshift listVar { upvar 1 $listVar L set r [lindex $L 0] set L [lreplace $L [set L 0] 0] return $r}

proc foo::myproc { args } {

#------------------------------------------------------- # Process command line arguments #------------------------------------------------------- set error 0 set help 0 set verbose 0 set ports {} # if {[llength $args] == 0} { incr help }; # Uncomment if necessary while {[llength $args]} { set flag [lshift args] switch -exact -- $flag { -p - -ports { set ports [lshift args] } -v - -verbose { set verbose 1 } -h - -help { incr help

Tcl スクリプ ト機能の使用 31UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 32: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

} -version { variable version return $version } default { if {[string match "-*" $flag]} { puts " ERROR - option '$flag' is not a valid option." incr error } else { puts "ERROR - option '$flag' is not a valid option." incr error } } } }

if {$help} {set callerflag [lindex [info level [expr [info level] -1]] 0] # <-- HELP puts [format { Usage: %s [-ports|-p <listOfPorts>] [-verbose|-v] [-version] [-help|-h]

Description: xxxxxxxxxxxxxxxxxxx. xxxxxxxxxxxxxxxxxxx.

Example: %s -port xxxxxxxxxxxxxxx

} $callerflag $callerflag ] # HELP --> return -code ok {} }

# Check validity of arguments. Increment $error to generate an error

if {$error} { return -code error {Oops, something is not correct} }

# Do something

return -code ok {}}

Tcl スクリプ ト機能の使用 32UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 33: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

デザイン  オブジェク トへのアクセス

Vivado Design Suite では、 プロジェク ト 、 デザイン、 デバイス情報がインメモリ データベースに読み込まれ、 合成、

インプ リ メンテーシ ョ ン、 タイ ミ ング解析、 およびビッ ト ス ト リームの生成に使用されます。 このデータベースは、

プロジェク ト モードでも非プロジェク ト モードでも同じです。 FPGA デザイン フローを実行していく と、 それに応

じてデータベースがアップデート されます。 デザイン フローのどの段階でも、 データベースの内容をチェッ クポイ

ン ト ファ イル (.dcp) に保存できます。 Vivado ツールで Tcl コマンドを使用する と、デザイン データベースにアクセ

スし、 Tcl オブジェク ト をクエ リ した り、 プロパティを読み出しまたは設定したり して、 その結果を Tcl スク リプ ト

でさまざまな目的で使用できます。 データベースの内容を理解し、 それに対してスク リプ ト をいかに効率的に記述

できるかを理解しておく と有益です。

Vivado Design Suite の Tcl インタープリ ターでは、 プロジェク ト 、 デバイス、 ネッ ト 、 セル、 ピンなど、 多数の

ファース ト ク ラス オブジェク トにアクセスできます。 Vivado Design Suite では、 プロジェク ト モードでも非プロ

ジェク ト モードでも、 デザインの進行に応じてこれらのデザイン オブジェク トが随時アップデート され、 イン メモ

リ データベースに読み込まれます。

対話的にデザイン オブジェク トのクエ リ、 プロジェク トの状態の解析、 イン メモ リ デザインにアクセスするスク リ

プ トの記述、 カスタム レポートの生成、 オプシ ョ ンのデザイン フロー手順などを実行できます。 各オブジェク トに

は複数のプロパティがあ り、 いつでも読み出すこ とができ、 また一部のプロパティは設定もできます。 ほとんどの

デザイン オブジェク トはほかのデザイン オブジェク トに関連付けられており、 その関連性をたどって関連オブジェ

ク トやその情報を取得できます。

デザイン オブジェク トのクエ リには、 get_* Tcl コマンドを使用します。 結果取得されたデザイン オブジェク トは、

直接処理するか、 Tcl 変数に代入できます。 get_* コマンドをすべて リ ス トするには、 help get_* を使用します。

オブジェク ト を変数に代入する と、 デザイン データベースに対するクエ リの回数を削減でき、 実行時間を短縮でき

ます。 ネッ トやピンのリ ス トのクエ リは時間のかかるプロセスであ り、 結果を保存しておく こ とで、 同じ情報に繰

り返しアクセスする必要がある場合にデザイン フローを高速化できます。 詳細は、 「オブジェク トのキャ ッシュ」 を

参照してください。

デザイン オブジェク トの各ク ラス (ネッ ト、 ピン、 ポート など) には標準のプロパティがあ り、 読み出したり、 一部

のプロパティは値を変更できます。 また、 RTL ソース ファ イルで指定されているデザイン属性、 Verilog パラ メー

ター、 VHDL ジェネ リ ッ ク も、 それらが設定されているネッ ト リ ス ト オブジェク トのプロパティ と して保存されま

す。 たとえば、 ポート オブジェク トには方向を指定するプロパティがあ り、 ネッ ト オブジェク トにはファンアウ ト

を指定するプロパティがあ り ます。 Vivado ツールでは、 これらのプロパティを追加、 変更、 およびレポートする多

数のコマンドがあ り ます。 get_* -filter オプシ ョ ンを使用する と、 デザイン オブジェク トの リ ス トにフ ィル

ターを適用し、 特定のプロパティ値のオブジェク トのみを取得できます。 詳細は、 「フ ィルター結果」 を参照してく

ださい。 オブジェク トに設定されているプロパティの リ ス ト を取得するには、 list_property コマンドを使用し

ます。 プロパティのタイプが enum である場合、 list_property_value コマンドを使用して有効な値のリ ス ト を

取得できます。

すべてのオブジェク トには、 NAME および CLASS プロパティがあ り ます。 オブジェク ト を Tcl 変数に代入する と、

そのオブジェク トへのポインターが変数に保存されます。 オブジェク ト を変数によ り Tcl コマンドや Tcl プロシー

ジャに渡すこ とができます。 オブジェク トが引数と して文字列を必要とする Tcl プロシージャまたはコマンドに渡さ

れた場合、 オブジェク ト そのものではなくオブジェク トの NAME プロパティが渡されます。 次の例に、 セル オブ

ジェク ト を変数 $inst に代入し、 その変数に対して puts コマンドおよび report_property コマンドを実行た結

果を示します。 puts コマンドでは文字列が処理されるのでオブジェク トの名前が表示され、 report_property

コマンドではオブジェク トのプロパティ とその値が返されているこ とに注目してください。

set inst [get_cells cpuEngine]cpuEngine

Tcl スクリプ ト機能の使用 33UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 34: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

puts $instcpuEngine

report_property $instProperty Type Read-only ValueCLASS string true cellFILE_NAME string true C:/2014.1/cpu/project_1.srcs/sources_1/imports/netlist/top.edfIS_BLACKBOX bool true 0IS_PRIMITIVE bool true 0IS_SEQUENTIAL bool true 0LINE_NUMBER int true 812044NAME string true cpuEnginePRIMITIVE_COUNT int true 11720REF_NAME string true or1200_top

どのク ラスのデザイン オブジェク トに対しても、 カスタム プロパティを作成できます。 これは、 メモ リ内のデザイ

ン オブジェク トにスク リプ トからの情報を追記する場合に有益です。 次の例では、 セル オブジェク トに対して

SELECTED というプロパティを作成しています。 プロパティ値は整数と して定義されます。

create_property SELECTED cell -type int

オブジェク トのク ラスにプロパティを作成する と、 特定のオブジェク ト上で set_property および

get_property コマンドを使用して管理し、 list_property および report_property コマンドを使用してレ

ポートできます。 次の例では、 名前が *aurora_64b66b* というパターンに一致するすべてのセルの SELECTED

プロパティを 1 に設定しています。

set_property SELECTED 1 [get_cells -hier *aurora_64b66b*]

Tcl スクリプ ト機能の使用 34UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 35: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

名前を使用したオブジェク トの取得

ほとんどのデザインは、 階層的に接続されたブロッ クまたはモジュールで構成されています。 ボ ト ムアップ、 ト ッ

プダウン、 またはミ ドルアウ トで構築されたデザインのいずれでも、 デザイン階層で特定のオブジェク ト を検索す

るのは一般的なタスクです。

get_* コマンドでは、 デフォルトではデザイン階層の 上位のオブジェク トのみが返されます。 get_* コマンドを

使用する前に current_instance コマンドを使用する と、 デザインの特定の階層インスタンスでデザイン オブ

ジェク ト を検索できます。 検索範囲をデザインの 上位に戻すには、 current_instance コマンドを引数を指定

せずに実行します。

図 2 に、 上位にモジュール A および B がインスタンシエート されている例を示します。モジュール A には a1 およ

び a2 階層インスタンスが含まれ、 モジュール B には b1 および b2 階層インスタンスが含まれます。 a1、 a2、 b1、 お

よび b2 には、 それぞれ 下位セル (Unisim インスタンス) が含まれます。

# Set the current instance of the design to module B.current_instance B get_cells * ; # Returns b1 and b2, cells found in the level of the current instance.get_nets * ; # Returns nets from module B, the current instance.# Reset the current instance to the top-level of the design.current_instance get_cells * ; # Returns A and B, located at the top-level of the design.

get_* コマンドでは 上位または current_instance で指定した現在のインスタンスのレベルでのみ検索が実行されま

すが、 現在のインスタンスに対する階層インスタンス名を含む検索パターンを指定できます。 デフォルトでは、 現

在のインスタンスはデザインの 上位に設定されています。 上位からインスタンス b1 を参照するには、 次のよ う

に指定します。

get_cells B/b1 ; # Search the top-level for an instance with a hierarchical name.

‐hierarchical オプシ ョ ンの使用

get_* コマンドでは、 デフォルトでは現在のインスタンスのレベルでのみオブジェク トが検索されますが、

-hierarchical オプシ ョ ンを使用する と、 現在のインスタンスのレベルから各デザイン階層を検索できます。

X-Ref Target - Figure 2

図 2:デザイン階層の検索

Tcl スクリプ ト機能の使用 35UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 36: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

get_cells -hierarchical * ; # Returns all cells of the design.get_nets -hier *nt* ; # Returns all hierarchical nets that match *nt*.

-hierarchical オプシ ョ ンでは、 オブジェク トの完全な階層名に対してではなく、 デザイン階層の各レベルで指

定された名前のパターンが検索されます。 通常、 -hierarchical を使用する場合、 指定する検索パターンに階層

区切り文字を含めないでください。 そ うでないと、 オブジェク トは返されません。 ただし、 合成中にネッ ト リ ス ト

が部分的にフラ ッ ト化されており、 フラ ッ ト化されたネッ ト リ ス ト レベルを示すのにも階層区切り文字が使用され

ている場合は例外です。 この場合、 階層区切り文字は名前の階層レベルを示しており、 メモ リ内に読み込まれてい

るデザインの階層レベルを示しているわけではないので、 階層区切り文字を検索パターンに使用できます。

次の例は 図 2 に基づいており、 階層ネッ ト リ ス トのみを示します。

get_cells -hierarchical B/* ; # No cell is returned.get_cells -hierarchical b* ; # B/b1 and B/b2 are returned.

-hierarchical を使用した検索は、 current_instance コマンドを使用して階層インスタンスを指定し、 各階層

レベルで指定の名前のパターンを手動で検索するのと同じです。 次の例では、 図 2 でこの手動検索を実行していま

す。

set result {}foreach hcell [list "" A B A/a1 A/a2 B/b1 B/b2] {current_instance $hcell ;# Move scope to $hcellset result [concat $result [get_cells <pattern>]]current_instance ;# Return scope to design top-level

}

重要: -hierarchical を -regexp と共に使用する場合、 検索パターンは完全な階層名と比較され、 検索パターン

と して 「B/*」 を指定した場合にこのパターンに一致するセル名が返されます。 たとえば、 図 2 で get_cells

-hierarchical -regexp B/.* を実行する と、 ブロ ッ ク B の下のすべてのセルが返されます。 -regexpの詳細

は、 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 1] を参照して ください。

Tcl スクリプ ト機能の使用 36UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 37: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

‐filter および ‐regexp オプシ ョ ンの使用

Vivado Design Suite では、 get_* コマンドを使用してオブジェク トのサブセッ ト を選択するのに、 -filter および

-regexp オプシ ョ ンを -hierarchical オプシ ョ ンと共に使用できます。

次の表に、 コマンドで指定したパターンに対する -hierarchical/-filter/-regexp オプシ ョ ンの効果を示しま

す。

get_* [-hierarchical] [-filter] [-regexp] pattern

注記: オブジェク トのローカル名は、 現在の階層レベル (current_instance) からの名前の一部です。 親階層から

継承された部分の名前は含まれません。

注記:デザインの一部がフラ ッ ト化されている場合、 フラ ッ ト化されたレベルに含まれるオブジェク トのローカル名

には階層区切り文字が含まれます。 この場合、 名前のこの部分の階層区切り文字は、 区切り文字と してはなく、 リ

テラル文字と して扱われます。

注記: -filter オプシ ョ ンはフ ィルター式を指定し、 式内のパターン比較はグローバル条件式のフォーマッ トに従

います。 フ ィルター式ではオブジェク トのプロパティに基づく文字列の比較が実行され、 必要に応じて複雑なもの

にできます。 フ ィルター式に NAME プロパティを使用する と、 文字列比較にオブジェク トのローカル名ではなく完

全な階層名が使用されます。 ただし、 現在の階層レベル (current_instance) に含まれるオブジェク トのみが検索

されます。 -hierarchical を -filter と共に使用する と、 現在の階層レベルおよびその下位にあるオブジェク ト

に対してフ ィルター処理が実行されます。 -regexp を -filter と共に使用する と、 フ ィルター式内のパターン比

較は正規表現に従います。

表 1: ‐hierarchical/‐filter/‐regexp オプシ ョ ンの影響

‐hierarchical ‐filter ‐regexp 結果

pattern は現在の階層レベル (current_instance) にあるオブジェ

ク トのローカル名と比較されます。

あ りpattern は現在の階層レベル (current_instance) およびその下位

にあるオブジェク トのローカル名と比較されます。

あ り

pattern は現在の階層レベル (current_instance) にあるオブジェ

ク トに適用されるフ ィルター式とな り ます。 NAME プロパティがオブ

ジェク トの完全な階層名と比較されます。

あ り あ り

pattern は現在の階層レベル (current_instance) およびその下位

にあるオブジェク トに適用されるフ ィルター式とな り ます。 NAME プ

ロパティがオブジェク トの完全な階層名と比較されます。

あ りpattern は正規表現と して現在の階層レベル (current_instance)

にあるオブジェク トのローカル名と比較されます。

あ り あ りpattern は正規表現と して現在の階層レベル (current_instance)

およびその下位にあるオブジェク トのローカル名と比較されます。

あ り あ り

pattern は現在の階層レベル (current_instance) にあるオブジェ

ク トに適用されるフ ィルター式とな り ます。 NAME プロパティがオブ

ジェク トの完全な階層名と比較されます。 フ ィルター式は、 正規表現

と して適用されます。

あ り あ り あ り

pattern は現在の階層レベル (current_instance) およびその下位

にあるオブジェク トに適用されるフ ィルター式とな り ます。 NAME プ

ロパティがオブジェク トの完全な階層名と比較されます。 フ ィルター

式は、 正規表現と して適用されます。

Tcl スクリプ ト機能の使用 37UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 38: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

注記: -regexp は、 コマンドに指定された検索パターンが正規表現であるこ とを示します。 *、 .、 [ ]、 + などの一

部の文字は正規表現では特別な意味を持つので、 注意が必要です。 正規表現でこれらの文字を リテラルと して使用

する場合は、 エスケープ処理する必要があ り ます。

文字列比較では大文字と小文字が区別され、 常に検索文字列の冒頭および末尾にアンカーされています。 検索文字

列のサブ文字列を比較する場合は、 正規表現を使用するかど うかによって、 次の構文を使用します。

• 正規表現を使用する場合 (-regexp のみ):.*<substring>.*

• パターンがグローバル条件式のフォーマッ トに従う場合 (その他のオプシ ョ ン): *<substring>*

次に、 cpu_hdl プロジェク トに基づく例を示します。 このプロジェク トは、 Vivado IDE の Getting Started ページで

[Open Example Project] リ ンクをク リ ッ ク して開く こ とができます。

• 現在のインスタンスを fftEngine/fftInst/ingressLoop[7].ingressFifo に変更:

vivado% current_instance fftEngine/fftInst/ingressLoop[7].ingressFifofftEngine/fftInst/ingressLoop[7].ingressFifo

• 現在のインスタンスの下にあるすべてのセルを取得 (階層セルは 1 つのみ):

vivado% get_cellsfftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifovivado% get_cells -hierfftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.two_rd_addr_reg[8]_i_1__29 … (154 other cells)

• 現在のインスタンスおよびその下位にあるセルのローカル名には、 ingressLoop は含まれません。 文字列

ingressLoop は親セルから継承されたものであ り、 完全な階層名の一部です。

vivado% get_cells *ingressLoop*WARNING: [Vivado 12-180] No cells matched '*ingressLoop*'.vivado% get_cells *ingressLoop* -hierWARNING: [Vivado 12-180] No cells matched '*ingressLoop*'.

• -filter オプシ ョ ンを使用する と、 NAME プロパティは完全な階層名と一致します。

vivado% get_cells -filter {NAME =~ *ingressLoop*}fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifovivado% get_cells -filter {NAME =~ *ingressLoop*} -hierfftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.two_rd_addr_reg[8]_i_1__29 … (154 other cells)

• パターン *reg[*]* に一致するセルを検索:

vivado% get_cells *reg[*]*WARNING: [Vivado 12-180] No cells matched '*reg[*]*'.vivado% get_cells *reg[*]* -hierfftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_i_1__15 … (109 other cells)vivado% get_cells -hier -regexp {.*reg\[.*\].*}fftEngine/fftInst/ingressLoop[7].ingressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_i_1__15 … (109 other cells)vivado% get_cells -hier -regexp {.*reg[.*].*}WARNING: [Vivado 12-180] No cells matched '.*reg[.*].*'.

Tcl スクリプ ト機能の使用 38UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 39: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

後のクエリ get_cells -hier -regexp {.*reg[.*].*} で一致するセルがないのは、 角かっこ ([]) がエス

ケープ処理されていないため、 セル名のリテラル文字と してではなく、 正規表現の特殊文字と して扱われているか

らです。

フ ィルター式で値の範囲を指定する必要がある場合は、 -filter に加えて -regexp オプシ ョ ンを使用する必要が

あ り ます。 たとえば、 次のコードでは *reg[0]* から *reg[16]* までのセルのみが取得されます。 この正規表現

は .*reg\[[0-9]\].* または .*reg\[1[0-6]\].* に一致するものを検索します。

vivado% get_cells -hierarchical -regexp -filter {NAME =~ ".*reg\[([0-9]||1[0-6])\].*"}

次の例では、 どちらのコマンド も、 CLB*X*Y* に一致するタイルで、 CLB*X1Y* から CLB*X16Y* (X が 1 ~ 16) を除

く ものが返されます。

vivado% get_tiles -regexp -filter {NAME !~ "CLB.*X([1][0-6]|[0-9])Y.*" && TYPE=~ "CLB.*"}vivado% get_tiles -regexp -filter {NAME !~ "CLB.*X1[0-6]Y.*" && NAME !~ "CLB.*X[1-9]Y.*" && TYPE=~ "CLB.*"}

ピンの検索

ピンの名前は、 そのピンが属するインスタンスに基づいています。 ピンを検索する場合、 階層区切り文字を使用し、

インスタンス名とピン名を区切る必要があ り ます。 次の例は、 図 3 に示されています。

# Current instance is set to design top-levelget_pins B/* ; # Returns B/clk B/din0 B/din1 B/dout0 B/dout1

X-Ref Target - Figure 3

図 3: ピン名の検索

Tcl スクリプ ト機能の使用 39UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 40: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

get_pins B/b2/*/O ; # Returns B/b2/data_reg_i_1/Ocurrent_instance B/b2 ; # Change scope to B/b2get_pins *_reg/D ; # Returns B/b2/data_reg/D

ピンを検索する際、 -hierarchical も使用できます。

current_instance ; # Reset to the top-level of the hierarchyget_pins -hier */D # Returns pin objects for all D pins in the design

注記: -hierarchical および -hier は同じです。 オプシ ョ ンを識別するのに十分な文字数が記述されていれば、

Vivado Design Suite Tcl シェルで自動的にオプシ ョ ン名が特定されます。 このため、 -of_object と -of も同じです。

フ ィルター結果

get_* を使用してデザイン オブジェク ト を検索する場合、 通常必要なのは一部のオブジェク トのみです。 デザイン

のすべてのネッ ト リ ス ト オブジェク トは必要なく、 たとえば特定のタイプのセルや特定の名前のネッ トのみなどが

必要です。 要素の一部のみが返されるよ うにする必要があるこ と もあ り ます。

Tcl スクリプ ト機能の使用 40UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 41: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

X-Ref Target - Figure 4

ワイルドカード * および ? を使用したり、 -regexp を使用したり して検索パターンを指定し、 返される検索結果を

制限できます。 検索する階層範囲を指定するには、 current_instance コマンドまたは -hierarchy オプシ ョ ン

を使用します。

次の例では、 図 4 に示すデザインに対する異なる結果を示します。

get_cells * ; # Returns 2 cells: A,Bget_cells -hier * ; # Returns all cells of the design (leaf and hierarchical)get_cells -hier * -filter {NAME =~ */?1/*} ; # Returns 3 cells: A/a1/data0_i,

# A/a1/data_reg, B/b1/data_reg

-filter オプシ ョ ンを使用する と、 get_* コマンドの結果を特定のプロパティに基づいてフ ィルターできます。 た

とえば次のコマンドでは、 階層名が 「B/b*」 で開始するすべてのセルのうち、 ユーザーによ り配置されていないも

の (IS_LOC_FIXED が FALSE または 0) のものが返されます。

set unLoced [ get_cells -hier -filter {NAME =~ B/b* && !IS_LOC_FIXED} ]

図 4:階層デザインの検索

Tcl スクリプ ト機能の使用 41UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 42: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

重要: NAME プロパティには、 オブジェク トの完全な階層名が含まれます。 NAME プロパティをフ ィルターする場

合、 -hierarchical も含めたコマンドのほかのオプシ ョ ンにかかわらず、 検索パターンは完全な NAME 文字列に

対して評価されます。

-filter オプシ ョ ンによ り、 結果がフ ィルターされてから返されます。 ただし、 フ ィルターを適用する前の検索結

果を変数に代入している場合は、 それがメモ リに保存されます。 filter コマンドを使用する と、 変数と して保存

されている リ ス ト も含め、 オブジェク トの任意のリ ス トの内容をフ ィルターできます。 先ほどの例の場合、

$unLoced に保存されている リ ス ト を次のよ うにフ ィルターできます。

set unLocedLeaf [filter $unLoced {IS_PRIMITIVE}]

この例では、 $unLoced に保存されている結果をフ ィルターし、 デザインのプリ ミ ティブ インスタンスのみを返して

います。

重要: filter コマンドでは元の Tcl 変数は変更されないので、 結果を別の Tcl 変数に保存する必要があ り ます。

ヒン ト : 上記の例で、 ブール型プロパティ !IS_LOC_FIXED および IS_PRIMITIVE が直接使用されているこ とに注目

してください。 ブール型 (bool) プロパティでは、 フ ィルター式が True か False かを直接評価できます。

フ ィルター パターンに使用できる演算子は等価 (==)、 不等価 (!=)、 含める (=~)、 含めない (!~) です。 数値比較演算

子 <、 >、 <=、 および >= も使用できます。 複数のフ ィルター式を AND (&&) および OR (||) で組み合わせるこ と もで

きます。

関連性を使用したオブジェク トの検索

デザインのほかのオブジェク トに関連するオブジェク ト を検索する必要がある場合があ り ます。 たとえば、 特定の

セルのピンに接続されているすべてのネッ トや、 特定のネッ トに接続されているすべてのセルを選択する場合など

です。 Vivado Design Suite では、 デザインのエレ メン ト をそれらの関連性を利用して検索できます。 これには、

get_* コマンドで -of_objects オプシ ョ ンを使用します。 図 5 に、 イン メモ リ デザインのオブジェク ト間の関連

性を示します。

Tcl スクリプ ト機能の使用 42UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 43: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

注記: これは概念的に図示したものであ り、 すべてのオブジェク ト とその関連性をすべて表すものではあ り ません。

-of_objects オプシ ョ ンをサポートする get_* コマンドのヘルプに、 関連性のあるオブジェク トが リ ス ト されま

す。

get_cells -of_objects {pins, timing paths, nets, bels or sites}get_clocks -of_objects {nets, ports, or pins}get_nets -of_objects {pins, ports, cells, timing paths or clocks}get_pins -of_objects {cells, nets, bel pins, timing paths or clocks}get_ports -of_objects {nets, instances, sites, clocks, timing paths, io standards, io banks, package pins}

-of_objects オプシ ョ ンを使用する と、 ネッ ト オブジェク トの リ ス トに接続されているピン オブジェク トの リ ス

ト を簡単に取得できます。

get_pins -of_objects [get_nets -hier]

これらのネッ トのド ライバーのリ ス トのみを取得する場合は、 -filter オプシ ョ ンを使用します。

get_pins -of [get_nets -hier] -filter {DIRECTION == OUT}

注記: -of_objects で渡されるオブジェク トの リ ス トが空の場合、 get_* コマンドで空の Tcl リ ス トが返されます。

また、 セルのリ ス トからピンのリ ス ト を取得したり、 ネッ トの リ ス トからセルのリ ス ト を取得したりできます。

X-Ref Target - Figure 5

図 5: Vivado Design Suite でのオブジェク ト間の関連性

Tcl スクリプ ト機能の使用 43UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 44: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次の例では、 図 6 に示すよ うに、 インスタンス a1 から クロ ッ ク ピンを取得し、 そのクロ ッ ク ピンに接続されている

ネッ ト を取得して、 そのネッ トに接続されているピンを取得して、 さ らにそのピンに接続されているネッ ト を取得

して、 後にそれらのネッ トに接続されているピンを取得しています。

get_pins -of [get_nets -of [get_pins -of [get_nets -of [get_pins A/a1/clk]]]]A/a2/clk A/clk A/a1/clk B/clk

後の get_pins コマンドによ り、 それまでに返されたピンに加え、 階層モジュール B のクロ ッ ク ピン B/clk が

返されます。 階層をまたいでクロ ッ ク ネッ ト オブジェク トのプ リ ミ ティブ ピンを取得するには、 get_pins コマン

ドの -leaf オプシ ョ ンを使用できます。 次の例では、 -leaf を使用した場合の結果を示します。

get_pins -leaf -of [get_nets -of [get_pins -of [get_nets -of [get_pins A/a1/clk]]]]B/b1/data_reg/C A/a2/data_reg/C A/a1/data_reg/C B/b2/data_reg/C

get_nets コマンド

get_nets コマンドを使用する と、 ネッ トがデザイン階層を通過するため、 同じネッ トが異なる表現で返されるこ

とがあ り ます。 次に、 get_nets コマンドのオプシ ョ ンを使用して、 ネッ トの適切な表現が選択されるよ うにする

例をいくつか示します。

次の例では、 次のよ うに定義された LUT2 の 下位ピンを使用して、 下位ピンに接続されているネッ トの異なる

セグメン ト をクエ リ します。

set mypin [get_pins{egressLoop[7].egressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_i_1__6/I0}]

X-Ref Target - Figure 6

図 6:関連性を使用したオブジェク トの検索

Tcl スクリプ ト機能の使用 44UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 45: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

mark_objects -color green $mypin

単純に 下位ピン mypin に接続されているネッ ト を取得する と、 階層内の 下位ピンに直接接続されているネッ ト

セグメン トが返されます。

select_objects [get_nets -of $mypin]

下位ピン mypin に接続されているネッ トのすべてのセグメン ト を選択するには、 -segments オプシ ョ ンを使用

します。

select_objects [get_nets -segments -of $mypin]

X-Ref Target - Figure 7

図 7: mypin 例の設定

X-Ref Target - Figure 8

図 8: get_nets ‐segments の例

Tcl スクリプ ト機能の使用 45UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 46: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

下位ピン mypin に接続されているネッ ト セグメン トで 上位階層のもののみを選択するには、 -segments オプ

シ ョ ンと共に -top_net_of_hierarchical_group を使用します。 これは、 ネッ ト名を 小文字数で表示するの

で、 デバッグ文を表示する際に有益です。

select_objects [get_nets -top_net_of_hierarchical_group -segments -of $mypin]

 

X-Ref Target - Figure 9

図 9: get_nets ‐top_net_of_hierarchical_group の例

X-Ref Target - Figure 10

図 10: get_nets ‐of ピンの例 

Tcl スクリプ ト機能の使用 46UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 47: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

タイ ミング パス オブジェク ト

get_timing_path コマンドは、 タイ ミ ング パス オブジェク ト を表示するために使用できます。

get_timing_path コマンドは report_timing コマンド と同じエンジンを使用するので、 ほぼ同じコマンド ラ イ

ン オプシ ョ ンを使用できます。

タイ ミ ング パス オブジェク トは、 スタティ ッ ク タイ ミ ング解析に関連するアドバンス スク リプ ト を実行するのに

便利なこ とがあ り ます。 タイ ミ ング パス オブジェク トは、 report_timing -of <timingPathObject> のよ う

に使用する と、 パスのフル テキス ト レポート を生成するためにも使用できます。

get_nets、 get_cells、 または get_pins コマンドにタイ ミ ング パス オブジェク ト を使用する と、 そのパスの

データパス セクシ ョ ンにネッ ト /セル/ピンがリ ス トできます。 ソースおよびデスティネーシ ョ ン ク ロ ッ ク ネッ ト

ワーク内のデザイン エレ メン トは、 リ ス トできません。

get_nets、 get_cells、 または get_pins でタイ ミ ング パス オブジェク トから返されたオブジェク ト リ ス トは、

データパス内のデザイン エレ メン トに基づいて分類されます。

オブジェク トの持続性

Vivado オブジェク トは、 それがポイン トするエレ メン トがメモ リ内に存在する限り、 持続されます。 たとえば、 Tcl

変数がセル オブジェク ト をポイン ト していて、そのセルが後で (手動または何らかの 適化段階で) 削除された場合、

そのセル オブジェク トは無効になり ます。 この結果、 それに依存するコマンドをユーザーが実行した場合に、 予期

しない結果になったり ク ラ ッシュする可能性があ り ます。

同様に、 デザインまたはプロジェク ト を閉じる と、 すべてのデザイン オブジェク トが無効になるほか、 その他すべ

ての Vivado オブジェク ト も無効になる可能性があ り、存在しない Vivado オブジェク ト をポイン ト しているすべての

Tcl 変数が停止します。

注意: メモ リに存在しないオブジェク トに依存するコマンドを実行する と、 予期しない結果になったりシステムがク

ラ ッシュする可能性があ り ます。

たとえば、 次のコードは無効になり ます。

foreach port [get_ports] { # The 'port' object is used as key set dir($port) [get_property DIRECTION $port] }

foreach key [array name dir] { puts "$key -> $dir($key)" }

close_project

# All the objects have been nullified foreach key [array name dir] { # null puts "$key -> $dir($key)" }

プロジェク ト を閉じる と、 すべてのオブジェク ト (この場合はポート オブジェク ト ) が無効になるので、 ポートのリ

ス ト を表示できなくな り ます。

Tcl スクリプ ト機能の使用 47UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 48: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

デザインを閉じてからポートの リ ス ト を表示できるよ うにするには、 port オブジェク トの NAME プロパティを使

用して関連する dir アレイを構築しておく必要があ り ます。

foreach port [get_ports] { set dir([get_property NAME $port]) [get_property DIRECTION $port]}

オブジェク トのリス トの処理

get_* コマンドを使用する と、 返されたオブジェク トは標準の Tcl リ ス ト と同様で、 同じよ うに機能しますが、

Vivado Design Suite ではオブジェク トの 1 つのクラスのコンテナー (セル、 ネッ ト、 ピン、 ポート など) が返され、 標

準の Tcl リ ス ト とは異なり ます。 ただし、 このコンテナーは通常、 標準の Tcl リ ス ト と同様で、 同じよ う機能しま

す。 オブジェク トのコンテナーは Vivado Design Suite で自動的に処理されるので、 ユーザーが意識する必要はあ り ま

せん。 たとえば、 標準 Tcl コマンド llength をオブジェク トのコンテナーに対して使用し (get_cells の結果など

)、 通常の Tcl リ ス トでの場合と同様に、 コンテナーに含まれるエレ メン トの数を取得できます。

Vivado Design Suite のリ ス ト を処理するビルト インの Tcl コマンドは、 オブジェク トおよびオブジェク トのコンテ

ナーを完全にサポートするため拡張されています。 たとえば、 lsort、 lappend、 lindex、 および llength は、

オブジェク トの NAME プロパティに基づいてコンテナーを制御するよ う拡張されています。 これらのコマンドは、

オブジェク トのコンテナーが渡された場合、 オブジェク トのコンテナーを返します。 たとえば、 lsort は、

get_cells で取得したセルのコンテナーを、 オブジェク トの階層名に基づいて並べ替えます。

lappend を使用するなどしてコンテナーにオブジェク ト を追加できますが、 現在コンテナーに含まれるオブジェク

ト と同じタイプのオブジェク ト しか追加できません。 リ ス トに異なるタイプのオブジェク トや文字列を追加しよ う

とする と、 Tcl エラーが返されます。

次の例では、 Vivado のコンテナーを降順に並べ替え、 puts コマンド と foreach ループを使用して、 オブジェク ト

を 1 行に 1 つずつ表示しています。

foreach X [lsort -decreasing [get_cells]] {puts $X}wbArbEngineusb_vbus_pad_1_i_IBUF_instusb_vbus_pad_0_i_IBUF_instusbEngine1usbEngine0...

注記: lappend コマンドは Tcl コンソールでサポート されますが、 read_xdc コマンドで読み込む XDC 制約ファイ

ルではサポート されません。 ただし、 lappend コマンドで取得した リ ス ト を read_xdc コマンド と互換性を持たせ

るよ うに変換できます。 次のよ うなコードがある と します。

set myClocks {}lappend myClocks [get_clocks CLK1]lappend myClocks [get_clocks CLK2]lappend myClocks [get_clocks CLK3]

Tcl 変数 myClocks を、 read_xdc コマンド と互換性を持たせるよ うにするには、 次のよ うにします。

set myClocks [list [get_clocks CLK1] \[get_clocks CLK2] \[get_clocks CLK3] \

]

Tcl スクリプ ト機能の使用 48UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 49: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

コレクシ ョ ンと文字列表現

get_* コマンドでは、 通常のエレ メン トの Tcl リ ス トが作成されるのではなく、 オブジェク トの Vivado コレクシ ョ

ンが作成されます。 Vivado コレクシ ョ ンは、 通常の Tcl リ ス ト と同じよ うに動作するよ う構成されています。 このプ

ロセスは、 ユーザーにも Tcl にも ト ランスペアレン トです。 Vivado コレクシ ョ ンは Tcl リ ス ト と同様に動作し、 同じ

コマンドで同じよ うに処理されます。

Vivado コレクシ ョ ンは、 Vivado オブジェク ト を処理する際のランタイムを短縮し、 メモ リ使用量を削減するために

導入されました。

Vivado コレクシ ョ ンを文字列に変換する と、 変換されるオブジェク トの数が制限される場合があ り ます。 たとえば、

Tcl コンソールにインスタンスのリ ス ト を表示する際に、 リ ス ト (実際には Vivado コレクシ ョ ン) に 100,000 個のイン

スタンスが含まれる場合、 初の 500 個 (デフォルトの制限) のみが表示されます。 これによ り、 Tcl コンソールに極

端に長い文字列が表示されるのを防ぐこ とができます。

オブジェク トの Vivado コレクシ ョ ンの文字列表現について、 理解しておく こ とが重要です。 コレクシ ョ ンの文字列

表現に含まれるオブジェク トの 大数は、 tcl.collectionResultDisplayLimit パラ メーターで指定します。

tcl.collectionResultDisplayLimit 500 integer true

このパラ メーターでは、 コレクシ ョ ンを表示するコマンドで表示可能なエレ メン トの 大数を指定します。 0 に設定

する と、 制限なしになり ます。 デフォルトは 500 です。 次に例を示します。

set_param tcl.collectionResultDisplayLimit 0set_param tcl.collectionResultDisplayLimit 1000

Vivado コレクシ ョ ンに tcl.collectionResultDisplayLimit パラ メーターで指定されている制限を超える数の

エレ メン トが含まれる場合、 その制限数のエレ メン トが文字列に変換され、 文字列の 後に 「...」 が追加されて、 元

のコレクシ ョ ンにさ らにエレ メン トが含まれているこ とが示されます。

注記: この文字列表現によ り元のコレクシ ョ ンが変更されるこ とはなく、 エレ メン トが失われるこ とはあ り ません。

注記: tcl.collectionResultDisplayLimit パラ メーターは、 Vivado コレクシ ョ ンの文字列表現にのみ適用さ

れ、 通常の Tcl リ ス トの文字列表現には適用されません。

たとえば、 デザインに 20000 個のインスタンスが含まれている と します。

vivado% set cells [get_cells -hier]vivado% llength $cells20000vivado% set var [join $cells "\n"]vivado% llength $var501vivado% lindex $var end...

Tcl スクリプ ト機能の使用 49UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 50: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

出力先の指定

Vivado Design Suite の多くの Tcl コマンドでは、 コマンドから返される情報を、 -file オプシ ョ ンを使用して印刷や

ツール外での処理用にファイルに保存したり、 -return_string オプシ ョ ンを使用して Vivado ツールでの処理用

に文字列と して変数に保存できます。

すべてのレポート コマンドで、 -file オプシ ョ ンがサポート されています。 大量の情報を出力するレポート コマン

ドでは、 その後の解析、 デザイン プロジェク トの文書サポート、 またはほかの部署にダウンス ト リーム処理用に渡

す場合などに、 ファ イルに出力する と有益です。 次に、 ファ イル出力をサポートするコマンドの一部を示します。

report_datasheetreport_drcreport_powerreport_timingreport_timing_summaryreport_utilization

たとえば、 report_timing コマンドの結果をファイルに記述するには、 次のコマンドを使用します。

report_timing -delay_type max -file setup_violations.rptreport_timing -delay_type min -file hold_violations.rpt

ファ イル名の一部と して、 相対パスまたは絶対パスを指定できます。 相対パスは、 Vivado ツールを起動したディ レ

ク ト リ または pwd コマンドで返される現在の作業ディ レク ト リ を基準と して指定します。

ヒン ト : パスをファイル名の一部と して指定しない場合は、現在の作業ディ レク ト リ または Vivado ツールを起動した

ディ レク ト リにファ イルが作成されます。

既存のファイルにコマンドの結果を追加するには、 -file オプシ ョ ンと共に -append オプシ ョ ンを使用します。

次の例では、 1 つのファイル all_violations.rpt を作成し、 2 つのコマンドの結果を保存しています。

report_timing -delay_type max -file all_violations.rptreport_timing -delay_type min -file -append all_violations.rpt

ファ イルが作成されたら、 ファ イル システムからファ イルを開いて確認したり書き込んだりできます。 Vivado

Design Suite Tcl コンソールには、 ファ イルにアクセスするさまざまなコマンドがあ り ます。 詳細は、 「ファ イルへの

アクセス」 を参照してください。

すべての report_* コマンドでは、 -return_string オプシ ョ ンもサポート されています。 このオプシ ョ ンを使

用する と、 コマンドの出力が Tcl 変数に代入可能な文字列と して返されます。 コマンド出力を変数に代入する と、

Tcl スク リプ トでのその後の処理に有益で、 主要な情報を抽出してフロー制御や分岐を可能にしたり、 スク リプ トで

使用するほかの変数を設定したりできます。

次に、 -return_string オプシ ョ ンをサポートするコマンドの一部を示します。

report_clocksreport_clock_interactionreport_disable_timingreport_environmentreport_high_fanout_netsreport_operating_conditionsreport_powerreport_property

Tcl スクリプ ト機能の使用 50UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 51: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

report_pulse_widthreport_route_statusreport_utilization

レポート コマンドから返された文字列を改行文字 \n で分離して、 文字列を リ ス ト と して行ごとに処理できます。

set timeLines [split [report_timing -return_string -max_paths 10] \n ]

Vivado Design Suite Tcl コンソールには、 文字列を操作するさまざまなコマンドがあ り ます。 詳細は、 「文字列の操

作」 を参照してください。

ファイルへのアクセス

ファ イル システムにファイルを記述する と、 ファ イルを処理するさまざまな Tcl コマンドを使用できます。 ファ イ

ル パス、 ファ イル名、 ファ イル拡張子など、 ファ イルの要素を抽出できます。 ファ イルに関する情報を調べる次の

よ うなコマンド もあ り ます。

• file exists filename: filename が存在し、 その場所の読み取り権限がある場合は 1、 それ以外の場合は

0 を返します。 ファ イルが既に存在しているかど うかを調べるのに使用します。

• file type filename: ファ イルのタイプを示す文字列を返します。 可能な値は file、 directory、

characterSpecial、 blockSpecial、 fifo、 link、 socket です。

• file dirname filename: filename の 後のスラ ッシュまでのディ レク ト リ構造を 後のスラ ッシュを含

めずに返します。

• file rootname filename: filename の 後のピ リオドまでの文字を 後のピ リオドを含めずに返します。

• file tail filename: filename の 後のスラ ッシュよ り後の文字すべてを返します。

• file extension filename: filename の 後のピ リオド以降の文字を 後のピ リオドを含めて返します。

次に、 Tcl コマンドのいくつかの例を示します。

set filePath {C:/Data/carry_chain.txt}file dirname $filePath ; # Returns C:/Datafile tail $filePath ; # Returns carry_chain.txtfile extension $filePath ; # Returns .txt

report_* コマンドまたは write_* コマンドでファイルを作成したら、 Tcl スク リプ トでファ イルを開いて、 その

内容を読み出したり、 追加の内容を記述したりできます。 ファ イルを開いたり閉じたり、 ファ イルの読み出しまた

は書き込みを実行するには、 次の Tcl コマンドを使用できます。

• open <filename> [access] [perms]: filename を開き、ファ イルにアクセスするのに使用したファイル

ハンドル (fileID) を返します。 必要に応じてファイル ハンドルを参照できるよ うにするため、 fileID を Tcl 変数

に代入するのが一般的です。 新しいファイルの権限は、 perms とプロセス umask の組み合わせで設定します。

access モードは、 開いたファイルの読み取り権および書き込み権を指定します。 一般的なアクセス モードは

次のとおりです。

° r: 読み出しモード。 ファ イルが存在している必要があ り、 作成されません。 アクセス モードを指定しない

場合、 これがデフォルトです。

° w: 書き込みモード。 ファ イルが存在しない場合は、 作成されます。 データはファイルの冒頭から記述され、

既存のファイルの内容は切り捨てられるか、 上書きされます。

° a: 追加モード。 ファ イルが存在しない場合は、 作成されます。 データはファイルの末尾に記述され、 既存

のファイルの内容に追加されます。

Tcl スクリプ ト機能の使用 51UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 52: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

• read [-nonewline] fileId: fileId から残りすべてのバイ ト を読み出し、オプシ ョ ンで 後の文字が改行

\n の場合はその 後の文字を破棄します。 ファ イルを開いた直後にこの形式を使用する と、 read コマンドで

ファイル全体が一度に読み出されます。

• read fileId numBytes: fileId から指定したバイ ト数 numBytes を読み出します。 この形式は、 ファ イル

のブロ ッ クをファ イルの 後まで読み出す場合に使用します。

• eof fileId: fileId で EOF (End Of File) が発生した場合は 1、 それ以外の場合は 0 を返します。

• gets fileId [varName]: fileId から次の行を読み出します。 改行文字は破棄されます。 $varName を指

定した場合は行の文字列をその変数に代入し、 それ以外の場合は文字列をコマンド シェルに返します。 次に、

gets コマンドの異なる形式を示します。

gets $fileHandleAppend line 4 of file.gets $fileHandle line28puts $lineAppend line 5 of file.set line [gets $fileHandle]Append line 6 of file.puts $lineAppend line 6 of file.

上記の例では、 $fileHandle がファイルを開いたと きに返されるファ イル ハンドルです。 初の例は gets

の単純な形式で、 出力を代入する Tcl 変数は指定していません。 この場合、 出力は stdout に返されます。 2 番

目の例では出力を $line という変数に代入しており、 gets コマンドで読み出された文字数 28 が返されます。

注記: gets コマンドの戻り値を Tcl 変数に代入できますが、 コマンドの形式によって、 ファ イルの内容または

gets コマンドで読み出された文字数が代入されます。

• puts [-nonewline] [fileId] string: 指定した fileId に文字列を書き込みます。 オプシ ョ ンで、 改行

文字 \n を省く こ と もできます。 puts コマンドのデフォルトの fileId は stdout です。

• close fileId: 開いているファイル チャネル fileId を閉じます。 Tcl スク リプ トで開いたファイルは必ず閉

じてください。 そ う しないと、 Vivado アプリ ケーシ ョ ンでメモ リ リークやその他の問題が発生する可能性があ

り ます。

次の例では、 ファ イルを読み出しアクセス モードで開き、 ファ イル ハンドルを $FH に代入して、 1 つの操作でファ

イルの内容を読み出して $content に代入し、 その内容を Tcl リ ス トに分割しています。 完了したら、 ファ イルを

閉じます。

set FH [open C:/Data/carry_chains.txt r]set content [read $FH]; # The entire file content is saved to $contentforeach line [split $content \n] {# The current line is saved inside $line variableputs $line

}close $FH

注記:パフォーマンスおよびメモ リの面から、 サイズの大きいファイルを 1 回の操作で読み出すこ とはお勧めしませ

ん。

次の例では、 ファ イル全体を一度に読み出してから結果を解析するのではなく、 ファ イルを 1 行ずつ 後まで読み

出し、 stdout に行数と行の内容を出力しています。 完了したら、 ファ イルを閉じます。

set FH [open C:/Data/carry_chains.txt r]set i 1while {![eof $FH]} {

Tcl スクリプ ト機能の使用 52UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 53: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# Read a line from the file, and assign it to the $line variableset line [gets $FH]puts "Line $i: $line"incr i

}close $FH

次の例では、 デザインのすべての I/O ポート をその方向と共に名前順に並べ替えて、 ファ イル ports.rpt に書き込

んでいます。

set FH [open C:/Data/ports.rpt w]foreach port [lsort [get_ports *]] {puts $FH [format "%-18s %-4s" $port [get_property DIRECTION $port]]

}close $FH

上記の例では、 ファ イルを書き込みモードで開いています。 読み出しモード とは異なり、 書き込みモードではファ

イルが存在していない場合は作成され、 ファ イルが存在している場合は上書きされます。 既存のファイルの 後に

新しい内容を追加するには、 ファ イルを追加モードで開く必要があ り ます。

文字列の操作

-return_string オプシ ョ ンを使用する と、 report_* コマンドの出力を stdout ではなく Tcl 文字列と して返す

こ とができます。 文字列は Tcl 変数に代入したり、 解析または処理できます。

set rpt [report_timing -return_string]

文字列を変数に代入する と、 文字列を処理するさまざまな Tcl コマンドを使用できます。

• append string [arg1 arg2 ... argN]: 指定した args を string の 後に追加します。

• format formatString [arg1 arg2 ... argN]: 文字列を formatString テンプレートで指定したフォーマッ トの形

式にします。 テンプレートは、 sprintf で使用されるよ うに % 変換指示子を使用して指定する必要があ り ま

す。 追加の引数 arg は、 フォーマッ ト された文字列内で置換する値を指定します。

• regexp [switches] exp string: 正規表現 exp が string に一致する場合は 1、 それ以外の場合は 0 を返

します。 -nocase オプシ ョ ンを指定する と、 大文字/小文字は区別されません。

• string match pattern string: glob pattern が string に一致する場合は 1、 それ以外の場合は 0 を返し

ます。

• scan string formatString [varName1 varName2 ...]: 指定の string から値を抽出して変数

varName に代入し、 sscanf と同じよ うに % 変換指示子を使用して formatString を適用します。 varName

を指定しない場合は、 値のリ ス トが stdout に出力されます。

• string range string first last: string から、 文字インデッ クス first から last までを、 それらを

含めて返します。

• string compare string1 string2: 2 つの文字列に対して辞書式比較を実行し、 string1 が string2 よ

り前の場合は -1、 2 つが同じ場合は 0、 string1 が string2 よ り後の場合は 1 を返します。

• string last string1 string2: string2 で string1 が 初に現れた文字インデッ クスを返します。

string2 で string1 が見つからなかった場合は -1 を返します。

• string length string: string の文字数を返します。

Tcl スクリプ ト機能の使用 53UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 54: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次の例では、 -return_string を使用して report_timing コマンドの結果を $report Tcl 変数に代入し、 各パ

スの始点、 終点、 パス グループ、 およびパス タイプを抽出して、 後にそのパスのサマリ を Tcl コンソールに出力

しています。

# Capture return string of timing report, and assign variablesset report [report_timing -return_string -max_paths 10] set startPoint {}set endPoint {}set pathGroup {}set pathType {}

# Write the header for string outputputs [format " %-12s %-12s %-20s -> %-20s" "Path Type" "Path Group" "Start Point" "End Point"]puts [format " %-12s %-12s %-20s -> %-20s" "---------" "----------" "-----------" "---------"]

# Split the return string into multiple lines to allow line by line processingforeach line [split $report \n] {if {[regexp -nocase -- {^\s*Source:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - startPoint]} {} elseif {[regexp -nocase -- {^\s*Destination:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - endPoint]} {} elseif {[regexp -nocase -- {^\s*Path Group:\s*([^[:blank:]]+)\s*$} $line - pathGroup]} {} elseif {[regexp -nocase -- {^\s*Path Type:\s*([^[:blank:]]+)((\s+\(?)|$)} $line - pathType]} {puts [format " %-12s %-12s %-20s -> %-20s" $pathType $pathGroup $startPoint $endPoint]}}

次は、 このコードの出力例です。

Path Type Path Group Start Point -> End Point --------- ---------- ----------- -> --------- Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[0]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[10]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[11]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[12]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[13]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[14]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[15]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[16]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[17]Setup bftClk ingressLoop[0]/ram/CLKBWRCLK -> transformLoop[0].ct/xOutReg_reg/A[18]

Tcl スクリプ ト機能の使用 54UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 55: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

ループの制御

Tcl には、 for、 foreach、 while など、 コードのセクシ ョ ンを繰り返すビルト イン コマンドがあ り ます。

これらのコマンドの構文は、 次のとおりです。

for start testCondition next bodyforeach varname list bodywhile testCondition body

上記のコマンドでは、 各反復で Tcl スク リプ トの body 全体が実行されますが、 Tcl にはループの制御フローを変更す

る break および continue の 2 つのコマンドがあ り ます。

break 文はループ コマンドを中止するために使用し、 continue 文はループの次の反復にジャンプするために使用

します。

注記: プロシージャ内で実行する場合、 ループは return コマンドを使用して中止できます。 この場合、 ループが中

止されるだけでなく、 制御もループを呼び出したプロシージャに戻されます。

たとえば、 1 行に 1 つのインスタンス名を含む、 セル名がリ ス ト されたファイルがある と します。 次のサンプル

コードは、 このファ イルを読み込み、 現在デザインに存在するセル名のみを含む Tcl リ ス ト を作成します。 先ほど示

した get_file_content プロシージャを再利用しています。 現在のデザインで見つからないセル名が指定の数を

超えた場合、 ファ イルの処理を停止します。

set valid_cell_names [list]set error 0set max_errors 1000foreach line [split [get_file_content ./all_cell_names.lst] \n] { if {[get_cells $line] == {}} { # cell name not found puts " Error - cell $line not found " incr error if {$error > $max_errors} { puts " Too many errors occured. Cannot continue " break } else { # Go to next cell name continue } } lappend valid_cell_names $line}

puts " [llength $valid_cell_names] valid cells have been found "

Tcl スクリプ ト機能の使用 55UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 56: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

エラー処理

変数の有効性チェ ック

Tcl スク リプ ト を記述する際は、 コーナー ケース (まれにしか発生しないケース) およびコードでエラーが発生する可

能性のある条件を必ずチェッ クするこ とをお勧めします。 適切なチェッ クを実行するこ とによ り、 スク リプ トの問

題やスク リプ トが正し く使用されていないと きにユーザーにメ ッセージを表示できます。 チェッ クを正し く実行し

ない場合、 何が問題なのか、 何を直したらよいかなどの情報なしで、 スク リプ トが停止してしまいます。

例 1: ファ イルを読み出し /書き込みで開いたと きのチェッ ク (スク リプ トに問題がある例)。

if {[file exists $filename]} { set FH [open $filename r] if {$FH != {}} { # The file is opened, do something # … close $FH } else { puts " File $filename could not be opened" }} else { puts " File $filename does not exist"}

上記のスク リプ トのアルゴ リズムは正しいよ うに見えますが、 open コマンドで下位レベルの Tcl エラー

(TCL_ERROR) が生成され、 ファ イルを開けなかった場合にスク リプ トが停止します。 例 3 では、 このスク リプ ト を

改善した例を示します。

例 2: get_* コマンドを使用した後に Vivado オブジェク トが有効であるかをチェッ ク。

proc get_pin_dir { pinName } { if {$pinName == {}} { puts " Error - no pin name provided" return {} } set pin [get_pins $pinName] if {$pin == {}} { puts " Error - pin $pinName does not exist" return {} } set direction [get_property DIRECTION $pin] return $direction}

get_* コマンドを使用した後に Vivado オブジェク トが存在するかど うかを調べるこ とは、 これらのオブジェク ト を

ほかのコマンド (filter、 get_* など) で使用する場合に特に重要です。

Tcl エラーの処理

一部のビルト イン Tcl コマンド (およびユーザー プロシージャ ) は、 エラーがプログラムによ り検出されない場合、

Tcl エラー (TCL_ERROR) を生成してスク リプ ト を停止するこ とがあ り ます。 たとえば file コマンドは、 ファ イル

を開く こ とができないと、 TCL_ERROR を生成します。

Tcl スクリプ ト機能の使用 56UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 57: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Tcl には、 プログラムを正し く実行し TCL_ERROR 状態を検出できるよ うにビルト インの catch コマンドがあ り ま

す。 このコマンドは、 エラーが検出された場合は 1 を返し、 検出されなかった場合は 0 を返します。 catch コマン

ドは、 1 つのコマンドまたはコマンドのグループに対して使用できます。

catch コマンドの基本的な構文は、 次のとおりです。

catch script [varname]

こ こで、 script は 1 つの Tcl コマンドまたは Tcl コマンドのグループ、 varname は TCL_ERROR を説明する メ ッ

セージを保存する変数の名前です。

注記:引数 varname は省略できます。

通常、 catch コマンドは次のよ うに使用されます。

If {[catch script errorstring]} { # A low-level TCL_ERROR happened puts " Error - $errorstring "} else { # No TCL_ERROR was generated puts " The code completed successfully "}

例 1 は、 catch コマンドを使用してファイルを開く こ とができない場合を考慮するこ とによ り、 よ り適切なスク リ

プ ト とな り ます。

例 3: ファ イルを読み出し /書き込みで開いたと きのチェッ ク (正しいスク リプ ト例)。

if {[file exists $filename]} { if {[catch { set FH [open $filename r] } errorstring]} { puts " File $filename could not be opened : $errorstring" } else { # The file is opened, do something # … close $FH }} else { puts " File $filename does not exist"}

Tcl エラーは、 error コマンドを使用しても生成できます。 たとえば、 catch コマンドで検出した TCL_ERROR を

上位に伝搬する場合に使用できます。 error コマンドは、 スク リプ トでコーナー ケースがサポート されていない場

合や、 コードで予期されない状況が発生した場合に、 TCL_ERROR を生成するために使用できます。

たとえば次のプロシージャは、 ファ イルの内容を返すか、 ファ イルを開く こ とができない場合は TCL_ERROR を生

成します。

proc get_file_content { filename } { if {[catch { set FH [open $filename r] set content [read $FH] close $FH } errorstring]} { error " File $filename could not be opened : $errorstring " } return $content}

Tcl スクリプ ト機能の使用 57UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 58: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

プロシージャ get_file_content を catch コマンドで呼び出すと、 発生する可能性のあるエラーを検出できま

す。

if {[catch { set content [get_file_content ./myreport.rpt] } errorstring]} { puts " The following error was generated: $errorstring "} else { puts " The content of the file is: $content "}

例 2 も、 例 4 に示すよ うに、 間違った条件が発生した場合に TCL_ERROR を生成するよ う改善できます。

例 4: Vivado オブジェク トが有効であるかをチェッ ク し、 有効でない場合は TCL_ERROR を生成 (改善後)。

proc get_pin_dir { pinName } { if {$pinName == {}} { error " Error - no pin name provided" } set pin [get_pins $pinName] if {$pin == {}} { error " Error - pin $pinName does not exist" } set direction [get_property DIRECTION $pin] return $direction}

環境変数へのアクセス

Tcl グローバル変数 env を使用する と、 環境変数に読み出し専用モードでアクセスできます。 env 変数は、 Tcl イン

タープリ ター内でスタート アップ時に自動的に作成および初期化される Tcl 配列です。

注記:初期化後は、 env 変数への変更は Tcl インタープリ ター外の環境には適用されません。 同様に、 Tcl インタープ

リ ターの開始後に環境変数に加えられた変更は、 env 変数には反映されません。

env 配列のキーは、 Vivado Design Suite の開始時点の環境変数です。 キーでは大文字/小文字が区別されます。

次に例を示します。

Vivado% puts "The PATH variable is $env(PATH) "

すべての Unix 環境変数のリ ス ト を取得するには、 次の構文を使用します。

Vivado%: set all_env_var [array names env]

環境変数 (env 配列へのキー ) が存在するかは、 info コマンドを使用して確認できます。 たとえば MYVARNAME を確

認するには、 次の構文を使用します。

Vivado% if {[info exists env(MYVARNAME)]} { … }

env 配列はグローバル変数なので、 グローバルと して宣言する と、 プロシージャ内で参照できます。

Tcl スクリプ ト機能の使用 58UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 59: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次に例を示します。

proc print_env {} { global env puts " UNIX Environment:" foreach var [lsort [array names env]] { puts " $var : $env($var)" }}

外部プログラムの呼び出し

外部プログラムを Tcl 内から呼び出して、 戻された結果を取り込むこ とができます。 外部プログラムまたはコマンド

を呼び出す場合、 未知の Tcl コマンドを OS (Windows/Linux) に送信して実行する自動メカニズムもあ り ますが、 常に

手動で指定するこ とをお勧めします。 これには、 exec コマンドを使用します。

スク リプ トがすべてのホス ト OS (Windows または Linux) および Vivado モード (Tcl モード、 GUI、 またはバッチ モー

ド ) で動作するよ うにするためには、 exec コマンドを使用して結果が同じになるよ うにしておく こ とが重要です。

次の例 (Linux) では、 ls コマンドを呼び出して、 run ディ レク ト リの下のすべてのファイルとディ レク ト リの リ ス

ト を取得しています。

vivado% set result [exec ls]vivado% foreach element [split $result \n] { ... }

Windows での同等の例は次のとおりです。

vivado% set result [exec cmd /c dir /B]vivado% foreach element [split $result \n] { ... }

exec を付けずに ls コマンドを呼び出すと、 一部の Vivado モードでスク リプ トがエラーになる可能性があるので、

注意してください ( 「Vivado IDE (統合設計環境)/Tcl モード vs バッチ モード」 を参照)。

次の例では、 Perl スク リプ ト を実行して、 その結果を Tcl 環境に送信しています。 exec コマンドで /bin/perl (

ユーザー環境と一致する と想定) を呼び出すこ とで、 Perl スク リプ ト自体が呼び出されます。

vivado% set result [exec /bin/perl <path_to>/my_perl_script.pl]

Vivado IDE (統合設計環境)/Tcl モード  vs バッチ モード

Vivado IDE (統合設計環境) または Tcl モードで実行される Tcl コンソール (vivado -mode tcl または vivado

-mode gui) は、 バッチ モードで実行されるもの (vivado -mode batch) とは少し異なり ます。

このビヘイビアーは Tcl 固有のもので、 Vivado ツールとは関係あ り ません。 根本的な原因については、 ウェブを参照

してください。

インタラ クティブなセッシ ョ ン (Tcl または GUI モード ) では、 Vivado は tclsh モードで実行されますが、 バッチ

モードでは Tcl スク リプ ト モードで実行されます。

Tcl スクリプ ト機能の使用 59UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 60: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Tcl コンソールは 3 つすべてのモードでほぼ同じよ うに動作しますが、 Tcl 環境では少しだけ異なり ます。 まず、

バッチ モードでは、 未知のコマンドが OS に送信されて実行されるこ とはあ り ません。 スク リプ トが 3 つの Vivado

モードすべてで動作するよ うにするには、 exec コマンドを指定して、 外部プログラムを実行する必要があ り ます。

カスタム デザイン  ルール チェ ック  (DRC) の作成

Vivado Design Suite では、 Tcl でカスタム デザイン ルール チェッ ク (DRC) を定義し、 使用できます。 カスタム DRC

を作成する際は、 次の点に注意してください。

• デザイン オブジェク ト またはデザイン オブジェク トの属性、 およびデザイン ルールを定義するチェッ ク関数を

取得する Tcl チェッカー プロシージャを記述します。 Tcl チェッカー プロシージャは別の Tcl スク リプ トで定義

し、 report_drc を実行する前に Vivado Design Suite に読み込む必要があ り ます。 Tcl チェッカー プロシージャ

内では、 create_drc_violation コマンドを使用してデザインでルールをチェッ ク した際に検出される違反

を指定します。 create_drc_violation コマンドは違反オブジェク ト をイン メモ リ デザインに作成するの

で、 そのプロパティをレポート して処理できます。

• create_drc_check コマンドを使用して、 Tcl チェッカー プロシージャをユーザー定義 DRC に関連付けます。

report_drc コマンドを実行する際、 このルールを名前で呼び出します。

• create_drc_ruledeck コマンドを使用して、 DRC ルール デッ クを作成します (オプシ ョ ン)。 DRC ルール

デッ クは、 複数の DRC をグループ化したものです。 作成した DRC ルール デッ クには、 add_drc_ruledeck

コマンドを使用して、 ユーザー定義 DRC およびあらかじめ定義された DRC を追加できます。

• report_drc コマンドを実行し、 デザインをデザイン ルールに対してチェッ ク します。 report_drc を実行する

際、 DRC ルール デッ ク、 ユーザー定義デザイン ルール チェッ ク、 またはあらかじめ定義された DRC を指定で

きます。

Tcl チェ ッカー プロシージャの作成

Tcl チェッカー プロシージャは、 チェッ クするデザイン オブジェク ト を選択し、 デザイン オブジェク トに対して必

要なテス ト または評価を実行して、 エラーに関連するオブジェク ト を特定する DRC 違反オブジェク ト を返します。

次の Tcl スク リプ トは、WRITE_B バスの幅をチェッ クする dataWidthCheck Tcl チェッカー プロシージャを定義し

ています。 report_drc を実行する前に、 この Tcl スク リプ ト ファ イルを Vivado Design Suite に読み込む必要があ り

ます。 Tcl チェッカー プロシージャの詳細は、 「Tcl スク リプ トの読み込みと実行」 を参照してください。

# This is a simplistic check -- report BRAM cells with WRITE_WIDTH_B wider than 36.proc dataWidthCheck {} {# list to hold violationsset vios {}# iterate through the objects to be checkedforeach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {set bwidth [get_property WRITE_WIDTH_B $bram]if { $bwidth > 36} {# define the message to report when violations are foundset msg "On cell %ELG, WRITE_WIDTH_B is $bwidth"set vio [ create_drc_violation -name {RAMW-1} -msg $msg $bram ]lappend vios $vio}; # End IF

}; # End FORif {[llength $vios] > 0} {return -code error $vios

Tcl スクリプ ト機能の使用 60UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 61: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

} else {return {}

}; # End IF} ; # End PROC

proc 定義からわかるよ うに、 dataWidthCheck プロシージャに引数はなく、 必要な情報はすべてデザインから取

得されます。 空のリ ス ト変数 $vios を作成し、 create_drc_violation コマンドで返された違反オブジェク ト を

保存します。

dataWidthCheck プロシージャは、 デザインのすべての BRAM セルに対して WRITE_WIDTH_B プロパティの評価を実

行します。 ブロ ッ ク RAM セルの WRITE_WIDTH_B が 36 を超える場合、 DRC 違反が指定のメ ッセージ ($msg) で作

成されます。 メ ッセージには、 セルのプレースホルダー値 %ELG と バス幅 $bwidth が含まれます。

dataWidthCheck プロシージャでは、 create_drc_violation コマンドで 1 つのオブジェク ト $bram のみが返

され、 メ ッセージ文字列に定義されている %ELG プレースホルダーに代入されます。 create_drc_violation コ

マンドでは、 ネッ ト リ ス ト オブジェク ト (%ELG)、 ク ロ ッ ク領域 (%CRG)、 デバイス サイ ト (%SIG)、 およびパッケー

ジ I/O バンク (%PBG) のプレースホルダーがサポート されます。

重要: create_drc_violation コマンドで渡される順序と タイプが、 create_drc_check コマンドの -msg の指

定と一致している必要があ り ます。

WRITE_WIDTH_B プロパティの幅が指定の値を超えている ブロッ ク RAM が検出されるたびに、

create_drc_violation で違反オブジェク トが作成されます。 違反オブジェク トは、 名前は関連付けられている

Vivado Design Suite の DRC ルールの名前と同じになり、 あらかじめ定義されたメ ッセージ文字列を含み、 ルールに

違反するオブジェク ト を特定します。 デザイン ルール違反で返されるオブジェク トには、 セル、 ポート、 ピン、

ネッ ト 、 ク ロ ッ ク領域、 デバイス サイ ト、 パッケージ I/O バンクなどがあ り ます。 違反からのメ ッセージ文字列に

は、 特定のプロパティ値などのほかの情報を含めるこ と もでき、 DRC レポートに必要な詳細情報を提供できます。

違反が検出された場合、 dataWidthCheck プロシージャから report_drc コマンドにチェッ クの結果を通知する

エラー コードが返されます。

return -code error $vios

エラー コードに加え、 $vios 変数によ り、 プロシージャで作成された違反オブジェク トの リ ス トが返されます。

DRC チェ ックの作成

Tcl チェッカー プロシージャを定義したら、 Vivado Design Suite 内での DRC レポート システムの一部と して DRC を

定義する必要があ り ます。

まず create_drc_check コマンドを使用して、 新しいデザイン ルールを登録します。 このコマンドでは、 ユー

ザー定義ルール チェッ クに固有の名前を指定する必要があ り ます。 この名前は、 Tcl チェッカー プロシージャで作

成した違反の名前と一致している必要があ り ます。 DRC ルール デッ クにチェッ クを追加する際や report_drc を

実行する際に、 この固有名を指定する必要があ り ます。 先ほど定義した dataWidthCheck Tcl チェッカー プロシー

ジャでは、 create_drc_violation コマンドで RAMW-1 という名前を使用しています。 また、

create_drc_check コマンドでは、 ルールをチェッ ク したと きに実行する Tcl チェッカー プロシージャの名前も指

定する必要があ り ます。 上記の例では、 -rule_body の引数と して dataWidthCheck を指定し、 report_drc を

実行する前に Vivado Design Suite に読み込む必要があ り ます。

create_drc_check -name {RAMW-1} -hiername {RAMB Checks} \-desc {Block RAM Data Width Check} -rule_body dataWidthCheck -severity Advisory

DRC をカテゴ リにグループ化し、 レポート用にルールの説明を指定するこ と もできます。

Tcl スクリプ ト機能の使用 61UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 62: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

違反が検出されたと きに DRC レポートに追加する メ ッセージを定義できます。 デフォルトでは、 Tcl チェッカー プ

ロシージャの create_drc_violation で作成されたメ ッセージが DRC オブジェク トに渡されます。 この場合、

create_drc_violation で定義されたメ ッセージが DRC レポートに記述されます。

DRC オブジェク トには is_enabled プロパティがあ り、 set_property コマンドを使用して TRUE または FALSE

に設定できます。 新しいルール チェッ クを作成する と、 is_enabled プロパティはデフォルトで TRUE に設定され

ます。 report_drc を実行したと きに DRC が使用されないよ うにするには、 is_enabled プロパティを FALSE に

設定します。

DRC ルール デックの作成

複数の関連する DRC チェッ クを一緒に実行できるよ うに、 DRC ルール デッ クにグループ化できます。 これには、

create_drc_ruledeck コマンドを使用して DRC ルール デッ クを作成し、 add_drc_ruledeck および

remove_drc_checks コマンドを使用して、 DRC を追加および削除します。 1 つの DRC ルール デッ クにユーザー

定義のチェッ ク とあらかじめ定義されたチェッ クを含めるこ とができます。 次に、 myrules という DRC ルール

デッ クを作成し、 DRC を追加および削除する例を示します。

create_drc_ruledeck myrulesadd_drc_checks -ruledeck myrules {RAMW-1 RAMW-2 RAMW-3}remove_drc_checks {RAMW-2} -ruledeck myrules

注記: DRC の is_enabled プロパティが FALSE に設定されている場合、 その DRC は report_drc を実行したと き

に DRC ルール デッ クの一部と して実行されなくな り ます。 DRC ルール デッ クから DRC を削除するよ り も、 DRC

をディ スエーブルにする方が良い場合もあ り ます。

カスタム DRC のレポート

ユーザー定義 DRC は、 report_drc コマンドを使用して、 個別に、 ほかのルールと一緒に、 または DRC ルール

デッ クの一部と して実行できます。 次に、 上記の例で定義された RAMW-1 ルールを個別に、 ほかのルールと一緒に、

または DRC ルール デッ クの一部と して実行する例を示します。

report_drc -check {RAMW-1}report_drc -check {RAMW-1 RAMW-2}report_drc -ruledecks myrules

report_drc でチェッ クが実行されるよ うにするには、 ルール チェッ クの is_enabled プロパティを TRUE に設

定しておく必要があ り ます。

Tcl スクリプ ト機能の使用 62UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 63: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

DRC 説明スクリプ ト

DRC ルール名または DRC ルールのパターンを見たと きに、 そのルールの機能の説明が必要な場合があ り ます。 これ

には、 DRC オブジェク トのプロパティをレポート します。

次のスク リプ ト例は、 入力して DRC ルールの検索パターンを指定するこ とによ り、 各ルールの説明と重要度を表示

します。 パターンに一致するルール場ない場合は、 エラー メ ッセージが表示されます。

proc explain_drc { drcs } { package require struct::matrix set loop_drcs [get_drc_checks $drcs -quiet] if {$loop_drcs == {}} { puts " Error: $drcs does not match any existing DRC rule" return }struct::matrix drcsm

drcsm add columns 3 drcsm add row {DRC_ID SEVERITY DESCRIPTION} foreach drc $loop_drcs {

set description "\{[get_property DESCRIPTION [get_drc_checks $drc]]\}"set severity "\{[get_property SEVERITY [get_drc_checks $drc]]\}"set key "\{[get_property NAME [get_drc_checks $drc]]\}"drcsm add row "$key $severity $description"

} puts "[drcsm format 2chan]"; drcsm destroy}

Vivado 内に組み込まれている Tcl パッケージも多数あ り、 このスク リプ ト例では struct::matrix パッケージを使

用してサマ リ表が見やすく表示されるよ うにしています。

次に、 explain_drc プロシージャの出力例を示します。

Vivado% explain_drc CFGBVS-1DRC_ID SEVERITY DESCRIPTION CFGBVS-1 Warning Missing CFGBVS and CONFIG_VOLTAGE Design Properties

Vivado% explain_drc CFGBVS-*DRC_ID SEVERITY DESCRIPTION CFGBVS-1 Warning Missing CFGBVS and CONFIG_VOLTAGE Design PropertiesCFGBVS-2 Critical Warning CFGBVS Design Property CFGBVS-3 Warning CONFIG_VOLTAGE Design Property CFGBVS-4 Critical Warning CFGBVS and CONFIG_VOLTAGE Design Properties CFGBVS-5 Critical Warning CONFIG_VOLTAGE Design Property CFGBVS-6 Critical Warning CONFIG_VOLTAGE with HP Config Banks CFGBVS-7 Warning CONFIG_VOLTAGE with Config Bank VCCO Vivado% explain_drc fooError: foo does not match any existing DRC rule

Tcl スクリプ ト機能の使用 63UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 64: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

DRC の操作

DRC は、 Tcl のほかのオブジェク ト と同様に、 プロパティを変更できます。 次のコマンドを使用する と、 DRC オブ

ジェク トのプロパティが リ ス ト されます。

Vivado% report_property [get_drc_checks RAMW-1]Property Type Read-only Visible ValueARCHITECTURES string* true trueCLASS string true true drc_checkDESCRIPTION string true true Block RAM Data Width CheckGROUP string true true RAMWHIERNAME string true true RAMB ChecksIS_ENABLED bool false true 1IS_USER_DEFINED bool true true 1MESSAGE string true trueMSG_ID int true true 1NAME string true true RAMW-1SEVERITY enum false true Advisory

注記: RAMW-1 DRC チェッ クの 2 つのプロパティ。 (IS_ENABLED および SEVERITY) は変更できます。 DRC チェッ

ク オブジェク トのこれらのプロパティの値を変更するには、 ほかのオブジェク ト と同様に set_property コマン

ドを使用します。

RAMW-1 DRC チェッ クをディ スエーブルにするには、 次の Tcl コマンドを実行します。

Vivado% set_property IS_ENABLED false [get_drc_checks RAMW-1]

RAMW-1 DRC チェッ クの重要度を変更するには、 次の Tcl コマンドを実行します。

Vivado% set_property SEVERITY {Critical Warning} [get_drc_checks RAMW-1]

これらのプロパティは、 ビルト イン DRC ルールでも変更できます。 ビルト イン DRC ルールをデフォルトに リセッ

トするには、 次の Tcl コマンドを使用します。

Vivado% reset_drc_check [get_drc_checks]

注意: Vivado ではビルト イン DRC オブジェク ト をディ スエーブルにしたり重要度を下げたりするこ とが可能ですが、

予期しない結果が発生したり、 デバイスを恒久的に破損する可能性があ り ます。 ビルト イン DRC オブジェク ト を

ディ スエーブルにしたり重要度を下げたり しないこ とを強くお勧めします。

DRC の実行に関する詳細は、 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイン入力』 (UG895) [参

照 7] を参照してください。

Tcl スクリプ ト機能の使用 64UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 65: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

ザイリンクス Tcl Store

Vivado Design Suite では、 ザイ リ ンクス コ ミ ュニティ内で Tcl コードを配布および共有するためのリポジ ト リである

ザイ リ ンクス Tcl Store が提供されています。 ザイ リ ンクス Tcl Store では、 アプリ (複数の Tcl スク リプ ト をグループ

化したもの) やプラグインが提供され、 これらのアプリおよびプラグインはザイ リ ンクス コ ミ ュニティによ り管理さ

れます。 ザイ リ ンクス ユーザーであれば誰でも投稿できます。 詳細は、 ザイ リ ンクス Tcl Store Wiki

(https://github.com/Xilinx/XilinxTclStore/wiki/Xilinx-Tcl-Store-Home) を参照してください。

ザイリンクス Tcl Store へのアクセス

ザイ リ ンクス Tcl Store に関する情報は、 ユーザーの $HOME/.Xilinx (Linux) または %APPDATA%/Xilinx

(Windows) エリ アに保存されます。 この保存された情報によ り、 Vivado リ リースごとにユーザーがインス トールした

アプリの リ ス トが管理されます。 これらのディ レク ト リは、 オンラインのザイ リ ンクス Tcl Store リ ポジ ト リから更

新およびアップデート されたアプリ をキャ ッシュするためにも使用されます。

[Xilinx Tcl Store] ダイアログ ボックスを開く

[Xilinx Tcl Store] ダイアログ ボッ クスを開くには、 Vivado IDE を起動したと きに表示される Getting Started ページで

[Xilinx Tcl Store] をク リ ッ クするか、 メ イン メニューから [Tools] → [Xilinx Tcl Store] をク リ ッ ク します。

注記: [Xilinx Tcl Store] ダイアログ ボッ クスを初めて開く と きには、 ザイ リ ンクス Tcl Store の使用条件を示すダイア

ログ ボッ クスが表示されます。

X-Ref Target - Figure 11

図 11: [Xilinx Tcl Store] ダイアログ ボックスを開く

Tcl スクリプ ト機能の使用 65UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 66: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

[Xilinx Tcl Store] ダイアログ ボッ クスには、 2 つのパネルがあ り ます。

左側のパネルには使用可能なアプリが リ ス ト され、 右側のパネルには左側のパネルで選択したアプリに関する情報

が表示されます。 各アプリに関して、 次の情報が示されます。

• [Name]: アプリの名前。

• [Description]: アプリの簡単な説明。

X-Ref Target - Figure 12

図 12:ザイリンクス Tcl Store の使用条件

X-Ref Target - Figure 13

図 13: [Xilinx Tcl Store] ダイアログ ボックス

Tcl スクリプ ト機能の使用 66UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 67: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

• [Revision]: アプリのリ ビジ ョ ン番号。

• [Required]: アプリ を使用するのに 低限必要な Vivado リ リース バージ ョ ン (図 13 では Vivado 2014.1)。

• [Company]: アプリ を提供および管理する企業の名前。

• [URL]: GitHub のアプリ ページへのハイパーリ ンク。 こ こから さまざまな proc のコードにアクセスできます。

• [Tcl Procs]: アプリに含まれる Tcl プロシージャ と、 各プロシージャの簡単な説明。

アプリのインストール

アプリ をインス トールするには、 アプリ名の右側にある [Install] ボタンをク リ ッ ク します。 アプリ をインス トールす

る と、 そのアプリで定義されているプロシージャが使用できるよ うになり ます。 プロシージャは、 アプリ名と企業

名から構成される特定の名前空間に取り込まれ、 Vivado のネイティブ ビルト イン コマンド と同様に使用できます。

新しい Tcl コマンドは、 自動的にヘルプ構造に登録されます。

図 14 に手順を示します。 アプリ をインス トールする前に [Refresh] ボタンをク リ ッ ク してカタログを更新し、 アプ リ

の 新バージ ョ ンがインス トールされるよ うにするこ とをお勧めします (1)。 [Install] をク リ ッ ク してアプ リ をインス

トールします。

X-Ref Target - Figure 14

図 14: [Install] ボタン

Tcl スクリプ ト機能の使用 67UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 68: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アプリ をインス トールする と、 プロシージャの名前がハイパーリ ンクになり、 [Install] ボタンが淡色表示されます。

図 15 では、 designutils アプリがインス トールされています。

インストールされたアプリに関するヘルプの表示

アプリがインス トールされる と、 各プロシージャに関するヘルプ情報を表示できるよ うになり ます。 プロシージャ

の詳細なヘルプは、 2 つの方法で表示できます。 ハイパーリ ンクの付いた proc 名をク リ ッ クする と、 詳細なヘルプ

を表示するダイアログ ボッ クスが開きます。 proc 名を右ク リ ッ ク しても、 ヘルプ メニュー項目を含むコンテキス ト

ウ ィンド ウが開きます。 [Help] をク リ ッ クする と、 選択した proc に対する埋め込み型ヘルプが開きます。 また、 Tcl

コンソールに完全名前空間を含むプロシージャ名と -help コマンド ライン オプシ ョ ンを入力しても、 詳細ヘルプ

を表示できます。

X-Ref Target - Figure 15

図 15: インストールされた DesignUtils アプリ

Tcl スクリプ ト機能の使用 68UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 69: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

図 16 は、 xilinx::designutils::write_template の詳細なヘルプを表示しています。

同じ詳細ヘルプは、 Tcl コンソールに次のよ うに入力しても表示できます。

vivado% xilinx::designutils::write_template -help

注記: この proc の完全修飾子は xilinx::designutils::write_template で、 write_template のみではあ り

ません。

インストールされたアプリに含まれる  Tcl プロシージャへのアクセス

アプリ をインス トールしたら、 そのアプリに含まれるすべてのプロシージャにコマンド ラインから次の 2 つの方法

でアクセスできます。

• ::<company>::<app> 名前空間から。 Vivado IDE を起動する と、 インス トールされた各アプリに含まれるす

べてのプロシージャに対してラ ッパーが自動的に作成されます。

• アプリの完全名前空間修飾子 ::tclapp::<company>::<app> から (プロシージャが定義されている名前空間

)。

X-Ref Target - Figure 16

図 16: write_template ヘルプ

Tcl スクリプ ト機能の使用 69UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 70: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

たとえば、 designutils アプリ をインス トールする と、 ユーザー proc の write_template には次でアクセスできま

す。

vivado% ::xilinx::designutils::write_templatevivado% ::tclapp::xilinx::designutils::write_template

::tclapp::xilinx 名前空間ではなく ::xilinx 名前空間を使用する利点は、 Vivado で作成されるラ ッパーでは、

すべてのビルト イン Vivado コマンドに共通の -help、 -verbose、 -quiet などの多数のデフォルト コマンド ラ イ

ン オプシ ョ ンがサポート される という こ とです。

次に例を示します。

Vivado% xilinx::designutils::write_template -helpxilinx::designutils::write_templateDescription: (User-written application)Generates a Verilog/VHDL stub or instantiation template for the current design in memory (current_instance)

Syntax: xilinx::designutils::write_template [-type <arg>] [-stub] [-template] [-language <arg>] [-verilog] [-vhdl] [-cell <arg>] [-file <arg>] [-append] [-return_string] [-usage] [-quiet] [-verbose]

Returns: template in the case of -return_string, otherwise 0 TCL_ERROR if error

Usage: Name Description ----------------------------- [-type] Type of template to create: stub or template Default: stub [-stub] Generate a stub (same as -type stub) [-template] Generate a template (same as -type template) [-language] Output language of the template: verilog or vhdl Default: verilog [-verilog] Verilog language (same as -language verilog) [-vhdl] VHDL language (same as -language vhdl) [-cell] Cell to generate template on. If not specified, runs on current_instance Default: current_instance [-file] Output file name Default: <module>.v or <module>.vhd [-append] Append to file [-return_string] Return template as string [-usage] Usage information [-quiet] Ignore command errors [-verbose] Suspend message limits during command execution

Categories:

Description:

Generates a Verilog/VHDL stub or instanciation template for the current design in memory (current_instance).

Tcl スクリプ ト機能の使用 70UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 71: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

This command must be run on a synthesized or implemented design.

Example:

::xilinx::designutils::write_template -verilog -return_string

ソース コードへのアクセス

アプリ または特定の proc のソース コードにアクセスするには、 次の 2 つの方法があ り ます。 [Details] ペインには、

GitHub への URL リ ンクが含まれます。 このリ ンクをク リ ッ クする と、 デフォルト ブラウザーで GitHub 内のアプリ

ページが開きます。 このページから、 個別の proc のソース コードにアクセスできます。

アプ リがインス トールされる と、 proc 名がハイパーリ ンクに変わり ます。 ソース コードを表示するには、 proc 名を

ク リ ッ ク し、 [View Source Code] をク リ ッ ク します。

注記: Tcl Store では、 proc の依存性は認識されません。 [Source] ウ ィンド ウには選択した proc の内容のみが表示され、

依存する proc は表示されません。 完全なアプリ コードは、 GitHub のアプリの URL から参照できます。

X-Ref Target - Figure 17

図 17: GitHub アプリ  ページへのハイパーリンク

Tcl スクリプ ト機能の使用 71UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 73: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Tcl Store での検索

Tcl Store 内を検索するには、 アプリのリ ス トの上の検索バーを使用します。 検索は、 proc 名および proc サマリで実

行されます。 アプ リの リ ス トには、 検索結果に該当するものだけが表示されます。 アプリ を選択する と、 検索に一

致する部分が白でハイライ ト され、 一致しない部分はグレーになり ます。

X-Ref Target - Figure 19

図 19:検索バー

Tcl スクリプ ト機能の使用 73UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 74: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

ザイリンクス Tcl Store のサポート

特定のアプリ または proc に対する問題をレポート させるには、Tcl Store の GUI の右上の [Support on GitHub] をク リ ッ

ク します。 この リ ンクをク リ ッ クする と、デフォルト ブラウザーが GitHub 内の Tcl Store サポート ページに直接開き

ます。 GitHub サポート ページには、 問題をファイルするための追加情報が含まれます。

X-Ref Target - Figure 20

図 20: GitHub サポート  ページへのハイパーリンク

Tcl スクリプ ト機能の使用 74UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 75: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

カタログの更新

アプリの GitHub へのリ リースは、 Vivado Design Suite リ リース とは同期していません。 カタログを更新する と、 新

版のアプリにアクセスできます。

カタログを更新するには、 [Xilinx Tcl Store] ダイアログ ボッ クスの左下にある [Refresh] ボタンをク リ ッ ク します (1)。

これによ りオンライン git リ ポジ ト リに対してすべてのアプリの 新情報がクエリ され、 カタログ更新の進捗状況を

示すボッ クスが表示されます (2)。 その後アプリ をインス トールする と、 オンライン リ ポジ ト リから 新バージ ョ ン

がダウンロード されます。

X-Ref Target - Figure 21

図 21: カタログの更新

Tcl スクリプ ト機能の使用 75UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 76: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アプリのアップデート

カタログを更新する と、 アプ リのアップデートがオンライン リ ポジ ト リから入手可能である場合はそれが示されま

す。次の図では、 projutils アプリのバージ ョ ン 3.228 がインス トールされています。 カタログを更新する と、 [Update]

ボタンと [What's New] ハイパーリ ンクが表示され、 新しいバージ ョ ンが入手可能であるこ とがわかり ます。 [What's

New] ハイパーリ ンクをク リ ッ クする と、 新しいバージ ョ ン 3.230 が入手可能であるこ とが表示されます (図 22)。

この時点では、 アプ リはまだアップデート されていません。 projutils アプリのバージ ョ ンは、 [Update] ボタンをク

リ ッ クするまで 3.228 のままになり ます。

注記: アプリ を一度アップデートする と、 前のバージ ョ ンに戻すこ とはできません。

X-Ref Target - Figure 22

図 22: アプリの新しいバージ ョ ンを入手可能

Tcl スクリプ ト機能の使用 76UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 77: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アプリ を 新バージ ョ ンにアップデートするには、 [Update] ボタンをク リ ッ ク します (1)。 アプ リのアップデート を

確認するダイアログ ボッ クス (2) が表示されます (図 23)。

X-Ref Target - Figure 23

図 23: アプリのアップデート

Tcl スクリプ ト機能の使用 77UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 78: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アップデートが完了する と、 インス トールされている projutils のバージ ョ ンが 新版になり ます。

X-Ref Target - Figure 24

図 24: アップデートの確認

Tcl スクリプ ト機能の使用 78UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 79: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アプリのアンインストール

アプリ をアンインス トールするには、 左側のパネルでアプリ を選択し、 右側の [Details] パネルの下部にある

[Uninstall Application] ハイパーリ ンクをク リ ッ ク します (1)。 アンインス トールを確認するダイアログ ボッ クスが表

示されます (2)。

アプ リ をアンインス トールする と、 アプリに含まれているプロシージャは Tcl コンソールから使用できなくな り ま

す。

カタログの更新のディスエーブル

アプリ ケーシ ョ ンによるファ イアウォール外の情報のクエリが懸念される場合は、 カタログの更新をディ スエーブ

ルにできます。 これによ り、 Vivado からオンライン リ ポジ ト リにクエ リが発行されなくな り ます。 この場合、 ユー

ザーは現在のバージ ョ ンのみを使用可能です。 カタログの更新をディ スエーブルにするには、 スタート アップ

Vivado_init.tcl スク リプ トに次の Tcl 行を追加します。 これで、 すべての Vivado セッシ ョ ンでカタログの更新

がディ スエーブルになり ます。

vivado% set_param tclapp.enableGitAccess 0

X-Ref Target - Figure 25

図 25: アプリのアンインストール

Tcl スクリプ ト機能の使用 79UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 80: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

カタログの更新をディ スエーブルにする と、 図 26 に示すよ うに、 [Refresh] ボタンの代わりに 「Internet access is not

available.」 (インターネッ ト アクセスは使用できません) という メ ッセージが表示されます。

コード記述のガイド ライン

ザイ リ ンクス Tcl Store はオープン ソースのリポジ ト リであ り、 内部および外部ユーザーが Tcl スク リプ ト を投稿し、

ザイ リ ンクス コ ミ ュニティ内で共有できるよ うにします。 スク リプ トが重複していないこ とを確実にし、 一貫性を

保持するため、 ゲート キーピング コ ミ ティによ り投稿が評価されます。 このプロセスの詳細は、 Wiki ページ

(https://github.com/Xilinx/XilinxTclStore/wiki/Xilinx-Tcl-Store-Home) を参照してください。

このセクシ ョ ンでは、 ザイ リ ンクス Tcl Store にアプリ を投稿する際に従う必要のあるコード記述ガイ ド ラインを示

します。 これらのガイ ド ラインによ り、 スク リプ トがザイ リ ンクス Tcl Store の機構に準拠しているこ と、 すべての

アプリおよび Tcl スク リプ トでプロシージャおよび変数の間に名前の競合がないこ となどが確実になり ます。 ただ

し、 Tcl Store に投稿する際のプロセスについては説明しません。 投稿プロセスについては、 Wiki を参照してくださ

い。

ザイ リ ンクス Tcl Store には、 参考となるコード例と して使用可能な Tcl スク リプ トが多数あ り ます。 また、 次のディ

レク ト リにテンプレート アプリがあ り ます。

<VIVADO_INSTALL>/data/XilinxTclStore/tclapp/mycompany/template/*

X-Ref Target - Figure 26

図 26: カタログの更新のディスエーブル

Tcl スクリプ ト機能の使用 80UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 81: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

このテンプレートは、 サンプル スク リプ ト と、 新しいアプリで使用する必要のあるディ レク ト リ構造を示します。

このセクシ ョ ンでは、 次のスク リプ ト を例と して使用します。

<VIVADO_INSTALL>/data/XilinxTclStore/tclapp/mycompany/template/myscript1.tcl

このセクシ ョ ンのコード例では、 アプリ名が template、 アプ リ を提供および管理する企業の名前が mycompany

である と します。

用語:

• ユーザー プロシージャ : ユーザーが実行するプロシージャ。

• ヘルパー プロシージャ : ユーザー プロシージャでタスクを実行するためにバッ クグランドで使用されるプロ

シージャ。 ヘルパー プロシージャは、 ユーザーによって直接実行されるこ とはな く、 ヘルプ システムには含ま

れません。

Vivado パッケージ

各アプリには、 機能するために 低限必要な Vivado バージ ョ ンがあ り ます。 Tcl コードで必要な 低限の Vivado

パッケージ バージ ョ ンを指定する と、 アプリでチェッ ク されます。 Vivado パッケージ名のフォーマッ トは

1.<release> です。 たとえば、 1.2016.1、 1.2016.2、 1.2016.3 のよ うにな り ます。

アプ リが機能するために Vivado 2016.1 が必要な場合、 スク リプ トの冒頭に次のコードを追加します。

package require Vivado 1.2016.1

アプリが Vivado 2016.3 に追加された機能を活用する場合は、 次のコードを追加します。

package require Vivado 1.2016.3

必要な Vivado パッケージは、 アプリが機能するために 低限必要な Vivado リ リースです。 つま り、 Vivado の新しい

リ リースで提供されている機能をサポートするためにアプリが変更された場合などを除き、 Tcl スク リプ トで必要な

Vivado パッケージはアップデートするべきではあ り ません。

Tcl スクリプ ト機能の使用 81UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 82: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

アプリの名前空間

ザイ リ ンクス Tcl Store 内では、Tcl スク リプ トはアプリに含まれ、アプリ (例: template) は企業 (例: mycompany) に

よ り提供されています。 アプ リは、 特定のタイプの機能を提供するコンテナーです。 名前の競合を回避するため、

各アプリには独自の名前空間があ り ます。 アプリの完全な名前空間修飾子は、 次のとおりです。

::tclapp::<company>::<app>

または

::tclapp::mycompany::template

次のよ うなコードがある と します。

namespace eval ::tclapp::mycompany::template {namespace export my_command1}proc ::tclapp::mycompany::template::my_command1 { args } {}

このコードでは、 名前空間 ::tclapp::mycompany::template にプロシージャ my_command1 を作成していま

す。 my_command1 はユーザーによ り実行されるので、 アプリの名前空間からエクスポートする必要があ り ます。

これには、 「namespace export my_command1」 を使用します。

ユーザー プロシージャとヘルパー プロシージャ

Tcl スク リプ トでは、 複数のユーザー スク リプ ト を定義できます。 ユーザー プロシージャは、 ユーザーによ り実行

される Tcl プロシージャ (コマンド ) です。 前述のよ うに、 すべてのユーザー プロシージャはアプリの名前空間から

エクスポートする必要があ り ます。

ユーザー プロシージャに加え、 Tcl スク リプ トではヘルパー プロシージャも定義できます。 ヘルパー プロシージャ

はユーザー プロシージャでのみ使用され、 ユーザーには使用できないよ うにする必要があるので、 名前空間からエ

クスポート しません。 どのプロシージャをユーザーがコマンド ライン インターフェイス (スク リプ ト または Tcl コン

ソール) から実行できるよ うにするかをシステムで指定するには、 プロシージャを名前空間からエクスポートするの

が唯一の方法です。

ユーザー プロシージャがヘルパー プロシージャを使用する場合、 アプ リの下にサブ名前空間を作成し、 ユーザー プ

ロシージャ とヘルパー プロシージャをその下に移動するこ とをお勧めします。 これによ り、 アプリ内のヘルパー プ

ロシージャ間で名前の競合が発生するのを防ぐこ とができます。 これは、 さ らにスク リプ ト を独自のヘルパー プロ

シージャ と共に追加する場合に特に重要です。

Tcl スクリプ ト機能の使用 82UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 83: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

次のコードは、 Tcl コードに推奨される構造を示します。 ユーザー プロシージャはアプリの名前空間のすぐ下にあ り

ますが、 これはサブ名前空間 ::tclapp::mycompany::template::my_command1 の下に移動された元のプロ

シージャを呼び出すために使用されるラ ッパーです。

namespace eval ::tclapp::mycompany::template { namespace export my_command1}proc ::tclapp::mycompany::template::my_command1 { args } { # Calling the original code moved under the sub-namespace uplevel [concat ::tclapp::mycompany::template::my_command1::my_command1 $args]}eval [list namespace eval ::tclapp::mycompany::template::my_command1 {} ]proc ::tclapp::mycompany::template::::my_command1::my_command1 { args } { # Here is the code of the original proc}proc ::tclapp::mycompany::template::my_command1::helper1 { args } { # Here is the code of the helper proc}

注記: サブ名前空間 ::tclapp::mycompany::template::my_command1 は、 その中にプロシージャを定義する

前に作成する必要があ り ます。 サブ名前空間を作成する構文は、 リ ンターからのエラー メ ッセージを回避するため、

「eval [list namespace eval ::tclapp::mycompany::template::my_command1 {}]」 とする必要があ

り ます。

注記: コードを解読しやすくするため、 上記のコードにはこのセクシ ョ ンの後の方で説明する必須のメ タコ メン トは

含まれていません。

変数の競合

変数に関する重要な規則は、 グローバル変数は禁止されている という こ とです。 ザイ リ ンクス Tcl Store リ ンターは、

スク リプ ト内のグローバル変数をチェッ ク し、 グローバル変数が定義されている とエラー メ ッセージを表示します。

アプ リに含まれる複数のプロシージャで変数を共有する必要がある場合は、 その名前空間内で宣言します。 これに

は、 キーワード variable を使用して名前空間内で変数を作成します。 このよ うに作成した変数は、 グローバル変

数のよ うに使用できますが、 その名前空間内のみで使用可能です。

次のコードでは、 同じ名前空間に含まれるすべてのプロシージャで共有可能な変数 verbose を作成しています。 こ

の変数は 0 に初期化されます。

namespace eval ::tclapp::mycompany::template { variable verbose 0}

Tcl スクリプ ト機能の使用 83UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 84: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

プロシージャ内でこの変数にアクセスするには、 プロシージャ内で変数をキーワード variable を使用して宣言し

ます。

次に例を示します。

proc ::tclapp::mycompany::template::::my_command1::my_command1 { args } { variable verbose # The variable verbose can be accessed here set verbose 1}proc ::tclapp::mycompany::template::my_command1::helper1 { args } { variable verbose # The variable verbose can be accessed here if {$verbose} { .. }}

注記:変数 verbose には、 完全な名前空間修飾子を使用すれば、 グローバル名前空間を含むどの名前空間からでも

アクセスできます。 次に例を示します。

set ::tclapp::mycompany::template::verbose 1

メ タコ メン ト

Tcl スク リプ ト内のすべてのプロシージャには、 必須のメ タコ メン ト を含める必要があ り ます。 この規則は、 名前空

間からエクスポート されているユーザー プロシージャ とヘルパー プロシージャの両方に適用されます。 メ タコ メン

トが含まれていない場合、 ザイ リ ンクス Tcl Store リ ンターによ りエラー メ ッセージが生成されます。 エクスポート

されたすべてのプロシージャのメ タコ メン トには、 完全な情報が含まれているこ とが必要です。 ヘルパー プロシー

ジャのメ タコ メン トは空にするこ とが可能ですが、 メ タコ メン トは宣言する必要があ り ます。

メ タコ メン トは、 プロシージャの機能の簡単な説明、 カテゴ リ情報、 プロシージャでサポート されるコマンド ライ

ン オプシ ョ ンのリ ス ト などの情報をシステムに提供します。

メ タコ メン トは、 プロシージャ定義と コードの 初の行の間に挿入する必要があ り ます。 すべてのメ タコ メン トが

必須です。

必須のメ タコ メン トは、 次のとおりです。

• Summary: プロシージャの機能のサマリ。 複数行にできます。 このサマ リは、 [Xilinx Tcl Store] ダイアログ ボッ

クスにプロシージャの説明と して表示されます。

• Argument Usage:プロシージャのコマンド ラ イン引数のリ ス ト。 ヘルプ システムを構築するのに使用されます。

このガイ ドの別のセクシ ョ ンで、 サポート されるフォーマッ ト を示します。

• Return Value: プロシージャの戻り値。 ヘルプ システムを構築するのに使用されます。

• Categories: アプリのカテゴ リ。 アプリ を リ ス トする Vivado ヘルプ システムのカテゴ リ を指定します。

「Categories:」 の後にカテゴ リ をカンマで区切って リ ス ト します。 慣習と して、 初に xilinxtclstore

を指定し、 その後にアプリ名を指定します。

次に、 ユーザー プロシージャに必要なメ タコ メン トの例を示します。

proc ::tclapp::mycompany::template::my_command1 { args } { # Summary: Multi-lines summary of # what the proc is doing

# Argument Usage:

Tcl スクリプ ト機能の使用 84UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 85: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# [-verbose]: Verbose mode # [-file <arg>]: Report file name # [-append]: Append to file # [-return_string]: Return report as string # [-usage]: Usage information

# Return Value: # return report if -return_string is used, otherwise 0. If any error occur TCL_ERROR is returned

# Categories: xilinxtclstore, template

# The code for the proc starts below …}

注記: サブ名前空間にヘルパー プロシージャ と共に作成されたプロシージャ my_command1 ではなく、 名前空間から

エクスポート されるユーザー プロシージャに詳細なメ タコ メン ト を含める必要があ り ます。

次に、 ヘルパー プロシージャのメ タコ メン トの例を示します。 すべてのメ タコ メン トが定義されていますが、 空で

す。

proc ::tclapp::mycompany::template::my_command1::lshift {inputlist} { # Summary : # Argument Usage: # Return Value: # Categories:

# The code starts below …}

スク リプ トに含まれるすべての Tcl スク リプ トにすべてのメ タコ メン ト を含める必要があ り ますが、 詳細情報を含め

る必要があるのは、 名前空間からエクスポート されるユーザー プロシージャです。

コマンド  ライン引数のメ タコ メン ト

ユーザー プロシージャのコマンド ライン引数は、 ユーザー プロシージャ内でメ タコ メン ト Argument Usage を使

用して説明する必要があ り ます。 このメ タコ メン トは、 <command> -help が実行されたと き、 または [Xilinx Tcl

Store] ダイアログ ボッ クスでプロシージャのヘルプが表示されたと きに、 ヘルプ システムでメ ッセージを生成する

のに使用されます。 次に例を示します。

# Argument Usage: # [-verbose]: Verbose mode # [-file <arg>]: Report file name # [-append]: Append to file # [-return_string]: Return report as string # [-usage]: Usage information

ヘルプ システムでこのメ タコ メン ト Argument Usage が使用され、 次のメ ッセージが表示されます。

Syntax: xilinx::designutils::write_template [-verbose] [-file <arg>] [-append] [-return_string] [-usage] [-quiet]

Usage: Name Description -----------------------------

Tcl スクリプ ト機能の使用 85UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 86: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

[-verbose] Verbose mode Default: 0 [-file] Report file name Default: None [-append] Append to file Default: 0 [-return_string] Return report as string Default: 0 [-usage] Usage information Default: 0 [-quiet] Ignore command errors

メ タコ メン ト Argument Usage は、Tcl プロシージャを呼び出す前の Vivado によるコマンド ライン引数の前処理で

はないという こ とに注意してください。 ヘルプ システムで使用されるだけです。 プロシージャの Tcl コードでコマ

ンド ライン引数を処理する必要があ り ます。

コマンド  ライン引数のないユーザー プロシージャ

ユーザー プロシージャにコマンド ライン引数がない場合は、 メ タコ メン ト Argument Usage は空にする必要があ

り ます。 次に例を示します。

proc ::tclapp::mycompany::template::my_command2 {} { # Summary : A one line summary of what this proc does

# Argument Usage:

# Return Value: # TCL_OK is returned with result set to a string

# Categories: xilinxtclstore, template

…}

コマンド  ライン引数のあるユーザー プロシージャ

通常の Tcl プロシージャ と同様、 ユーザー プロシージャの引数定義は、 位置ベースにするか、 args 変数を使用して

引数の変数リ ス ト を指定します。

proc ::tclapp::mycompany::template::my_command2 { arg1 {optional1 ,} } {…}

または

proc ::tclapp::mycompany::template::my_command2 { args } {…}

どちらの場合でも、 プロシージャで指定可能なコマンド ラ イン引数のリ ス ト を メ タコ メン ト Argument Usage で

正し く定義するのは、 開発者の責任です。 システムでは、 メ タコ メン ト Argument Usage からの引数のリ ス ト と実

際に引数定義が一致しているかはチェッ ク されません。

メ タコ メン ト Argument Usage はヘルプ メ ッセージに使用されるので、 プロシージャで引数を渡すのにどちらの

形式を使用した場合でも、 メ タコ メン ト をアップデートする必要があ り ます。 次に例を示します。

proc ::tclapp::mycompany::template::my_command2 { arg1 {optional1 ,} } {

Tcl スクリプ ト機能の使用 86UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 87: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# Summary : A one line summary of what this proc does # Argument Usage: # arg1 : A one line summary of this argument # [optional1=,] : A one line summary of this argument

# Return Value: # TCL_OK is returned with result set to a string

# Categories: xilinxtclstore, template…}

または

proc ::tclapp::mycompany::template::my_command2 { args } { # Summary : A one line summary of what this proc does # Argument Usage: # arg1 : A one line summary of this argument # [optional1=,] : A one line summary of this argument

# Return Value: # TCL_OK is returned with result set to a string

# Categories: xilinxtclstore, template…}

注記:可能な限り、 位置ベースの引数ではなく args を使用してください。 args を使用した方が、 コマンド ライン

引数の順序に制限がないので、 ユーザーが使用しやすいものとな り ます。 プロシージャでサポート されるコマンド

ライン引数が 1 つか 2 つのみの場合は、 位置ベースの指定方法を使用できますが、 引数の順序は決まっており、

ユーザーにはどの順序で引数を指定すればよいかわからないので (ヘルプ システムではこの情報は含まれない)、

ユーザーには使いにくいものとな り ます。

メ タコ メン ト  Argument Usage

これが、 も複雑なメ タコ メン トです。 プロシージャでサポート される必須またはオプシ ョ ンの各引数を、 1 行で指

定します。 オプシ ョ ンの引数は、 角かっこ ([ ]) で囲む必要があ り ます。 値を指定する必要のある引数には、 リ テラ

ル テキス ト <arg> を追加し、 値を指定する必要があるこ とをユーザーに示し、 説明部分に有効な値を説明する必要

があ り ます。 ユーザーがオプシ ョ ンの引数を指定しない場合に使用されるデフォルト値を指定するこ と も可能です。

値のないオプシ ョ ンの引数 (フラグ) も可能です。 コマンド ラインでこれらのフラグを使用する と、 値は True である

と想定され、 アプ リでそのオプシ ョ ンで指定される操作が実行されます。 ただし、 フラグ名に接頭辞 no_ が付いて

いる場合 (-no_cleanup など)、 値は False である と想定され、 デフォルトで実行される操作が実行されなくな り ま

す。

位置指定引数を指定するこ と もできます。 位置指定引数は、 対応するフラグ (-arg1 など) なしで値のみを指定する

ものです。

たとえば、 次のよ うなメ タコ メン トがある と します。

# Argument Usage: # timingPath : mandatory name # [-append]: optional flag # -cell <arg>: mandatory argument with no default value

Tcl スクリプ ト機能の使用 87UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 88: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# [-template <arg> = stub]: optional argument with a default value. The default value is: stub

これによ り、 次のよ うなヘルプ メ ッセージが生成されます。

Syntax: mycompany::template::mycommand [-append] -cell <arg> [-template <arg>] [-quiet] [-verbose] <timingPath> <-name>

Returns: template in the case of -return_string, otherwise 0 TCL_ERROR if error

Usage: Name Description ------------------------- [-append] optional flag Default: 0 -cell mandatory argument with no default value [-template] optional argument with a default value. The default value is: stub Default: stub [-quiet] Ignore command errors [-verbose] Suspend message limits during command execution <timingPath> mandatory

コマンド ライン引数の実際の処理は、 プロシージャ内でプログラムと して実行する必要があ り ます。

注記: -append の使用はオプシ ョ ンで、 デフォルト値は 0 です。 コマンド ラインで -append オプシ ョ ンを指定す

る と、 システムから 1 が返されます。

スクリプ ト例

このセクシ ョ ンで示す例の完全なスク リプ トは、 次の場所にあ り ます。

<XilinxTclStore>/tclapp/mycompany/template/myscript1.tcl

package require Vivado 1.2014.1

namespace eval ::tclapp::mycompany::template { # Export procs that should be allowed to import into other namespaces namespace export my_command1}

proc ::tclapp::mycompany::template::my_command1 { args } { # Summary: Multi-lines summary of # what the proc is doing

# Argument Usage: # [-verbose]: Verbose mode # [-file <arg>]: Report file name # [-append]: Append to file # [-return_string]: Return report as string # [-usage]: Usage information

# Return Value:

Tcl スクリプ ト機能の使用 88UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 89: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

# return report if -return_string is used, otherwise 0. If any error occur TCL_ERROR is returned

# Categories: xilinxtclstore, template

uplevel [concat ::tclapp::mycompany::template::my_command1::my_command1 $args]}

# Trick to silence the lintereval [list namespace eval ::tclapp::mycompany::template::my_command1 {} ]

proc ::tclapp::mycompany::template::my_command1::lshift {inputlist} { # Summary : # Argument Usage: # Return Value: # Categories:

Tcl スクリプ ト機能の使用 89UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 90: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

upvar $inputlist argv set arg [lindex $argv 0] set argv [lrange $argv 1 end] return $arg}

proc ::tclapp::mycompany::template::my_command1::my_command1 {args} { # Summary : # Argument Usage: # Return Value: # Categories: #------------------------------------------------------- # Process command line arguments #------------------------------------------------------- set error 0 set help 0 set filename {} set cell {} set returnString 0 while {[llength $args]} { set name [lshift args] switch -regexp -- $name { -cell - {^-c(e(ll?)?)?$} { set cell [lshift args] } -file - {^-f(i(le?)?)?$} { set filename [lshift args] if {$filename == {}} { puts " -E- no filename specified." incr error } } -append - {^-a(p(p(e(nd?)?)?)?)?$} { set mode {a} } -return_string - {^-r(e(t(u(r(n(_(s(t(r(i(ng?)?)?)?)?)?)?)?)?)?)?)?$} { set returnString 1 } -usage - {^-u(s(a(ge?)?)?)?$} { set help 1 } default { if {[string match "-*" $name]} { puts " -E- option '$name' is not a valid option. Use the -usage option

for more details" incr error } else { puts " -E- option '$name' is not a valid option. Use the -usage option

for more details" incr error } } } }

Tcl スクリプ ト機能の使用 90UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 91: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

if {$help} { puts [format { Usage: my_command1 [-cell <arg>] - Cell to generate template on. If not specified, runs on current_instance [-file <arg>] - Output file name Default: <module>.v or <module>.vhd [-append] - Append to file [-return_string] - Return template as string [-usage|-u] - This help message

Description: Get information on a cell and generate a report

Example: tclapp::mycompany::template::my_command1 tclapp::mycompany::template::my_command1 -cell ila_v2_1_0 -return_string} ] # HELP --> return {} }

if {$error} { error " -E- some error(s) happened. Cannot continue" }

return -code ok "my_command1 result"}

Vivado コマンド linter を使用して、 Tcl スク リプ トに対してザイ リ ンクス Tcl Store リ ンターを実行できます。 Tcl スク

リプ トの リ ス ト を引数と して指定します。 次に例を示します。

vivado% linter myscript.tclvivado% linter [glob -nocomplain *.tcl]

リ ンターで生成されるすべてのエラーを修正する必要があ り ます。 アプリ を投稿するには、 アプリに含まれるすべ

ての Tcl スク リプ トが リ ンターによるチェッ クに合格するこ とが必要です。

ザイリンクス Tcl Store への投稿

ザイ リ ンクス Tcl Store にアプリ を投稿するこ とをお考えの場合は、 次の Wiki ページを参照して ください。

https://github.com/Xilinx/XilinxTclStore/wiki/Xilinx-Tcl-Store-Home

この Wiki には、 さまざまな手順およびワークフローが詳細に説明されています。

Tcl スクリプ ト機能の使用 91UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 92: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

Tcl スクリプ ト記述のヒン ト

いくつかの規則に従う こ とで、 Tcl スク リプ トの実行時間と効率を向上できます。 次に、 Vivado Design Suite で Tcl ス

ク リプ ト機能を使用する際に、 ランタイムを短縮し、 メモ リ使用量を抑えるための推奨事項を示します。

ネスト処理を使用したパフォーマンスの向上

Tcl コンソールから Tcl コマンドを実行する と、 コマンドはまず Tcl インタープリ ターのレベルで処理されます。 構

文エラーがない場合、 コマンドはその後 C++ レベルで実行されます。 コマンドで値が返される場合、 C++ コードに

よ り戻り値がソフ ト ウェアのいくつかの層を介して Tcl インタープリ ターに送信されます。 Tcl インタープリ ターと

下位 C++ コードを行き来するこ とが、 実行時間に影響します。 同じコマンド内でネス ト処理を使用する と、 ネス ト

されたコマンドは C++ コードから直接呼び出され、 コマンド全体が完了してから C++ コードから Tcl インタープリ

ターに戻り ます。 たとえば、 次のよ うなコードがある と します。

set nets [get_nets -hier]set pins [get_pins -of_objects $nets]

次のコードは、 上記のコード よ り も高速に処理されます。

set pins [get_pins -of_objects [get_nets -hier]]

これは、 初のコードでは中間 Tcl 変数 nets が作成されるからです。

ただし、 これらの変数の結果がコードのほかの部分で再利用される場合、 中間 Tcl 変数を作成する方が有利なこ と も

あ り ます。

オブジェク トのキャッシュ

オブジェク ト またはオブジェク トの リ ス ト を Tcl 変数にキャッシュし、 再利用します。

たとえば、 同じネッ トの リ ス ト をスク リプ トで複数回使用する場合は、 同じ クエ リ を繰り返し実行するのは効率的

ではあ り ません。 Vivado ツールの Tcl コマンドは効率的に実行されますが、 Tcl クエ リ を実行するたびに Tcl イン

タープリ ターとアプ リ ケーシ ョ ンの 下位 C++ コードの間を行き来するこ とにな り ます。 この C++/Tcl のアクセスに

時間がかかるので、 できる限り避けるよ うにします。

Vivado ツールの異なるフ ィルター機能をできる限り利用します。 効果的な検索パターン、 -of_objects オプシ ョ

ン、 -filter オプシ ョ ン、 および filter コマンドを使用するこ とで実行時間を短縮できます。 これらの機能はア

プリ ケーシ ョ ンの下位にインプ リ メン ト されており、 実行時間およびメモ リの点で非常に効率的です。

クエ リの結果をキャ ッシュして、 そのオブジェク トの リ ス トに対して filter コマンドを実行してオブジェク トの

サブリ ス ト を作成できます。 また、 イン メモ リ デザインにアクセスせずに、 標準 Tcl コマンドを使用して Tcl 変数に

代入された結果を解析できます。

set allCells [get_cells * -hier]lsort $allCells ; # Returns a sort ordered list of all cellsfilter $allCells {IS_PRIMITIVE} ; # Returns only the primitive cellsfilter $allCells {!IS_PRIMITIVE} ; # Returns non-primitive cells

Tcl スクリプ ト機能の使用 92UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 93: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

オブジェク ト名と  NAME プロパティ

デザイン オブジェク ト を必要とする Tcl コマンド と、 文字列入力を必要とする Tcl コマンドがあ り ます。 Vivado

Design Suite では、 文字列引数を必要とする Tcl コマンドであっても、 デザイン オブジェク ト を直接渡すこ とができ

ます。 この場合、 デザイン オブジェク トの階層名が文字列と して Tcl コマンドに渡されます。 オブジェク トの

NAME プロパティを取得して Tcl コマンドに渡す必要はあ り ません。

たとえば、 次の regexp コマンドでは、 2 つの if 文は同等で、 オブジェク トの名前が渡されます。

if {[regexp {.*enable.*} $MyObject]} { ... }if {[regexp {.*enable.*} [get_property NAME $MyObject]]} { ... }

上記の例では、 初のコードの方が読みやすいだけでなく、 オブジェク トのプロパティを取得する必要がないので

実行時間も短くな り ます。 2 番目の例では get_property コマンドによ り、 オブジェク ト プロパティを取得するた

め、 Tcl インタープリ ターと下位 C++ アプリ ケーシ ョ ン コードの間にアクセスが発生します。 これを複数のオブ

ジェク トに対してループで実行する と、 Tcl スク リプ トの実行時間が大幅に増加します。

get_property およびリストの並べ替え

get_property で返されるエレ メン ト (文字列またはオブジェク ト ) のリ ス トは、 オブジェク トの入力リ ス トに基づ

いて並べ替えられます。 エレ メン トの数も同じになり ます。 このプロパティは、 複数リ ス トに対して Tcl コマンドの

foreach で繰り返すこ とができます。

非効率なコード :

set cells [get_cells -hier -filter {...}]foreach cell $cells { set loc [get_property LOC $cell] ...}

このコードの場合、 get_property LOC $cell コマンドが $cells コレクシ ョ ン内のセルごとに実行されます。

効率的なコード :

set cells [get_cells -hier -filter {...}]foreach cell $cells loc [get_property LOC $cells] { ...}

このコードの場合、 get_property LOC $cells コマンドが 一度しか実行されないので、 長いオブジェク トの リ

ス トの実行時間がかなり改善されます。 これは、 get_property で返された リ ス トに Tcl リ ス トの $cells と同じ

数のエレ メン トが含まれ、 返されたエレ メン トが入力リ ス ト と同じ順番だからです。

オブジェク トのリストのフォーマッ ト

get_* コマンドから返された リ ス トはフォーマッ ト されておらず、 stdout にスペースで区切られて 1 行で表示さ

れます。 この例を次に示します。

get_cellsA B clk_IBUF_inst rst_IBUF_inst din0_IBUF_inst din1_IBUF_inst dout0_OBUF_inst dout1_OBUF_inst dout2_OBUF_inst dout3_OBUF_inst clk_IBUF_BUFG_inst

Tcl スクリプ ト機能の使用 93UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 94: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

このフォーマッ ト されていないリ ス トでは、 Tcl コンソールおよび Vivado IDE で何が返されたかを確認するのが困難

です。 リ ス トの各アイテムを個別の行に表示するには、 次のよ うにコマンドを join コマンドにネス ト し、 改行文

字 \n を追加します。

join [get_cells] \nABclk_IBUF_instrst_IBUF_instdin0_IBUF_instdin1_IBUF_instdout0_OBUF_instdout1_OBUF_instdout2_OBUF_instdout3_OBUF_instclk_IBUF_BUFG_inst

get_* コマンドで返される リ ス トは、 join コマンドでは変更されません。

注記: オブジェク トの Vivado コレクシ ョ ンを文字列に変換した場合、文字列表現にすべてのオブジェク トが含まれな

いこ とがあ り ます。 コレクシ ョ ンの文字列表現に含まれるオブジェク トの 大数は、

tcl.collectionResultDisplayLimit パラ メーターで指定します。 デフォルトは 500 です。 詳細は、 「コレク

シ ョ ンと文字列表現」 を参照してください。

Vivado Tcl コマンドをオプシ ョ ンで検索

次のプロシージャ findCmd を使用する と、 Vivado Design Suite のすべての Tcl コマンドの構文が検索され、指定のオ

プシ ョ ンをサポートするコマンドが リ ス ト されます。

proc findCmd {option} {foreach cmd [lsort [info commands *]] {catch {if {[regexp "$option" [help -syntax $cmd]]} {puts $cmd

} }

} } ; # End proc

たとえば、 -return_string オプシ ョ ンをサポートする Vivado ツール コマンドを検索するには、 次のコマンドを

使用します。

findCmd return_string

効率的なコードの記述

実行時間を短縮する方法の 1 つに、 コンテナーに含まれる各要素に対してループ内のコマンドを実行するのではな

く、 コンテナーを作成してコマンドをコンテナー全体に対して実行する方法があ り ます。 次の例はこれを示してお

り、 「カスタム デザイン ルール チェッ ク (DRC) の作成」 の例と似ています。

非効率なコード :

foreach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {set bwidth [get_property WRITE_WIDTH_B $bram]if { $bwidth > 36} {

highlight_object -color red [get_cells $bram]

Tcl スクリプ ト機能の使用 94UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 95: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

第 1 章: Vivado での Tcl スクリプ ト

}; # End IF}; # End FOR

効率的なコード :

foreach bram [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram}] {set bwidth [get_property WRITE_WIDTH_B $bram]if { $bwidth > 36} {

lappend bram_list $bram}; # End IF

}; # End FORhighlight_object -color red [get_cells $bram_list]

上記のコードをさ らに短く効率的に記述するには、 get_cells コマンドにフ ィルターを適用します。 これによ り、

個別のチェッ クを含む foreach ループを実行する必要がなくな り ますが、 多少複雑なフ ィルターが必要になり ま

す。

highlight_object -color red [get_cells -hier -filter {PRIMITIVE_SUBGROUP == bram && WRITE_WIDTH_B > 36}]

ユーザー入力の取得

従来の tclsh シェルの場合、 ユーザー入力は通常 stdin チャネルを使用して取り込まれます。 次に例を示します。

gets stdin answer

Vivado IDE では、 Tcl コードを異なる環境で実行できますが、 stdin チャネルとは互換性のないこ とがほとんどで

す。 スク リプ トがローカル シェルの Vivado Tcl モードでのみ実行される とわかっている場合を除き、 ユーザー入力

を取得するのに stdin は使用できません。

ユーザー入力は、 通常スク リプ トのビヘイビアーを変更したり、 パラ メーターの値を設定したりするために使用さ

れます。 この際、 stdin からの情報取得は信頼できず、 エラー (タイプ ミ ス、 間違った値など) になる可能性が高く

なり ます。

スク リプ トにカスタム値を提供する際には、 Tcl スク リプ トから簡単に読み出すこ とのできるコンフ ィギュレーシ ョ

ン ファ イルを使用するこ とをお勧めします。 コンフ ィギュレーシ ョ ン ファ イルは、 Tcl 変数のリ ス ト と同じよ うに

単純にでき、 次のコマンドを使用してスク リプ トにインポートできます。

source <configuration_file>

このよ うなコンフ ィギュレーシ ョ ン ファ イルは、 Vivado IDE をバッチ モードで実行している場合か、 リモート マシ

ン (LSF など) を使用している場合に使用できます。

Tcl スクリプ ト機能の使用 95UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 96: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

付録 A

その他のリソースおよび法的通知

ザイリンクス リソース

アンサー、 資料、 ダウンロード、 フォーラムなどのサポート リ ソースは、 ザイ リ ンクス サポート サイ ト を参照して

ください。

ソリューシ ョ ン  センター

デバイス、 ツール、 IP のサポートについては、 ザイ リ ンクス ソ リ ューシ ョ ン センターを参照して ください。 ト ピッ

クには、 デザイン アシスタン ト、 アドバイザリ、 ト ラブルシュート ヒ ン ト などが含まれます。

Documentation Navigator およびデザイン  ハブ

Xilinx Documentation Navigator (DocNav) を使用する とザイ リ ンクスの資料、 ビデオ、 およびサポート リ ソースにアク

セスして情報をフ ィルター、 検索できます。 Xilinx Documentation Navigator を開くには、 次のいずれかを実行しま

す。

• Vivado IDE で [Help] → [Documentation and Tutorials] をク リ ッ ク します。

• Windows で [スタート ] → [すべてのプログラム] → [Xilinx Design Tools] → [DocNav] をク リ ッ ク します。

• Linux コマンド プロンプ トに 「docnav」 と入力します。

ザイ リ ンクス デザイン ハブには、 資料やビデオへのリ ンクがデザイン タスクおよびト ピッ クごとにま とめられてお

り、 これらを参照するこ とでキー コンセプ ト を学び、 よ く ある質問を解決できます。 デザイン ハブにアクセスする

には、 次のいずれかを実行します。

• Xilinx Documentation Navigator で [Design Hubs View] タブをク リ ッ ク します。

• ザイ リ ンクス ウェブサイ トのデザイン ハブ ページを参照します。

注記: Documentation Navigator の詳細は、 ザイ リ ンクス ウェブサイ トの Documentation Navigator ページを参照してく

ださい。

注意: Xilinx Documentation Navigator からは、 日本語版は参照できません。 ウェブサイ トのデザイン ハブ ページの一

部は翻訳されており、 日本語版が提供されている場合はそのリ ンク も追加されています。

Tcl スクリプ ト機能の使用 96UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 97: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

付録 A: その他のリソースおよび法的通知

参考資料

1. 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835)

2. 『Vivado Design Suite ユーザー ガイ ド : 入門』 (UG910)

3. 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903)

4. 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911)

5. 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの概要』 (UG892)

6. 『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893)

7. 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイン入力』 (UG895)

8. Tcl Developer Xchange

9. Vivado Design Suite の資料

ト レーニング リソース

ザイ リ ンクスでは、 この資料に含まれるコンセプ ト を説明するさまざまな ト レーニング コースおよび QuickTake ビデ

オを提供しています。 次のリ ンクから関連する ト レーニング リ ソースを参照してください。

1. Vivado デザイン ツール フロー ト レーニング コース

2. ト レーニング コース : Vivado Design Suite を使用した FPGA の設計 1

3. ト レーニング コース : Vivado Design Suite を使用した FPGA の設計 2

4. ト レーニング コース : Vivado Design Suite を使用した FPGA の設計 3

5. ト レーニング コース : Vivado Design Suite を使用した FPGA の設計 4

6. Vivado Design Suite QuickTake ビデオ チュート リ アル

7. Vivado Design Suite QuickTake ビデオ: Vivado IP インテグレーターを使用した Zynq デバイスの設計

8. Vivado Design Suite QuickTake ビデオ: Vivado Design Suite でパーシャル リ コンフ ィギュレーシ ョ ンを実行

9. Vivado Design Suite QuickTake ビデオ: Vivado Design Suite でのリ ビジ ョ ン管理の使用

10. Vivado Design Suite QuickTake ビデオ: デザイン フローの概要

11. Vivado Design Suite QuickTake ビデオ: プロジェク ト を作成せずにバッチ ファ イルを使用する方法 (非プロジェク

ト フロー )

12. Vivado Design Suite QuickTake ビデオ: プロジェク ト バッチ フローの使用

Tcl スクリプ ト機能の使用 97UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日

Page 98: Vivado Design Suite - Xilinx...Vivado Design Suite ユーザー ガイド Tcl スクリプト機能の使用 UG894 (v2017.3) 2017 年 10 月 4 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に

付録 A: その他のリソースおよび法的通知

お読みください: 重要な法的通知本通知に基づいて貴殿または貴社 (本通知の被通知者が個人の場合には 「貴殿」、 法人その他の団体の場合には 「貴社」。 以下同じ ) に開示される情報 (以下 「本情報」 といいます) は、 ザイ リ ンクスの製品を選択および使用するこ とのためにのみ提供されます。 適

用される法律が許容する 大限の範囲で、 (1) 本情報は 「現状有姿」、 およびすべて受領者の責任で (with all faults) とい う状態で提供

され、 ザイ リ ンクスは、 本通知をもって、 明示、 黙示、 法定を問わず (商品性、 非侵害、 特定目的適合性の保証を含みますがこれ

らに限られません)、 すべての保証および条件を負わない (否認する ) ものと します。 また、 (2) ザイ リ ンクスは、 本情報 (貴殿または

貴社による本情報の使用を含む) に関係し、 起因し、 関連する、 いかなる種類 ・ 性質の損失または損害についても、 責任を負わな

い (契約上、 不法行為上 (過失の場合を含む)、 その他のいかなる責任の法理によるかを問わない) ものと し、 当該損失または損害に

は、 直接、 間接、 特別、 付随的、 結果的な損失または損害 (第三者が起こした行為の結果被った、 データ、 利益、 業務上の信用の

損失、 その他あらゆる種類の損失や損害を含みます) が含まれるものと し、 それは、 たとえ当該損害や損失が合理的に予見可能で

あったり、 ザイ リ ンクスがそれらの可能性について助言を受けていた場合であったと しても同様です。 ザイ リ ンクスは、 本情報に

含まれるいかなる誤り も訂正する義務を負わず、 本情報または製品仕様のアップデート を貴殿または貴社に知らせる義務も負いま

せん。 事前の書面による同意のない限り、 貴殿または貴社は本情報を再生産、 変更、 頒布、 または公に展示してはなり ません。 一

定の製品は、 ザイ リ ンクスの限定的保証の諸条件に従う こ と となるので、 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ンク

スの販売条件を参照してください。 IP コアは、 ザイ リ ンクスが貴殿または貴社に付与したライセンスに含まれる保証と補助的条件

に従う こ とにな り ます。 ザイ リ ンクスの製品は、 フェイルセーフと して、 または、 フェイルセーフの動作を要求するアプリ ケー

シ ョ ンに使用するために、 設計されたり意図されたり していません。 そのよ うな重大なアプリ ケーシ ョ ンにザイ リ ンクスの製品を

使用する場合のリ スク と責任は、 貴殿または貴社が単独で負う ものです。 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ンク

スの販売条件を参照してください。

自動車用のアプリ ケーシ ョ ンの免責条項

オートモーティブ製品 (製品番号に 「XA」 が含まれる ) は、 ISO 26262 自動車用機能安全規格に従った安全コンセプ ト または余剰性

の機能 ( 「セーフティ設計」 ) がない限り、 エアバッグの展開における使用または車両の制御に影響するアプリ ケーシ ョ ン ( 「セー

フティ アプリ ケーシ ョ ン」 ) における使用は保証されていません。 顧客は、 製品を組み込むすべてのシステムについて、 その使用

前または提供前に安全を目的と して十分なテス ト を行う ものと します。 セーフティ設計なしにセーフティ アプリ ケーシ ョ ンで製品

を使用する リ スクはすべて顧客が負い、 製品の責任の制限を規定する適用法令および規則にのみ従う ものと します。

© Copyright 2012-2017 Xilinx, Inc. Xilinx、 Xilinx のロゴ、 Artix、 ISE、 Kintex、 Spartan、 Virtex、 Vivado、 Zynq、 およびこの文書に含

まれるその他の指定されたブランドは、 米国およびその他各国のザイ リ ンクス社の商標です。 すべてのその他の商標は、 それぞれ

の保有者に帰属します。

この資料に関するフ ィードバッ クおよびリ ンクなどの問題につきましては、 [email protected] まで、 または各ページの

右下にある [フ ィードバッ ク送信] ボタンをク リ ッ クする と表示されるフォームからお知らせください。 フ ィードバッ クは日本語で

入力可能です。 いただきましたご意見を参考に早急に対応させていただきます。 なお、 このメール アドレスへのお問い合わせは受

け付けており ません。 あらかじめご了承ください。

Tcl スクリプ ト機能の使用 98UG894 (v2017.3) 2017 年 10 月 4 日 japan.xilinx.comUG894 (v2017.4) 2017 年 12 月 20 日