Zynq のビルドプロセスをスクリプト化する
Zynq の話なんですが、そこそこ慣れてくると、Vivado や XSDK の GUI が使いにくく思えてきます。
GUI というのは、最初は何となくわかりやすいような印象を与えるが、ある程度使いこなせるようになると、 CUI の方がありがたいです。
基本的に、開発中というのは「ソースコードの修正」→「ビルド」→「動作確認」の繰り返しです。
いちいち、GUI を開いて、FPGA をコンパイルしたり、ハードウェアをエクスポートして、 XSDK に食わせたりとかのルーチンワークを手動でやりたくないのです。
幸い、Vivado には Tcl インターフェースがあるので、GUI でできることは、CUI でもできるのです。
私がこれをやりたい理由を挙げると、
-
GUI は重い
-
GUI は自動実行できないので、繰り返し作業に向いていない
-
GUI は間違えやすい
チームでの開発になったりすると、中には詳しくないメンバーもいたりする。 特に Zynq はビルド手順がかなり複雑になってしまっているので、 GUI でのビルド手順を習得するには、それなりに時間がかかるし、操作ミスも発生する。 ビルドプロセスを完全にスクリプト化してしまえば、「とりあえず “make” って打っとけや」で済む。
-
GUI のプロジェクトはバージョンコントロール(git) での管理が難しい
バージョン管理をせずに仕事を進めるというのは、恐ろしいことである。 これをしないと、ソースを過去に戻したり、開発プロセスを他のメンバーと共有できない。 しかしながら、Vivado のプロジェクトとバージョン管理は相性が悪い、 というかそもそもバージョン管理のことを考えてないんじゃないかと思う。
FPGA の時はプロジェクトが管理するのは RTL と制約ファイルぐらいだったから、 RTL と 制約ファイルをバージョン管理して、プロジェクトはその都度、再構築すればよかった。 しかし、Zynq の場合は、ARM 周りの設定とか、IP 間の接続とか、いろんなものがプロジェクトで管理されている。 プロジェクト自体を git に登録するのは、一体何がソースで、 何がジェネレートされたファイルなのかよくわからないので無理がある。
そこで、RTL や 制約ファイルとともに Vivado を制御するスクリプトを Tcl で書き、これらを git で管理することにした。
なに、大した知識は必要ない。
Tcl の初歩的な文法がわかればよい。(知らなくても 半日もあれば勉強できる。)
あとは、Vivado をコントロールするコマンド群だが、これも簡単にわかる。
Vivado を起動した時に、カレントディレクトリに .jou
という拡張子のファイル
(Journal File) が作られるが、このファイルに、 Vivado が実行した操作が Tcl のコマンドとして記録されていく。
なので、知りたいコマンドがあるときは、GUI から一度実行してみて、Journal File
を見れば、対応するコマンドが一目瞭然なのだ。
例えば、プロジェクトを作成するのは create_prj
だし、RTL を追加するには
import_files
、合成は launch_runs systh_1
でよいというのがわかる。
詳しいコマンドの意味を調べたいときは “Vivado Design Suite Tcl Command Reference Guide” というドキュメントがある。
そんな感じで、プロジェクト作って、RTL と 制約ファイル追加して、合成して、配置配線して、 Bit ファイル作って、HW 情報をエクスポートして、なんてのをスクリプトで組んでいけばよい。
あとは Block Design だが、これも Tcl スクリプト化できる。
Block Design を開いた状態で、 Vivado のメニューから 「File → Export → Export Block Design…」
を選べば、Tcl スクリプトに出力できる。
Block Design を Tcl からプロジェクトへリストアするには、その Tclスクリプトを
source
で読み込んで save_bd_design
でよい。
このようにして組んだ Tcl スクリプトをバッチモードで実行するには以下のようにする。
$ vivado -mode batch -source <tcl_file>
これで、Vivado の GUI を開く必要がなくなった。 GUI を使うのは Block Design を編集するときぐらいである。
さらには Makefile も作って、FSBL, U-Boot, Linux など他のコンポーネントも自動でビルドするようにして、 XMD からブートさせるところまで、自動化してしまいます。
このようにして作った、非常に軽量な完全自動化プロジェクトを git で履歴管理します。快適です。
PetaLinux も Xilinx が用意してくれているオールインの環境(あまり詳しくない)だと思うが、こちらはかなり重そう。。
blog comments powered by Disqus