Skip to content

Commit 22b1e01

Browse files
committed
[difftest] update SpikeEvent after func
1 parent 1a6f579 commit 22b1e01

File tree

7 files changed

+100
-7
lines changed

7 files changed

+100
-7
lines changed

difftest/spike_interfaces/spike_interfaces.cc

+29-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ const char *proc_disassemble(spike_processor_t *proc) {
5656
return strdup(disasm->disassemble(fetch.insn).c_str());
5757
}
5858

59+
const char *proc_disassemble_with_pc(spike_processor_t *proc, reg_t pc) {
60+
auto mmu = proc->p->get_mmu();
61+
auto disasm = proc->p->get_disassembler();
62+
auto fetch = mmu->load_insn(pc);
63+
return strdup(disasm->disassemble(fetch.insn).c_str());
64+
}
65+
5966
spike_processor_t *spike_get_proc(spike_t *spike) {
6067
return new spike_processor_t{spike->s->get_proc()};
6168
}
@@ -76,7 +83,7 @@ reg_t proc_func(spike_processor_t *proc) {
7683
fetch = mmu->load_insn(pc);
7784
res = fetch.func(proc->p, fetch.insn, pc);
7885
} catch (trap_t &trap) {
79-
printf("catch exception\n");
86+
//printf("catch exception\n");
8087
unsigned max_xlen = proc->p->get_const_xlen();
8188
state_t* state = proc->p->get_state();
8289
reg_t hsdeleg = (state->prv <= PRV_S) ? state->medeleg->read() : 0;
@@ -148,6 +155,12 @@ reg_t proc_get_insn(spike_processor_t *proc) {
148155
return fetch.insn.bits();
149156
}
150157

158+
reg_t proc_get_insn_with_pc(spike_processor_t *proc, reg_t pc) {
159+
auto mmu = proc->p->get_mmu();
160+
auto fetch = mmu->load_insn(pc);
161+
return fetch.insn.bits();
162+
}
163+
151164
uint8_t proc_get_vreg_data(spike_processor_t *proc, uint32_t vreg_idx,
152165
uint32_t vreg_offset) {
153166
return proc->p->VU.elt<uint8_t>(vreg_idx, vreg_offset);
@@ -167,18 +180,33 @@ uint32_t proc_get_rs1(spike_processor_t *proc) {
167180
return (uint32_t)fetch.insn.rs1();
168181
}
169182

183+
uint32_t proc_get_rs1_with_pc(spike_processor_t *proc, reg_t pc) {
184+
auto fetch = proc->p->get_mmu()->load_insn(pc);
185+
return (uint32_t)fetch.insn.rs1();
186+
}
187+
170188
uint32_t proc_get_rs2(spike_processor_t *proc) {
171189
auto pc = proc->p->get_state()->pc;
172190
auto fetch = proc->p->get_mmu()->load_insn(pc);
173191
return (uint32_t)fetch.insn.rs2();
174192
}
175193

194+
uint32_t proc_get_rs2_with_pc(spike_processor_t *proc, reg_t pc) {
195+
auto fetch = proc->p->get_mmu()->load_insn(pc);
196+
return (uint32_t)fetch.insn.rs2();
197+
}
198+
176199
uint32_t proc_get_rd(spike_processor_t *proc) {
177200
auto pc = proc->p->get_state()->pc;
178201
auto fetch = proc->p->get_mmu()->load_insn(pc);
179202
return fetch.insn.rd();
180203
}
181204

205+
uint32_t proc_get_rd_with_pc(spike_processor_t *proc, reg_t pc) {
206+
auto fetch = proc->p->get_mmu()->load_insn(pc);
207+
return fetch.insn.rd();
208+
}
209+
182210
uint64_t proc_vu_get_vtype(spike_processor_t *proc) {
183211
return proc->p->VU.vtype->read();
184212
}

difftest/spike_interfaces/spike_interfaces_c.h

+5
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,22 @@ void spike_register_callback(void *ffi_target, ffi_callback callback);
1717
spike_t *spike_new(const char *set, const char *lvl,
1818
size_t lane_number);
1919
const char *proc_disassemble(spike_processor_t *proc);
20+
const char *proc_disassemble_with_pc(spike_processor_t *proc, reg_t pc);
2021
void proc_reset(spike_processor_t *proc);
2122
spike_processor_t *spike_get_proc(spike_t *spike);
2223
spike_state_t *proc_get_state(spike_processor_t *proc);
2324

2425
uint64_t proc_func(spike_processor_t *proc);
2526
uint64_t proc_get_insn(spike_processor_t *proc);
27+
uint64_t proc_get_insn_with_pc(spike_processor_t *proc, reg_t pc);
2628
uint8_t proc_get_vreg_data(spike_processor_t *proc, uint32_t vreg_idx,
2729
uint32_t vreg_offset);
2830
uint32_t proc_get_rs1(spike_processor_t *proc);
31+
uint32_t proc_get_rs1_with_pc(spike_processor_t *proc, reg_t pc);
2932
uint32_t proc_get_rs2(spike_processor_t *proc);
33+
uint32_t proc_get_rs2_with_pc(spike_processor_t *proc, reg_t pc);
3034
uint32_t proc_get_rd(spike_processor_t *proc);
35+
uint32_t proc_get_rd_with_pc(spike_processor_t *proc, reg_t pc);
3136

3237
uint64_t proc_vu_get_vtype(spike_processor_t *proc);
3338
uint32_t proc_vu_get_vxrm(spike_processor_t *proc);

rocketemu/driver/src/sim.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub struct SimulationArgs {
4343
pub log_level: String,
4444

4545
/// The timeout value
46-
#[arg(long, default_value_t = 1_0000)]
46+
#[arg(long, default_value_t = 1_00000)]
4747
pub timeout: u64,
4848

4949
#[cfg(feature = "trace")]

rocketemu/offline/src/difftest.rs

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ impl Difftest {
3535
}
3636
if se.is_rd_written() && se.rd_idx != 0 {
3737
let event = self.dut.step()?;
38+
39+
event.
3840

3941
match event {
4042
JsonEvents::RegWrite { addr, data, cycle } => {

rocketemu/spike_rs/src/lib.rs

+27
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ impl Processor {
9797
format!("{}", c_str.to_string_lossy())
9898
}
9999

100+
pub fn disassemble_with_pc(&self, pc: u64) -> String {
101+
let bytes = unsafe { proc_disassemble_with_pc(self.processor, pc) };
102+
let c_str = unsafe { CStr::from_ptr(bytes as *mut c_char) };
103+
format!("{}", c_str.to_string_lossy())
104+
}
105+
100106
pub fn reset(&self) {
101107
unsafe { proc_reset(self.processor) }
102108
}
@@ -114,6 +120,10 @@ impl Processor {
114120
unsafe { proc_get_insn(self.processor) as u32 }
115121
}
116122

123+
pub fn get_insn_with_pc(&self, pc: u64) -> u32 {
124+
unsafe { proc_get_insn_with_pc(self.processor, pc) as u32 }
125+
}
126+
117127
pub fn get_vreg_data(&self, idx: u32, offset: u32) -> u8 {
118128
unsafe { proc_get_vreg_data(self.processor, idx, offset) }
119129
}
@@ -122,14 +132,26 @@ impl Processor {
122132
unsafe { proc_get_rs1(self.processor) }
123133
}
124134

135+
pub fn get_rs1_with_pc(&self, pc: u64) -> u32 {
136+
unsafe { proc_get_rs1_with_pc(self.processor, pc) }
137+
}
138+
125139
pub fn get_rs2(&self) -> u32 {
126140
unsafe { proc_get_rs2(self.processor) }
127141
}
128142

143+
pub fn get_rs2_with_pc(&self, pc: u64) -> u32 {
144+
unsafe { proc_get_rs2_with_pc(self.processor, pc) }
145+
}
146+
129147
pub fn get_rd(&self) -> u32 {
130148
unsafe { proc_get_rd(self.processor) }
131149
}
132150

151+
pub fn get_rd_with_pc(&self, pc: u64) -> u32 {
152+
unsafe { proc_get_rd_with_pc(self.processor, pc) }
153+
}
154+
133155
// vu
134156
pub fn vu_get_vtype(&self) -> u32 {
135157
unsafe { proc_vu_get_vtype(self.processor) as u32 }
@@ -249,14 +271,19 @@ extern "C" {
249271
fn spike_get_proc(spike: *mut ()) -> *mut ();
250272
fn spike_destruct(spike: *mut ());
251273
fn proc_disassemble(proc: *mut ()) -> *mut c_char;
274+
fn proc_disassemble_with_pc(proc: *mut(), pc: u64) -> *mut c_char;
252275
fn proc_reset(proc: *mut ());
253276
fn proc_get_state(proc: *mut ()) -> *mut ();
254277
fn proc_func(proc: *mut ()) -> u64;
255278
fn proc_get_insn(proc: *mut ()) -> u64;
279+
fn proc_get_insn_with_pc(proc: *mut(), pc: u64) -> u64;
256280
fn proc_get_vreg_data(proc: *mut (), vreg_idx: u32, vreg_offset: u32) -> u8;
257281
fn proc_get_rs1(proc: *mut ()) -> u32;
282+
fn proc_get_rs1_with_pc(proc: *mut(), pc: u64) -> u32;
258283
fn proc_get_rs2(proc: *mut ()) -> u32;
284+
fn proc_get_rs2_with_pc(proc: *mut(), pc: u64) -> u32;
259285
fn proc_get_rd(proc: *mut ()) -> u32;
286+
fn proc_get_rd_with_pc(proc: *mut(), pc: u64) -> u32;
260287

261288
fn proc_vu_get_vtype(proc: *mut ()) -> u64;
262289
fn proc_vu_get_vxrm(proc: *mut ()) -> u32;

rocketemu/spike_rs/src/spike_event.rs

+26
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ pub struct SpikeEvent {
100100
}
101101

102102
impl SpikeEvent {
103+
<<<<<<< HEAD
103104

105+
=======
106+
>>>>>>> 9c6d4dfe (get info with pc)
104107
pub fn new_with_pc(pc: u64, do_log_vrf: bool) -> Self {
105108
SpikeEvent {
106109
do_log_vrf,
@@ -188,6 +191,29 @@ impl SpikeEvent {
188191
}
189192
}
190193

194+
pub fn fill_event(&mut self, spike: &Spike) {
195+
let pc = self.pc;
196+
let proc = spike.get_proc();
197+
let state = proc.get_state();
198+
199+
let insn_bits = proc.get_insn_with_pc(pc);
200+
let opcode = clip(insn_bits, 0, 6);
201+
let width = clip(insn_bits, 12, 14);
202+
203+
let is_rs_fp = opcode == 0b1010111 && width == 0b101/* OPFVF */;
204+
205+
let rs1 = proc.get_rs1_with_pc(pc);
206+
let rs2 = proc.get_rs2_with_pc(pc);
207+
208+
self.disasm = proc.disassemble_with_pc(pc);
209+
self.inst_bits = insn_bits;
210+
self.rs1 = rs1;
211+
self.rs2 = rs2;
212+
self.rs1_bits = state.get_reg(rs1, is_rs_fp);
213+
self.rs2_bits = state.get_reg(rs2, is_rs_fp);
214+
self.rd_idx = proc.get_rd_with_pc(pc);
215+
}
216+
191217
pub fn opcode(&self) -> u32 {
192218
clip(self.inst_bits, 0, 6)
193219
}

rocketemu/test_common/src/spike_runner.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,20 @@ impl SpikeRunner {
7878
let state = proc.get_state();
7979

8080
state.set_mcycle((self.cycle + self.spike_cycle) as usize);
81-
81+
8282
let mut event = SpikeEvent::new_with_pc(state.get_pc(), self.do_log_vrf);
83-
state.clear();
83+
//state.clear();
84+
85+
let new_pc = proc.func();
86+
87+
// fill the SpikeEvent
88+
//event.fill_event(spike);
8489

8590
// inst is scalar
8691
debug!("SpikeStep: spike run scalar insn ({})", event.describe_insn());
87-
let new_pc = proc.func();
88-
event.log_mem_write(spike).unwrap();
89-
event.log_reg_write(spike).unwrap();
92+
93+
//event.log_mem_write(spike).unwrap();
94+
//event.log_reg_write(spike).unwrap();
9095

9196
state.handle_pc(new_pc).unwrap();
9297

0 commit comments

Comments
 (0)