|
|
# RISC-V ツールチェインの構築
|
|
|
https://github.com/riscv/riscv-gnu-toolchain
|
|
|
公式のリポジトリはここにあり,ビルドの方法も基本的にはREADMEに書いてあるとおりです.ただ,実験で使うためには一部のオプションを変更する必要があるので以下に簡単に説明します.
|
|
|
|
|
|
|
|
|
## 手順
|
|
|
|
|
|
まず,ビルドに必要なソフトウェアをインストールします.
|
|
|
|
|
|
```
|
|
|
$ sudo apt 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 g++ gcc-multilib
|
|
|
$ sudo apt-add-repository universe && sudo apt update # ←もしtexinfoやgperfが見つからないよというようなエラーが出たらこれを実行して↑をもう一回試してみる.出ないならいらない
|
|
|
```
|
|
|
|
|
|
適当に実験用のディレクトリを作り,その中にビルドするRISC-Vツールチェインのソースコードを公式のリポジトリからクローンします(必ずしも実験用にディレクトリを作る必要はありませんし,既存の作業用ディレクトリがあればそれを利用してもよいです).
|
|
|
|
|
|
```
|
|
|
$ mkdir pex
|
|
|
$ cd pex
|
|
|
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
|
|
|
```
|
|
|
|
|
|
クローンしたディレクトリに移動して`configure`を実行し,`make`します.
|
|
|
|
|
|
```
|
|
|
$ cd riscv-gnu-toolchain
|
|
|
$ ./configure --prefix=${HOME}/opt/riscv --with-arch=rv32i
|
|
|
$ make -j3
|
|
|
```
|
|
|
|
|
|
この`./configure`して`make`というのは多くのソフトウェアのビルドに共通する手順です.
|
|
|
|
|
|
configureはOSやライブラリのバージョンなどを調べ,適切なMakefileを生成するシェルスクリプトです.また,ビルドしたプログラムのインストール先などの設定もここで行います.
|
|
|
|
|
|
|
|
|
上で引数として渡している`--prefix=${HOME}/opt/riscv`というのはインストール先をホームディレクトリの下の`opt/riscv`に設定しろという意味です.
|
|
|
公式のドキュメント通りにルートディレクトリ直下の`/opt/riscv`にインストールするようにする場合は`make`する際に管理者権限が必要となります.
|
|
|
私はユーザー権限でいじれる場所においておいたほうが楽だと思うのでホームディレクトリ以下の適当な場所にインストールするのが好きですが,これは好みの問題なので自由に設定してよいです.
|
|
|
|
|
|
`--with-arch=rv32i`というのはビルドするコンパイラはRV32I向けにするという意味です.
|
|
|
RISC-V命令セットは様々な用途に使えるように多くのサブセットが定義されています.
|
|
|
RV32Iは32bitアーキテクチャで,簡単な整数の加減算,論理演算,メモリアクセス,制御命令のみを含みます.
|
|
|
他には
|
|
|
|
|
|
- RV32IM(RV32Iに整数の乗除算命令を加えたもの)
|
|
|
- RV32IMAF(RV32Mにアトミック演算命令,単精度浮動小数点数演算命令を加えたもの)
|
|
|
- RV64IMAFD(Dは倍精度浮動小数点数演算の意)
|
|
|
|
|
|
などがあります.
|
|
|
|
|
|
|
|
|
`make`のオプション`-j3`というのは3並列でビルドを進めるという意味です.
|
|
|
各自利用するパソコンのCPUのコア数に応じて適当に並列度を決めるとよいでしょう.
|
|
|
|
|
|
`make`が終わったあとには`--prefix`で指定したディレクトリの中にビルドしたものがインストールされているはずです.
|
|
|
実行できるものはインストール先のbinディレクトリの中にあり,
|
|
|
|
|
|
```
|
|
|
$ ~/opt/riscv/bin/riscv32-unknown-elf-gcc --version
|
|
|
riscv32-unknown-elf-gcc (GCC) 8.1.0
|
|
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
|
|
This is free software; see the source for copying conditions. There is NO
|
|
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
```
|
|
|
|
|
|
などとなれば成功です.
|
|
|
|
|
|
# プログラムのビルド
|
|
|
上でビルドしたRISC-V向けのツールチェインを利用して`riscv32-unknown-elf-gcc main.c`などとすればRISC-V版のLinux上で実行できるELF形式のファイルができます.
|
|
|
しかしこのELF形式の実行ファイルはそのヘッダ部分に応じて適切な形でメモリ上に展開されることを前提としており,通常はOSのローダというプログラムがその展開を行いますが,今回の実験で作る環境にはOSなどはないためそのまま実行できません.
|
|
|
今回はELFファイルをVerilogの`$readmemh`で読める形式に展開するスクリプトをこちらで用意しましたので以下の指示に従って使ってください.
|
|
|
|
|
|
## 環境設定
|
|
|
`benchmarks/tools/Makefile.inc`の先頭に以下のような部分があります.
|
|
|
|
|
|
```
|
|
|
# クロスコンパイラ環境の設定
|
|
|
GCC_DIR = $(HOME)/opt/riscv
|
|
|
RSD_GCC_PREFIX = riscv32-unknown-elf-
|
|
|
RSD_GCC_NATIVE = $(GCC_DIR)/bin
|
|
|
|
|
|
# プロジェクトの場所
|
|
|
PROJECT_ROOT = $(HOME)/lab/cpujikken
|
|
|
TEST_CODE_ROOT = .
|
|
|
TEST_TOOL_ROOT = $(PROJECT_ROOT)/benchmarks/tools
|
|
|
````
|
|
|
|
|
|
ここを適宜書き換えてください.
|
|
|
書き換える必要があるのは基本的に`GCC_DIR`と`PROJECT_ROOT`です.
|
|
|
|
|
|
`GCC_DIR`は`./configure`するときに指定した`prefix`のディレクトリに変えればよいです.
|
|
|
上に記述したとおりに`--prefix=${HOME}/opt/riscv`とした場合は書き換える必要はありません.
|
|
|
|
|
|
また`PROJECT_ROOT`はこのリポジトリをクローンしてきたディレクトリへのパスです.
|
|
|
つまりこの`README.md`のあるディレクトリへのパスです..
|
|
|
|
|
|
|
|
|
## Coremarkのビルド
|
|
|
|
|
|
```
|
|
|
$ cd coremark
|
|
|
$ make -j3
|
|
|
```
|
|
|
|
|
|
とすればVerilogの$readmemhで読める形式(ただのテキスト)の`code.hex`と`data.hex`ができます.
|
|
|
|
|
|
## template
|
|
|
templateディレクトリに最低限のビルドに必要なMakefileを用意しました.
|
|
|
このtemplateにはほとんど空の`main`関数のみが含まれており,templateディレクトリで`make`するとビルドが行われます.
|
|
|
適宜ディレクトリをコピーして改変して使ってください.
|
|
|
|