xref: /XiangShan/src/main/scala/xiangshan/backend/issue/EnqEntry.scala (revision 0f55a0d39d9e13a42b8a8ea5f45338f62ff484ef)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
35db4956bSzhanglyGitimport chipsalliance.rocketchip.config.Parameters
45db4956bSzhanglyGitimport chisel3._
55db4956bSzhanglyGitimport chisel3.util._
65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
75db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper}
85db4956bSzhanglyGitimport xiangshan._
95db4956bSzhanglyGitimport xiangshan.backend.Bundles._
105db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
125db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
135db4956bSzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr}
145db4956bSzhanglyGit
155db4956bSzhanglyGit
165db4956bSzhanglyGitclass EnqEntryIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
175db4956bSzhanglyGit  //input
185db4956bSzhanglyGit  val enq = Flipped(ValidIO(new EntryBundle))
195db4956bSzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
205db4956bSzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
215db4956bSzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
225db4956bSzhanglyGit  val og0Cancel = Input(ExuVec(backendParams.numExu))
235db4956bSzhanglyGit  val og1Cancel = Input(ExuVec(backendParams.numExu))
24*0f55a0d3SHaojin Tang  val ldCancel = Vec(backendParams.LduCnt, Flipped(new LoadCancelIO))
255db4956bSzhanglyGit  val deqSel = Input(Bool())
265db4956bSzhanglyGit  val deqPortIdxWrite = Input(UInt(1.W))
275db4956bSzhanglyGit  val transSel = Input(Bool())
285db4956bSzhanglyGit  val issueResp = Flipped(ValidIO(new EntryDeqRespBundle))
295db4956bSzhanglyGit  //output
305db4956bSzhanglyGit  val valid = Output(Bool())
315db4956bSzhanglyGit  val canIssue = Output(Bool())
325db4956bSzhanglyGit  val clear = Output(Bool())
335db4956bSzhanglyGit  val fuType = Output(FuType())
345db4956bSzhanglyGit  val dataSource = Output(Vec(params.numRegSrc, DataSource()))
355db4956bSzhanglyGit  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuVec())))
365db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, UInt(3.W))))
375db4956bSzhanglyGit  val transEntry =  ValidIO(new EntryBundle)
385db4956bSzhanglyGit  val isFirstIssue = Output(Bool())
395db4956bSzhanglyGit  val entry = ValidIO(new EntryBundle)
405db4956bSzhanglyGit  val robIdx = Output(new RobPtr)
415db4956bSzhanglyGit  val deqPortIdxRead = Output(UInt(1.W))
425db4956bSzhanglyGit  val issueTimerRead = Output(UInt(2.W))
435db4956bSzhanglyGit  // mem only
445db4956bSzhanglyGit  val fromMem = if(params.isMemAddrIQ) Some(new Bundle {
455db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
465db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
475db4956bSzhanglyGit  }) else None
485db4956bSzhanglyGit
495db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
505db4956bSzhanglyGit}
515db4956bSzhanglyGit
525db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
535db4956bSzhanglyGit  val io = IO(new EnqEntryIO)
545db4956bSzhanglyGit
555db4956bSzhanglyGit  val validReg = RegInit(false.B)
565db4956bSzhanglyGit  val entryReg = Reg(new EntryBundle)
575db4956bSzhanglyGit
585db4956bSzhanglyGit  val validRegNext = Wire(Bool())
595db4956bSzhanglyGit  val entryRegNext = Wire(new EntryBundle)
605db4956bSzhanglyGit  val entryUpdate = Wire(new EntryBundle)
615db4956bSzhanglyGit  val enqReady = Wire(Bool())
625db4956bSzhanglyGit  val clear = Wire(Bool())
635db4956bSzhanglyGit  val flushed = Wire(Bool())
645db4956bSzhanglyGit  val deqSuccess = Wire(Bool())
655db4956bSzhanglyGit  val srcWakeUp = Wire(Vec(params.numRegSrc, Bool()))
665db4956bSzhanglyGit  val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
67*0f55a0d3SHaojin Tang  val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
685db4956bSzhanglyGit  val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
69*0f55a0d3SHaojin Tang  val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
70*0f55a0d3SHaojin Tang  val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
715db4956bSzhanglyGit
725db4956bSzhanglyGit  //Reg
735db4956bSzhanglyGit  validReg := validRegNext
745db4956bSzhanglyGit  entryReg := entryRegNext
755db4956bSzhanglyGit
765db4956bSzhanglyGit  //Wire
775db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
785db4956bSzhanglyGit    validRegNext := true.B
795db4956bSzhanglyGit  }.elsewhen(clear) {
805db4956bSzhanglyGit    validRegNext := false.B
815db4956bSzhanglyGit  }.otherwise {
825db4956bSzhanglyGit    validRegNext := validReg
835db4956bSzhanglyGit  }
845db4956bSzhanglyGit
855db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
865db4956bSzhanglyGit    entryRegNext := io.enq.bits
875db4956bSzhanglyGit  }.otherwise {
885db4956bSzhanglyGit    entryRegNext := entryUpdate
895db4956bSzhanglyGit  }
905db4956bSzhanglyGit
915db4956bSzhanglyGit  enqReady := !validReg || clear
925db4956bSzhanglyGit  clear := flushed || io.transSel || deqSuccess
935db4956bSzhanglyGit  flushed := entryReg.status.robIdx.needFlush(io.flush)
94*0f55a0d3SHaojin Tang  deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)
955db4956bSzhanglyGit  srcWakeUp := io.wakeup.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(VecInit(_).asUInt.orR)
965db4956bSzhanglyGit
97*0f55a0d3SHaojin Tang  shiftedWakeupLoadDependencyByIQVec
98*0f55a0d3SHaojin Tang    .zip(wakeupLoadDependencyByIQVec)
99*0f55a0d3SHaojin Tang    .zip(params.wakeUpInExuSources.map(_.name)).foreach {
100*0f55a0d3SHaojin Tang    case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach {
101*0f55a0d3SHaojin Tang      case ((dep, originalDep), deqPortIdx) =>
102*0f55a0d3SHaojin Tang        if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx)
103*0f55a0d3SHaojin Tang          dep := originalDep << 1 | 1.U
104*0f55a0d3SHaojin Tang        else
105*0f55a0d3SHaojin Tang          dep := originalDep << 1
106*0f55a0d3SHaojin Tang    }
107*0f55a0d3SHaojin Tang  }
108*0f55a0d3SHaojin Tang
1095db4956bSzhanglyGit  if (params.hasIQWakeUp) {
110*0f55a0d3SHaojin Tang    srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) =>
1115db4956bSzhanglyGit      // level1 cancel: A(s)->C, A(s) are the level1 cancel
1125db4956bSzhanglyGit      val l1Cancel = (io.og0Cancel.asUInt & entryReg.status.srcWakeUpL1ExuOH.get(srcIdx).asUInt).orR &&
1135db4956bSzhanglyGit        entryReg.status.srcTimer.get(srcIdx) === 1.U
114*0f55a0d3SHaojin Tang      val ldTransCancel = Mux(
115*0f55a0d3SHaojin Tang        wakeUpByIQVec.asUInt.orR,
116*0f55a0d3SHaojin Tang        Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))),
117*0f55a0d3SHaojin Tang        false.B
118*0f55a0d3SHaojin Tang      )
119*0f55a0d3SHaojin Tang      srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel)
120*0f55a0d3SHaojin Tang      srcCancel := l1Cancel || srcLoadCancel || ldTransCancel
1215db4956bSzhanglyGit    }
1225db4956bSzhanglyGit  }
1235db4956bSzhanglyGit
1245db4956bSzhanglyGit  if (io.wakeUpFromIQ.isEmpty) {
1255db4956bSzhanglyGit    srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec)
126*0f55a0d3SHaojin Tang    wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec)
1275db4956bSzhanglyGit  } else {
1285db4956bSzhanglyGit    val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) =>
1295db4956bSzhanglyGit      bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)
1305db4956bSzhanglyGit    ).transpose
1315db4956bSzhanglyGit    srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x))
132*0f55a0d3SHaojin Tang    wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency)
1335db4956bSzhanglyGit  }
1345db4956bSzhanglyGit
1355db4956bSzhanglyGit  //entryUpdate
1365db4956bSzhanglyGit  entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) =>
1375db4956bSzhanglyGit    val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B)
1385db4956bSzhanglyGit    stateNext := Mux(cancel, false.B, wakeup | state)
1395db4956bSzhanglyGit  }
1405db4956bSzhanglyGit  entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach {
1415db4956bSzhanglyGit    case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) =>
1425db4956bSzhanglyGit      when(wakeUpByIQOH.asUInt.orR) {
1435db4956bSzhanglyGit        dataSourceNext.value := DataSource.forward
1445db4956bSzhanglyGit      }.elsewhen(dataSource.value === DataSource.forward) {
1455db4956bSzhanglyGit        dataSourceNext.value := DataSource.bypass
1465db4956bSzhanglyGit      }.otherwise {
1475db4956bSzhanglyGit        dataSourceNext.value := DataSource.reg
1485db4956bSzhanglyGit      }
1495db4956bSzhanglyGit  }
1505db4956bSzhanglyGit  if (params.hasIQWakeUp) {
151*0f55a0d3SHaojin Tang    entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach {
152*0f55a0d3SHaojin Tang      case (((exuOH: Vec[Bool], wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) =>
1535db4956bSzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
1545db4956bSzhanglyGit          exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W))).asBools
155*0f55a0d3SHaojin Tang        }.elsewhen(wakeUp) {
156*0f55a0d3SHaojin Tang          exuOH := 0.U.asTypeOf(exuOH)
1575db4956bSzhanglyGit        }.otherwise {
1585db4956bSzhanglyGit          exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx)
1595db4956bSzhanglyGit        }
1605db4956bSzhanglyGit    }
1615db4956bSzhanglyGit    entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach {
1625db4956bSzhanglyGit      case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) =>
1635db4956bSzhanglyGit        srcIssuedTimerNext := MuxCase(0.U, Seq(
1645db4956bSzhanglyGit          // T0: waked up by IQ, T1: reset timer as 1
1655db4956bSzhanglyGit          wakeUpByIQOH.asUInt.orR -> 1.U,
1665db4956bSzhanglyGit          // do not overflow
1675db4956bSzhanglyGit          srcIssuedTimer.andR -> srcIssuedTimer,
168*0f55a0d3SHaojin Tang          // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq
1695db4956bSzhanglyGit          (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U)
1705db4956bSzhanglyGit        ))
1715db4956bSzhanglyGit    }
172*0f55a0d3SHaojin Tang    entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
173*0f55a0d3SHaojin Tang      case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) =>
174*0f55a0d3SHaojin Tang        loadDependencyNext :=
175*0f55a0d3SHaojin Tang          Mux(wakeup,
176*0f55a0d3SHaojin Tang            Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)),
177*0f55a0d3SHaojin Tang            Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency)
178*0f55a0d3SHaojin Tang          )
179*0f55a0d3SHaojin Tang    }
1805db4956bSzhanglyGit  }
1815db4956bSzhanglyGit  entryUpdate.status.issueTimer := "b11".U //otherwise
1825db4956bSzhanglyGit  entryUpdate.status.deqPortIdx := 0.U //otherwise
1835db4956bSzhanglyGit  when(io.deqSel) {
1845db4956bSzhanglyGit    entryUpdate.status.issueTimer := 1.U
1855db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := io.deqPortIdxWrite
1865db4956bSzhanglyGit  }.elsewhen(entryReg.status.issued){
1875db4956bSzhanglyGit    entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U
1885db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx
1895db4956bSzhanglyGit  }
1905db4956bSzhanglyGit  entryUpdate.status.psrc := entryReg.status.psrc
1915db4956bSzhanglyGit  entryUpdate.status.srcType := entryReg.status.srcType
1925db4956bSzhanglyGit  entryUpdate.status.fuType := entryReg.status.fuType
1935db4956bSzhanglyGit  entryUpdate.status.robIdx := entryReg.status.robIdx
1945db4956bSzhanglyGit  entryUpdate.status.issued := entryReg.status.issued // otherwise
1955db4956bSzhanglyGit  when(!entryReg.status.srcReady){
1965db4956bSzhanglyGit    entryUpdate.status.issued := false.B
197*0f55a0d3SHaojin Tang  }.elsewhen(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)) {
198*0f55a0d3SHaojin Tang    entryUpdate.status.issued := false.B
1995db4956bSzhanglyGit  }.elsewhen(io.issueResp.valid) {
2005db4956bSzhanglyGit    when(RSFeedbackType.isStageSuccess(io.issueResp.bits.respType)) {
2015db4956bSzhanglyGit      entryUpdate.status.issued := true.B
2025db4956bSzhanglyGit    }.elsewhen(RSFeedbackType.isBlocked(io.issueResp.bits.respType)) {
2035db4956bSzhanglyGit      entryUpdate.status.issued := false.B
2045db4956bSzhanglyGit    }
2055db4956bSzhanglyGit  }
2065db4956bSzhanglyGit  entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue
2075db4956bSzhanglyGit  entryUpdate.status.blocked := false.B //todo
2085db4956bSzhanglyGit  //remain imm and payload
2095db4956bSzhanglyGit  entryUpdate.imm := entryReg.imm
2105db4956bSzhanglyGit  entryUpdate.payload := entryReg.payload
2115db4956bSzhanglyGit  if(params.needPc) {
2125db4956bSzhanglyGit    entryUpdate.status.pc.get := entryReg.status.pc.get
2135db4956bSzhanglyGit    entryUpdate.status.target.get := entryReg.status.target.get
2145db4956bSzhanglyGit  }
2155db4956bSzhanglyGit
2165db4956bSzhanglyGit  //output
2175db4956bSzhanglyGit  io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess
2185db4956bSzhanglyGit  io.transEntry.bits := entryUpdate
2195db4956bSzhanglyGit  io.canIssue := entryReg.status.canIssue && validReg
2205db4956bSzhanglyGit  io.clear := clear
2215db4956bSzhanglyGit  io.fuType := entryReg.status.fuType
2225db4956bSzhanglyGit  io.dataSource := entryReg.status.dataSources
2235db4956bSzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := entryReg.status.srcWakeUpL1ExuOH.get)
2245db4956bSzhanglyGit  io.srcTimer.foreach(_ := entryReg.status.srcTimer.get)
2255db4956bSzhanglyGit  io.valid := validReg
2265db4956bSzhanglyGit  io.isFirstIssue := !entryReg.status.firstIssue
2275db4956bSzhanglyGit  io.entry.valid := validReg
2285db4956bSzhanglyGit  io.entry.bits := entryReg
2295db4956bSzhanglyGit  io.robIdx := entryReg.status.robIdx
2305db4956bSzhanglyGit  io.issueTimerRead := Mux(io.deqSel, 0.U, entryReg.status.issueTimer)
2315db4956bSzhanglyGit  io.deqPortIdxRead := Mux(io.deqSel, io.deqPortIdxWrite, entryReg.status.deqPortIdx)
2325db4956bSzhanglyGit}
2335db4956bSzhanglyGit
2345db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry
2355db4956bSzhanglyGit  with HasCircularQueuePtrHelper {
2365db4956bSzhanglyGit  val fromMem = io.fromMem.get
2375db4956bSzhanglyGit
2385db4956bSzhanglyGit  val memStatus = entryReg.status.mem.get
2395db4956bSzhanglyGit  println("memStatus" + memStatus)
2405db4956bSzhanglyGit  val memStatusNext = entryRegNext.status.mem.get
2415db4956bSzhanglyGit  val memStatusUpdate = entryUpdate.status.mem.get
2425db4956bSzhanglyGit
2435db4956bSzhanglyGit  // load cannot be issued before older store, unless meet some condition
2445db4956bSzhanglyGit  val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr)
2455db4956bSzhanglyGit
2465db4956bSzhanglyGit  val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid
2475db4956bSzhanglyGit
2485db4956bSzhanglyGit  val staWaitedReleased = Cat(
2495db4956bSzhanglyGit    fromMem.memWaitUpdateReq.staIssue.map(x => x.valid && x.bits.uop.robIdx.value === memStatusNext.waitForRobIdx.value)
2505db4956bSzhanglyGit  ).orR
2515db4956bSzhanglyGit  val stdWaitedReleased = Cat(
2525db4956bSzhanglyGit    fromMem.memWaitUpdateReq.stdIssue.map(x => x.valid && x.bits.uop.sqIdx.value === memStatusNext.waitForSqIdx.value)
2535db4956bSzhanglyGit  ).orR
2545db4956bSzhanglyGit  val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait
2555db4956bSzhanglyGit  val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd
2565db4956bSzhanglyGit  val waitStd = !olderStdReady
2575db4956bSzhanglyGit  val waitSta = !olderStaNotViolate
2585db4956bSzhanglyGit
2595db4956bSzhanglyGit  when (io.enq.valid && enqReady) {
2605db4956bSzhanglyGit    memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx
2615db4956bSzhanglyGit    // update by lfst at dispatch stage
2625db4956bSzhanglyGit    memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx
2635db4956bSzhanglyGit    // new load inst don't known if it is blocked by store data ahead of it
2645db4956bSzhanglyGit    memStatusNext.waitForStd := false.B
2655db4956bSzhanglyGit    // update by ssit at rename stage
2665db4956bSzhanglyGit    memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait
2675db4956bSzhanglyGit    memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx
2685db4956bSzhanglyGit  }.otherwise {
2695db4956bSzhanglyGit    memStatusNext := memStatusUpdate
2705db4956bSzhanglyGit  }
2715db4956bSzhanglyGit
2725db4956bSzhanglyGit  when(deqFailedForStdInvalid) {
2735db4956bSzhanglyGit    memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx
2745db4956bSzhanglyGit    memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx
2755db4956bSzhanglyGit    memStatusUpdate.waitForStd := true.B
2765db4956bSzhanglyGit    memStatusUpdate.strictWait := memStatus.strictWait
2775db4956bSzhanglyGit    memStatusUpdate.sqIdx := memStatus.sqIdx
2785db4956bSzhanglyGit  }.otherwise {
2795db4956bSzhanglyGit    memStatusUpdate := memStatus
2805db4956bSzhanglyGit  }
2815db4956bSzhanglyGit
2825db4956bSzhanglyGit  val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked)
2835db4956bSzhanglyGit  val blockNotReleased = waitStd || waitSta
2845db4956bSzhanglyGit  val respBlock = deqFailedForStdInvalid
2855db4956bSzhanglyGit  entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
2865db4956bSzhanglyGit  entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
2875db4956bSzhanglyGit
2885db4956bSzhanglyGit}
2895db4956bSzhanglyGit
2905db4956bSzhanglyGitobject EnqEntry {
2915db4956bSzhanglyGit  def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = {
2925db4956bSzhanglyGit    iqParams.schdType match {
2935db4956bSzhanglyGit      case IntScheduler() => new EnqEntry()
2945db4956bSzhanglyGit      case MemScheduler() =>
2955db4956bSzhanglyGit        if (iqParams.StdCnt == 0) new EnqEntryMem()
2965db4956bSzhanglyGit        else new EnqEntry()
2975db4956bSzhanglyGit      case VfScheduler() => new EnqEntry()
2985db4956bSzhanglyGit      case _ => null
2995db4956bSzhanglyGit    }
3005db4956bSzhanglyGit  }
3015db4956bSzhanglyGit}