diff options
| -rw-r--r-- | qtmips_gui/coreview.cpp | 5 | ||||
| -rw-r--r-- | qtmips_machine/core.cpp | 14 | ||||
| -rw-r--r-- | qtmips_machine/core.h | 10 | 
3 files changed, 29 insertions, 0 deletions
| diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index f875ee8..0f10628 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -393,4 +393,9 @@ CoreViewScenePipelined::CoreViewScenePipelined(machine::QtMipsMachine *machine)      NEW_V(360, 105, decode_regw_value, false, 1);      NEW_V(460, 105, execute_regw_value, false, 1);      NEW_V(560, 105, execute_regw_value, false, 1); + +    if (machine->config().hazard_unit() == machine::MachineConfig::HU_STALL_FORWARD) { +        NEW_V(448, 460, execute_reg1_ff_value, false, 1); // Register 1 forward +        NEW_V(462, 460, execute_reg2_ff_value, false, 1); // Register 1 forward +    }  } diff --git a/qtmips_machine/core.cpp b/qtmips_machine/core.cpp index 5a0e831..17f2ccc 100644 --- a/qtmips_machine/core.cpp +++ b/qtmips_machine/core.cpp @@ -151,6 +151,8 @@ struct Core::dtDecode Core::decode(const struct dtFetch &dt) {          .memctl = dec.mem_ctl,          .val_rs = val_rs,          .val_rt = val_rt, +        .ff_rs = FORWARD_NONE, +        .ff_rt = FORWARD_NONE,      };  } @@ -171,6 +173,8 @@ struct Core::dtExecute Core::execute(const struct dtDecode &dt) {      emit execute_alu_value(alu_val);      emit execute_reg1_value(dt.val_rs);      emit execute_reg2_value(dt.val_rt); +    emit execute_reg1_ff_value(dt.ff_rs); +    emit execute_reg2_ff_value(dt.ff_rt);      emit execute_immediate_value(sign_extend(dt.inst.immediate()));      emit execute_regw_value(dt.regwrite);      emit execute_memtoreg_value(dt.memread); @@ -294,6 +298,8 @@ void Core::dtDecodeInit(struct dtDecode &dt) {      dt.aluop = ALU_OP_SLL;      dt.val_rs = 0;      dt.val_rt = 0; +    dt.ff_rs = FORWARD_NONE; +    dt.ff_rt = FORWARD_NONE;  }  void Core::dtExecuteInit(struct dtExecute &dt) { @@ -361,6 +367,10 @@ void CorePipelined::do_step() {      // TODO signals      bool stall = false; + +    dt_d.ff_rs = FORWARD_NONE; +    dt_d.ff_rt = FORWARD_NONE; +      if (hazard_unit != MachineConfig::HU_NONE) {          // Note: We make exception with $0 as that has no effect when written and is used in nop instruction @@ -377,9 +387,11 @@ void CorePipelined::do_step() {                  // Forward result value                  if (dt_m.rwrite == dt_d.inst.rs()) {                      dt_d.val_rs = dt_m.towrite_val; +                    dt_d.ff_rs = FORWARD_FROM_M;                  }                  if (dt_m.rwrite == dt_d.inst.rt()) {                      dt_d.val_rt = dt_m.towrite_val; +                    dt_d.ff_rt = FORWARD_FROM_M;                  }              } else                  stall = true; @@ -393,9 +405,11 @@ void CorePipelined::do_step() {                      // Forward result value                      if (dt_e.rwrite == dt_d.inst.rs()) {                          dt_d.val_rs = dt_e.alu_val; +                        dt_d.ff_rs = FORWARD_FROM_W;                       }                      if (dt_e.rwrite == dt_d.inst.rt()) {                          dt_d.val_rt = dt_e.alu_val; +                        dt_d.ff_rt = FORWARD_FROM_W;                      }                  }              } else diff --git a/qtmips_machine/core.h b/qtmips_machine/core.h index b368b3b..386b486 100644 --- a/qtmips_machine/core.h +++ b/qtmips_machine/core.h @@ -21,6 +21,12 @@ public:      unsigned cycles(); // Returns number of executed cycles +    enum ForwardFrom { +        FORWARD_NONE   = 0b00, +        FORWARD_FROM_W = 0b01, +        FORWARD_FROM_M = 0b10, +    }; +  signals:      void instruction_fetched(const machine::Instruction &inst);      void instruction_decoded(const machine::Instruction &inst); @@ -43,6 +49,8 @@ signals:      void execute_alu_value(std::uint32_t);      void execute_reg1_value(std::uint32_t);      void execute_reg2_value(std::uint32_t); +    void execute_reg1_ff_value(std::uint32_t); +    void execute_reg2_ff_value(std::uint32_t);      void execute_immediate_value(std::uint32_t);      void execute_regw_value(std::uint32_t);      void execute_memtoreg_value(std::uint32_t); @@ -81,6 +89,8 @@ protected:          enum MemoryAccess::AccessControl memctl; // Decoded memory access type          std::uint32_t val_rs; // Value from register rs          std::uint32_t val_rt; // Value from register rt +        ForwardFrom ff_rs; +        ForwardFrom ff_rt;      };      struct dtExecute {          Instruction inst; | 
