aboutsummaryrefslogtreecommitdiff
path: root/rv64cpu/tb/core
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-11-07 02:59:33 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-11-07 02:59:33 +0800
commitbc3ec25107314be3cd816c0b669d82338e892806 (patch)
treeff3e69ce6be1218be8bd0dd04e0c75760776d7dc /rv64cpu/tb/core
parentc67ba709482821f37d63601b001ac07e6db867b6 (diff)
downloadrcc-project-bc3ec25107314be3cd816c0b669d82338e892806.tar.gz
rcc-project-bc3ec25107314be3cd816c0b669d82338e892806.tar.xz
checkpoint: preserve current RV64 CPU development state
Diffstat (limited to 'rv64cpu/tb/core')
-rw-r--r--rv64cpu/tb/core/tb_core.cc40
1 files changed, 28 insertions, 12 deletions
diff --git a/rv64cpu/tb/core/tb_core.cc b/rv64cpu/tb/core/tb_core.cc
index 6877d8d..da758c1 100644
--- a/rv64cpu/tb/core/tb_core.cc
+++ b/rv64cpu/tb/core/tb_core.cc
@@ -352,17 +352,23 @@ public:
Vrichard_core* top;
MemoryModel mem;
uint64_t sim_time;
- bool ext_timer_interrupt_level;
- bool ext_software_interrupt_level;
- bool ext_external_interrupt_level;
+ bool m_timer_interrupt_level;
+ bool m_software_interrupt_level;
+ bool m_external_interrupt_level;
+ bool s_timer_interrupt_level;
+ bool s_software_interrupt_level;
+ bool s_external_interrupt_level;
#if VM_TRACE
VerilatedVcdC* tfp;
#endif
CoreSim() : sim_time(0),
- ext_timer_interrupt_level(false),
- ext_software_interrupt_level(false),
- ext_external_interrupt_level(false) {
+ m_timer_interrupt_level(false),
+ m_software_interrupt_level(false),
+ m_external_interrupt_level(false),
+ s_timer_interrupt_level(false),
+ s_software_interrupt_level(false),
+ s_external_interrupt_level(false) {
top = new Vrichard_core;
#if VM_TRACE
Verilated::traceEverOn(true);
@@ -401,9 +407,12 @@ public:
top->dmem_rdata = 0;
}
- top->ext_timer_interrupt = ext_timer_interrupt_level;
- top->ext_software_interrupt = ext_software_interrupt_level;
- top->ext_external_interrupt = ext_external_interrupt_level;
+ top->m_timer_interrupt = m_timer_interrupt_level;
+ top->m_software_interrupt = m_software_interrupt_level;
+ top->m_external_interrupt = m_external_interrupt_level;
+ top->s_timer_interrupt = s_timer_interrupt_level;
+ top->s_software_interrupt = s_software_interrupt_level;
+ top->s_external_interrupt = s_external_interrupt_level;
// Rising edge
top->clk = 0;
@@ -432,13 +441,20 @@ public:
}
void set_interrupt_lines(bool timer, bool software, bool external) {
- ext_timer_interrupt_level = timer;
- ext_software_interrupt_level = software;
- ext_external_interrupt_level = external;
+ m_timer_interrupt_level = timer;
+ m_software_interrupt_level = software;
+ m_external_interrupt_level = external;
}
void clear_interrupts() {
set_interrupt_lines(false, false, false);
+ set_supervisor_interrupt_lines(false, false, false);
+ }
+
+ void set_supervisor_interrupt_lines(bool timer, bool software, bool external) {
+ s_timer_interrupt_level = timer;
+ s_software_interrupt_level = software;
+ s_external_interrupt_level = external;
}
};