xref: /XiangShan/src/main/scala/xiangshan/backend/issue/EnqEntry.scala (revision 59f958d490ffca3dd8df6c678c09684bb40323db)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.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
132d270511Ssinsanctionimport xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr}
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)
227a96cc7fSHaojin Tang  val og0Cancel = Input(ExuOH(backendParams.numExu))
237a96cc7fSHaojin Tang  val og1Cancel = Input(ExuOH(backendParams.numExu))
246810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, 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()))
357a96cc7fSHaojin Tang  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuOH())))
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)
412d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(UopIdx()))
425db4956bSzhanglyGit  val deqPortIdxRead = Output(UInt(1.W))
435db4956bSzhanglyGit  val issueTimerRead = Output(UInt(2.W))
445db4956bSzhanglyGit  // mem only
455db4956bSzhanglyGit  val fromMem = if(params.isMemAddrIQ) Some(new Bundle {
465db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
475db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
485db4956bSzhanglyGit  }) else None
492d270511Ssinsanction  // vector mem only
502d270511Ssinsanction  val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle {
512d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
522d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
532d270511Ssinsanction  })
5489740385Ssinsanction  // debug
5589740385Ssinsanction  val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool()))
565db4956bSzhanglyGit
575db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
585db4956bSzhanglyGit}
595db4956bSzhanglyGit
605db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
615db4956bSzhanglyGit  val io = IO(new EnqEntryIO)
625db4956bSzhanglyGit
635db4956bSzhanglyGit  val validReg = RegInit(false.B)
645db4956bSzhanglyGit  val entryReg = Reg(new EntryBundle)
655db4956bSzhanglyGit
665db4956bSzhanglyGit  val validRegNext = Wire(Bool())
675db4956bSzhanglyGit  val entryRegNext = Wire(new EntryBundle)
685db4956bSzhanglyGit  val entryUpdate = Wire(new EntryBundle)
695db4956bSzhanglyGit  val enqReady = Wire(Bool())
705db4956bSzhanglyGit  val clear = Wire(Bool())
715db4956bSzhanglyGit  val flushed = Wire(Bool())
725db4956bSzhanglyGit  val deqSuccess = Wire(Bool())
735db4956bSzhanglyGit  val srcWakeUp = Wire(Vec(params.numRegSrc, Bool()))
74af4bd265SzhanglyGit  val srcWakeUpByWB = Wire(Vec(params.numRegSrc, Bool()))
755db4956bSzhanglyGit  val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
760f55a0d3SHaojin Tang  val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
775db4956bSzhanglyGit  val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
78af4bd265SzhanglyGit  val srcWakeUpByIQWithoutCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
79af4bd265SzhanglyGit  val srcWakeUpButCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
80af4bd265SzhanglyGit  val srcWakeUpL1ExuOHOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH())))
81af4bd265SzhanglyGit  val srcLoadDependencyOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))))
820f55a0d3SHaojin Tang  val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
830f55a0d3SHaojin Tang  val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
84af4bd265SzhanglyGit  val shiftedWakeupLoadDependencyByIQBypassVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
8589740385Ssinsanction  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
865db4956bSzhanglyGit
875db4956bSzhanglyGit  //Reg
885db4956bSzhanglyGit  validReg := validRegNext
895db4956bSzhanglyGit  entryReg := entryRegNext
905db4956bSzhanglyGit
915db4956bSzhanglyGit  //Wire
925db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
935db4956bSzhanglyGit    validRegNext := true.B
945db4956bSzhanglyGit  }.elsewhen(clear) {
955db4956bSzhanglyGit    validRegNext := false.B
965db4956bSzhanglyGit  }.otherwise {
975db4956bSzhanglyGit    validRegNext := validReg
985db4956bSzhanglyGit  }
995db4956bSzhanglyGit
1005db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
1015db4956bSzhanglyGit    entryRegNext := io.enq.bits
1025db4956bSzhanglyGit  }.otherwise {
1035db4956bSzhanglyGit    entryRegNext := entryUpdate
1045db4956bSzhanglyGit  }
1055db4956bSzhanglyGit
1065db4956bSzhanglyGit  enqReady := !validReg || clear
1075db4956bSzhanglyGit  clear := flushed || io.transSel || deqSuccess
1085db4956bSzhanglyGit  flushed := entryReg.status.robIdx.needFlush(io.flush)
1090f55a0d3SHaojin Tang  deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)
110af4bd265SzhanglyGit  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
111af4bd265SzhanglyGit  srcWakeUp := srcWakeUpByWB.zip(srcWakeUpByIQVec).map { case (x, y) => x || y.asUInt.orR }
1125db4956bSzhanglyGit
1130f55a0d3SHaojin Tang  shiftedWakeupLoadDependencyByIQVec
1140f55a0d3SHaojin Tang    .zip(wakeupLoadDependencyByIQVec)
1150f55a0d3SHaojin Tang    .zip(params.wakeUpInExuSources.map(_.name)).foreach {
1160f55a0d3SHaojin Tang    case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach {
1170f55a0d3SHaojin Tang      case ((dep, originalDep), deqPortIdx) =>
118a9ffe60aSHaojin Tang        if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx)
119af4bd265SzhanglyGit          dep := (originalDep << 2).asUInt | 2.U
1200f55a0d3SHaojin Tang        else
1210f55a0d3SHaojin Tang          dep := originalDep << 1
1220f55a0d3SHaojin Tang    }
1230f55a0d3SHaojin Tang  }
124af4bd265SzhanglyGit  shiftedWakeupLoadDependencyByIQBypassVec
125af4bd265SzhanglyGit    .zip(wakeupLoadDependencyByIQVec)
126af4bd265SzhanglyGit    .zip(params.wakeUpInExuSources.map(_.name)).foreach {
127af4bd265SzhanglyGit    case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach {
128af4bd265SzhanglyGit      case ((dep, originalDep), deqPortIdx) =>
129af4bd265SzhanglyGit        if (name.contains("LDU") && name.replace("LDU", "").toInt == deqPortIdx)
130af4bd265SzhanglyGit          dep := (originalDep << 1).asUInt | 1.U
131af4bd265SzhanglyGit        else
132af4bd265SzhanglyGit          dep := originalDep
133af4bd265SzhanglyGit    }
134af4bd265SzhanglyGit  }
1350f55a0d3SHaojin Tang
1365db4956bSzhanglyGit  if (params.hasIQWakeUp) {
1370f55a0d3SHaojin Tang    srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) =>
1380f55a0d3SHaojin Tang      val ldTransCancel = Mux(
1390f55a0d3SHaojin Tang        wakeUpByIQVec.asUInt.orR,
1400f55a0d3SHaojin Tang        Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel))),
1410f55a0d3SHaojin Tang        false.B
1420f55a0d3SHaojin Tang      )
1430f55a0d3SHaojin Tang      srcLoadCancel := LoadShouldCancel(entryReg.status.srcLoadDependency.map(_(srcIdx)), io.ldCancel)
144af4bd265SzhanglyGit      srcCancel := srcLoadCancel || ldTransCancel
1455db4956bSzhanglyGit    }
1465db4956bSzhanglyGit  }
1475db4956bSzhanglyGit
1485db4956bSzhanglyGit  if (io.wakeUpFromIQ.isEmpty) {
1495db4956bSzhanglyGit    srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec)
1500f55a0d3SHaojin Tang    wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec)
1515db4956bSzhanglyGit  } else {
1525db4956bSzhanglyGit    val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) =>
1535db4956bSzhanglyGit      bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)
15483ba63b3SXuan Hu    ).toIndexedSeq.transpose
155af4bd265SzhanglyGit    val cancelSel = io.wakeUpFromIQ.map(x => x.bits.exuIdx).map(x => io.og0Cancel(x))
156af4bd265SzhanglyGit    srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel }))
157af4bd265SzhanglyGit    srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel }))
158af4bd265SzhanglyGit    srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x))
15983ba63b3SXuan Hu    wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq
1605db4956bSzhanglyGit  }
1615db4956bSzhanglyGit
1625db4956bSzhanglyGit  //entryUpdate
1635db4956bSzhanglyGit  entryUpdate.status.srcState.zip(entryReg.status.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) =>
1645db4956bSzhanglyGit    val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B)
1655db4956bSzhanglyGit    stateNext := Mux(cancel, false.B, wakeup | state)
16689740385Ssinsanction    if (params.hasIQWakeUp) {
16789740385Ssinsanction      cancelVec.get(srcIdx) := cancel
16889740385Ssinsanction    }
1695db4956bSzhanglyGit  }
1705db4956bSzhanglyGit  entryUpdate.status.dataSources.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).foreach {
1715db4956bSzhanglyGit    case ((dataSourceNext: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]) =>
1725db4956bSzhanglyGit      when(wakeUpByIQOH.asUInt.orR) {
1735db4956bSzhanglyGit        dataSourceNext.value := DataSource.bypass
1745db4956bSzhanglyGit      }.otherwise {
1755db4956bSzhanglyGit        dataSourceNext.value := DataSource.reg
1765db4956bSzhanglyGit      }
1775db4956bSzhanglyGit  }
1785db4956bSzhanglyGit  if (params.hasIQWakeUp) {
1790f55a0d3SHaojin Tang    entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach {
1807a96cc7fSHaojin Tang      case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) =>
1815db4956bSzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
1827a96cc7fSHaojin Tang          exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.toSeq.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)))
1830f55a0d3SHaojin Tang        }.elsewhen(wakeUp) {
1840f55a0d3SHaojin Tang          exuOH := 0.U.asTypeOf(exuOH)
1855db4956bSzhanglyGit        }.otherwise {
1865db4956bSzhanglyGit          exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx)
1875db4956bSzhanglyGit        }
1885db4956bSzhanglyGit    }
189af4bd265SzhanglyGit    srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach {
190af4bd265SzhanglyGit      case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) =>
191af4bd265SzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
192af4bd265SzhanglyGit          exuOH := Mux1H(wakeUpByIQOH, io.wakeUpFromIQ.map(x => MathUtils.IntToOH(x.bits.exuIdx).U(backendParams.numExu.W)).toSeq)
193af4bd265SzhanglyGit        }.elsewhen(wakeUp) {
194af4bd265SzhanglyGit          exuOH := 0.U.asTypeOf(exuOH)
195af4bd265SzhanglyGit        }.otherwise {
196af4bd265SzhanglyGit          exuOH := entryReg.status.srcWakeUpL1ExuOH.get(srcIdx)
197af4bd265SzhanglyGit        }
198af4bd265SzhanglyGit    }
1995db4956bSzhanglyGit    entryUpdate.status.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach {
2005db4956bSzhanglyGit      case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) =>
201af4bd265SzhanglyGit        srcIssuedTimerNext := MuxCase(3.U, Seq(
2025db4956bSzhanglyGit          // T0: waked up by IQ, T1: reset timer as 1
203af4bd265SzhanglyGit          wakeUpByIQOH.asUInt.orR -> 2.U,
2045db4956bSzhanglyGit          // do not overflow
2055db4956bSzhanglyGit          srcIssuedTimer.andR -> srcIssuedTimer,
2060f55a0d3SHaojin Tang          // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq
2075db4956bSzhanglyGit          (validReg && SrcState.isReady(entryReg.status.srcState(srcIdx)) && entryReg.status.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U)
2085db4956bSzhanglyGit        ))
2095db4956bSzhanglyGit    }
2100f55a0d3SHaojin Tang    entryUpdate.status.srcLoadDependency.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
2110f55a0d3SHaojin Tang      case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) =>
2120f55a0d3SHaojin Tang        loadDependencyNext :=
2130f55a0d3SHaojin Tang          Mux(wakeup,
2140f55a0d3SHaojin Tang            Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec), 0.U.asTypeOf(loadDependency)),
2150f55a0d3SHaojin Tang            Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency)
2160f55a0d3SHaojin Tang          )
2170f55a0d3SHaojin Tang    }
218af4bd265SzhanglyGit    srcLoadDependencyOut.get.zip(entryReg.status.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
219af4bd265SzhanglyGit      case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) =>
220af4bd265SzhanglyGit        loadDependencyOut :=
221af4bd265SzhanglyGit          Mux(wakeup,
222af4bd265SzhanglyGit            Mux(wakeUpByIQVec.asUInt.orR, Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec), 0.U.asTypeOf(loadDependency)),
223af4bd265SzhanglyGit            loadDependency
224af4bd265SzhanglyGit          )
225af4bd265SzhanglyGit    }
2265db4956bSzhanglyGit  }
227ea159d42Ssinsanction  entryUpdate.status.issueTimer := "b10".U //otherwise
2285db4956bSzhanglyGit  entryUpdate.status.deqPortIdx := 0.U //otherwise
2295db4956bSzhanglyGit  when(io.deqSel) {
230ea159d42Ssinsanction    entryUpdate.status.issueTimer := 0.U
2315db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := io.deqPortIdxWrite
2325db4956bSzhanglyGit  }.elsewhen(entryReg.status.issued){
2335db4956bSzhanglyGit    entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U
2345db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx
2355db4956bSzhanglyGit  }
2365db4956bSzhanglyGit  entryUpdate.status.psrc := entryReg.status.psrc
2375db4956bSzhanglyGit  entryUpdate.status.srcType := entryReg.status.srcType
2385db4956bSzhanglyGit  entryUpdate.status.fuType := entryReg.status.fuType
2395db4956bSzhanglyGit  entryUpdate.status.robIdx := entryReg.status.robIdx
2402d270511Ssinsanction  entryUpdate.status.uopIdx.foreach(_ := entryReg.status.uopIdx.get)
2415db4956bSzhanglyGit  entryUpdate.status.issued := entryReg.status.issued // otherwise
242af4bd265SzhanglyGit  when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) {
2430f55a0d3SHaojin Tang    entryUpdate.status.issued := false.B
244ea159d42Ssinsanction  }.elsewhen(io.deqSel) {
2455db4956bSzhanglyGit    entryUpdate.status.issued := true.B
246ea159d42Ssinsanction  }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) {
2475db4956bSzhanglyGit    entryUpdate.status.issued := false.B
248af4bd265SzhanglyGit  }.elsewhen(!entryReg.status.srcReady) {
249af4bd265SzhanglyGit    entryUpdate.status.issued := false.B
2505db4956bSzhanglyGit  }
2515db4956bSzhanglyGit  entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue
2525db4956bSzhanglyGit  entryUpdate.status.blocked := false.B //todo
2535db4956bSzhanglyGit  //remain imm and payload
2545db4956bSzhanglyGit  entryUpdate.imm := entryReg.imm
2555db4956bSzhanglyGit  entryUpdate.payload := entryReg.payload
2565db4956bSzhanglyGit  if(params.needPc) {
2575db4956bSzhanglyGit    entryUpdate.status.pc.get := entryReg.status.pc.get
2585db4956bSzhanglyGit  }
259af4bd265SzhanglyGit  val canIssue = entryReg.status.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR
260af4bd265SzhanglyGit  val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked &&
261af4bd265SzhanglyGit    VecInit(entryReg.status.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) =>
262af4bd265SzhanglyGit      val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B)
263af4bd265SzhanglyGit      Mux(cancel, false.B, wakeupVec.asUInt.orR | state)
264af4bd265SzhanglyGit    }).asUInt.andR
265af4bd265SzhanglyGit  io.dataSource.zip(entryReg.status.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
266af4bd265SzhanglyGit    case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) =>
267af4bd265SzhanglyGit      when(wakeUpByIQOH.asUInt.orR) {
268af4bd265SzhanglyGit        dataSourceOut.value := DataSource.forward
269af4bd265SzhanglyGit      }.elsewhen(wakeUpAll) {
270af4bd265SzhanglyGit        dataSourceOut.value := DataSource.reg
271af4bd265SzhanglyGit      }.otherwise {
272af4bd265SzhanglyGit        dataSourceOut.value := dataSource.value
273af4bd265SzhanglyGit      }
274af4bd265SzhanglyGit  }
275af4bd265SzhanglyGit  if (params.hasIQWakeUp) {
276af4bd265SzhanglyGit    io.srcTimer.get.zip(entryReg.status.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach {
277af4bd265SzhanglyGit      case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) =>
278af4bd265SzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
279af4bd265SzhanglyGit          srcTimerOut := 1.U
280af4bd265SzhanglyGit        }.otherwise {
281af4bd265SzhanglyGit          srcTimerOut := srcTimer
282af4bd265SzhanglyGit        }
283af4bd265SzhanglyGit    }
284af4bd265SzhanglyGit  }
2855db4956bSzhanglyGit
2865db4956bSzhanglyGit  //output
2875db4956bSzhanglyGit  io.transEntry.valid := validReg && io.transSel && !flushed && !deqSuccess
2885db4956bSzhanglyGit  io.transEntry.bits := entryUpdate
289*59f958d4SzhanglyGit  io.canIssue := (canIssue || canIssueBypass) && !flushed
2905db4956bSzhanglyGit  io.clear := clear
2915db4956bSzhanglyGit  io.fuType := entryReg.status.fuType
292af4bd265SzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, entryReg.status.srcWakeUpL1ExuOH.get))
2935db4956bSzhanglyGit  io.valid := validReg
2945db4956bSzhanglyGit  io.isFirstIssue := !entryReg.status.firstIssue
2955db4956bSzhanglyGit  io.entry.valid := validReg
2965db4956bSzhanglyGit  io.entry.bits := entryReg
297af4bd265SzhanglyGit  io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, entryReg.status.srcLoadDependency.get))
2985db4956bSzhanglyGit  io.robIdx := entryReg.status.robIdx
2992d270511Ssinsanction  io.uopIdx.foreach(_ := entryReg.status.uopIdx.get)
300ea159d42Ssinsanction  io.issueTimerRead := entryReg.status.issueTimer
301ea159d42Ssinsanction  io.deqPortIdxRead := entryReg.status.deqPortIdx
30289740385Ssinsanction  io.cancel.foreach(_ := cancelVec.get.asUInt.orR)
3035db4956bSzhanglyGit}
3045db4956bSzhanglyGit
3055db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry
3065db4956bSzhanglyGit  with HasCircularQueuePtrHelper {
3075db4956bSzhanglyGit  val fromMem = io.fromMem.get
3085db4956bSzhanglyGit
3095db4956bSzhanglyGit  val memStatus = entryReg.status.mem.get
3105db4956bSzhanglyGit  println("memStatus" + memStatus)
3115db4956bSzhanglyGit  val memStatusNext = entryRegNext.status.mem.get
3125db4956bSzhanglyGit  val memStatusUpdate = entryUpdate.status.mem.get
3135db4956bSzhanglyGit
3145db4956bSzhanglyGit  // load cannot be issued before older store, unless meet some condition
3155db4956bSzhanglyGit  val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr)
3165db4956bSzhanglyGit
3175db4956bSzhanglyGit  val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid
3185db4956bSzhanglyGit
3195db4956bSzhanglyGit  val staWaitedReleased = Cat(
32006083203SHaojin Tang    fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value)
3215db4956bSzhanglyGit  ).orR
3225db4956bSzhanglyGit  val stdWaitedReleased = Cat(
32306083203SHaojin Tang    fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value)
3245db4956bSzhanglyGit  ).orR
3255db4956bSzhanglyGit  val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait
3265db4956bSzhanglyGit  val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd
3275db4956bSzhanglyGit  val waitStd = !olderStdReady
3285db4956bSzhanglyGit  val waitSta = !olderStaNotViolate
3295db4956bSzhanglyGit
3305db4956bSzhanglyGit  when (io.enq.valid && enqReady) {
3315db4956bSzhanglyGit    memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx
3325db4956bSzhanglyGit    // update by lfst at dispatch stage
3335db4956bSzhanglyGit    memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx
3345db4956bSzhanglyGit    // new load inst don't known if it is blocked by store data ahead of it
3355db4956bSzhanglyGit    memStatusNext.waitForStd := false.B
3365db4956bSzhanglyGit    // update by ssit at rename stage
3375db4956bSzhanglyGit    memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait
3385db4956bSzhanglyGit    memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx
3395db4956bSzhanglyGit  }.otherwise {
3405db4956bSzhanglyGit    memStatusNext := memStatusUpdate
3415db4956bSzhanglyGit  }
3425db4956bSzhanglyGit
3435db4956bSzhanglyGit  when(deqFailedForStdInvalid) {
3445db4956bSzhanglyGit    memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx
3455db4956bSzhanglyGit    memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx
3465db4956bSzhanglyGit    memStatusUpdate.waitForStd := true.B
3475db4956bSzhanglyGit    memStatusUpdate.strictWait := memStatus.strictWait
3485db4956bSzhanglyGit    memStatusUpdate.sqIdx := memStatus.sqIdx
3495db4956bSzhanglyGit  }.otherwise {
3505db4956bSzhanglyGit    memStatusUpdate := memStatus
3515db4956bSzhanglyGit  }
3525db4956bSzhanglyGit
3535db4956bSzhanglyGit  val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked)
3545db4956bSzhanglyGit  val blockNotReleased = waitStd || waitSta
3555db4956bSzhanglyGit  val respBlock = deqFailedForStdInvalid
3565db4956bSzhanglyGit  entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
3575db4956bSzhanglyGit  entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
3585db4956bSzhanglyGit
3595db4956bSzhanglyGit}
3605db4956bSzhanglyGit
3612d270511Ssinsanctionclass EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem {
3622d270511Ssinsanction
3632d270511Ssinsanction  require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ")
3642d270511Ssinsanction
3652d270511Ssinsanction  val vecMemStatus = entryReg.status.vecMem.get
3662d270511Ssinsanction  val vecMemStatusNext = entryRegNext.status.vecMem.get
3672d270511Ssinsanction  val vecMemStatusUpdate = entryUpdate.status.vecMem.get
3682d270511Ssinsanction  val fromLsq = io.fromLsq.get
3692d270511Ssinsanction
3702d270511Ssinsanction  when (io.enq.valid && enqReady) {
3712d270511Ssinsanction    vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx
3722d270511Ssinsanction    vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx
3732d270511Ssinsanction  }.otherwise {
3742d270511Ssinsanction    vecMemStatusNext := vecMemStatusUpdate
3752d270511Ssinsanction  }
3762d270511Ssinsanction  vecMemStatusUpdate := vecMemStatus
3772d270511Ssinsanction
3782d270511Ssinsanction  val isLsqHead = {
37929b863e5Szhanglinjuan    // if (params.isVecLdAddrIQ)
38031c1fcd8Szhanglinjuan      entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr &&
38129b863e5Szhanglinjuan    // else
38231c1fcd8Szhanglinjuan      entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr
3832d270511Ssinsanction  }
3842d270511Ssinsanction
3852d270511Ssinsanction  entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead
3862d270511Ssinsanction  entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead
3872d270511Ssinsanction}
3882d270511Ssinsanction
3892d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry
3902d270511Ssinsanction  with HasCircularQueuePtrHelper {
3912d270511Ssinsanction
3922d270511Ssinsanction  require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ")
3932d270511Ssinsanction
3942d270511Ssinsanction  val vecMemStatus = entryReg.status.vecMem.get
3952d270511Ssinsanction  val vecMemStatusNext = entryRegNext.status.vecMem.get
3962d270511Ssinsanction  val vecMemStatusUpdate = entryUpdate.status.vecMem.get
3972d270511Ssinsanction  val fromLsq = io.fromLsq.get
3982d270511Ssinsanction
3992d270511Ssinsanction  when (io.enq.valid && enqReady) {
4002d270511Ssinsanction    vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx
4012d270511Ssinsanction    vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx
4022d270511Ssinsanction  }.otherwise {
4032d270511Ssinsanction    vecMemStatusNext := vecMemStatusUpdate
4042d270511Ssinsanction  }
4052d270511Ssinsanction  vecMemStatusUpdate := vecMemStatus
4062d270511Ssinsanction
4072d270511Ssinsanction  val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value
4082d270511Ssinsanction
4092d270511Ssinsanction  entryRegNext.status.blocked := !isLsqHead
4102d270511Ssinsanction  entryUpdate.status.blocked := !isLsqHead
4112d270511Ssinsanction}
4122d270511Ssinsanction
4135db4956bSzhanglyGitobject EnqEntry {
4145db4956bSzhanglyGit  def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = {
4155db4956bSzhanglyGit    iqParams.schdType match {
4165db4956bSzhanglyGit      case IntScheduler() => new EnqEntry()
4175db4956bSzhanglyGit      case MemScheduler() =>
41897b279b9SXuan Hu        if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem()
4192d270511Ssinsanction        else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr()
4202d270511Ssinsanction        else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData()
4215db4956bSzhanglyGit        else new EnqEntry()
4225db4956bSzhanglyGit      case VfScheduler() => new EnqEntry()
4235db4956bSzhanglyGit      case _ => null
4245db4956bSzhanglyGit    }
4255db4956bSzhanglyGit  }
4265db4956bSzhanglyGit}