diff options
| author | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-18 20:49:08 +0100 | 
|---|---|---|
| committer | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-18 20:49:08 +0100 | 
| commit | 0ccd55c011f72b5bb7d11a1f683e5ac949702417 (patch) | |
| tree | 16d004557afeb5b023c902fddc3acdcf6d5bc453 | |
| parent | 1ef78a15bdac490cf5e0b74fcde8539719f4bfe6 (diff) | |
| download | qtmips-0ccd55c011f72b5bb7d11a1f683e5ac949702417.tar.gz qtmips-0ccd55c011f72b5bb7d11a1f683e5ac949702417.tar.bz2 qtmips-0ccd55c011f72b5bb7d11a1f683e5ac949702417.zip | |
Report forward and stall for branches and add forward to execution phase.
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
| -rw-r--r-- | qtmips_gui/coreview.cpp | 9 | ||||
| -rw-r--r-- | qtmips_gui/coreview/multitext.cpp | 9 | ||||
| -rw-r--r-- | qtmips_gui/coreview/multitext.h | 3 | ||||
| -rw-r--r-- | qtmips_machine/core.cpp | 10 | ||||
| -rw-r--r-- | qtmips_machine/core.h | 3 | 
5 files changed, 25 insertions, 9 deletions
| diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index 89644ec..2e8ec5c 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -111,8 +111,8 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()           {machine::EXCAUSE_HWBREAK,  "HWBREAK"},           {machine::EXCAUSE_TRAP,     "TRAP"},           {machine::EXCAUSE_OVERFLOW, "OVERFLOW"}}; - -    NEW_MULTI(mm.multi_excause, 602, 447, memory_excause_value, excause_map); +    NEW_MULTI(mm.multi_excause, 602, 447, memory_excause_value, excause_map, true); +    new_label("Exception", 595, 437);      // WriteBack stage      NEW(Multiplexer, wb.mem_or_reg, 690, 252, 2, true);      NEW(Junction, wb.j_reg_write_val, 411, 510); @@ -342,8 +342,9 @@ CoreViewScenePipelined::CoreViewScenePipelined(machine::QtMipsMachine *machine)      if (machine->config().hazard_unit() != machine::MachineConfig::HU_NONE) {          NEW(LogicBlock, hazard_unit, SC_WIDTH/2, SC_HEIGHT - 15, "Hazard Unit");          hazard_unit->setSize(SC_WIDTH - 100, 12); -        static QMap<std::uint32_t, QString> stall_map = {{0, "NORMAL"},{1, "STALL"}}; -        NEW_MULTI(hu.multi_stall, 480, 447, execute_stall_value, stall_map); +        static QMap<std::uint32_t, QString> stall_map = {{0, "NORMAL"},{1, "STALL"},{2, "FORWARD"}}; +        NEW_MULTI(hu.multi_stall, 480, 447, execute_stall_forward_value, stall_map); +        NEW_MULTI(hu.multi_stall, 310, 340, branch_forward_value, stall_map);          NEW_MULTI(hu.multi_stall, 250, SC_HEIGHT - 15, hu_stall_value, stall_map);      }      coreview::Connection *con; diff --git a/qtmips_gui/coreview/multitext.cpp b/qtmips_gui/coreview/multitext.cpp index d28b5be..1658b55 100644 --- a/qtmips_gui/coreview/multitext.cpp +++ b/qtmips_gui/coreview/multitext.cpp @@ -47,13 +47,14 @@ using namespace coreview;  #define PENW 1  ////////////////////// -MultiText::MultiText(QMap<std::uint32_t, QString> value_map) : +MultiText::MultiText(QMap<std::uint32_t, QString> value_map, bool nonzero_red) :                   QGraphicsObject(nullptr), text(this) {      QFont f;      f.setPointSize(6);      text.setFont(f);      this->value_map = value_map; +    this->nonzero_red = nonzero_red;      multitext_update(0);  } @@ -64,7 +65,11 @@ QRectF MultiText::boundingRect() const {  void MultiText::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) {      painter->setPen(QPen(QColor(240, 240, 240))); -    painter->setBrush(QBrush(QColor(240, 240, 240))); +    if (value != 0 && nonzero_red) +        painter->setBrush(QBrush(QColor(255, 100, 100))); +    else +        painter->setBrush(QBrush(QColor(240, 240, 240))); +      painter->drawRoundRect(-WIDTH/2, 0, WIDTH, HEIGHT, ROUND, ROUND);  } diff --git a/qtmips_gui/coreview/multitext.h b/qtmips_gui/coreview/multitext.h index 9d1f0ab..48c9652 100644 --- a/qtmips_gui/coreview/multitext.h +++ b/qtmips_gui/coreview/multitext.h @@ -46,7 +46,7 @@ namespace coreview {  class MultiText : public QGraphicsObject {      Q_OBJECT  public: -    MultiText(QMap<std::uint32_t, QString> value_map); +    MultiText(QMap<std::uint32_t, QString> value_map, bool nonzero_red = false);      QRectF boundingRect() const;      void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); @@ -58,6 +58,7 @@ private:      QGraphicsSimpleTextItem text;      std::uint32_t value;      QMap<std::uint32_t, QString> value_map; +    std::uint32_t nonzero_red;  };  } diff --git a/qtmips_machine/core.cpp b/qtmips_machine/core.cpp index e6f0971..a282807 100644 --- a/qtmips_machine/core.cpp +++ b/qtmips_machine/core.cpp @@ -370,7 +370,12 @@ struct Core::dtExecute Core::execute(const struct dtDecode &dt) {      emit execute_alusrc_value(dt.alusrc);      emit execute_regdest_value(dt.regd);      emit execute_regw_num_value(dt.rwrite); -    emit execute_stall_value(dt.stall); +    if (dt.stall) +        emit execute_stall_forward_value(1); +    else if (dt.ff_rs != FORWARD_NONE || dt.ff_rt != FORWARD_NONE) +        emit execute_stall_forward_value(2); +    else +        emit execute_stall_forward_value(0);      return {          .inst = dt.inst, @@ -612,6 +617,7 @@ CorePipelined::CorePipelined(Registers *regs, MemoryAccess *mem_program, MemoryA  void CorePipelined::do_step(bool skip_break) {      bool stall = false; +    bool branch_stall = false;      bool excpt_in_progress = false;      std::uint32_t jump_branch_pc = dt_m.inst_addr; @@ -697,6 +703,7 @@ void CorePipelined::do_step(bool skip_break) {              ((dt_d.bjr_req_rs && dt_d.inst.rs() == dt_e.rwrite) ||               (dt_d.bjr_req_rt && dt_d.inst.rt() == dt_e.rwrite))) {              stall = true; +            branch_stall = true;          } else {              if (hazard_unit != MachineConfig::HU_STALL_FORWARD || dt_m.memtoreg) {                  if (dt_m.rwrite != 0 && dt_m.regwrite && @@ -719,6 +726,7 @@ void CorePipelined::do_step(bool skip_break) {          emit forward_m_d_rs_value(dt_d.forward_m_d_rs);          emit forward_m_d_rt_value(dt_d.forward_m_d_rt);      } +    emit branch_forward_value((dt_d.forward_m_d_rs || dt_d.forward_m_d_rt)? 2: branch_stall);  #if 0      if (stall)          printf("STALL\n"); diff --git a/qtmips_machine/core.h b/qtmips_machine/core.h index 950fc0c..8140f61 100644 --- a/qtmips_machine/core.h +++ b/qtmips_machine/core.h @@ -136,7 +136,7 @@ signals:      void execute_alusrc_value(std::uint32_t);      void execute_regdest_value(std::uint32_t);      void execute_regw_num_value(std::uint32_t); -    void execute_stall_value(std::uint32_t); +    void execute_stall_forward_value(std::uint32_t);      void memory_inst_addr_value(std::uint32_t);      void memory_alu_value(std::uint32_t);      void memory_rt_value(std::uint32_t); @@ -153,6 +153,7 @@ signals:      void writeback_regw_num_value(std::uint32_t);      void hu_stall_value(std::uint32_t); +    void branch_forward_value(std::uint32_t);      void stop_on_exception_reached(); | 
