65
65
connect (machine->core (), &machine::Core::SIG, \
66
66
VAR, &coreview::MultiText::multitext_update); \
67
67
} while (false )
68
+ #define NEW_MUX (VAR, X, Y, SIG, ...) do { \
69
+ NEW (Multiplexer, VAR, X, Y, __VA_ARGS__); \
70
+ connect (machine->core (), SIGNAL (SIG (std::uint32_t )), VAR, SLOT (set (std::uint32_t ))); \
71
+ } while (false )
72
+ #define NEW_MINIMUX (VAR, X, Y, SIG, ...) do { \
73
+ NEW (MiniMux, VAR, X, Y, __VA_ARGS__); \
74
+ connect (machine->core (), SIGNAL (SIG (std::uint32_t )), VAR, SLOT (set (std::uint32_t ))); \
75
+ } while (false )
68
76
69
77
CoreViewScene::CoreViewScene (machine::QtMipsMachine *machine) : QGraphicsScene() {
70
78
setSceneRect (0 , 0 , SC_WIDTH, SC_HEIGHT);
@@ -85,7 +93,7 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()
85
93
NEW_B (Constant, ft.adder_4 , ft.adder ->connector_in_b (), " 4" );
86
94
NEW (Junction, ft.junc_pc , 80 , mem_program->connector_address ()->y ());
87
95
NEW (Junction, ft.junc_pc_4 , 130 , 380 );
88
- NEW (Multiplexer, ft.multiplex , 20 , 390 , 2 );
96
+ NEW_MUX ( ft.multiplex , 20 , 390 , fetch_branch_value , 2 );
89
97
// Decode stage
90
98
NEW (LogicBlock, dc.ctl_block , 230 , 90 , {" Control" , " unit" });
91
99
dc.ctl_block ->setSize (35 , 70 );
@@ -94,7 +102,7 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()
94
102
NEW (Adder, dc.add , 340 , 428 );
95
103
const coreview::Connector *dc_con_sign_ext = dc.sign_ext ->new_connector (1 , 0 );
96
104
NEW (Junction, dc.j_sign_ext , 290 , dc_con_sign_ext->y ());
97
- NEW (LogicBlock, dc.cmp , 320 , 200 , " =" );
105
+ NEW (LogicBlock, dc.cmp , 312 , 200 , " =" );
98
106
NEW (And, dc.and_branch , 350 , 190 );
99
107
dc.cmp ->setSize (24 , 12 );
100
108
NEW (Junction, dc.j_inst_up , 190 , 126 );
@@ -103,8 +111,8 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()
103
111
NEW (Junction, dc.j_jump_reg , 355 , 94 );
104
112
// Execute stage
105
113
NEW (Junction, ex.j_mux , 450 , 303 );
106
- NEW (Multiplexer, ex.mux_imm , 470 , 292 , 2 , true );
107
- NEW (Multiplexer, ex.mux_regdest , 480 , 370 , 2 , true );
114
+ NEW_MUX ( ex.mux_imm , 470 , 292 , execute_alusrc_value , 2 , true );
115
+ NEW_MUX ( ex.mux_regdest , 480 , 370 , execute_regdest_value , 2 , true );
108
116
// Memory
109
117
NEW (Junction, mm.j_addr , 570 , mem_data->connector_address ()->y ());
110
118
static QMap<std::uint32_t , QString> excause_map =
@@ -123,7 +131,7 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()
123
131
NEW_MULTI (mm.multi_excause , 602 , 447 , memory_excause_value, excause_map, true );
124
132
new_label (" Exception" , 595 , 437 );
125
133
// WriteBack stage
126
- NEW (Multiplexer, wb.mem_or_reg , 690 , 252 , 2 , true );
134
+ NEW_MUX ( wb.mem_or_reg , 690 , 252 , writeback_memtoreg_value , 2 , true );
127
135
NEW (Junction, wb.j_reg_write_val , 411 , 510 );
128
136
129
137
// Connections //
@@ -204,7 +212,7 @@ CoreViewScene::CoreViewScene(machine::QtMipsMachine *machine) : QGraphicsScene()
204
212
NEW_V (560 , 260 , memory_alu_value, true ); // Alu output
205
213
NEW_V (560 , 345 , memory_rt_value, true ); // rt
206
214
NEW_V (650 , 290 , memory_mem_value, true ); // Memory output
207
- NEW_V (570 , 113 , execute_memtoreg_value , false , 1 );
215
+ NEW_V (570 , 113 , memory_memtoreg_value , false , 1 );
208
216
NEW_V (630 , 220 , memory_memwrite_value, false , 1 );
209
217
NEW_V (620 , 220 , memory_memread_value, false , 1 );
210
218
// Write back stage
@@ -377,12 +385,13 @@ CoreViewScenePipelined::CoreViewScenePipelined(machine::QtMipsMachine *machine)
377
385
struct coreview ::Latch::ConnectorPair lp_dc_rt = latch_id_ex->new_connector (regs->connector_read2 ()->y () - latch_id_ex->y ());
378
386
coreview::Bus *regs_bus1 = new_bus (regs->connector_read1 (), lp_dc_rs.in );
379
387
coreview::Bus *regs_bus2 = new_bus (regs->connector_read2 (), lp_dc_rt.in );
380
- // if (machine->config().hazard_unit() == machine::MachineConfig::HU_NONE) {
381
- const coreview::Connector *regs_bus_con = dc.cmp ->new_connector (-0.5 , 1 );
388
+ const coreview::Connector *regs_bus_con;
389
+ if (machine->config ().hazard_unit () != machine::MachineConfig::HU_STALL_FORWARD) {
390
+ regs_bus_con = dc.cmp ->new_connector (-0.5 , 1 );
382
391
new_bus (regs_bus1->new_connector (regs_bus_con->point (), coreview::Connector::AX_Y), regs_bus_con);
383
392
regs_bus_con = dc.cmp ->new_connector (0.5 , 1 );
384
393
new_bus (regs_bus2->new_connector (regs_bus_con->point (), coreview::Connector::AX_Y), regs_bus_con);
385
- // } // TODO else
394
+ }
386
395
struct coreview ::Latch::ConnectorPair lp_dc_immed = latch_id_ex->new_connector (dc.j_sign_ext ->y () - latch_id_ex->y ());
387
396
new_bus (dc.j_sign_ext ->new_connector (coreview::Connector::AX_X), lp_dc_immed.in );
388
397
struct coreview ::Latch::ConnectorPair regdest_dc_rt = latch_id_ex->new_connector (ex.mux_regdest ->connector_in (0 )->point ().y () - latch_id_ex->y ());
@@ -489,8 +498,10 @@ CoreViewScenePipelined::CoreViewScenePipelined(machine::QtMipsMachine *machine)
489
498
NEW_V (610 , 385 , memory_regw_num_value, false , 2 , 0 , 10 );
490
499
491
500
if (machine->config ().hazard_unit () == machine::MachineConfig::HU_STALL_FORWARD) {
492
- NEW (Multiplexer, hu.mux_alu_reg_a , 430 , 232 , 3 , false );
493
- NEW (Multiplexer, hu.mux_alu_reg_b , 430 , 285 , 3 , false );
501
+ NEW_MUX (hu.mux_alu_reg_a , 430 , 232 , execute_reg1_ff_value, 3 , false );
502
+ NEW_MUX (hu.mux_alu_reg_b , 430 , 285 , execute_reg2_ff_value, 3 , false );
503
+ NEW_MINIMUX (hu.mux_branch_reg_a , 296 , 228 , forward_m_d_rs_value, 2 , false );
504
+ NEW_MINIMUX (hu.mux_branch_reg_b , 314 , 228 , forward_m_d_rt_value, 2 , false );
494
505
NEW (Junction, hu.j_alu_out , 420 , 490 );
495
506
496
507
con = new_bus (lp_dc_rs.out , hu.mux_alu_reg_a ->connector_in (0 ));
@@ -507,24 +518,29 @@ CoreViewScenePipelined::CoreViewScenePipelined(machine::QtMipsMachine *machine)
507
518
con = new_bus (hu.j_alu_out ->new_connector (CON_AX_Y), hu.mux_alu_reg_a ->connector_in (2 ));
508
519
con = new_bus (hu.j_alu_out ->new_connector (CON_AX_Y), hu.mux_alu_reg_b ->connector_in (2 ));
509
520
510
- con = new_bus (hu.j_alu_out ->new_connector (CON_AX_X), dc. cmp -> new_connector (- 0.5 , 1 ));
521
+ con = new_bus (hu.j_alu_out ->new_connector (CON_AX_X), hu. mux_branch_reg_a -> connector_in ( 1 ));
511
522
con->setAxes ({CON_AXIS_Y (380 ), CON_AXIS_X (330 )});
512
- con = new_bus (hu.j_alu_out ->new_connector (CON_AX_X), dc. cmp -> new_connector ( 0.5 , 1 ));
523
+ con = new_bus (hu.j_alu_out ->new_connector (CON_AX_X), hu. mux_branch_reg_b -> connector_in ( 1 ));
513
524
con->setAxes ({CON_AXIS_Y (380 ), CON_AXIS_X (330 )});
514
525
526
+ new_bus (regs_bus1->new_connector (hu.mux_branch_reg_a ->connector_in (0 )->point (), coreview::Connector::AX_Y), hu.mux_branch_reg_a ->connector_in (0 ));
527
+ new_bus (regs_bus2->new_connector (hu.mux_branch_reg_b ->connector_in (0 )->point (), coreview::Connector::AX_Y), hu.mux_branch_reg_b ->connector_in (0 ));
528
+
529
+ con = new_bus (hu.mux_branch_reg_a ->connector_out (), dc.cmp ->new_connector (-0.75 , 1 ));
530
+ con = new_bus (hu.mux_branch_reg_b ->connector_out (), dc.cmp ->new_connector (0.75 , 1 ));
531
+
515
532
struct coreview ::Latch::ConnectorPair regdest_dc_rs = latch_id_ex->new_connector (ex.mux_regdest ->connector_in (0 )->point ().y () - latch_id_ex->y () - 8 );
516
533
new_bus (dc.instr_bus ->new_connector (0 , ex.mux_regdest ->connector_in (0 )->y () - 8 ), regdest_dc_rs.in , 2 );
517
534
new_label (" RsE" , 427 , 364 );
518
535
NEW_V (450 , 370 , execute_rs_num_value, false , 2 , 0 , 10 );
519
536
NEW (Junction, ex.j_rs_num , 442 , 372 );
520
537
new_bus (regdest_dc_rs.out , ex.j_rs_num ->new_connector (coreview::Connector::AX_X), 2 );
521
538
539
+ NEW_V (434 , 227 , execute_reg1_ff_value, false , 1 ); // Register 1 forward to ALU
540
+ NEW_V (434 , 280 , execute_reg2_ff_value, false , 1 ); // Register 2 forward to ALU
522
541
523
- NEW_V (434 , 250 , execute_reg1_ff_value, false , 1 ); // Register 1 forward to ALU
524
- NEW_V (434 , 303 , execute_reg2_ff_value, false , 1 ); // Register 2 forward to ALU
525
-
526
- NEW_V (312 , 290 , forward_m_d_rs_value, false , 1 ); // Register 1 forward for bxx and jr, jalr
527
- NEW_V (327 , 290 , forward_m_d_rt_value, false , 1 ); // Register 2 forward for beq, bne
542
+ NEW_V (291 , 230 , forward_m_d_rs_value, false , 1 ); // Register 1 forward for bxx and jr, jalr
543
+ NEW_V (333 , 230 , forward_m_d_rt_value, false , 1 ); // Register 2 forward for beq, bne
528
544
529
545
}
530
546
}
0 commit comments