diff options
author | bd <bdunaisky@umass.edu> | 2025-04-02 04:05:18 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-02 04:05:18 +0000 |
commit | 9fb95d655393777dde5929182f94de36f903821d (patch) | |
tree | 4462f35895737460a01fab891a15f87aba2efb70 /src/sim/mm.cc | |
parent | 24f0bd8af57381ab3112b5774d4ad23ac80f0718 (diff) | |
parent | 3eeb345d673bee6d62b04fc8a8a95ab822dc1e45 (diff) |
Merge pull request #46 from bdunahu/bdunahu
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..07a362b 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_s1(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; + } } |