diff options
| author | bd <bdunahu@operationnull.com> | 2025-04-01 00:49:52 -0400 | 
|---|---|---|
| committer | bd <bdunahu@operationnull.com> | 2025-04-01 00:49:52 -0400 | 
| commit | 6579f7272905d1e25b43ef051da6c2180e60ca2b (patch) | |
| tree | a4b217aa56126f7d05304ab93f6c36b66fd6b694 /src/sim/mm.cc | |
| parent | a4e0e5ff6208205f6ebd980f9ed1eca91dcc4311 (diff) | |
Ensure all stages only do work if they are not 'OK'
Diffstat (limited to 'src/sim/mm.cc')
| -rw-r--r-- | src/sim/mm.cc | 44 | 
1 files changed, 25 insertions, 19 deletions
| diff --git a/src/sim/mm.cc b/src/sim/mm.cc index cd85056..c83ae7d 100644 --- a/src/sim/mm.cc +++ b/src/sim/mm.cc @@ -4,26 +4,32 @@  #include "response.h"  #include "stage.h" -MM::MM(Stage *stage) : Stage(stage) { this->id = MEM; }  +MM::MM(Stage *stage) : Stage(stage) { this->id = MEM; } -void MM::advance_helper() { -	Response r; +void MM::advance_helper() +{  	signed int data; -	if(this->curr_instr){ -		if (this->curr_instr->get_mnemonic() == LOAD) { -			r = this->storage->read_word(this->id, this->curr_instr->get_s1(), data); -			if(r == OK){ -				this->status = OK; -				this->curr_instr->set_s2(data); -			} -		} else if (this->curr_instr->get_mnemonic() == STORE) { -			r = this->storage->write_word(this->id, this->curr_instr->get_s2(), this->curr_instr->get_s1()); -			if(r == OK){ -				this->status = OK; -			} -		} else { -			// Mem has no work so just forward the instruction to WB -			this->status = OK; + +	switch (this->curr_instr->get_mnemonic()) { +	case LOAD: +		this->status = this->storage->read_word( +			this->id, this->curr_instr->get_s1(), data); +		if (this->status == OK) { +			this->curr_instr->set_s2(data); +		} else +			this->status = STALLED; +		break; + +	case STORE: +		// TODO signed issues, we aren't wrapping addresses +		this->status = this->storage->write_word( +			this->id, this->curr_instr->get_s2(), this->curr_instr->get_s1()); +		if (this->status != OK) { +			this->status = STALLED;  		} -	}  +		break; + +	default: +		this->status = OK; +	}  } | 
