自作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