Apply masks to all write ports. Change-Id: If9636c190777ed28bc52b9f881ffa4a56878f11e
diff --git a/hdl/chisel/src/kelvin/scalar/Regfile.scala b/hdl/chisel/src/kelvin/scalar/Regfile.scala index 0e2ce2b..5df8332 100644 --- a/hdl/chisel/src/kelvin/scalar/Regfile.scala +++ b/hdl/chisel/src/kelvin/scalar/Regfile.scala
@@ -76,7 +76,7 @@ val valid = Input(Bool()) val bits = new RegfileWriteDataIO }) - val writeMask = Vec(p.instructionLanes, new Bundle {val valid = Input(Bool())}) + val writeMask = Vec(p.instructionLanes + extraWritePorts, new Bundle {val valid = Input(Bool())}) val scoreboard = new Bundle { val regd = Output(UInt(32.W)) val comb = Output(UInt(32.W)) @@ -135,15 +135,14 @@ writeData(0) := 0.U // regfile(0) is optimized away for (i <- 1 until 32) { - val valid = Cat( - Seq(io.writeData(p.instructionLanes + 1).valid && io.writeData(p.instructionLanes + 1).bits.addr === i.U, - io.writeData(p.instructionLanes).valid && io.writeData(p.instructionLanes).bits.addr === i.U) ++ - (0 until p.instructionLanes).reverse.map(x => io.writeData(x).valid && io.writeData(x).bits.addr === i.U && !io.writeMask(x).valid) - ) + val valid = (0 until p.instructionLanes + extraWritePorts).map(j => { + val addrValid = (io.writeData(j).bits.addr === i.U) + (io.writeData(j).valid && addrValid && !io.writeMask(j).valid)}) - val data = (0 until p.instructionLanes + extraWritePorts).map(x => MuxOR(valid(x), io.writeData(x).bits.data)).reduce(_|_) + val data = (0 until p.instructionLanes + extraWritePorts).map( + x => MuxOR(valid(x), io.writeData(x).bits.data)).reduce(_|_) - writeValid(i) := valid =/= 0.U + writeValid(i) := Cat(valid) =/= 0.U writeData(i) := data assert(PopCount(valid) <= 1.U) @@ -157,12 +156,10 @@ // We care if someone tried to write x0 (e.g. nop is encoded this way), but want // it separate for above mentioned optimization. - val x0 = - (0 until p.instructionLanes).map(x => + val x0 = (0 until p.instructionLanes).map(x => io.writeData(x).valid && io.writeData(x).bits.addr === 0.U && - !io.writeMask(x).valid) ++ - (p.instructionLanes until p.instructionLanes + extraWritePorts).map(x => io.writeData(x).valid && io.writeData(x).bits.addr === 0.U) + !io.writeMask(x).valid) io.rfwriteCount := PopCount(writeValid) - writeValid(0) + PopCount(x0)
diff --git a/hdl/chisel/src/kelvin/scalar/SCore.scala b/hdl/chisel/src/kelvin/scalar/SCore.scala index 80cbb86..706b29f 100644 --- a/hdl/chisel/src/kelvin/scalar/SCore.scala +++ b/hdl/chisel/src/kelvin/scalar/SCore.scala
@@ -416,6 +416,9 @@ 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 }