≪RISC-Vシミュレータ≫　中森章

●はじめに
　Interface本誌で説明をしているRISC-Vの命令セット・シミュレータです．RISC-Vは最新のアーキテクチャでありながら，その構造は実にシンプルです．命令セット・シミュレータを作るのには最適な題材です．
　まず，実装する命令数が非常に少ないのが理解をしやすくしています．今回では，特権命令など，コンパイラが生成しない命令のみをサポートしますので，たった45個の命令の動きをシミュレートするだけです．
　Interface本誌では，コンピュータのアーキテクチャの理解を深めるために，シミュレータで必要となる，ELFのロード機構，メモリの構造などを省略しています．ここには，全ソース・ファイルとWindowsでの実行形式を格納してありますから，煮るなり焼くなり好きにしてください．

●Windows上でのクロスコンパイラ
　このシミュレータで遊ぶ上で，基本はWindowsプラットフォームを想定しています，したがって，コンパイラもWindows上でのクロスコンパイラがほしいものです．それが存在します．それがわかったため，この連載を始めようという気持ちにもなりました．
　Windows用のRISC-V対応GCCはSiFiveのFreedom Studioのディレクトリ

https://www.sifive.com/products/tools/

からダウンロードできます．この場合，ZIPファイルをダウンロードして展開するだけです．
　本稿ではSiFiveのツール群をダウンロードしてCドライブの直下に置きました．ダウンロードしたツールはDOS窓（コマンドプロンプト，PowerShell）またはCygwinのコマンド・ウィンドウで使用します．DOS窓で使う場合は，使用するコマンドをフルパスで入力しないといけないのが面倒です．CygwinやPowerShellの場合はコマンド指定に相対パスが使用できます．
　test.cというサンプルコードをGCCでコンパイルして，test.outというELFファイルを作成するためには，コマンド・ウィンドウ内で以下をタイプします．

 C:\riscv64-unknown-elf-gcc-20171231-x86_64-w64-mingw32\bin\riscv64-unknown-elf-gcc -o test.out -march=rv32g -mabi=ilp32 -O -nostdlib -Ttext 2000 test.c

使用しているGCCはriscv64と，64ビットISAを想像させる名前ですが，「-march」オプションで「rv32g」を指定すれば32ビットのELFファイルを生成することができます．このとき，64ビットのライブラリをリンクしないように「-mabi=ilp32」というオプションをつけるのを忘れないようにしましょう．
　また，test.outを逆アセンブルするには，コマンド・ウィンドウ内で以下をタイプします．

 C:\riscv64-unknown-elf-gcc-20171231-x86_64-w64-mingw32\bin\riscv64-unknown-elf-objdump -D test.out > test.txt

ここでは，実行結果をtest.txtというファイルにリダイレクトして格納しています．

●サンプル・プログラム
　サンプル・プログラムとしては，Dhrystoneベンチマーク，Standordベンチマーク，CoreMarkを用意しています．しかし，これらのどのプログラムも，今回のシミュレータで使うのに都合のいいように改変を行っています．今回，これらのプログラムは，性能を測定するというよりも，シミュレータの動作の正当性をチェックするために用いています．これらのベンチマーク・プログラムがモノホンとは異なるものであることをご承知おきください．

●シミュレータ本体
　シミュレータ本体はCygwin上で開発しています．Cygwinの影響を受けないようにするために
　　x86_64-w64-mingw32-gcc
でコンパイルを行っています．簡単なMakefileも用意してありますので，改造は容易です．RISC-Vの全機能を実装するもよし，もっと多彩な付加価値をつけるのもよしです．いろいろ遊んでみてください．
