自作CPUのデバッグをチマチマ進めている。 TLBの問題についてはとりあえず置いておいて、テストパタンを動かしながら問題点を洗い出している。 とりあえず環境等の問題を洗い出して、基本的なケースは動くようなところまで直していった。 RV32のテストケースについては、動くようになったかな?細かいケースの問題は直していないし、RASのパフォーマンスバグについてはまだ見ていない。まだ調整が必要だなあ。
riscv-isa-sim
側のトレースの問題で、いろいろ突っかかるときがあった。
Spikeはstep()
を実行すると1命令を実行するのが基本なのだが、時々そうでないときがある。特に例外を処理するときは例外を処理するだけで命令が進まないときがあって、そうするとRTL側との命令実行数が合わなくなってしまい、テストケースが失敗してしまう。
色々チェックして、どうやってSpikeの挙動とRTLの挙動を合わせようかと検討していたのだが、最終的にはSpikeのminstret
を使うことにした。
minstret
のカウンタが、step()
実行後に前回のカウンタと変わっていなければもう一度実行するように変更した。これで結構いろんなパタンが通るようになった。
こんな感じ。
p->step(1); auto instret = p->get_state()->minstret; static reg_t prev_instret = 1; if (prev_instret == instret) { p->step(1); } prev_instret = instret;
rv32_tiny.log:PASS / TOTAL = 84 / 109 rv32_small.log:PASS / TOTAL = 68 / 109 rv32_standard.log:PASS / TOTAL = 70 / 109 rv32_big.log:PASS / TOTAL = 0 / 109 rv32_giant.log:PASS / TOTAL = 0 / 109
コアの構成を大きくしていくとやっぱりまだ動かない。デバッグ必要!