「RocketChip on Zedboard 」 - ビルド済みイメージを使用してRISC-VのRocketChipをFPGAで動かす

# はじめに
[@a163236](https://twitter.com/a163236)です。
RISC-Vを手っ取り早くFPGA上で動かしてみたいなと思い、カリフォルニア大学バークレー校の [Rocket Chip on Zynq FPGAs](https://github.com/ucb-bar/fpga-zynq)をやってみました。2年位前のやつですしあまりやる人はいないと思いますが、皆さんの役に立てればいいなと思い、ここではその手順を記しておきます。
結果としては、**Hello WorldはできてPetaLinuxのブートも出来てriscv-linuxもブート出来ました**~~が、**riscv-linuxのログインになぜか失敗しました**。未解決です。~~ 
→ [Takaya様 @takayaZ ](https://twitter.com/takayaZ)のご教授によりriscv-linuxも使えるようになりました！


# 目次

<!-- TOC -->

- [はじめに](#はじめに)
- [目次](#目次)
- [概要](#概要)
- [準備](#準備)
- [SDカードへの書き込み](#sdカードへの書き込み)
  - [WSL でやる場合](#wsl-でやる場合)
  - [Ubuntuでやる場合](#ubuntuでやる場合)
- [ZedboardでRocketChipを動かす](#zedboardでrocketchipを動かす)
  - [TeraTermとZedboardの準備](#teratermとzedboardの準備)
  - [PetaLinuxのブート](#petalinuxのブート)
  - [riscv-linuxのブート](#riscv-linuxのブート)
- [おわりに](#おわりに)

<!-- /TOC -->


# 概要
ZedboardというXilinxのZynqが載っているFPGAボードを用いて、ビルド済みのイメージを使いRISC-V on FPGAを行う手順を記します。
結論を言うと、今回はPetaLinuxをブートして、hello worldをすることに成功しました。また、riscv-linuxも起動させることができました。

# 準備

まずはgithubのリポジトリのクローンをして、ビルド済みのイメージをゲット。
自分の環境でビルドする手間と時間がかからないのはとてもイイですね(・∀・)!!。

```
$ git clone https://github.com/ucb-bar/fpga-zynq.git
$ cd fpga-zynq/zedboard
$ make fetch-images
```

# SDカードへの書き込み

SDカードへの書き込みはWSLでやる場合と普通のUbuntuでやる場合の2通りを記しておきます。

## WSL でやる場合

msykspinzさんの[こちらの記事](https://msyksphinz.hatenablog.com/entry/2019/03/06/040000)を参考にしました。

まず、SDカードをPCに差し込みます。SDカードがE:ドライブにあるとき、

```
$ sudo mkdir /mnt/e
$ sudo mount -t drvfs E: /mnt/e
$ make load-sd SD=/mnt/e
$ sudo umount /mnt/e 
```

これでSDにイメージが書き込まれました。

## Ubuntuでやる場合

流れはWSLと同じです。
SDカードをPCに差し込みます。
まず、下のコマンドを打ってSDカードが認識されているデバイス名を確認します。

```
$ lsblk
```
私のSDカードは*mmcblk0p1*という名前で認識されていました。そしたら、その右の方にマウントポイントが書かれています。それがSDカードへのパスになります。ここでは「*SDPATH*」としておきます。

```
$ make load-sd SD=SDPATH
$ sudo umount SDPATH
```
これでSDカードにイメージが書き込まれました。

# ZedboardでRocketChipを動かす

ここからは用意したSDカードとFPGAボードを使い、ZedboardとPCをUARTを使い通信していきます。

## TeraTermとZedboardの準備

Tera TermじゃなくてもGKTtermでもターミナルでsshでもよいのですが、Tera Termを使ってやります。
まずは、FPGAの方を準備していきます。ZedboardにSDカードを挿入して、電源ケーブルとUSB UARTを接続します。UARTはPCと繋いでおきます。
また、ZedboardはSDカードから起動させるので、ジャンパを設定します。[こちらのサイト](https://fpga.kice.tokyo/board/zedsd)に分かりやすく書かれておりました。

Tera Termはシリアル通信を使い、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/96cc05eb-2084-c0db-45ab-e187ee66387a.png)

このように設定します。シリアルポート設定も下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/61d56cd5-b5f2-0930-3ceb-6719740dfb85.png)


## PetaLinuxのブート

ここまで進むと勝手に下の画像のようにログイン画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/f22c42da-745e-dba8-3ac7-9dd6796c12c7.png)

ここで、ユーザ名「root」、パスワード「root」でログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/0ce2e5e3-c9f6-60df-da4c-25592592da0c.png)

ログイン出来ました。
試しにHello Worldをしてみます。

```
root@zynq:~# ./fesvr-zynq pk hello
```
とすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/a6ff9b7f-8509-9bfd-d8e3-32233975a294.png)

Hello, World! と出すことができました。


## riscv-linuxのブート

このコマンドでriscv-linuxがブートされます。

```
root@zynq:~# ./fesvr-zynq +blkdev=buildroot.rootfs.ext2 bbl
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/2e29760e-f443-91b6-5ac4-24bce941c995.png)

この画面からバーッと色々流れていって、最終的に(うまくいけば)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/dcf142b4-b6fb-0b50-13dd-d0be6d058117.png)

このようにログイン画面となります。さきほどと同じようにユーザ名「root」パスワード「root」(**後で書きますが、このパスワードは間違いでした！**)で入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/823b2059-0913-43bc-8001-346e3786c7a3.png)

~~....入れませんでした。
全然welcomeじゃねーじゃん。~~

ここで終わっていたのですが、[Takaya様 @takayaZ ](https://twitter.com/takayaZ)からパスワードは**「sifive」**であると教わりました。

入力すると…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575388/53e9d757-892b-f493-faf7-8994bc8cab05.png)

ログインできました！！
でも# が一個出るだけなので案外地味ですね。最初できたのか分かりませんでした。
とにかく、全てうまく行ったところでこの記事を終わりにしたいと思います。

# おわりに

以前までriscv-linxを起動させることが出来なかったところ、[Takaya様 @takayaZ ](https://twitter.com/takayaZ)にパスワードを教えていただき、できるようになりました。改めて感謝いたします。
また、間違い指摘・または感想等のコメントは[私のTwitter@a163236](https://twitter.com/a163236)へDMでもしていただければ幸いです。