xref: /XiangShan/src/main/scala/xiangshan/backend/issue/EnqEntry.scala (revision acf4150365a0978ab0370fff04ea27e6bd1c56c1)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
45db4956bSzhanglyGitimport chisel3._
55db4956bSzhanglyGitimport chisel3.util._
65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
75db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper}
85db4956bSzhanglyGitimport xiangshan._
95db4956bSzhanglyGitimport xiangshan.backend.Bundles._
105db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
125db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
132d270511Ssinsanctionimport xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr}
145db4956bSzhanglyGit
155db4956bSzhanglyGit
165db4956bSzhanglyGitclass EnqEntryIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
175db4956bSzhanglyGit  //input
185db4956bSzhanglyGit  val enq = Flipped(ValidIO(new EntryBundle))
195db4956bSzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
205db4956bSzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
215db4956bSzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
227a96cc7fSHaojin Tang  val og0Cancel = Input(ExuOH(backendParams.numExu))
237a96cc7fSHaojin Tang  val og1Cancel = Input(ExuOH(backendParams.numExu))
246810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
25aa2b5219Ssinsanction  val enqDelayWakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
26aa2b5219Ssinsanction  val enqDelayWakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
27aa2b5219Ssinsanction  val enqDelayOg0Cancel = Input(ExuOH(backendParams.numExu))
287cbafe1aSzhanglyGit  val enqDelayLdCancel = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
295db4956bSzhanglyGit  val deqSel = Input(Bool())
305db4956bSzhanglyGit  val deqPortIdxWrite = Input(UInt(1.W))
315db4956bSzhanglyGit  val transSel = Input(Bool())
325db4956bSzhanglyGit  val issueResp = Flipped(ValidIO(new EntryDeqRespBundle))
335db4956bSzhanglyGit  //output
345db4956bSzhanglyGit  val valid = Output(Bool())
355db4956bSzhanglyGit  val canIssue = Output(Bool())
365db4956bSzhanglyGit  val clear = Output(Bool())
375db4956bSzhanglyGit  val fuType = Output(FuType())
385db4956bSzhanglyGit  val dataSource = Output(Vec(params.numRegSrc, DataSource()))
397a96cc7fSHaojin Tang  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, ExuOH())))
405db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numRegSrc, UInt(3.W))))
415db4956bSzhanglyGit  val transEntry =  ValidIO(new EntryBundle)
425db4956bSzhanglyGit  val isFirstIssue = Output(Bool())
435db4956bSzhanglyGit  val entry = ValidIO(new EntryBundle)
445db4956bSzhanglyGit  val robIdx = Output(new RobPtr)
452d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(UopIdx()))
465db4956bSzhanglyGit  val deqPortIdxRead = Output(UInt(1.W))
475db4956bSzhanglyGit  val issueTimerRead = Output(UInt(2.W))
485db4956bSzhanglyGit  // mem only
495db4956bSzhanglyGit  val fromMem = if(params.isMemAddrIQ) Some(new Bundle {
505db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
515db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
525db4956bSzhanglyGit  }) else None
532d270511Ssinsanction  // vector mem only
542d270511Ssinsanction  val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle {
552d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
562d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
572d270511Ssinsanction  })
5889740385Ssinsanction  // debug
5989740385Ssinsanction  val cancel = OptionWrapper(params.hasIQWakeUp, Output(Bool()))
605db4956bSzhanglyGit
615db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
625db4956bSzhanglyGit}
635db4956bSzhanglyGit
645db4956bSzhanglyGitclass EnqEntry(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
655db4956bSzhanglyGit  val io = IO(new EnqEntryIO)
665db4956bSzhanglyGit
675db4956bSzhanglyGit  val validReg = RegInit(false.B)
685db4956bSzhanglyGit  val entryReg = Reg(new EntryBundle)
69aa2b5219Ssinsanction  val enqDelayValidReg = RegInit(false.B)
705db4956bSzhanglyGit
715db4956bSzhanglyGit  val validRegNext = Wire(Bool())
725db4956bSzhanglyGit  val entryRegNext = Wire(new EntryBundle)
735db4956bSzhanglyGit  val entryUpdate = Wire(new EntryBundle)
74aa2b5219Ssinsanction  val enqDelayValidRegNext = Wire(Bool())
755db4956bSzhanglyGit  val enqReady = Wire(Bool())
765db4956bSzhanglyGit  val clear = Wire(Bool())
775db4956bSzhanglyGit  val flushed = Wire(Bool())
785db4956bSzhanglyGit  val deqSuccess = Wire(Bool())
795db4956bSzhanglyGit  val srcWakeUp = Wire(Vec(params.numRegSrc, Bool()))
80af4bd265SzhanglyGit  val srcWakeUpByWB = Wire(Vec(params.numRegSrc, Bool()))
815db4956bSzhanglyGit  val srcCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
820f55a0d3SHaojin Tang  val srcLoadCancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
835db4956bSzhanglyGit  val srcWakeUpByIQVec = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
84af4bd265SzhanglyGit  val srcWakeUpByIQWithoutCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
85af4bd265SzhanglyGit  val srcWakeUpButCancel = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
86af4bd265SzhanglyGit  val srcWakeUpL1ExuOHOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH())))
87af4bd265SzhanglyGit  val srcLoadDependencyOut = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))))
880f55a0d3SHaojin Tang  val wakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
890f55a0d3SHaojin Tang  val shiftedWakeupLoadDependencyByIQVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
90af4bd265SzhanglyGit  val shiftedWakeupLoadDependencyByIQBypassVec = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
9189740385Ssinsanction  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Bool())))
925db4956bSzhanglyGit
93aa2b5219Ssinsanction  val currentStatus = Wire(new Status())
94aa2b5219Ssinsanction  val enqDelaySrcState = Wire(Vec(params.numRegSrc, SrcState()))
95aa2b5219Ssinsanction  val enqDelayDataSources = Wire(Vec(params.numRegSrc, DataSource()))
96aa2b5219Ssinsanction  val enqDelaySrcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, ExuOH())))
97aa2b5219Ssinsanction  val enqDelaySrcTimer = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, UInt(3.W))))
98aa2b5219Ssinsanction  val enqDelaySrcLoadDependency = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))))
99aa2b5219Ssinsanction
100aa2b5219Ssinsanction  val enqDelaySrcWakeUpByWB: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState()))
101aa2b5219Ssinsanction  val enqDelaySrcWakeUpByIQ: Vec[UInt] = Wire(Vec(params.numRegSrc, SrcState()))
102aa2b5219Ssinsanction  val enqDelaySrcWakeUpByIQVec: Vec[Vec[Bool]] = Wire(Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))
103aa2b5219Ssinsanction  val enqDelayShiftedWakeupLoadDependencyByIQVec: Vec[Vec[UInt]] = Wire(Vec(params.numWakeupFromIQ, Vec(LoadPipelineWidth, UInt(3.W))))
104aa2b5219Ssinsanction
1055db4956bSzhanglyGit  //Reg
1065db4956bSzhanglyGit  validReg := validRegNext
1075db4956bSzhanglyGit  entryReg := entryRegNext
108aa2b5219Ssinsanction  enqDelayValidReg := enqDelayValidRegNext
1095db4956bSzhanglyGit
1105db4956bSzhanglyGit  //Wire
1115db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
1125db4956bSzhanglyGit    validRegNext := true.B
1135db4956bSzhanglyGit  }.elsewhen(clear) {
1145db4956bSzhanglyGit    validRegNext := false.B
1155db4956bSzhanglyGit  }.otherwise {
1165db4956bSzhanglyGit    validRegNext := validReg
1175db4956bSzhanglyGit  }
1185db4956bSzhanglyGit
1195db4956bSzhanglyGit  when(io.enq.valid && enqReady) {
1205db4956bSzhanglyGit    entryRegNext := io.enq.bits
1215db4956bSzhanglyGit  }.otherwise {
1225db4956bSzhanglyGit    entryRegNext := entryUpdate
1235db4956bSzhanglyGit  }
1245db4956bSzhanglyGit
125aa2b5219Ssinsanction  when(io.enq.valid && enqReady) {
126aa2b5219Ssinsanction    enqDelayValidRegNext := true.B
127aa2b5219Ssinsanction  }.otherwise {
128aa2b5219Ssinsanction    enqDelayValidRegNext := false.B
129aa2b5219Ssinsanction  }
130aa2b5219Ssinsanction
1315db4956bSzhanglyGit  enqReady := !validReg || clear
1325db4956bSzhanglyGit  clear := flushed || io.transSel || deqSuccess
1335db4956bSzhanglyGit  flushed := entryReg.status.robIdx.needFlush(io.flush)
1340f55a0d3SHaojin Tang  deqSuccess := io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.fuIdle && !srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B)
135aa2b5219Ssinsanction
136aa2b5219Ssinsanction  // current wakeup
137af4bd265SzhanglyGit  srcWakeUpByWB := io.wakeUpFromWB.map(bundle => bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)).transpose.map(x => VecInit(x.toSeq).asUInt.orR).toSeq
138af4bd265SzhanglyGit  srcWakeUp := srcWakeUpByWB.zip(srcWakeUpByIQVec).map { case (x, y) => x || y.asUInt.orR }
1395db4956bSzhanglyGit
1400f55a0d3SHaojin Tang  shiftedWakeupLoadDependencyByIQVec
1410f55a0d3SHaojin Tang    .zip(wakeupLoadDependencyByIQVec)
1420f55a0d3SHaojin Tang    .zip(params.wakeUpInExuSources.map(_.name)).foreach {
1430f55a0d3SHaojin Tang    case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach {
1440f55a0d3SHaojin Tang      case ((dep, originalDep), deqPortIdx) =>
145a9ffe60aSHaojin Tang        if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx)
146af4bd265SzhanglyGit          dep := (originalDep << 2).asUInt | 2.U
1470f55a0d3SHaojin Tang        else
1480f55a0d3SHaojin Tang          dep := originalDep << 1
1490f55a0d3SHaojin Tang    }
1500f55a0d3SHaojin Tang  }
151af4bd265SzhanglyGit  shiftedWakeupLoadDependencyByIQBypassVec
152af4bd265SzhanglyGit    .zip(wakeupLoadDependencyByIQVec)
153af4bd265SzhanglyGit    .zip(params.wakeUpInExuSources.map(_.name)).foreach {
154af4bd265SzhanglyGit    case ((deps, originalDeps), name) => deps.zip(originalDeps).zipWithIndex.foreach {
155af4bd265SzhanglyGit      case ((dep, originalDep), deqPortIdx) =>
156aa2b5219Ssinsanction        if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx)
157af4bd265SzhanglyGit          dep := (originalDep << 1).asUInt | 1.U
158af4bd265SzhanglyGit        else
159af4bd265SzhanglyGit          dep := originalDep
160af4bd265SzhanglyGit    }
161af4bd265SzhanglyGit  }
1620f55a0d3SHaojin Tang
1635db4956bSzhanglyGit  if (params.hasIQWakeUp) {
1647cbafe1aSzhanglyGit    srcCancelVec.get.zip(srcLoadCancelVec.get).zip(srcWakeUpByIQWithoutCancel).zipWithIndex.foreach { case (((srcCancel, srcLoadCancel), wakeUpByIQVec), srcIdx) =>
165e08589a5Ssinsanction      val ldTransCancel = Mux1H(wakeUpByIQVec, wakeupLoadDependencyByIQVec.map(dep => LoadShouldCancel(Some(dep), io.ldCancel)))
166aa2b5219Ssinsanction      srcLoadCancel := LoadShouldCancel(currentStatus.srcLoadDependency.map(_(srcIdx)), io.ldCancel)
167af4bd265SzhanglyGit      srcCancel := srcLoadCancel || ldTransCancel
1685db4956bSzhanglyGit    }
1695db4956bSzhanglyGit  }
1705db4956bSzhanglyGit
1715db4956bSzhanglyGit  if (io.wakeUpFromIQ.isEmpty) {
1725db4956bSzhanglyGit    srcWakeUpByIQVec := 0.U.asTypeOf(srcWakeUpByIQVec)
1730f55a0d3SHaojin Tang    wakeupLoadDependencyByIQVec := 0.U.asTypeOf(wakeupLoadDependencyByIQVec)
1745db4956bSzhanglyGit  } else {
1755db4956bSzhanglyGit    val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.wakeUpFromIQ.map((bundle: ValidIO[IssueQueueIQWakeUpBundle]) =>
1765db4956bSzhanglyGit      bundle.bits.wakeUp(entryReg.status.psrc zip entryReg.status.srcType, bundle.valid)
17783ba63b3SXuan Hu    ).toIndexedSeq.transpose
178*acf41503Ssinsanction    val cancelSel = params.wakeUpSourceExuIdx.map(io.og0Cancel(_))
179af4bd265SzhanglyGit    srcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel }))
180af4bd265SzhanglyGit    srcWakeUpButCancel := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && cancel }))
181af4bd265SzhanglyGit    srcWakeUpByIQWithoutCancel := wakeupVec.map(x => VecInit(x))
18283ba63b3SXuan Hu    wakeupLoadDependencyByIQVec := io.wakeUpFromIQ.map(_.bits.loadDependency).toSeq
1835db4956bSzhanglyGit  }
1845db4956bSzhanglyGit
185aa2b5219Ssinsanction  // enq delay wakeup
186aa2b5219Ssinsanction  enqDelaySrcWakeUpByWB.zipWithIndex.foreach { case (wakeup, i) =>
187aa2b5219Ssinsanction    wakeup := io.enqDelayWakeUpFromWB.map(x => x.bits.wakeUp(Seq((entryReg.status.psrc(i), entryReg.status.srcType(i))), x.valid).head
188aa2b5219Ssinsanction    ).reduce(_ || _)
189aa2b5219Ssinsanction  }
190aa2b5219Ssinsanction
191aa2b5219Ssinsanction  if (params.hasIQWakeUp) {
192aa2b5219Ssinsanction    val wakeupVec: IndexedSeq[IndexedSeq[Bool]] = io.enqDelayWakeUpFromIQ.map( x =>
193aa2b5219Ssinsanction      x.bits.wakeUp(entryReg.status.psrc.zip(entryReg.status.srcType), x.valid)
194aa2b5219Ssinsanction    ).toIndexedSeq.transpose
195*acf41503Ssinsanction    val cancelSel = params.wakeUpSourceExuIdx.map(io.enqDelayOg0Cancel(_))
196aa2b5219Ssinsanction    enqDelaySrcWakeUpByIQVec := wakeupVec.map(x => VecInit(x.zip(cancelSel).map { case (wakeup, cancel) => wakeup && !cancel }))
197aa2b5219Ssinsanction  } else {
198aa2b5219Ssinsanction    enqDelaySrcWakeUpByIQVec := 0.U.asTypeOf(enqDelaySrcWakeUpByIQVec)
199aa2b5219Ssinsanction  }
200aa2b5219Ssinsanction
201aa2b5219Ssinsanction  if (params.hasIQWakeUp) {
202aa2b5219Ssinsanction    enqDelaySrcWakeUpByIQ.zipWithIndex.foreach { case (wakeup, i) =>
203aa2b5219Ssinsanction      val ldTransCancel = Mux1H(enqDelaySrcWakeUpByIQVec(i), io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency).map(dp => LoadShouldCancel(Some(dp), io.enqDelayLdCancel)).toSeq)
204aa2b5219Ssinsanction      wakeup := enqDelaySrcWakeUpByIQVec(i).asUInt.orR && !ldTransCancel
205aa2b5219Ssinsanction    }
206aa2b5219Ssinsanction  } else {
207aa2b5219Ssinsanction    enqDelaySrcWakeUpByIQ := 0.U.asTypeOf(enqDelaySrcWakeUpByIQ)
208aa2b5219Ssinsanction  }
209aa2b5219Ssinsanction
210aa2b5219Ssinsanction  enqDelayShiftedWakeupLoadDependencyByIQVec.zip(io.enqDelayWakeUpFromIQ.map(_.bits.loadDependency))
211aa2b5219Ssinsanction    .zip(params.wakeUpInExuSources.map(_.name)).foreach { case ((dps, ldps), name) =>
212aa2b5219Ssinsanction    dps.zip(ldps).zipWithIndex.foreach { case ((dp, ldp), deqPortIdx) =>
213aa2b5219Ssinsanction      if (params.backendParam.getLdExuIdx(params.backendParam.allExuParams.find(_.name == name).get) == deqPortIdx)
214aa2b5219Ssinsanction        dp := (ldp << 2).asUInt | 2.U
215aa2b5219Ssinsanction      else
216aa2b5219Ssinsanction        dp := ldp << 1
217aa2b5219Ssinsanction    }
218aa2b5219Ssinsanction  }
219aa2b5219Ssinsanction
220aa2b5219Ssinsanction  for (i <- 0 until params.numRegSrc) {
221aa2b5219Ssinsanction    enqDelaySrcState(i) := entryReg.status.srcState(i) | enqDelaySrcWakeUpByWB(i) | enqDelaySrcWakeUpByIQ(i)
222aa2b5219Ssinsanction    enqDelayDataSources(i).value := Mux(enqDelaySrcWakeUpByIQ(i).asBool, DataSource.bypass, DataSource.reg)
223aa2b5219Ssinsanction    if (params.hasIQWakeUp) {
224aa2b5219Ssinsanction      val wakeUpValid = enqDelaySrcWakeUpByIQVec(i).asUInt.orR
225aa2b5219Ssinsanction      val wakeUpOH = enqDelaySrcWakeUpByIQVec(i)
226*acf41503Ssinsanction      enqDelaySrcWakeUpL1ExuOH.get(i) := Mux1H(wakeUpOH, params.wakeUpSourceExuIdx.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W)).toSeq)
227aa2b5219Ssinsanction      enqDelaySrcTimer.get(i) := Mux(wakeUpValid, 2.U, 3.U)
22813551487SzhanglyGit      enqDelaySrcLoadDependency.get(i) := Mux(wakeUpValid, Mux1H(wakeUpOH, enqDelayShiftedWakeupLoadDependencyByIQVec), entryReg.status.srcLoadDependency.get(i))
229aa2b5219Ssinsanction    }
230aa2b5219Ssinsanction  }
231aa2b5219Ssinsanction  currentStatus := entryReg.status
232aa2b5219Ssinsanction  when (enqDelayValidReg) {
233aa2b5219Ssinsanction    currentStatus.srcState := enqDelaySrcState
234aa2b5219Ssinsanction    currentStatus.dataSources := enqDelayDataSources
235aa2b5219Ssinsanction    currentStatus.srcTimer.foreach(_ := enqDelaySrcTimer.get)
236aa2b5219Ssinsanction    currentStatus.srcLoadDependency.foreach(_ := enqDelaySrcLoadDependency.get)
237aa2b5219Ssinsanction  }
238aa2b5219Ssinsanction
239*acf41503Ssinsanction  if (params.hasIQWakeUp) {
240*acf41503Ssinsanction    currentStatus.srcWakeUpL1ExuOH.get.zip(entryReg.status.srcWakeUpL1ExuOH.get).zip(enqDelaySrcWakeUpL1ExuOH.get).foreach {
241*acf41503Ssinsanction      case ((currExuOH, regExuOH), enqDelayExuOH) =>
242*acf41503Ssinsanction        currExuOH := 0.U.asTypeOf(currExuOH)
243*acf41503Ssinsanction        params.wakeUpSourceExuIdx.foreach(x => currExuOH(x) := Mux(enqDelayValidReg, enqDelayExuOH(x), regExuOH(x)))
244*acf41503Ssinsanction    }
245*acf41503Ssinsanction  }
246*acf41503Ssinsanction
2475db4956bSzhanglyGit  //entryUpdate
248aa2b5219Ssinsanction  entryUpdate.status.srcState.zip(currentStatus.srcState).zip(srcWakeUp).zipWithIndex.foreach { case (((stateNext, state), wakeup), srcIdx) =>
2495db4956bSzhanglyGit    val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B)
2505db4956bSzhanglyGit    stateNext := Mux(cancel, false.B, wakeup | state)
25189740385Ssinsanction    if (params.hasIQWakeUp) {
25289740385Ssinsanction      cancelVec.get(srcIdx) := cancel
25389740385Ssinsanction    }
2545db4956bSzhanglyGit  }
255aa2b5219Ssinsanction  entryUpdate.status.dataSources.zip(srcWakeUpByIQVec).foreach {
256aa2b5219Ssinsanction    case (dataSourceNext: DataSource, wakeUpByIQOH: Vec[Bool]) =>
2575db4956bSzhanglyGit      when(wakeUpByIQOH.asUInt.orR) {
2585db4956bSzhanglyGit        dataSourceNext.value := DataSource.bypass
2595db4956bSzhanglyGit      }.otherwise {
2605db4956bSzhanglyGit        dataSourceNext.value := DataSource.reg
2615db4956bSzhanglyGit      }
2625db4956bSzhanglyGit  }
2635db4956bSzhanglyGit  if (params.hasIQWakeUp) {
2640f55a0d3SHaojin Tang    entryUpdate.status.srcWakeUpL1ExuOH.get.zip(srcWakeUpByIQVec).zip(srcWakeUp).zipWithIndex.foreach {
2657a96cc7fSHaojin Tang      case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) =>
266*acf41503Ssinsanction        val origExuOH = 0.U.asTypeOf(exuOH)
2675db4956bSzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
268*acf41503Ssinsanction          origExuOH := Mux1H(wakeUpByIQOH, params.wakeUpSourceExuIdx.toSeq.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W)))
2690f55a0d3SHaojin Tang        }.elsewhen(wakeUp) {
270*acf41503Ssinsanction          origExuOH := 0.U.asTypeOf(origExuOH)
2715db4956bSzhanglyGit        }.otherwise {
272*acf41503Ssinsanction          origExuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx)
2735db4956bSzhanglyGit        }
274*acf41503Ssinsanction        exuOH := 0.U.asTypeOf(exuOH)
275*acf41503Ssinsanction        params.wakeUpSourceExuIdx.foreach(x => exuOH(x) := origExuOH(x))
2765db4956bSzhanglyGit    }
277af4bd265SzhanglyGit    srcWakeUpL1ExuOHOut.get.zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).zipWithIndex.foreach {
278af4bd265SzhanglyGit      case (((exuOH: UInt, wakeUpByIQOH: Vec[Bool]), wakeUp: Bool), srcIdx) =>
279*acf41503Ssinsanction        val origExuOH = 0.U.asTypeOf(exuOH)
280af4bd265SzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
281*acf41503Ssinsanction          origExuOH := Mux1H(wakeUpByIQOH, params.wakeUpSourceExuIdx.map(x => MathUtils.IntToOH(x).U(backendParams.numExu.W)).toSeq)
282af4bd265SzhanglyGit        }.otherwise {
283*acf41503Ssinsanction          origExuOH := currentStatus.srcWakeUpL1ExuOH.get(srcIdx)
284af4bd265SzhanglyGit        }
285*acf41503Ssinsanction        exuOH := 0.U.asTypeOf(exuOH)
286*acf41503Ssinsanction        params.wakeUpSourceExuIdx.foreach(x => exuOH(x) := origExuOH(x))
287af4bd265SzhanglyGit    }
288aa2b5219Ssinsanction    entryUpdate.status.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQVec).zipWithIndex.foreach {
2895db4956bSzhanglyGit      case (((srcIssuedTimerNext, srcIssuedTimer), wakeUpByIQOH: Vec[Bool]), srcIdx) =>
290af4bd265SzhanglyGit        srcIssuedTimerNext := MuxCase(3.U, Seq(
2915db4956bSzhanglyGit          // T0: waked up by IQ, T1: reset timer as 1
292af4bd265SzhanglyGit          wakeUpByIQOH.asUInt.orR -> 2.U,
2935db4956bSzhanglyGit          // do not overflow
2945db4956bSzhanglyGit          srcIssuedTimer.andR -> srcIssuedTimer,
2950f55a0d3SHaojin Tang          // T2+: increase if the entry is valid, the src is ready, and the src is woken up by iq
296aa2b5219Ssinsanction          (validReg && SrcState.isReady(currentStatus.srcState(srcIdx)) && currentStatus.srcWakeUpL1ExuOH.get.asUInt.orR) -> (srcIssuedTimer + 1.U)
2975db4956bSzhanglyGit        ))
2985db4956bSzhanglyGit    }
299aa2b5219Ssinsanction    entryUpdate.status.srcLoadDependency.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
3000f55a0d3SHaojin Tang      case (((loadDependencyNext, loadDependency), wakeUpByIQVec), wakeup) =>
3010f55a0d3SHaojin Tang        loadDependencyNext :=
3020f55a0d3SHaojin Tang          Mux(wakeup,
303e08589a5Ssinsanction            Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQVec),
3040f55a0d3SHaojin Tang            Mux(validReg && loadDependency.asUInt.orR, VecInit(loadDependency.map(i => i(i.getWidth - 2, 0) << 1)), loadDependency)
3050f55a0d3SHaojin Tang          )
3060f55a0d3SHaojin Tang    }
307aa2b5219Ssinsanction    srcLoadDependencyOut.get.zip(currentStatus.srcLoadDependency.get).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
308af4bd265SzhanglyGit      case (((loadDependencyOut, loadDependency), wakeUpByIQVec), wakeup) =>
3097cbafe1aSzhanglyGit        loadDependencyOut := Mux1H(wakeUpByIQVec, shiftedWakeupLoadDependencyByIQBypassVec)
310af4bd265SzhanglyGit    }
3115db4956bSzhanglyGit  }
312e08589a5Ssinsanction
3135db4956bSzhanglyGit  when(io.deqSel) {
314ea159d42Ssinsanction    entryUpdate.status.issueTimer := 0.U
3155db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := io.deqPortIdxWrite
3165db4956bSzhanglyGit  }.elsewhen(entryReg.status.issued){
3175db4956bSzhanglyGit    entryUpdate.status.issueTimer := entryReg.status.issueTimer + 1.U
3185db4956bSzhanglyGit    entryUpdate.status.deqPortIdx := entryReg.status.deqPortIdx
319e08589a5Ssinsanction  }.otherwise {
320e08589a5Ssinsanction    entryUpdate.status.issueTimer := "b10".U
321e08589a5Ssinsanction    entryUpdate.status.deqPortIdx := 0.U
3225db4956bSzhanglyGit  }
3235db4956bSzhanglyGit  entryUpdate.status.psrc := entryReg.status.psrc
3245db4956bSzhanglyGit  entryUpdate.status.srcType := entryReg.status.srcType
3255db4956bSzhanglyGit  entryUpdate.status.fuType := entryReg.status.fuType
3265db4956bSzhanglyGit  entryUpdate.status.robIdx := entryReg.status.robIdx
327af4bd265SzhanglyGit  when(srcLoadCancelVec.map(_.reduce(_ || _)).getOrElse(false.B) || srcWakeUpButCancel.map(_.fold(false.B)(_ || _)).fold(false.B)(_ || _)) {
3280f55a0d3SHaojin Tang    entryUpdate.status.issued := false.B
329ea159d42Ssinsanction  }.elsewhen(io.deqSel) {
3305db4956bSzhanglyGit    entryUpdate.status.issued := true.B
331ea159d42Ssinsanction  }.elsewhen(io.issueResp.valid && RSFeedbackType.isBlocked(io.issueResp.bits.respType)) {
3325db4956bSzhanglyGit    entryUpdate.status.issued := false.B
333aa2b5219Ssinsanction  }.elsewhen(!currentStatus.srcReady) {
334af4bd265SzhanglyGit    entryUpdate.status.issued := false.B
335e08589a5Ssinsanction  }.otherwise {
336e08589a5Ssinsanction    entryUpdate.status.issued := entryReg.status.issued
3375db4956bSzhanglyGit  }
3385db4956bSzhanglyGit  entryUpdate.status.firstIssue := io.deqSel || entryReg.status.firstIssue
3395db4956bSzhanglyGit  entryUpdate.status.blocked := false.B //todo
3405db4956bSzhanglyGit  //remain imm and payload
341520f7dacSsinsanction  entryUpdate.imm.foreach(_ := entryReg.imm.get)
3425db4956bSzhanglyGit  entryUpdate.payload := entryReg.payload
343aa2b5219Ssinsanction
344aa2b5219Ssinsanction  //output
345aa2b5219Ssinsanction  val canIssue = currentStatus.canIssue && validReg && !srcCancelVec.getOrElse(false.B).asUInt.orR
346af4bd265SzhanglyGit  val canIssueBypass = validReg && !entryReg.status.issued && !entryReg.status.blocked &&
347aa2b5219Ssinsanction    VecInit(currentStatus.srcState.zip(srcWakeUpByIQWithoutCancel).zipWithIndex.map { case ((state, wakeupVec), srcIdx) =>
348af4bd265SzhanglyGit      val cancel = srcCancelVec.map(_ (srcIdx)).getOrElse(false.B)
349af4bd265SzhanglyGit      Mux(cancel, false.B, wakeupVec.asUInt.orR | state)
350af4bd265SzhanglyGit    }).asUInt.andR
351aa2b5219Ssinsanction  io.dataSource.zip(currentStatus.dataSources).zip(srcWakeUpByIQVec).zip(srcWakeUp).foreach {
352af4bd265SzhanglyGit    case (((dataSourceOut: DataSource, dataSource: DataSource), wakeUpByIQOH: Vec[Bool]), wakeUpAll) =>
353af4bd265SzhanglyGit      when(wakeUpByIQOH.asUInt.orR) {
354af4bd265SzhanglyGit        dataSourceOut.value := DataSource.forward
355af4bd265SzhanglyGit      }.otherwise {
356af4bd265SzhanglyGit        dataSourceOut.value := dataSource.value
357af4bd265SzhanglyGit      }
358af4bd265SzhanglyGit  }
359af4bd265SzhanglyGit  if (params.hasIQWakeUp) {
360aa2b5219Ssinsanction    io.srcTimer.get.zip(currentStatus.srcTimer.get).zip(srcWakeUpByIQWithoutCancel).zip(srcWakeUp).foreach {
361af4bd265SzhanglyGit      case (((srcTimerOut, srcTimer), wakeUpByIQOH: Vec[Bool]), wakeUpAll) =>
362af4bd265SzhanglyGit        when(wakeUpByIQOH.asUInt.orR) {
363af4bd265SzhanglyGit          srcTimerOut := 1.U
364af4bd265SzhanglyGit        }.otherwise {
365af4bd265SzhanglyGit          srcTimerOut := srcTimer
366af4bd265SzhanglyGit        }
367af4bd265SzhanglyGit    }
368aa2b5219Ssinsanction    io.srcWakeUpL1ExuOH.get := Mux(canIssueBypass && !canIssue, srcWakeUpL1ExuOHOut.get, currentStatus.srcWakeUpL1ExuOH.get)
369af4bd265SzhanglyGit  }
370e08589a5Ssinsanction  io.transEntry.valid := validReg && !flushed && !deqSuccess
3715db4956bSzhanglyGit  io.transEntry.bits := entryUpdate
37259f958d4SzhanglyGit  io.canIssue := (canIssue || canIssueBypass) && !flushed
3735db4956bSzhanglyGit  io.clear := clear
3745db4956bSzhanglyGit  io.fuType := entryReg.status.fuType
3755db4956bSzhanglyGit  io.valid := validReg
3765db4956bSzhanglyGit  io.isFirstIssue := !entryReg.status.firstIssue
3775db4956bSzhanglyGit  io.entry.valid := validReg
3785db4956bSzhanglyGit  io.entry.bits := entryReg
379aa2b5219Ssinsanction  io.entry.bits.status := currentStatus
380aa2b5219Ssinsanction  io.entry.bits.status.srcLoadDependency.foreach(_ := Mux(canIssueBypass && !canIssue, srcLoadDependencyOut.get, currentStatus.srcLoadDependency.get))
3815db4956bSzhanglyGit  io.robIdx := entryReg.status.robIdx
3822d270511Ssinsanction  io.uopIdx.foreach(_ := entryReg.status.uopIdx.get)
383ea159d42Ssinsanction  io.issueTimerRead := entryReg.status.issueTimer
384ea159d42Ssinsanction  io.deqPortIdxRead := entryReg.status.deqPortIdx
38589740385Ssinsanction  io.cancel.foreach(_ := cancelVec.get.asUInt.orR)
3865db4956bSzhanglyGit}
3875db4956bSzhanglyGit
3885db4956bSzhanglyGitclass EnqEntryMem()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry
3895db4956bSzhanglyGit  with HasCircularQueuePtrHelper {
3905db4956bSzhanglyGit  val fromMem = io.fromMem.get
3915db4956bSzhanglyGit
3925db4956bSzhanglyGit  val memStatus = entryReg.status.mem.get
3935db4956bSzhanglyGit  println("memStatus" + memStatus)
3945db4956bSzhanglyGit  val memStatusNext = entryRegNext.status.mem.get
3955db4956bSzhanglyGit  val memStatusUpdate = entryUpdate.status.mem.get
3965db4956bSzhanglyGit
3975db4956bSzhanglyGit  // load cannot be issued before older store, unless meet some condition
3985db4956bSzhanglyGit  val blockedByOlderStore = isAfter(memStatusNext.sqIdx, fromMem.stIssuePtr)
3995db4956bSzhanglyGit
4005db4956bSzhanglyGit  val deqFailedForStdInvalid = io.issueResp.valid && io.issueResp.bits.respType === RSFeedbackType.dataInvalid
4015db4956bSzhanglyGit
4025db4956bSzhanglyGit  val staWaitedReleased = Cat(
40306083203SHaojin Tang    fromMem.memWaitUpdateReq.robIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForRobIdx.value)
4045db4956bSzhanglyGit  ).orR
4055db4956bSzhanglyGit  val stdWaitedReleased = Cat(
40606083203SHaojin Tang    fromMem.memWaitUpdateReq.sqIdx.map(x => x.valid && x.bits.value === memStatusNext.waitForSqIdx.value)
4075db4956bSzhanglyGit  ).orR
4085db4956bSzhanglyGit  val olderStaNotViolate = staWaitedReleased && !memStatusNext.strictWait
4095db4956bSzhanglyGit  val olderStdReady = stdWaitedReleased && memStatusNext.waitForStd
4105db4956bSzhanglyGit  val waitStd = !olderStdReady
4115db4956bSzhanglyGit  val waitSta = !olderStaNotViolate
4125db4956bSzhanglyGit
4135db4956bSzhanglyGit  when (io.enq.valid && enqReady) {
4145db4956bSzhanglyGit    memStatusNext.waitForSqIdx := io.enq.bits.status.mem.get.waitForSqIdx
4155db4956bSzhanglyGit    // update by lfst at dispatch stage
4165db4956bSzhanglyGit    memStatusNext.waitForRobIdx := io.enq.bits.status.mem.get.waitForRobIdx
4175db4956bSzhanglyGit    // new load inst don't known if it is blocked by store data ahead of it
4185db4956bSzhanglyGit    memStatusNext.waitForStd := false.B
4195db4956bSzhanglyGit    // update by ssit at rename stage
4205db4956bSzhanglyGit    memStatusNext.strictWait := io.enq.bits.status.mem.get.strictWait
4215db4956bSzhanglyGit    memStatusNext.sqIdx := io.enq.bits.status.mem.get.sqIdx
4225db4956bSzhanglyGit  }.otherwise {
4235db4956bSzhanglyGit    memStatusNext := memStatusUpdate
4245db4956bSzhanglyGit  }
4255db4956bSzhanglyGit
4265db4956bSzhanglyGit  when(deqFailedForStdInvalid) {
4275db4956bSzhanglyGit    memStatusUpdate.waitForSqIdx := io.issueResp.bits.dataInvalidSqIdx
4285db4956bSzhanglyGit    memStatusUpdate.waitForRobIdx := memStatus.waitForRobIdx
4295db4956bSzhanglyGit    memStatusUpdate.waitForStd := true.B
4305db4956bSzhanglyGit    memStatusUpdate.strictWait := memStatus.strictWait
4315db4956bSzhanglyGit    memStatusUpdate.sqIdx := memStatus.sqIdx
4325db4956bSzhanglyGit  }.otherwise {
4335db4956bSzhanglyGit    memStatusUpdate := memStatus
4345db4956bSzhanglyGit  }
4355db4956bSzhanglyGit
4365db4956bSzhanglyGit  val shouldBlock = Mux(io.enq.valid && enqReady, io.enq.bits.status.blocked, entryReg.status.blocked)
4375db4956bSzhanglyGit  val blockNotReleased = waitStd || waitSta
4385db4956bSzhanglyGit  val respBlock = deqFailedForStdInvalid
4395db4956bSzhanglyGit  entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
4405db4956bSzhanglyGit  entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock
4415db4956bSzhanglyGit
4425db4956bSzhanglyGit}
4435db4956bSzhanglyGit
4442d270511Ssinsanctionclass EnqEntryVecMemAddr()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntryMem {
4452d270511Ssinsanction
4462d270511Ssinsanction  require(params.isVecMemAddrIQ, "EnqEntryVecMemAddr can only be instance of VecMemAddr IQ")
4472d270511Ssinsanction
4482d270511Ssinsanction  val vecMemStatus = entryReg.status.vecMem.get
4492d270511Ssinsanction  val vecMemStatusNext = entryRegNext.status.vecMem.get
4502d270511Ssinsanction  val vecMemStatusUpdate = entryUpdate.status.vecMem.get
4512d270511Ssinsanction  val fromLsq = io.fromLsq.get
4522d270511Ssinsanction
4532d270511Ssinsanction  when (io.enq.valid && enqReady) {
4542d270511Ssinsanction    vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx
4552d270511Ssinsanction    vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx
4562d270511Ssinsanction  }.otherwise {
4572d270511Ssinsanction    vecMemStatusNext := vecMemStatusUpdate
4582d270511Ssinsanction  }
4592d270511Ssinsanction  vecMemStatusUpdate := vecMemStatus
4602d270511Ssinsanction
4612d270511Ssinsanction  val isLsqHead = {
46229b863e5Szhanglinjuan    // if (params.isVecLdAddrIQ)
46331c1fcd8Szhanglinjuan      entryRegNext.status.vecMem.get.lqIdx <= fromLsq.lqDeqPtr &&
46429b863e5Szhanglinjuan    // else
46531c1fcd8Szhanglinjuan      entryRegNext.status.vecMem.get.sqIdx <= fromLsq.sqDeqPtr
4662d270511Ssinsanction  }
4672d270511Ssinsanction
4682d270511Ssinsanction  entryRegNext.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead
4692d270511Ssinsanction  entryUpdate.status.blocked := shouldBlock && blockNotReleased && blockedByOlderStore || respBlock || !isLsqHead
47044d24a97SXuan Hu  entryUpdate.status.uopIdx.get := entryReg.status.uopIdx.get
4712d270511Ssinsanction}
4722d270511Ssinsanction
4732d270511Ssinsanctionclass EnqEntryVecMemData()(implicit p: Parameters, params: IssueBlockParams) extends EnqEntry
4742d270511Ssinsanction  with HasCircularQueuePtrHelper {
4752d270511Ssinsanction
4762d270511Ssinsanction  require(params.isVecStDataIQ, "EnqEntryVecMemData can only be instance of VecMemData IQ")
4772d270511Ssinsanction
4782d270511Ssinsanction  val vecMemStatus = entryReg.status.vecMem.get
4792d270511Ssinsanction  val vecMemStatusNext = entryRegNext.status.vecMem.get
4802d270511Ssinsanction  val vecMemStatusUpdate = entryUpdate.status.vecMem.get
4812d270511Ssinsanction  val fromLsq = io.fromLsq.get
4822d270511Ssinsanction
4832d270511Ssinsanction  when (io.enq.valid && enqReady) {
4842d270511Ssinsanction    vecMemStatusNext.sqIdx := io.enq.bits.status.vecMem.get.sqIdx
4852d270511Ssinsanction    vecMemStatusNext.lqIdx := io.enq.bits.status.vecMem.get.lqIdx
4862d270511Ssinsanction  }.otherwise {
4872d270511Ssinsanction    vecMemStatusNext := vecMemStatusUpdate
4882d270511Ssinsanction  }
4892d270511Ssinsanction  vecMemStatusUpdate := vecMemStatus
4902d270511Ssinsanction
4912d270511Ssinsanction  val isLsqHead = entryRegNext.status.vecMem.get.sqIdx.value === fromLsq.sqDeqPtr.value
4922d270511Ssinsanction
4932d270511Ssinsanction  entryRegNext.status.blocked := !isLsqHead
4942d270511Ssinsanction  entryUpdate.status.blocked := !isLsqHead
49544d24a97SXuan Hu  entryUpdate.status.uopIdx.get := entryReg.status.uopIdx.get
4962d270511Ssinsanction}
4972d270511Ssinsanction
4985db4956bSzhanglyGitobject EnqEntry {
4995db4956bSzhanglyGit  def apply(implicit p: Parameters, iqParams: IssueBlockParams): EnqEntry = {
5005db4956bSzhanglyGit    iqParams.schdType match {
5015db4956bSzhanglyGit      case IntScheduler() => new EnqEntry()
5025db4956bSzhanglyGit      case MemScheduler() =>
50397b279b9SXuan Hu        if (iqParams.isLdAddrIQ || iqParams.isStAddrIQ || iqParams.isHyAddrIQ) new EnqEntryMem()
5042d270511Ssinsanction        else if (iqParams.isVecMemAddrIQ) new EnqEntryVecMemAddr()
5052d270511Ssinsanction        else if (iqParams.isVecStDataIQ) new EnqEntryVecMemData()
5065db4956bSzhanglyGit        else new EnqEntry()
5075db4956bSzhanglyGit      case VfScheduler() => new EnqEntry()
5085db4956bSzhanglyGit      case _ => null
5095db4956bSzhanglyGit    }
5105db4956bSzhanglyGit  }
5115db4956bSzhanglyGit}