-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforwarding_unit.c
64 lines (55 loc) · 2.07 KB
/
forwarding_unit.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "hazard.h"
void forwarding(MIPS32Simulator * sim, Log log[MEM_SIZE])
{
if(!sim->id_on || !sim->ex_on) /* no forwarding if pc met EOP */
return;
// no hazard
sim->fwd_ctrl.FwdA = 0x00;
sim->fwd_ctrl.FwdB = 0x00;
// EXE Forward - rs
if(sim->ex_mem_ctrl.RegWrite &&
sim->ex_mem_reg.rd_num != 0 &&
sim->ex_mem_reg.rd_num == sim->id_ex_reg.rs_num)
sim->fwd_ctrl.FwdA = 0x02;
// MEM Forward - rs
if(sim->mem_wb_ctrl.RegWrite && sim->mem_wb_reg.rd_num != 0
&& !(sim->ex_mem_ctrl.RegWrite && sim->ex_mem_reg.rd_num != 0
&& (sim->ex_mem_reg.rd_num == sim->id_ex_reg.rs_num))
&& sim->mem_wb_reg.rd_num == sim->id_ex_reg.rs_num)
sim->fwd_ctrl.FwdA = 0x01;
// EXE Forward - rt
if(sim->ex_mem_ctrl.RegWrite &&
sim->ex_mem_reg.rd_num != 0 &&
sim->ex_mem_reg.rd_num == sim->id_ex_reg.rt_num)
sim->fwd_ctrl.FwdB = 0x02;
// MEM Forward - rt
if(sim->mem_wb_ctrl.RegWrite && sim->mem_wb_reg.rd_num != 0
&& !(sim->ex_mem_ctrl.RegWrite && sim->ex_mem_reg.rd_num != 0
&& (sim->ex_mem_reg.rd_num == sim->id_ex_reg.rt_num))
&& sim->mem_wb_reg.rd_num == sim->id_ex_reg.rt_num)
sim->fwd_ctrl.FwdB = 0x01;
// MUX - first source operand, hazard check
if(sim->fwd_ctrl.FwdA == 0x02) /* EXE Forward */
{
sim->id_ex_reg.rs_val = sim->ex_mem_reg.ALU_result;
print_forwarding(sim, log, "EXE");
}
if(sim->fwd_ctrl.FwdA == 0x01) /* MEM Forward */
{
sim->id_ex_reg.rs_val = (sim->mem_wb_ctrl.MemtoReg == ON) ?
sim->mem_wb_reg.load_data : sim->mem_wb_reg.ALU_result;
print_forwarding(sim, log, "MEM");
}
// MUX - second source operand, hazard check
if(sim->fwd_ctrl.FwdB == 0x02) /* EXE Forward */
{
sim->id_ex_reg.rt_val = sim->ex_mem_reg.ALU_result;
print_forwarding(sim, log, "EXE");
}
if(sim->fwd_ctrl.FwdB == 0x01) /* MEM Forward */
{
sim->id_ex_reg.rt_val = (sim->mem_wb_ctrl.MemtoReg == ON) ?
sim->mem_wb_reg.load_data : sim->mem_wb_reg.ALU_result;
print_forwarding(sim, log, "MEM");
}
}