add test_rename_execute_retire_save_restore_gprs
currently it fails due to the L2 reg file running out of output registers
This commit is contained in:
parent
6026df8d7a
commit
3e08a282ec
2 changed files with 94406 additions and 0 deletions
94289
crates/cpu/tests/expected/rename_execute_retire_save_restore_gprs.vcd
generated
Normal file
94289
crates/cpu/tests/expected/rename_execute_retire_save_restore_gprs.vcd
generated
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -4486,3 +4486,120 @@ fn test_rename_execute_retire_head_n1() {
|
|||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
struct SaveRestoreGprsInsns;
|
||||
|
||||
impl SaveRestoreGprsInsns {
|
||||
const STATE_OFFSET: usize = 16;
|
||||
const MAIN_STACK_FRAME_SIZE: usize = 16 + 32 * 8;
|
||||
const OK: i16 = i16::from_le_bytes(*b"Ok");
|
||||
}
|
||||
|
||||
impl MakeInsns for SaveRestoreGprsInsns {
|
||||
fn make_insns() -> Insns {
|
||||
let mut b = InsnsBuilder::new();
|
||||
|
||||
let load_all = b.new_label("load_all");
|
||||
let store_all = b.new_label("store_all");
|
||||
let main = b.new_label("main");
|
||||
b.power_isa_addi(1, 0, 0x4000); // setup stack pointer
|
||||
b.power_isa_bl(main);
|
||||
b.power_isa_addi(0, 0, Self::OK);
|
||||
b.power_isa_std(0, 0, MockMemory::IO_ADDR as i16);
|
||||
let done = b.new_defined_label("done");
|
||||
b.power_isa_b(done);
|
||||
|
||||
b.set_pc(0x1000);
|
||||
b.define_label(main);
|
||||
b.power_isa_mflr(0);
|
||||
b.power_isa_stdu(0, 1, -(Self::MAIN_STACK_FRAME_SIZE as i16));
|
||||
b.power_isa_addi(0, 0, 2);
|
||||
b.power_isa_mtctr(0);
|
||||
|
||||
let main_loop = b.new_defined_label("main_loop");
|
||||
b.power_isa_addi(3, 1, Self::STATE_OFFSET as i16);
|
||||
b.power_isa_bl(store_all);
|
||||
b.power_isa_addi(3, 1, Self::STATE_OFFSET as i16);
|
||||
b.power_isa_bl(load_all);
|
||||
b.power_isa_bdnz(main_loop);
|
||||
|
||||
b.power_isa_ld(0, 1, 0);
|
||||
b.power_isa_addi(1, 1, Self::MAIN_STACK_FRAME_SIZE as i16);
|
||||
b.power_isa_mtlr(0);
|
||||
b.power_isa_blr();
|
||||
|
||||
b.set_pc(0x1800);
|
||||
b.define_label(store_all);
|
||||
for i in 0..32 {
|
||||
b.power_isa_std(i, 3, i as i16 * 8);
|
||||
}
|
||||
b.power_isa_blr();
|
||||
|
||||
b.set_pc(0x2000);
|
||||
b.define_label(load_all);
|
||||
// load r3 last to avoid overwriting pointer
|
||||
for i in (0..32).filter(|i| *i != 3).chain([3]) {
|
||||
b.power_isa_ld(i, 3, i as i16 * 8);
|
||||
}
|
||||
b.power_isa_blr();
|
||||
|
||||
b.build()
|
||||
}
|
||||
fn make_load_store_execution_state() -> MockMemory {
|
||||
MockMemory::new(vec![], vec![Self::OK as u64], [])
|
||||
}
|
||||
}
|
||||
|
||||
#[hdl]
|
||||
#[test]
|
||||
fn test_rename_execute_retire_save_restore_gprs() {
|
||||
let _n = SourceLocation::normalize_files_for_tests();
|
||||
let mut config = CpuConfig::new(
|
||||
vec![
|
||||
UnitConfig::new(UnitKind::AluBranch),
|
||||
UnitConfig::new(UnitKind::AluBranch),
|
||||
UnitConfig::new(UnitKind::LoadStore),
|
||||
UnitConfig::new(UnitKind::TransformedMove),
|
||||
],
|
||||
NonZeroUsize::new(20).unwrap(),
|
||||
);
|
||||
config.fetch_width = NonZeroUsize::new(2).unwrap();
|
||||
let m = rename_execute_retire_test_harness::<SaveRestoreGprsInsns>(
|
||||
PhantomConst::new_sized(config),
|
||||
true,
|
||||
);
|
||||
let mut sim = Simulation::new(m);
|
||||
let writer = RcWriter::default();
|
||||
sim.add_trace_writer(VcdWriterDecls::new(writer.clone()));
|
||||
struct DumpVcdOnDrop {
|
||||
writer: Option<RcWriter>,
|
||||
}
|
||||
impl Drop for DumpVcdOnDrop {
|
||||
fn drop(&mut self) {
|
||||
if let Some(mut writer) = self.writer.take() {
|
||||
let vcd = String::from_utf8(writer.take()).unwrap();
|
||||
println!("####### VCD:\n{vcd}\n#######");
|
||||
}
|
||||
}
|
||||
}
|
||||
let mut writer = DumpVcdOnDrop {
|
||||
writer: Some(writer),
|
||||
};
|
||||
sim.write_clock(sim.io().cd.clk, false);
|
||||
sim.write_reset(sim.io().cd.rst, true);
|
||||
for cycle in 0..700 {
|
||||
sim.advance_time(SimDuration::from_nanos(500));
|
||||
println!("clock tick: {cycle}");
|
||||
sim.write_clock(sim.io().cd.clk, true);
|
||||
sim.advance_time(SimDuration::from_nanos(500));
|
||||
sim.write_clock(sim.io().cd.clk, false);
|
||||
sim.write_reset(sim.io().cd.rst, false);
|
||||
}
|
||||
assert!(sim.read_bool(sim.io().all_outputs_written));
|
||||
// FIXME: vcd is just whatever rename_execute_retire does now, which isn't known to be correct
|
||||
let vcd = String::from_utf8(writer.writer.take().unwrap().take()).unwrap();
|
||||
println!("####### VCD:\n{vcd}\n#######");
|
||||
if vcd != include_str!("expected/rename_execute_retire_save_restore_gprs.vcd") {
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue