Mask LsuV2 regfile writes based on faults. Change-Id: I5903a12366394c0cbfa51736db97b59061bb5915
diff --git a/hdl/chisel/src/kelvin/scalar/Lsu.scala b/hdl/chisel/src/kelvin/scalar/Lsu.scala index baa0958..693815b 100644 --- a/hdl/chisel/src/kelvin/scalar/Lsu.scala +++ b/hdl/chisel/src/kelvin/scalar/Lsu.scala
@@ -1109,7 +1109,8 @@ // Writeback update // Scalar writeback - io.rd.valid := slot.shouldWriteback() && + // Write back on error. io.fault.valid will mask + io.rd.valid := (io.fault.valid || slot.shouldWriteback()) && slot.op.isOneOf(LsuOp.LB, LsuOp.LBU, LsuOp.LH, LsuOp.LHU, LsuOp.LW) io.rd.bits.data := slot.scalarLoadResult() io.rd.bits.addr := slot.rd
diff --git a/hdl/chisel/src/kelvin/scalar/SCore.scala b/hdl/chisel/src/kelvin/scalar/SCore.scala index 706b29f..33bae21 100644 --- a/hdl/chisel/src/kelvin/scalar/SCore.scala +++ b/hdl/chisel/src/kelvin/scalar/SCore.scala
@@ -406,19 +406,21 @@ regfile.io.writeData(mluDvuOffset).valid := arb.io.out.valid regfile.io.writeData(mluDvuOffset).bits.addr := arb.io.out.bits.addr regfile.io.writeData(mluDvuOffset).bits.data := arb.io.out.bits.data + // MLU/DVU port is never masked + regfile.io.writeMask(p.instructionLanes).valid := false.B val lsuOffset = p.instructionLanes + 1 regfile.io.writeData(lsuOffset).valid := lsu.io.rd.valid regfile.io.writeData(lsuOffset).bits.addr := lsu.io.rd.bits.addr regfile.io.writeData(lsuOffset).bits.data := lsu.io.rd.bits.data + // Mask LSU based on fault for LsuV2 only + regfile.io.writeMask(lsuOffset).valid := ( + if (p.useLsuV2) { lsu.io.fault.valid } else { false.B }) val writeMask = bru.map(_.io.taken.valid).scan(false.B)(_||_) for (i <- 0 until p.instructionLanes) { regfile.io.writeMask(i).valid := writeMask(i) } - // MLU/DVU and LSU ports are never masked - regfile.io.writeMask(p.instructionLanes).valid := false.B - regfile.io.writeMask(p.instructionLanes + 1).valid := false.B if (p.useDebugModule) { regfile.io.debugWriteValid.get := io.dm.get.scalar_rd.valid }