Skip to content

Commit 0c251a8

Browse files
committed
scoreboard: Remove duplicate coll/WB updates in per-warp loop
1 parent 6efc371 commit 0c251a8

3 files changed

Lines changed: 40 additions & 23 deletions

File tree

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,22 @@ class Hazard(implicit p: Parameters) extends CoreModule()(p) {
4141
val hasRs2 = ibufPort.bits.uop.inst(HasRs2).asBool
4242
val hasRs3 = ibufPort.bits.uop.inst(HasRs3).asBool
4343

44-
io.scb(warpId).readRs1.enable := uopValid && hasRs1
45-
io.scb(warpId).readRs1.pReg := ibufPort.bits.uop.inst.rs1
46-
io.scb(warpId).readRs2.enable := uopValid && hasRs2
47-
io.scb(warpId).readRs2.pReg := ibufPort.bits.uop.inst.rs2
48-
io.scb(warpId).readRs3.enable := uopValid && hasRs3
49-
io.scb(warpId).readRs3.pReg := ibufPort.bits.uop.inst.rs3
50-
io.scb(warpId).readRd.enable := uopValid && hasRd
51-
io.scb(warpId).readRd.pReg := ibufPort.bits.uop.inst.rd
44+
val scbPort = io.scb(warpId)
45+
scbPort.readRs1.enable := uopValid && hasRs1
46+
scbPort.readRs1.pReg := ibufPort.bits.uop.inst.rs1
47+
scbPort.readRs2.enable := uopValid && hasRs2
48+
scbPort.readRs2.pReg := ibufPort.bits.uop.inst.rs2
49+
scbPort.readRs3.enable := uopValid && hasRs3
50+
scbPort.readRs3.pReg := ibufPort.bits.uop.inst.rs3
51+
scbPort.readRd.enable := uopValid && hasRd
52+
scbPort.readRd.pReg := ibufPort.bits.uop.inst.rd
5253

5354
// RS admission logic
5455
val rsAdmit = Wire(Decoupled(new ReservationStationEntry))
5556

5657
// assumes combinational-read scoreboard
57-
val hasWAW = hasRd && (io.scb(warpId).readRd.pendingWrites =/= 0.U)
58-
val hasWAR = hasRd && (io.scb(warpId).readRd.pendingReads =/= 0.U)
58+
val hasWAW = hasRd && (scbPort.readRd.pendingWrites =/= 0.U)
59+
val hasWAR = hasRd && (scbPort.readRd.pendingReads =/= 0.U)
5960

6061
cyclesDecoded(warpId).cond(uopValid)
6162
stallsWAW(warpId).cond(uopValid && hasWAW)
@@ -78,9 +79,9 @@ class Hazard(implicit p: Parameters) extends CoreModule()(p) {
7879
rsEntry.valid(0) := !hasRs1
7980
rsEntry.valid(1) := !hasRs2
8081
rsEntry.valid(2) := !hasRs3
81-
rsEntry.busy(0) := hasRs1 && (io.scb(warpId).readRs1.pendingWrites =/= 0.U)
82-
rsEntry.busy(1) := hasRs2 && (io.scb(warpId).readRs2.pendingWrites =/= 0.U)
83-
rsEntry.busy(2) := hasRs3 && (io.scb(warpId).readRs3.pendingWrites =/= 0.U)
82+
rsEntry.busy(0) := hasRs1 && (scbPort.readRs1.pendingWrites =/= 0.U)
83+
rsEntry.busy(1) := hasRs2 && (scbPort.readRs2.pendingWrites =/= 0.U)
84+
rsEntry.busy(2) := hasRs3 && (scbPort.readRs3.pendingWrites =/= 0.U)
8485

8586
rsAdmit
8687
}
@@ -121,9 +122,6 @@ class Hazard(implicit p: Parameters) extends CoreModule()(p) {
121122
// update only when there's guaranteed space in the RS.
122123
val chosenWarpId = rsAdmitArbiter.io.chosen
123124
when (rsAdmitChosen.valid && io.rsAdmit.ready) {
124-
assert(chosenWarpId === 0.U,
125-
"TODO: arbiter chose something else than warp 0") // FIXME
126-
127125
val chosenUop = rsAdmitChosen.bits.ibufEntry.uop
128126
val hasRd = chosenUop.inst(HasRd).asBool
129127
val hasRss = Seq(chosenUop.inst(HasRs1).asBool,
@@ -145,6 +143,8 @@ class Hazard(implicit p: Parameters) extends CoreModule()(p) {
145143

146144
// gate RS entry if scoreboard update failed
147145
// note io.scb.updateRS.success is combinational.
146+
// TODO: currently only admitting 1 entry to RS per cycle; consider
147+
// constraining io.scb.updateRS to single-port.
148148
io.rsAdmit.valid := rsAdmitChosen.valid && io.scb(chosenWarpId).updateRS.success
149149
rsAdmitChosen.ready := io.rsAdmit.ready && io.scb(chosenWarpId).updateRS.success
150150
io.rsAdmit.bits := rsAdmitChosen.bits

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

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,28 @@ class Scoreboard(implicit p: Parameters) extends CoreModule()(p) {
279279
printUpdate(io.updateColl)
280280
}
281281

282+
val anyWarpUpdateRs = io.hazard.map(_.updateRS.enable).reduce(_ || _)
283+
// if there were no updateRS, only apply WB and coll updates
284+
// this prevents multiple frivolous updates compared to merging it with the
285+
// doWarp loop
286+
when (!anyWarpUpdateRs && (io.updateWB.enable || io.updateColl.enable)) {
287+
when (io.updateWB.enable) {
288+
printf("scoreboard: received WB update ")
289+
printUpdate(io.updateWB)
290+
}.elsewhen (io.updateColl.enable) {
291+
printf("scoreboard: received coll update ")
292+
printUpdate(io.updateColl)
293+
}
294+
295+
commitUpdate(collRecs, isWrite = false)
296+
commitUpdate(wbRecs, isWrite = true)
297+
298+
printf(cf"scoreboard: table received coll/WB update; content beforehand:\n")
299+
printTable
300+
}
301+
282302
// RS admit updates. These are per-warp
283-
//
284-
def perWarp(warpIo: ScoreboardHazardIO, warpId: Int) = {
303+
def doWarp(warpIo: ScoreboardHazardIO, warpId: Int) = {
285304
// RS admission updates
286305
val uniqRSReadUpdates = consolidateUpdates(warpIo.updateRS.reads)
287306
val uniqRSWriteUpdates = consolidateUpdates(Seq(warpIo.updateRS.write))
@@ -295,9 +314,7 @@ class Scoreboard(implicit p: Parameters) extends CoreModule()(p) {
295314
when (warpIo.updateRS.enable) {
296315
printf(cf"scoreboard: received RS update (warp=${warpId}) ")
297316
printUpdate(warpIo.updateRS)
298-
}
299317

300-
when (warpIo.updateRS.enable || io.updateWB.enable || io.updateColl.enable) {
301318
commitUpdate(rsReadRecs, isWrite = false)
302319
commitUpdate(rsWriteRecs, isWrite = true)
303320

@@ -309,7 +326,7 @@ class Scoreboard(implicit p: Parameters) extends CoreModule()(p) {
309326
printUpdate(warpIo.updateRS)
310327
}
311328

312-
printf(cf"scoreboard: warp=${warpId}: table update, content beforehand:\n")
329+
printf(cf"scoreboard: warp=${warpId}: table received RS update; content beforehand:\n")
313330
printTable
314331
}
315332

@@ -334,7 +351,7 @@ class Scoreboard(implicit p: Parameters) extends CoreModule()(p) {
334351
read(warpIo.readRd)
335352
}
336353

337-
io.hazard.zipWithIndex.foreach { case (io, wid) => perWarp(io, wid) }
354+
io.hazard.zipWithIndex.foreach { case (io, wid) => doWarp(io, wid) }
338355

339356
def printUpdate(upd: ScoreboardUpdate) = {
340357
def printReg(reg: ScoreboardRegUpdate) = {

src/main/scala/radiance/unittest/Muon.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class MuonBackendTestbench(implicit val p: Parameters) extends Module with HasCo
104104
val ibuf = Module(new InstBuffer)
105105
val cfe = Module(new CyclotronFrontend()(p))
106106
val cdiff = Module(new CyclotronDiffTest(tick = false)(p))
107-
val be = Module(new Backend(difftest = true)(p.alterMap(Map(
107+
val be = Module(new Backend(muonParams.difftest)(p.alterMap(Map(
108108
TileKey -> DummyTileParams
109109
))))
110110

0 commit comments

Comments
 (0)