xref: /XiangShan/src/main/scala/xiangshan/backend/issue/IssueQueue.scala (revision 1592abd11eecf7bec0f1453ffe4a7617167f8ba9)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util._
6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
7bb2f3f51STang Haojinimport utility.{GTimer, GatedValidRegNext, HasCircularQueuePtrHelper, SelectOne, XSPerfAccumulate, XSPerfHistogram}
8730cfbc0SXuan Huimport xiangshan._
9c0be7f33SXuan Huimport xiangshan.backend.Bundles._
10aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._
11f4dcd9fcSsinsanctionimport xiangshan.backend.decode.{ImmUnion, Imm_LUI_LOAD}
12730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
13c0be7f33SXuan Huimport xiangshan.backend.datapath.DataSource
148e208fb5SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType}
152d270511Ssinsanctionimport xiangshan.backend.rob.RobPtr
1659ef6009Sxiaofeibao-xjtuimport xiangshan.backend.datapath.NewPipelineConnect
176dbb4e08SXuan Huimport xiangshan.backend.fu.vector.Bundles.VSew
189e12e8edScz4eimport xiangshan.mem.{LqPtr, SqPtr}
1999ce5576Scz4eimport xiangshan.mem.Bundles.MemWaitUpdateReqBundle
20*1592abd1SYan Xuimport utility.PerfCCT
21730cfbc0SXuan Hu
22730cfbc0SXuan Huclass IssueQueue(params: IssueBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
231ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
241ca4a39dSXuan Hu
25195ef4a5STang Haojin  implicit val iqParams: IssueBlockParams = params
2683ba63b3SXuan Hu  lazy val module: IssueQueueImp = iqParams.schdType match {
27730cfbc0SXuan Hu    case IntScheduler() => new IssueQueueIntImp(this)
2860f0c5aeSxiaofeibao    case FpScheduler() => new IssueQueueFpImp(this)
29730cfbc0SXuan Hu    case VfScheduler() => new IssueQueueVfImp(this)
302d270511Ssinsanction    case MemScheduler() =>
312d270511Ssinsanction      if (iqParams.StdCnt == 0 && !iqParams.isVecMemIQ) new IssueQueueMemAddrImp(this)
322d270511Ssinsanction      else if (iqParams.isVecMemIQ) new IssueQueueVecMemImp(this)
33730cfbc0SXuan Hu      else new IssueQueueIntImp(this)
34730cfbc0SXuan Hu    case _ => null
35730cfbc0SXuan Hu  }
36730cfbc0SXuan Hu}
37730cfbc0SXuan Hu
3856bcaed7SHaojin Tangclass IssueQueueStatusBundle(numEnq: Int, numEntries: Int) extends Bundle {
39730cfbc0SXuan Hu  val empty = Output(Bool())
40730cfbc0SXuan Hu  val full = Output(Bool())
41e6bdebf4Sxiaofeibao  val validCnt = Output(UInt(log2Ceil(numEntries + 1).W))
42730cfbc0SXuan Hu  val leftVec = Output(Vec(numEnq + 1, Bool()))
43730cfbc0SXuan Hu}
44730cfbc0SXuan Hu
455db4956bSzhanglyGitclass IssueQueueDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends EntryDeqRespBundle
46730cfbc0SXuan Hu
47730cfbc0SXuan Huclass IssueQueueIO()(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
48bf35baadSXuan Hu  // Inputs
49730cfbc0SXuan Hu  val flush = Flipped(ValidIO(new Redirect))
50730cfbc0SXuan Hu  val enq = Vec(params.numEnq, Flipped(DecoupledIO(new DynInst)))
51730cfbc0SXuan Hu
52730cfbc0SXuan Hu  val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle)))
53730cfbc0SXuan Hu  val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle)))
5442b6cdf9Ssinsanction  val og2Resp = Option.when(params.needOg2Resp)(Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))))
553bba894fSxiaofeibao  val finalIssueResp = Option.when(params.LdExuCnt > 0 || params.VlduCnt > 0)(Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))))
56bb2f3f51STang Haojin  val memAddrIssueResp = Option.when(params.LdExuCnt > 0)(Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))))
57bb2f3f51STang Haojin  val vecLoadIssueResp = Option.when(params.VlduCnt > 0)(Vec(params.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))))
58e3da8badSTang Haojin  val wbBusyTableRead = Input(params.genWbFuBusyTableReadBundle)
59e3da8badSTang Haojin  val wbBusyTableWrite = Output(params.genWbFuBusyTableWriteBundle)
60c0be7f33SXuan Hu  val wakeupFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
61c0be7f33SXuan Hu  val wakeupFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
629df83ee5Sxiaofeibao  val wakeupFromWBDelayed: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
639df83ee5Sxiaofeibao  val wakeupFromIQDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
64d88d4328SZiyue Zhang  val vlFromIntIsZero = Input(Bool())
65d88d4328SZiyue Zhang  val vlFromIntIsVlmax = Input(Bool())
66d88d4328SZiyue Zhang  val vlFromVfIsZero = Input(Bool())
67d88d4328SZiyue Zhang  val vlFromVfIsVlmax = Input(Bool())
68be9ff987Ssinsanction  val og0Cancel = Input(ExuVec())
69be9ff987Ssinsanction  val og1Cancel = Input(ExuVec())
706810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
710c112fa1Ssinsanction  val replaceRCIdx = Option.when(params.needWriteRegCache)(Vec(params.numDeq, Input(UInt(RegCacheIdxWidth.W))))
72bf35baadSXuan Hu
73bf35baadSXuan Hu  // Outputs
74c0be7f33SXuan Hu  val wakeupToIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpSourceValidBundle
7556bcaed7SHaojin Tang  val status = Output(new IssueQueueStatusBundle(params.numEnq, params.numEntries))
76ff3fcdf1Sxiaofeibao-xjtu  val validCntDeqVec = Output(Vec(params.numDeq,UInt(params.numEntries.U.getWidth.W)))
7714b3c65cSHaojin Tang  // val statusNext = Output(new IssueQueueStatusBundle(params.numEnq))
78bf35baadSXuan Hu
7959ef6009Sxiaofeibao-xjtu  val deqDelay: MixedVec[DecoupledIO[IssueQueueIssueBundle]] = params.genIssueDecoupledBundle// = deq.cloneType
80bf35baadSXuan Hu  def allWakeUp = wakeupFromWB ++ wakeupFromIQ
81730cfbc0SXuan Hu}
82730cfbc0SXuan Hu
83730cfbc0SXuan Huclass IssueQueueImp(override val wrapper: IssueQueue)(implicit p: Parameters, val params: IssueBlockParams)
84730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
85730cfbc0SXuan Hu  with HasXSParameter {
86730cfbc0SXuan Hu
870721d1aaSXuan Hu  override def desiredName: String = s"${params.getIQName}"
880721d1aaSXuan Hu
89c0be7f33SXuan Hu  println(s"[IssueQueueImp] ${params.getIQName} wakeupFromWB(${io.wakeupFromWB.size}), " +
90e63b0a03SXuan Hu    s"wakeup exu in(${params.wakeUpInExuSources.size}): ${params.wakeUpInExuSources.map(_.name).mkString("{",",","}")}, " +
91e63b0a03SXuan Hu    s"wakeup exu out(${params.wakeUpOutExuSources.size}): ${params.wakeUpOutExuSources.map(_.name).mkString("{",",","}")}, " +
9228607074Ssinsanction    s"numEntries: ${params.numEntries}, numRegSrc: ${params.numRegSrc}, " +
9328607074Ssinsanction    s"numEnq: ${params.numEnq}, numSimp: ${params.numSimp}, numComp: ${params.numComp}, numDeq: ${params.numDeq}, " +
9428607074Ssinsanction    s"isAllSimp: ${params.isAllSimp}, isAllComp: ${params.isAllComp}")
95730cfbc0SXuan Hu
96730cfbc0SXuan Hu  require(params.numExu <= 2, "IssueQueue has not supported more than 2 deq ports")
9728607074Ssinsanction  require(params.numEnq <= 2, "IssueQueue has not supported more than 2 enq ports")
9828607074Ssinsanction  require(params.numSimp == 0 || params.numSimp >= params.numEnq, "numSimp should be 0 or at least not less than numEnq")
9928607074Ssinsanction  require(params.numComp == 0 || params.numComp >= params.numEnq, "numComp should be 0 or at least not less than numEnq")
10028607074Ssinsanction
101730cfbc0SXuan Hu  val deqFuCfgs     : Seq[Seq[FuConfig]] = params.exuBlockParams.map(_.fuConfigs)
102730cfbc0SXuan Hu  val allDeqFuCfgs  : Seq[FuConfig] = params.exuBlockParams.flatMap(_.fuConfigs)
103730cfbc0SXuan Hu  val fuCfgsCnt     : Map[FuConfig, Int] = allDeqFuCfgs.groupBy(x => x).map { case (cfg, cfgSeq) => (cfg, cfgSeq.length) }
104730cfbc0SXuan Hu  val commonFuCfgs  : Seq[FuConfig] = fuCfgsCnt.filter(_._2 > 1).keys.toSeq
105c38df446SzhanglyGit  val wakeupFuLatencyMaps : Seq[Map[FuType.OHType, Int]] = params.exuBlockParams.map(x => x.wakeUpFuLatencyMap)
1068e208fb5SXuan Hu
107c38df446SzhanglyGit  println(s"[IssueQueueImp] ${params.getIQName} fuLatencyMaps: ${wakeupFuLatencyMaps}")
108730cfbc0SXuan Hu  println(s"[IssueQueueImp] ${params.getIQName} commonFuCfgs: ${commonFuCfgs.map(_.name)}")
109f57d73d6Ssinsanction  if (params.hasIQWakeUp) {
110f57d73d6Ssinsanction    val exuSourcesEncodeString = params.wakeUpSourceExuIdx.map(x => 1 << x).reduce(_ + _).toBinaryString
111f57d73d6Ssinsanction    println(s"[IssueQueueImp] ${params.getIQName} exuSourcesWidth: ${ExuSource().value.getWidth}, " +
112f57d73d6Ssinsanction      s"exuSourcesEncodeMask: ${"0" * (p(XSCoreParamsKey).backendParams.numExu - exuSourcesEncodeString.length) + exuSourcesEncodeString}")
113f57d73d6Ssinsanction  }
114f57d73d6Ssinsanction
115730cfbc0SXuan Hu  lazy val io = IO(new IssueQueueIO())
1165db4956bSzhanglyGit
117*1592abd1SYan Xu  io.enq.zipWithIndex.foreach { case (enq, i) =>
118*1592abd1SYan Xu    PerfCCT.updateInstPos(enq.bits.debug_seqNum, PerfCCT.InstPos.AtIssueQue.id.U, enq.valid, clock, reset)
119*1592abd1SYan Xu  }
120*1592abd1SYan Xu
12128607074Ssinsanction  // Modules
1225db4956bSzhanglyGit  val entries = Module(new Entries)
123bb2f3f51STang Haojin  val fuBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.latencyValMax > 0)(Module(new FuBusyTableWrite(x.fuLatencyMap))) }
124bb2f3f51STang Haojin  val fuBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.latencyValMax > 0)(Module(new FuBusyTableRead(x.fuLatencyMap))) }
125bb2f3f51STang Haojin  val intWbBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.intLatencyCertain)(Module(new FuBusyTableWrite(x.intFuLatencyMap))) }
126bb2f3f51STang Haojin  val intWbBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.intLatencyCertain)(Module(new FuBusyTableRead(x.intFuLatencyMap))) }
127bb2f3f51STang Haojin  val fpWbBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.fpLatencyCertain)(Module(new FuBusyTableWrite(x.fpFuLatencyMap))) }
128bb2f3f51STang Haojin  val fpWbBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.fpLatencyCertain)(Module(new FuBusyTableRead(x.fpFuLatencyMap))) }
129bb2f3f51STang Haojin  val vfWbBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.vfLatencyCertain)(Module(new FuBusyTableWrite(x.vfFuLatencyMap))) }
130bb2f3f51STang Haojin  val vfWbBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.vfLatencyCertain)(Module(new FuBusyTableRead(x.vfFuLatencyMap))) }
131bb2f3f51STang Haojin  val v0WbBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.v0LatencyCertain)(Module(new FuBusyTableWrite(x.v0FuLatencyMap))) }
132bb2f3f51STang Haojin  val v0WbBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.v0LatencyCertain)(Module(new FuBusyTableRead(x.v0FuLatencyMap))) }
133bb2f3f51STang Haojin  val vlWbBusyTableWrite = params.exuBlockParams.map { case x => Option.when(x.vlLatencyCertain)(Module(new FuBusyTableWrite(x.vlFuLatencyMap))) }
134bb2f3f51STang Haojin  val vlWbBusyTableRead = params.exuBlockParams.map { case x => Option.when(x.vlLatencyCertain)(Module(new FuBusyTableRead(x.vlFuLatencyMap))) }
135730cfbc0SXuan Hu
136493a9370SHaojin Tang  class WakeupQueueFlush extends Bundle {
137493a9370SHaojin Tang    val redirect = ValidIO(new Redirect)
1386810d1e8Ssfencevma    val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, new LoadCancelIO)
139493a9370SHaojin Tang    val og0Fail = Output(Bool())
140493a9370SHaojin Tang    val og1Fail = Output(Bool())
141493a9370SHaojin Tang  }
142493a9370SHaojin Tang
143493a9370SHaojin Tang  private def flushFunc(exuInput: ExuInput, flush: WakeupQueueFlush, stage: Int): Bool = {
144493a9370SHaojin Tang    val redirectFlush = exuInput.robIdx.needFlush(flush.redirect)
1450f55a0d3SHaojin Tang    val loadDependencyFlush = LoadShouldCancel(exuInput.loadDependency, flush.ldCancel)
146493a9370SHaojin Tang    val ogFailFlush = stage match {
147493a9370SHaojin Tang      case 1 => flush.og0Fail
148493a9370SHaojin Tang      case 2 => flush.og1Fail
149493a9370SHaojin Tang      case _ => false.B
150493a9370SHaojin Tang    }
1510f55a0d3SHaojin Tang    redirectFlush || loadDependencyFlush || ogFailFlush
1520f55a0d3SHaojin Tang  }
1530f55a0d3SHaojin Tang
154ec1fea84SzhanglyGit  private def modificationFunc(exuInput: ExuInput): ExuInput = {
155ec1fea84SzhanglyGit    val newExuInput = WireDefault(exuInput)
156ec1fea84SzhanglyGit    newExuInput.loadDependency match {
157ec1fea84SzhanglyGit      case Some(deps) => deps.zip(exuInput.loadDependency.get).foreach(x => x._1 := x._2 << 1)
158ec1fea84SzhanglyGit      case None =>
159ec1fea84SzhanglyGit    }
160ec1fea84SzhanglyGit    newExuInput
161ec1fea84SzhanglyGit  }
162ec1fea84SzhanglyGit
163ec1fea84SzhanglyGit  private def lastConnectFunc(exuInput: ExuInput, newInput: ExuInput): ExuInput = {
1640c7ebb58Sxiaofeibao-xjtu    val lastExuInput = WireDefault(exuInput)
1650c7ebb58Sxiaofeibao-xjtu    val newExuInput = WireDefault(newInput)
1660c7ebb58Sxiaofeibao-xjtu    newExuInput.elements.foreach { case (name, data) =>
1670c7ebb58Sxiaofeibao-xjtu      if (lastExuInput.elements.contains(name)) {
1680c7ebb58Sxiaofeibao-xjtu        data := lastExuInput.elements(name)
1690c7ebb58Sxiaofeibao-xjtu      }
1700c7ebb58Sxiaofeibao-xjtu    }
1710c7ebb58Sxiaofeibao-xjtu    if (newExuInput.pdestCopy.nonEmpty && !lastExuInput.pdestCopy.nonEmpty) {
1720c7ebb58Sxiaofeibao-xjtu      newExuInput.pdestCopy.get.foreach(_ := lastExuInput.pdest)
1730c7ebb58Sxiaofeibao-xjtu    }
1744c5a0d77Sxiaofeibao-xjtu    if (newExuInput.rfWenCopy.nonEmpty && !lastExuInput.rfWenCopy.nonEmpty) {
1754c5a0d77Sxiaofeibao-xjtu      newExuInput.rfWenCopy.get.foreach(_ := lastExuInput.rfWen.get)
1764c5a0d77Sxiaofeibao-xjtu    }
1774c5a0d77Sxiaofeibao-xjtu    if (newExuInput.fpWenCopy.nonEmpty && !lastExuInput.fpWenCopy.nonEmpty) {
1784c5a0d77Sxiaofeibao-xjtu      newExuInput.fpWenCopy.get.foreach(_ := lastExuInput.fpWen.get)
1794c5a0d77Sxiaofeibao-xjtu    }
1804c5a0d77Sxiaofeibao-xjtu    if (newExuInput.vecWenCopy.nonEmpty && !lastExuInput.vecWenCopy.nonEmpty) {
1818dd32220Ssinsanction      newExuInput.vecWenCopy.get.foreach(_ := lastExuInput.vecWen.get)
1828dd32220Ssinsanction    }
1838dd32220Ssinsanction    if (newExuInput.v0WenCopy.nonEmpty && !lastExuInput.v0WenCopy.nonEmpty) {
1848dd32220Ssinsanction      newExuInput.v0WenCopy.get.foreach(_ := lastExuInput.v0Wen.get)
1858dd32220Ssinsanction    }
1868dd32220Ssinsanction    if (newExuInput.vlWenCopy.nonEmpty && !lastExuInput.vlWenCopy.nonEmpty) {
1878dd32220Ssinsanction      newExuInput.vlWenCopy.get.foreach(_ := lastExuInput.vlWen.get)
1884c5a0d77Sxiaofeibao-xjtu    }
1894c5a0d77Sxiaofeibao-xjtu    if (newExuInput.loadDependencyCopy.nonEmpty && !lastExuInput.loadDependencyCopy.nonEmpty) {
1904c5a0d77Sxiaofeibao-xjtu      newExuInput.loadDependencyCopy.get.foreach(_ := lastExuInput.loadDependency.get)
1914c5a0d77Sxiaofeibao-xjtu    }
1920f55a0d3SHaojin Tang    newExuInput
193493a9370SHaojin Tang  }
194493a9370SHaojin Tang
195bb2f3f51STang Haojin  val wakeUpQueues: Seq[Option[MultiWakeupQueue[ExuInput, WakeupQueueFlush]]] = params.exuBlockParams.map { x => Option.when(x.isIQWakeUpSource && !x.hasLoadExu)(Module(
1966fa1007bSxiaofeibao-xjtu    new MultiWakeupQueue(new ExuInput(x), new ExuInput(x, x.copyWakeupOut, x.copyNum), new WakeupQueueFlush, x.wakeUpFuLatancySet, flushFunc, modificationFunc, lastConnectFunc)
197a01a12bbSHaojin Tang  ))}
198fb445e8dSzhanglyGit  val deqBeforeDly = Wire(params.genIssueDecoupledBundle)
199bf35baadSXuan Hu
200dd970561SzhanglyGit  val intWbBusyTableIn = io.wbBusyTableRead.map(_.intWbBusyTable)
20160f0c5aeSxiaofeibao  val fpWbBusyTableIn = io.wbBusyTableRead.map(_.fpWbBusyTable)
202dd970561SzhanglyGit  val vfWbBusyTableIn = io.wbBusyTableRead.map(_.vfWbBusyTable)
2038dd32220Ssinsanction  val v0WbBusyTableIn = io.wbBusyTableRead.map(_.v0WbBusyTable)
2048dd32220Ssinsanction  val vlWbBusyTableIn = io.wbBusyTableRead.map(_.vlWbBusyTable)
2058dd32220Ssinsanction
206dd970561SzhanglyGit  val intWbBusyTableOut = io.wbBusyTableWrite.map(_.intWbBusyTable)
20760f0c5aeSxiaofeibao  val fpWbBusyTableOut = io.wbBusyTableWrite.map(_.fpWbBusyTable)
208dd970561SzhanglyGit  val vfWbBusyTableOut = io.wbBusyTableWrite.map(_.vfWbBusyTable)
2098dd32220Ssinsanction  val v0WbBusyTableOut = io.wbBusyTableWrite.map(_.v0WbBusyTable)
2108dd32220Ssinsanction  val vlWbBusyTableOut = io.wbBusyTableWrite.map(_.vlWbBusyTable)
2118dd32220Ssinsanction
212dd970561SzhanglyGit  val intDeqRespSetOut = io.wbBusyTableWrite.map(_.intDeqRespSet)
21360f0c5aeSxiaofeibao  val fpDeqRespSetOut = io.wbBusyTableWrite.map(_.fpDeqRespSet)
214dd970561SzhanglyGit  val vfDeqRespSetOut = io.wbBusyTableWrite.map(_.vfDeqRespSet)
2158dd32220Ssinsanction  val v0DeqRespSetOut = io.wbBusyTableWrite.map(_.v0DeqRespSet)
2168dd32220Ssinsanction  val vlDeqRespSetOut = io.wbBusyTableWrite.map(_.vlDeqRespSet)
2178dd32220Ssinsanction
218ea0f92d8Sczw  val fuBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
219de93b508SzhanglyGit  val intWbBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
22060f0c5aeSxiaofeibao  val fpWbBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
221de93b508SzhanglyGit  val vfWbBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
2228dd32220Ssinsanction  val v0WbBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
2238dd32220Ssinsanction  val vlWbBusyTableMask = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
2248dd32220Ssinsanction
225730cfbc0SXuan Hu  val s0_enqValidVec = io.enq.map(_.valid)
226730cfbc0SXuan Hu  val s0_enqSelValidVec = Wire(Vec(params.numEnq, Bool()))
227730cfbc0SXuan Hu  val s0_enqNotFlush = !io.flush.valid
228730cfbc0SXuan Hu  val s0_enqBits = WireInit(VecInit(io.enq.map(_.bits)))
2295db4956bSzhanglyGit  val s0_doEnqSelValidVec = s0_enqSelValidVec.map(_ && s0_enqNotFlush) //enqValid && notFlush && enqReady
230730cfbc0SXuan Hu
231730cfbc0SXuan Hu
232730cfbc0SXuan Hu  val finalDeqSelValidVec = Wire(Vec(params.numDeq, Bool()))
233730cfbc0SXuan Hu  val finalDeqSelOHVec    = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
234730cfbc0SXuan Hu
2355db4956bSzhanglyGit  val validVec = VecInit(entries.io.valid.asBools)
236c0beb497Sxiaofeibao  val issuedVec = VecInit(entries.io.issued.asBools)
237c0beb497Sxiaofeibao  val requestForTrans = VecInit(validVec.zip(issuedVec).map(x => x._1 && !x._2))
2385db4956bSzhanglyGit  val canIssueVec = VecInit(entries.io.canIssue.asBools)
239aa2bcc31SzhanglyGit  dontTouch(canIssueVec)
240aa2bcc31SzhanglyGit  val deqFirstIssueVec = entries.io.isFirstIssue
241730cfbc0SXuan Hu
2425db4956bSzhanglyGit  val dataSources: Vec[Vec[DataSource]] = entries.io.dataSources
243cf4a131aSsinsanction  val finalDataSources: Vec[Vec[DataSource]] = VecInit(finalDeqSelOHVec.map(oh => Mux1H(oh, dataSources)))
244eea4a3caSzhanglyGit  val loadDependency: Vec[Vec[UInt]] = entries.io.loadDependency
245eea4a3caSzhanglyGit  val finalLoadDependency: IndexedSeq[Vec[UInt]] = VecInit(finalDeqSelOHVec.map(oh => Mux1H(oh, loadDependency)))
246f57d73d6Ssinsanction  // (entryIdx)(srcIdx)
247f57d73d6Ssinsanction  val exuSources: Option[Vec[Vec[ExuSource]]] = entries.io.exuSources
248f57d73d6Ssinsanction  // (deqIdx)(srcIdx)
249f57d73d6Ssinsanction  val finalExuSources: Option[Vec[Vec[ExuSource]]] = exuSources.map(x => VecInit(finalDeqSelOHVec.map(oh => Mux1H(oh, x))))
250cdac04a3SXuan Hu
2515db4956bSzhanglyGit  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
2525db4956bSzhanglyGit  val deqEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
253cf4a131aSsinsanction  val canIssueMergeAllBusy = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
254cf4a131aSsinsanction  val deqCanIssue = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
2555db4956bSzhanglyGit
25628607074Ssinsanction  //deq
25740283787Ssinsanction  val enqEntryOldestSel = Wire(Vec(params.numDeq, ValidIO(UInt(params.numEnq.W))))
258bb2f3f51STang Haojin  val simpEntryOldestSel = Option.when(params.hasCompAndSimp)(Wire(Vec(params.numDeq + params.numEnq, ValidIO(UInt(params.numSimp.W)))))
259bb2f3f51STang Haojin  val compEntryOldestSel = Option.when(params.hasCompAndSimp)(Wire(Vec(params.numDeq, ValidIO(UInt(params.numComp.W)))))
26040283787Ssinsanction  val othersEntryOldestSel = Wire(Vec(params.numDeq, ValidIO(UInt((params.numEntries - params.numEnq).W))))
261f7f73727Ssinsanction  val deqSelValidVec = Wire(Vec(params.numDeq, Bool()))
262f7f73727Ssinsanction  val deqSelOHVec    = Wire(Vec(params.numDeq, UInt(params.numEntries.W)))
263af4bd265SzhanglyGit  val cancelDeqVec = Wire(Vec(params.numDeq, Bool()))
264f7f73727Ssinsanction
265bb2f3f51STang Haojin  val subDeqSelValidVec = Option.when(params.deqFuSame)(Wire(Vec(params.numDeq, Bool())))
266bb2f3f51STang Haojin  val subDeqSelOHVec = Option.when(params.deqFuSame)(Wire(Vec(params.numDeq, UInt(params.numEntries.W))))
267bb2f3f51STang Haojin  val subDeqRequest = Option.when(params.deqFuSame)(Wire(UInt(params.numEntries.W)))
268cf4a131aSsinsanction
26928607074Ssinsanction  //trans
270bb2f3f51STang Haojin  val simpEntryEnqSelVec = Option.when(params.hasCompAndSimp)(Wire(Vec(params.numEnq, UInt(params.numSimp.W))))
271bb2f3f51STang Haojin  val compEntryEnqSelVec = Option.when(params.hasCompAndSimp)(Wire(Vec(params.numEnq, UInt(params.numComp.W))))
272bb2f3f51STang Haojin  val othersEntryEnqSelVec = Option.when(params.isAllComp || params.isAllSimp)(Wire(Vec(params.numEnq, UInt((params.numEntries - params.numEnq).W))))
273bb2f3f51STang Haojin  val simpAgeDetectRequest = Option.when(params.hasCompAndSimp)(Wire(Vec(params.numDeq + params.numEnq, UInt(params.numSimp.W))))
27428607074Ssinsanction  simpAgeDetectRequest.foreach(_ := 0.U.asTypeOf(simpAgeDetectRequest.get))
27528607074Ssinsanction
276de111a36Ssinsanction  // when vf exu (with og2) wake up int/mem iq (without og2), the wakeup signals should delay 1 cycle
277de111a36Ssinsanction  // as vf exu's min latency is 1, we do not need consider og0cancel
278de111a36Ssinsanction  val wakeupFromIQ = Wire(chiselTypeOf(io.wakeupFromIQ))
279de111a36Ssinsanction  wakeupFromIQ.zip(io.wakeupFromIQ).foreach { case (w, w_src) =>
280de111a36Ssinsanction    if (!params.inVfSchd && params.readVfRf && params.hasWakeupFromVf && w_src.bits.params.isVfExeUnit) {
281de111a36Ssinsanction      val noCancel = !LoadShouldCancel(Some(w_src.bits.loadDependency), io.ldCancel)
282de111a36Ssinsanction      w := RegNext(Mux(noCancel, w_src, 0.U.asTypeOf(w)))
283de111a36Ssinsanction      w.bits.loadDependency.zip(w_src.bits.loadDependency).foreach{ case (ld, ld_src) => ld := RegNext(Mux(noCancel, ld_src << 1, 0.U.asTypeOf(ld))) }
284de111a36Ssinsanction    } else {
285de111a36Ssinsanction      w := w_src
286de111a36Ssinsanction    }
287de111a36Ssinsanction  }
2889df83ee5Sxiaofeibao  val wakeupFromIQDelayed = Wire(chiselTypeOf(io.wakeupFromIQDelayed))
2899df83ee5Sxiaofeibao  wakeupFromIQDelayed.zip(io.wakeupFromIQDelayed).foreach { case (w, w_src) =>
2909df83ee5Sxiaofeibao    if (!params.inVfSchd && params.readVfRf && params.hasWakeupFromVf && w_src.bits.params.isVfExeUnit) {
2919df83ee5Sxiaofeibao      val noCancel = !LoadShouldCancel(Some(w_src.bits.loadDependency), io.ldCancel)
2929df83ee5Sxiaofeibao      w := RegNext(Mux(noCancel, w_src, 0.U.asTypeOf(w)))
2939df83ee5Sxiaofeibao      w.bits.loadDependency.zip(w_src.bits.loadDependency).foreach { case (ld, ld_src) => ld := RegNext(Mux(noCancel, ld_src << 1, 0.U.asTypeOf(ld))) }
2949df83ee5Sxiaofeibao    } else {
2959df83ee5Sxiaofeibao      w := w_src
2969df83ee5Sxiaofeibao    }
2979df83ee5Sxiaofeibao  }
298de111a36Ssinsanction
299bf35baadSXuan Hu  /**
3005db4956bSzhanglyGit    * Connection of [[entries]]
301bf35baadSXuan Hu    */
3025db4956bSzhanglyGit  entries.io match { case entriesIO: EntriesIO =>
303aa2bcc31SzhanglyGit    entriesIO.flush                                             := io.flush
304aa2bcc31SzhanglyGit    entriesIO.enq.zipWithIndex.foreach { case (enq, enqIdx) =>
305aa2bcc31SzhanglyGit      enq.valid                                                 := s0_doEnqSelValidVec(enqIdx)
306aa2bcc31SzhanglyGit      enq.bits.status.robIdx                                    := s0_enqBits(enqIdx).robIdx
307aa2bcc31SzhanglyGit      enq.bits.status.fuType                                    := IQFuType.readFuType(VecInit(s0_enqBits(enqIdx).fuType.asBools), params.getFuCfgs.map(_.fuType))
308aa2bcc31SzhanglyGit      val numLsrc = s0_enqBits(enqIdx).srcType.size.min(enq.bits.status.srcStatus.map(_.srcType).size)
3095db4956bSzhanglyGit      for(j <- 0 until numLsrc) {
310aa2bcc31SzhanglyGit        enq.bits.status.srcStatus(j).psrc                       := s0_enqBits(enqIdx).psrc(j)
311aa2bcc31SzhanglyGit        enq.bits.status.srcStatus(j).srcType                    := s0_enqBits(enqIdx).srcType(j)
312b38000bfSsinsanction        enq.bits.status.srcStatus(j).srcState                   := (if (j < 3) {
313ee8d1f1bSsinsanction                                                                      Mux(SrcType.isVp(s0_enqBits(enqIdx).srcType(j)) && (s0_enqBits(enqIdx).psrc(j) === 0.U),
314b38000bfSsinsanction                                                                          SrcState.rdy,
31591f31488Sxiaofeibao-xjtu                                                                          s0_enqBits(enqIdx).srcState(j))
316b38000bfSsinsanction                                                                    } else {
31791f31488Sxiaofeibao-xjtu                                                                      s0_enqBits(enqIdx).srcState(j)
318b38000bfSsinsanction                                                                    })
319b38000bfSsinsanction        enq.bits.status.srcStatus(j).dataSources.value          := (if (j < 3) {
320b38000bfSsinsanction                                                                      MuxCase(DataSource.reg, Seq(
321b38000bfSsinsanction                                                                        (SrcType.isXp(s0_enqBits(enqIdx).srcType(j)) && (s0_enqBits(enqIdx).psrc(j) === 0.U)) -> DataSource.zero,
322b38000bfSsinsanction                                                                        SrcType.isNotReg(s0_enqBits(enqIdx).srcType(j))                                       -> DataSource.imm,
323ee8d1f1bSsinsanction                                                                        (SrcType.isVp(s0_enqBits(enqIdx).srcType(j)) && (s0_enqBits(enqIdx).psrc(j) === 0.U)) -> DataSource.v0,
324b38000bfSsinsanction                                                                      ))
325b38000bfSsinsanction                                                                    } else {
326b38000bfSsinsanction                                                                      MuxCase(DataSource.reg, Seq(
327b38000bfSsinsanction                                                                        SrcType.isNotReg(s0_enqBits(enqIdx).srcType(j))  -> DataSource.imm,
328b38000bfSsinsanction                                                                      ))
329b38000bfSsinsanction                                                                    })
330ec49b127Ssinsanction        enq.bits.status.srcStatus(j).srcLoadDependency          := VecInit(s0_enqBits(enqIdx).srcLoadDependency(j).map(x => x << 1))
331f57d73d6Ssinsanction        enq.bits.status.srcStatus(j).exuSources.foreach(_       := 0.U.asTypeOf(ExuSource()))
332955b4beaSsinsanction        enq.bits.status.srcStatus(j).useRegCache.foreach(_      := s0_enqBits(enqIdx).useRegCache(j))
333955b4beaSsinsanction        enq.bits.status.srcStatus(j).regCacheIdx.foreach(_      := s0_enqBits(enqIdx).regCacheIdx(j))
334aa2bcc31SzhanglyGit      }
335aa2bcc31SzhanglyGit      enq.bits.status.blocked                                   := false.B
3365db4956bSzhanglyGit      enq.bits.status.issued                                    := false.B
3375db4956bSzhanglyGit      enq.bits.status.firstIssue                                := false.B
338c38df446SzhanglyGit      enq.bits.status.issueTimer                                := "b11".U
339aa2bcc31SzhanglyGit      enq.bits.status.deqPortIdx                                := 0.U
340aa2bcc31SzhanglyGit      enq.bits.imm.foreach(_                                    := s0_enqBits(enqIdx).imm)
341aa2bcc31SzhanglyGit      enq.bits.payload                                          := s0_enqBits(enqIdx)
342730cfbc0SXuan Hu    }
3435db4956bSzhanglyGit    entriesIO.og0Resp.zipWithIndex.foreach { case (og0Resp, i) =>
344f08a822fSzhanglyGit      og0Resp                                                   := io.og0Resp(i)
345730cfbc0SXuan Hu    }
3465db4956bSzhanglyGit    entriesIO.og1Resp.zipWithIndex.foreach { case (og1Resp, i) =>
347f08a822fSzhanglyGit      og1Resp                                                   := io.og1Resp(i)
348730cfbc0SXuan Hu    }
34942b6cdf9Ssinsanction    if (params.needOg2Resp) {
350c38df446SzhanglyGit      entriesIO.og2Resp.get.zipWithIndex.foreach { case (og2Resp, i) =>
351c38df446SzhanglyGit        og2Resp                                                 := io.og2Resp.get(i)
352c38df446SzhanglyGit      }
353c38df446SzhanglyGit    }
354e07131b2Ssinsanction    if (params.isLdAddrIQ || params.isHyAddrIQ) {
355e07131b2Ssinsanction      entriesIO.fromLoad.get.finalIssueResp.zipWithIndex.foreach { case (finalIssueResp, i) =>
3560f55a0d3SHaojin Tang        finalIssueResp                                          := io.finalIssueResp.get(i)
357e07131b2Ssinsanction      }
358e07131b2Ssinsanction      entriesIO.fromLoad.get.memAddrIssueResp.zipWithIndex.foreach { case (memAddrIssueResp, i) =>
3596462eb1cSzhanglyGit        memAddrIssueResp                                        := io.memAddrIssueResp.get(i)
360e07131b2Ssinsanction      }
361e07131b2Ssinsanction    }
3627e471bf8SXuan Hu    if (params.isVecLduIQ) {
3633bba894fSxiaofeibao      entriesIO.vecLdIn.get.finalIssueResp.zipWithIndex.foreach { case (resp, i) =>
3643bba894fSxiaofeibao        resp := io.finalIssueResp.get(i)
3653bba894fSxiaofeibao      }
3667e471bf8SXuan Hu      entriesIO.vecLdIn.get.resp.zipWithIndex.foreach { case (resp, i) =>
3677e471bf8SXuan Hu        resp                                                    := io.vecLoadIssueResp.get(i)
3687e471bf8SXuan Hu      }
3697e471bf8SXuan Hu    }
370aa2bcc31SzhanglyGit    for(deqIdx <- 0 until params.numDeq) {
371aa2bcc31SzhanglyGit      entriesIO.deqReady(deqIdx)                                := deqBeforeDly(deqIdx).ready
372aa2bcc31SzhanglyGit      entriesIO.deqSelOH(deqIdx).valid                          := deqSelValidVec(deqIdx)
373aa2bcc31SzhanglyGit      entriesIO.deqSelOH(deqIdx).bits                           := deqSelOHVec(deqIdx)
374aa2bcc31SzhanglyGit      entriesIO.enqEntryOldestSel(deqIdx)                       := enqEntryOldestSel(deqIdx)
37528607074Ssinsanction      entriesIO.simpEntryOldestSel.foreach(_(deqIdx)            := simpEntryOldestSel.get(deqIdx))
37628607074Ssinsanction      entriesIO.compEntryOldestSel.foreach(_(deqIdx)            := compEntryOldestSel.get(deqIdx))
37728607074Ssinsanction      entriesIO.othersEntryOldestSel.foreach(_(deqIdx)          := othersEntryOldestSel(deqIdx))
378aa2bcc31SzhanglyGit      entriesIO.subDeqRequest.foreach(_(deqIdx)                 := subDeqRequest.get)
379aa2bcc31SzhanglyGit      entriesIO.subDeqSelOH.foreach(_(deqIdx)                   := subDeqSelOHVec.get(deqIdx))
380aa2bcc31SzhanglyGit    }
381aa2bcc31SzhanglyGit    entriesIO.wakeUpFromWB                                      := io.wakeupFromWB
382de111a36Ssinsanction    entriesIO.wakeUpFromIQ                                      := wakeupFromIQ
3839df83ee5Sxiaofeibao    entriesIO.wakeUpFromWBDelayed                               := io.wakeupFromWBDelayed
3849df83ee5Sxiaofeibao    entriesIO.wakeUpFromIQDelayed                               := wakeupFromIQDelayed
385d88d4328SZiyue Zhang    entriesIO.vlFromIntIsZero                                   := io.vlFromIntIsZero
386d88d4328SZiyue Zhang    entriesIO.vlFromIntIsVlmax                                  := io.vlFromIntIsVlmax
387d88d4328SZiyue Zhang    entriesIO.vlFromVfIsZero                                    := io.vlFromVfIsZero
388d88d4328SZiyue Zhang    entriesIO.vlFromVfIsVlmax                                   := io.vlFromVfIsVlmax
389aa2bcc31SzhanglyGit    entriesIO.og0Cancel                                         := io.og0Cancel
390aa2bcc31SzhanglyGit    entriesIO.og1Cancel                                         := io.og1Cancel
391aa2bcc31SzhanglyGit    entriesIO.ldCancel                                          := io.ldCancel
39228607074Ssinsanction    entriesIO.simpEntryDeqSelVec.foreach(_                      := VecInit(simpEntryOldestSel.get.takeRight(params.numEnq).map(_.bits)))
393aa2bcc31SzhanglyGit    //output
394aa2bcc31SzhanglyGit    fuTypeVec                                                   := entriesIO.fuType
395aa2bcc31SzhanglyGit    deqEntryVec                                                 := entriesIO.deqEntry
396aa2bcc31SzhanglyGit    cancelDeqVec                                                := entriesIO.cancelDeqVec
39728607074Ssinsanction    simpEntryEnqSelVec.foreach(_                                := entriesIO.simpEntryEnqSelVec.get)
39828607074Ssinsanction    compEntryEnqSelVec.foreach(_                                := entriesIO.compEntryEnqSelVec.get)
39928607074Ssinsanction    othersEntryEnqSelVec.foreach(_                              := entriesIO.othersEntryEnqSelVec.get)
400730cfbc0SXuan Hu  }
401730cfbc0SXuan Hu
402730cfbc0SXuan Hu
4035db4956bSzhanglyGit  s0_enqSelValidVec := s0_enqValidVec.zip(io.enq).map{ case (enqValid, enq) => enqValid && enq.ready}
404730cfbc0SXuan Hu
4055db4956bSzhanglyGit  protected val commonAccept: UInt = Cat(fuTypeVec.map(fuType =>
40666e57d91Ssinsanction    FuType.FuTypeOrR(fuType, commonFuCfgs.map(_.fuType))
407730cfbc0SXuan Hu  ).reverse)
408730cfbc0SXuan Hu
409730cfbc0SXuan Hu  // if deq port can accept the uop
410730cfbc0SXuan Hu  protected val canAcceptVec: Seq[UInt] = deqFuCfgs.map { fuCfgs: Seq[FuConfig] =>
41166e57d91Ssinsanction    Cat(fuTypeVec.map(fuType =>
41266e57d91Ssinsanction      FuType.FuTypeOrR(fuType, fuCfgs.map(_.fuType))
41366e57d91Ssinsanction    ).reverse)
414730cfbc0SXuan Hu  }
415730cfbc0SXuan Hu
416730cfbc0SXuan Hu  protected val deqCanAcceptVec: Seq[IndexedSeq[Bool]] = deqFuCfgs.map { fuCfgs: Seq[FuConfig] =>
4175db4956bSzhanglyGit    fuTypeVec.map(fuType =>
418cf4a131aSsinsanction      FuType.FuTypeOrR(fuType, fuCfgs.map(_.fuType)))
419730cfbc0SXuan Hu  }
420730cfbc0SXuan Hu
42140283787Ssinsanction  canIssueMergeAllBusy.zipWithIndex.foreach { case (merge, i) =>
42240283787Ssinsanction    val mergeFuBusy = {
42340283787Ssinsanction      if (fuBusyTableWrite(i).nonEmpty) canIssueVec.asUInt & (~fuBusyTableMask(i))
42440283787Ssinsanction      else canIssueVec.asUInt
42540283787Ssinsanction    }
42640283787Ssinsanction    val mergeIntWbBusy = {
42740283787Ssinsanction      if (intWbBusyTableRead(i).nonEmpty) mergeFuBusy & (~intWbBusyTableMask(i))
42840283787Ssinsanction      else mergeFuBusy
42940283787Ssinsanction    }
43060f0c5aeSxiaofeibao    val mergefpWbBusy = {
43160f0c5aeSxiaofeibao      if (fpWbBusyTableRead(i).nonEmpty) mergeIntWbBusy & (~fpWbBusyTableMask(i))
43240283787Ssinsanction      else mergeIntWbBusy
43340283787Ssinsanction    }
43460f0c5aeSxiaofeibao    val mergeVfWbBusy = {
43560f0c5aeSxiaofeibao      if (vfWbBusyTableRead(i).nonEmpty) mergefpWbBusy & (~vfWbBusyTableMask(i))
43660f0c5aeSxiaofeibao      else mergefpWbBusy
43760f0c5aeSxiaofeibao    }
4388dd32220Ssinsanction    val mergeV0WbBusy = {
4398dd32220Ssinsanction      if (v0WbBusyTableRead(i).nonEmpty) mergeVfWbBusy & (~v0WbBusyTableMask(i))
4408dd32220Ssinsanction      else mergeVfWbBusy
4418dd32220Ssinsanction    }
4428dd32220Ssinsanction    val mergeVlWbBusy = {
4438dd32220Ssinsanction      if (vlWbBusyTableRead(i).nonEmpty) mergeV0WbBusy & (~vlWbBusyTableMask(i))
4448dd32220Ssinsanction      else  mergeV0WbBusy
4458dd32220Ssinsanction    }
4468dd32220Ssinsanction    merge := mergeVlWbBusy
44740283787Ssinsanction  }
44840283787Ssinsanction
449cf4a131aSsinsanction  deqCanIssue.zipWithIndex.foreach { case (req, i) =>
450cf4a131aSsinsanction    req := canIssueMergeAllBusy(i) & VecInit(deqCanAcceptVec(i)).asUInt
451730cfbc0SXuan Hu  }
452aa2bcc31SzhanglyGit  dontTouch(fuTypeVec)
453aa2bcc31SzhanglyGit  dontTouch(canIssueMergeAllBusy)
454aa2bcc31SzhanglyGit  dontTouch(deqCanIssue)
455730cfbc0SXuan Hu
456f7f73727Ssinsanction  if (params.numDeq == 2) {
457f7f73727Ssinsanction    require(params.deqFuSame || params.deqFuDiff, "The 2 deq ports need to be identical or completely different")
458f7f73727Ssinsanction  }
459f7f73727Ssinsanction
460f7f73727Ssinsanction  if (params.numDeq == 2 && params.deqFuSame) {
46128607074Ssinsanction    val subDeqPolicy = Module(new DeqPolicy())
46228607074Ssinsanction
463cf4a131aSsinsanction    enqEntryOldestSel := DontCare
464f7f73727Ssinsanction
46528607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
466f7f73727Ssinsanction      othersEntryOldestSel(0) := AgeDetector(numEntries = params.numEntries - params.numEnq,
46728607074Ssinsanction        enq = othersEntryEnqSelVec.get,
468f7f73727Ssinsanction        canIssue = canIssueVec.asUInt(params.numEntries-1, params.numEnq)
469f7f73727Ssinsanction      )
470f7f73727Ssinsanction      othersEntryOldestSel(1) := DontCare
471f7f73727Ssinsanction
472cf4a131aSsinsanction      subDeqPolicy.io.request := subDeqRequest.get
473cf4a131aSsinsanction      subDeqSelValidVec.get := subDeqPolicy.io.deqSelOHVec.map(oh => oh.valid)
474cf4a131aSsinsanction      subDeqSelOHVec.get := subDeqPolicy.io.deqSelOHVec.map(oh => oh.bits)
47528607074Ssinsanction    }
47628607074Ssinsanction    else {
47728607074Ssinsanction      simpAgeDetectRequest.get(0) := canIssueVec.asUInt(params.numEnq + params.numSimp - 1, params.numEnq)
47828607074Ssinsanction      simpAgeDetectRequest.get(1) := DontCare
479c0beb497Sxiaofeibao      simpAgeDetectRequest.get(params.numDeq) := VecInit(requestForTrans.drop(params.numEnq).take(params.numSimp)).asUInt
48028607074Ssinsanction      if (params.numEnq == 2) {
481c0beb497Sxiaofeibao        simpAgeDetectRequest.get(params.numDeq + 1) := VecInit(requestForTrans.drop(params.numEnq).take(params.numSimp)).asUInt & ~simpEntryOldestSel.get(params.numDeq).bits
48228607074Ssinsanction      }
48328607074Ssinsanction
48428607074Ssinsanction      simpEntryOldestSel.get := AgeDetector(numEntries = params.numSimp,
48528607074Ssinsanction        enq = simpEntryEnqSelVec.get,
48628607074Ssinsanction        canIssue = simpAgeDetectRequest.get
48728607074Ssinsanction      )
48828607074Ssinsanction
48928607074Ssinsanction      compEntryOldestSel.get(0) := AgeDetector(numEntries = params.numComp,
49028607074Ssinsanction        enq = compEntryEnqSelVec.get,
49128607074Ssinsanction        canIssue = canIssueVec.asUInt(params.numEntries - 1, params.numEnq + params.numSimp)
49228607074Ssinsanction      )
49328607074Ssinsanction      compEntryOldestSel.get(1) := DontCare
49428607074Ssinsanction
49528607074Ssinsanction      othersEntryOldestSel(0).valid := compEntryOldestSel.get(0).valid || simpEntryOldestSel.get(0).valid
49628607074Ssinsanction      othersEntryOldestSel(0).bits := Cat(
49728607074Ssinsanction        compEntryOldestSel.get(0).bits,
49828607074Ssinsanction        Fill(params.numSimp, !compEntryOldestSel.get(0).valid) & simpEntryOldestSel.get(0).bits,
49928607074Ssinsanction      )
50028607074Ssinsanction      othersEntryOldestSel(1) := DontCare
50128607074Ssinsanction
50228607074Ssinsanction      subDeqPolicy.io.request := Reverse(subDeqRequest.get)
50328607074Ssinsanction      subDeqSelValidVec.get := subDeqPolicy.io.deqSelOHVec.map(oh => oh.valid)
50428607074Ssinsanction      subDeqSelOHVec.get := subDeqPolicy.io.deqSelOHVec.map(oh => Reverse(oh.bits))
50528607074Ssinsanction    }
50628607074Ssinsanction
50728607074Ssinsanction    subDeqRequest.get := canIssueVec.asUInt & ~Cat(othersEntryOldestSel(0).bits, 0.U((params.numEnq).W))
508f7f73727Ssinsanction
5095a6da888Ssinsanction    deqSelValidVec(0) := othersEntryOldestSel(0).valid || subDeqSelValidVec.get(1)
5105a6da888Ssinsanction    deqSelValidVec(1) := subDeqSelValidVec.get(0)
511cf4a131aSsinsanction    deqSelOHVec(0) := Mux(othersEntryOldestSel(0).valid,
512cf4a131aSsinsanction                          Cat(othersEntryOldestSel(0).bits, 0.U((params.numEnq).W)),
5135a6da888Ssinsanction                          subDeqSelOHVec.get(1)) & canIssueMergeAllBusy(0)
5145a6da888Ssinsanction    deqSelOHVec(1) := subDeqSelOHVec.get(0) & canIssueMergeAllBusy(1)
515f7f73727Ssinsanction
516f7f73727Ssinsanction    finalDeqSelValidVec.zip(finalDeqSelOHVec).zip(deqSelValidVec).zip(deqSelOHVec).zipWithIndex.foreach { case ((((selValid, selOH), deqValid), deqOH), i) =>
517f43491c5Sxiaofeibao      selValid := deqValid && deqOH.orR
518f7f73727Ssinsanction      selOH := deqOH
519f7f73727Ssinsanction    }
520f7f73727Ssinsanction  }
521f7f73727Ssinsanction  else {
522527eefbdSsinsanction    enqEntryOldestSel := NewAgeDetector(numEntries = params.numEnq,
523527eefbdSsinsanction      enq = VecInit(s0_doEnqSelValidVec),
524527eefbdSsinsanction      canIssue = VecInit(deqCanIssue.map(_(params.numEnq - 1, 0)))
5255db4956bSzhanglyGit    )
5268db72c71Sfdy
52728607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
528527eefbdSsinsanction      othersEntryOldestSel := AgeDetector(numEntries = params.numEntries - params.numEnq,
52928607074Ssinsanction        enq = othersEntryEnqSelVec.get,
530527eefbdSsinsanction        canIssue = VecInit(deqCanIssue.map(_(params.numEntries - 1, params.numEnq)))
5315db4956bSzhanglyGit      )
5325db4956bSzhanglyGit
533ea159d42Ssinsanction      deqSelValidVec.zip(deqSelOHVec).zipWithIndex.foreach { case ((selValid, selOH), i) =>
534f7f73727Ssinsanction        if (params.exuBlockParams(i).fuConfigs.contains(FuConfig.FakeHystaCfg)) {
535f7f73727Ssinsanction          selValid := false.B
536f7f73727Ssinsanction          selOH := 0.U.asTypeOf(selOH)
537f7f73727Ssinsanction        } else {
538cf4a131aSsinsanction          selValid := othersEntryOldestSel(i).valid || enqEntryOldestSel(i).valid
53928607074Ssinsanction          selOH := Cat(othersEntryOldestSel(i).bits, Fill(params.numEnq, !othersEntryOldestSel(i).valid) & enqEntryOldestSel(i).bits)
54028607074Ssinsanction        }
54128607074Ssinsanction      }
54228607074Ssinsanction    }
54328607074Ssinsanction    else {
54428607074Ssinsanction      othersEntryOldestSel := DontCare
54528607074Ssinsanction
54628607074Ssinsanction      deqCanIssue.zipWithIndex.foreach { case (req, i) =>
54728607074Ssinsanction        simpAgeDetectRequest.get(i) := req(params.numEnq + params.numSimp - 1, params.numEnq)
54828607074Ssinsanction      }
549c0beb497Sxiaofeibao      simpAgeDetectRequest.get(params.numDeq) := VecInit(requestForTrans.drop(params.numEnq).take(params.numSimp)).asUInt
55028607074Ssinsanction      if (params.numEnq == 2) {
551c0beb497Sxiaofeibao        simpAgeDetectRequest.get(params.numDeq + 1) := VecInit(requestForTrans.drop(params.numEnq).take(params.numSimp)).asUInt & ~simpEntryOldestSel.get(params.numDeq).bits
55228607074Ssinsanction      }
55328607074Ssinsanction
55428607074Ssinsanction      simpEntryOldestSel.get := AgeDetector(numEntries = params.numSimp,
55528607074Ssinsanction        enq = simpEntryEnqSelVec.get,
55628607074Ssinsanction        canIssue = simpAgeDetectRequest.get
55728607074Ssinsanction      )
55828607074Ssinsanction
55928607074Ssinsanction      compEntryOldestSel.get := AgeDetector(numEntries = params.numComp,
56028607074Ssinsanction        enq = compEntryEnqSelVec.get,
56128607074Ssinsanction        canIssue = VecInit(deqCanIssue.map(_(params.numEntries - 1, params.numEnq + params.numSimp)))
56228607074Ssinsanction      )
56328607074Ssinsanction
56428607074Ssinsanction      deqSelValidVec.zip(deqSelOHVec).zipWithIndex.foreach { case ((selValid, selOH), i) =>
5655c1f97ccSsinsanction        if (params.exuBlockParams(i).fuConfigs.contains(FuConfig.FakeHystaCfg)) {
5665c1f97ccSsinsanction          selValid := false.B
5675c1f97ccSsinsanction          selOH := 0.U.asTypeOf(selOH)
5685c1f97ccSsinsanction        } else {
56928607074Ssinsanction          selValid := compEntryOldestSel.get(i).valid || simpEntryOldestSel.get(i).valid || enqEntryOldestSel(i).valid
57028607074Ssinsanction          selOH := Cat(
57128607074Ssinsanction            compEntryOldestSel.get(i).bits,
57228607074Ssinsanction            Fill(params.numSimp, !compEntryOldestSel.get(i).valid) & simpEntryOldestSel.get(i).bits,
57328607074Ssinsanction            Fill(params.numEnq, !compEntryOldestSel.get(i).valid && !simpEntryOldestSel.get(i).valid) & enqEntryOldestSel(i).bits
57428607074Ssinsanction          )
575f7f73727Ssinsanction        }
576730cfbc0SXuan Hu      }
5775c1f97ccSsinsanction    }
578ea159d42Ssinsanction
579ea159d42Ssinsanction    finalDeqSelValidVec.zip(finalDeqSelOHVec).zip(deqSelValidVec).zip(deqSelOHVec).zipWithIndex.foreach { case ((((selValid, selOH), deqValid), deqOH), i) =>
580f43491c5Sxiaofeibao      selValid := deqValid
581ea159d42Ssinsanction      selOH := deqOH
582ea159d42Ssinsanction    }
583ea159d42Ssinsanction  }
584ea159d42Ssinsanction
585ea159d42Ssinsanction  val toBusyTableDeqResp = Wire(Vec(params.numDeq, ValidIO(new IssueQueueDeqRespBundle)))
586ea159d42Ssinsanction
587ea159d42Ssinsanction  toBusyTableDeqResp.zipWithIndex.foreach { case (deqResp, i) =>
588adebecf3Sxiaofeibao    deqResp.valid := deqBeforeDly(i).valid
589f08a822fSzhanglyGit    deqResp.bits.resp   := RespType.success
590ea159d42Ssinsanction    deqResp.bits.robIdx := DontCare
59138f78b5dSxiaofeibao-xjtu    deqResp.bits.sqIdx.foreach(_ := DontCare)
59228ac1c16Sxiaofeibao-xjtu    deqResp.bits.lqIdx.foreach(_ := DontCare)
593fb445e8dSzhanglyGit    deqResp.bits.fuType := deqBeforeDly(i).bits.common.fuType
594aa2bcc31SzhanglyGit    deqResp.bits.uopIdx.foreach(_ := DontCare)
595d1bb5687SHaojin Tang  }
596730cfbc0SXuan Hu
597de93b508SzhanglyGit  //fuBusyTable
5985db4956bSzhanglyGit  fuBusyTableWrite.zip(fuBusyTableRead).zipWithIndex.foreach { case ((busyTableWrite: Option[FuBusyTableWrite], busyTableRead: Option[FuBusyTableRead]), i) =>
599de93b508SzhanglyGit    if(busyTableWrite.nonEmpty) {
600de93b508SzhanglyGit      val btwr = busyTableWrite.get
601de93b508SzhanglyGit      val btrd = busyTableRead.get
602ea159d42Ssinsanction      btwr.io.in.deqResp := toBusyTableDeqResp(i)
603dd970561SzhanglyGit      btwr.io.in.og0Resp := io.og0Resp(i)
604dd970561SzhanglyGit      btwr.io.in.og1Resp := io.og1Resp(i)
605de93b508SzhanglyGit      btrd.io.in.fuBusyTable := btwr.io.out.fuBusyTable
6065db4956bSzhanglyGit      btrd.io.in.fuTypeRegVec := fuTypeVec
607de93b508SzhanglyGit      fuBusyTableMask(i) := btrd.io.out.fuBusyTableMask
608ea0f92d8Sczw    }
609de93b508SzhanglyGit    else {
6108d29ec32Sczw      fuBusyTableMask(i) := 0.U(params.numEntries.W)
611ea0f92d8Sczw    }
6122e0a7dc5Sfdy  }
6132e0a7dc5Sfdy
614dd970561SzhanglyGit  //wbfuBusyTable write
6155db4956bSzhanglyGit  intWbBusyTableWrite.zip(intWbBusyTableOut).zip(intDeqRespSetOut).zipWithIndex.foreach { case (((busyTableWrite: Option[FuBusyTableWrite], busyTable: Option[UInt]), deqResp), i) =>
616dd970561SzhanglyGit    if(busyTableWrite.nonEmpty) {
617dd970561SzhanglyGit      val btwr = busyTableWrite.get
618dd970561SzhanglyGit      val bt = busyTable.get
619dd970561SzhanglyGit      val dq = deqResp.get
620ea159d42Ssinsanction      btwr.io.in.deqResp := toBusyTableDeqResp(i)
62178a6e809Sxiaofeibao-xjtu      btwr.io.in.deqResp.valid := toBusyTableDeqResp(i).valid && deqBeforeDly(i).bits.common.rfWen.getOrElse(false.B)
622dd970561SzhanglyGit      btwr.io.in.og0Resp := io.og0Resp(i)
623dd970561SzhanglyGit      btwr.io.in.og1Resp := io.og1Resp(i)
624dd970561SzhanglyGit      bt := btwr.io.out.fuBusyTable
625dd970561SzhanglyGit      dq := btwr.io.out.deqRespSet
626dd970561SzhanglyGit    }
627dd970561SzhanglyGit  }
628dd970561SzhanglyGit
62960f0c5aeSxiaofeibao  fpWbBusyTableWrite.zip(fpWbBusyTableOut).zip(fpDeqRespSetOut).zipWithIndex.foreach { case (((busyTableWrite: Option[FuBusyTableWrite], busyTable: Option[UInt]), deqResp), i) =>
63060f0c5aeSxiaofeibao    if (busyTableWrite.nonEmpty) {
63160f0c5aeSxiaofeibao      val btwr = busyTableWrite.get
63260f0c5aeSxiaofeibao      val bt = busyTable.get
63360f0c5aeSxiaofeibao      val dq = deqResp.get
63460f0c5aeSxiaofeibao      btwr.io.in.deqResp := toBusyTableDeqResp(i)
63578a6e809Sxiaofeibao-xjtu      btwr.io.in.deqResp.valid := toBusyTableDeqResp(i).valid && deqBeforeDly(i).bits.common.fpWen.getOrElse(false.B)
63660f0c5aeSxiaofeibao      btwr.io.in.og0Resp := io.og0Resp(i)
63760f0c5aeSxiaofeibao      btwr.io.in.og1Resp := io.og1Resp(i)
63860f0c5aeSxiaofeibao      bt := btwr.io.out.fuBusyTable
63960f0c5aeSxiaofeibao      dq := btwr.io.out.deqRespSet
64060f0c5aeSxiaofeibao    }
64160f0c5aeSxiaofeibao  }
64260f0c5aeSxiaofeibao
6435db4956bSzhanglyGit  vfWbBusyTableWrite.zip(vfWbBusyTableOut).zip(vfDeqRespSetOut).zipWithIndex.foreach { case (((busyTableWrite: Option[FuBusyTableWrite], busyTable: Option[UInt]), deqResp), i) =>
644dd970561SzhanglyGit    if (busyTableWrite.nonEmpty) {
645dd970561SzhanglyGit      val btwr = busyTableWrite.get
646dd970561SzhanglyGit      val bt = busyTable.get
647dd970561SzhanglyGit      val dq = deqResp.get
648ea159d42Ssinsanction      btwr.io.in.deqResp := toBusyTableDeqResp(i)
64978a6e809Sxiaofeibao-xjtu      btwr.io.in.deqResp.valid := toBusyTableDeqResp(i).valid && deqBeforeDly(i).bits.common.vecWen.getOrElse(false.B)
650dd970561SzhanglyGit      btwr.io.in.og0Resp := io.og0Resp(i)
651dd970561SzhanglyGit      btwr.io.in.og1Resp := io.og1Resp(i)
652dd970561SzhanglyGit      bt := btwr.io.out.fuBusyTable
653dd970561SzhanglyGit      dq := btwr.io.out.deqRespSet
654dd970561SzhanglyGit    }
655dd970561SzhanglyGit  }
656dd970561SzhanglyGit
6578dd32220Ssinsanction  v0WbBusyTableWrite.zip(v0WbBusyTableOut).zip(v0DeqRespSetOut).zipWithIndex.foreach { case (((busyTableWrite: Option[FuBusyTableWrite], busyTable: Option[UInt]), deqResp), i) =>
6588dd32220Ssinsanction    if (busyTableWrite.nonEmpty) {
6598dd32220Ssinsanction      val btwr = busyTableWrite.get
6608dd32220Ssinsanction      val bt = busyTable.get
6618dd32220Ssinsanction      val dq = deqResp.get
6628dd32220Ssinsanction      btwr.io.in.deqResp := toBusyTableDeqResp(i)
66378a6e809Sxiaofeibao-xjtu      btwr.io.in.deqResp.valid := toBusyTableDeqResp(i).valid && deqBeforeDly(i).bits.common.v0Wen.getOrElse(false.B)
6648dd32220Ssinsanction      btwr.io.in.og0Resp := io.og0Resp(i)
6658dd32220Ssinsanction      btwr.io.in.og1Resp := io.og1Resp(i)
6668dd32220Ssinsanction      bt := btwr.io.out.fuBusyTable
6678dd32220Ssinsanction      dq := btwr.io.out.deqRespSet
6688dd32220Ssinsanction    }
6698dd32220Ssinsanction  }
6708dd32220Ssinsanction
6718dd32220Ssinsanction  vlWbBusyTableWrite.zip(vlWbBusyTableOut).zip(vlDeqRespSetOut).zipWithIndex.foreach { case (((busyTableWrite: Option[FuBusyTableWrite], busyTable: Option[UInt]), deqResp), i) =>
6728dd32220Ssinsanction    if (busyTableWrite.nonEmpty) {
6738dd32220Ssinsanction      val btwr = busyTableWrite.get
6748dd32220Ssinsanction      val bt = busyTable.get
6758dd32220Ssinsanction      val dq = deqResp.get
6768dd32220Ssinsanction      btwr.io.in.deqResp := toBusyTableDeqResp(i)
67778a6e809Sxiaofeibao-xjtu      btwr.io.in.deqResp.valid := toBusyTableDeqResp(i).valid && deqBeforeDly(i).bits.common.vlWen.getOrElse(false.B)
6788dd32220Ssinsanction      btwr.io.in.og0Resp := io.og0Resp(i)
6798dd32220Ssinsanction      btwr.io.in.og1Resp := io.og1Resp(i)
6808dd32220Ssinsanction      bt := btwr.io.out.fuBusyTable
6818dd32220Ssinsanction      dq := btwr.io.out.deqRespSet
6828dd32220Ssinsanction    }
6838dd32220Ssinsanction  }
6848dd32220Ssinsanction
685de93b508SzhanglyGit  //wbfuBusyTable read
6865db4956bSzhanglyGit  intWbBusyTableRead.zip(intWbBusyTableIn).zipWithIndex.foreach { case ((busyTableRead: Option[FuBusyTableRead], busyTable: Option[UInt]), i) =>
687de93b508SzhanglyGit    if(busyTableRead.nonEmpty) {
688de93b508SzhanglyGit      val btrd = busyTableRead.get
689de93b508SzhanglyGit      val bt = busyTable.get
690de93b508SzhanglyGit      btrd.io.in.fuBusyTable := bt
6915db4956bSzhanglyGit      btrd.io.in.fuTypeRegVec := fuTypeVec
692de93b508SzhanglyGit      intWbBusyTableMask(i) := btrd.io.out.fuBusyTableMask
693de93b508SzhanglyGit    }
694de93b508SzhanglyGit    else {
695de93b508SzhanglyGit      intWbBusyTableMask(i) := 0.U(params.numEntries.W)
696de93b508SzhanglyGit    }
697de93b508SzhanglyGit  }
69860f0c5aeSxiaofeibao  fpWbBusyTableRead.zip(fpWbBusyTableIn).zipWithIndex.foreach { case ((busyTableRead: Option[FuBusyTableRead], busyTable: Option[UInt]), i) =>
69960f0c5aeSxiaofeibao    if (busyTableRead.nonEmpty) {
70060f0c5aeSxiaofeibao      val btrd = busyTableRead.get
70160f0c5aeSxiaofeibao      val bt = busyTable.get
70260f0c5aeSxiaofeibao      btrd.io.in.fuBusyTable := bt
70360f0c5aeSxiaofeibao      btrd.io.in.fuTypeRegVec := fuTypeVec
70460f0c5aeSxiaofeibao      fpWbBusyTableMask(i) := btrd.io.out.fuBusyTableMask
70560f0c5aeSxiaofeibao    }
70660f0c5aeSxiaofeibao    else {
70760f0c5aeSxiaofeibao      fpWbBusyTableMask(i) := 0.U(params.numEntries.W)
70860f0c5aeSxiaofeibao    }
70960f0c5aeSxiaofeibao  }
7105db4956bSzhanglyGit  vfWbBusyTableRead.zip(vfWbBusyTableIn).zipWithIndex.foreach { case ((busyTableRead: Option[FuBusyTableRead], busyTable: Option[UInt]), i) =>
711de93b508SzhanglyGit    if (busyTableRead.nonEmpty) {
712de93b508SzhanglyGit      val btrd = busyTableRead.get
713de93b508SzhanglyGit      val bt = busyTable.get
714de93b508SzhanglyGit      btrd.io.in.fuBusyTable := bt
7155db4956bSzhanglyGit      btrd.io.in.fuTypeRegVec := fuTypeVec
716de93b508SzhanglyGit      vfWbBusyTableMask(i) := btrd.io.out.fuBusyTableMask
717de93b508SzhanglyGit    }
718de93b508SzhanglyGit    else {
719de93b508SzhanglyGit      vfWbBusyTableMask(i) := 0.U(params.numEntries.W)
720de93b508SzhanglyGit    }
721ea0f92d8Sczw  }
7228dd32220Ssinsanction  v0WbBusyTableRead.zip(v0WbBusyTableIn).zipWithIndex.foreach { case ((busyTableRead: Option[FuBusyTableRead], busyTable: Option[UInt]), i) =>
7238dd32220Ssinsanction    if (busyTableRead.nonEmpty) {
7248dd32220Ssinsanction      val btrd = busyTableRead.get
7258dd32220Ssinsanction      val bt = busyTable.get
7268dd32220Ssinsanction      btrd.io.in.fuBusyTable := bt
7278dd32220Ssinsanction      btrd.io.in.fuTypeRegVec := fuTypeVec
7288dd32220Ssinsanction      v0WbBusyTableMask(i) := btrd.io.out.fuBusyTableMask
7298dd32220Ssinsanction    }
7308dd32220Ssinsanction    else {
7318dd32220Ssinsanction      v0WbBusyTableMask(i) := 0.U(params.numEntries.W)
7328dd32220Ssinsanction    }
7338dd32220Ssinsanction  }
7348dd32220Ssinsanction  vlWbBusyTableRead.zip(vlWbBusyTableIn).zipWithIndex.foreach { case ((busyTableRead: Option[FuBusyTableRead], busyTable: Option[UInt]), i) =>
7358dd32220Ssinsanction    if (busyTableRead.nonEmpty) {
7368dd32220Ssinsanction      val btrd = busyTableRead.get
7378dd32220Ssinsanction      val bt = busyTable.get
7388dd32220Ssinsanction      btrd.io.in.fuBusyTable := bt
7398dd32220Ssinsanction      btrd.io.in.fuTypeRegVec := fuTypeVec
7408dd32220Ssinsanction      vlWbBusyTableMask(i) := btrd.io.out.fuBusyTableMask
7418dd32220Ssinsanction    }
7428dd32220Ssinsanction    else {
7438dd32220Ssinsanction      vlWbBusyTableMask(i) := 0.U(params.numEntries.W)
7448dd32220Ssinsanction    }
7458dd32220Ssinsanction  }
746ea0f92d8Sczw
747bf35baadSXuan Hu  wakeUpQueues.zipWithIndex.foreach { case (wakeUpQueueOption, i) =>
748bf35baadSXuan Hu    wakeUpQueueOption.foreach {
749bf35baadSXuan Hu      wakeUpQueue =>
750493a9370SHaojin Tang        val flush = Wire(new WakeupQueueFlush)
751493a9370SHaojin Tang        flush.redirect := io.flush
7520f55a0d3SHaojin Tang        flush.ldCancel := io.ldCancel
753f08a822fSzhanglyGit        flush.og0Fail := io.og0Resp(i).valid && RespType.isBlocked(io.og0Resp(i).bits.resp)
754f08a822fSzhanglyGit        flush.og1Fail := io.og1Resp(i).valid && RespType.isBlocked(io.og1Resp(i).bits.resp)
755493a9370SHaojin Tang        wakeUpQueue.io.flush := flush
75628607074Ssinsanction        wakeUpQueue.io.enq.valid := deqBeforeDly(i).valid
7570c7ebb58Sxiaofeibao-xjtu        wakeUpQueue.io.enq.bits.uop :<= deqBeforeDly(i).bits.common
7580c7ebb58Sxiaofeibao-xjtu        wakeUpQueue.io.enq.bits.uop.pdestCopy.foreach(_ := 0.U)
759fb445e8dSzhanglyGit        wakeUpQueue.io.enq.bits.lat := getDeqLat(i, deqBeforeDly(i).bits.common.fuType)
760bf35baadSXuan Hu    }
761bf35baadSXuan Hu  }
762bf35baadSXuan Hu
763fb445e8dSzhanglyGit  deqBeforeDly.zipWithIndex.foreach { case (deq, i) =>
764af4bd265SzhanglyGit    deq.valid                := finalDeqSelValidVec(i) && !cancelDeqVec(i)
765730cfbc0SXuan Hu    deq.bits.addrOH          := finalDeqSelOHVec(i)
766730cfbc0SXuan Hu    deq.bits.common.isFirstIssue := deqFirstIssueVec(i)
767730cfbc0SXuan Hu    deq.bits.common.iqIdx    := OHToUInt(finalDeqSelOHVec(i))
768543f3ac7Ssinsanction    deq.bits.common.fuType   := IQFuType.readFuType(deqEntryVec(i).bits.status.fuType, params.getFuCfgs.map(_.fuType)).asUInt
7695db4956bSzhanglyGit    deq.bits.common.fuOpType := deqEntryVec(i).bits.payload.fuOpType
7705db4956bSzhanglyGit    deq.bits.common.rfWen.foreach(_ := deqEntryVec(i).bits.payload.rfWen)
7715db4956bSzhanglyGit    deq.bits.common.fpWen.foreach(_ := deqEntryVec(i).bits.payload.fpWen)
7725db4956bSzhanglyGit    deq.bits.common.vecWen.foreach(_ := deqEntryVec(i).bits.payload.vecWen)
7738dd32220Ssinsanction    deq.bits.common.v0Wen.foreach(_ := deqEntryVec(i).bits.payload.v0Wen)
7748dd32220Ssinsanction    deq.bits.common.vlWen.foreach(_ := deqEntryVec(i).bits.payload.vlWen)
7755db4956bSzhanglyGit    deq.bits.common.flushPipe.foreach(_ := deqEntryVec(i).bits.payload.flushPipe)
7765db4956bSzhanglyGit    deq.bits.common.pdest := deqEntryVec(i).bits.payload.pdest
77751de4363Ssinsanction    deq.bits.common.robIdx := deqEntryVec(i).bits.status.robIdx
77896aaae3fSsinsanction
77996aaae3fSsinsanction    require(deq.bits.common.dataSources.size <= finalDataSources(i).size)
78096aaae3fSsinsanction    deq.bits.common.dataSources.zip(finalDataSources(i)).foreach { case (sink, source) => sink := source}
781f57d73d6Ssinsanction    deq.bits.common.exuSources.foreach(_.zip(finalExuSources.get(i)).foreach { case (sink, source) => sink := source})
78255cbdb85Ssinsanction    deq.bits.common.srcTimer.foreach(_ := DontCare)
7836c6bfa02Ssinsanction    deq.bits.common.loadDependency.foreach(_.zip(finalLoadDependency(i)).foreach { case (sink, source) => sink := source})
7842fb6a709SHaojin Tang    deq.bits.common.src := DontCare
7859d8d7860SXuan Hu    deq.bits.common.preDecode.foreach(_ := deqEntryVec(i).bits.payload.preDecodeInfo)
7865d2b9cadSXuan Hu
787aa2bcc31SzhanglyGit    deq.bits.rf.zip(deqEntryVec(i).bits.status.srcStatus.map(_.psrc)).zip(deqEntryVec(i).bits.status.srcStatus.map(_.srcType)).foreach { case ((rf, psrc), srcType) =>
78851de4363Ssinsanction      // psrc in status array can be pregIdx of IntRegFile or VfRegFile
78951de4363Ssinsanction      rf.foreach(_.addr := psrc)
79051de4363Ssinsanction      rf.foreach(_.srcType := srcType)
791730cfbc0SXuan Hu    }
792aa2bcc31SzhanglyGit    deq.bits.srcType.zip(deqEntryVec(i).bits.status.srcStatus.map(_.srcType)).foreach { case (sink, source) =>
793730cfbc0SXuan Hu      sink := source
794730cfbc0SXuan Hu    }
7955db4956bSzhanglyGit    deq.bits.immType := deqEntryVec(i).bits.payload.selImm
796520f7dacSsinsanction    deq.bits.common.imm := deqEntryVec(i).bits.imm.getOrElse(0.U)
797a2fa0ad9Sxiaofeibao    deq.bits.common.nextPcOffset.foreach(_ := 0.U)
7984c2a845dSsinsanction    deq.bits.rcIdx.foreach(_ := deqEntryVec(i).bits.status.srcStatus.map(_.regCacheIdx.get))
79996e858baSXuan Hu
80096e858baSXuan Hu    deq.bits.common.perfDebugInfo := deqEntryVec(i).bits.payload.debugInfo
80196e858baSXuan Hu    deq.bits.common.perfDebugInfo.selectTime := GTimer()
80296e858baSXuan Hu    deq.bits.common.perfDebugInfo.issueTime := GTimer() + 1.U
803*1592abd1SYan Xu    deq.bits.common.debug_seqNum := deqEntryVec(i).bits.payload.debug_seqNum
804730cfbc0SXuan Hu  }
8050f55a0d3SHaojin Tang
80652fc0c9fSxiaofeibao-xjtu  val deqDelay = Reg(params.genIssueValidBundle)
80752fc0c9fSxiaofeibao-xjtu  deqDelay.zip(deqBeforeDly).foreach { case (deqDly, deq) =>
80852fc0c9fSxiaofeibao-xjtu    deqDly.valid := deq.valid
80952fc0c9fSxiaofeibao-xjtu    when(validVec.asUInt.orR) {
81052fc0c9fSxiaofeibao-xjtu      deqDly.bits := deq.bits
81152fc0c9fSxiaofeibao-xjtu    }
81252fc0c9fSxiaofeibao-xjtu    // deqBeforeDly.ready is always true
813f43491c5Sxiaofeibao    deq.ready := true.B
81459ef6009Sxiaofeibao-xjtu  }
81552fc0c9fSxiaofeibao-xjtu  io.deqDelay.zip(deqDelay).foreach { case (sink, source) =>
81652fc0c9fSxiaofeibao-xjtu    sink.valid := source.valid
81752fc0c9fSxiaofeibao-xjtu    sink.bits := source.bits
81852fc0c9fSxiaofeibao-xjtu  }
8198d081717Sszw_kaixin  if(backendParams.debugEn) {
82052fc0c9fSxiaofeibao-xjtu    dontTouch(deqDelay)
82159ef6009Sxiaofeibao-xjtu    dontTouch(io.deqDelay)
822f43491c5Sxiaofeibao    dontTouch(deqBeforeDly)
8238d081717Sszw_kaixin  }
824bf35baadSXuan Hu  io.wakeupToIQ.zipWithIndex.foreach { case (wakeup, i) =>
825f8b278aaSsinsanction    if (wakeUpQueues(i).nonEmpty) {
826e63b0a03SXuan Hu      wakeup.valid := wakeUpQueues(i).get.io.deq.valid
827e63b0a03SXuan Hu      wakeup.bits.fromExuInput(wakeUpQueues(i).get.io.deq.bits)
8280f55a0d3SHaojin Tang      wakeup.bits.loadDependency := wakeUpQueues(i).get.io.deq.bits.loadDependency.getOrElse(0.U.asTypeOf(wakeup.bits.loadDependency))
82979b2c95bSzhanglyGit      wakeup.bits.is0Lat := getDeqLat(i, wakeUpQueues(i).get.io.deq.bits.fuType) === 0.U
830f8b278aaSsinsanction      wakeup.bits.rcDest.foreach(_ := io.replaceRCIdx.get(i))
831bf35baadSXuan Hu    } else {
832bf35baadSXuan Hu      wakeup.valid := false.B
8330f55a0d3SHaojin Tang      wakeup.bits := 0.U.asTypeOf(wakeup.bits)
834bf35baadSXuan Hu    }
8354c5a0d77Sxiaofeibao-xjtu    if (wakeUpQueues(i).nonEmpty) {
8364c5a0d77Sxiaofeibao-xjtu      wakeup.bits.rfWen  := (if (wakeUpQueues(i).get.io.deq.bits.rfWen .nonEmpty) wakeUpQueues(i).get.io.deq.valid && wakeUpQueues(i).get.io.deq.bits.rfWen .get else false.B)
8374c5a0d77Sxiaofeibao-xjtu      wakeup.bits.fpWen  := (if (wakeUpQueues(i).get.io.deq.bits.fpWen .nonEmpty) wakeUpQueues(i).get.io.deq.valid && wakeUpQueues(i).get.io.deq.bits.fpWen .get else false.B)
8384c5a0d77Sxiaofeibao-xjtu      wakeup.bits.vecWen := (if (wakeUpQueues(i).get.io.deq.bits.vecWen.nonEmpty) wakeUpQueues(i).get.io.deq.valid && wakeUpQueues(i).get.io.deq.bits.vecWen.get else false.B)
8398dd32220Ssinsanction      wakeup.bits.v0Wen  := (if (wakeUpQueues(i).get.io.deq.bits.v0Wen .nonEmpty) wakeUpQueues(i).get.io.deq.valid && wakeUpQueues(i).get.io.deq.bits.v0Wen.get else false.B)
8408dd32220Ssinsanction      wakeup.bits.vlWen  := (if (wakeUpQueues(i).get.io.deq.bits.vlWen .nonEmpty) wakeUpQueues(i).get.io.deq.valid && wakeUpQueues(i).get.io.deq.bits.vlWen.get else false.B)
8414c5a0d77Sxiaofeibao-xjtu    }
8424c5a0d77Sxiaofeibao-xjtu
8434c5a0d77Sxiaofeibao-xjtu    if(wakeUpQueues(i).nonEmpty && wakeup.bits.pdestCopy.nonEmpty){
8440c7ebb58Sxiaofeibao-xjtu      wakeup.bits.pdestCopy.get := wakeUpQueues(i).get.io.deq.bits.pdestCopy.get
8450c7ebb58Sxiaofeibao-xjtu    }
8464c5a0d77Sxiaofeibao-xjtu    if (wakeUpQueues(i).nonEmpty && wakeup.bits.rfWenCopy.nonEmpty) {
8474c5a0d77Sxiaofeibao-xjtu      wakeup.bits.rfWenCopy.get := wakeUpQueues(i).get.io.deq.bits.rfWenCopy.get
8484c5a0d77Sxiaofeibao-xjtu    }
8494c5a0d77Sxiaofeibao-xjtu    if (wakeUpQueues(i).nonEmpty && wakeup.bits.fpWenCopy.nonEmpty) {
8504c5a0d77Sxiaofeibao-xjtu      wakeup.bits.fpWenCopy.get := wakeUpQueues(i).get.io.deq.bits.fpWenCopy.get
8514c5a0d77Sxiaofeibao-xjtu    }
8524c5a0d77Sxiaofeibao-xjtu    if (wakeUpQueues(i).nonEmpty && wakeup.bits.vecWenCopy.nonEmpty) {
8534c5a0d77Sxiaofeibao-xjtu      wakeup.bits.vecWenCopy.get := wakeUpQueues(i).get.io.deq.bits.vecWenCopy.get
8544c5a0d77Sxiaofeibao-xjtu    }
8558dd32220Ssinsanction    if (wakeUpQueues(i).nonEmpty && wakeup.bits.v0WenCopy.nonEmpty) {
8568dd32220Ssinsanction      wakeup.bits.v0WenCopy.get := wakeUpQueues(i).get.io.deq.bits.v0WenCopy.get
8578dd32220Ssinsanction    }
8588dd32220Ssinsanction    if (wakeUpQueues(i).nonEmpty && wakeup.bits.vlWenCopy.nonEmpty) {
8598dd32220Ssinsanction      wakeup.bits.vlWenCopy.get := wakeUpQueues(i).get.io.deq.bits.vlWenCopy.get
8608dd32220Ssinsanction    }
8614c5a0d77Sxiaofeibao-xjtu    if (wakeUpQueues(i).nonEmpty && wakeup.bits.loadDependencyCopy.nonEmpty) {
8624c5a0d77Sxiaofeibao-xjtu      wakeup.bits.loadDependencyCopy.get := wakeUpQueues(i).get.io.deq.bits.loadDependencyCopy.get
8634c5a0d77Sxiaofeibao-xjtu    }
864bf35baadSXuan Hu  }
865bf35baadSXuan Hu
866730cfbc0SXuan Hu  // Todo: better counter implementation
8675db4956bSzhanglyGit  private val enqHasValid = validVec.take(params.numEnq).reduce(_ | _)
868c0beb497Sxiaofeibao  private val enqHasIssued = validVec.zip(issuedVec).take(params.numEnq).map(x => x._1 & x._2).reduce(_ | _)
869e986c5deSXuan Hu  private val enqEntryValidCnt = PopCount(validVec.take(params.numEnq))
8705db4956bSzhanglyGit  private val othersValidCnt = PopCount(validVec.drop(params.numEnq))
871ff3fcdf1Sxiaofeibao-xjtu  private val enqEntryValidCntDeq0 = PopCount(
872ff3fcdf1Sxiaofeibao-xjtu    validVec.take(params.numEnq).zip(deqCanAcceptVec(0).take(params.numEnq)).map { case (a, b) => a && b }
873ff3fcdf1Sxiaofeibao-xjtu  )
874ff3fcdf1Sxiaofeibao-xjtu  private val othersValidCntDeq0 = PopCount(
875ff3fcdf1Sxiaofeibao-xjtu    validVec.drop(params.numEnq).zip(deqCanAcceptVec(0).drop(params.numEnq)).map { case (a, b) => a && b }
876ff3fcdf1Sxiaofeibao-xjtu  )
877ff3fcdf1Sxiaofeibao-xjtu  private val enqEntryValidCntDeq1 = PopCount(
878ff3fcdf1Sxiaofeibao-xjtu    validVec.take(params.numEnq).zip(deqCanAcceptVec.last.take(params.numEnq)).map { case (a, b) => a && b }
879ff3fcdf1Sxiaofeibao-xjtu  )
880ff3fcdf1Sxiaofeibao-xjtu  private val othersValidCntDeq1 = PopCount(
881ff3fcdf1Sxiaofeibao-xjtu    validVec.drop(params.numEnq).zip(deqCanAcceptVec.last.drop(params.numEnq)).map { case (a, b) => a && b }
882ff3fcdf1Sxiaofeibao-xjtu  )
883ff3fcdf1Sxiaofeibao-xjtu  protected val deqCanAcceptVecEnq: Seq[IndexedSeq[Bool]] = deqFuCfgs.map { fuCfgs: Seq[FuConfig] =>
884ff3fcdf1Sxiaofeibao-xjtu    io.enq.map(_.bits.fuType).map(fuType =>
885ff3fcdf1Sxiaofeibao-xjtu      FuType.FuTypeOrR(fuType, fuCfgs.map(_.fuType)))
886ff3fcdf1Sxiaofeibao-xjtu  }
887ff3fcdf1Sxiaofeibao-xjtu  protected val enqValidCntDeq0 = PopCount(io.enq.map(_.fire).zip(deqCanAcceptVecEnq(0)).map { case (a, b) => a && b })
888ff3fcdf1Sxiaofeibao-xjtu  protected val enqValidCntDeq1 = PopCount(io.enq.map(_.fire).zip(deqCanAcceptVecEnq.last).map { case (a, b) => a && b })
88944b4e5f5Sxiaofeibao-xjtu  io.validCntDeqVec.head := RegNext(enqEntryValidCntDeq0 +& othersValidCntDeq0 - io.deqDelay.head.fire) // validCntDeqVec(0)
89044b4e5f5Sxiaofeibao-xjtu  io.validCntDeqVec.last := RegNext(enqEntryValidCntDeq1 +& othersValidCntDeq1 - io.deqDelay.last.fire) // validCntDeqVec(1)
8915db4956bSzhanglyGit  io.status.leftVec(0) := validVec.drop(params.numEnq).reduce(_ & _)
892730cfbc0SXuan Hu  for (i <- 0 until params.numEnq) {
8935db4956bSzhanglyGit    io.status.leftVec(i + 1) := othersValidCnt === (params.numEntries - params.numEnq - (i + 1)).U
894730cfbc0SXuan Hu  }
8955778f950Ssinsanction  private val othersLeftOneCaseVec = Wire(Vec(params.numEntries - params.numEnq, UInt((params.numEntries - params.numEnq).W)))
8965778f950Ssinsanction  othersLeftOneCaseVec.zipWithIndex.foreach { case (leftone, i) =>
8975778f950Ssinsanction    leftone := ~(1.U((params.numEntries - params.numEnq).W) << i)
8985778f950Ssinsanction  }
8995778f950Ssinsanction  private val othersLeftOne = othersLeftOneCaseVec.map(_ === VecInit(validVec.drop(params.numEnq)).asUInt).reduce(_ | _)
9007ab45173Sxiaofeibao-xjtu  private val othersCanotIn = Wire(Bool())
9017ab45173Sxiaofeibao-xjtu  othersCanotIn := othersLeftOne || validVec.drop(params.numEnq).reduce(_ & _)
9027ab45173Sxiaofeibao-xjtu  // if has simp Entry, othersCanotIn will be simpCanotIn
9037ab45173Sxiaofeibao-xjtu  if (params.numSimp > 0) {
9047ab45173Sxiaofeibao-xjtu    val simpLeftOneCaseVec = Wire(Vec(params.numSimp, UInt((params.numSimp).W)))
9057ab45173Sxiaofeibao-xjtu    simpLeftOneCaseVec.zipWithIndex.foreach { case (leftone, i) =>
9067ab45173Sxiaofeibao-xjtu      leftone := ~(1.U((params.numSimp).W) << i)
9077ab45173Sxiaofeibao-xjtu    }
9087ab45173Sxiaofeibao-xjtu    val simpLeftOne = simpLeftOneCaseVec.map(_ === VecInit(validVec.drop(params.numEnq).take(params.numSimp)).asUInt).reduce(_ | _)
9097ab45173Sxiaofeibao-xjtu    val simpCanotIn = simpLeftOne || validVec.drop(params.numEnq).take(params.numSimp).reduce(_ & _)
9107ab45173Sxiaofeibao-xjtu    othersCanotIn := simpCanotIn
9117ab45173Sxiaofeibao-xjtu  }
912c0beb497Sxiaofeibao  io.enq.foreach(_.ready := (!othersCanotIn || !enqHasValid) && !enqHasIssued)
913f4d8f008SHaojin Tang  io.status.empty := !Cat(validVec).orR
9145778f950Ssinsanction  io.status.full := othersCanotIn
91556bcaed7SHaojin Tang  io.status.validCnt := PopCount(validVec)
916bf35baadSXuan Hu
917bf35baadSXuan Hu  protected def getDeqLat(deqPortIdx: Int, fuType: UInt) : UInt = {
918c38df446SzhanglyGit    Mux1H(wakeupFuLatencyMaps(deqPortIdx) map { case (k, v) => (fuType(k.id), v.U) })
919bf35baadSXuan Hu  }
92089740385Ssinsanction
921de7754bfSsinsanction  // issue perf counter
922e986c5deSXuan Hu  // enq count
923e986c5deSXuan Hu  XSPerfAccumulate("enq_valid_cnt", PopCount(io.enq.map(_.fire)))
924e986c5deSXuan Hu  XSPerfAccumulate("enq_fire_cnt", PopCount(io.enq.map(_.fire)))
925ff3fcdf1Sxiaofeibao-xjtu  XSPerfAccumulate("enq_alu_fire_cnt", PopCount(io.enq.map { case enq => enq.fire && FuType.isAlu(enq.bits.fuType) }))
926ff3fcdf1Sxiaofeibao-xjtu  XSPerfAccumulate("enq_brh_fire_cnt", PopCount(io.enq.map { case enq => enq.fire && FuType.isBrh(enq.bits.fuType) }))
927ff3fcdf1Sxiaofeibao-xjtu  XSPerfAccumulate("deqDelay0_fire_cnt", PopCount(io.deqDelay.head.fire))
928ff3fcdf1Sxiaofeibao-xjtu  XSPerfAccumulate("deqDelay1_fire_cnt", PopCount(io.deqDelay.last.fire))
929e986c5deSXuan Hu  // valid count
930e986c5deSXuan Hu  XSPerfHistogram("enq_entry_valid_cnt", enqEntryValidCnt, true.B, 0, params.numEnq + 1)
93162a2cb19SXuan Hu  XSPerfHistogram("other_entry_valid_cnt", othersValidCnt, true.B, 0, params.numEntries - params.numEnq + 1)
932e986c5deSXuan Hu  XSPerfHistogram("valid_cnt", PopCount(validVec), true.B, 0, params.numEntries + 1)
93356bcaed7SHaojin Tang  // only split when more than 1 func type
93456bcaed7SHaojin Tang  if (params.getFuCfgs.size > 0) {
93556bcaed7SHaojin Tang    for (t <- FuType.functionNameMap.keys) {
93656bcaed7SHaojin Tang      val fuName = FuType.functionNameMap(t)
93756bcaed7SHaojin Tang      if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _)) {
93856bcaed7SHaojin Tang        XSPerfHistogram(s"valid_cnt_hist_futype_${fuName}", PopCount(validVec.zip(fuTypeVec).map { case (v, fu) => v && fu === t.U }), true.B, 0, params.numEntries, 1)
93956bcaed7SHaojin Tang      }
94056bcaed7SHaojin Tang    }
94156bcaed7SHaojin Tang  }
942de7754bfSsinsanction  // ready instr count
943e986c5deSXuan Hu  private val readyEntriesCnt = PopCount(validVec.zip(canIssueVec).map(x => x._1 && x._2))
944e986c5deSXuan Hu  XSPerfHistogram("ready_cnt", readyEntriesCnt, true.B, 0, params.numEntries + 1)
945e986c5deSXuan Hu  // only split when more than 1 func type
946e986c5deSXuan Hu  if (params.getFuCfgs.size > 0) {
94789740385Ssinsanction    for (t <- FuType.functionNameMap.keys) {
94889740385Ssinsanction      val fuName = FuType.functionNameMap(t)
94989740385Ssinsanction      if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _)) {
950e986c5deSXuan Hu        XSPerfHistogram(s"ready_cnt_hist_futype_${fuName}", PopCount(validVec.zip(canIssueVec).zip(fuTypeVec).map { case ((v, c), fu) => v && c && fu === t.U }), true.B, 0, params.numEntries, 1)
951e986c5deSXuan Hu      }
95289740385Ssinsanction    }
95389740385Ssinsanction  }
95489740385Ssinsanction
955de7754bfSsinsanction  // deq instr count
956fb445e8dSzhanglyGit  XSPerfAccumulate("issue_instr_pre_count", PopCount(deqBeforeDly.map(_.valid)))
957fb445e8dSzhanglyGit  XSPerfHistogram("issue_instr_pre_count_hist", PopCount(deqBeforeDly.map(_.valid)), true.B, 0, params.numDeq + 1, 1)
958e986c5deSXuan Hu  XSPerfAccumulate("issue_instr_count", PopCount(io.deqDelay.map(_.valid)))
959e986c5deSXuan Hu  XSPerfHistogram("issue_instr_count_hist", PopCount(io.deqDelay.map(_.valid)), true.B, 0, params.numDeq + 1, 1)
960de7754bfSsinsanction
961de7754bfSsinsanction  // deq instr data source count
962fb445e8dSzhanglyGit  XSPerfAccumulate("issue_datasource_reg", deqBeforeDly.map{ deq =>
96389740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.reg && !SrcType.isNotReg(deq.bits.srcType(j)) })
96489740385Ssinsanction  }.reduce(_ +& _))
965fb445e8dSzhanglyGit  XSPerfAccumulate("issue_datasource_bypass", deqBeforeDly.map{ deq =>
96689740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.bypass && !SrcType.isNotReg(deq.bits.srcType(j)) })
96789740385Ssinsanction  }.reduce(_ +& _))
968fb445e8dSzhanglyGit  XSPerfAccumulate("issue_datasource_forward", deqBeforeDly.map{ deq =>
96989740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.forward && !SrcType.isNotReg(deq.bits.srcType(j)) })
97089740385Ssinsanction  }.reduce(_ +& _))
971fb445e8dSzhanglyGit  XSPerfAccumulate("issue_datasource_noreg", deqBeforeDly.map{ deq =>
972de7754bfSsinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && SrcType.isNotReg(deq.bits.srcType(j)) })
973de7754bfSsinsanction  }.reduce(_ +& _))
97489740385Ssinsanction
975fb445e8dSzhanglyGit  XSPerfHistogram("issue_datasource_reg_hist", deqBeforeDly.map{ deq =>
97689740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.reg && !SrcType.isNotReg(deq.bits.srcType(j)) })
977e986c5deSXuan Hu  }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
978fb445e8dSzhanglyGit  XSPerfHistogram("issue_datasource_bypass_hist", deqBeforeDly.map{ deq =>
97989740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.bypass && !SrcType.isNotReg(deq.bits.srcType(j)) })
980e986c5deSXuan Hu  }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
981fb445e8dSzhanglyGit  XSPerfHistogram("issue_datasource_forward_hist", deqBeforeDly.map{ deq =>
98289740385Ssinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.forward && !SrcType.isNotReg(deq.bits.srcType(j)) })
983e986c5deSXuan Hu  }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
984fb445e8dSzhanglyGit  XSPerfHistogram("issue_datasource_noreg_hist", deqBeforeDly.map{ deq =>
985de7754bfSsinsanction    PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && SrcType.isNotReg(deq.bits.srcType(j)) })
986e986c5deSXuan Hu  }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
98789740385Ssinsanction
988de7754bfSsinsanction  // deq instr data source count for each futype
98989740385Ssinsanction  for (t <- FuType.functionNameMap.keys) {
99089740385Ssinsanction    val fuName = FuType.functionNameMap(t)
99189740385Ssinsanction    if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _)) {
992fb445e8dSzhanglyGit      XSPerfAccumulate(s"issue_datasource_reg_futype_${fuName}", deqBeforeDly.map{ deq =>
99389740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.reg && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
99489740385Ssinsanction      }.reduce(_ +& _))
995fb445e8dSzhanglyGit      XSPerfAccumulate(s"issue_datasource_bypass_futype_${fuName}", deqBeforeDly.map{ deq =>
99689740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.bypass && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
99789740385Ssinsanction      }.reduce(_ +& _))
998fb445e8dSzhanglyGit      XSPerfAccumulate(s"issue_datasource_forward_futype_${fuName}", deqBeforeDly.map{ deq =>
99989740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.forward && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
100089740385Ssinsanction      }.reduce(_ +& _))
1001fb445e8dSzhanglyGit      XSPerfAccumulate(s"issue_datasource_noreg_futype_${fuName}", deqBeforeDly.map{ deq =>
1002de7754bfSsinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
1003de7754bfSsinsanction      }.reduce(_ +& _))
100489740385Ssinsanction
1005fb445e8dSzhanglyGit      XSPerfHistogram(s"issue_datasource_reg_hist_futype_${fuName}", deqBeforeDly.map{ deq =>
100689740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.reg && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
1007e986c5deSXuan Hu      }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
1008fb445e8dSzhanglyGit      XSPerfHistogram(s"issue_datasource_bypass_hist_futype_${fuName}", deqBeforeDly.map{ deq =>
100989740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.bypass && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
1010e986c5deSXuan Hu      }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
1011fb445e8dSzhanglyGit      XSPerfHistogram(s"issue_datasource_forward_hist_futype_${fuName}", deqBeforeDly.map{ deq =>
101289740385Ssinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && ds.value === DataSource.forward && !SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
1013e986c5deSXuan Hu      }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
1014fb445e8dSzhanglyGit      XSPerfHistogram(s"issue_datasource_noreg_hist_futype_${fuName}", deqBeforeDly.map{ deq =>
1015de7754bfSsinsanction        PopCount(deq.bits.common.dataSources.zipWithIndex.map{ case (ds, j) => deq.valid && SrcType.isNotReg(deq.bits.srcType(j)) && deq.bits.common.fuType === t.U })
1016e986c5deSXuan Hu      }.reduce(_ +& _), true.B, 0, params.numDeq * params.numRegSrc + 1, 1)
101789740385Ssinsanction    }
101889740385Ssinsanction  }
1019730cfbc0SXuan Hu}
1020730cfbc0SXuan Hu
1021730cfbc0SXuan Huclass IssueQueueLoadBundle(implicit p: Parameters) extends XSBundle {
1022730cfbc0SXuan Hu  val fastMatch = UInt(backendParams.LduCnt.W)
1023730cfbc0SXuan Hu  val fastImm = UInt(12.W)
1024730cfbc0SXuan Hu}
1025730cfbc0SXuan Hu
1026d456387eSHaojin Tangclass IssueQueueIntIO()(implicit p: Parameters, params: IssueBlockParams) extends IssueQueueIO
1027730cfbc0SXuan Hu
1028730cfbc0SXuan Huclass IssueQueueIntImp(override val wrapper: IssueQueue)(implicit p: Parameters, iqParams: IssueBlockParams)
1029730cfbc0SXuan Hu  extends IssueQueueImp(wrapper)
1030730cfbc0SXuan Hu{
1031730cfbc0SXuan Hu  io.suggestName("none")
1032730cfbc0SXuan Hu  override lazy val io = IO(new IssueQueueIntIO).suggestName("io")
1033730cfbc0SXuan Hu
1034fb445e8dSzhanglyGit  deqBeforeDly.zipWithIndex.foreach{ case (deq, i) => {
103529dbac5aSsinsanction    deq.bits.common.pc.foreach(_ := DontCare)
10365db4956bSzhanglyGit    deq.bits.common.preDecode.foreach(_ := deqEntryVec(i).bits.payload.preDecodeInfo)
10375db4956bSzhanglyGit    deq.bits.common.ftqIdx.foreach(_ := deqEntryVec(i).bits.payload.ftqPtr)
10385db4956bSzhanglyGit    deq.bits.common.ftqOffset.foreach(_ := deqEntryVec(i).bits.payload.ftqOffset)
1039730cfbc0SXuan Hu    deq.bits.common.predictInfo.foreach(x => {
1040d8a24b06SzhanglyGit      x.target := DontCare
10415db4956bSzhanglyGit      x.taken := deqEntryVec(i).bits.payload.pred_taken
1042730cfbc0SXuan Hu    })
1043730cfbc0SXuan Hu    // for std
10445db4956bSzhanglyGit    deq.bits.common.sqIdx.foreach(_ := deqEntryVec(i).bits.payload.sqIdx)
1045730cfbc0SXuan Hu    // for i2f
10465db4956bSzhanglyGit    deq.bits.common.fpu.foreach(_ := deqEntryVec(i).bits.payload.fpu)
1047730cfbc0SXuan Hu  }}
1048730cfbc0SXuan Hu}
1049730cfbc0SXuan Hu
1050730cfbc0SXuan Huclass IssueQueueVfImp(override val wrapper: IssueQueue)(implicit p: Parameters, iqParams: IssueBlockParams)
1051730cfbc0SXuan Hu  extends IssueQueueImp(wrapper)
1052730cfbc0SXuan Hu{
1053fb445e8dSzhanglyGit  deqBeforeDly.zipWithIndex.foreach{ case (deq, i) => {
10545db4956bSzhanglyGit    deq.bits.common.fpu.foreach(_ := deqEntryVec(i).bits.payload.fpu)
10555db4956bSzhanglyGit    deq.bits.common.vpu.foreach(_ := deqEntryVec(i).bits.payload.vpu)
10565db4956bSzhanglyGit    deq.bits.common.vpu.foreach(_.vuopIdx := deqEntryVec(i).bits.payload.uopIdx)
10572d270511Ssinsanction    deq.bits.common.vpu.foreach(_.lastUop := deqEntryVec(i).bits.payload.lastUop)
1058730cfbc0SXuan Hu  }}
1059730cfbc0SXuan Hu}
1060730cfbc0SXuan Hu
106160f0c5aeSxiaofeibaoclass IssueQueueFpImp(override val wrapper: IssueQueue)(implicit p: Parameters, iqParams: IssueBlockParams)
106260f0c5aeSxiaofeibao  extends IssueQueueImp(wrapper)
106360f0c5aeSxiaofeibao{
106460f0c5aeSxiaofeibao  deqBeforeDly.zipWithIndex.foreach{ case (deq, i) => {
106560f0c5aeSxiaofeibao    deq.bits.common.fpu.foreach(_ := deqEntryVec(i).bits.payload.fpu)
106660f0c5aeSxiaofeibao    deq.bits.common.vpu.foreach(_ := deqEntryVec(i).bits.payload.vpu)
106760f0c5aeSxiaofeibao    deq.bits.common.vpu.foreach(_.vuopIdx := deqEntryVec(i).bits.payload.uopIdx)
106860f0c5aeSxiaofeibao    deq.bits.common.vpu.foreach(_.lastUop := deqEntryVec(i).bits.payload.lastUop)
106960f0c5aeSxiaofeibao  }}
107060f0c5aeSxiaofeibao}
107160f0c5aeSxiaofeibao
1072730cfbc0SXuan Huclass IssueQueueMemBundle(implicit p: Parameters, params: IssueBlockParams) extends Bundle {
1073fd490615Sweiding liu  val feedbackIO = Flipped(Vec(params.numDeq, new MemRSFeedbackIO(params.isVecMemIQ)))
1074e07131b2Ssinsanction
1075e07131b2Ssinsanction  // TODO: is still needed?
1076730cfbc0SXuan Hu  val checkWait = new Bundle {
1077730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr)
107899ce5576Scz4e    val memWaitUpdateReq = Flipped(new MemWaitUpdateReqBundle)
1079730cfbc0SXuan Hu  }
1080596af5d2SHaojin Tang  val loadFastMatch = Output(Vec(params.LdExuCnt, new IssueQueueLoadBundle))
1081e07131b2Ssinsanction
1082e07131b2Ssinsanction  // load wakeup
1083596af5d2SHaojin Tang  val loadWakeUp = Input(Vec(params.LdExuCnt, ValidIO(new DynInst())))
10842d270511Ssinsanction
10852d270511Ssinsanction  // vector
1086bb2f3f51STang Haojin  val sqDeqPtr = Option.when(params.isVecMemIQ)(Input(new SqPtr))
1087bb2f3f51STang Haojin  val lqDeqPtr = Option.when(params.isVecMemIQ)(Input(new LqPtr))
1088730cfbc0SXuan Hu}
1089730cfbc0SXuan Hu
1090730cfbc0SXuan Huclass IssueQueueMemIO(implicit p: Parameters, params: IssueBlockParams) extends IssueQueueIO {
1091730cfbc0SXuan Hu  val memIO = Some(new IssueQueueMemBundle)
1092730cfbc0SXuan Hu}
1093730cfbc0SXuan Hu
1094730cfbc0SXuan Huclass IssueQueueMemAddrImp(override val wrapper: IssueQueue)(implicit p: Parameters, params: IssueBlockParams)
1095730cfbc0SXuan Hu  extends IssueQueueImp(wrapper) with HasCircularQueuePtrHelper {
1096730cfbc0SXuan Hu
1097c758aa7fSsinsanction  require(params.StdCnt == 0 && (params.LduCnt + params.StaCnt + params.HyuCnt) > 0, "IssueQueueMemAddrImp can only be instance of MemAddr IQ, " +
1098b133b458SXuan Hu    s"StdCnt: ${params.StdCnt}, LduCnt: ${params.LduCnt}, StaCnt: ${params.StaCnt}, HyuCnt: ${params.HyuCnt}")
10998a66c02cSXuan Hu  println(s"[IssueQueueMemAddrImp] StdCnt: ${params.StdCnt}, LduCnt: ${params.LduCnt}, StaCnt: ${params.StaCnt}, HyuCnt: ${params.HyuCnt}")
1100730cfbc0SXuan Hu
1101730cfbc0SXuan Hu  io.suggestName("none")
1102730cfbc0SXuan Hu  override lazy val io = IO(new IssueQueueMemIO).suggestName("io")
1103730cfbc0SXuan Hu  private val memIO = io.memIO.get
1104730cfbc0SXuan Hu
1105853cd2d8SHaojin Tang  memIO.loadFastMatch := 0.U.asTypeOf(memIO.loadFastMatch) // TODO: is still needed?
1106853cd2d8SHaojin Tang
11075db4956bSzhanglyGit  entries.io.fromMem.get.slowResp.zipWithIndex.foreach { case (slowResp, i) =>
1108730cfbc0SXuan Hu    slowResp.valid       := memIO.feedbackIO(i).feedbackSlow.valid
11095db4956bSzhanglyGit    slowResp.bits.robIdx := memIO.feedbackIO(i).feedbackSlow.bits.robIdx
111038f78b5dSxiaofeibao-xjtu    slowResp.bits.sqIdx.foreach( _ := memIO.feedbackIO(i).feedbackSlow.bits.sqIdx)
111128ac1c16Sxiaofeibao-xjtu    slowResp.bits.lqIdx.foreach( _ := memIO.feedbackIO(i).feedbackSlow.bits.lqIdx)
1112f08a822fSzhanglyGit    slowResp.bits.resp   := Mux(memIO.feedbackIO(i).feedbackSlow.bits.hit, RespType.success, RespType.block)
11138d29ec32Sczw    slowResp.bits.fuType := DontCare
1114730cfbc0SXuan Hu  }
1115730cfbc0SXuan Hu
1116d3372210SzhanglyGit  entries.io.fromMem.get.fastResp.zipWithIndex.foreach { case (fastResp, i) =>
1117d3372210SzhanglyGit    fastResp.valid       := memIO.feedbackIO(i).feedbackFast.valid
1118d3372210SzhanglyGit    fastResp.bits.robIdx := memIO.feedbackIO(i).feedbackFast.bits.robIdx
111938f78b5dSxiaofeibao-xjtu    fastResp.bits.sqIdx.foreach( _ := memIO.feedbackIO(i).feedbackFast.bits.sqIdx)
112028ac1c16Sxiaofeibao-xjtu    fastResp.bits.lqIdx.foreach( _ := memIO.feedbackIO(i).feedbackFast.bits.lqIdx)
1121d3372210SzhanglyGit    fastResp.bits.resp   := Mux(memIO.feedbackIO(i).feedbackFast.bits.hit, RespType.success, RespType.block)
1122d3372210SzhanglyGit    fastResp.bits.fuType := DontCare
1123d3372210SzhanglyGit  }
1124d3372210SzhanglyGit
1125596af5d2SHaojin Tang  // load wakeup
1126596af5d2SHaojin Tang  val loadWakeUpIter = memIO.loadWakeUp.iterator
1127596af5d2SHaojin Tang  io.wakeupToIQ.zip(params.exuBlockParams).zipWithIndex.foreach { case ((wakeup, param), i) =>
1128596af5d2SHaojin Tang    if (param.hasLoadExu) {
1129596af5d2SHaojin Tang      require(wakeUpQueues(i).isEmpty)
1130a01a12bbSHaojin Tang      val uop = loadWakeUpIter.next()
1131a01a12bbSHaojin Tang
11325f8b6c9eSsinceforYy      wakeup.valid := GatedValidRegNext(uop.fire)
1133dd461822Ssinsanction      wakeup.bits.rfWen  := (if (params.writeIntRf) GatedValidRegNext(uop.bits.rfWen  && uop.fire) else false.B)
1134dd461822Ssinsanction      wakeup.bits.fpWen  := (if (params.writeFpRf)  GatedValidRegNext(uop.bits.fpWen  && uop.fire) else false.B)
1135dd461822Ssinsanction      wakeup.bits.vecWen := (if (params.writeVecRf) GatedValidRegNext(uop.bits.vecWen && uop.fire) else false.B)
1136dd461822Ssinsanction      wakeup.bits.v0Wen  := (if (params.writeV0Rf)  GatedValidRegNext(uop.bits.v0Wen  && uop.fire) else false.B)
1137dd461822Ssinsanction      wakeup.bits.vlWen  := (if (params.writeVlRf)  GatedValidRegNext(uop.bits.vlWen  && uop.fire) else false.B)
11388338e674Sxiaofeibao-xjtu      wakeup.bits.pdest  := RegEnable(uop.bits.pdest, uop.fire)
1139f8b278aaSsinsanction      wakeup.bits.rcDest.foreach(_ := io.replaceRCIdx.get(i))
1140596af5d2SHaojin Tang      wakeup.bits.loadDependency.foreach(_ := 0.U) // this is correct for load only
1141a01a12bbSHaojin Tang
1142dd461822Ssinsanction      wakeup.bits.rfWenCopy .foreach(_.foreach(_ := (if (params.writeIntRf) GatedValidRegNext(uop.bits.rfWen  && uop.fire) else false.B)))
1143dd461822Ssinsanction      wakeup.bits.fpWenCopy .foreach(_.foreach(_ := (if (params.writeFpRf)  GatedValidRegNext(uop.bits.fpWen  && uop.fire) else false.B)))
1144dd461822Ssinsanction      wakeup.bits.vecWenCopy.foreach(_.foreach(_ := (if (params.writeVecRf) GatedValidRegNext(uop.bits.vecWen && uop.fire) else false.B)))
1145dd461822Ssinsanction      wakeup.bits.v0WenCopy .foreach(_.foreach(_ := (if (params.writeV0Rf)  GatedValidRegNext(uop.bits.v0Wen  && uop.fire) else false.B)))
1146dd461822Ssinsanction      wakeup.bits.vlWenCopy .foreach(_.foreach(_ := (if (params.writeVlRf)  GatedValidRegNext(uop.bits.vlWen  && uop.fire) else false.B)))
11478338e674Sxiaofeibao-xjtu      wakeup.bits.pdestCopy .foreach(_.foreach(_ := RegEnable(uop.bits.pdest, uop.fire)))
1148a01a12bbSHaojin Tang      wakeup.bits.loadDependencyCopy.foreach(x => x := 0.U.asTypeOf(x)) // this is correct for load only
1149a01a12bbSHaojin Tang
1150a01a12bbSHaojin Tang      wakeup.bits.is0Lat := 0.U
1151596af5d2SHaojin Tang    }
1152596af5d2SHaojin Tang  }
1153596af5d2SHaojin Tang  require(!loadWakeUpIter.hasNext)
1154596af5d2SHaojin Tang
1155fb445e8dSzhanglyGit  deqBeforeDly.zipWithIndex.foreach { case (deq, i) =>
1156c37914a4Sxiaofeibao    deq.bits.common.pc.foreach(_ := 0.U)
11571548ca99SHaojin Tang    deq.bits.common.loadWaitBit.foreach(_ := deqEntryVec(i).bits.payload.loadWaitBit)
11581548ca99SHaojin Tang    deq.bits.common.waitForRobIdx.foreach(_ := deqEntryVec(i).bits.payload.waitForRobIdx)
115959a1db8aSHaojin Tang    deq.bits.common.storeSetHit.foreach(_ := deqEntryVec(i).bits.payload.storeSetHit)
116059a1db8aSHaojin Tang    deq.bits.common.loadWaitStrict.foreach(_ := deqEntryVec(i).bits.payload.loadWaitStrict)
116159a1db8aSHaojin Tang    deq.bits.common.ssid.foreach(_ := deqEntryVec(i).bits.payload.ssid)
11625db4956bSzhanglyGit    deq.bits.common.sqIdx.get := deqEntryVec(i).bits.payload.sqIdx
11635db4956bSzhanglyGit    deq.bits.common.lqIdx.get := deqEntryVec(i).bits.payload.lqIdx
1164542ae917SHaojin Tang    deq.bits.common.ftqIdx.foreach(_ := deqEntryVec(i).bits.payload.ftqPtr)
1165542ae917SHaojin Tang    deq.bits.common.ftqOffset.foreach(_ := deqEntryVec(i).bits.payload.ftqOffset)
1166730cfbc0SXuan Hu  }
1167730cfbc0SXuan Hu}
11682d270511Ssinsanction
11692d270511Ssinsanctionclass IssueQueueVecMemImp(override val wrapper: IssueQueue)(implicit p: Parameters, params: IssueBlockParams)
11702d270511Ssinsanction  extends IssueQueueImp(wrapper) with HasCircularQueuePtrHelper {
11712d270511Ssinsanction
1172e07131b2Ssinsanction  require((params.VlduCnt + params.VstuCnt) > 0, "IssueQueueVecMemImp can only be instance of VecMem IQ")
1173e07131b2Ssinsanction  println(s"[IssueQueueVecMemImp] VlduCnt: ${params.VlduCnt}, VstuCnt: ${params.VstuCnt}")
11742d270511Ssinsanction
11752d270511Ssinsanction  io.suggestName("none")
11762d270511Ssinsanction  override lazy val io = IO(new IssueQueueMemIO).suggestName("io")
11772d270511Ssinsanction  private val memIO = io.memIO.get
11782d270511Ssinsanction
117999944b79Ssinsanction  require(params.numExu == 1, "VecMem IssueQueue has not supported more than 1 deq ports")
118099944b79Ssinsanction
11812d270511Ssinsanction  for (i <- entries.io.enq.indices) {
11822d270511Ssinsanction    entries.io.enq(i).bits.status match { case enqData =>
1183e07131b2Ssinsanction      enqData.vecMem.get.sqIdx := s0_enqBits(i).sqIdx
1184e07131b2Ssinsanction      enqData.vecMem.get.lqIdx := s0_enqBits(i).lqIdx
11856dbb4e08SXuan Hu      // MemAddrIQ also handle vector insts
11866dbb4e08SXuan Hu      enqData.vecMem.get.numLsElem := s0_enqBits(i).numLsElem
1187b0480352SZiyue Zhang
1188df3b4b92SAnzooooo      val isFirstLoad           = s0_enqBits(i).lqIdx <= memIO.lqDeqPtr.get
1189b0480352SZiyue Zhang      val isVleff               = s0_enqBits(i).vpu.isVleff
1190b0480352SZiyue Zhang      enqData.blocked          := !isFirstLoad && isVleff
1191e07131b2Ssinsanction    }
11922d270511Ssinsanction  }
11932d270511Ssinsanction
11942d270511Ssinsanction  entries.io.fromMem.get.slowResp.zipWithIndex.foreach { case (slowResp, i) =>
11952d270511Ssinsanction    slowResp.valid                 := memIO.feedbackIO(i).feedbackSlow.valid
11962d270511Ssinsanction    slowResp.bits.robIdx           := memIO.feedbackIO(i).feedbackSlow.bits.robIdx
119738f78b5dSxiaofeibao-xjtu    slowResp.bits.sqIdx.get        := memIO.feedbackIO(i).feedbackSlow.bits.sqIdx
119828ac1c16Sxiaofeibao-xjtu    slowResp.bits.lqIdx.get        := memIO.feedbackIO(i).feedbackSlow.bits.lqIdx
11996462eb1cSzhanglyGit    slowResp.bits.resp             := Mux(memIO.feedbackIO(i).feedbackSlow.bits.hit, RespType.success, RespType.block)
12002d270511Ssinsanction    slowResp.bits.fuType           := DontCare
120138f78b5dSxiaofeibao-xjtu    slowResp.bits.uopIdx.get       := DontCare
12022d270511Ssinsanction  }
12032d270511Ssinsanction
1204d3372210SzhanglyGit  entries.io.fromMem.get.fastResp.zipWithIndex.foreach { case (fastResp, i) =>
1205d3372210SzhanglyGit    fastResp.valid                 := memIO.feedbackIO(i).feedbackFast.valid
1206d3372210SzhanglyGit    fastResp.bits.robIdx           := memIO.feedbackIO(i).feedbackFast.bits.robIdx
120738f78b5dSxiaofeibao-xjtu    fastResp.bits.sqIdx.get        := memIO.feedbackIO(i).feedbackFast.bits.sqIdx
120828ac1c16Sxiaofeibao-xjtu    fastResp.bits.lqIdx.get        := memIO.feedbackIO(i).feedbackFast.bits.lqIdx
1209d3372210SzhanglyGit    fastResp.bits.resp             := Mux(memIO.feedbackIO(i).feedbackFast.bits.hit, RespType.success, RespType.block)
1210d3372210SzhanglyGit    fastResp.bits.fuType           := DontCare
121138f78b5dSxiaofeibao-xjtu    fastResp.bits.uopIdx.get       := DontCare
12122d270511Ssinsanction  }
12132d270511Ssinsanction
1214aa2bcc31SzhanglyGit  entries.io.vecMemIn.get.sqDeqPtr := memIO.sqDeqPtr.get
1215aa2bcc31SzhanglyGit  entries.io.vecMemIn.get.lqDeqPtr := memIO.lqDeqPtr.get
1216aa2bcc31SzhanglyGit
1217fb445e8dSzhanglyGit  deqBeforeDly.zipWithIndex.foreach { case (deq, i) =>
1218e07131b2Ssinsanction    deq.bits.common.sqIdx.foreach(_ := deqEntryVec(i).bits.status.vecMem.get.sqIdx)
1219e07131b2Ssinsanction    deq.bits.common.lqIdx.foreach(_ := deqEntryVec(i).bits.status.vecMem.get.lqIdx)
12206dbb4e08SXuan Hu    deq.bits.common.numLsElem.foreach(_ := deqEntryVec(i).bits.status.vecMem.get.numLsElem)
1221e07131b2Ssinsanction    if (params.isVecLduIQ) {
12222d270511Ssinsanction      deq.bits.common.ftqIdx.get := deqEntryVec(i).bits.payload.ftqPtr
12232d270511Ssinsanction      deq.bits.common.ftqOffset.get := deqEntryVec(i).bits.payload.ftqOffset
12242d270511Ssinsanction    }
12252d270511Ssinsanction    deq.bits.common.fpu.foreach(_ := deqEntryVec(i).bits.payload.fpu)
12262d270511Ssinsanction    deq.bits.common.vpu.foreach(_ := deqEntryVec(i).bits.payload.vpu)
12272d270511Ssinsanction    deq.bits.common.vpu.foreach(_.vuopIdx := deqEntryVec(i).bits.payload.uopIdx)
12282d270511Ssinsanction    deq.bits.common.vpu.foreach(_.lastUop := deqEntryVec(i).bits.payload.lastUop)
12292d270511Ssinsanction  }
12307e471bf8SXuan Hu
12317e471bf8SXuan Hu  io.vecLoadIssueResp.foreach(dontTouch(_))
12322d270511Ssinsanction}
1233