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のツール類です。 仕様だけでなく、ツールも日々変わっていくことがわかりました。 ソースコード読めないと辛い現象が発生している気がしました。