フリーのRISC-VプラットフォームSiFive Freedom E310をFPGAボードArty A7に書き込む

# 記事の概要
フリーのRISC-VプラットフォームSiFive Freedom E310をFPGAボードArty A7に書き込みます。

以下のサイトにある手順に従うだけでいいはずなのですが、私は細かい点につまづいて難儀したので、同様の問題に直面した人の参考になるように作業工程を残したく思います

[https://github.com/sifive/freedomのREADME](https://github.com/sifive/freedom/blob/master/README.md)

[SiFive Freedom E310 Arty FPGA DevKitGetting Started Guide](https://static.dev.sifive.com/SiFive-E310-arty-gettingstarted-v1.0.6.pdf)

[Freedom E300 Arty DevKit でRISCVを試す](https://qiita.com/mune10/items/98a19d49bbbe14473988)

作業環境はUbuntu 18.04.3 LTSになります。
ただし、mcsファイルのFPGAボードへの書き込みにのみWindows環境を使用しました。

# FPGAボード
秋月電子で以下を購入しました。

[Ｘｉｌｉｎｘ社のＡｒｔｉｘ－７　３５Ｔを搭載したＦＰＧＡ評価キット](http://akizukidenshi.com/catalog/g/gM-14484/)

秋葉原店で直接購入される場合は、店頭には置いていないのでスタッフの方に依頼して倉庫から持ってきていただいてください。
Arty A7のFPGAボードは35Tと100Tの２種類ありますが、￥15,800の安い方の35Tを選びました。
また、間違えてArty S7を購入しないようにご注意ください。

# ダウンロード
SiFive Freedom E310をダウンロードします

```console
$ git clone https://github.com/sifive/freedom.git
$ cd freedom
```

freedomで使用するsubrepositoryをupdateします。
私の場合、toolchainの更新に１時間以上を要しました。

```console
$ git submodule update --init --recursiv
```

# 追加パッケージ
追加パッケージをインストールします。

```console
$ sudo apt update
$ sudo apt upgrade
$ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev libusb-1.0-0-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev device-tree-compiler pkg-config libexpat-dev python wget
$ sudo apt-get install default-jre
```

既にインストール済みのものは無視されるだけなので、上記コマンドをそのまま入力すれば問題ありません。

# 環境構築
sbt、varilator、scala、toolchainのriscv64-unknown-elf-gcc、vivadoをインストールしないといけないのですが、私は既に以下の手順でインストール済みなのでパスします

[Ubuntu上でのRISC-Vの環境構築](https://qiita.com/Kosuke_Matsui/items/14aadce506fe3df79600)

# ビルド
riscv64-unknown-elf-gccにパスを通します。
pathの位置が手順書と異なっているのでご注意ください。各位の環境に合わせてご変更ください。
私の場合、/opt/riscv/bin/riscv64-unknown-elf-gccなので以下を実行します

```console
$ export RISCV=/opt/riscv
```

(2019/10/27追記)
後で紹介するfreedom-e-sdkのビルドは最新のgccを使用しないとビルドエラーになるので、この段階でそちらを使用した方がいいかもしれません。
https://www.sifive.com/boards

上記サイト中央位置にある「GNU Embedded Toolchain — v2019.08.0」のUbuntu版をインストールして、各位の環境に合わせてpathを指定ください。

```console
$ export RISCV=${HOME}/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14
```

（追記終わり）

手順書ではvivadoにもパスを通すように指示されていましたが、私の環境では必要ありませんでした。

以下のコマンドを実行してmcsファイルを生成します。

```console
$ make -f Makefile.e300artydevkit verilog
$ make -f Makefile.e300artydevkit mcs
```

正常に完了すればfreedom/builds/e300artydevkit/objフォルダにE300ArtyDevKitFPGAChip.mcsファイルが生成されています。

私の場合、２番目のmcsファイル生成コマンド実行時に以下のエラーメッセージが出ました。

```
ERROR: [Board 49-71] The board_part definition was not found for digilentinc.com:arty:part0:1.1. The project's board_part property was not set, but the project's part property was set to xc7a35ticsg324-1L. Valid board_part values can be retrieved with the 'get_board_parts' Tcl command. Check if board.repoPaths parameter is set and the board_part is installed from the tcl app store.
```

原因はvivadoにArtyのボード定義ファイルが入っていないことでした。
以下からボード定義ファイルをダウンロードします。

https://github.com/Digilent/vivado-boards/

vivado-boards-master/new/board_filesに置いてあるファイルをvivadoのdata/boards/board_filesフォルダにコピーします。
普通にコピー＆ペーストできない場合は、管理者権限でcpコマンドを実行してください。

```sh
sudo cp -r vivado-boards-master/new/board_files/* /tools/Xilinx/Vivado/2019.1/data/boards/board_files/
```

（参考）
[ひでみのアイデア帳](https://sweetcafe.jp/?*20170322-014038)


# FPGAボードへの書き込み
私はmacのVirtualBoxでUbuntuを使用しているのですが、USBがFPGAボードを認識しませんでした。
以下のサイトなどを参照して色々と試しましたが、認識されませんでした。

[MacでVirtualBox上にてUSB機器を認識しない時の対処](https://qiita.com/ntkgcj/items/350863bf933fefe9c5b1)

そこで仕方なく、ARty A7への書き込みはwindows環境のvivadoで行いました。


まずvivadoを起動後、「Flow」→「Open Hardware Manager」を選択してください。

![OpenHardwareManager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/8dbca815-77da-75f2-4140-3feae25ce50a.png)



「Open Target」→「Auto Connect」でArty A7が選択されます。

![opentarget.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/f4ee284d-c2cf-8161-1a29-7bb3afcc2059.png)


次にFPGAボード名「xc7a35t」を右クリックして「Add Configuration Memory Device」を選択してください。

![AddMemoryDevice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/bee03cef-e0c1-c5c9-cae7-3ceaf1b4497d.png)


ここで手順書では以下を選択するように書かれています

- 25q128-3.3v-spi-x1_x2_x4
    - Micron
    - 128
    - spi
    - x1_x2_x4

ですが、私の購入したFPGAボードに搭載されていたのは別のメモリでした。

- s25fl128sxxxxxx0
    - Spansion
    - 128
    - spi
    - x1_x2_x4


![AddConfiguration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/b147b5a7-2ad6-b08e-fa9c-6ebabb726dab.png)


正しいメモリを選択した上で「Do you want to program the configuration memory device now?」にOKします。

![DoYouwantMemoryNow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/9264fe46-6437-421b-3e80-b2d29edb8635.png)


次にConfiguration file にE300ArtyDevKitConfig.mcs を選択して実行します。

![ConfigurationFile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150620/a3089973-3a2d-0110-ec1a-408e5e1d2c73.png)


書き込みに成功したら、ボード上のPROGボタンを押してください。
FPGAボード上の3つのLED、LD4、LD5、LD6が点灯します。

# 次にすること
[freedom-e-sdk](https://github.com/sifive/freedom-e-sdk)には様々なサンプルが置かれています。
次はこれらを実際に試してみたいと思います。

(2019/10/27追記)
freedom-e-sdk サンプルプログラムのビルドを追加しました

# freedom-e-sdk サンプルプログラムのビルド

freedom-e-sdkには幾つかのサンプルがあります。
今回は試しに"hello"をビルドしてみます。

このサンプルプログラムは/opt/riscv/bin/riscv64-unknown-elf-gccでは正常にビルドできませんでした。
フォーラムなどを見たところ、gccのバージョン違いがエラーの原因になるようです。
そこでSiFiveのサイトから適切なバージョンを直接ダウンロードします

https://www.sifive.com/boards

上記リンク先から、以下の3項目のUbuntu版をインストールしてください。

- GNU Embedded Toolchain — v2019.08.0
- OpenOCD — v2019.08.2
- QEMU — v2019.08.0

ビルドに必要なのは「GNU Embedded Toolchain — v2019.08.0」だけですが、OpenOCDはFPGAボードへの書き込み時に使用するので、インストールしておきます。
QEMUは念の為にインストールしておきました。
次にパスを通します。.bashrcを編集します。

```console
$ vi ./.bashrc
```

binファイルのある階層を以下のように記述します。
インストールした場所に応じて変更してください。

```sh
# FREEDOM E SDK
export RISCV_OPENOCD_PATH=/home/kosukematsui/riscv-openocd-0.10.0-2018.12.0-x86_64-linux-ubuntu14
export RISCV_PATH=/home/kosukematsui/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-ubuntu14
```

以上の準備が済みましたら、freedom-e-sdkをダウンロードします

```console
$ git clone --recursive https://github.com/sifive/freedom-e-sdk.git
$ cd freedom-e-sdk
$ git submodule update --init --recursive
```

以下のコマンドでビルドが実行されます。

```console
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] software
```

もしくは

```console
$ make BSP=metal PROGRAM=hello TARGET=freedom-e310-arty software
```

ビルドに成功すると、/hello/debugの階層に、hello.elfファイル、hello.hexファイル、hello.lstファイルが生成されています。

再ビルドする場合は、ビルド前にcleanで削除してください。

```console
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] clean
```

JTAG接続した状態で以下のコマンドを実行すると、FPGAボードに書き込まれるそうです。
~~私はOlimex ARM-USB-TINY-H を取り寄せ中なので、まだ試せていません。~~

```console
$ make [PROGRAM=hello] [TARGET=freedom-e310-arty] [CONFIGURATION=debug] upload
```

（追記）
Olimex ARM-USB-TINY-H を用いて、実際にアップロードできることを確認しました。
[SiFive Freedom E310のサンプルプログラムをArty A7に書き込む](https://qiita.com/Kosuke_Matsui/items/d16a6687ef3d47ee4f00)



# 参考
本記事作成後に以下の記事を見つけました。
とても詳細に手順が説明されているのでご参照ください。


[RISC-VをArty A7 FPGA用にビルドする方法](https://koawaka.com/risc-v_on_arty-a7/)
[RISC-VをArty A7 FPGAに実際に書き込む](https://koawaka.com/riscv-arty-programming/)
[RISC-VをFreedom Studioでビルド・デバッグする方法](https://koawaka.com/risc-v_freedom-studio/)


(2019/10/27追記)
InterFace 2019年12月号の7章「定番ボードではじめるRISC-Vマイコン」でHiFiveボードを対象に、freedom-e-sdkのビルドと書き込み手順が紹介されていました。
本記事の手順よりも洗練されていると感じたので、是非ご参照ください。

その記事では、更にリアルタイムOS Zephyrの実装、OS上で動作するアプリの作成方法まで紹介されており、Arty A7でも同様のことができるか試してみたいと思います。