Skip to content

Commit 96ad423

Browse files
committed
scoreboard: Fix missing rsRead/rsWrite rollback on failure
1 parent 0dd9863 commit 96ad423

3 files changed

Lines changed: 39 additions & 4 deletions

File tree

src/main/scala/radiance/muon/Hazard.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@ class Hazard(implicit p: Parameters) extends CoreModule()(p) {
6767
rsAdmit.valid := uopValid && !hasWAW && !hasWAR
6868
if (muonParams.debug) {
6969
when (uopValid && hasWAR) {
70-
printf(cf"hazard: IBUF head (wid=${ibufPort.bits.uop.wid}, PC=${ibufPort.bits.uop.pc}%x) is gated RS admission due to WAR\n")
70+
printf(cf"hazard: IBUF head (wid=${ibufPort.bits.uop.wid}, PC=${ibufPort.bits.uop.pc}%x, " +
71+
cf"rd=${ibufPort.bits.uop.inst.rd}) is gated RS admission due to WAR\n")
7172
}.elsewhen (uopValid && hasWAW) {
72-
printf(cf"hazard: IBUF head (wid=${ibufPort.bits.uop.wid}, PC=${ibufPort.bits.uop.pc}%x) is gated RS admission due to WAW\n")
73+
printf(cf"hazard: IBUF head (wid=${ibufPort.bits.uop.wid}, PC=${ibufPort.bits.uop.pc}%x), " +
74+
cf"rd=${ibufPort.bits.uop.inst.rd}) is gated RS admission due to WAW\n")
7375
}
7476
}
7577

src/main/scala/radiance/muon/Scoreboard.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,13 @@ class Scoreboard(implicit p: Parameters) extends CoreModule()(p) {
312312
printf(cf"scoreboard: received RS update (warp=${warpId}) ")
313313
printUpdate(warpIo.updateRS)
314314

315-
commitUpdate(rsReadRecs, isWrite = false)
316-
commitUpdate(rsWriteRecs, isWrite = true)
315+
when (rsSuccess) {
316+
commitUpdate(rsReadRecs, isWrite = false)
317+
commitUpdate(rsWriteRecs, isWrite = true)
318+
}.otherwise {
319+
commitUpdate(collRecs, isWrite = false)
320+
commitUpdate(wbRecs, isWrite = true)
321+
}
317322

318323
when (!rsReadSuccess) {
319324
printf(cf"scoreboard: warp=${warpId}: failed to commit RS update due to read overflow: ")

src/test/scala/radiance/ScoreboardTest.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,34 @@ class ScoreboardTest extends AnyFlatSpec {
238238
}
239239
}
240240

241+
it should "unroll both pendingReads and Writes if either counter has overflown" in {
242+
val p = testParams()
243+
simulate(new Scoreboard()(p)) { c =>
244+
reset(c)
245+
clearIO(c)
246+
247+
setUpdate(c.io.hazard(0).updateRS, pReg = 42, incr = true, decr = false, doWrite = true, doRead = false)
248+
c.io.hazard(0).updateRS.success.expect(true.B)
249+
c.clock.step()
250+
251+
c.io.hazard(0).readRs1.enable.poke(true.B)
252+
c.io.hazard(0).readRs1.pReg.poke(42.U)
253+
c.io.hazard(0).readRs1.pendingReads.expect(0.U)
254+
c.io.hazard(0).readRs1.pendingWrites.expect(1.U)
255+
256+
setUpdate(c.io.hazard(0).updateRS, pReg = 42, incr = true, decr = false, doWrite = true, doRead = true)
257+
c.io.hazard(0).updateRS.success.expect(false.B)
258+
c.clock.step()
259+
260+
clearIO(c)
261+
262+
c.io.hazard(0).readRs1.enable.poke(true.B)
263+
c.io.hazard(0).readRs1.pReg.poke(42.U)
264+
c.io.hazard(0).readRs1.pendingReads.expect(0.U)
265+
c.io.hazard(0).readRs1.pendingWrites.expect(1.U)
266+
}
267+
}
268+
241269
it should "fail if pendingReads/pendingWrites counter has underflown" in {
242270
val p = testParams()
243271
simulate(new Scoreboard()(p)) { c =>

0 commit comments

Comments
 (0)