FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

NVDLA Virtual Platformの試行 (2. ビルド成功 → ログイン)

この記事は 半導体・ハードウェア開発 Advent Calendar 2017 - Qiita の16日目の記事です。

Advent-Calendarを埋めてくれるかた、今からでも募集中です!是非参加してください! 私一人では、クオリティのある記事を続けられそうにありません。。。(弱音)

目次


前回の続き。前回はNVDLAをビルドしようとして、Python C APIのところで失敗したのだった。

$ make
...
[ 75%] Completed 'qbox'
[ 75%] Built target qbox
Scanning dependencies of target greenscript
[ 75%] Building CXX object libs/greenlib/greenscript/lib/CMakeFiles/greenscript.dir/__/src/greenscript.cpp.o
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In constructor ‘gs::script::GreenScriptModule::GreenScriptModule(sc_core::sc_module_name, const char*)’:
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:178:39: error: ‘PyString_FromString’ was not declared in this scope
   name_py = PyString_FromString(name());  // new ref
                                       ^
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘void gs::script::GreenScriptModule::load(const char*)’:
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:221:46: error: ‘PyString_AsString’ was not declared in this scope
       std::string s(PyString_AsString(path_py));
                                              ^
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘void gs::script::GreenScriptModule::add_to_pythonpath(const char*)’:
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:262:47: error: ‘PyString_FromString’ was not declared in this scope
   PyObject *path_py = PyString_FromString(path);  // new ref
                                               ^
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp: In member function ‘bool gs::script::GreenScriptModule::private_load(const char*)’:
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:278:68: error: ‘PyFile_FromString’ was not declared in this scope
   PyObject* PyFileObject = PyFile_FromString((char *)fullname, mode);
                                                                    ^
In file included from /usr/include/python3.7m/Python.h:116:0,
                 from /home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:38:
