32bit版RISC-V用のspikeを動かす

オープンなISAであるRISC-Vには、32bit版も定義されています。 spikeは、RISC-Vの公式が開発している命令セットシミュレーターです。

以下の手順で必要なソースコードを持ってきます。

$ git clone https://github.com/riscv/riscv-tools.git
$ cd riscv-tools
$ git checkout bce7b5e
$ git submodule update -i --recursive

最新のコミットでは、riscv-gnu-toolchainが含まれなくなってしまいました。 RISC-V用のクロスコンパイラをすでに持っている場合は問題ありませんが、そうでない場合は手に入れる必要があります*1riscv-gnu-toolchainが含まれていたころのbce7b5eをチェックアウトすれば自動でやってくれるため楽です。

このあと./build-rv32ima.shを動かすのですが、名前の通り、RV32IMA用になってしまいます。 RV32IMAだと浮動小数点数命令拡張が含まれないため、スクリプトの中のrv32imarv32gに変更します。

インストールしたいパスをシェルのRISCV変数に入れた後、先ほど書き換えたビルドスクリプトを走らせます。

$ export RISCV=~/rv32
$ ./build-rv32ima.sh

70分ほど待つとビルドが完了します。

使い方は、以下のような感じです。前に作ったRV64G用の場合は~/rv64/bin/spike pk a.outのようにpkをそのまま打てばよかったような気がしますが、~/rv32/bin/spike ~/rv32/riscv32-unknown-elf/bin/pk a.outのようにpkのパスを打つ必要があるようです。

$ echo -e '#include<stdio.h>\nint main(){puts("Hello, RISC-V!");}' > main.c
$ ~/rv32/bin/riscv32-unknown-elf-gcc main.c
$ ~/rv32/bin/spike ~/rv32/riscv32-unknown-elf/bin/pk a.out
bbl loader
Hello, RISC-V!

*1:OSの代わりであるproxy kernelをRISC-V用にビルドする必要があるため、クロスコンパイラが必要になります