diff --git a/src/test/csrc/emu.cpp b/src/test/csrc/emu.cpp index 6c843e0a802b89ed98460e663e5585e7a6fe8083..7ac5cb957ec837b53040a9bdfe198de2365579b8 100644 --- a/src/test/csrc/emu.cpp +++ b/src/test/csrc/emu.cpp @@ -783,6 +783,10 @@ inline void Emulator::save_coverage(time_t t) { } #endif +void Emulator::trigger_perfDump() { + dut_ptr->io_perfInfo_dump = 1; + single_cycle(); +} void Emulator::display_trapinfo() { uint64_t pc = dut_ptr->io_trap_pc; @@ -797,15 +801,19 @@ void Emulator::display_trapinfo() { eprintf(ANSI_COLOR_RED "HIT BAD TRAP at pc = 0x%" PRIx64 "\n" ANSI_COLOR_RESET, pc); break; case STATE_ABORT: + trigger_perfDump(); eprintf(ANSI_COLOR_RED "ABORT at pc = 0x%" PRIx64 "\n" ANSI_COLOR_RESET, pc); break; case STATE_LIMIT_EXCEEDED: + trigger_perfDump(); eprintf(ANSI_COLOR_YELLOW "EXCEEDING CYCLE/INSTR LIMIT at pc = 0x%" PRIx64 "\n" ANSI_COLOR_RESET, pc); break; case STATE_SIG: + trigger_perfDump(); eprintf(ANSI_COLOR_YELLOW "SOME SIGNAL STOPS THE PROGRAM at pc = 0x%" PRIx64 "\n" ANSI_COLOR_RESET, pc); break; default: + trigger_perfDump(); eprintf(ANSI_COLOR_RED "Unknown trap code: %d\n", trapCode); } diff --git a/src/test/csrc/emu.h b/src/test/csrc/emu.h index d92dca6260867ba40c4f079043bcd34cdec2797d..5ad1fe202e2115caa0652cdf251e1c46f97ec40e 100644 --- a/src/test/csrc/emu.h +++ b/src/test/csrc/emu.h @@ -78,6 +78,7 @@ class Emulator { inline void reset_ncycles(size_t cycles); inline void single_cycle(); + void trigger_perfDump(); void display_trapinfo(); inline char* timestamp_filename(time_t t, char *buf); inline char* snapshot_filename(time_t t);