/home/msyksphinz/work/nvdla_vp/libs/greenlib/greenscript/src/greenscript.cpp:279:56: error: ‘PyFile_AsFile’ was not declared in this scope
   PyObject *ret = PyRun_File(PyFile_AsFile(PyFileObject),
                                                        ^
/usr/include/python3.7m/pythonrun.h:146:23: note: in definition of macro ‘PyRun_File’
     PyRun_FileExFlags(fp, p, s, g, l, 0, NULL)

どうもPython2.7とPython3系でこのあたりのAPIが異なっているらしい。ソースコードを書き換えることも考えたが、Python 2.7で存在している関数を、Python 3.5のどの関数に置き換えていいのかわからなかったためとりあえずあきらめて、システム上からPython 3.5のパッケージを削除することで対応することにした。

sudo apt purge libpython3-dev libpython3

これで再度リポジトリをクリーンにして、再ビルドした。

cd nvdla_vp
git clean -fdx
CXX=/usr/bin/g++-5 cmake -DCMAKE_INSTALL_PREFIX=build -DSYSTEMC_PREFIX=/usr/local/systemc-2.3.0/ -DNVDLA_HW_PREFIX=/home/msyksphinz/work/nvdla_hw -DNVDLA_HW_PROJECT=nv_full
make

Linuxカーネルのビルド

QEMU上で動作するARMで動く、Linuxカーネルを用意しなければならない。この方法もすべてNVDLA Virtual Platformのページに解説されているのでこのまま実行する。

Buildrootのダウンロードでは、LTSパッケージではなく、Latest Stable Releaseの方をダウンロードする方が確実だ。

ダウンロードして、ビルドを行う。make menuconfigの実行の際は指示書の通りに設定を行うこと。

wget https://buildroot.org/downloads/buildroot-2017.11.tar.bz2
tar jxf buildroot-2017.11.tar.bz2
make qemu_aarch64_virt_defconfig
make menuconfig
make -j4

make menuconfigの設定は以下の通り。

* Target Options -> Target Architecture -> AArch64 (little endian)
* Target Options -> Target Architecture Variant -> cortex-A57
* Toolchain -> Custom kernel headers series -> 4.13.x
* Toolchain -> Toolchain type -> External toolchain
* Toolchain -> Toolchain -> Linaro AArch64 2017.08
* Toolchain -> Toolchain origin -> Toolchain to be downloaded and installed
* Kernel -> () Kernel version -> 4.13.3
* Kernel -> Kernel configuration -> Use the architecture default configuration
* System configuration -> Enable root login with password -> Y
* System configuration -> Root password -> nvdla
* Target Packages -> Show packages that are also provided by busybox -> Y
* Target Packages -> Networking applications -> openssh -> Y

f:id:msyksphinz:20171215231311p:plain

makeを実行すると、約10~15分程度でビルドが完了した。

f:id:msyksphinz:20171215231823p:plain

カーネルイメージの実行

QEMUでビルドしたLinuxカーネルを実行しなければならない。 conf/aarch64_nvdla.luaを書き換えて、イメージファイルを正しくロードできるようにする。

現在、NVDLA-VPと先ほどビルドしたLinuxカーネルリポジトリの位置関係は以下のようになっている。

nvdla_vp/
├── buildroot-2017.11    # buildrootのパッケージ
...

conf/aarch64_nvdla.luaを以下のように書き換える。

diff --git a/conf/aarch64_nvdla.lua b/conf/aarch64_nvdla.lua
index 203f504..d19c331 100644
--- a/conf/aarch64_nvdla.lua
+++ b/conf/aarch64_nvdla.lua
@@ -1,6 +1,6 @@
 CPU = {
     library = "libqbox-nvdla.so",
-    extra_arguments = "-machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 1024 -kernel images/linux-4.13.3/Image --append \"root=/dev/vda\" -drive file=images/linux-4.13.3/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r -netdev user,id=user0,hostfwd=tcp::6666-:6666,hostfwd=tcp::6667-:22 -device virtio-net-device,netdev=user0"
+    extra_arguments = "-machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 1 -m 1024 -kernel /home/msyksphinz/work/nvdla_vp/buildroot-2017.11/output/images/Image --append \"root=/dev/vda\" -drive file=/home/msyksphinz/work/nvdla_vp/buildroot-2017.11/output/images/rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -fsdev local,id=r,path=.,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r -netdev user,id=user0,hostfwd=tcp::6666-:6666,hostfwd=tcp::6667-:22 -device virtio-net-device,netdev=user0"
 }

 ram = {

これでQEMUの立ち上げを実行する。

$ export SC_SIGNAL_WRITE_CHECK=DISABLE
$ ./build/bin/aarch64_toplevel -c conf/aarch64_nvdla.lua

ログイン画面が出てきた! User名: root, Password: nvdla としてログインする。 f:id:msyksphinz:20171215234828p:plain

テストがいくつか入っている。実行してみる。

# mount -t 9p -o trans=virtio r /mnt
#
# cd /mnt/tests/hello/
# ls -lt
total 20
-rw-rw-r--    1 sshd     sshd           115 Dec 13 17:32 Makefile
-rwxrwxr-x    1 sshd     sshd          9646 Dec 13 17:32 aarch64_hello
-rw-rw-r--    1 sshd     sshd           472 Dec 13 17:32 hello.c
# ./aarch64_hello
Hello World!

ちゃんと動いたね。

# cd ../nvdla_bdma_mmio
# ./aarch64_nvdla_bdma_mmio
Start programming...
Write reg 0x00004004, value 0x00000000
Write reg 0x00004000, value 0xc0000000
Write reg 0x0000400c, value 0x00000000
Write reg 0x00004008, value 0xc00017c0
Write reg 0x0000402c, value 0x00000800
Write reg 0x00004020, value 0x00000100
Write reg 0x00004028, value 0x00000800
Write reg 0x0000401c, value 0x00000100
Write reg 0x00004024, value 0x00000000
Write reg 0x00004018, value 0x00000007
Write reg 0x00004010, value 0x00000007
Write reg 0x00004014, value 0x00000003
Write reg 0x00004030, value 0x00000001
Write reg 0x00004034, value 0x00000001
Finish programming...

Get BDMA interrupt ...