AR# 51444

Vivado - delete_run コマンドのある Tcl ループが原因でプログラム異常停止になる (EXCEPTION_ ACCESS_ VIOLATION)

説明

プロジェクトを作成し、合成を実行し、インプリメンテーションを実行するためのスクリプトがあります。このスクリプトには、既存 run を消去するための次のようなループがあります。

foreach run_name $previous_runs {
delete_run -quiet ${run_name}
  file delete -force ${run_name}
}

スクリプトを実行すると、エラーが発生して次のようなエラー メッセージが表示されます。

Abnormal program termination (EXCEPTION_ACCESS_VIOLATION)

この問題の回避策を教えてください。

ソリューション

この使用例では、前回の run が Tcl スクリプトによって削除されるので、ヌル ポインターとなり、ツールがクラッシュしてしまいます。

2 番目の反復は次のとおりです。

delete_run
foreach run_name $previous_runs {
    delete_run -quiet ${run_name}
    file delete -force ${run_name}
}

このスクリプトの previous_runs にはオブジェクトの synth_1impl_1 が含まれています。つまり、最初の delete_runsynth_1 が削除されるため、impl_1 も削除されてしまうことになります。 2 番目の反復で、run_name は不正ポインターとなり、ツールがクラッシュします。

目的の動作は、次のようにスクリプトを記述すると得られます。

set previous_syn_runs [get_runs -filter {IS_SYNTHESIS==1}] foreach syn_run_name $previous_syn_runs {
    #Check that the run still exists and was not deleted as a by product
    #of deleting another run.
    if {[lsearch [get_runs] ${syn_run_name}] != -1} {
        delete_run -quiet ${syn_run_name}
        file delete -force ${syn_run_name}
    }
}

また、reset_run を実行して run ディレクトリを消去することもできますが、run 名は GUI に残ります。

注記 : Vivado Design Suite 2013.4 では、delete_run コマンドが delete_runs に変更されています。Vivado 2013.4 およびそれ以降のツール バージョンでは、すべての run を消去するには detele_runs $all_runs の実行を推奨します。

AR# 51444
日付 01/15/2014
ステータス アクティブ
種類 一般
ツール