xref: /XiangShan/src/main/scala/xiangshan/backend/Bundles.scala (revision 1592abd11eecf7bec0f1453ffe4a7617167f8ba9)
1730cfbc0SXuan Hupackage xiangshan.backend
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util.BitPat.bitPatToUInt
6730cfbc0SXuan Huimport chisel3.util._
739c59369SXuan Huimport utils.BundleUtils.makeValid
8bf44d649SXuan Huimport utils.OptionWrapper
9730cfbc0SXuan Huimport xiangshan._
10730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
11c0be7f33SXuan Huimport xiangshan.backend.datapath.DataSource
1239c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.PregWB
13730cfbc0SXuan Huimport xiangshan.backend.decode.{ImmUnion, XDecode}
14730cfbc0SXuan Huimport xiangshan.backend.exu.ExeUnitParams
15730cfbc0SXuan Huimport xiangshan.backend.fu.FuType
1678dc7ed0SXuan Huimport xiangshan.backend.fu.fpu.Bundles.Frm
1739c59369SXuan Huimport xiangshan.backend.fu.vector.Bundles._
1829dbac5aSsinsanctionimport xiangshan.backend.issue.{IssueBlockParams, IssueQueueDeqRespBundle, SchedulerType}
19aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._
20730cfbc0SXuan Huimport xiangshan.backend.regfile.{RfReadPortWithConfig, RfWritePortWithConfig}
21730cfbc0SXuan Huimport xiangshan.backend.rob.RobPtr
22730cfbc0SXuan Huimport xiangshan.frontend._
23730cfbc0SXuan Huimport xiangshan.mem.{LqPtr, SqPtr}
243952421bSweiding liuimport yunsuan.vector.VIFuParam
2549162c9aSGuanghui Chengimport xiangshan.backend.trace._
26f57d73d6Ssinsanctionimport utility._
27730cfbc0SXuan Hu
28730cfbc0SXuan Huobject Bundles {
290c7ebb58Sxiaofeibao-xjtu  /**
300c7ebb58Sxiaofeibao-xjtu   * Connect Same Name Port like bundleSource := bundleSinkBudle.
310c7ebb58Sxiaofeibao-xjtu   *
320c7ebb58Sxiaofeibao-xjtu   * There is no limit to the number of ports on both sides.
330c7ebb58Sxiaofeibao-xjtu   *
340c7ebb58Sxiaofeibao-xjtu   * Don't forget to connect the remaining ports!
350c7ebb58Sxiaofeibao-xjtu   */
360c7ebb58Sxiaofeibao-xjtu  def connectSamePort (bundleSource: Bundle, bundleSink: Bundle):Unit = {
370c7ebb58Sxiaofeibao-xjtu    bundleSource.elements.foreach { case (name, data) =>
380c7ebb58Sxiaofeibao-xjtu      if (bundleSink.elements.contains(name))
390c7ebb58Sxiaofeibao-xjtu        data := bundleSink.elements(name)
400c7ebb58Sxiaofeibao-xjtu    }
410c7ebb58Sxiaofeibao-xjtu  }
42730cfbc0SXuan Hu  // frontend -> backend
43730cfbc0SXuan Hu  class StaticInst(implicit p: Parameters) extends XSBundle {
44730cfbc0SXuan Hu    val instr            = UInt(32.W)
45730cfbc0SXuan Hu    val pc               = UInt(VAddrBits.W)
46730cfbc0SXuan Hu    val foldpc           = UInt(MemPredPCWidth.W)
47730cfbc0SXuan Hu    val exceptionVec     = ExceptionVec()
48c1b28b66STang Haojin    val isFetchMalAddr   = Bool()
497e0f64b0SGuanghui Cheng    val trigger          = TriggerAction()
50730cfbc0SXuan Hu    val preDecodeInfo    = new PreDecodeInfo
51730cfbc0SXuan Hu    val pred_taken       = Bool()
52730cfbc0SXuan Hu    val crossPageIPFFix  = Bool()
53730cfbc0SXuan Hu    val ftqPtr           = new FtqPtr
54730cfbc0SXuan Hu    val ftqOffset        = UInt(log2Up(PredictWidth).W)
552a4ac712SEaston Man    val isLastInFtqEntry = Bool()
56*1592abd1SYan Xu    val debug_seqNum     = InstSeqNum()
57730cfbc0SXuan Hu
58730cfbc0SXuan Hu    def connectCtrlFlow(source: CtrlFlow): Unit = {
59730cfbc0SXuan Hu      this.instr            := source.instr
60730cfbc0SXuan Hu      this.pc               := source.pc
61730cfbc0SXuan Hu      this.foldpc           := source.foldpc
62730cfbc0SXuan Hu      this.exceptionVec     := source.exceptionVec
63fbdb359dSMuzi      this.isFetchMalAddr   := source.backendException
64730cfbc0SXuan Hu      this.trigger          := source.trigger
65730cfbc0SXuan Hu      this.preDecodeInfo    := source.pd
66730cfbc0SXuan Hu      this.pred_taken       := source.pred_taken
67730cfbc0SXuan Hu      this.crossPageIPFFix  := source.crossPageIPFFix
68730cfbc0SXuan Hu      this.ftqPtr           := source.ftqPtr
69730cfbc0SXuan Hu      this.ftqOffset        := source.ftqOffset
702a4ac712SEaston Man      this.isLastInFtqEntry := source.isLastInFtqEntry
71*1592abd1SYan Xu      this.debug_seqNum     := source.debug_seqNum
72730cfbc0SXuan Hu    }
73730cfbc0SXuan Hu  }
74730cfbc0SXuan Hu
75730cfbc0SXuan Hu  // StaticInst --[Decode]--> DecodedInst
76730cfbc0SXuan Hu  class DecodedInst(implicit p: Parameters) extends XSBundle {
7798639abbSXuan Hu    def numSrc = backendParams.numSrc
78730cfbc0SXuan Hu    // passed from StaticInst
79730cfbc0SXuan Hu    val instr           = UInt(32.W)
80730cfbc0SXuan Hu    val pc              = UInt(VAddrBits.W)
81730cfbc0SXuan Hu    val foldpc          = UInt(MemPredPCWidth.W)
82730cfbc0SXuan Hu    val exceptionVec    = ExceptionVec()
83c1b28b66STang Haojin    val isFetchMalAddr  = Bool()
847e0f64b0SGuanghui Cheng    val trigger         = TriggerAction()
85730cfbc0SXuan Hu    val preDecodeInfo   = new PreDecodeInfo
86730cfbc0SXuan Hu    val pred_taken      = Bool()
87730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
88730cfbc0SXuan Hu    val ftqPtr          = new FtqPtr
89730cfbc0SXuan Hu    val ftqOffset       = UInt(log2Up(PredictWidth).W)
90730cfbc0SXuan Hu    // decoded
9198639abbSXuan Hu    val srcType         = Vec(numSrc, SrcType())
92ad5c9e6eSJunxiong Ji    val lsrc            = Vec(numSrc, UInt(LogicRegsWidth.W))
93ad5c9e6eSJunxiong Ji    val ldest           = UInt(LogicRegsWidth.W)
94730cfbc0SXuan Hu    val fuType          = FuType()
95730cfbc0SXuan Hu    val fuOpType        = FuOpType()
96730cfbc0SXuan Hu    val rfWen           = Bool()
97730cfbc0SXuan Hu    val fpWen           = Bool()
98730cfbc0SXuan Hu    val vecWen          = Bool()
99e4e68f86Sxiaofeibao    val v0Wen           = Bool()
100e4e68f86Sxiaofeibao    val vlWen           = Bool()
101730cfbc0SXuan Hu    val isXSTrap        = Bool()
102730cfbc0SXuan Hu    val waitForward     = Bool() // no speculate execution
103730cfbc0SXuan Hu    val blockBackward   = Bool()
104730cfbc0SXuan Hu    val flushPipe       = Bool() // This inst will flush all the pipe when commit, like exception but can commit
10589cc69c1STang Haojin    val canRobCompress  = Bool()
106730cfbc0SXuan Hu    val selImm          = SelImm()
107730cfbc0SXuan Hu    val imm             = UInt(ImmUnion.maxLen.W)
108730cfbc0SXuan Hu    val fpu             = new FPUCtrlSignals
109730cfbc0SXuan Hu    val vpu             = new VPUCtrlSignals
11031c51290Szhanglinjuan    val vlsInstr        = Bool()
111bdda74fdSxiaofeibao-xjtu    val wfflags         = Bool()
112730cfbc0SXuan Hu    val isMove          = Bool()
1132c1aaceaSzhanglinjuan    val uopIdx          = UopIdx()
11417ec87f2SXuan Hu    val uopSplitType    = UopSplitType()
115730cfbc0SXuan Hu    val isVset          = Bool()
116d91483a6Sfdy    val firstUop        = Bool()
117d91483a6Sfdy    val lastUop         = Bool()
118f1e8fcb2SXuan Hu    val numUops         = UInt(log2Up(MaxUopSize).W) // rob need this
1193235a9d8SZiyue-Zhang    val numWB           = UInt(log2Up(MaxUopSize).W) // rob need this
120730cfbc0SXuan Hu    val commitType      = CommitType() // Todo: remove it
121689f6b88SsinceforYy    val needFrm         = new NeedFrmBundle
122730cfbc0SXuan Hu
1230c01a27aSHaojin Tang    val debug_fuType    = OptionWrapper(backendParams.debugEn, FuType())
124*1592abd1SYan Xu    val debug_seqNum    = InstSeqNum()
1250c01a27aSHaojin Tang
126730cfbc0SXuan Hu    private def allSignals = srcType.take(3) ++ Seq(fuType, fuOpType, rfWen, fpWen, vecWen,
12789cc69c1STang Haojin      isXSTrap, waitForward, blockBackward, flushPipe, canRobCompress, uopSplitType, selImm)
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu    def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])]): DecodedInst = {
130730cfbc0SXuan Hu      val decoder: Seq[UInt] = ListLookup(
131730cfbc0SXuan Hu        inst, XDecode.decodeDefault.map(bitPatToUInt),
132730cfbc0SXuan Hu        table.map{ case (pat, pats) => (pat, pats.map(bitPatToUInt)) }.toArray
133730cfbc0SXuan Hu      )
134730cfbc0SXuan Hu      allSignals zip decoder foreach { case (s, d) => s := d }
1350c01a27aSHaojin Tang      debug_fuType.foreach(_ := fuType)
136730cfbc0SXuan Hu      this
137730cfbc0SXuan Hu    }
138730cfbc0SXuan Hu
139730cfbc0SXuan Hu    def isSoftPrefetch: Bool = {
140730cfbc0SXuan Hu      fuType === FuType.alu.U && fuOpType === ALUOpType.or && selImm === SelImm.IMM_I && ldest === 0.U
141730cfbc0SXuan Hu    }
142730cfbc0SXuan Hu
143730cfbc0SXuan Hu    def connectStaticInst(source: StaticInst): Unit = {
144730cfbc0SXuan Hu      for ((name, data) <- this.elements) {
145730cfbc0SXuan Hu        if (source.elements.contains(name)) {
146730cfbc0SXuan Hu          data := source.elements(name)
147730cfbc0SXuan Hu        }
148730cfbc0SXuan Hu      }
149730cfbc0SXuan Hu    }
150730cfbc0SXuan Hu  }
151730cfbc0SXuan Hu
15292c61038SXuan Hu  class TrapInstInfo(implicit p: Parameters) extends XSBundle {
153fa16cf81Slewislzh    val instr = UInt(32.W)
15492c61038SXuan Hu    val ftqPtr = new FtqPtr
155fa16cf81Slewislzh    val ftqOffset = UInt(log2Up(PredictWidth).W)
156fa16cf81Slewislzh
15792c61038SXuan Hu    def needFlush(ftqPtr: FtqPtr, ftqOffset: UInt): Bool ={
15892c61038SXuan Hu      val sameFlush = this.ftqPtr === ftqPtr && this.ftqOffset > ftqOffset
15992c61038SXuan Hu      sameFlush || isAfter(this.ftqPtr, ftqPtr)
16092c61038SXuan Hu    }
16192c61038SXuan Hu
16292c61038SXuan Hu    def fromDecodedInst(decodedInst: DecodedInst): this.type = {
16392c61038SXuan Hu      this.instr     := decodedInst.instr
16492c61038SXuan Hu      this.ftqPtr    := decodedInst.ftqPtr
16592c61038SXuan Hu      this.ftqOffset := decodedInst.ftqOffset
16692c61038SXuan Hu      this
167fa16cf81Slewislzh    }
168fa16cf81Slewislzh  }
169fa16cf81Slewislzh
170730cfbc0SXuan Hu  // DecodedInst --[Rename]--> DynInst
171730cfbc0SXuan Hu  class DynInst(implicit p: Parameters) extends XSBundle {
17298639abbSXuan Hu    def numSrc          = backendParams.numSrc
173730cfbc0SXuan Hu    // passed from StaticInst
174730cfbc0SXuan Hu    val instr           = UInt(32.W)
175730cfbc0SXuan Hu    val pc              = UInt(VAddrBits.W)
176730cfbc0SXuan Hu    val foldpc          = UInt(MemPredPCWidth.W)
177730cfbc0SXuan Hu    val exceptionVec    = ExceptionVec()
178c1b28b66STang Haojin    val isFetchMalAddr  = Bool()
1798daac0bfSxiaofeibao-xjtu    val hasException    = Bool()
1807e0f64b0SGuanghui Cheng    val trigger         = TriggerAction()
181730cfbc0SXuan Hu    val preDecodeInfo   = new PreDecodeInfo
182730cfbc0SXuan Hu    val pred_taken      = Bool()
183730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
184730cfbc0SXuan Hu    val ftqPtr          = new FtqPtr
185730cfbc0SXuan Hu    val ftqOffset       = UInt(log2Up(PredictWidth).W)
186730cfbc0SXuan Hu    // passed from DecodedInst
18798639abbSXuan Hu    val srcType         = Vec(numSrc, SrcType())
188ad5c9e6eSJunxiong Ji    val ldest           = UInt(LogicRegsWidth.W)
189730cfbc0SXuan Hu    val fuType          = FuType()
190730cfbc0SXuan Hu    val fuOpType        = FuOpType()
191730cfbc0SXuan Hu    val rfWen           = Bool()
192730cfbc0SXuan Hu    val fpWen           = Bool()
193730cfbc0SXuan Hu    val vecWen          = Bool()
194368cbcecSxiaofeibao    val v0Wen           = Bool()
195368cbcecSxiaofeibao    val vlWen           = Bool()
196730cfbc0SXuan Hu    val isXSTrap        = Bool()
197730cfbc0SXuan Hu    val waitForward     = Bool() // no speculate execution
198730cfbc0SXuan Hu    val blockBackward   = Bool()
199730cfbc0SXuan Hu    val flushPipe       = Bool() // This inst will flush all the pipe when commit, like exception but can commit
20089cc69c1STang Haojin    val canRobCompress  = Bool()
201730cfbc0SXuan Hu    val selImm          = SelImm()
202520f7dacSsinsanction    val imm             = UInt(32.W)
203730cfbc0SXuan Hu    val fpu             = new FPUCtrlSignals
204730cfbc0SXuan Hu    val vpu             = new VPUCtrlSignals
20531c51290Szhanglinjuan    val vlsInstr        = Bool()
206bdda74fdSxiaofeibao-xjtu    val wfflags         = Bool()
207730cfbc0SXuan Hu    val isMove          = Bool()
20841eedc8dSlinzhida    val isDropAmocasSta = Bool()
2092c1aaceaSzhanglinjuan    val uopIdx          = UopIdx()
210730cfbc0SXuan Hu    val isVset          = Bool()
211d91483a6Sfdy    val firstUop        = Bool()
212d91483a6Sfdy    val lastUop         = Bool()
213f1e8fcb2SXuan Hu    val numUops         = UInt(log2Up(MaxUopSize).W) // rob need this
2143235a9d8SZiyue-Zhang    val numWB           = UInt(log2Up(MaxUopSize).W) // rob need this
215730cfbc0SXuan Hu    val commitType      = CommitType()
216730cfbc0SXuan Hu    // rename
21798639abbSXuan Hu    val srcState        = Vec(numSrc, SrcState())
218ec49b127Ssinsanction    val srcLoadDependency  = Vec(numSrc, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))
21998639abbSXuan Hu    val psrc            = Vec(numSrc, UInt(PhyRegIdxWidth.W))
220730cfbc0SXuan Hu    val pdest           = UInt(PhyRegIdxWidth.W)
221955b4beaSsinsanction    // reg cache
222955b4beaSsinsanction    val useRegCache     = Vec(backendParams.numIntRegSrc, Bool())
223955b4beaSsinsanction    val regCacheIdx     = Vec(backendParams.numIntRegSrc, UInt(RegCacheIdxWidth.W))
224730cfbc0SXuan Hu    val robIdx          = new RobPtr
22589cc69c1STang Haojin    val instrSize       = UInt(log2Ceil(RenameWidth + 1).W)
226f1ba628bSHaojin Tang    val dirtyFs         = Bool()
2273af3539fSZiyue Zhang    val dirtyVs         = Bool()
2284907ec88Schengguanghui    val traceBlockInPipe = new TracePipe(IretireWidthInPipe)
229730cfbc0SXuan Hu
230730cfbc0SXuan Hu    val eliminatedMove  = Bool()
231870f462dSXuan Hu    // Take snapshot at this CFI inst
232870f462dSXuan Hu    val snapshot        = Bool()
233730cfbc0SXuan Hu    val debugInfo       = new PerfDebugInfo
234*1592abd1SYan Xu    val debug_seqNum    = InstSeqNum()
235730cfbc0SXuan Hu    val storeSetHit     = Bool() // inst has been allocated an store set
236730cfbc0SXuan Hu    val waitForRobIdx   = new RobPtr // store set predicted previous store robIdx
237730cfbc0SXuan Hu    // Load wait is needed
238730cfbc0SXuan Hu    // load inst will not be executed until former store (predicted by mdp) addr calcuated
239730cfbc0SXuan Hu    val loadWaitBit     = Bool()
240730cfbc0SXuan Hu    // If (loadWaitBit && loadWaitStrict), strict load wait is needed
241730cfbc0SXuan Hu    // load inst will not be executed until ALL former store addr calcuated
242730cfbc0SXuan Hu    val loadWaitStrict  = Bool()
243730cfbc0SXuan Hu    val ssid            = UInt(SSIDWidth.W)
244730cfbc0SXuan Hu    // Todo
245730cfbc0SXuan Hu    val lqIdx = new LqPtr
246730cfbc0SXuan Hu    val sqIdx = new SqPtr
247730cfbc0SXuan Hu    // debug module
248730cfbc0SXuan Hu    val singleStep      = Bool()
249730cfbc0SXuan Hu    // schedule
250730cfbc0SXuan Hu    val replayInst      = Bool()
251730cfbc0SXuan Hu
2520c01a27aSHaojin Tang    val debug_fuType    = OptionWrapper(backendParams.debugEn, FuType())
2530c01a27aSHaojin Tang
2546dbb4e08SXuan Hu    val numLsElem       = NumLsElem()
255f3a9fb05SAnzo
2560c01a27aSHaojin Tang    def getDebugFuType: UInt = debug_fuType.getOrElse(fuType)
2570c01a27aSHaojin Tang
258fe528fd6Ssinsanction    def isLUI: Bool = this.fuType === FuType.alu.U && (this.selImm === SelImm.IMM_U || this.selImm === SelImm.IMM_LUI32)
25940283787Ssinsanction    def isLUI32: Bool = this.selImm === SelImm.IMM_LUI32
260730cfbc0SXuan Hu    def isWFI: Bool = this.fuType === FuType.csr.U && fuOpType === CSROpType.wfi
261730cfbc0SXuan Hu
262730cfbc0SXuan Hu    def isSvinvalBegin(flush: Bool) = FuType.isFence(fuType) && fuOpType === FenceOpType.nofence && !flush
263e1e27da7SXuan Hu    def isSvinval(flush: Bool) = FuType.isFence(fuType) &&
264e1e27da7SXuan Hu      Cat(Seq(FenceOpType.sfence, FenceOpType.hfence_v, FenceOpType.hfence_g).map(_ === fuOpType)).orR && !flush
265730cfbc0SXuan Hu    def isSvinvalEnd(flush: Bool) = FuType.isFence(fuType) && fuOpType === FenceOpType.nofence && flush
26649fd6a7cSXuan Hu    def isNotSvinval = !FuType.isFence(fuType)
267730cfbc0SXuan Hu
268e25e4d90SXuan Hu    def isHls: Bool = {
269e25e4d90SXuan Hu      fuType === FuType.ldu.U && LSUOpType.isHlv(fuOpType) || fuType === FuType.stu.U && LSUOpType.isHsv(fuOpType)
270e25e4d90SXuan Hu    }
271e25e4d90SXuan Hu
27238c29594Szhanglinjuan    def isAMOCAS: Bool = FuType.isAMO(fuType) && LSUOpType.isAMOCAS(fuOpType)
27312861ac7Slinzhida
274730cfbc0SXuan Hu    def srcIsReady: Vec[Bool] = {
275730cfbc0SXuan Hu      VecInit(this.srcType.zip(this.srcState).map {
276730cfbc0SXuan Hu        case (t, s) => SrcType.isNotReg(t) || SrcState.isReady(s)
277730cfbc0SXuan Hu      })
278730cfbc0SXuan Hu    }
279730cfbc0SXuan Hu
280730cfbc0SXuan Hu    def clearExceptions(
281730cfbc0SXuan Hu      exceptionBits: Seq[Int] = Seq(),
282730cfbc0SXuan Hu      flushPipe    : Boolean = false,
283730cfbc0SXuan Hu      replayInst   : Boolean = false
284730cfbc0SXuan Hu    ): DynInst = {
285730cfbc0SXuan Hu      this.exceptionVec.zipWithIndex.filterNot(x => exceptionBits.contains(x._2)).foreach(_._1 := false.B)
286730cfbc0SXuan Hu      if (!flushPipe) { this.flushPipe := false.B }
287730cfbc0SXuan Hu      if (!replayInst) { this.replayInst := false.B }
288730cfbc0SXuan Hu      this
289730cfbc0SXuan Hu    }
290730cfbc0SXuan Hu
2916112d994Sxiaofeibao    def needWriteRf: Bool = rfWen || fpWen || vecWen || v0Wen || vlWen
292730cfbc0SXuan Hu  }
293730cfbc0SXuan Hu
294730cfbc0SXuan Hu  trait BundleSource {
295bf35baadSXuan Hu    var wakeupSource = "undefined"
296bf35baadSXuan Hu    var idx = 0
297730cfbc0SXuan Hu  }
298730cfbc0SXuan Hu
299c0be7f33SXuan Hu  /**
300c0be7f33SXuan Hu    *
301c0be7f33SXuan Hu    * @param pregIdxWidth index width of preg
302c0be7f33SXuan Hu    * @param exuIndices exu indices of wakeup bundle
303c0be7f33SXuan Hu    */
304ec49b127Ssinsanction  sealed abstract class IssueQueueWakeUpBaseBundle(pregIdxWidth: Int, val exuIndices: Seq[Int])(implicit p: Parameters) extends XSBundle {
305730cfbc0SXuan Hu    val rfWen = Bool()
306730cfbc0SXuan Hu    val fpWen = Bool()
307730cfbc0SXuan Hu    val vecWen = Bool()
3086017bdcbSsinsanction    val v0Wen = Bool()
3096017bdcbSsinsanction    val vlWen = Bool()
310bf35baadSXuan Hu    val pdest = UInt(pregIdxWidth.W)
311bf35baadSXuan Hu
312730cfbc0SXuan Hu    /**
313730cfbc0SXuan Hu      * @param successor Seq[(psrc, srcType)]
314730cfbc0SXuan Hu      * @return Seq[if wakeup psrc]
315730cfbc0SXuan Hu      */
316730cfbc0SXuan Hu    def wakeUp(successor: Seq[(UInt, UInt)], valid: Bool): Seq[Bool] = {
317730cfbc0SXuan Hu      successor.map { case (thatPsrc, srcType) =>
318730cfbc0SXuan Hu        val pdestMatch = pdest === thatPsrc
319730cfbc0SXuan Hu        pdestMatch && (
320730cfbc0SXuan Hu          SrcType.isFp(srcType) && this.fpWen ||
321730cfbc0SXuan Hu            SrcType.isXp(srcType) && this.rfWen ||
322730cfbc0SXuan Hu            SrcType.isVp(srcType) && this.vecWen
323730cfbc0SXuan Hu          ) && valid
324730cfbc0SXuan Hu      }
325730cfbc0SXuan Hu    }
3266017bdcbSsinsanction    def wakeUpV0(successor: (UInt, UInt), valid: Bool): Bool = {
3276017bdcbSsinsanction      val (thatPsrc, srcType) = successor
3286017bdcbSsinsanction      val pdestMatch = pdest === thatPsrc
3296017bdcbSsinsanction      pdestMatch && (
3306017bdcbSsinsanction        SrcType.isV0(srcType) && this.v0Wen
3316017bdcbSsinsanction      ) && valid
3326017bdcbSsinsanction    }
3336017bdcbSsinsanction    def wakeUpVl(successor: (UInt, UInt), valid: Bool): Bool = {
3346017bdcbSsinsanction      val (thatPsrc, srcType) = successor
3356017bdcbSsinsanction      val pdestMatch = pdest === thatPsrc
3366017bdcbSsinsanction      pdestMatch && (
3376017bdcbSsinsanction        SrcType.isVp(srcType) && this.vlWen
3386017bdcbSsinsanction      ) && valid
3396017bdcbSsinsanction    }
3402aaa83c0Sxiaofeibao-xjtu    def wakeUpFromIQ(successor: Seq[(UInt, UInt)]): Seq[Bool] = {
3412aaa83c0Sxiaofeibao-xjtu      successor.map { case (thatPsrc, srcType) =>
3422aaa83c0Sxiaofeibao-xjtu        val pdestMatch = pdest === thatPsrc
3432aaa83c0Sxiaofeibao-xjtu        pdestMatch && (
3442aaa83c0Sxiaofeibao-xjtu          SrcType.isFp(srcType) && this.fpWen ||
3452aaa83c0Sxiaofeibao-xjtu            SrcType.isXp(srcType) && this.rfWen ||
3462aaa83c0Sxiaofeibao-xjtu            SrcType.isVp(srcType) && this.vecWen
3472aaa83c0Sxiaofeibao-xjtu          )
3482aaa83c0Sxiaofeibao-xjtu      }
3492aaa83c0Sxiaofeibao-xjtu    }
3506017bdcbSsinsanction    def wakeUpV0FromIQ(successor: (UInt, UInt)): Bool = {
3516017bdcbSsinsanction      val (thatPsrc, srcType) = successor
3526017bdcbSsinsanction      val pdestMatch = pdest === thatPsrc
3536017bdcbSsinsanction      pdestMatch && (
3546017bdcbSsinsanction        SrcType.isV0(srcType) && this.v0Wen
3556017bdcbSsinsanction      )
3566017bdcbSsinsanction    }
3576017bdcbSsinsanction    def wakeUpVlFromIQ(successor: (UInt, UInt)): Bool = {
3586017bdcbSsinsanction      val (thatPsrc, srcType) = successor
3596017bdcbSsinsanction      val pdestMatch = pdest === thatPsrc
3606017bdcbSsinsanction      pdestMatch && (
3616017bdcbSsinsanction        SrcType.isVp(srcType) && this.vlWen
3626017bdcbSsinsanction      )
3636017bdcbSsinsanction    }
364bf35baadSXuan Hu
365c0be7f33SXuan Hu    def hasOnlyOneSource: Boolean = exuIndices.size == 1
366c0be7f33SXuan Hu
367c0be7f33SXuan Hu    def hasMultiSources: Boolean = exuIndices.size > 1
368c0be7f33SXuan Hu
369c0be7f33SXuan Hu    def isWBWakeUp = this.isInstanceOf[IssueQueueWBWakeUpBundle]
370c0be7f33SXuan Hu
371c0be7f33SXuan Hu    def isIQWakeUp = this.isInstanceOf[IssueQueueIQWakeUpBundle]
372c0be7f33SXuan Hu
373c0be7f33SXuan Hu    def exuIdx: Int = {
374c0be7f33SXuan Hu      require(hasOnlyOneSource)
375c0be7f33SXuan Hu      this.exuIndices.head
376c0be7f33SXuan Hu    }
377c0be7f33SXuan Hu  }
378c0be7f33SXuan Hu
379ec49b127Ssinsanction  class IssueQueueWBWakeUpBundle(exuIndices: Seq[Int], backendParams: BackendParams)(implicit p: Parameters) extends IssueQueueWakeUpBaseBundle(backendParams.pregIdxWidth, exuIndices) {
380c0be7f33SXuan Hu
381c0be7f33SXuan Hu  }
382c0be7f33SXuan Hu
3830c7ebb58Sxiaofeibao-xjtu  class IssueQueueIQWakeUpBundle(
3840c7ebb58Sxiaofeibao-xjtu    exuIdx: Int,
3850c7ebb58Sxiaofeibao-xjtu    backendParams: BackendParams,
3864c5a0d77Sxiaofeibao-xjtu    copyWakeupOut: Boolean = false,
3870c7ebb58Sxiaofeibao-xjtu    copyNum: Int = 0
388ec49b127Ssinsanction  )(implicit p: Parameters) extends IssueQueueWakeUpBaseBundle(backendParams.pregIdxWidth, Seq(exuIdx)) {
389ec49b127Ssinsanction    val loadDependency = Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))
39079b2c95bSzhanglyGit    val is0Lat = Bool()
3914c5a0d77Sxiaofeibao-xjtu    val params = backendParams.allExuParams.filter(_.exuIdx == exuIdx).head
392f8b278aaSsinsanction    val rcDest = OptionWrapper(params.needWriteRegCache, UInt(RegCacheIdxWidth.W))
3934c5a0d77Sxiaofeibao-xjtu    val pdestCopy  = OptionWrapper(copyWakeupOut, Vec(copyNum, UInt(params.wbPregIdxWidth.W)))
3945edcc45fSHaojin Tang    val rfWenCopy  = OptionWrapper(copyWakeupOut && params.needIntWen, Vec(copyNum, Bool()))
3955edcc45fSHaojin Tang    val fpWenCopy  = OptionWrapper(copyWakeupOut && params.needFpWen, Vec(copyNum, Bool()))
3965edcc45fSHaojin Tang    val vecWenCopy = OptionWrapper(copyWakeupOut && params.needVecWen, Vec(copyNum, Bool()))
3976017bdcbSsinsanction    val v0WenCopy = OptionWrapper(copyWakeupOut && params.needV0Wen, Vec(copyNum, Bool()))
3986017bdcbSsinsanction    val vlWenCopy = OptionWrapper(copyWakeupOut && params.needVlWen, Vec(copyNum, Bool()))
399ec49b127Ssinsanction    val loadDependencyCopy = OptionWrapper(copyWakeupOut && params.isIQWakeUpSink, Vec(copyNum, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))))
400e63b0a03SXuan Hu
401e63b0a03SXuan Hu    def fromExuInput(exuInput: ExuInput): Unit = {
402e63b0a03SXuan Hu      this.rfWen := exuInput.rfWen.getOrElse(false.B)
403e63b0a03SXuan Hu      this.fpWen := exuInput.fpWen.getOrElse(false.B)
404e63b0a03SXuan Hu      this.vecWen := exuInput.vecWen.getOrElse(false.B)
4056017bdcbSsinsanction      this.v0Wen := exuInput.v0Wen.getOrElse(false.B)
4066017bdcbSsinsanction      this.vlWen := exuInput.vlWen.getOrElse(false.B)
407e63b0a03SXuan Hu      this.pdest := exuInput.pdest
408e63b0a03SXuan Hu    }
409c0be7f33SXuan Hu  }
410bf35baadSXuan Hu
411730cfbc0SXuan Hu  class VPUCtrlSignals(implicit p: Parameters) extends XSBundle {
41278dc7ed0SXuan Hu    // vtype
413730cfbc0SXuan Hu    val vill      = Bool()
41478dc7ed0SXuan Hu    val vma       = Bool()    // 1: agnostic, 0: undisturbed
41578dc7ed0SXuan Hu    val vta       = Bool()    // 1: agnostic, 0: undisturbed
41678dc7ed0SXuan Hu    val vsew      = VSew()
41778dc7ed0SXuan Hu    val vlmul     = VLmul()   // 1/8~8      --> -3~3
41878dc7ed0SXuan Hu
41906f0a37aSZiyue Zhang    // spec vtype
42006f0a37aSZiyue Zhang    val specVill  = Bool()
42106f0a37aSZiyue Zhang    val specVma   = Bool()    // 1: agnostic, 0: undisturbed
42206f0a37aSZiyue Zhang    val specVta   = Bool()    // 1: agnostic, 0: undisturbed
42306f0a37aSZiyue Zhang    val specVsew  = VSew()
42406f0a37aSZiyue Zhang    val specVlmul = VLmul()   // 1/8~8      --> -3~3
42506f0a37aSZiyue Zhang
42678dc7ed0SXuan Hu    val vm        = Bool()    // 0: need v0.t
42778dc7ed0SXuan Hu    val vstart    = Vl()
42878dc7ed0SXuan Hu
42978dc7ed0SXuan Hu    // float rounding mode
43078dc7ed0SXuan Hu    val frm       = Frm()
431582849ffSxiaofeibao-xjtu    // scalar float instr and vector float reduction
432bdda74fdSxiaofeibao-xjtu    val fpu       = Fpu()
43378dc7ed0SXuan Hu    // vector fix int rounding mode
43478dc7ed0SXuan Hu    val vxrm      = Vxrm()
43578dc7ed0SXuan Hu    // vector uop index, exclude other non-vector uop
436303b5478SXuan Hu    val vuopIdx   = UopIdx()
4372d270511Ssinsanction    val lastUop   = Bool()
43878dc7ed0SXuan Hu    // maybe used if data dependancy
43907b5cc60Sxiaofeibao    val vmask     = UInt(V0Data().dataWidth.W)
44078dc7ed0SXuan Hu    val vl        = Vl()
44178dc7ed0SXuan Hu
442730cfbc0SXuan Hu    // vector load/store
44378dc7ed0SXuan Hu    val nf        = Nf()
444d9355d3aSZiyue-Zhang    val veew      = VEew()
445b6b11f60SXuan Hu
446b6b11f60SXuan Hu    val isReverse = Bool() // vrsub, vrdiv
447b6b11f60SXuan Hu    val isExt     = Bool()
448b6b11f60SXuan Hu    val isNarrow  = Bool()
449b6b11f60SXuan Hu    val isDstMask = Bool() // vvm, vvvm, mmm
45030fcc710SZiyue Zhang    val isOpMask  = Bool() // vmand, vmnand
451b6b11f60SXuan Hu    val isMove    = Bool() // vmv.s.x, vmv.v.v, vmv.v.x, vmv.v.i
452b6b11f60SXuan Hu
4534376b525SZiyue Zhang    val isDependOldVd = Bool() // some instruction's computation depends on oldvd
454d8ceb649SZiyue Zhang    val isWritePartVd = Bool() // some instruction's computation writes part of vd, such as vredsum
455b6279fc6SZiyue Zhang
456b0480352SZiyue Zhang    val isVleff = Bool() // vleff
457b0480352SZiyue Zhang
458b6b11f60SXuan Hu    def vtype: VType = {
459b6b11f60SXuan Hu      val res = Wire(VType())
460b6b11f60SXuan Hu      res.illegal := this.vill
461b6b11f60SXuan Hu      res.vma     := this.vma
462b6b11f60SXuan Hu      res.vta     := this.vta
463b6b11f60SXuan Hu      res.vsew    := this.vsew
464b6b11f60SXuan Hu      res.vlmul   := this.vlmul
465b6b11f60SXuan Hu      res
466b6b11f60SXuan Hu    }
467b6b11f60SXuan Hu
46806f0a37aSZiyue Zhang    def specVType: VType = {
46906f0a37aSZiyue Zhang      val res = Wire(VType())
47006f0a37aSZiyue Zhang      res.illegal := this.specVill
47106f0a37aSZiyue Zhang      res.vma     := this.specVma
47206f0a37aSZiyue Zhang      res.vta     := this.specVta
47306f0a37aSZiyue Zhang      res.vsew    := this.specVsew
47406f0a37aSZiyue Zhang      res.vlmul   := this.specVlmul
47506f0a37aSZiyue Zhang      res
47606f0a37aSZiyue Zhang    }
47706f0a37aSZiyue Zhang
478b6b11f60SXuan Hu    def vconfig: VConfig = {
479b6b11f60SXuan Hu      val res = Wire(VConfig())
480b6b11f60SXuan Hu      res.vtype := this.vtype
481b6b11f60SXuan Hu      res.vl    := this.vl
482b6b11f60SXuan Hu      res
483b6b11f60SXuan Hu    }
48496a12457Ssinsanction
48596a12457Ssinsanction    def connectVType(source: VType): Unit = {
48696a12457Ssinsanction      this.vill  := source.illegal
48796a12457Ssinsanction      this.vma   := source.vma
48896a12457Ssinsanction      this.vta   := source.vta
48996a12457Ssinsanction      this.vsew  := source.vsew
49096a12457Ssinsanction      this.vlmul := source.vlmul
49196a12457Ssinsanction    }
492730cfbc0SXuan Hu  }
493730cfbc0SXuan Hu
494689f6b88SsinceforYy  class NeedFrmBundle(implicit p: Parameters) extends XSBundle {
495689f6b88SsinceforYy    val scalaNeedFrm = Bool()
496689f6b88SsinceforYy    val vectorNeedFrm = Bool()
497689f6b88SsinceforYy  }
498689f6b88SsinceforYy
499730cfbc0SXuan Hu  // DynInst --[IssueQueue]--> DataPath
500730cfbc0SXuan Hu  class IssueQueueIssueBundle(
501730cfbc0SXuan Hu    iqParams: IssueBlockParams,
50239c59369SXuan Hu    val exuParams: ExeUnitParams,
503730cfbc0SXuan Hu  )(implicit
504730cfbc0SXuan Hu    p: Parameters
505710b9efaSsinsanction  ) extends XSBundle {
506730cfbc0SXuan Hu    private val rfReadDataCfgSet: Seq[Set[DataConfig]] = exuParams.getRfReadDataCfgSet
507730cfbc0SXuan Hu
508730cfbc0SXuan Hu    val rf: MixedVec[MixedVec[RfReadPortWithConfig]] = Flipped(MixedVec(
50960f0c5aeSxiaofeibao      rfReadDataCfgSet.map((set: Set[DataConfig]) =>
51039c59369SXuan Hu        MixedVec(set.map((x: DataConfig) => new RfReadPortWithConfig(x, exuParams.rdPregIdxWidth)).toSeq)
511730cfbc0SXuan Hu      )
512730cfbc0SXuan Hu    ))
513bf35baadSXuan Hu
514730cfbc0SXuan Hu    val srcType = Vec(exuParams.numRegSrc, SrcType()) // used to select imm or reg data
515710b9efaSsinsanction    val rcIdx = OptionWrapper(exuParams.needReadRegCache, Vec(exuParams.numRegSrc, UInt(RegCacheIdxWidth.W))) // used to select regcache data
516730cfbc0SXuan Hu    val immType = SelImm()                         // used to select imm extractor
517730cfbc0SXuan Hu    val common = new ExuInput(exuParams)
518730cfbc0SXuan Hu    val addrOH = UInt(iqParams.numEntries.W)
519730cfbc0SXuan Hu
520c0be7f33SXuan Hu    def exuIdx = exuParams.exuIdx
521730cfbc0SXuan Hu    def getSource: SchedulerType = exuParams.getWBSource
52239c59369SXuan Hu
5236017bdcbSsinsanction    def getRfReadValidBundle(issueValid: Bool): Seq[ValidIO[RfReadPortWithConfig]] = {
524691f3cefSzhanglyGit      rf.zip(srcType).map {
525691f3cefSzhanglyGit        case (rfRd: MixedVec[RfReadPortWithConfig], t: UInt) =>
52634ee0dacSxiaofeibao-xjtu          makeValid(issueValid, rfRd.head)
527691f3cefSzhanglyGit      }.toSeq
52839c59369SXuan Hu    }
529730cfbc0SXuan Hu  }
530730cfbc0SXuan Hu
531730cfbc0SXuan Hu  class OGRespBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
532d54d930bSfdy    val issueQueueParams = this.params
5335db4956bSzhanglyGit    val og0resp = Valid(new EntryDeqRespBundle)
5345db4956bSzhanglyGit    val og1resp = Valid(new EntryDeqRespBundle)
535730cfbc0SXuan Hu  }
536730cfbc0SXuan Hu
537dd970561SzhanglyGit  class WbFuBusyTableWriteBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
538dd970561SzhanglyGit    private val intCertainLat = params.intLatencyCertain
53960f0c5aeSxiaofeibao    private val fpCertainLat = params.fpLatencyCertain
540dd970561SzhanglyGit    private val vfCertainLat = params.vfLatencyCertain
5412aa3a761Ssinsanction    private val v0CertainLat = params.v0LatencyCertain
5422aa3a761Ssinsanction    private val vlCertainLat = params.vlLatencyCertain
543dd970561SzhanglyGit    private val intLat = params.intLatencyValMax
54460f0c5aeSxiaofeibao    private val fpLat = params.fpLatencyValMax
545dd970561SzhanglyGit    private val vfLat = params.vfLatencyValMax
5462aa3a761Ssinsanction    private val v0Lat = params.v0LatencyValMax
5472aa3a761Ssinsanction    private val vlLat = params.vlLatencyValMax
548dd970561SzhanglyGit
549dd970561SzhanglyGit    val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
55060f0c5aeSxiaofeibao    val fpWbBusyTable = OptionWrapper(fpCertainLat, UInt((fpLat + 1).W))
551dd970561SzhanglyGit    val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
5522aa3a761Ssinsanction    val v0WbBusyTable = OptionWrapper(v0CertainLat, UInt((v0Lat + 1).W))
5532aa3a761Ssinsanction    val vlWbBusyTable = OptionWrapper(vlCertainLat, UInt((vlLat + 1).W))
554dd970561SzhanglyGit    val intDeqRespSet = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
55560f0c5aeSxiaofeibao    val fpDeqRespSet = OptionWrapper(fpCertainLat, UInt((fpLat + 1).W))
556dd970561SzhanglyGit    val vfDeqRespSet = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
5572aa3a761Ssinsanction    val v0DeqRespSet = OptionWrapper(v0CertainLat, UInt((v0Lat + 1).W))
5582aa3a761Ssinsanction    val vlDeqRespSet = OptionWrapper(vlCertainLat, UInt((vlLat + 1).W))
5598d29ec32Sczw  }
5608d29ec32Sczw
5612e0a7dc5Sfdy  class WbFuBusyTableReadBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
562bf44d649SXuan Hu    private val intCertainLat = params.intLatencyCertain
56360f0c5aeSxiaofeibao    private val fpCertainLat = params.fpLatencyCertain
564bf44d649SXuan Hu    private val vfCertainLat = params.vfLatencyCertain
5652aa3a761Ssinsanction    private val v0CertainLat = params.v0LatencyCertain
5662aa3a761Ssinsanction    private val vlCertainLat = params.vlLatencyCertain
567bf44d649SXuan Hu    private val intLat = params.intLatencyValMax
56860f0c5aeSxiaofeibao    private val fpLat = params.fpLatencyValMax
569bf44d649SXuan Hu    private val vfLat = params.vfLatencyValMax
5702aa3a761Ssinsanction    private val v0Lat = params.v0LatencyValMax
5712aa3a761Ssinsanction    private val vlLat = params.vlLatencyValMax
572bf44d649SXuan Hu
573bf44d649SXuan Hu    val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
57460f0c5aeSxiaofeibao    val fpWbBusyTable = OptionWrapper(fpCertainLat, UInt((fpLat + 1).W))
575bf44d649SXuan Hu    val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
5762aa3a761Ssinsanction    val v0WbBusyTable = OptionWrapper(v0CertainLat, UInt((v0Lat + 1).W))
5772aa3a761Ssinsanction    val vlWbBusyTable = OptionWrapper(vlCertainLat, UInt((vlLat + 1).W))
5782e0a7dc5Sfdy  }
5792e0a7dc5Sfdy
5802e0a7dc5Sfdy  class WbConflictBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
581bf44d649SXuan Hu    private val intCertainLat = params.intLatencyCertain
58260f0c5aeSxiaofeibao    private val fpCertainLat = params.fpLatencyCertain
583bf44d649SXuan Hu    private val vfCertainLat = params.vfLatencyCertain
5842aa3a761Ssinsanction    private val v0CertainLat = params.v0LatencyCertain
5852aa3a761Ssinsanction    private val vlCertainLat = params.vlLatencyCertain
586bf44d649SXuan Hu
587bf44d649SXuan Hu    val intConflict = OptionWrapper(intCertainLat, Bool())
58860f0c5aeSxiaofeibao    val fpConflict = OptionWrapper(fpCertainLat, Bool())
589bf44d649SXuan Hu    val vfConflict = OptionWrapper(vfCertainLat, Bool())
5902aa3a761Ssinsanction    val v0Conflict = OptionWrapper(v0CertainLat, Bool())
5912aa3a761Ssinsanction    val vlConflict = OptionWrapper(vlCertainLat, Bool())
5922e0a7dc5Sfdy  }
5932e0a7dc5Sfdy
59466f72636Sxiaofeibao-xjtu  class ImmInfo extends Bundle {
59566f72636Sxiaofeibao-xjtu    val imm = UInt(32.W)
59666f72636Sxiaofeibao-xjtu    val immType = SelImm()
59766f72636Sxiaofeibao-xjtu  }
59866f72636Sxiaofeibao-xjtu
599730cfbc0SXuan Hu  // DataPath --[ExuInput]--> Exu
6000ed0e482SGuanghui Cheng  class ExuInput(val params: ExeUnitParams, copyWakeupOut:Boolean = false, copyNum:Int = 0, hasCopySrc: Boolean = false)(implicit p: Parameters) extends XSBundle {
601730cfbc0SXuan Hu    val fuType        = FuType()
602730cfbc0SXuan Hu    val fuOpType      = FuOpType()
6032d12882cSxiaofeibao    val src           = Vec(params.numRegSrc, UInt(params.srcDataBitsMax.W))
6040ed0e482SGuanghui Cheng    val copySrc       = if(hasCopySrc) Some(Vec(params.numCopySrc, Vec(if(params.numRegSrc < 2) 1 else 2, UInt(params.srcDataBitsMax.W)))) else None
605a2fa0ad9Sxiaofeibao    val imm           = UInt(64.W)
606a2fa0ad9Sxiaofeibao    val nextPcOffset  = OptionWrapper(params.hasBrhFu, UInt((log2Up(PredictWidth) + 1).W))
607730cfbc0SXuan Hu    val robIdx        = new RobPtr
608730cfbc0SXuan Hu    val iqIdx         = UInt(log2Up(MemIQSizeMax).W)// Only used by store yet
609730cfbc0SXuan Hu    val isFirstIssue  = Bool()                      // Only used by store yet
6104c5a0d77Sxiaofeibao-xjtu    val pdestCopy  = OptionWrapper(copyWakeupOut, Vec(copyNum, UInt(params.wbPregIdxWidth.W)))
6115edcc45fSHaojin Tang    val rfWenCopy  = OptionWrapper(copyWakeupOut && params.needIntWen, Vec(copyNum, Bool()))
6125edcc45fSHaojin Tang    val fpWenCopy  = OptionWrapper(copyWakeupOut && params.needFpWen, Vec(copyNum, Bool()))
6135edcc45fSHaojin Tang    val vecWenCopy = OptionWrapper(copyWakeupOut && params.needVecWen, Vec(copyNum, Bool()))
6148dd32220Ssinsanction    val v0WenCopy  = OptionWrapper(copyWakeupOut && params.needV0Wen, Vec(copyNum, Bool()))
6158dd32220Ssinsanction    val vlWenCopy  = OptionWrapper(copyWakeupOut && params.needVlWen, Vec(copyNum, Bool()))
616ec49b127Ssinsanction    val loadDependencyCopy = OptionWrapper(copyWakeupOut && params.isIQWakeUpSink, Vec(copyNum, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))))
617730cfbc0SXuan Hu    val pdest         = UInt(params.wbPregIdxWidth.W)
6185edcc45fSHaojin Tang    val rfWen         = if (params.needIntWen)    Some(Bool())                        else None
6195edcc45fSHaojin Tang    val fpWen         = if (params.needFpWen)     Some(Bool())                        else None
6205edcc45fSHaojin Tang    val vecWen        = if (params.needVecWen)    Some(Bool())                        else None
6216017bdcbSsinsanction    val v0Wen         = if (params.needV0Wen)     Some(Bool())                        else None
6226017bdcbSsinsanction    val vlWen         = if (params.needVlWen)     Some(Bool())                        else None
6233bc74e23SzhanglyGit    val fpu           = if (params.writeFflags)   Some(new FPUCtrlSignals)            else None
624b6b11f60SXuan Hu    val vpu           = if (params.needVPUCtrl)   Some(new VPUCtrlSignals)            else None
625730cfbc0SXuan Hu    val flushPipe     = if (params.flushPipe)     Some(Bool())                        else None
626730cfbc0SXuan Hu    val pc            = if (params.needPc)        Some(UInt(VAddrData().dataWidth.W)) else None
627730cfbc0SXuan Hu    val preDecode     = if (params.hasPredecode)  Some(new PreDecodeInfo)             else None
628dcdd1406SXuan Hu    val ftqIdx        = if (params.needPc || params.replayInst || params.hasStoreAddrFu || params.hasCSR)
629730cfbc0SXuan Hu                                                  Some(new FtqPtr)                    else None
630dcdd1406SXuan Hu    val ftqOffset     = if (params.needPc || params.replayInst || params.hasStoreAddrFu || params.hasCSR)
631730cfbc0SXuan Hu                                                  Some(UInt(log2Up(PredictWidth).W))  else None
6329d8d7860SXuan Hu    val predictInfo   = if (params.needPdInfo)  Some(new Bundle {
633730cfbc0SXuan Hu      val target = UInt(VAddrData().dataWidth.W)
634730cfbc0SXuan Hu      val taken = Bool()
635730cfbc0SXuan Hu    }) else None
6361548ca99SHaojin Tang    val loadWaitBit    = OptionWrapper(params.hasLoadExu, Bool())
6371548ca99SHaojin Tang    val waitForRobIdx  = OptionWrapper(params.hasLoadExu, new RobPtr) // store set predicted previous store robIdx
63859a1db8aSHaojin Tang    val storeSetHit    = OptionWrapper(params.hasLoadExu, Bool()) // inst has been allocated an store set
63959a1db8aSHaojin Tang    val loadWaitStrict = OptionWrapper(params.hasLoadExu, Bool()) // load inst will not be executed until ALL former store addr calcuated
64059a1db8aSHaojin Tang    val ssid           = OptionWrapper(params.hasLoadExu, UInt(SSIDWidth.W))
6416dbb4e08SXuan Hu    // only vector load store need
6426dbb4e08SXuan Hu    val numLsElem      = OptionWrapper(params.hasVecLsFu, NumLsElem())
6436dbb4e08SXuan Hu
644730cfbc0SXuan Hu    val sqIdx = if (params.hasMemAddrFu || params.hasStdFu) Some(new SqPtr) else None
645730cfbc0SXuan Hu    val lqIdx = if (params.hasMemAddrFu) Some(new LqPtr) else None
646c0be7f33SXuan Hu    val dataSources = Vec(params.numRegSrc, DataSource())
647f57d73d6Ssinsanction    val exuSources = OptionWrapper(params.isIQWakeUpSink, Vec(params.numRegSrc, ExuSource(params)))
648ea46c302SXuan Hu    val srcTimer = OptionWrapper(params.isIQWakeUpSink, Vec(params.numRegSrc, UInt(3.W)))
649e600b1ddSxiaofeibao-xjtu    val loadDependency = OptionWrapper(params.needLoadDependency, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))
650c0be7f33SXuan Hu
65196e858baSXuan Hu    val perfDebugInfo = new PerfDebugInfo()
652*1592abd1SYan Xu    val debug_seqNum = InstSeqNum()
65396e858baSXuan Hu
654c0be7f33SXuan Hu    def exuIdx = this.params.exuIdx
655c0be7f33SXuan Hu
656730cfbc0SXuan Hu    def fromIssueBundle(source: IssueQueueIssueBundle): Unit = {
657730cfbc0SXuan Hu      // src is assigned to rfReadData
658730cfbc0SXuan Hu      this.fuType        := source.common.fuType
659730cfbc0SXuan Hu      this.fuOpType      := source.common.fuOpType
660730cfbc0SXuan Hu      this.imm           := source.common.imm
661730cfbc0SXuan Hu      this.robIdx        := source.common.robIdx
662730cfbc0SXuan Hu      this.pdest         := source.common.pdest
663730cfbc0SXuan Hu      this.isFirstIssue  := source.common.isFirstIssue // Only used by mem debug log
664730cfbc0SXuan Hu      this.iqIdx         := source.common.iqIdx        // Only used by mem feedback
665c0be7f33SXuan Hu      this.dataSources   := source.common.dataSources
666*1592abd1SYan Xu      this.debug_seqNum  := source.common.debug_seqNum
667f57d73d6Ssinsanction      this.exuSources    .foreach(_ := source.common.exuSources.get)
668730cfbc0SXuan Hu      this.rfWen         .foreach(_ := source.common.rfWen.get)
669730cfbc0SXuan Hu      this.fpWen         .foreach(_ := source.common.fpWen.get)
670730cfbc0SXuan Hu      this.vecWen        .foreach(_ := source.common.vecWen.get)
6716017bdcbSsinsanction      this.v0Wen         .foreach(_ := source.common.v0Wen.get)
6726017bdcbSsinsanction      this.vlWen         .foreach(_ := source.common.vlWen.get)
673730cfbc0SXuan Hu      this.fpu           .foreach(_ := source.common.fpu.get)
674374ba8afSXuan Hu      this.vpu           .foreach(_ := source.common.vpu.get)
675730cfbc0SXuan Hu      this.flushPipe     .foreach(_ := source.common.flushPipe.get)
676427cfec3SHaojin Tang      this.pc            .foreach(_ := source.common.pc.get)
677730cfbc0SXuan Hu      this.preDecode     .foreach(_ := source.common.preDecode.get)
678a2fa0ad9Sxiaofeibao      this.nextPcOffset  .foreach(_ := source.common.nextPcOffset.get)
679730cfbc0SXuan Hu      this.ftqIdx        .foreach(_ := source.common.ftqIdx.get)
680730cfbc0SXuan Hu      this.ftqOffset     .foreach(_ := source.common.ftqOffset.get)
681730cfbc0SXuan Hu      this.predictInfo   .foreach(_ := source.common.predictInfo.get)
6821548ca99SHaojin Tang      this.loadWaitBit   .foreach(_ := source.common.loadWaitBit.get)
6831548ca99SHaojin Tang      this.waitForRobIdx .foreach(_ := source.common.waitForRobIdx.get)
68459a1db8aSHaojin Tang      this.storeSetHit   .foreach(_ := source.common.storeSetHit.get)
68559a1db8aSHaojin Tang      this.loadWaitStrict.foreach(_ := source.common.loadWaitStrict.get)
68659a1db8aSHaojin Tang      this.ssid          .foreach(_ := source.common.ssid.get)
687730cfbc0SXuan Hu      this.lqIdx         .foreach(_ := source.common.lqIdx.get)
688730cfbc0SXuan Hu      this.sqIdx         .foreach(_ := source.common.sqIdx.get)
6896dbb4e08SXuan Hu      this.numLsElem     .foreach(_ := source.common.numLsElem.get)
690ea46c302SXuan Hu      this.srcTimer      .foreach(_ := source.common.srcTimer.get)
6910f55a0d3SHaojin Tang      this.loadDependency.foreach(_ := source.common.loadDependency.get.map(_ << 1))
692730cfbc0SXuan Hu    }
693730cfbc0SXuan Hu  }
694730cfbc0SXuan Hu
695730cfbc0SXuan Hu  // ExuInput --[FuncUnit]--> ExuOutput
696730cfbc0SXuan Hu  class ExuOutput(
697730cfbc0SXuan Hu    val params: ExeUnitParams,
698730cfbc0SXuan Hu  )(implicit
699730cfbc0SXuan Hu    val p: Parameters
700730cfbc0SXuan Hu  ) extends Bundle with BundleSource with HasXSParameter {
701618b89e6Slewislzh    val data         = Vec(params.wbPathNum, UInt(params.destDataBitsMax.W))
702730cfbc0SXuan Hu    val pdest        = UInt(params.wbPregIdxWidth.W)
703730cfbc0SXuan Hu    val robIdx       = new RobPtr
7045edcc45fSHaojin Tang    val intWen       = if (params.needIntWen)   Some(Bool())                  else None
7055edcc45fSHaojin Tang    val fpWen        = if (params.needFpWen)    Some(Bool())                  else None
7065edcc45fSHaojin Tang    val vecWen       = if (params.needVecWen)   Some(Bool())                  else None
7076017bdcbSsinsanction    val v0Wen        = if (params.needV0Wen)    Some(Bool())                  else None
7086017bdcbSsinsanction    val vlWen        = if (params.needVlWen)    Some(Bool())                  else None
709730cfbc0SXuan Hu    val redirect     = if (params.hasRedirect)  Some(ValidIO(new Redirect))   else None
710730cfbc0SXuan Hu    val fflags       = if (params.writeFflags)  Some(UInt(5.W))               else None
7113bc74e23SzhanglyGit    val wflags       = if (params.writeFflags)  Some(Bool())                  else None
712a8db15d8Sfdy    val vxsat        = if (params.writeVxsat)   Some(Bool())                  else None
713730cfbc0SXuan Hu    val exceptionVec = if (params.exceptionOut.nonEmpty) Some(ExceptionVec()) else None
714730cfbc0SXuan Hu    val flushPipe    = if (params.flushPipe)    Some(Bool())                  else None
715730cfbc0SXuan Hu    val replay       = if (params.replayInst)   Some(Bool())                  else None
716730cfbc0SXuan Hu    val lqIdx        = if (params.hasLoadFu)    Some(new LqPtr())             else None
717730cfbc0SXuan Hu    val sqIdx        = if (params.hasStoreAddrFu || params.hasStdFu)
718730cfbc0SXuan Hu                                                Some(new SqPtr())             else None
7197e0f64b0SGuanghui Cheng    val trigger      = if (params.trigger)      Some(TriggerAction())           else None
720730cfbc0SXuan Hu    // uop info
721730cfbc0SXuan Hu    val predecodeInfo = if(params.hasPredecode) Some(new PreDecodeInfo) else None
72298d3cb16SXuan Hu    // vldu used only
72398d3cb16SXuan Hu    val vls = OptionWrapper(params.hasVLoadFu, new Bundle {
72498d3cb16SXuan Hu      val vpu = new VPUCtrlSignals
72598d3cb16SXuan Hu      val oldVdPsrc = UInt(PhyRegIdxWidth.W)
72698d3cb16SXuan Hu      val vdIdx = UInt(3.W)
727dbc1c7fcSzhanglinjuan      val vdIdxInField = UInt(3.W)
72892c6b7edSzhanglinjuan      val isIndexed = Bool()
729c90e3eacSZiyue Zhang      val isMasked = Bool()
730e43bb916SXuan Hu      val isStrided = Bool()
731e43bb916SXuan Hu      val isWhole = Bool()
732e43bb916SXuan Hu      val isVecLoad = Bool()
733e43bb916SXuan Hu      val isVlm = Bool()
73498d3cb16SXuan Hu    })
735730cfbc0SXuan Hu    val debug = new DebugBundle
736730cfbc0SXuan Hu    val debugInfo = new PerfDebugInfo
737*1592abd1SYan Xu    val debug_seqNum = InstSeqNum()
738730cfbc0SXuan Hu  }
739730cfbc0SXuan Hu
740730cfbc0SXuan Hu  // ExuOutput + DynInst --> WriteBackBundle
74139c59369SXuan Hu  class WriteBackBundle(val params: PregWB, backendParams: BackendParams)(implicit p: Parameters) extends Bundle with BundleSource {
742730cfbc0SXuan Hu    val rfWen = Bool()
743730cfbc0SXuan Hu    val fpWen = Bool()
744730cfbc0SXuan Hu    val vecWen = Bool()
7456017bdcbSsinsanction    val v0Wen = Bool()
7466017bdcbSsinsanction    val vlWen = Bool()
74739c59369SXuan Hu    val pdest = UInt(params.pregIdxWidth(backendParams).W)
748730cfbc0SXuan Hu    val data = UInt(params.dataWidth.W)
749730cfbc0SXuan Hu    val robIdx = new RobPtr()(p)
750730cfbc0SXuan Hu    val flushPipe = Bool()
751730cfbc0SXuan Hu    val replayInst = Bool()
752730cfbc0SXuan Hu    val redirect = ValidIO(new Redirect)
753730cfbc0SXuan Hu    val fflags = UInt(5.W)
75401ceb97cSZiyue Zhang    val vxsat = Bool()
755730cfbc0SXuan Hu    val exceptionVec = ExceptionVec()
756730cfbc0SXuan Hu    val debug = new DebugBundle
757730cfbc0SXuan Hu    val debugInfo = new PerfDebugInfo
758*1592abd1SYan Xu    val debug_seqNum = InstSeqNum()
759730cfbc0SXuan Hu
760bf35baadSXuan Hu    this.wakeupSource = s"WB(${params.toString})"
761bf35baadSXuan Hu
762618b89e6Slewislzh    def fromExuOutput(source: ExuOutput, wbType: String) = {
763618b89e6Slewislzh      val typeMap = Map("int" -> 0, "fp" -> 1, "vf" -> 2, "v0" -> 3, "vl" -> 4)
764730cfbc0SXuan Hu      this.rfWen  := source.intWen.getOrElse(false.B)
765730cfbc0SXuan Hu      this.fpWen  := source.fpWen.getOrElse(false.B)
766730cfbc0SXuan Hu      this.vecWen := source.vecWen.getOrElse(false.B)
7676017bdcbSsinsanction      this.v0Wen  := source.v0Wen.getOrElse(false.B)
7686017bdcbSsinsanction      this.vlWen  := source.vlWen.getOrElse(false.B)
769730cfbc0SXuan Hu      this.pdest  := source.pdest
770618b89e6Slewislzh      this.data   := source.data(source.params.wbIndex(typeMap(wbType)))
771730cfbc0SXuan Hu      this.robIdx := source.robIdx
772730cfbc0SXuan Hu      this.flushPipe := source.flushPipe.getOrElse(false.B)
773730cfbc0SXuan Hu      this.replayInst := source.replay.getOrElse(false.B)
774730cfbc0SXuan Hu      this.redirect := source.redirect.getOrElse(0.U.asTypeOf(this.redirect))
775730cfbc0SXuan Hu      this.fflags := source.fflags.getOrElse(0.U.asTypeOf(this.fflags))
77601ceb97cSZiyue Zhang      this.vxsat := source.vxsat.getOrElse(0.U.asTypeOf(this.vxsat))
777730cfbc0SXuan Hu      this.exceptionVec := source.exceptionVec.getOrElse(0.U.asTypeOf(this.exceptionVec))
778730cfbc0SXuan Hu      this.debug := source.debug
779730cfbc0SXuan Hu      this.debugInfo := source.debugInfo
780*1592abd1SYan Xu      this.debug_seqNum := source.debug_seqNum
781730cfbc0SXuan Hu    }
782730cfbc0SXuan Hu
783730cfbc0SXuan Hu    def asIntRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
78439c59369SXuan Hu      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(IntData()).addrWidth)))
785730cfbc0SXuan Hu      rfWrite.wen := this.rfWen && fire
786730cfbc0SXuan Hu      rfWrite.addr := this.pdest
787730cfbc0SXuan Hu      rfWrite.data := this.data
788730cfbc0SXuan Hu      rfWrite.intWen := this.rfWen
789730cfbc0SXuan Hu      rfWrite.fpWen := false.B
790730cfbc0SXuan Hu      rfWrite.vecWen := false.B
7916017bdcbSsinsanction      rfWrite.v0Wen := false.B
7926017bdcbSsinsanction      rfWrite.vlWen := false.B
793730cfbc0SXuan Hu      rfWrite
794730cfbc0SXuan Hu    }
795730cfbc0SXuan Hu
79660f0c5aeSxiaofeibao    def asFpRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
79760f0c5aeSxiaofeibao      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(FpData()).addrWidth)))
79860f0c5aeSxiaofeibao      rfWrite.wen := this.fpWen && fire
799730cfbc0SXuan Hu      rfWrite.addr := this.pdest
800730cfbc0SXuan Hu      rfWrite.data := this.data
801730cfbc0SXuan Hu      rfWrite.intWen := false.B
802730cfbc0SXuan Hu      rfWrite.fpWen := this.fpWen
80360f0c5aeSxiaofeibao      rfWrite.vecWen := false.B
8046017bdcbSsinsanction      rfWrite.v0Wen := false.B
8056017bdcbSsinsanction      rfWrite.vlWen := false.B
80660f0c5aeSxiaofeibao      rfWrite
80760f0c5aeSxiaofeibao    }
80860f0c5aeSxiaofeibao
80960f0c5aeSxiaofeibao    def asVfRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
81060f0c5aeSxiaofeibao      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(VecData()).addrWidth)))
81160f0c5aeSxiaofeibao      rfWrite.wen := this.vecWen && fire
81260f0c5aeSxiaofeibao      rfWrite.addr := this.pdest
81360f0c5aeSxiaofeibao      rfWrite.data := this.data
81460f0c5aeSxiaofeibao      rfWrite.intWen := false.B
81560f0c5aeSxiaofeibao      rfWrite.fpWen := false.B
816730cfbc0SXuan Hu      rfWrite.vecWen := this.vecWen
8176017bdcbSsinsanction      rfWrite.v0Wen := false.B
8186017bdcbSsinsanction      rfWrite.vlWen := false.B
8196017bdcbSsinsanction      rfWrite
8206017bdcbSsinsanction    }
8216017bdcbSsinsanction
8226017bdcbSsinsanction    def asV0RfWriteBundle(fire: Bool): RfWritePortWithConfig = {
82307b5cc60Sxiaofeibao      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(V0Data()).addrWidth)))
8246017bdcbSsinsanction      rfWrite.wen := this.v0Wen && fire
8256017bdcbSsinsanction      rfWrite.addr := this.pdest
8266017bdcbSsinsanction      rfWrite.data := this.data
8276017bdcbSsinsanction      rfWrite.intWen := false.B
8286017bdcbSsinsanction      rfWrite.fpWen := false.B
8296017bdcbSsinsanction      rfWrite.vecWen := false.B
8306017bdcbSsinsanction      rfWrite.v0Wen := this.v0Wen
8316017bdcbSsinsanction      rfWrite.vlWen := false.B
8326017bdcbSsinsanction      rfWrite
8336017bdcbSsinsanction    }
8346017bdcbSsinsanction
8356017bdcbSsinsanction    def asVlRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
83607b5cc60Sxiaofeibao      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(VlData()).addrWidth)))
8376017bdcbSsinsanction      rfWrite.wen := this.vlWen && fire
8386017bdcbSsinsanction      rfWrite.addr := this.pdest
8396017bdcbSsinsanction      rfWrite.data := this.data
8406017bdcbSsinsanction      rfWrite.intWen := false.B
8416017bdcbSsinsanction      rfWrite.fpWen := false.B
8426017bdcbSsinsanction      rfWrite.vecWen := false.B
8436017bdcbSsinsanction      rfWrite.v0Wen := false.B
8446017bdcbSsinsanction      rfWrite.vlWen := this.vlWen
845730cfbc0SXuan Hu      rfWrite
846730cfbc0SXuan Hu    }
847730cfbc0SXuan Hu  }
848730cfbc0SXuan Hu
8495d2b9cadSXuan Hu  // ExuOutput --> ExuBypassBundle --[DataPath]-->ExuInput
8505d2b9cadSXuan Hu  //                                /
8515d2b9cadSXuan Hu  //     [IssueQueue]--> ExuInput --
8525d2b9cadSXuan Hu  class ExuBypassBundle(
8535d2b9cadSXuan Hu    val params: ExeUnitParams,
854f8b278aaSsinsanction  )(implicit p: Parameters) extends XSBundle {
855f8b278aaSsinsanction    val intWen = Bool()
8562d12882cSxiaofeibao    val data   = UInt(params.destDataBitsMax.W)
8575d2b9cadSXuan Hu    val pdest  = UInt(params.wbPregIdxWidth.W)
8585d2b9cadSXuan Hu  }
8595d2b9cadSXuan Hu
860e25e4d90SXuan Hu  class ExceptionInfo(implicit p: Parameters) extends XSBundle {
861730cfbc0SXuan Hu    val pc = UInt(VAddrData().dataWidth.W)
862730cfbc0SXuan Hu    val instr = UInt(32.W)
863730cfbc0SXuan Hu    val commitType = CommitType()
864730cfbc0SXuan Hu    val exceptionVec = ExceptionVec()
86525742929SXuan Hu    val isPcBkpt = Bool()
866c1b28b66STang Haojin    val isFetchMalAddr = Bool()
867db6cfb5aSHaoyuan Feng    val gpaddr = UInt(XLEN.W)
868730cfbc0SXuan Hu    val singleStep = Bool()
869730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
870730cfbc0SXuan Hu    val isInterrupt = Bool()
871e25e4d90SXuan Hu    val isHls = Bool()
87231c51290Szhanglinjuan    val vls = Bool()
8737e0f64b0SGuanghui Cheng    val trigger = TriggerAction()
874ad415ae0SXiaokun-Pei    val isForVSnonLeafPTE = Bool()
875730cfbc0SXuan Hu  }
876730cfbc0SXuan Hu
877303b5478SXuan Hu  object UopIdx {
878303b5478SXuan Hu    def apply()(implicit p: Parameters): UInt = UInt(log2Up(p(XSCoreParamsKey).MaxUopSize + 1).W)
879303b5478SXuan Hu  }
880303b5478SXuan Hu
881bf35baadSXuan Hu  object FuLatency {
882bf35baadSXuan Hu    def apply(): UInt = UInt(width.W)
883bf35baadSXuan Hu
884bf35baadSXuan Hu    def width = 4 // 0~15 // Todo: assosiate it with FuConfig
885bf35baadSXuan Hu  }
886bf35baadSXuan Hu
887f57d73d6Ssinsanction  class ExuSource(exuNum: Int)(implicit p: Parameters) extends XSBundle {
888f57d73d6Ssinsanction    val value = UInt(log2Ceil(exuNum + 1).W)
889bf35baadSXuan Hu
890f57d73d6Ssinsanction    val allExuNum = p(XSCoreParamsKey).backendParams.numExu
891bf35baadSXuan Hu
892f57d73d6Ssinsanction    def toExuOH(num: Int, filter: Seq[Int]): Vec[Bool] = {
893f57d73d6Ssinsanction      require(num == filter.size)
894f57d73d6Ssinsanction      val encodedExuOH = UIntToOH(this.value)(num, 1)
895f57d73d6Ssinsanction      val ext = Module(new UIntExtractor(allExuNum, filter))
896f57d73d6Ssinsanction      ext.io.in := encodedExuOH
897f57d73d6Ssinsanction      VecInit(ext.io.out.asBools.zipWithIndex.map{ case(out, idx) =>
898f57d73d6Ssinsanction        if (filter.contains(idx)) out
899f57d73d6Ssinsanction        else false.B
900f57d73d6Ssinsanction      })
901f57d73d6Ssinsanction    }
902f57d73d6Ssinsanction
903f57d73d6Ssinsanction    def toExuOH(exuParams: ExeUnitParams): Vec[Bool] = {
904f57d73d6Ssinsanction      toExuOH(exuParams.numWakeupFromIQ, exuParams.iqWakeUpSinkPairs.map(x => x.source.getExuParam(p(XSCoreParamsKey).backendParams.allExuParams).exuIdx))
905f57d73d6Ssinsanction    }
906f57d73d6Ssinsanction
907f57d73d6Ssinsanction    def toExuOH(iqParams: IssueBlockParams): Vec[Bool] = {
908f57d73d6Ssinsanction      toExuOH(iqParams.numWakeupFromIQ, iqParams.wakeUpSourceExuIdx)
909f57d73d6Ssinsanction    }
910f57d73d6Ssinsanction
911f57d73d6Ssinsanction    def fromExuOH(iqParams: IssueBlockParams, exuOH: UInt): UInt = {
912f57d73d6Ssinsanction      val comp = Module(new UIntCompressor(allExuNum, iqParams.wakeUpSourceExuIdx))
913f57d73d6Ssinsanction      comp.io.in := exuOH
914f57d73d6Ssinsanction      OHToUInt(Cat(comp.io.out, 0.U(1.W)))
915f57d73d6Ssinsanction    }
916f57d73d6Ssinsanction  }
917f57d73d6Ssinsanction
918f57d73d6Ssinsanction  object ExuSource {
919f57d73d6Ssinsanction    def apply(exuNum: Int)(implicit p: Parameters) = new ExuSource(exuNum)
920f57d73d6Ssinsanction
921f57d73d6Ssinsanction    def apply(params: ExeUnitParams)(implicit p: Parameters) = new ExuSource(params.numWakeupFromIQ)
922f57d73d6Ssinsanction
923f57d73d6Ssinsanction    def apply()(implicit p: Parameters, params: IssueBlockParams) = new ExuSource(params.numWakeupFromIQ)
924bf35baadSXuan Hu  }
925bf35baadSXuan Hu
9261f35da39Sxiaofeibao-xjtu  object ExuVec {
9271f35da39Sxiaofeibao-xjtu    def apply(exuNum: Int): Vec[Bool] = Vec(exuNum, Bool())
9281f35da39Sxiaofeibao-xjtu
9291f35da39Sxiaofeibao-xjtu    def apply()(implicit p: Parameters): Vec[Bool] = Vec(width, Bool())
9301f35da39Sxiaofeibao-xjtu
9311f35da39Sxiaofeibao-xjtu    def width(implicit p: Parameters): Int = p(XSCoreParamsKey).backendParams.numExu
9321f35da39Sxiaofeibao-xjtu  }
9331f35da39Sxiaofeibao-xjtu
934bc7d6943SzhanglyGit  class CancelSignal(implicit p: Parameters) extends XSBundle {
935bc7d6943SzhanglyGit    val rfWen = Bool()
93673b1b2e4SzhanglyGit    val fpWen = Bool()
93773b1b2e4SzhanglyGit    val vecWen = Bool()
9386017bdcbSsinsanction    val v0Wen = Bool()
9396017bdcbSsinsanction    val vlWen = Bool()
940bc7d6943SzhanglyGit    val pdest = UInt(PhyRegIdxWidth.W)
941bc7d6943SzhanglyGit  }
942bc7d6943SzhanglyGit
9434ee69032SzhanglyGit  class MemExuInput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle {
944730cfbc0SXuan Hu    val uop = new DynInst
9454ee69032SzhanglyGit    val src = if (isVector) Vec(5, UInt(VLEN.W)) else Vec(3, UInt(XLEN.W))
946730cfbc0SXuan Hu    val iqIdx = UInt(log2Up(MemIQSizeMax).W)
947730cfbc0SXuan Hu    val isFirstIssue = Bool()
948d362dcf0SAnzooooo    val flowNum      = OptionWrapper(isVector, NumLsElem())
94920a5248fSzhanglinjuan
95020a5248fSzhanglinjuan    def src_rs1 = src(0)
951074ad6aaSzhanglinjuan    def src_rs2 = src(1)
95220a5248fSzhanglinjuan    def src_stride = src(1)
95320a5248fSzhanglinjuan    def src_vs3 = src(2)
95420a5248fSzhanglinjuan    def src_mask = if (isVector) src(3) else 0.U
95520a5248fSzhanglinjuan    def src_vl = if (isVector) src(4) else 0.U
956730cfbc0SXuan Hu  }
957730cfbc0SXuan Hu
9584ee69032SzhanglyGit  class MemExuOutput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle {
959730cfbc0SXuan Hu    val uop = new DynInst
9604ee69032SzhanglyGit    val data = if (isVector) UInt(VLEN.W) else UInt(XLEN.W)
96198d3cb16SXuan Hu    val mask = if (isVector) Some(UInt(VLEN.W)) else None
9627ca7ad94Szhanglinjuan    val vdIdx = if (isVector) Some(UInt(3.W)) else None // TODO: parameterize width
963dbc1c7fcSzhanglinjuan    val vdIdxInField = if (isVector) Some(UInt(3.W)) else None
964bd3e32c1Ssinsanction    val isFromLoadUnit = Bool()
965730cfbc0SXuan Hu    val debug = new DebugBundle
96695767918Szhanglinjuan
96795767918Szhanglinjuan    def isVls = FuType.isVls(uop.fuType)
968730cfbc0SXuan Hu  }
969730cfbc0SXuan Hu
970730cfbc0SXuan Hu  class MemMicroOpRbExt(implicit p: Parameters) extends XSBundle {
971730cfbc0SXuan Hu    val uop = new DynInst
972730cfbc0SXuan Hu    val flag = UInt(1.W)
973730cfbc0SXuan Hu  }
9740f55a0d3SHaojin Tang
9750f55a0d3SHaojin Tang  object LoadShouldCancel {
9760f55a0d3SHaojin Tang    def apply(loadDependency: Option[Seq[UInt]], ldCancel: Seq[LoadCancelIO]): Bool = {
977ec49b127Ssinsanction      val ld1Cancel = loadDependency.map(_.zip(ldCancel.map(_.ld1Cancel)).map { case (dep, cancel) => cancel && dep(0)}.reduce(_ || _))
978ec49b127Ssinsanction      val ld2Cancel = loadDependency.map(_.zip(ldCancel.map(_.ld2Cancel)).map { case (dep, cancel) => cancel && dep(1)}.reduce(_ || _))
9790f55a0d3SHaojin Tang      ld1Cancel.map(_ || ld2Cancel.get).getOrElse(false.B)
9800f55a0d3SHaojin Tang    }
9810f55a0d3SHaojin Tang  }
982730cfbc0SXuan Hu}
983