get_netsコマンドを使用すると、ネットがデザイン階層を通過するため、同じネットが異なる表現で返されること
があります。次に、get_nets コマンドのオプションを使用して、ネットの適切な表現が選択されるようにする例を いくつか示します。
次の例では、次のように定義された LUT2 の最下位ピンを使用して、最下位ピンに接続されているネットの異なるセ グメントをクエリします。
set mypin [get_pins{egressLoop[7].egressFifo/buffer_fifo/infer_fifo.wr_addr_reg[9]_i_1__6/
I0}]mark_objects -color green $mypin
図 7: mypin 例の設定
単純に最下位ピン mypin に接続されているネットを取得すると、階層内の最下位ピンに直接接続されているネット セグメントが返されます。
select_objects [get_nets -of $mypin]
最下位ピン mypin に接続されているネットのすべてのセグメントを 選択するには、-segments オプションを使用し ます。
select_objects [get_nets -segments -of $mypin]
図 8: get_nets でのセグメント取得の例
リーフ ピン mypin に接続される階層の最上位のネット
セグメントのみを取得するには、-top_net_of_hierarchical_group オプションと共に -segments オプションを使用します。これは、ネット名 を最小文字数で表示するので、デバッグ文を表示する際に有益です。
select_objects [get_nets -top_net_of_hierarchical_group -segments -of
$mypin]
図 9: get_nets での最上位セグメント取得の例
図 10: ピンの get_nets の例
タイミング パス オブジェクト
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)"
}
プロジェクトを閉じると、すべてのオブジェクト (この場合はポート オブジェクト) が無効になるので、ポートのリス トを表示できなくなります。
デザインを閉じてからポートのリストを表示できるようにするには、dir オブジェクトの NAME プロパティを使用 して関連する port アレイを構築しておく必要があります。
foreach port [get_ports] {
set dir([get_property NAME $port]) [get_property DIRECTION $port]}
オブジェクトが無効になるもう 1 つの例は、read_checkpoint -cell <cell> コマンドを使用した後です。セル のチェックポイントが読み込まれると、デザインはバックグラウンドで再構築され、前のファーストクラスオブジ ェクトが無効になります。次のコードは、最初の read_checkpoint の後に get_cell クエリからのオブジェクトが無 効になるため、クラッシュする可能性があります。
foreach cell_hd [get_cell -hier -filter HD.RECONFIGURABLE==1] { read_checkpoint -cell $cell ...
}
コードを安全に記述するには、オブジェクトを文字列に変換します。
foreach cell_hd [get_property NAME [get_cell -hier -filter HD.RECONFIGURABLE==1]] {
read_checkpoint -cell $cell ...
}
オブジェクトのリストの処理
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}
wbArbEngine
usb_vbus_pad_1_i_IBUF_inst usb_vbus_pad_0_i_IBUF_inst usbEngine1
usbEngine0 ...
注記: 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] \ ]
コレクションと文字列表現
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 0 set_param tcl.collectionResultDisplayLimit 1000
Vivado コレクションに tcl.collectionResultDisplayLimit パラメーターで指定されている制限を超える数 のエレメントが含まれる場合、その制限数のエレメントが文字列に変換され、文字列の最後に「...」が追加されて、
元のコレクションにさらにエレメントが含まれていることが示されます。
注記: この文字列表現により元のコレクションが変更されることはなく、エレメントが失われることはありません。
注記: tcl.collectionResultDisplayLimitパラメーターは、Vivado コレクションの文字列表現にのみ適用さ れ、通常の Tcl リストの文字列表現には適用されません。
たとえば、デザインに 20000 個のインスタンスが含まれているとします。
vivado% set cells [get_cells -hier]
vivado% llength $cells 20000
vivado% set var [join $cells "\n"]
vivado% llength $var 501vivado% lindex $var end ...
出力先の指定
Vivado Design Suite Tcl コマンドの多くでは、コマンドによって返された情報を -file オプションで指定したファイ ルに含めて、ツール外で表示または処理できるようになっています。または、-return_string オプションを使用 して変数に保存可能な文字列として表示し、Vivado ツール内でさらに処理できるようになっています。
すべてのレポート コマンドで、-file オプションがサポートされています。大量の情報を出力するレポート コマン ドでは、その後の解析、デザインプロジェクトの文書サポート、またはほかの部署にダウンストリーム処理用に渡す 場合などに、ファイルに出力すると有益です。次に、ファイル出力をサポートするコマンドの一部を示します。
report_datasheet report_drc
report_power report_timing
report_timing_summary report_utilization
たとえば、report_timing コマンドの結果をファイルに記述するには、次のコマンドを使用します。
report_timing -delay_type max -file setup_violations.rpt report_timing -delay_type min -file hold_violations.rpt