これまだVivadoのプロジェクトの生成方法や、SDKの処理などについてtcl化する方法について調査してきた。
いろいろ試して、結局以下のQiitaの方法に則るのが一番いいという結論に至った。
この中で、VivadoのブロックデザインはGUIで操作したものをtclに書き出し、それをCUIでスクリプト化するときはインポートするという手法を取っている。
ブロックデザインというのはこういうのだ。Zynqとその周辺の接続関係を設計できるツールで、新しいIPを追加するとこのGUIを使用してモジュール間を接続する。
この例では、変数 design_bd_tcl_file にファイル名が設定されていた場合、ファイルセット sources_1 に Block Design を追加して、さらにラッパーファイルも生成します。
一応、ADIのプロジェクトを見るとここもスクリプト化できるようだ。ADIのスクリプトをインポートしても良いので、これもtcl化しておきたい。
ADI Reference Designs HDL User Guide [Analog Devices Wiki]
ADIのブロックデザイン生成スクリプト
まずは、ADIのzed_system_bd.tcl
を見てみよう。これがZedBoard向けにブロックデザインを生成するスクリプトだ。
tclを読み解くには、Vivadoの “Vivado Design Suite Tcl Command Reference Guide” を参照しよう。
- Vivado Design Suite Tcl Command Reference Guide
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/ug835-vivado-tcl-commands.pdf
create_bd_port
ブロックデザインに対してポートを作成する。外部ポートなど、ZedBoardの外に出すポートを作成する。
create_bd_port -dir O spi0_csn_2_o create_bd_port -dir O spi0_csn_1_o create_bd_port -dir O spi0_csn_0_o create_bd_port -dir I spi0_csn_i create_bd_port -dir I spi0_clk_i ...
create_bd_cell
ブロックデザインに対してIPをインスタンスする。必要なIPをインスタンスしていく。
set axi_iic_main [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_iic:2.0 axi_iic_main] ... set axi_hdmi_core [create_bd_cell -type ip -vlnv analog.com:user:axi_hdmi_tx:1.0 axi_hdmi_core] ...
ad_connect
これはADIが用意しているサポート関数のようだ。定義を見てみると、いくつかの指定タイプによって、Vivadoの関数connect_bd_xxx
を使うかを決定している。さらにどうもポートのDirectionは関係ないようだ。
ad_connect sys_cpu_clk sys_ps7/FCLK_CLK0 ad_connect sys_200m_clk sys_ps7/FCLK_CLK1 ad_connect sys_cpu_reset sys_rstgen/peripheral_reset ad_connect sys_cpu_resetn sys_rstgen/peripheral_aresetn ... ad_connect sys_cpu_clk axi_hdmi_core/vdma_clk ...
例えば、ad_connect sys_cpu_clk sys_ps7/FCLK_CLK0
でまずは sys_ps7/FCLK_CLK0
から sys_cpu_clk
という仮想のクロック配線へと接続し、次に ad_connect sys_cpu_clk axi_hdmi_core/vdma_clk
で sys_ps7/FCLK_CLK0
から axi_hdmi_core/vdma_clk
への接続が完成している。
ブロックデザインでその様子を見ると以下のようになっている。
これらをスクリプトを組み込み、まずはZynqのブロックデザインを構成した。
$ make impl vivado -mode batch -source create_project.tcl > adv7511_create_zed_hdf.log 2>&1 vivado -mode batch -source implementation.tcl > adv7511_impl_zed_hdf.log 2>&1
合成結果は、無事にブロックデザインが生成されている。