Ubuntu上でのRISC-Vの環境構築

# 記事の概要
Ubuntu上にRISC-Vの開発環境を構築する手順を説明します。
Chiselを使用することを前提にしていますが、Verilogを使用される方は「vivadoのインストール」と「RISC-Vクロスコンパイラのビルド」のみご参照ください。

また、本記事でのインストールは2019年7月20日時点のバージョンなどになります。

# 使用したPC
本記事においては以下のPCを使用しています。

- Ubuntu 16.04LTS
    - メモリ　3.7GB
    - プロセッサ　2.67GHz x 4
    - OS 64ビット

2017年8月に発刊されたFPGAマガジンの記事において、RISC-V用コンパイラはWindowsマシンやWindows上の仮想環境では正常にビルドできないと書かれていました。
現在では改善されているかは調べていませんが、Ubuntuを使用することにしました。

私はUbuntu PCを所有していなかったので、型落ちのPCを初期化してUbuntuをインストールしました。
Yahooオークションなどでは中古PCにUbuntuをインストールしたものが安く売られているので、それらを利用するのもいいかもしれません。    


# Scala開発環境構築
Chiselを用いてRISC-Vを開発する場合はScalaが必要です。
Verilogで開発する場合、この作業は不要になります。

以下の手順は、[sbt公式サイトの「Linux への sbt のインストール」](https://www.scala-sbt.org/1.0/docs/ja/Installing-sbt-on-Linux.html)を参照しています。

### OpenJDKのインストール
Scalaを使用する場合、ScalaはJava仮想マシン上で動作するのでJDKをインストールします。
必要になるのはバージョン8になります

```terminal
sudo apt install openjdk-8-jdk
```

### sbt インストール
以下のコマンドを実行してください。

```terminal
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt
```
インストールが正常に完了されているか、sbtシェルを起動して確認します。

```terminal
sbt
```

正常に完了していれば、以下のように起動します。シェルを閉じるには、exitと入力するか、Ctrl+D を押してください。

```terminal
[info] Loading project definition from /home/kosukematsui/project
[info] Set current project to kosukematsui (in build file:/home/kosukematsui/)
[info] sbt server started at local:///home/kosukematsui/.sbt/1.0/server/XXXXXXXXX/sock
sbt:kosukematsui> 
```

Scalaを対話シェルで試したい場合は以下を入力します。

```terminal
sbt console
```
起動後にプログラムを入力すれば応答します。

```
scala> println("Hello, World!")
Hello, World!
```
# Verilatorのインストール
ChiselのシミュレーションをするためのC++コードを出力するツールになります
以下は[https://www.veripool.org/projects/verilator/wiki/Installing](https://www.veripool.org/projects/verilator/wiki/Installing)を参照しています。

Verilator依存パッケージをインストールします。

```terminal
sudo apt-get install git make autoconf g++ flex bison
```

gitリポジトリからcloneを行い、Verilatorのビルドとインストールを実行します。

```terminal
git clone http://git.veripool.org/git/verilator
unset VERILATOR_ROOT
cd verilator
git pull
autoconf
./configure
make
sudo make install
```

# vivadoのインストール
インストール手順は[FPGAの部屋「Ubuntu16.04にVivado 2016.4をインストール」](http://marsee101.blog.fc2.com/blog-entry-3740.html)を参照しました。

Xilinx社の[ダウンロード](https://japan.xilinx.com/support/download.html)から「Vivado Design Suite - HLx Edition - 2019.1  Full Product Installation」 の「[Vivado HLx 2019.1: Vivado HLx 2017.4: WebPACK および Editions - Linux 用自己解凍型ウェブ インストーラー (BIN - 115.05 MB)](https://japan.xilinx.com/member/forms/download/xef-vivado.html?filename=Xilinx_Vivado_SDK_Web_2019.1_0524_1430_Lin64.bin) 」をダウンロードします。
ダウンロードにはUser IDとPasswardの登録が必要になります。

インストーラを実行します。

```
cd ~/ダウンロード
chmod +x Xilinx_Vivado_SDK_Web_2019.1_0524_1430_Lin64.bin
sudo ./Xilinx_Vivado_SDK_Web_2019.1_0524_1430_Lin64.bin
```
インストール画面の起動後、基本的にはNEXTを押していくだけでインストールできますが、以下の設定などが必要になります。

- Select Install画面では、登録したUser IDとPasswardを入力する
- Select Ediition to Install 画面では「Vivado Webpack」を選択
- Vivado HL Webpack の画面では、「Software Development Kit (SDK)」のチェックが入っているかを確認
    - FPGAボードを使用する場合は、対応するFPGAボードにもチェックが入っているかを確認する（私の場合はArtyシリーズに初期状態でチェックが入っていることを確認しました） 

インストール完了後は~/.bashrcにパスを追加します。使用しやすいエディタで編集してください。

```
vi ~/.bashrc
```

以下を追加します。
Pathはvivadoをインストールした場所に合わせて適宜変更ください。
私の場合は/toolsにvivadoをインストールしましたが、参照した幾つかのサイトでは/optにインストールする例が多いようでした

```
# Xilinx vivado
source /tools/Xilinx/Vivado/2019.1/settings64.sh
alias xsdk='env SWT_GTK3=0 xsdk'
alias vivado='env SWT_GTK3=0 vivado'
```

### FPGAボードを使用する場合
FPGAボードを使用する場合は、FPGAボードファイルとボードに対応する制約ファイルが必要になります

私が使用しているARTY S7のFPGAボードは最初からインストールされていました。
そうでない場合は、FPGAボードファイルを入手して、例えばXilinx/Vivado/2019.1フォルダ以下のdata/boards/board_files に格納ください。

ARTY S7の制約ファイルは[https://github.com/Digilent/digilent-xdc/](https://github.com/Digilent/digilent-xdc/)から入手しました。
これはvivadoで論理合成する際に使用します。

# QEMUのインストール

現時点での最新版のqemu-4.0.0をインストールします。
以下のコマンドのバージョンは適宜変更してください。

```
wget https://download.qemu.org/qemu-4.0.0.tar.xz
tar xf qemu-4.0.0.tar.xz
cd qemu-4.0.0/
mkdir build
cd build/
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
../configure --target-list=riscv32-softmmu,riscv64-softmmu,riscv64-linux-user,riscv32-linux-user --prefix=/opt/qemu-riscv
make
sudo make install
```
インストール完了後は~/.bashrcにパスを追加します。使用しやすいエディタで編集してください。

```
vi ~/.bashrc
```

以下を追加します。

```
# QEMU
export PATH=${PATH}:/opt/qemu-riscv/bin
```

インストール完了後、正常に完了しているかは、バージョン番号が表示できるかを見ることで確認できます。
新しい端末を開くか、

```
source ~/.bashrc
```

を実行後に、以下のコマンドでご確認ください。

```
qemu-system-riscv32 --version
```

```
qemu-system-riscv64 --version
```

```
qemu-riscv64 --version
```

# RISC-Vクロスコンパイラのビルド
RISC-V用のクロス開発環境を構築します。
ビルド手順は[https://github.com/riscv/riscv-gnu-toolchain](https://github.com/riscv/riscv-gnu-toolchain)および[ソフトウェアプラットフォーム屋のメモ帳「RISC-V 32bit版gnu-toolchainのビルド＆インストール方法」](https://myamada9999.hatenablog.com/entry/2019/06/02/065826)を参照しました。

toolchainをインストールします。

```
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
```

依存パッケージをインストールします。

```
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
```

ビルド作業は環境や目的に合わせて、後述する４通りから選択します。
私はNewlib cross-compilerとLinux cross-compiler 32-bit and 64-bit両対応版をビルドしました。
ビルドには数時間を要します。

以下のコマンドでフォルダ内に移動後、各コマンドを実行ください。

```
cd riscv-gnu-toolchain/
```

### Newlib cross-compilerをビルドする場合

```
./configure --prefix=/opt/riscv
sudo make
```

### Linux cross-compiler RV64GC (64-bit)対応版をビルドする場合

```
./configure --prefix=/opt/riscv
sudo make linux
```

### Linux cross-compiler RV32IM (32-bit)対応版をビルドする場合

```
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
sudo make linux
```
### Linux cross-compiler 32-bit and 64-bit両対応版をビルドする場合

```
./configure --prefix=/opt/riscv --enable-multilib
sudo make linux
```

### パスを通す

ビルド完了後は~/.bashrcにパスを追加します。使用しやすいエディタで編集してください。

```
vi ~/.bashrc
```

以下を追加します。
Pathはインストールした場所に合わせて適宜変更ください。

```
# RISC-V toolchain
export PATH=${PATH}:/opt/riscv/bin
```

インストール完了後、正常に完了しているかは、バージョン番号が表示できるかを見ることで確認できます。
新しい端末を開くか、

```
source ~/.bashrc
```

を実行後に、以下のコマンドでご確認ください。

#### Newlib cross-compiler
```
riscv64-unknown-elf-gcc -v
```

#### Linux cross-compiler RV64GC (64-bit)対応版
```
riscv64-unknown-linux-gnu-gcc -v
```

#### Linux cross-compiler RV32IM (32-bit)対応版
```
riscv32-unknown-linux-gnu-gcc -v
```

#### Linux cross-compiler 32-bit and 64-bit両対応版
```
riscv64-unknown-linux-gnu-gcc -v
```

# 最後に
上記手順でうまくインストールできない場合はお気軽にご質問ください。
また、手順に誤りや不足があれば、ご指摘いただけると助かります。

# その他参照サイト

- 堀江徹也氏「RISC-Vマイコンの作り方」サポートページ
    - [各種ツール等のインストール方法](https://github.com/horie-t/homemade-riscv/wiki)

# 変更履歴
- 2019年10月3日

QEMUのインストールコマンドで64bit版のriscv64-softmmuが抜けていたので修正

（誤）

```
../configure --target-list=riscv32-softmmu,riscv32-softmmu,riscv64-linux-user,riscv32-linux-user --prefix=/opt/qemu-riscv
```

（正）

```
../configure --target-list=riscv32-softmmu,riscv64-softmmu,riscv64-linux-user,riscv32-linux-user --prefix=/opt/qemu-riscv
```