@@ -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
0 commit comments