Skip to content

Commit 8548b72

Browse files
committed
Compare forwarding
1 parent f98e5e1 commit 8548b72

3 files changed

Lines changed: 67 additions & 3 deletions

File tree

doc/NOTES.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,22 @@ max_tt_025C_1v80: -1.72
3131

3232
Summary: the plain ALU can run at 200 MHz.
3333

34+
### ForwardingSpeed
35+
36+
Clock 5 ns (200 MHz)
37+
38+
#### Forwarding in EX stage
39+
40+
max_tt_025C_1v80: -1.25
41+
42+
#### Forwarding in ID stage
43+
44+
max_tt_025C_1v80: 0.094
45+
46+
t_ex = 6.25 ns (160 MHz)
47+
t_id = 4.9 ns (204 MHz)
48+
28% higher fmax!
49+
3450
## Wildcat synth results:
3551

3652
Xilinx/AMD FPGA 100 MHz, ASIC 50 MHz constraint

forwarding.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"DESIGN_NAME": "ForwardingSpeed",
33
"VERILOG_FILES": ["dir::generated/ForwardingSpeed.v"],
4-
"CLOCK_PERIOD": 20,
4+
"CLOCK_PERIOD": 5,
55
"CLOCK_PORT": "clock"
66
}

src/main/scala/wildcat/explore/ForwardingSpeed.scala

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

2977
object ForwardingSpeed extends App {

0 commit comments

Comments
 (0)