FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

NVIDIAのディープラーニングアクセラレータNVDLAをVivadoでシミュレーションする

関連記事一覧

NVIDIAのリリースしている、ディープラーニングアクセラレーションハードウェアのNVDLAは、実行環境としてはSynopsys社のVCSを前提として構築してあり、VCSを持っていない私のような貧乏人ではなかなかトライすることができない。

github.com

Integrator’s Manual — NVDLA Documentation

This target will just generate and execute the VCS compile command line. If test bench code is changed, this target is used to recompile and generated the VCS based simulation executable.

しかし、NVDLAのPull RequestのなかでVivado Simで動かすことができるようにインポートしたものを見つけた。これならば、貧乏人の私でもできそうだ。

NVDLAの内部動作について理解をするのが先だろうが、とりあえず何かしらシミュレーションできるものが欲しい。

github.com

Vivado SimulatorでNVDLAを動作させる

この環境はあくまでPull Requestされているもので本家にマージされているわけではないため、試行版であることに注意。 Forkされた環境から、NVDLAをCheckoutしてくる。

git clone https://github.com/nvdla/hw.git nvdla_hw
cd nvdla_hw
git remote add xalogic-linus https://github.com/xalogic-linus/hw.git
git fetch xalogic-linus
git checkout xalogic-linus

NVDLAの環境を構築するのはちょっと面倒くさい。まずは http://nvdla.org/integration_guide.html を参考に、環境を構築する。

CentOS 7.0で実行しているのだが、まずはPerlのパッケージインストールが必要だ。

sudo yum install perl-IO-Tee
cd nvdla_hw
make

ここでいくつかの質問に答える。GCCの場所とか、Javaの場所、Perlの場所などを入力すればよい。 次に、以下でRTL環境をビルドすることができる。

./tools/bin/tmake -build vmod

outdirというディレクトリができるので、これがおそらくコンフィグレーションを指定しているものと思われる。まだ詳細は不明。

$ tree -L 2 outdir/
outdir/
├── build.log
├── nv_large
│   ├── spec
│   └── vmod
└── nv_small
    ├── spec
    └── vmod

6 directories, 1 file

マニュアルでは次に ./tool/bin/tmake -build verif_sim を実行すると書いてあるが、これを実行するとVCSが動き始めてしまうので、Vivado Simulator用のディレクトリに移動してシミュレーションを実行する。

cd verif/sim_vivado
make run TESTDIR=../traces/traceplayer/googlenet_conv2_3x3_int16

とすると、何やらいろいろアクセスのログを吐き出しながらVivado Simulatorでの実行が始まる。 AXI経由でのアクセスのログが表示されているようだ。

#-----------------------------------------------------------
# xsim v2017.2 (64-bit)
# SW Build 1909853 on Thu Jun 15 18:39:10 MDT 2017
# IP Build 1909766 on Thu Jun 15 19:58:00 MDT 2017
# Start of session at: Tue Nov 21 17:46:20 2017
# Process ID: 4868
# Current directory: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16
# Command line: xsim -log test.log -mode tcl -source {xsim.dir/work.top/xsim_script.tcl}
# Log file: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/test.log
# Journal file: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/xsim.jou
#-----------------------------------------------------------
source xsim.dir/work.top/xsim_script.tcl
# xsim {work.top} -testplusarg input_file=/home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/input.txn -testplusarg input_dir=/home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16 -autoloadwcfg
-runall
Vivado Simulator 2017.2
Time resolution is 1 ps
run -all
10570.00ns MSEQ: Backdoor mem_load of file                           0.raw2 at address 0x50064080 for length 0x0000b480.
10650.00ns MSEQ: Backdoor mem_load of file                           1.raw2 at address 0x5002dfe0 for length 0x00036000.
10730.00ns MSEQ: Backdoor mem_load of file                           2.raw2 at address 0x500000e0 for length 0x0002da80.
10810.00ns MSEQ: write_cmd address 0xffff2c01 with data 0x00000000 (command 4294967295)
11610.00ns MSEQ: Write (command 4294967295) completed (addr: 0xffff2c01, data: 0x00000000.
11690.00ns MSEQ: read_cmd address 0xffff2c01 with data 0x00000000 and mask 0x00010001 (command 0)
12490.00ns MSEQ: Read (command 0) matched (addr: 0xffff2c01, received data: 0x00000000, expected data: 0x00000000.
...

シミュレーションが終了するまでに、Vivado Simulatorでは30分以上かかった。VCSだともっと速いのだろうが。。。

GoogleNet 以外にも、 cc_alexnet_conv5_relu5_int16_dtest_cvsram を指定すればAlexNetを実行するができる、いくつかのSanity Checkも実行できる。

make run TESTDIR=../traces/traceplayer/cc_alexnet_conv5_relu5_int16_dtest_cvsram
make run TESTDIR=../traces/traceplayer/sanity

NVDLAの仕組みについては、別エントリでまとめていこう。とりあえず、シミュレーションを実行する環境は整った。