自分でも良く分からなくなるのでまとめておく。RISC-Vを手っ取り早くFPGAボードで動作させたいときのために、githubからいろんなビルド済みの何かをダウンロードして動作させる方法をまとめておく。
用意するもの
FPGAボード (ZedBoard, Zybo, zc706)
私はZedBoardしか持っていないのでそれで試す。
SDカード
4GBもあれば十分。
ZedBoard向けの環境を作る手順
1. RISC-Vビルド用のLinux(ゲストOS)をVirtualBox上で構築する
Vagrant上でUbuntu Linuxを構築しても良いのだけど、SDカードを認識させるのに随分苦労しているので、普通にVirtualBox上でUbuntu 16.10の環境を構築する。
ただし、僕はGUI環境が大嫌いなので、sshでmsys2からログインできるようにしておく。
SDカードが認識できることを確認しておくこと。
また、ポーテフォワーディングにより、sshでmsys2からログインできるようにしておくと作業が楽だ。
fpga-zynqというリポジトリが、githubで公開されているのでそれをcloneする。
git clone https://github.com/ucb-bar/fpga-zynq.git git submodule status cd zedboard/fpga-images-zedboard git submodule update .
2. ビルド済みバイナリをダウンロードする
一からビルドするのは面倒なので、ビルドしたものをダウンロードしてくる。
cd fpga-zynq/zedboard
make fetch-images
make fetch-riscv-linux
3. SDカードを準備しておく
lsblkで、SDカードが認識されていることを確認しておく。下記では、/dev/sdbに認識されていることが分かる。
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 46G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 4G 0 part [SWAP] sdb 8:16 1 3.7G 0 disk sr0 11:0 1 1024M 0 rom
SDカードのフォーマットとマウントをして、書き込みの準備を整えよう。fdiskを使ってSDカードのパーディションを割り当てる。特に何か設定をする必要は無い。
$ sudo fdisk /dev/sdb Welcome to fdisk (util-linux 2.27.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. コマンド (m でヘルプ): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): Using default response p. パーティション番号 (1-4, default 1): First sector (2048-7626751, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-7626751, default 7626751): Created a new partition 1 of type 'Linux' and of size 3.7 GiB. コマンド (m でヘルプ): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
lsblkをすると、sdb1が追加されていることが確認できる。
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 46G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 4G 0 part [SWAP] sdb 8:16 1 3.7G 0 disk └─sdb1 8:17 1 3.7G 0 part sr0 11:0 1 1024M 0 rom
SDカードをMSDOSでフォーマットし、必要なファイルを転送する。これはmakeで一発で出来る。
$ sudo mkfs.msdos -n LABEL1 /dev/sdb1 $ sudo mount /dev/sdb1 /media/masayuki/SDCARD $ sudo make load-sd SD=/media/masayuki/SDCARD /home/masayuki/fpga-zynq/common/load_card.sh /media/masayuki/SDCARD + cp fpga-images-zedboard/boot.bin /media/masayuki/SDCARD + cp fpga-images-zedboard/devicetree.dtb /media/masayuki/SDCARD + cp fpga-images-zedboard/uImage /media/masayuki/SDCARD + cp fpga-images-zedboard/uramdisk.image.gz /media/masayuki/SDCARD + '[' -a fpga-images-zedboard/riscv/vmlinux ']' + mkdir -p /media/masayuki/SDCARD/riscv + cp fpga-images-zedboard/riscv/vmlinux /media/masayuki/SDCARD/riscv/ + cp fpga-images-zedboard/riscv/root.bin /media/masayuki/SDCARD/riscv/ $ sudo umount /media/masayuki/SDCARD
4. ZedBoardでLinuxを起動する
SDカードを取り出し、ZedBoardに挿入して、SDカードからブートするモードに切り替えて起動する。
TeraTermから起動する様子を観察する。ビットレートは115200に設定しておく。
放っておくとLinuxが起動する。ユーザ名root, パスワードrootでログインできる。
5. fesvr-pkのテスト
まずは、fesvr-pkという、RISC-Vを制御するためのフロントエンドのテストだ。
root@zynq:~# ./fesvr-zynq pk hello hello!
hello!と表示されたOKだ。
5. ZedBoardでRISC-V Linuxを起動する。
まずは、SDカードのファイルシステムをマウントする。
root@zynq:~# mkdir /sdcard
root@zynq:~# mount /dev/mmcblk0p1 /sdcard
root@zynq:~# ./fesvr-zynq +disk=/sdcard/riscv/root.bin bbl /sdcard/riscv/vmlinux
起動した!
unameをして、確認する。
[ 0.120000] Freeing unused kernel memory: 568K (ffffffff80000000 - ffffffff8008e000) [ 0.120000] This architecture does not have kernel memory protection. / # / # uname -a Linux ucbvax 4.6.2-g8205b66 #3 Tue Sep 20 17:52:08 PDT 2016 riscv GNU/Linux / #
riscv GNU/Linuxと表示されている。OKだ。
ただし、やはりPL環境で100MHz?程度で動作しているので、動作はかなりもっさりだ。