読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

RISC-Vのbenchmarkパタンセットを動作させる

前回、RISC-Vのパタンセットを動作させるためにecallを変更したのだが、変更が間違っていた。mstatusの下位だけでなく、上位ビットもずらしてしまっていた。これでは動作モード以外に、MMUのモードも変わってしまう。 だからSV32が選択されていたのか。

msyksphinz.hatenablog.com

diff --git a/src/inst_riscv.cpp b/src/inst_riscv.cpp
index 672728e..5d8b1b7 100644
--- a/src/inst_riscv.cpp
+++ b/src/inst_riscv.cpp
@@ -2297,7 +2297,8 @@ void InstEnv::RISCV_INST_ECALL (Word_t inst_hex)

   UDWord_t curr_mstatus;
   m_env->CSRRead (SYSREG_ADDR_MSTATUS, &curr_mstatus);
-  UDWord_t next_mstatus = (curr_mstatus << 3) | (static_cast<UDWord_t>(curr_priv) << 1);
+  UDWord_t next_mstatus = ((curr_mstatus << 3) | (static_cast<UDWord_t>(curr_priv) << 1)) & 0xffff;
+  next_mstatus = next_mstatus | (curr_mstatus & 0xffff0000);
   m_env->CSRWrite (SYSREG_ADDR_MSTATUS, next_mstatus);

   m_env->SetPC (jmp_addr);

これでほとんどのパタンが動作するようになった。これ以外に、以下のパタンが落ちている。なんか増えてる気がするぞ。困ったなあ。

github.com

The following tests FAILED:
          1 - rv32mi-p-csr (Failed)
          8 - rv32mi-p-timer (Failed)
          9 - rv32si-p-csr (Failed)
         47 - rv32ui-pm-lrsc (Failed)
        125 - rv64mi-p-csr (Failed)
        126 - rv64mi-p-dirty (Failed)
        130 - rv64mi-p-mcsr (Failed)
        134 - rv64mi-p-timer (Failed)
        136 - rv64si-p-csr (Failed)
        146 - rv64uf-p-fcvt (Failed)
        147 - rv64uf-p-fcvt_w (Failed)
        148 - rv64uf-p-fdiv (Failed)
        159 - rv64uf-pt-fcvt (Failed)
        160 - rv64uf-pt-fcvt_w (Failed)
        161 - rv64uf-pt-fdiv (Failed)
        172 - rv64uf-v-fcvt (Failed)
        173 - rv64uf-v-fcvt_w (Failed)
        174 - rv64uf-v-fdiv (Failed)
        190 - rv64ui-p-amomax_d (Failed)
        194 - rv64ui-p-amomin_d (Failed)
        230 - rv64ui-pm-lrsc (Failed)
        233 - rv64ui-p-mulhsu (Failed)
        273 - rv64ui-pt-amomax_d (Failed)
        277 - rv64ui-pt-amomin_d (Failed)
        315 - rv64ui-pt-mulhsu (Failed)
        359 - rv64ui-v-amomax_d (Failed)
        363 - rv64ui-v-amomin_d (Failed)
        401 - rv64ui-v-mulhsu (Failed)
        436 - median (Failed)
        443 - spmv (Failed)