spikeで簡単なプログラムを流して、レジスタダンプを取得できることがわかった話

chiselでRISC-Vを作ろうとしたのですが、まずプログラム開発環境を揃えることにしました。

spikeで簡単なプログラムを流す(0x0000番地の罠)

RISC-Vモデルはspikeにすることにしました。 公式から出ているシミュレータなので安心感があります。 spikeを使って、自身で作成した簡単なプログラムをspikeで流そうとしました。

すると以下のエラーが出ました。調べてみると参考URLは忘れてしまいましたが、 spikeは0番地付近が予約されているみたいで、そこにプログラムを置いてしまうとエラーになるということでした。 ですので、リンカファイルに0x80000000番地とかを設定すれば適切に動作することがわかりました。 (0x1000番地から起動して、0x8000000番地に飛んでいるようでしたが。)

ERROR: invalid store to debug module: 8 bytes at 0x0000000000000000
libc++abi.dylib: terminating with uncaught exception of type trap_store_access_fault

spikeでレジスタダンプ(ツール変更の罠)

spikeでサンプル流せるようになったので、次にレジスタダンプを見たくなりました。 「-d」オプションでデバッグモードで起動し、「reg 0」と打てばレジスタ値は見れるのですが、 それだと面倒な面があるので、「-l」オプションで出せないか調べてみることにしました。 ソースコードを見て、何か使えないかなと確認していたら、なんと「RISCV_ENABLE_COMMITLOG」という Defineオプションを見つけました。

これは間違いなく、レジスタ値を取得できると思ったので、調べてみたら、 以下のサイトで見つけることができました! 「--enable-commitlog=yes」オプションをつけてconfigureして再コンパイルすれば良いようでした。

参考: RISC-Vシミュレータ改造のTips - FPGA開発日記

↑を参考にコンパイルしてみたところ、なんとうまくいきません。。 調べていくと以下サイトにたどり着きました。なんと2019年10月頃に「--log-commits」オプションをspike実行時に与えないと出力されないことがわかりました。 設定するとうまくダンプできました!

core   0: 0xffffffff8000000c (0x02008093) addi    ra, ra, 32
3 0x8000000c (0x02008093) x 1 0x00000220
#                         ^ Reg     ^ Data

Enabling commit log does not work · Issue #342 · riscv/riscv-isa-sim · GitHub

あとがき

これにて、ひとまずそれっぽい環境が構築できることがわかりました。

しかし、さすがは進化中のRISC-Vのツール類です。 仕様だけでなく、ツールも日々変わっていくことがわかりました。 ソースコード読めないと辛い現象が発生している気がしました。