DnnWeaverをやってみる3”の続き。

「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会”では、DnnWeaver のARTY-Z7-20 への実装をやってみるというお題でやってみた。6 時間という時間の制限があったので、五里霧中だったときは苦しかったが、徐々に気が楽になり、気分が乗ってきた。それでも家でリラックスしてやっているときより気が付かない。やはり、私はハッカソンよりも家で家事をやりながら、やったほうがひらめくようだ。しかし、いろいろな方とお知り合いになれて、いろいろなお話ができたし、実りは多かったと思う。そうそれに、研究室の卒業生が来ていて、同じ班で、以前と同じように協力して課題に取り組めたのは良かった。昔を思い出した。彼がソフトウェアで、私がハードウェア担当でいろいろと実験コードを書いてもらいながら、協力してバグフィックスしていたのを思い出した。

そうそう、彼が、私のノートパソコンがarm-xilinx-eabi-gcc が動作しなかったので、直してくれた。64 ビットLinux から 32 ビットのアプリケーションが動作しない問題だと言っていたので、”64bit-Linuxで32bitバイナリ実行環境を構築”の辺りの解決策を試してくれたのだと思う。

さて、PYNQ祭り延長戦で分かったDnnWeaver の構成とその後、私が解明した事実を書いておく。

まずは、~/dnnweaver.public/fpga ディレクトリにある Makefile について。

Makefile
オプションについて書いておく。
test : iverilog でシミュレーションを行う。
ELF : ソフトウェアのコンパイルを行う。
launch : XMD でZynq に standalone.elf をダウンロードし、起動する。
つまり、DnnWeaver を動かすときは、make launch を実行すると動作させられるはずだったが、どこが悪かったのか?PYNQ祭り延長戦では、Arty-Z7-20 で動作しなかった。
Vivado での処理は、tcl/vivado_2016_2.tcl を呼び出して処理を行っている。

vivado_2016_2.tcl
PYNQ祭り延長戦では、DnnWeaver はXilinx 社のZC702 ボード用なので、Arty-Z7-20 に移行することを考えてみた。
vivado_2016_2.tcl の最初の部分で、FPGAの型番とボード・ファイルを指定している。Arty-Z7-20 に移行するには、ここを書き換える必要がある。
更に、ここを書き換えただけではだめで、その下で、

source tcl/zynq_1AXIHP0_1AXIGP0.tcl

でzynq_1AXIHP0_1AXIGP0.tcl を実行している。
これは、ブロックデザインを開いて、File メニューから Export -> Export Block Design... を選択したときに、出力される tcl ファイルそのものなので、ここで、Zynq のProcessing System がそのまま入ってしまう。よって、ここも書き換える必要があった。
DnnWeaver の tcl/vivado_2016_2.tcl を引用する。
996abcd4.png


上の vivado_2016_2.tcl から下へ書き換えた。
まずは、FPGA はZC702 の484 ピンから 400 ピンに書き換える必要がある。
次に、Arty-Z7-20 のボード・ファイルをDigilent から持ってきて、Vivado 2016.2 にインストールした。それで、ボード・ファイルの行を書き換えている。ポイントは xilinx.com から digilentinc.com に書き換えて、バージョン番号を 1.0 にすることだった。
次に、zynq_1AXIHP0_1AXIGP0.tcl の代わりに、Arty-Z7-20 用の zc702.tcl を作ったので、それを実行するように書き換えた。zc702.tcl の出力方法については後述する。
DnnWeaver の tcl/vivado_2016_2.tcl を引用してArty-Z7-20 用に書き換えた。
ced6a14f.png


zc702.bd
zc702.bd を Arty-Z7-20 用に変更する。すでにDigilent 社のボード・ファイルをVivado 2016.2 に入れてあるものする。
Vivado 2016.2 を起動して、~/dnnweaver.public/fpga/vivado/dnnweaver.xpr を読み込ませる。
Vivado のGUI 画面を示す。ZC702 用に設定されている。
5ba99899.png


Preject part の ZYNQ-7 ZC702 をクリックして、Arty-Z7-20 に変更しよう。
クリックすると、Project Settings ダイアログが表示される。右の・・・ボタンをクリックして、Arty-Z7-20 に変更した。これでOK ボタンをクリックする。
fc9e8524.png


これでボード・ファイルをArty-Z7-20 に変更できた。IP のアップグレードを求められるので、行う。
それでもZynq のProcessing System は更新されていない。更新するためには、いったん削除して、もう一度、Add IP する必要がある。
b2062a15.png


Arty-Z7-20 用のZynq のProcessing System を追加したら、S_AXI_HP0 interface のチェックボックスにチェックを入れる。
c9cb406e.png


次に、PL Fabric Clocks の FCLK_CLK0 にチェックを入れる。
5aad96de.png


これでブロックデザインが完成した。
次に、このブロックデザインを生成するためのTCL スクリプトを生成しよう。
File メニューから Export -> Export Block Design... を選択すると、Export Block Design ダイアログが表示される。この際に、ブロックデザイン名の TCL スクリプトが生成される。名前が気に入らなければ、名前を変更する。
ab2f61be.png


このように、Arty-Z7-20 用に変更されたブロックデザイン生成用 tcl ファイルを得ることができた。
tcl/vivado_2016_2.tcl はすでに zc702.tcl が動作するように書き換えてある。

これで、もう一度、make を行うと Arty-Z7-20 用に変更されてビルドを行うことができた。
PYNQ祭り延長戦では、VirtualBox 上のUbuntu 16.04 から make launch を行って、接続されたArty-Z7-20 を動作させようとしたが、うまく動作しなかった。
そこで、/fpga/synthesis-output ディレクトリをUSB メモリにコピーして、Windows 10 のVivado SDK でプロジェクトを作成した。
.hdf ファイルを読み込むと SDK のハードウェア・プラットフォームが生成できる。詳しくは、FPGAプログラミング大全 Xilinx編の巻末の説明を参照のこと。
SDK のプラットフォームに standalone プロジェクトを作成して、~/dnnweaver.public/fpga/arm_software/src/standalone.c, platform.c と ~/dnnweaver.public/fpga/arm_software/lib の platform.h, platform_config.h などをコピー & ペーストをしてアプリケーション・プロジェクトを作成した。それをデバックモードで動作させたが、どこかのレジスタが 0xdeadbeef で動作しなかった。残念。
SDK は他の人に任せたので、詳しい説明になっていない。
次は、Vivado のGUI でインプリメントできたので、それをブログに書いておこうと思う。