前回作業をした、RISC-VのRocket Chipで、FPGAにRoCCアクセラレータ付きの実装をインプリメンテーションする作業、前回までは、 一応ブートまで進んだものの、何故かアプリケーションが動作せず、作業が止まってしまっていた。
そこで、もっとお気楽なビルド方法として、makeだけで実行する方法がある。つまり、fpga-zynq
のリポジトリで、
cd zedboard make CONFIG=ZynqRoccConfig
とするだけだ。こうすることで、zedboard_rocketchip_RoccZynqConfig
ディレクトリから作成され、fpga-images-zedboard
ディレクトリにSDカードにダウンロードするファイルが生成される。
これをSDカードに再度ダウンロードし、ZynqでLinuxを起動した。
sudo mount /dev/sdb1 /mnt/ZED_ROOT/
sudo cp -r fpga-images-zedboard/* /mnt/ZED_ROOT/
sudo umount /mnt/ZED_ROOT
無事に動作する構成を用意できたようだ。
root@zynq:~# ./fesvr-zynq pk hello hello!
次に、オリジナルのアプリケーションを動作させる準備をしよう。
RISC-V動作用のSDカードに新しいファイルを追加するためには、先ほどのリポジトリ内でzedboard
に移り、make ramdisk-open
やmake ramdisk-close
を使って、ファイルシステムを編集する。
make ramdisk-open mkdir ramdisk dd if=fpga-images-zedboard/uramdisk.image.gz bs=64 skip=1 | \ gunzip -c | sudo sh -c 'cd ramdisk/ && cpio -i' [sudo] msyksphinz のパスワード: 127899+1 レコード入力 127899+1 レコード出力 8185554 bytes (8.2 MB, 7.8 MiB) copied, 8.89832 s, 920 kB/s 35892 ブロック
これで、ramdisk
ディレクトリ内でファイルシステムを編集できるようになった。
$ cd ramdisk/ $ ls -lt 合計 52 drwxr-xr-x 2 root root 4096 9月 18 02:04 bin drwxr-xr-x 2 root root 4096 9月 18 02:04 boot drwxr-xr-x 3 root root 4096 9月 18 02:04 home drwxr-xr-x 2 root root 4096 9月 18 02:04 proc drwxr-xr-x 2 root root 4096 9月 18 02:04 sbin drwxr-xr-x 10 root root 4096 9月 18 02:04 media drwxr-xr-x 3 root root 4096 9月 18 02:04 lib drwxr-xr-x 2 root root 4096 9月 18 02:04 sys lrwxrwxrwx 1 root root 8 9月 18 02:04 tmp -> /var/tmp drwxr-xr-x 8 root root 4096 9月 18 02:04 var drwxr-xr-x 3 root root 4096 9月 18 02:04 dev lrwxrwxrwx 1 root root 9 9月 18 02:04 init -> sbin/init drwxr-xr-x 3 root root 4096 9月 18 02:04 mnt drwxr-xr-x 11 root root 4096 9月 18 02:04 usr drwxr-xr-x 16 root root 4096 9月 18 02:04 etc
/home/root/
に必要なファイルを移動しよう。今回はベンチマーク測定に使用した、dhrystone.riscv
を格納した。
sudo cp /home/msyksphinz/work/rocket-chip-msyksphinz/riscv-tools/riscv-tests/benchmarks/dhrystone.riscv home/root/
ファイルの編集を終えると、make ramdisk-close
を使ってramdiskを再生成する。
$ make ramdisk-close sh -c 'cd ramdisk/ && sudo find . | sudo cpio -H newc -o' | gzip -9 > uramdisk.cpio.gz 35892 ブロック mkimage -A arm -O linux -T ramdisk -d uramdisk.cpio.gz fpga-images-zedboard/uramdisk.image.gz Image Name: Created: Mon Sep 18 02:07:26 2017 Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 8185517 Bytes = 7993.67 kB = 7.81 MB Load Address: 00000000 Entry Point: 00000000 rm uramdisk.cpio.gz Don't forget to remove ramdisk before opening it again (sudo rm -rf ramdisk)
再度SDカードに内容をコピーする。
sudo mount /dev/sdb1 /mnt/ZED_ROOT/
sudo cp -r fpga-images-zedboard/* /mnt/ZED_ROOT/
sudo umount /mnt/ZED_ROOT
再びSDカードを起動し、早速プログラムを実行してみよう。
root@zynq:~# ./fesvr-zynq pk hello hello! root@zynq:~# ./fesvr-zynq dhrystone.riscv Microseconds for one run through Dhrystone: 688 Dhrystones per Second: 1451 mcycle = 344442 minstret = 201031
Dhrystoneが動いた!これ、pk
を指定するかしないかの違いがまだはっきりとは分かっていないのだけれどもpk(proxy kernel)の部分はDhrystone(つまりベンチマークで使用しているプログラム)はあらかじめすべてバイナリに含んでしまっているものと思われる。だから、pkを指定しなくても良いのかもしれない。
RoCCアクセラレータを動かすプログラムもコンパイルして、アクセラレータ部を動作させた。最新デザイン向けに、物理アドレスへの変換部を除去したら、正しく動作した。 よしよし。