1package xiangshan.backend.issue 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import utility.HasCircularQueuePtrHelper 7import utils.{MathUtils, OptionWrapper, XSError} 8import xiangshan._ 9import xiangshan.backend.Bundles._ 10import xiangshan.backend.datapath.DataConfig.VAddrData 11import xiangshan.backend.datapath.DataSource 12import xiangshan.backend.fu.FuType 13import xiangshan.backend.fu.vector.Utils.NOnes 14import xiangshan.backend.rob.RobPtr 15import xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr} 16 17object IQFuType { 18 def num = FuType.num 19 20 def apply() = Vec(num, Bool()) 21 22 def readFuType(fuType: Vec[Bool], fus: Seq[FuType.OHType]): Vec[Bool] = { 23 val res = 0.U.asTypeOf(fuType) 24 fus.foreach(x => res(x.id) := fuType(x.id)) 25 res 26 } 27} 28 29class StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 30 val waitForSqIdx = new SqPtr // generated by store data valid check 31 val waitForRobIdx = new RobPtr // generated by store set 32 val waitForStd = Bool() 33 val strictWait = Bool() 34 val sqIdx = new SqPtr 35} 36 37class StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 38 val sqIdx = new SqPtr 39 val lqIdx = new LqPtr 40} 41 42class Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 43 val srcState = Vec(params.numRegSrc, SrcState()) 44 45 val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W)) 46 val srcType = Vec(params.numRegSrc, SrcType()) 47 val fuType = IQFuType() 48 val robIdx = new RobPtr 49 val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx()) 50 val issued = Bool() // for predict issue 51 val firstIssue = Bool() 52 val blocked = Bool() // for some block reason 53 // read reg or get data from bypass network 54 val dataSources = Vec(params.numRegSrc, DataSource()) 55 // if waked up by iq, set when waked up by iq 56 val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec())) 57 // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued. 58 val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W))) 59 val issueTimer = UInt(2.W) 60 val deqPortIdx = UInt(1.W) 61 val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))) 62 63 // mem only 64 val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None 65 66 // vector mem only 67 val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None 68 69 def srcReady: Bool = { 70 VecInit(srcState.map(SrcState.isReady)).asUInt.andR 71 } 72 73 def canIssue: Bool = { 74 srcReady && !issued && !blocked 75 } 76 77 def mergedLoadDependency = { 78 srcLoadDependency.map(_.map(_.toSeq).reduce({ 79 case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2)) 80 }: (Vec[UInt], Vec[UInt]) => Vec[UInt])) 81 } 82} 83 84class EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle { 85 val robIdx = new RobPtr 86 val uopIdx = UopIdx() 87 val respType = RSFeedbackType() // update credit if needs replay 88 val dataInvalidSqIdx = new SqPtr 89 val rfWen = Bool() 90 val fuType = FuType() 91} 92 93class EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 94 val status = new Status() 95 val imm = OptionWrapper(params.needImm, UInt((params.deqImmTypesMaxLen).W)) 96 val payload = new DynInst() 97} 98 99class DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 100 //input 101 val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W))) 102 val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))) 103 val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 104 val subDeqSelOH = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W))) 105 val deqReady = Input(Bool()) 106 val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W))) 107 //output 108 val isFirstIssue = Output(Bool()) 109 val deqEntry = ValidIO(new EntryBundle) 110} 111 112class EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 113 val flush = Flipped(ValidIO(new Redirect)) 114 // status 115 val valid = Output(UInt(params.numEntries.W)) 116 val canIssue = Output(UInt(params.numEntries.W)) 117 val clear = Output(UInt(params.numEntries.W)) 118 val fuType = Output(Vec(params.numEntries, FuType())) 119 val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 120 val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 121 val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 122 val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr))) 123 val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx()))) 124 //enq 125 val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle))) 126 // wakeup 127 val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 128 val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 129 val og0Cancel = Input(ExuOH(backendParams.numExu)) 130 val og1Cancel = Input(ExuOH(backendParams.numExu)) 131 val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 132 //deq 133 val deq = Vec(params.numDeq, new DeqBundle) 134 val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 135 val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 136 val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 137 val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle)))) 138 val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle)) 139 val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W))) 140 val cancelDeqVec = Output(Vec(params.numDeq, Bool())) 141 142 143 val rsFeedback = Output(Vec(5, Bool())) 144 // mem only 145 val fromMem = if (params.isMemAddrIQ) Some(new Bundle { 146 val stIssuePtr = Input(new SqPtr) 147 val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 148 val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 149 val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))) 150 }) else None 151 152 // vector mem only 153 val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 154 val sqDeqPtr = Input(new SqPtr) 155 val lqDeqPtr = Input(new LqPtr) 156 }) 157 158 // debug 159 val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool()))) 160 161 def wakeup = wakeUpFromWB ++ wakeUpFromIQ 162} 163 164class Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 165 override def desiredName: String = params.getEntryName 166 167 private val EnqEntryNum = params.numEnq 168 private val OthersEntryNum = params.numEntries - params.numEnq 169 val io = IO(new EntriesIO) 170 171 // only memAddrIQ use it 172 val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = { 173 if (params.isLdAddrIQ && !params.isStAddrIQ) 174 MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get) 175 else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ) 176 MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 177 else if (params.isMemAddrIQ) 178 MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp) 179 else MixedVecInit(Seq()) 180 } 181 182 val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp)) 183 184 //Module 185 val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params))) 186 val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params))) 187 val transPolicy = Module(new EnqPolicy) 188 189 //Wire 190 val deqSelVec = Wire(Vec(params.numEntries, Bool())) 191 val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool()))) 192 val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle))) 193 val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle))) 194 val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle))) 195 val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle))) 196 197 val validVec = Wire(Vec(params.numEntries, Bool())) 198 val canIssueVec = Wire(Vec(params.numEntries, Bool())) 199 val clearVec = Wire(Vec(params.numEntries, Bool())) 200 val fuTypeVec = Wire(Vec(params.numEntries, FuType())) 201 val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource()))) 202 val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH())))) 203 val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W))))) 204 val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 205 val isFirstIssueVec = Wire(Vec(params.numEntries, Bool())) 206 val robIdxVec = Wire(Vec(params.numEntries, new RobPtr)) 207 val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W))) 208 val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W))) 209 val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W))) 210 val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool()))) 211 val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx()))) 212 213 val canTrans = Wire(Bool()) 214 val enqReadyOthersVec = Wire(Vec(OthersEntryNum, Bool())) 215 val enqTransSelVec = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))) 216 217 io.transEntryDeqVec := transEntryDeqVec 218 219 //enqEntries 220 enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) => 221 enqEntry.io.enq := io.enq(entryIdx) 222 enqEntry.io.flush := io.flush 223 enqEntry.io.wakeUpFromWB := io.wakeUpFromWB 224 enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 225 enqEntry.io.og0Cancel := io.og0Cancel 226 enqEntry.io.og1Cancel := io.og1Cancel 227 enqEntry.io.ldCancel := io.ldCancel 228 enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB) 229 enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ) 230 enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel) 231 enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel) 232 enqEntry.io.deqSel := deqSelVec(entryIdx) 233 enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx) 234 enqEntry.io.transSel := canTrans && enqTransSelVec(entryIdx).valid 235 enqEntry.io.issueResp := issueRespVec(entryIdx) 236 validVec(entryIdx) := enqEntry.io.valid 237 canIssueVec(entryIdx) := enqEntry.io.canIssue 238 clearVec(entryIdx) := enqEntry.io.clear 239 fuTypeVec(entryIdx) := enqEntry.io.fuType 240 dataSourceVec(entryIdx) := enqEntry.io.dataSource 241 robIdxVec(entryIdx) := enqEntry.io.robIdx 242 issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead 243 deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead 244 if (params.hasIQWakeUp) { 245 srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get 246 srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get 247 cancelVec.get(entryIdx) := enqEntry.io.cancel.get 248 } 249 transEntryDeqVec(entryIdx) := enqEntry.io.transEntry 250 isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue 251 entries(entryIdx) := enqEntry.io.entry 252 //for mem 253 if (params.isMemAddrIQ) { 254 enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 255 enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 256 } 257 if (params.isVecMemIQ) { 258 uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get 259 enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 260 enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 261 } 262 } 263 //othersEntries 264 othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) => 265 othersEntry.io.enq := transEntryEnqVec(entryIdx) 266 othersEntry.io.flush := io.flush 267 othersEntry.io.wakeUpFromWB := io.wakeUpFromWB 268 othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ 269 othersEntry.io.og0Cancel := io.og0Cancel 270 othersEntry.io.og1Cancel := io.og1Cancel 271 othersEntry.io.ldCancel := io.ldCancel 272 othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum) 273 othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum) 274 othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _) 275 othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum) 276 validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid 277 canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue 278 clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear 279 enqReadyOthersVec(entryIdx) := othersEntry.io.enqReady 280 fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType 281 dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource 282 robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx 283 issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead 284 deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead 285 if (params.hasIQWakeUp) { 286 srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get 287 srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get 288 cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get 289 } 290 isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue 291 entries(entryIdx + EnqEntryNum) := othersEntry.io.entry 292 //for mem 293 if (params.isMemAddrIQ) { 294 othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr 295 othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 296 } 297 if (params.isVecMemIQ) { 298 uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get 299 othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr 300 othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr 301 } 302 } 303 304 305 deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) => 306 val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady) 307 deqPortIdxWrite := OHToUInt(deqVec) 308 deqSel := deqVec.reduce(_ | _) 309 } 310 311 312 //transPolicy 313 transPolicy.io.canEnq := enqReadyOthersVec.asUInt 314 canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec) 315 enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid 316 enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits 317 if (params.numEnq == 2) { 318 enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid) 319 enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits) 320 } 321 322 transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) => 323 selBools.zipWithIndex.foreach { case (selBool, othersIdx) => 324 selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx) 325 } 326 } 327 328 //transEntryEnq 329 transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) => 330 val transEnqHit = transSelVec.map(x => x(othersIdx)) 331 transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec) 332 } 333 if(backendParams.debugEn) { 334 dontTouch(transEntryEnqVec) 335 } 336 337 //issueRespVec 338 if (params.isVecMemIQ) { 339 // vector memory IQ 340 issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) => 341 val hitRespsVec = VecInit(resps.flatten.map(x => 342 x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx 343 )) 344 issueResp.valid := hitRespsVec.reduce(_ | _) 345 issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits)) 346 } 347 } else if (params.isMemAddrIQ) { 348 // scalar memory IQ 349 issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) => 350 val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq) 351 issueResp.valid := hitRespsVec.reduce(_ | _) 352 issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq) 353 } 354 } 355 else { 356 issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) => 357 val Resp = resps(issueTimer)(deqPortIdx) 358 issueResp := Resp 359 } 360 } 361 362 //deq 363 val enqEntryOldest = io.deq.map { deq => 364 Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum)) 365 } 366 val enqEntryOldestCancel = io.deq.map { deq => 367 Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum)) 368 } 369 val othersEntryOldest = io.deq.map { deq => 370 Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum)) 371 } 372 val othersEntryOldestCancel = io.deq.map { deq => 373 Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum)) 374 } 375 376 if (params.deqFuSame) { 377 val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle))) 378 val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool())) 379 val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool())) 380 381 subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries) 382 subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse) 383 subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U 384 subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U 385 subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B)))) 386 subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse) 387 388 io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1)) 389 io.deq(1).deqEntry := subDeqPolicyEntryVec(0) 390 io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1)) 391 io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0) 392 393 when (subDeqPolicyValidVec(0)) { 394 assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n") 395 } 396 when (subDeqPolicyValidVec(1)) { 397 assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n") 398 } 399 } 400 else { 401 io.deq.zipWithIndex.foreach { case (x, i) => 402 x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i)) 403 io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i)) 404 } 405 } 406 407 if (params.hasIQWakeUp) { 408 cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) => 409 cancelByOg0 := l1ExuOH.zip(srcTimer).map { 410 case(exuOH, srcTimer) => 411 (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U 412 }.reduce(_ | _) 413 } 414 } 415 416 io.valid := validVec.asUInt 417 io.canIssue := canIssueVec.asUInt 418 io.clear := clearVec.asUInt 419 io.fuType := fuTypeVec 420 io.dataSources := dataSourceVec 421 io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get) 422 io.srcTimer.foreach(_ := srcTimerVec.get) 423 io.cancel.foreach(_ := cancelVec.get) 424 io.robIdx.foreach(_ := robIdxVec) 425 io.uopIdx.foreach(_ := uopIdxVec.get) 426 io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo 427 io.deq.foreach{ x => 428 x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec) 429 } 430 if(backendParams.debugEn) { 431 dontTouch(io.deq) 432 } 433 io.transSelVec.zip(transSelVec).foreach { case (sink, source) => 434 sink := source.asUInt 435 } 436} 437