Vivado 2016.3のIP Integratorの挙動が微妙に違う

FPGA

OpenCoresで公開したワイヤーフレーム3D CG IPコア(wf3d)には、ZedBoard用のVivado実行サンプル環境が含まれています。このサンプル環境は、Tclスクリプトを使ってbitstreamを生成しているのですが、Vivadoのバージョンを2016.3にアップデートするとエラーが発生しました。

3DCG IPコアとZedBoard

3DCG IPコアとZedBoard

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.2のBlock Design GUI

Vivado 2016.2のBlock Design GUI

Vivado 2016.3の結果

そして、Vivado 2016.3の結果

Vivado 2016.3のBlock Design GUI

Vivado 2016.3のBlock Design GUI

どうやら、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]

 

タイトルとURLをコピーしました