FPGA開発日記

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

RISC-VのRoCCアクセラレータ付きRocket-Chip構成をFPGA向けに合成する(3. アプリケーション動作)

前回作業をした、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-openmake 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  918 02:04 bin
drwxr-xr-x  2 root root 4096  918 02:04 boot
drwxr-xr-x  3 root root 4096  918 02:04 home
drwxr-xr-x  2 root root 4096  918 02:04 proc
drwxr-xr-x  2 root root 4096  918 02:04 sbin
drwxr-xr-x 10 root root 4096  918 02:04 media
drwxr-xr-x  3 root root 4096  918 02:04 lib
drwxr-xr-x  2 root root 4096  918 02:04 sys
lrwxrwxrwx  1 root root    8  918 02:04 tmp -> /var/tmp
drwxr-xr-x  8 root root 4096  918 02:04 var
drwxr-xr-x  3 root root 4096  918 02:04 dev
lrwxrwxrwx  1 root root    9  918 02:04 init -> sbin/init
drwxr-xr-x  3 root root 4096  918 02:04 mnt
drwxr-xr-x 11 root root 4096  918 02:04 usr
drwxr-xr-x 16 root root 4096  918 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を指定しなくても良いのかもしれない。

f:id:msyksphinz:20170918021226p:plain

RoCCアクセラレータを動かすプログラムもコンパイルして、アクセラレータ部を動作させた。最新デザイン向けに、物理アドレスへの変換部を除去したら、正しく動作した。 よしよし。

f:id:msyksphinz:20170918031935p:plain