OpenCoresで公開したワイヤーフレーム3D CG IPコア(wf3d)には、ZedBoard用のVivado実行サンプル環境が含まれています。このサンプル環境は、Tclスクリプトを使ってbitstreamを生成しているのですが、Vivadoのバージョンを2016.3にアップデートするとエラーが発生しました。
Vivado 2016.3のエラー
Vivado 2016.3を実行すると、論理合成で次のようなエラーが発生します。
WARNING: [Vivado 12-818] No files matched './polyphony.srcs/sources_1/bd/zed_bas e/ip/zed_base_rst_processing_system7_0_50M_0/zed_base_rst_processing_system7_0_5 0M_0_board.xdc' ERROR: [Common 17-55] 'set_property' expects at least one object. Resolution: If [get_<value>] was used to populate the object, check to make sure this command returns at least one valid object.
zed_base_rst_processing_system7_0_50M_0_board.xdcというファイルが読み込めないために、エラーが発生しているようです。
Vivado 2016.2と2016.3のIP Integratorの違い
Vivado 2016.2とVivado 2016.3のIP Integratorの結果をGUIで確認してみます。
Vivado 2016.2の結果
まず、Vivado 2016.2の結果
Vivado 2016.3の結果
そして、Vivado 2016.3の結果
どうやら、Processor System Resetのモジュール名がrst_processing_system7からrst_ps7に変わったようです。このため、Tclスクリプト中で指定したファイルが見つからず、エラーが発生していました。
しかし、Vivado 2016.2と2016.3の違いはこれだけではないようで、Vivado 2016.3では次のようなワーニングが論理合成中に表示されます。
CRITICAL WARNING: [BD 41-1715] Block design 'zed_base.bd' is set for out-of-cont ext synthesis mode Hierarchical (Out of context per IP). This is not supported i n a non-project flow and will be ignored. Please set the mode to None (Global Sy nthesis), or use Save Project As to save your work in a project flow to use this mode.
Block DesignのモードをNone(Global)に設定する必要があるようです。この設定を行わないと、Block Designで使用しているIPコアの関連ファイルが生成されないようです。
解決方法
Tclスクリプトに次の変更を行うことで、Vivado 2016.3でも正しくbitstreamを生成できるようになりました。
- Block Designへのプロパティ追加
- Vivadoのバージョンに応じてProcessor System Resetの名前を変更
Block Designへのプロパティ追加
次のようにTclスクリプトを変更します。Vivadoのバージョンが2016.3以上の場合、synth_checkpoint_mode Noneを設定してからgenerate_targetとexport_ip_user_filesを実行します。
# version check if {[expr [version -short]] >= 2016.3} { set_property synth_checkpoint_mode None [get_files ${BD_DIR}/${BD_NAME}.bd] } generate_target -force all [get_files ${BD_DIR}/${BD_NAME}.bd] export_ip_user_files -of_objects [get_files ${BD_DIR}/${BD_NAME}.bd] -no_script -force -quiet
Vivadoのバージョンに応じてProcessor System Resetの名前を変更
Vivadoのバージョンが2016.3以上の場合、Processor System Resetの名前をrst_processing_system7からrst_ps7に変更します。
# version check if {[expr [version -short]] >= 2016.3} { set PS7 ps7 } else { set PS7 processing_system7 } set XDC_LIST "\ ${PROJ_DIR}/${PROJ_NAME}.srcs/sources_1/bd/zed_base/ip/zed_base_processing_system7_0_0/zed_base_processing_system7_0_0.xdc \ ${PROJ_DIR}/${PROJ_NAME}.srcs/sources_1/bd/zed_base/ip/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0_board.xdc \ ${PROJ_DIR}/${PROJ_NAME}.srcs/sources_1/bd/zed_base/ip/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0.xdc \ " foreach i $XDC_LIST { set_property used_in_implementation false [get_files -all ${i} ] }
# version check if {[expr [version -short]] >= 2016.3} { set PS7 ps7 } else { set PS7 processing_system7 } read_xdc -prop_thru_buffers -ref zed_base_rst_${PS7}_0_50M_0 ${BD_IP_DIR}/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0_board.xdc set_property processing_order EARLY [get_files ${BD_IP_DIR}/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0_board.xdc] read_xdc -ref zed_base_rst_${PS7}_0_50M_0 ${BD_IP_DIR}/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0.xdc set_property processing_order EARLY [get_files ${BD_IP_DIR}/zed_base_rst_${PS7}_0_50M_0/zed_base_rst_${PS7}_0_50M_0.xdc]