From 94a0435da91501d2320d6081c552cb5df0c4433d Mon Sep 17 00:00:00 2001 From: bd Date: Thu, 17 Apr 2025 01:17:48 -0400 Subject: Keep track of checked out in DTO to simplify wb cond logic (bug) --- src/sim/wb.cc | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'src/sim/wb.cc') diff --git a/src/sim/wb.cc b/src/sim/wb.cc index 01768e8..3fa7dd3 100644 --- a/src/sim/wb.cc +++ b/src/sim/wb.cc @@ -3,6 +3,8 @@ #include "instrDTO.h" #include "response.h" #include "stage.h" +#include +#include WB::WB(Stage *stage) : Stage(stage) { this->id = WRITE; } @@ -10,7 +12,7 @@ void WB::advance_helper() { if (this->curr_instr->get_mnemonic() != NOP && this->curr_instr->get_type() != INV) { - if (this->should_write()) + if (this->curr_instr->get_checked_out() > 0) this->write_handler(); else if (this->should_jump()) this->jump_handler(); @@ -26,8 +28,9 @@ void WB::write_handler() throw std::runtime_error("instruction tried to pop a register out of " "an empty queue during writeback."); - reg = this->checked_out.front(); this->checked_out.pop_front(); + reg = this->curr_instr->get_checked_out(); + std::cout << "checked in: " << reg << std::endl; this->store_register(reg, this->curr_instr->get_s1()); } @@ -49,13 +52,3 @@ bool WB::should_jump() t = this->curr_instr->get_type(); return t == J; } - -bool WB::should_write() -{ - Mnemonic m; - Type t; - - m = this->curr_instr->get_mnemonic(); - t = this->curr_instr->get_type(); - return (t == R || t == I) && (m != STORE && m != STOREV); -} -- cgit v1.2.3 From 430986b4b1ee1013db070991ce289176f48fa8e8 Mon Sep 17 00:00:00 2001 From: bd Date: Thu, 17 Apr 2025 02:23:37 -0400 Subject: Swap the source and destination registers for LOAD, final fix --- inc/id.h | 2 +- src/sim/wb.cc | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'src/sim/wb.cc') diff --git a/inc/id.h b/inc/id.h index ed13771..c1810ae 100644 --- a/inc/id.h +++ b/inc/id.h @@ -67,7 +67,7 @@ class ID : public Stage * @param the resulting mnemonic. */ void get_instr_fields(signed int &s1, signed int &s2, signed int &s3, Mnemonic &m, Type &t); - void decode_R_type(signed int &s1, signed int &s2, signed int &s3); + void decode_R_type(signed int &s1, signed int &s2, signed int &s3, Mnemonic &m); void decode_I_type(signed int &s1, signed int &s2, signed int &s3, Mnemonic &m); void decode_J_type(signed int &s1, signed int &s2, signed int &s3); /** diff --git a/src/sim/wb.cc b/src/sim/wb.cc index 3fa7dd3..4e6b2b0 100644 --- a/src/sim/wb.cc +++ b/src/sim/wb.cc @@ -30,7 +30,6 @@ void WB::write_handler() this->checked_out.pop_front(); reg = this->curr_instr->get_checked_out(); - std::cout << "checked in: " << reg << std::endl; this->store_register(reg, this->curr_instr->get_s1()); } -- cgit v1.2.3