1package xiangshan.backend.issue 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import utility.HasCircularQueuePtrHelper 7import utils.{MathUtils, OptionWrapper} 8import xiangshan._ 9import xiangshan.backend.Bundles._ 10import xiangshan.backend.fu.FuType 11import xiangshan.backend.datapath.DataSource 12import xiangshan.backend.rob.RobPtr 13import xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr} 14 15 16class EnqEntryIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle { 17 //input 18 val enq = Flipped(ValidIO(new EntryBundle)) 19 val flush = Flipped(ValidIO(new Redirect)) 20 val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle) 21 val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle) 22 val og0Cancel = Input(ExuOH(backendParams.numExu)) 23 val og1Cancel = Input(ExuOH(backendParams.numExu)) 24 val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 25 val deqSel = Input(Bool()) 26 val deqPortIdxWrite = Input(UInt(1.W)) 27 val transSel = Input(Bool()) 28 val issueResp = Flipped(ValidIO(new EntryDeqRespBundle)) 29 //output 30 val valid = Output(Bool()) 31 val canIssue = Output(Bool()) 32 val clear = Output(Bool()) 33 val fuType = Output(FuType()) 34 val dataSource = Output(Vec(params.numRegSrc, DataSource())) 35 val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuOH()))) 36 val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, UInt(3.W)))) 37 val transEntry = ValidIO(new EntryBundle) 38 val isFirstIssue = Output(Bool()) 39 val entry = ValidIO(new EntryBundle) 40 val robIdx = Output(new RobPtr) 41 val uopIdx = OptionWrapper(params.isVecMemIQ, Output(UopIdx())) 42 val deqPortIdxRead = Output(UInt(1.W)) 43 val issueTimerRead = Output(UInt(2.W)) 44 // mem only 45 val fromMem = if(params.isMemAddrIQ) Some(new Bundle { 46 val stIssuePtr = Input(new SqPtr) 47 val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 48 }) else None 49 // vector mem only 50 val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle { 51 val sqDeqPtr = Input(new SqPtr) 52 val lqDeqPtr = Input(new LqPtr) 53 }) 54 // debug 55 val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool())) 56 57 def wakeup = wakeUpFromWB ++ wakeUpFromIQ 58} 59 60class EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule { 61 val io = IO(new EnqEntryIO) 62 63 val validReg = RegInit(false.B) 64 val entryReg = Reg(new EntryBundle) 65 66 val validRegNext = Wire(Bool()) 67 val entryRegNext = Wire(new EntryBundle) 68 val entryUpdate = Wire(new EntryBundle) 69 val enqReady = Wire(Bool()) 70 val clear = Wire(Bool()) 71 val flushed = Wire(Bool()) 72 val deqSuccess = Wire(Bool()) 73 val srcWakeUp = Wire(Vec(params.numRegSrc, Bool())) 74 val srcWakeUpByWB = Wire(Vec(params.numRegSrc, Bool())) 75 val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 76 val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 77 val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 78 val srcWakeUpByIQWithoutCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 79 val srcWakeUpButCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool()))) 80 val srcWakeUpL1ExuOHOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH()))) 81 val srcLoadDependencyOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))) 82 val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 83 val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 84 val shiftedWakeupLoadDependencyByIQBypassVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W)))) 85 val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool()))) 86 87 //Reg 88 validReg := validRegNext 89 entryReg := entryRegNext 90 91 //Wire 92 when(io.enq.valid && enqReady) { 93 validRegNext := true.B 94 }.elsewhen(clear) { 95 validRegNext := false.B 96 }.otherwise { 97 validRegNext := validReg 98 } 99 100 when(io.enq.valid && enqReady) { 101 entryRegNext := io.enq.bits 102 }.otherwise { 103 entryRegNext := entryUpdate 104 } 105 106 enqReady := !validReg || clear 107 clear := flushed || io.transSel || deqSuccess 108 flushed := entryReg.status.robIdx.needFlush(io.flush) 109 deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) 110 srcWakeUpByWB := io.wakeUpFromWB.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(x => VecInit(x.toSeq).asUInt.orR).toSeq 111 srcWakeUp := srcWakeUpByWB.zip(srcWakeUpByIQVec).map { case (x, y) => x || y.asUInt.orR } 112 113 shiftedWakeupLoadDependencyByIQVec 114 .zip(wakeupLoadDependencyByIQVec) 115 .zip(params.wakeUpInExuSources.map(_.name)).foreach { 116 case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 117 case ((dep, originalDep), deqPortIdx) => 118 if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx) 119 dep := (originalDep << 2).asUInt | 2.U 120 else 121 dep := originalDep << 1 122 } 123 } 124 shiftedWakeupLoadDependencyByIQBypassVec 125 .zip(wakeupLoadDependencyByIQVec) 126 .zip(params.wakeUpInExuSources.map(_.name)).foreach { 127 case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach { 128 case ((dep, originalDep), deqPortIdx) => 129 if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx) 130 dep := (originalDep << 1).asUInt | 1.U 131 else 132 dep := originalDep 133 } 134 } 135 136 if (params.hasIQWakeUp) { 137 srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) => 138 val ldTransCancel = Mux( 139 wakeUpByIQVec.asUInt.orR, 140 Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))), 141 false.B 142 ) 143 srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel) 144 srcCancel := srcLoadCancel || ldTransCancel 145 } 146 } 147 148 if (io.wakeUpFromIQ.isEmpty) { 149 srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec) 150 wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec) 151 } else { 152 val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) => 153 bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid) 154 ).toIndexedSeq.transpose 155 val cancelSel = io.wakeUpFromIQ.map(x => x.bits.exuIdx).map(x => io.og0Cancel(x)) 156 srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel })) 157 srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel })) 158 srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x)) 159 wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq 160 } 161 162 //entryUpdate 163 entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) => 164 val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 165 stateNext := Mux(cancel, false.B, wakeup | state) 166 if (params.hasIQWakeUp) { 167 cancelVec.get(srcIdx) := cancel 168 } 169 } 170 entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach { 171 case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) => 172 when(wakeUpByIQOH.asUInt.orR) { 173 dataSourceNext.value := DataSource.bypass 174 }.otherwise { 175 dataSourceNext.value := DataSource.reg 176 } 177 } 178 if (params.hasIQWakeUp) { 179 entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach { 180 case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 181 when(wakeUpByIQOH.asUInt.orR) { 182 exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.toSeq.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))) 183 }.elsewhen(wakeUp) { 184 exuOH := 0.U.asTypeOf(exuOH) 185 }.otherwise { 186 exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 187 } 188 } 189 srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach { 190 case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) => 191 when(wakeUpByIQOH.asUInt.orR) { 192 exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq) 193 }.elsewhen(wakeUp) { 194 exuOH := 0.U.asTypeOf(exuOH) 195 }.otherwise { 196 exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx) 197 } 198 } 199 entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { 200 case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) => 201 srcIssuedTimerNext := MuxCase(3.U, Seq( 202 // T0: waked up by IQ, T1: reset timer as 1 203 wakeUpByIQOH.asUInt.orR -> 2.U, 204 // do not overflow 205 srcIssuedTimer.andR -> srcIssuedTimer, 206 // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq 207 (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U) 208 )) 209 } 210 entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 211 case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) => 212 loadDependencyNext := 213 Mux(wakeup, 214 Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)), 215 Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency) 216 ) 217 } 218 srcLoadDependencyOut.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 219 case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) => 220 loadDependencyOut := 221 Mux(wakeup, 222 Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec), 0.U.asTypeOf(loadDependency)), 223 loadDependency 224 ) 225 } 226 } 227 entryUpdate.status.issueTimer := "b10".U //otherwise 228 entryUpdate.status.deqPortIdx := 0.U //otherwise 229 when(io.deqSel) { 230 entryUpdate.status.issueTimer := 0.U 231 entryUpdate.status.deqPortIdx := io.deqPortIdxWrite 232 }.elsewhen(entryReg.status.issued){ 233 entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U 234 entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx 235 } 236 entryUpdate.status.psrc := entryReg.status.psrc 237 entryUpdate.status.srcType := entryReg.status.srcType 238 entryUpdate.status.fuType := entryReg.status.fuType 239 entryUpdate.status.robIdx := entryReg.status.robIdx 240 entryUpdate.status.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 241 entryUpdate.status.issued := entryReg.status.issued // otherwise 242 when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) { 243 entryUpdate.status.issued := false.B 244 }.elsewhen(io.deqSel) { 245 entryUpdate.status.issued := true.B 246 }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) { 247 entryUpdate.status.issued := false.B 248 }.elsewhen(!entryReg.status.srcReady) { 249 entryUpdate.status.issued := false.B 250 } 251 entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue 252 entryUpdate.status.blocked := false.B //todo 253 //remain imm and payload 254 entryUpdate.imm := entryReg.imm 255 entryUpdate.payload := entryReg.payload 256 if(params.needPc) { 257 entryUpdate.status.pc.get := entryReg.status.pc.get 258 } 259 val canIssue = entryReg.status.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR 260 val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked && 261 VecInit(entryReg.status.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) => 262 val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B) 263 Mux(cancel, false.B, wakeupVec.asUInt.orR | state) 264 }).asUInt.andR 265 io.dataSource.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach { 266 case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 267 when(wakeUpByIQOH.asUInt.orR) { 268 dataSourceOut.value := DataSource.forward 269 }.elsewhen(wakeUpAll) { 270 dataSourceOut.value := DataSource.reg 271 }.otherwise { 272 dataSourceOut.value := dataSource.value 273 } 274 } 275 if (params.hasIQWakeUp) { 276 io.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach { 277 case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) => 278 when(wakeUpByIQOH.asUInt.orR) { 279 srcTimerOut := 1.U 280 }.otherwise { 281 srcTimerOut := srcTimer 282 } 283 } 284 } 285 286 //output 287 io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess 288 io.transEntry.bits := entryUpdate 289 io.canIssue := canIssue || canIssueBypass 290 io.clear := clear 291 io.fuType := entryReg.status.fuType 292 io.srcWakeUpL1ExuOH.foreach(_ := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, entryReg.status.srcWakeUpL1ExuOH.get)) 293 io.valid := validReg 294 io.isFirstIssue := !entryReg.status.firstIssue 295 io.entry.valid := validReg 296 io.entry.bits := entryReg 297 io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, entryReg.status.srcLoadDependency.get)) 298 io.robIdx := entryReg.status.robIdx 299 io.uopIdx.foreach(_ := entryReg.status.uopIdx.get) 300 io.issueTimerRead := entryReg.status.issueTimer 301 io.deqPortIdxRead := entryReg.status.deqPortIdx 302 io.cancel.foreach(_ := cancelVec.get.asUInt.orR) 303} 304 305class EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 306 with HasCircularQueuePtrHelper { 307 val fromMem = io.fromMem.get 308 309 val memStatus = entryReg.status.mem.get 310 println("memStatus" + memStatus) 311 val memStatusNext = entryRegNext.status.mem.get 312 val memStatusUpdate = entryUpdate.status.mem.get 313 314 // load cannot be issued before older store, unless meet some condition 315 val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr) 316 317 val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid 318 319 val staWaitedReleased = Cat( 320 fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value) 321 ).orR 322 val stdWaitedReleased = Cat( 323 fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value) 324 ).orR 325 val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait 326 val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd 327 val waitStd = !olderStdReady 328 val waitSta = !olderStaNotViolate 329 330 when (io.enq.valid && enqReady) { 331 memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx 332 // update by lfst at dispatch stage 333 memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx 334 // new load inst don't known if it is blocked by store data ahead of it 335 memStatusNext.waitForStd := false.B 336 // update by ssit at rename stage 337 memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait 338 memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx 339 }.otherwise { 340 memStatusNext := memStatusUpdate 341 } 342 343 when(deqFailedForStdInvalid) { 344 memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx 345 memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx 346 memStatusUpdate.waitForStd := true.B 347 memStatusUpdate.strictWait := memStatus.strictWait 348 memStatusUpdate.sqIdx := memStatus.sqIdx 349 }.otherwise { 350 memStatusUpdate := memStatus 351 } 352 353 val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked) 354 val blockNotReleased = waitStd || waitSta 355 val respBlock = deqFailedForStdInvalid 356 entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 357 entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock 358 359} 360 361class EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem { 362 363 require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ") 364 365 val vecMemStatus = entryReg.status.vecMem.get 366 val vecMemStatusNext = entryRegNext.status.vecMem.get 367 val vecMemStatusUpdate = entryUpdate.status.vecMem.get 368 val fromLsq = io.fromLsq.get 369 370 when (io.enq.valid && enqReady) { 371 vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 372 vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 373 }.otherwise { 374 vecMemStatusNext := vecMemStatusUpdate 375 } 376 vecMemStatusUpdate := vecMemStatus 377 378 val isLsqHead = { 379 // if (params.isVecLdAddrIQ) 380 entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr && 381 // else 382 entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr 383 } 384 385 entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 386 entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead 387} 388 389class EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry 390 with HasCircularQueuePtrHelper { 391 392 require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ") 393 394 val vecMemStatus = entryReg.status.vecMem.get 395 val vecMemStatusNext = entryRegNext.status.vecMem.get 396 val vecMemStatusUpdate = entryUpdate.status.vecMem.get 397 val fromLsq = io.fromLsq.get 398 399 when (io.enq.valid && enqReady) { 400 vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx 401 vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx 402 }.otherwise { 403 vecMemStatusNext := vecMemStatusUpdate 404 } 405 vecMemStatusUpdate := vecMemStatus 406 407 val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value 408 409 entryRegNext.status.blocked := !isLsqHead 410 entryUpdate.status.blocked := !isLsqHead 411} 412 413object EnqEntry { 414 def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = { 415 iqParams.schdType match { 416 case IntScheduler() => new EnqEntry() 417 case MemScheduler() => 418 if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem() 419 else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr() 420 else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData() 421 else new EnqEntry() 422 case VfScheduler() => new EnqEntry() 423 case _ => null 424 } 425 } 426}