FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

自作CPUのSpikeモデルシミュレータ環境の変更 (5. Spikeの挙動解析と環境修正)

自作CPUのSpikeシミュレータをかなり久しぶりにアップデートすると、いろんな関数が変わっていてかなり戸惑ってしまった。

Spikeの挙動にも若干の変換がみられるか?Misalignedのアクセスにおいても,例外が発生するとともに命令のトレースログにも残っているようなので,これも拾うように変更しなければならい.

diff --git a/spike_dpi/spike_dpi.cpp b/spike_dpi/spike_dpi.cpp
index c4821617..1f59c507 100644
--- a/spike_dpi/spike_dpi.cpp
+++ b/spike_dpi/spike_dpi.cpp
@@ -756,6 +756,7 @@ void step_spike(long long rtl_time, long long rtl_pc,
             riscv_excpt_map[rtl_exception_cause],
             rtl_exception_cause),
     fprintf(compare_log_fp, "==========================================\n");
+    p->step(1);
     return;
   }

あとは,なぜか分からないけれどもMisalignedがサポートされるようになってしまっている.これは何だろう?

diff --git a/riscv/mmu.h b/riscv/mmu.h
index 45c77b19..39a975a7 100644
--- a/riscv/mmu.h
+++ b/riscv/mmu.h
@@ -331,6 +331,8 @@ public:
 
   int is_misaligned_enabled()
   {
+    // fprintf(stderr, "proc->get_cfg().misaligned = %d\n", proc->get_cfg().misaligned);
+    return false;
     return proc && proc->get_cfg().misaligned;
   }
@@ -799,7 +800,7 @@ void step_spike(long long rtl_time, long long rtl_pc,
   static reg_t prev_instret = -1;
   static bool prev_minstret_access = false;
   if (prev_instret == instret && !prev_minstret_access) {
-    fprintf(compare_log_fp, "instret = %08x, p->step called\n", instret);
+    fprintf(compare_log_fp, "instret = %08lx, p->step called\n", instret);
     p->step(1);
   }
   prev_minstret_access = false;
@@ -1262,12 +1263,12 @@ void step_spike_wo_cmp(int steps)
     auto iss_insn = p->get_state()->insn;
     auto iss_priv = p->get_state()->last_inst_priv;
     sprintf (spike_out_str, "Spike Result : %ld : PC=[%016lx] (%c) %08lx %s\n",
-             instret,
+             instret->read(),
              iss_pc,
              iss_priv == 0 ? 'U' : iss_priv == 2 ? 'S' : 'M',
-             iss_insn, disasm->disassemble(iss_insn).c_str());
-    fprintf(compare_log_fp, spike_out_str);
-    fprintf(stderr, spike_out_str);
+             iss_insn.bits(), disasm->disassemble(iss_insn).c_str());
+    fprintf(compare_log_fp, "%s", spike_out_str);
+    fprintf(stderr, "%s", spike_out_str);
   }
 }
 
@@ -1360,7 +1361,7 @@ int main(int argc, char **argv)
     auto cycle = p->get_state()->mcycle->read();
 
     if (log) {
-      fprintf(compare_log_fp, "%10ld %10ld %08lx\n", instret, cycle, iss_pc);
+      fprintf(compare_log_fp, "%10ld %10ld %08lx\n", instret->read(), cycle, iss_pc);
 
       for (auto &iss_rd: p->get_state()->log_mem_read) {
         fprintf(compare_log_fp, "MR%d(0x%0*lx)=>%0*lx\n", std::get<2>(iss_rd),

Spike側がMisalignedを有効になっている.なんでこういうことが起きてるんだ...?

222082 : RTL(53,1) Exception Cause = Load Access Misaligned(4) PC=0000800045c6, Inst=00115383, lhu     t2, 1(sp)
==========================================
222082 : Exception Happened(53,1) : Cause = Load Access Misaligned(4)
==========================================

222120 : 24869 : PC=[0000000080000298] (M,03,01) 00007129 c.addi16sp sp, -320
MR8(0x00000000800988d8,P0x00000000800988d8)=>00000000800988d0
==========================================
Wrong PC: RTL = 0000000080000298, ISS = 00000000800045ca
==========================================

メモ:一回全部クリアしてやり直さないといけない...

make -C ../spike_dpi clean; rm -r -f scariv_tb_rv64imafdc_standard; rm -rf ../spike_dpi/*.a ../spike_dpi/*.o; rm -rf obj_dir_rv64imafdc_standard