Browse Source

Make forwarder ignore the zero register

sindre-ex2
Sindre Stephansen 6 years ago
parent
commit
fb1cb947be
1 changed files with 19 additions and 9 deletions
  1. +19
    -9
      src/main/scala/Forwarder.scala

+ 19
- 9
src/main/scala/Forwarder.scala View File

@@ -18,14 +18,24 @@ class Forwarder extends Module {
val loadFreeze = Output(Bool())
})

val exToRs1 = io.ID.instruction.registerRs1 === io.EX.instruction.registerRd && io.EX.controlSignals.regWrite
val exToRs2 = io.ID.instruction.registerRs2 === io.EX.instruction.registerRd && io.EX.controlSignals.regWrite
val memToRs1 = io.ID.instruction.registerRs1 === io.MEM.instruction.registerRd && io.MEM.controlSignals.regWrite
val memToRs2 = io.ID.instruction.registerRs2 === io.MEM.instruction.registerRd && io.MEM.controlSignals.regWrite
val wbToRs1 = io.ID.instruction.registerRs1 === io.WB.instruction.registerRd && io.WB.controlSignals.regWrite
val wbToRs2 = io.ID.instruction.registerRs2 === io.WB.instruction.registerRd && io.WB.controlSignals.regWrite
val ldToRs1 = exToRs1 && io.EX.controlSignals.memToReg
val ldToRs2 = exToRs2 && io.EX.controlSignals.memToReg
// Helper variables, to avoid long lines
val IDRs1 = io.ID.instruction.registerRs1
val IDRs2 = io.ID.instruction.registerRs2
val EXRd = io.EX.instruction.registerRd
val MEMRd = io.MEM.instruction.registerRd
val WBRd = io.WB.instruction.registerRd
val EXRegWrite = io.EX.controlSignals.regWrite
val MEMRegWrite = io.MEM.controlSignals.regWrite
val WBRegWrite = io.WB.controlSignals.regWrite

val exToRs1 = IDRs1 === EXRd && IDRs1 =/= 0.U && EXRegWrite
val exToRs2 = IDRs2 === EXRd && IDRs2 =/= 0.U && EXRegWrite
val memToRs1 = IDRs1 === MEMRd && IDRs1 =/= 0.U && MEMRegWrite
val memToRs2 = IDRs2 === MEMRd && IDRs2 =/= 0.U && MEMRegWrite
val wbToRs1 = IDRs1 === WBRd && IDRs1 =/= 0.U && WBRegWrite
val wbToRs2 = IDRs2 === WBRd && IDRs2 =/= 0.U && WBRegWrite
val ldToRs1 = exToRs1 && io.EX.controlSignals.memToReg
val ldToRs2 = exToRs2 && io.EX.controlSignals.memToReg

io.loadFreeze := (ldToRs1 || ldToRs2)

@@ -56,7 +66,7 @@ class Forwarder extends Module {

// If a value read from MEM is used as the address in the next instruction, forward it
val memToMem = io.EX.instruction.registerRs2 === io.MEM.instruction.registerRd && io.EX.controlSignals.memWrite
val wbToMem = io.EX.instruction.registerRs2 === io.WB.instruction.registerRd && io.EX.controlSignals.memWrite
val wbToMem = io.EX.instruction.registerRs2 === io.WB.instruction.registerRd && io.EX.controlSignals.memWrite

when (memToMem) {
io.memWrite := io.writeback


Loading…
Cancel
Save