Vivadoでプロジェクトを作っていると、あっという間に数百MBのサイズになってしまいます。
自分で書いたソースはごくわずかなのに、XILINXが提供しているIPや一時ファイルで膨れ上がります。そのような巨大なフォルダをgitで管理するのは賢くないので、Vivadoのプロジェクト再生成できるような最小限のgitで管理するべきファイルは何かということを考えてみました。
今回のプロジェクトで使用したのは特電のArtix-7ボード。

このボードの標準デザインにはEZ-USB FX3とDDR3メモリをAXIバスでつなぐというものがあります。

このプロジェクトには以下のような要素があります。
- 自作IP (FX3インタフェース、パターンジェネレータ)
- XILINXのIP (xlconstant、clk_wizなど)
- 自分で定義したインタフェース
- ブロックデザイン
- MIG
- RTLのソースを直接ブロックデザインに貼ったもの
なお、FX3インタフェースは中でXILINXのFIFOを使っています。
☀
試行錯誤してみた結果、gitで管理するべき最小限のファイルはこうなりました。
- プロジェクトを生成するためのtclファイル (WriteTclで作成)
- 自分のIP
- RTLソース
- component.xml
- [<中のXILINX IP名>/<中のXILINX IP名>.xci]
- xgui/<IP名>_<バージョン>.tcl
- インタフェース
- <インタフェース名>.xml
- <インタフェース名>_rtl.xml
- ボードデザインのwrapper.vhd
- MIGの設定ファイル (mig_a.prj)
- ブロックデザインに直貼りするRTLソース
- 制約ファイル

たったこれだけでOKでした。
BitStreamの生成が終わった時点でのプロジェクトフォルダのサイズは200MBytesくらいあるのに対して、上記で管理しているファイルは全部で490kByteくらいなので、本質は500分の1のサイズだと言えるでしょう。プロジェクトの大半はツールが自動的に生成している一時ファイルなのです。
☀
上のファイル一覧を見ると、ブロックデザインが入っていないことに気が付くかと思います。
ブロックデザインは.bdというファイルで、中はJSON形式でセルの配置や座標などが書かれています。しかし、bdのファイルを利用するには不随するディレクトリやbxmlといったファイルも一緒になければなりません。この付随するディレクトリが大きく、100MBytesくらいになります。ファイルの種類も多くgitで管理するには不向きです。

そこで、BDを生成するTclを作ることを考えます。
その方法には2種類あって、まずはFile->Project->Write Tclを行う方法。

プロジェクトを完全に再生成してくれるTclファイルを生成してくれるのですが、オプションダイアログでCopy sources to new projectと、Recreate Block Design Using Tclのチェックを入れておくと、出来上がったtclファイルの中でBDファイルを再生成してくれるようになります。

BDを生成するもうひとつの方法は、File->Export->Export Block Designです。

これで生成されたTclファイルを、空のプロジェクトで実行するとBlock Designにいろいろな部品を配置して


このようにつないでくれます。
つまり人が手作業で行っていたことをTclで自動化し、ゼロからbdを再生成してくれるようです。
しかし、create_project.tclの読み込み時に組み込めないのと、create_project.tclを実行する前にbdが無ければならないので、とりあえずはWrite Tclの方法でやることにします。
☀
さて、Write Tclで生成したファイルの先頭を読んでみると、
# NOTE: In order to use this script for source control purposes, please make sure that the
# following files are added to the source control system:-
#
# 1. This project restoration tcl script (create_project.tcl) that was generated.
#
# 2. The following source(s) files that were local or imported into the original project.
# (Please see the '$orig_proj_dir' and '$origin_dir' variable setting below at the start of the script)
#
# "c:/Users/user/Desktop/fx3-axi-ddr/fx3-axi-ddr/fx3-axi-ddr.srcs/sources_1/bd/artsys/ip/artsys_mig_7series_0_0/mig_a.prj"
#
# 3. The following remote source files that were added to the original project:-
#
# "C:/Users/user/Desktop/fx3-axi-ddr/src/ledchika.vhd"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/bd/artsys/hdl/artsys_wrapper.vhd"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/bd/artsys/ip/artsys_mig_7series_0_0/mig_a.prj"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/config.xdc"
# "C:/Users/user/Desktop/fx3-axi-ddr/src/main.xdc"
プロジェクトの再生成に必要なファイルがすべて書かれています。つまり、これがGITで管理すればよいファイルの答えというわけです。
Vivadoのプロジェクトフォルダはいつでも全消去したいため、自分で作ったソースファイルはVivadoのプロジェクトの外に置きたいのですが、ブロックデザインはVivado管理下の<プロジェクト名>/<プロジェクト名>.srcs/sources_1/bd/<ブロックデザイン名>の下に入ってしまいます。MIGのプロジェクトはさらにその下の/ip/<Ip名>に置かれます。
したがってcreate_project.tclから再生成するとしても<プロジェクト名>/<プロジェクト名>.srcs/sources_1/・・という長ったらしいフォルダ名のファイルを管理しなければならなくなります。プロジェクトフォルダは削除される可能性があるので、そこに設定を格納しておくのはよくありません。
これはVivadoの問題点だと思うのですが、bdファイルは読み込まれた瞬間に<プロジェクト名>/<プロジェクト名>.srcs/sources_1/というフォルダにコピーされてしまうのです。このフォルダを変更するには、create_bd_designを実行するときに-dirオプションを付ければよいようなのですが、GUIからはできません。
既存のプロジェクトのBDをプロジェクト外に出すには、File->Save Block Design Asです。

これでBDデザインをプロジェクト外に出せるので、

こうしてからWrite Tclすると外に出せます。
create_projectでcreate_bd_designしているところを以下のように書き換えると、プロジェクト外にBDを持ってくれるようになりますが、
set proj_dir [get_property directory [current_project]]
create_bd_design -dir ${proj_dir}/../src/bd/ $design_name
MIGのIPは元になったMIGの設定とは別にもう一つのプロジェクトを作ってしまうので、管理がより複雑になります。

元からあったmig_7series_0_0の中身には一切触れられず、mig_7series_0_0_1の中に新しいファイルを生成していきます。スマートではありませんね。
本日のところの結論は
- ユーザIPで必要なのは、RTLソースと、xguiのtclと、component.xmlと、中のxci
- Block Designのbdファイルではなく、bdを生成するTclスクリプトをgitで管理
- Tclからbdを生成するなら個々のIPのxciは管理不要 (もちろん管理してもよい)
- BDラッパのVHDLは必要
MIG設定が変化したときにかなり面倒なことになります。やはりExport Block DesignのTclを使いこなす方法を考えたほうがスマートでしょう。
最近のコメント