NVDLAを調べていく中で、NVLDA Ver.1.0に上がってさらに、Verilatorの対応が追加されているのを発見した。 よく見たらIntegrator's Manualもアップデートされており、Verilatorでのシミュレーション方法が実行されている。
前回Verilatorでコンパイルすることが出来ず、Verilatorの「出来ないこと」なんて愚痴のような記事を書いてしまったのだが、NVIDIAさん速攻でVerilatorに対応している。 正直とても恥ずかしい限りだ。。。
Integrator’s Manual — NVDLA Documentation
マニュアル通りに進めていけばOK。Ubuntuの場合は最初にverilator
とclang
のパッケージを入れておくとすぐに進めると思う。
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 : .