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 ...
}