@@ -14,16 +14,64 @@ class ForwardingSpeed extends Module {
1414 val outData = Output (UInt (32 .W ))
1515 })
1616
17- val instrReg = RegNext (io.instr, 0x00000033 .U ) // nop on reset
1817
1918 val rs1 = io.instr(19 , 15 )
2019 val rs2 = io.instr(24 , 20 )
2120 val rd = io.instr(11 , 7 )
21+
2222 val (rs1Val, rs2Val, debugRegs) = registerFile(rs1, rs2, RegNext (io.wbDest), RegNext (io.wbData), RegNext (io.wrEna), true )
2323
24+ val instrReg = RegNext (io.instr, 0x00000033 .U ) // nop on reset
25+ val dummyOp = instrReg(3 , 0 )
26+ val rs1Reg = instrReg(19 , 15 )
27+ val rs2Reg = instrReg(24 , 20 )
28+ val rdReg = instrReg(11 , 7 )
29+
30+ class DecEx extends Bundle {
31+ val dummyOp = UInt (4 .W )
32+ val rs1 = UInt (5 .W )
33+ val rs2 = UInt (5 .W )
34+ val rs1Val = UInt (32 .W )
35+ val rs2Val = UInt (32 .W )
36+ val rd = UInt (5 .W )
37+ }
38+
39+ class ExMem extends Bundle {
40+ val aluRes = UInt (32 .W )
41+ val rd = UInt (5 .W )
42+ }
43+
44+ val decExReg = RegInit (0 .U .asTypeOf(new DecEx ))
45+ decExReg.dummyOp := dummyOp
46+ decExReg.rs1 := rs1Reg
47+ decExReg.rs2 := rs2Reg
48+ decExReg.rd := rdReg
49+
50+ val exForwarding = false
51+
52+ val res = Wire (UInt (32 .W ))
53+ val exMemReg = RegInit (0 .U .asTypeOf(new ExMem ))
54+
55+ if (exForwarding) {
56+ decExReg.rs1Val := rs1Val
57+ decExReg.rs2Val := rs2Val
58+
59+ res := alu(decExReg.dummyOp,
60+ Mux (decExReg.rs1 === exMemReg.rd, exMemReg.aluRes, decExReg.rs1Val),
61+ Mux (decExReg.rs2 === exMemReg.rd, exMemReg.aluRes, decExReg.rs2Val)
62+ )
63+ } else {
64+
65+ decExReg.rs1Val := Mux (rs1Reg === decExReg.rd, res, rs1Val)
66+ decExReg.rs2Val := Mux (rs2Reg === decExReg.rd, res, rs2Val)
67+
68+ res := alu(decExReg.dummyOp, decExReg.rs1Val, decExReg.rs2Val)
69+ }
2470
71+ exMemReg.aluRes := res
72+ exMemReg.rd := decExReg.rd
2573
26- out.outData := RegNext (rs1Val + rs2Val)
74+ out.outData := exMemReg.aluRes
2775}
2876
2977object ForwardingSpeed extends App {
0 commit comments