| @@ -18,14 +18,24 @@ class Forwarder extends Module { | |||||
| val loadFreeze = Output(Bool()) | 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) | 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 | // 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 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) { | when (memToMem) { | ||||
| io.memWrite := io.writeback | io.memWrite := io.writeback | ||||