FPGA開発日記

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

NVDLA 1.0 がVerilatorに対応している(が、ビルドできるのは潤沢な資源を持つ金持ちだけ)

f:id:msyksphinz:20171202221951p:plain

NVDLAを調べていく中で、NVLDA Ver.1.0に上がってさらに、Verilatorの対応が追加されているのを発見した。 よく見たらIntegrator's Manualもアップデートされており、Verilatorでのシミュレーション方法が実行されている。

前回Verilatorでコンパイルすることが出来ず、Verilatorの「出来ないこと」なんて愚痴のような記事を書いてしまったのだが、NVIDIAさん速攻でVerilatorに対応している。 正直とても恥ずかしい限りだ。。。

Integrator’s Manual — NVDLA Documentation

マニュアル通りに進めていけばOK。Ubuntuの場合は最初にverilatorclangのパッケージを入れておくとすぐに進めると思う。

git clone https://github.com/nvdla/hw.git nvdla_hw
cd nvdla_hw
make

その後、以下を実行する。するとVerilatorがコンパイルを実行する。 私の実行環境ではメモリ8GBを食いつぶし、猛烈なHDDアクセスが入るので注意。 VirtualBoxを巻き込んで一度落ちてしまった。

./tools/bin/tmake -build verilator

よく見ると、Integrator's Manualには、

The Verilated testbench cannot be built with GCC, because the generated C++ source is too big.) 
Additionally, ensure that your system has enough memory to build the testbench; depending on your version of Verilator, 
you will need a 64-bit system with up to 20GB of RAM (some cases have been noted in which the requirements are even higher

20GB!?マジか。急遽別の実験用マシンを調達して16GBのメモリを確保した。16GBだとビルドに成功した。Verilatorも、メモリを潤沢に持っていないと動かせない高尚な遊びのようだ。

早速、./verif/verilator/に移動してシミュレーションを実行する。以下がsanity0を動作させた結果だ。ちゃんと動いている。

$ make run TEST=sanity0
rm -rf ../../outdir/nv_full/verilator/test/sanity0/trace.bin
mkdir -p ../../outdir/nv_full/verilator/test/sanity0/
/usr/bin/perl input_txn_to_verilator.pl ../../verif/traces/traceplayer/sanity0 ../../outdir/nv_full/verilator/test/sanity0/trace.bin
converting ../../verif/traces/traceplayer/sanity0/input.txn to ../../outdir/nv_full/verilator/test/sanity0/trace.bin
cd ../../outdir/nv_full/verilator/test/sanity0 && ../../VNV_nvdla trace.bin
CMD: read_reg ffff100b ffffffe0 00000000
CMD: write_reg ffff100b f0a5a500
CMD: read_reg ffff100b ffffffe0 f0a5a500
CMD: done
reset...
letting buffers clear after reset...
running trace...
(8272) read from nvdla: addr ffff100b
(8308) read response from nvdla: 00000000
(8310) write to nvdla: addr ffff100b, data f0a5a500
(8312) read from nvdla: addr ffff100b
(8348) read response from nvdla: f0a5a500
done at 8750 ticks
*** PASS

cc_alexnet_conv5_relu5_int16_dtest_cvsram, googlenet_conv2_3x3_int16はFailしてしまった。それ以外のパタンはPassしたみたいだ。 Vivado SimulatorではすべてPassすることができる。VerilatorではAlexNetとGoogleNetがFailだ。

  • Verilatorでの実行結果
$ for dir in `ls -1 ../traces/traceplayer/`; do echo -n ${dir} " : "; make run TEST=${dir} | grep -e PASS -e FAIL; done
cc_alexnet_conv5_relu5_int16_dtest_cvsram  : *** FAIL: test failed due to CSB read mismatch
conv_8x8_fc_int16  : *** PASS
googlenet_conv2_3x3_int16  : *** FAIL: test failed due to CSB read mismatch
pdp_max_pooling_int16  : *** PASS
sanity0  : *** PASS
sanity1  : *** PASS
sanity1_cvsram  : *** PASS
sanity2  : *** PASS
sanity2_cvsram  : *** PASS
sanity3  : *** PASS
sanity3_cvsram  : *** PASS
sdp_relu_int16  : *** PASS
  • Vivado Simulatorでの実行結果
$ for dir in `ls -1 ../traces/traceplayer/`; do echo -n ${dir} " : "; make run TEST=${d
ir} | grep -e PASS -e FAIL; done
cc_alexnet_conv5_relu5_int16_dtest_cvsram  : checktest : PASSED : .
conv_8x8_fc_int16  : checktest : PASSED : .
googlenet_conv2_3x3_int16  : checktest : PASSED : .
pdp_max_pooling_int16  : checktest : PASSED : .
sanity0  : checktest : PASSED : .
sanity1  : checktest : PASSED : .
sanity1_cvsram  : checktest : PASSED : .
sanity2  : checktest : PASSED : .
sanity2_cvsram  : checktest : PASSED : .
sanity3  : checktest : PASSED : .
sanity3_cvsram  : checktest : PASSED : .
sdp_relu_int16  : checktest : PASSED : .