xref: /XiangShan/src/main/scala/xiangshan/backend/Bundles.scala (revision f1ba628b51a823a3fc669f490fc5a89bb61900a3)
1730cfbc0SXuan Hupackage xiangshan.backend
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chipsalliance.rocketchip.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._
185db4956bSzhanglyGitimport xiangshan.backend.issue.{IssueBlockParams, IssueQueueDeqRespBundle, IssueQueueJumpBundle, SchedulerType, EntryDeqRespBundle}
19730cfbc0SXuan Huimport xiangshan.backend.regfile.{RfReadPortWithConfig, RfWritePortWithConfig}
20730cfbc0SXuan Huimport xiangshan.backend.rob.RobPtr
21730cfbc0SXuan Huimport xiangshan.frontend._
22730cfbc0SXuan Huimport xiangshan.mem.{LqPtr, SqPtr}
23730cfbc0SXuan Hu
24730cfbc0SXuan Huobject Bundles {
25730cfbc0SXuan Hu
26730cfbc0SXuan Hu  // frontend -> backend
27730cfbc0SXuan Hu  class StaticInst(implicit p: Parameters) extends XSBundle {
28730cfbc0SXuan Hu    val instr           = UInt(32.W)
29730cfbc0SXuan Hu    val pc              = UInt(VAddrBits.W)
30730cfbc0SXuan Hu    val foldpc          = UInt(MemPredPCWidth.W)
31730cfbc0SXuan Hu    val exceptionVec    = ExceptionVec()
32730cfbc0SXuan Hu    val trigger         = new TriggerCf
33730cfbc0SXuan Hu    val preDecodeInfo   = new PreDecodeInfo
34730cfbc0SXuan Hu    val pred_taken      = Bool()
35730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
36730cfbc0SXuan Hu    val ftqPtr          = new FtqPtr
37730cfbc0SXuan Hu    val ftqOffset       = UInt(log2Up(PredictWidth).W)
38730cfbc0SXuan Hu
39730cfbc0SXuan Hu    def connectCtrlFlow(source: CtrlFlow): Unit = {
40730cfbc0SXuan Hu      this.instr            := source.instr
41730cfbc0SXuan Hu      this.pc               := source.pc
42730cfbc0SXuan Hu      this.foldpc           := source.foldpc
43730cfbc0SXuan Hu      this.exceptionVec     := source.exceptionVec
44730cfbc0SXuan Hu      this.trigger          := source.trigger
45730cfbc0SXuan Hu      this.preDecodeInfo    := source.pd
46730cfbc0SXuan Hu      this.pred_taken       := source.pred_taken
47730cfbc0SXuan Hu      this.crossPageIPFFix  := source.crossPageIPFFix
48730cfbc0SXuan Hu      this.ftqPtr           := source.ftqPtr
49730cfbc0SXuan Hu      this.ftqOffset        := source.ftqOffset
50730cfbc0SXuan Hu    }
51730cfbc0SXuan Hu  }
52730cfbc0SXuan Hu
53730cfbc0SXuan Hu  // StaticInst --[Decode]--> DecodedInst
54730cfbc0SXuan Hu  class DecodedInst(implicit p: Parameters) extends XSBundle {
5598639abbSXuan Hu    def numSrc = backendParams.numSrc
56730cfbc0SXuan Hu    // passed from StaticInst
57730cfbc0SXuan Hu    val instr           = UInt(32.W)
58730cfbc0SXuan Hu    val pc              = UInt(VAddrBits.W)
59730cfbc0SXuan Hu    val foldpc          = UInt(MemPredPCWidth.W)
60730cfbc0SXuan Hu    val exceptionVec    = ExceptionVec()
61730cfbc0SXuan Hu    val trigger         = new TriggerCf
62730cfbc0SXuan Hu    val preDecodeInfo   = new PreDecodeInfo
63730cfbc0SXuan Hu    val pred_taken      = Bool()
64730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
65730cfbc0SXuan Hu    val ftqPtr          = new FtqPtr
66730cfbc0SXuan Hu    val ftqOffset       = UInt(log2Up(PredictWidth).W)
67730cfbc0SXuan Hu    // decoded
6898639abbSXuan Hu    val srcType         = Vec(numSrc, SrcType())
6998639abbSXuan Hu    val lsrc            = Vec(numSrc, UInt(6.W))
70730cfbc0SXuan Hu    val ldest           = UInt(6.W)
71730cfbc0SXuan Hu    val fuType          = FuType()
72730cfbc0SXuan Hu    val fuOpType        = FuOpType()
73730cfbc0SXuan Hu    val rfWen           = Bool()
74730cfbc0SXuan Hu    val fpWen           = Bool()
75730cfbc0SXuan Hu    val vecWen          = Bool()
76730cfbc0SXuan Hu    val isXSTrap        = Bool()
77730cfbc0SXuan Hu    val waitForward     = Bool() // no speculate execution
78730cfbc0SXuan Hu    val blockBackward   = Bool()
79730cfbc0SXuan Hu    val flushPipe       = Bool() // This inst will flush all the pipe when commit, like exception but can commit
8089cc69c1STang Haojin    val canRobCompress  = Bool()
81730cfbc0SXuan Hu    val selImm          = SelImm()
82730cfbc0SXuan Hu    val imm             = UInt(ImmUnion.maxLen.W)
83730cfbc0SXuan Hu    val fpu             = new FPUCtrlSignals
84730cfbc0SXuan Hu    val vpu             = new VPUCtrlSignals
85bdda74fdSxiaofeibao-xjtu    val wfflags         = Bool()
86730cfbc0SXuan Hu    val isMove          = Bool()
87730cfbc0SXuan Hu    val uopIdx          = UInt(5.W)
8817ec87f2SXuan Hu    val uopSplitType    = UopSplitType()
89730cfbc0SXuan Hu    val isVset          = Bool()
90d91483a6Sfdy    val firstUop        = Bool()
91d91483a6Sfdy    val lastUop         = Bool()
92f1e8fcb2SXuan Hu    val numUops         = UInt(log2Up(MaxUopSize).W) // rob need this
93730cfbc0SXuan Hu    val commitType      = CommitType() // Todo: remove it
94730cfbc0SXuan Hu
95730cfbc0SXuan Hu    private def allSignals = srcType.take(3) ++ Seq(fuType, fuOpType, rfWen, fpWen, vecWen,
9689cc69c1STang Haojin      isXSTrap, waitForward, blockBackward, flushPipe, canRobCompress, uopSplitType, selImm)
97730cfbc0SXuan Hu
98730cfbc0SXuan Hu    def decode(inst: UInt, table: Iterable[(BitPat, List[BitPat])]): DecodedInst = {
99730cfbc0SXuan Hu      val decoder: Seq[UInt] = ListLookup(
100730cfbc0SXuan Hu        inst, XDecode.decodeDefault.map(bitPatToUInt),
101730cfbc0SXuan Hu        table.map{ case (pat, pats) => (pat, pats.map(bitPatToUInt)) }.toArray
102730cfbc0SXuan Hu      )
103730cfbc0SXuan Hu      allSignals zip decoder foreach { case (s, d) => s := d }
104730cfbc0SXuan Hu      this
105730cfbc0SXuan Hu    }
106730cfbc0SXuan Hu
107730cfbc0SXuan Hu    def isSoftPrefetch: Bool = {
108730cfbc0SXuan Hu      fuType === FuType.alu.U && fuOpType === ALUOpType.or && selImm === SelImm.IMM_I && ldest === 0.U
109730cfbc0SXuan Hu    }
110730cfbc0SXuan Hu
111730cfbc0SXuan Hu    def connectStaticInst(source: StaticInst): Unit = {
112730cfbc0SXuan Hu      for ((name, data) <- this.elements) {
113730cfbc0SXuan Hu        if (source.elements.contains(name)) {
114730cfbc0SXuan Hu          data := source.elements(name)
115730cfbc0SXuan Hu        }
116730cfbc0SXuan Hu      }
117730cfbc0SXuan Hu    }
118730cfbc0SXuan Hu  }
119730cfbc0SXuan Hu
120730cfbc0SXuan Hu  // DecodedInst --[Rename]--> DynInst
121730cfbc0SXuan Hu  class DynInst(implicit p: Parameters) extends XSBundle {
12298639abbSXuan Hu    def numSrc          = backendParams.numSrc
123730cfbc0SXuan Hu    // passed from StaticInst
124730cfbc0SXuan Hu    val instr           = UInt(32.W)
125730cfbc0SXuan Hu    val pc              = UInt(VAddrBits.W)
126730cfbc0SXuan Hu    val foldpc          = UInt(MemPredPCWidth.W)
127730cfbc0SXuan Hu    val exceptionVec    = ExceptionVec()
128730cfbc0SXuan Hu    val trigger         = new TriggerCf
129730cfbc0SXuan Hu    val preDecodeInfo   = new PreDecodeInfo
130730cfbc0SXuan Hu    val pred_taken      = Bool()
131730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
132730cfbc0SXuan Hu    val ftqPtr          = new FtqPtr
133730cfbc0SXuan Hu    val ftqOffset       = UInt(log2Up(PredictWidth).W)
134730cfbc0SXuan Hu    // passed from DecodedInst
13598639abbSXuan Hu    val srcType         = Vec(numSrc, SrcType())
13698639abbSXuan Hu    val lsrc            = Vec(numSrc, UInt(6.W))
137730cfbc0SXuan Hu    val ldest           = UInt(6.W)
138730cfbc0SXuan Hu    val fuType          = FuType()
139730cfbc0SXuan Hu    val fuOpType        = FuOpType()
140730cfbc0SXuan Hu    val rfWen           = Bool()
141730cfbc0SXuan Hu    val fpWen           = Bool()
142730cfbc0SXuan Hu    val vecWen          = Bool()
143730cfbc0SXuan Hu    val isXSTrap        = Bool()
144730cfbc0SXuan Hu    val waitForward     = Bool() // no speculate execution
145730cfbc0SXuan Hu    val blockBackward   = Bool()
146730cfbc0SXuan Hu    val flushPipe       = Bool() // This inst will flush all the pipe when commit, like exception but can commit
14789cc69c1STang Haojin    val canRobCompress  = Bool()
148730cfbc0SXuan Hu    val selImm          = SelImm()
149730cfbc0SXuan Hu    val imm             = UInt(XLEN.W) // Todo: check if it need minimized
150730cfbc0SXuan Hu    val fpu             = new FPUCtrlSignals
151730cfbc0SXuan Hu    val vpu             = new VPUCtrlSignals
152bdda74fdSxiaofeibao-xjtu    val wfflags         = Bool()
153730cfbc0SXuan Hu    val isMove          = Bool()
154730cfbc0SXuan Hu    val uopIdx          = UInt(5.W)
155730cfbc0SXuan Hu    val isVset          = Bool()
156d91483a6Sfdy    val firstUop        = Bool()
157d91483a6Sfdy    val lastUop         = Bool()
158f1e8fcb2SXuan Hu    val numUops         = UInt(log2Up(MaxUopSize).W) // rob need this
159730cfbc0SXuan Hu    val commitType      = CommitType()
160730cfbc0SXuan Hu    // rename
16198639abbSXuan Hu    val srcState        = Vec(numSrc, SrcState())
162bc7d6943SzhanglyGit    val dataSource      = Vec(numSrc, DataSource())
163bc7d6943SzhanglyGit    val l1ExuOH         = Vec(numSrc, ExuVec())
16498639abbSXuan Hu    val psrc            = Vec(numSrc, UInt(PhyRegIdxWidth.W))
165730cfbc0SXuan Hu    val pdest           = UInt(PhyRegIdxWidth.W)
166730cfbc0SXuan Hu    val robIdx          = new RobPtr
16789cc69c1STang Haojin    val instrSize       = UInt(log2Ceil(RenameWidth + 1).W)
168*f1ba628bSHaojin Tang    val dirtyFs         = Bool()
169730cfbc0SXuan Hu
170730cfbc0SXuan Hu    val eliminatedMove  = Bool()
171870f462dSXuan Hu    // Take snapshot at this CFI inst
172870f462dSXuan Hu    val snapshot        = Bool()
173730cfbc0SXuan Hu    val debugInfo       = new PerfDebugInfo
174730cfbc0SXuan Hu    val storeSetHit     = Bool() // inst has been allocated an store set
175730cfbc0SXuan Hu    val waitForRobIdx   = new RobPtr // store set predicted previous store robIdx
176730cfbc0SXuan Hu    // Load wait is needed
177730cfbc0SXuan Hu    // load inst will not be executed until former store (predicted by mdp) addr calcuated
178730cfbc0SXuan Hu    val loadWaitBit     = Bool()
179730cfbc0SXuan Hu    // If (loadWaitBit && loadWaitStrict), strict load wait is needed
180730cfbc0SXuan Hu    // load inst will not be executed until ALL former store addr calcuated
181730cfbc0SXuan Hu    val loadWaitStrict  = Bool()
182730cfbc0SXuan Hu    val ssid            = UInt(SSIDWidth.W)
183730cfbc0SXuan Hu    // Todo
184730cfbc0SXuan Hu    val lqIdx = new LqPtr
185730cfbc0SXuan Hu    val sqIdx = new SqPtr
186730cfbc0SXuan Hu    // debug module
187730cfbc0SXuan Hu    val singleStep      = Bool()
188730cfbc0SXuan Hu    // schedule
189730cfbc0SXuan Hu    val replayInst      = Bool()
190730cfbc0SXuan Hu
191fe528fd6Ssinsanction    def isLUI: Bool = this.fuType === FuType.alu.U && (this.selImm === SelImm.IMM_U || this.selImm === SelImm.IMM_LUI32)
192765e58c6Ssinsanction    def isLUI32: Bool = this.fuType === FuType.alu.U && this.selImm === SelImm.IMM_LUI32
193730cfbc0SXuan Hu    def isWFI: Bool = this.fuType === FuType.csr.U && fuOpType === CSROpType.wfi
194730cfbc0SXuan Hu
195730cfbc0SXuan Hu    def isSvinvalBegin(flush: Bool) = FuType.isFence(fuType) && fuOpType === FenceOpType.nofence && !flush
196730cfbc0SXuan Hu    def isSvinval(flush: Bool) = FuType.isFence(fuType) && fuOpType === FenceOpType.sfence && !flush
197730cfbc0SXuan Hu    def isSvinvalEnd(flush: Bool) = FuType.isFence(fuType) && fuOpType === FenceOpType.nofence && flush
198730cfbc0SXuan Hu
199730cfbc0SXuan Hu    def srcIsReady: Vec[Bool] = {
200730cfbc0SXuan Hu      VecInit(this.srcType.zip(this.srcState).map {
201730cfbc0SXuan Hu        case (t, s) => SrcType.isNotReg(t) || SrcState.isReady(s)
202730cfbc0SXuan Hu      })
203730cfbc0SXuan Hu    }
204730cfbc0SXuan Hu
205730cfbc0SXuan Hu    def clearExceptions(
206730cfbc0SXuan Hu      exceptionBits: Seq[Int] = Seq(),
207730cfbc0SXuan Hu      flushPipe    : Boolean = false,
208730cfbc0SXuan Hu      replayInst   : Boolean = false
209730cfbc0SXuan Hu    ): DynInst = {
210730cfbc0SXuan Hu      this.exceptionVec.zipWithIndex.filterNot(x => exceptionBits.contains(x._2)).foreach(_._1 := false.B)
211730cfbc0SXuan Hu      if (!flushPipe) { this.flushPipe := false.B }
212730cfbc0SXuan Hu      if (!replayInst) { this.replayInst := false.B }
213730cfbc0SXuan Hu      this
214730cfbc0SXuan Hu    }
215730cfbc0SXuan Hu
216a8db15d8Sfdy    def needWriteRf: Bool = (rfWen && ldest =/= 0.U) || fpWen || vecWen
217730cfbc0SXuan Hu  }
218730cfbc0SXuan Hu
219730cfbc0SXuan Hu  trait BundleSource {
220bf35baadSXuan Hu    var wakeupSource = "undefined"
221bf35baadSXuan Hu    var idx = 0
222730cfbc0SXuan Hu  }
223730cfbc0SXuan Hu
224c0be7f33SXuan Hu  /**
225c0be7f33SXuan Hu    *
226c0be7f33SXuan Hu    * @param pregIdxWidth index width of preg
227c0be7f33SXuan Hu    * @param exuIndices exu indices of wakeup bundle
228c0be7f33SXuan Hu    */
229c0be7f33SXuan Hu  sealed abstract class IssueQueueWakeUpBaseBundle(pregIdxWidth: Int, val exuIndices: Seq[Int]) extends Bundle {
230730cfbc0SXuan Hu    val rfWen = Bool()
231730cfbc0SXuan Hu    val fpWen = Bool()
232730cfbc0SXuan Hu    val vecWen = Bool()
233bf35baadSXuan Hu    val pdest = UInt(pregIdxWidth.W)
234bf35baadSXuan Hu
235730cfbc0SXuan Hu    /**
236730cfbc0SXuan Hu      * @param successor Seq[(psrc, srcType)]
237730cfbc0SXuan Hu      * @return Seq[if wakeup psrc]
238730cfbc0SXuan Hu      */
239730cfbc0SXuan Hu    def wakeUp(successor: Seq[(UInt, UInt)], valid: Bool): Seq[Bool] = {
240730cfbc0SXuan Hu      successor.map { case (thatPsrc, srcType) =>
241730cfbc0SXuan Hu        val pdestMatch = pdest === thatPsrc
242730cfbc0SXuan Hu        pdestMatch && (
243730cfbc0SXuan Hu          SrcType.isFp(srcType) && this.fpWen ||
244730cfbc0SXuan Hu            SrcType.isXp(srcType) && this.rfWen ||
245730cfbc0SXuan Hu            SrcType.isVp(srcType) && this.vecWen
246730cfbc0SXuan Hu          ) && valid
247730cfbc0SXuan Hu      }
248730cfbc0SXuan Hu    }
249bf35baadSXuan Hu
250c0be7f33SXuan Hu    def hasOnlyOneSource: Boolean = exuIndices.size == 1
251c0be7f33SXuan Hu
252c0be7f33SXuan Hu    def hasMultiSources: Boolean = exuIndices.size > 1
253c0be7f33SXuan Hu
254c0be7f33SXuan Hu    def isWBWakeUp = this.isInstanceOf[IssueQueueWBWakeUpBundle]
255c0be7f33SXuan Hu
256c0be7f33SXuan Hu    def isIQWakeUp = this.isInstanceOf[IssueQueueIQWakeUpBundle]
257c0be7f33SXuan Hu
258c0be7f33SXuan Hu    def exuIdx: Int = {
259c0be7f33SXuan Hu      require(hasOnlyOneSource)
260c0be7f33SXuan Hu      this.exuIndices.head
261c0be7f33SXuan Hu    }
262c0be7f33SXuan Hu  }
263c0be7f33SXuan Hu
264c0be7f33SXuan Hu  class IssueQueueWBWakeUpBundle(exuIndices: Seq[Int], backendParams: BackendParams) extends IssueQueueWakeUpBaseBundle(backendParams.pregIdxWidth, exuIndices) {
265c0be7f33SXuan Hu
266c0be7f33SXuan Hu  }
267c0be7f33SXuan Hu
268c0be7f33SXuan Hu  class IssueQueueIQWakeUpBundle(exuIdx: Int, backendParams: BackendParams) extends IssueQueueWakeUpBaseBundle(backendParams.pregIdxWidth, Seq(exuIdx)) {
2690f55a0d3SHaojin Tang    val loadDependency = Vec(backendParams.LduCnt, UInt(3.W))
270c0be7f33SXuan Hu    def fromExuInput(exuInput: ExuInput, l2ExuVecs: Vec[Vec[Bool]]): Unit = {
271bf35baadSXuan Hu      this.rfWen := exuInput.rfWen.getOrElse(false.B)
272bf35baadSXuan Hu      this.fpWen := exuInput.fpWen.getOrElse(false.B)
273bf35baadSXuan Hu      this.vecWen := exuInput.vecWen.getOrElse(false.B)
274bf35baadSXuan Hu      this.pdest := exuInput.pdest
275c0be7f33SXuan Hu    }
276e63b0a03SXuan Hu
277e63b0a03SXuan Hu    def fromExuInput(exuInput: ExuInput): Unit = {
278e63b0a03SXuan Hu      this.rfWen := exuInput.rfWen.getOrElse(false.B)
279e63b0a03SXuan Hu      this.fpWen := exuInput.fpWen.getOrElse(false.B)
280e63b0a03SXuan Hu      this.vecWen := exuInput.vecWen.getOrElse(false.B)
281e63b0a03SXuan Hu      this.pdest := exuInput.pdest
282e63b0a03SXuan Hu    }
283c0be7f33SXuan Hu  }
284bf35baadSXuan Hu
285730cfbc0SXuan Hu  class VPUCtrlSignals(implicit p: Parameters) extends XSBundle {
28678dc7ed0SXuan Hu    // vtype
287730cfbc0SXuan Hu    val vill      = Bool()
28878dc7ed0SXuan Hu    val vma       = Bool()    // 1: agnostic, 0: undisturbed
28978dc7ed0SXuan Hu    val vta       = Bool()    // 1: agnostic, 0: undisturbed
29078dc7ed0SXuan Hu    val vsew      = VSew()
29178dc7ed0SXuan Hu    val vlmul     = VLmul()   // 1/8~8      --> -3~3
29278dc7ed0SXuan Hu
29378dc7ed0SXuan Hu    val vm        = Bool()    // 0: need v0.t
29478dc7ed0SXuan Hu    val vstart    = Vl()
29578dc7ed0SXuan Hu
29678dc7ed0SXuan Hu    // float rounding mode
29778dc7ed0SXuan Hu    val frm       = Frm()
298582849ffSxiaofeibao-xjtu    // scalar float instr and vector float reduction
299bdda74fdSxiaofeibao-xjtu    val fpu       = Fpu()
30078dc7ed0SXuan Hu    // vector fix int rounding mode
30178dc7ed0SXuan Hu    val vxrm      = Vxrm()
30278dc7ed0SXuan Hu    // vector uop index, exclude other non-vector uop
303303b5478SXuan Hu    val vuopIdx   = UopIdx()
30478dc7ed0SXuan Hu    // maybe used if data dependancy
30578dc7ed0SXuan Hu    val vmask     = UInt(MaskSrcData().dataWidth.W)
30678dc7ed0SXuan Hu    val vl        = Vl()
30778dc7ed0SXuan Hu
308730cfbc0SXuan Hu    // vector load/store
30978dc7ed0SXuan Hu    val nf        = Nf()
310b6b11f60SXuan Hu
31142475509SXuan Hu    val needScalaSrc       = Bool()
312ad22c988SZiyue Zhang    val permImmTruncate    = Bool() // opivi
31342475509SXuan Hu
314b6b11f60SXuan Hu    val isReverse = Bool() // vrsub, vrdiv
315b6b11f60SXuan Hu    val isExt     = Bool()
316b6b11f60SXuan Hu    val isNarrow  = Bool()
317b6b11f60SXuan Hu    val isDstMask = Bool() // vvm, vvvm, mmm
31830fcc710SZiyue Zhang    val isOpMask  = Bool() // vmand, vmnand
319b6b11f60SXuan Hu    val isMove    = Bool() // vmv.s.x, vmv.v.v, vmv.v.x, vmv.v.i
320b6b11f60SXuan Hu
321b6b11f60SXuan Hu    def vtype: VType = {
322b6b11f60SXuan Hu      val res = Wire(VType())
323b6b11f60SXuan Hu      res.illegal := this.vill
324b6b11f60SXuan Hu      res.vma     := this.vma
325b6b11f60SXuan Hu      res.vta     := this.vta
326b6b11f60SXuan Hu      res.vsew    := this.vsew
327b6b11f60SXuan Hu      res.vlmul   := this.vlmul
328b6b11f60SXuan Hu      res
329b6b11f60SXuan Hu    }
330b6b11f60SXuan Hu
331b6b11f60SXuan Hu    def vconfig: VConfig = {
332b6b11f60SXuan Hu      val res = Wire(VConfig())
333b6b11f60SXuan Hu      res.vtype := this.vtype
334b6b11f60SXuan Hu      res.vl    := this.vl
335b6b11f60SXuan Hu      res
336b6b11f60SXuan Hu    }
337730cfbc0SXuan Hu  }
338730cfbc0SXuan Hu
339730cfbc0SXuan Hu  // DynInst --[IssueQueue]--> DataPath
340730cfbc0SXuan Hu  class IssueQueueIssueBundle(
341730cfbc0SXuan Hu    iqParams: IssueBlockParams,
34239c59369SXuan Hu    val exuParams: ExeUnitParams,
343730cfbc0SXuan Hu  )(implicit
344730cfbc0SXuan Hu    p: Parameters
345730cfbc0SXuan Hu  ) extends Bundle {
346730cfbc0SXuan Hu    private val rfReadDataCfgSet: Seq[Set[DataConfig]] = exuParams.getRfReadDataCfgSet
347730cfbc0SXuan Hu
348730cfbc0SXuan Hu    val rf: MixedVec[MixedVec[RfReadPortWithConfig]] = Flipped(MixedVec(
349730cfbc0SXuan Hu      rfReadDataCfgSet.map((set: Set[DataConfig]) =>
35039c59369SXuan Hu        MixedVec(set.map((x: DataConfig) => new RfReadPortWithConfig(x, exuParams.rdPregIdxWidth)).toSeq)
351730cfbc0SXuan Hu      )
352730cfbc0SXuan Hu    ))
353bf35baadSXuan Hu
354730cfbc0SXuan Hu    val srcType = Vec(exuParams.numRegSrc, SrcType()) // used to select imm or reg data
355730cfbc0SXuan Hu    val immType = SelImm()                         // used to select imm extractor
356730cfbc0SXuan Hu    val common = new ExuInput(exuParams)
357730cfbc0SXuan Hu    val addrOH = UInt(iqParams.numEntries.W)
358730cfbc0SXuan Hu
359c0be7f33SXuan Hu    def exuIdx = exuParams.exuIdx
360730cfbc0SXuan Hu    def getSource: SchedulerType = exuParams.getWBSource
3613fd20becSczw    def getIntWbBusyBundle = common.rfWen.toSeq
3623fd20becSczw    def getVfWbBusyBundle = common.getVfWen.toSeq
363730cfbc0SXuan Hu    def getIntRfReadBundle: Seq[RfReadPortWithConfig] = rf.flatten.filter(_.readInt)
364b6b11f60SXuan Hu    def getVfRfReadBundle: Seq[RfReadPortWithConfig] = rf.flatten.filter(_.readVf)
36539c59369SXuan Hu
36639c59369SXuan Hu    def getIntRfReadValidBundle(issueValid: Bool): Seq[ValidIO[RfReadPortWithConfig]] = {
36739c59369SXuan Hu      getIntRfReadBundle.zip(srcType).map {
36839c59369SXuan Hu        case (rfRd: RfReadPortWithConfig, t: UInt) =>
36939c59369SXuan Hu          makeValid(issueValid && SrcType.isXp(t), rfRd)
37039c59369SXuan Hu      }
37139c59369SXuan Hu    }
37239c59369SXuan Hu
37339c59369SXuan Hu    def getVfRfReadValidBundle(issueValid: Bool): Seq[ValidIO[RfReadPortWithConfig]] = {
37439c59369SXuan Hu      getVfRfReadBundle.zip(srcType).map {
37539c59369SXuan Hu        case (rfRd: RfReadPortWithConfig, t: UInt) =>
37639c59369SXuan Hu          makeValid(issueValid && SrcType.isVfp(t), rfRd)
37739c59369SXuan Hu      }
37839c59369SXuan Hu    }
37939c59369SXuan Hu
38039c59369SXuan Hu    def getIntRfWriteValidBundle(issueValid: Bool) = {
38139c59369SXuan Hu
38239c59369SXuan Hu    }
383730cfbc0SXuan Hu  }
384730cfbc0SXuan Hu
385730cfbc0SXuan Hu  class OGRespBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
386d54d930bSfdy    val issueQueueParams = this.params
3875db4956bSzhanglyGit    val og0resp = Valid(new EntryDeqRespBundle)
3885db4956bSzhanglyGit    val og1resp = Valid(new EntryDeqRespBundle)
389730cfbc0SXuan Hu  }
390730cfbc0SXuan Hu
3918d29ec32Sczw  class fuBusyRespBundle(implicit p: Parameters, params: IssueBlockParams) extends Bundle {
3928d29ec32Sczw    val respType = RSFeedbackType() // update credit if needs replay
3938d29ec32Sczw    val rfWen = Bool() // TODO: use params to identify IntWB/VfWB
3948d29ec32Sczw    val fuType = FuType()
3958d29ec32Sczw  }
3968d29ec32Sczw
397dd970561SzhanglyGit  class WbFuBusyTableWriteBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
398dd970561SzhanglyGit    private val intCertainLat = params.intLatencyCertain
399dd970561SzhanglyGit    private val vfCertainLat = params.vfLatencyCertain
400dd970561SzhanglyGit    private val intLat = params.intLatencyValMax
401dd970561SzhanglyGit    private val vfLat = params.vfLatencyValMax
402dd970561SzhanglyGit
403dd970561SzhanglyGit    val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
404dd970561SzhanglyGit    val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
405dd970561SzhanglyGit    val intDeqRespSet = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
406dd970561SzhanglyGit    val vfDeqRespSet = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
4078d29ec32Sczw  }
4088d29ec32Sczw
4092e0a7dc5Sfdy  class WbFuBusyTableReadBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
410bf44d649SXuan Hu    private val intCertainLat = params.intLatencyCertain
411bf44d649SXuan Hu    private val vfCertainLat = params.vfLatencyCertain
412bf44d649SXuan Hu    private val intLat = params.intLatencyValMax
413bf44d649SXuan Hu    private val vfLat = params.vfLatencyValMax
414bf44d649SXuan Hu
415bf44d649SXuan Hu    val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W))
416bf44d649SXuan Hu    val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W))
4172e0a7dc5Sfdy  }
4182e0a7dc5Sfdy
4192e0a7dc5Sfdy  class WbConflictBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
420bf44d649SXuan Hu    private val intCertainLat = params.intLatencyCertain
421bf44d649SXuan Hu    private val vfCertainLat = params.vfLatencyCertain
422bf44d649SXuan Hu
423bf44d649SXuan Hu    val intConflict = OptionWrapper(intCertainLat, Bool())
424bf44d649SXuan Hu    val vfConflict = OptionWrapper(vfCertainLat, Bool())
4252e0a7dc5Sfdy  }
4262e0a7dc5Sfdy
427730cfbc0SXuan Hu  // DataPath --[ExuInput]--> Exu
428730cfbc0SXuan Hu  class ExuInput(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
429730cfbc0SXuan Hu    val fuType        = FuType()
430730cfbc0SXuan Hu    val fuOpType      = FuOpType()
431730cfbc0SXuan Hu    val src           = Vec(params.numRegSrc, UInt(params.dataBitsMax.W))
432730cfbc0SXuan Hu    val imm           = UInt(XLEN.W)
433730cfbc0SXuan Hu    val robIdx        = new RobPtr
434730cfbc0SXuan Hu    val iqIdx         = UInt(log2Up(MemIQSizeMax).W)// Only used by store yet
435730cfbc0SXuan Hu    val isFirstIssue  = Bool()                      // Only used by store yet
436730cfbc0SXuan Hu    val pdest         = UInt(params.wbPregIdxWidth.W)
437730cfbc0SXuan Hu    val rfWen         = if (params.writeIntRf)    Some(Bool())                        else None
438730cfbc0SXuan Hu    val fpWen         = if (params.writeFpRf)     Some(Bool())                        else None
439730cfbc0SXuan Hu    val vecWen        = if (params.writeVecRf)    Some(Bool())                        else None
4403bc74e23SzhanglyGit    val fpu           = if (params.writeFflags)   Some(new FPUCtrlSignals)            else None
441b6b11f60SXuan Hu    val vpu           = if (params.needVPUCtrl)   Some(new VPUCtrlSignals)            else None
442730cfbc0SXuan Hu    val flushPipe     = if (params.flushPipe)     Some(Bool())                        else None
443730cfbc0SXuan Hu    val pc            = if (params.needPc)        Some(UInt(VAddrData().dataWidth.W)) else None
444730cfbc0SXuan Hu    val preDecode     = if (params.hasPredecode)  Some(new PreDecodeInfo)             else None
445730cfbc0SXuan Hu    val ftqIdx        = if (params.needPc || params.replayInst)
446730cfbc0SXuan Hu                                                  Some(new FtqPtr)                    else None
447730cfbc0SXuan Hu    val ftqOffset     = if (params.needPc || params.replayInst)
448730cfbc0SXuan Hu                                                  Some(UInt(log2Up(PredictWidth).W))  else None
449730cfbc0SXuan Hu    val predictInfo   = if (params.hasPredecode)  Some(new Bundle {
450730cfbc0SXuan Hu      val target = UInt(VAddrData().dataWidth.W)
451730cfbc0SXuan Hu      val taken = Bool()
452730cfbc0SXuan Hu    }) else None
453730cfbc0SXuan Hu    val sqIdx = if (params.hasMemAddrFu || params.hasStdFu) Some(new SqPtr) else None
454730cfbc0SXuan Hu    val lqIdx = if (params.hasMemAddrFu) Some(new LqPtr) else None
455c0be7f33SXuan Hu    val dataSources = Vec(params.numRegSrc, DataSource())
456bc7d6943SzhanglyGit    val l1ExuVec = Vec(params.numRegSrc, ExuVec())
457ea46c302SXuan Hu    val srcTimer = OptionWrapper(params.isIQWakeUpSink, Vec(params.numRegSrc, UInt(3.W)))
4580f55a0d3SHaojin Tang    val loadDependency = OptionWrapper(params.isIQWakeUpSink, Vec(LoadPipelineWidth, UInt(3.W)))
4590f55a0d3SHaojin Tang    val deqPortIdx = OptionWrapper(params.hasLoadFu, UInt(log2Ceil(LoadPipelineWidth).W))
460c0be7f33SXuan Hu
46196e858baSXuan Hu    val perfDebugInfo = new PerfDebugInfo()
46296e858baSXuan Hu
463c0be7f33SXuan Hu    def exuIdx = this.params.exuIdx
464c0be7f33SXuan Hu
465c0be7f33SXuan Hu    def needCancel(og0CancelVec: Vec[Bool], og1CancelVec: Vec[Bool]) : Bool = {
466c0be7f33SXuan Hu      if (params.isIQWakeUpSink) {
467c0be7f33SXuan Hu        require(
468bc7d6943SzhanglyGit          og0CancelVec.size == l1ExuVec.head.size,
469c0be7f33SXuan Hu          s"cancelVecSize: {og0: ${og0CancelVec.size}, og1: ${og1CancelVec.size}}"
470c0be7f33SXuan Hu        )
471bc7d6943SzhanglyGit        val l1Cancel: Bool = l1ExuVec.zip(srcTimer.get).map {
472ea46c302SXuan Hu          case(exuOH: Vec[Bool], srcTimer: UInt) =>
473ea46c302SXuan Hu            (exuOH.asUInt & og0CancelVec.asUInt).orR && srcTimer === 1.U
474ea46c302SXuan Hu        }.reduce(_ | _)
47510434c39SXuan Hu        l1Cancel
476c0be7f33SXuan Hu      } else {
477c0be7f33SXuan Hu        false.B
478c0be7f33SXuan Hu      }
479c0be7f33SXuan Hu    }
480730cfbc0SXuan Hu
4813fd20becSczw    def getVfWen = {
4823fd20becSczw      if (params.writeFpRf) this.fpWen
4833fd20becSczw      else if(params.writeVecRf) this.vecWen
4843fd20becSczw      else None
4853fd20becSczw    }
4863fd20becSczw
487730cfbc0SXuan Hu    def fromIssueBundle(source: IssueQueueIssueBundle): Unit = {
488730cfbc0SXuan Hu      // src is assigned to rfReadData
489730cfbc0SXuan Hu      this.fuType        := source.common.fuType
490730cfbc0SXuan Hu      this.fuOpType      := source.common.fuOpType
491730cfbc0SXuan Hu      this.imm           := source.common.imm
492730cfbc0SXuan Hu      this.robIdx        := source.common.robIdx
493730cfbc0SXuan Hu      this.pdest         := source.common.pdest
494730cfbc0SXuan Hu      this.isFirstIssue  := source.common.isFirstIssue // Only used by mem debug log
495730cfbc0SXuan Hu      this.iqIdx         := source.common.iqIdx        // Only used by mem feedback
496c0be7f33SXuan Hu      this.dataSources   := source.common.dataSources
497bc7d6943SzhanglyGit      this.l1ExuVec     := source.common.l1ExuVec
498730cfbc0SXuan Hu      this.rfWen         .foreach(_ := source.common.rfWen.get)
499730cfbc0SXuan Hu      this.fpWen         .foreach(_ := source.common.fpWen.get)
500730cfbc0SXuan Hu      this.vecWen        .foreach(_ := source.common.vecWen.get)
501730cfbc0SXuan Hu      this.fpu           .foreach(_ := source.common.fpu.get)
502374ba8afSXuan Hu      this.vpu           .foreach(_ := source.common.vpu.get)
503730cfbc0SXuan Hu      this.flushPipe     .foreach(_ := source.common.flushPipe.get)
504427cfec3SHaojin Tang      this.pc            .foreach(_ := source.common.pc.get)
505730cfbc0SXuan Hu      this.preDecode     .foreach(_ := source.common.preDecode.get)
506730cfbc0SXuan Hu      this.ftqIdx        .foreach(_ := source.common.ftqIdx.get)
507730cfbc0SXuan Hu      this.ftqOffset     .foreach(_ := source.common.ftqOffset.get)
508730cfbc0SXuan Hu      this.predictInfo   .foreach(_ := source.common.predictInfo.get)
509730cfbc0SXuan Hu      this.lqIdx         .foreach(_ := source.common.lqIdx.get)
510730cfbc0SXuan Hu      this.sqIdx         .foreach(_ := source.common.sqIdx.get)
511ea46c302SXuan Hu      this.srcTimer      .foreach(_ := source.common.srcTimer.get)
5120f55a0d3SHaojin Tang      this.loadDependency.foreach(_ := source.common.loadDependency.get.map(_ << 1))
5130f55a0d3SHaojin Tang      this.deqPortIdx    .foreach(_ := source.common.deqPortIdx.get)
514730cfbc0SXuan Hu    }
515730cfbc0SXuan Hu  }
516730cfbc0SXuan Hu
517730cfbc0SXuan Hu  // ExuInput --[FuncUnit]--> ExuOutput
518730cfbc0SXuan Hu  class ExuOutput(
519730cfbc0SXuan Hu    val params: ExeUnitParams,
520730cfbc0SXuan Hu  )(implicit
521730cfbc0SXuan Hu    val p: Parameters
522730cfbc0SXuan Hu  ) extends Bundle with BundleSource with HasXSParameter {
523730cfbc0SXuan Hu    val data         = UInt(params.dataBitsMax.W)
524730cfbc0SXuan Hu    val pdest        = UInt(params.wbPregIdxWidth.W)
525730cfbc0SXuan Hu    val robIdx       = new RobPtr
526730cfbc0SXuan Hu    val intWen       = if (params.writeIntRf)   Some(Bool())                  else None
527730cfbc0SXuan Hu    val fpWen        = if (params.writeFpRf)    Some(Bool())                  else None
528730cfbc0SXuan Hu    val vecWen       = if (params.writeVecRf)   Some(Bool())                  else None
529730cfbc0SXuan Hu    val redirect     = if (params.hasRedirect)  Some(ValidIO(new Redirect))   else None
530730cfbc0SXuan Hu    val fflags       = if (params.writeFflags)  Some(UInt(5.W))               else None
5313bc74e23SzhanglyGit    val wflags       = if (params.writeFflags)  Some(Bool())                  else None
532a8db15d8Sfdy    val vxsat        = if (params.writeVxsat)   Some(Bool())                  else None
533730cfbc0SXuan Hu    val exceptionVec = if (params.exceptionOut.nonEmpty) Some(ExceptionVec()) else None
534730cfbc0SXuan Hu    val flushPipe    = if (params.flushPipe)    Some(Bool())                  else None
535730cfbc0SXuan Hu    val replay       = if (params.replayInst)   Some(Bool())                  else None
536730cfbc0SXuan Hu    val lqIdx        = if (params.hasLoadFu)    Some(new LqPtr())             else None
537730cfbc0SXuan Hu    val sqIdx        = if (params.hasStoreAddrFu || params.hasStdFu)
538730cfbc0SXuan Hu                                                Some(new SqPtr())             else None
539730cfbc0SXuan Hu    // uop info
540730cfbc0SXuan Hu    val predecodeInfo = if(params.hasPredecode) Some(new PreDecodeInfo) else None
541730cfbc0SXuan Hu    val debug = new DebugBundle
542730cfbc0SXuan Hu    val debugInfo = new PerfDebugInfo
543730cfbc0SXuan Hu  }
544730cfbc0SXuan Hu
545730cfbc0SXuan Hu  // ExuOutput + DynInst --> WriteBackBundle
54639c59369SXuan Hu  class WriteBackBundle(val params: PregWB, backendParams: BackendParams)(implicit p: Parameters) extends Bundle with BundleSource {
547730cfbc0SXuan Hu    val rfWen = Bool()
548730cfbc0SXuan Hu    val fpWen = Bool()
549730cfbc0SXuan Hu    val vecWen = Bool()
55039c59369SXuan Hu    val pdest = UInt(params.pregIdxWidth(backendParams).W)
551730cfbc0SXuan Hu    val data = UInt(params.dataWidth.W)
552730cfbc0SXuan Hu    val robIdx = new RobPtr()(p)
553730cfbc0SXuan Hu    val flushPipe = Bool()
554730cfbc0SXuan Hu    val replayInst = Bool()
555730cfbc0SXuan Hu    val redirect = ValidIO(new Redirect)
556730cfbc0SXuan Hu    val fflags = UInt(5.W)
55701ceb97cSZiyue Zhang    val vxsat = Bool()
558730cfbc0SXuan Hu    val exceptionVec = ExceptionVec()
559730cfbc0SXuan Hu    val debug = new DebugBundle
560730cfbc0SXuan Hu    val debugInfo = new PerfDebugInfo
561730cfbc0SXuan Hu
562bf35baadSXuan Hu    this.wakeupSource = s"WB(${params.toString})"
563bf35baadSXuan Hu
564730cfbc0SXuan Hu    def fromExuOutput(source: ExuOutput) = {
565730cfbc0SXuan Hu      this.rfWen  := source.intWen.getOrElse(false.B)
566730cfbc0SXuan Hu      this.fpWen  := source.fpWen.getOrElse(false.B)
567730cfbc0SXuan Hu      this.vecWen := source.vecWen.getOrElse(false.B)
568730cfbc0SXuan Hu      this.pdest  := source.pdest
569730cfbc0SXuan Hu      this.data   := source.data
570730cfbc0SXuan Hu      this.robIdx := source.robIdx
571730cfbc0SXuan Hu      this.flushPipe := source.flushPipe.getOrElse(false.B)
572730cfbc0SXuan Hu      this.replayInst := source.replay.getOrElse(false.B)
573730cfbc0SXuan Hu      this.redirect := source.redirect.getOrElse(0.U.asTypeOf(this.redirect))
574730cfbc0SXuan Hu      this.fflags := source.fflags.getOrElse(0.U.asTypeOf(this.fflags))
57501ceb97cSZiyue Zhang      this.vxsat := source.vxsat.getOrElse(0.U.asTypeOf(this.vxsat))
576730cfbc0SXuan Hu      this.exceptionVec := source.exceptionVec.getOrElse(0.U.asTypeOf(this.exceptionVec))
577730cfbc0SXuan Hu      this.debug := source.debug
578730cfbc0SXuan Hu      this.debugInfo := source.debugInfo
579730cfbc0SXuan Hu    }
580730cfbc0SXuan Hu
581730cfbc0SXuan Hu    def asIntRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
58239c59369SXuan Hu      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(IntData()).addrWidth)))
583730cfbc0SXuan Hu      rfWrite.wen := this.rfWen && fire
584730cfbc0SXuan Hu      rfWrite.addr := this.pdest
585730cfbc0SXuan Hu      rfWrite.data := this.data
586730cfbc0SXuan Hu      rfWrite.intWen := this.rfWen
587730cfbc0SXuan Hu      rfWrite.fpWen := false.B
588730cfbc0SXuan Hu      rfWrite.vecWen := false.B
589730cfbc0SXuan Hu      rfWrite
590730cfbc0SXuan Hu    }
591730cfbc0SXuan Hu
592730cfbc0SXuan Hu    def asVfRfWriteBundle(fire: Bool): RfWritePortWithConfig = {
59339c59369SXuan Hu      val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(VecData()).addrWidth)))
594730cfbc0SXuan Hu      rfWrite.wen := (this.fpWen || this.vecWen) && fire
595730cfbc0SXuan Hu      rfWrite.addr := this.pdest
596730cfbc0SXuan Hu      rfWrite.data := this.data
597730cfbc0SXuan Hu      rfWrite.intWen := false.B
598730cfbc0SXuan Hu      rfWrite.fpWen := this.fpWen
599730cfbc0SXuan Hu      rfWrite.vecWen := this.vecWen
600730cfbc0SXuan Hu      rfWrite
601730cfbc0SXuan Hu    }
602730cfbc0SXuan Hu  }
603730cfbc0SXuan Hu
6045d2b9cadSXuan Hu  // ExuOutput --> ExuBypassBundle --[DataPath]-->ExuInput
6055d2b9cadSXuan Hu  //                                /
6065d2b9cadSXuan Hu  //     [IssueQueue]--> ExuInput --
6075d2b9cadSXuan Hu  class ExuBypassBundle(
6085d2b9cadSXuan Hu    val params: ExeUnitParams,
6095d2b9cadSXuan Hu  )(implicit
6105d2b9cadSXuan Hu    val p: Parameters
6115d2b9cadSXuan Hu  ) extends Bundle {
6125d2b9cadSXuan Hu    val data  = UInt(params.dataBitsMax.W)
6135d2b9cadSXuan Hu    val pdest = UInt(params.wbPregIdxWidth.W)
6145d2b9cadSXuan Hu  }
6155d2b9cadSXuan Hu
616730cfbc0SXuan Hu  class ExceptionInfo extends Bundle {
617730cfbc0SXuan Hu    val pc = UInt(VAddrData().dataWidth.W)
618730cfbc0SXuan Hu    val instr = UInt(32.W)
619730cfbc0SXuan Hu    val commitType = CommitType()
620730cfbc0SXuan Hu    val exceptionVec = ExceptionVec()
621730cfbc0SXuan Hu    val singleStep = Bool()
622730cfbc0SXuan Hu    val crossPageIPFFix = Bool()
623730cfbc0SXuan Hu    val isInterrupt = Bool()
624730cfbc0SXuan Hu  }
625730cfbc0SXuan Hu
626303b5478SXuan Hu  object UopIdx {
627303b5478SXuan Hu    def apply()(implicit p: Parameters): UInt = UInt(log2Up(p(XSCoreParamsKey).MaxUopSize + 1).W)
628303b5478SXuan Hu  }
629303b5478SXuan Hu
630bf35baadSXuan Hu  object FuLatency {
631bf35baadSXuan Hu    def apply(): UInt = UInt(width.W)
632bf35baadSXuan Hu
633bf35baadSXuan Hu    def width = 4 // 0~15 // Todo: assosiate it with FuConfig
634bf35baadSXuan Hu  }
635bf35baadSXuan Hu
636c0be7f33SXuan Hu  object ExuVec {
637bf35baadSXuan Hu    def apply(exuNum: Int): Vec[Bool] = Vec(exuNum, Bool())
638bf35baadSXuan Hu
639bf35baadSXuan Hu    def apply()(implicit p: Parameters): Vec[Bool] = Vec(width, Bool())
640bf35baadSXuan Hu
641bf35baadSXuan Hu    def width(implicit p: Parameters): Int = p(XSCoreParamsKey).backendParams.numExu
642bf35baadSXuan Hu  }
643bf35baadSXuan Hu
644bc7d6943SzhanglyGit  class CancelSignal(implicit p: Parameters) extends XSBundle {
645bc7d6943SzhanglyGit    val rfWen = Bool()
64673b1b2e4SzhanglyGit    val fpWen = Bool()
64773b1b2e4SzhanglyGit    val vecWen = Bool()
648bc7d6943SzhanglyGit    val pdest = UInt(PhyRegIdxWidth.W)
649bc7d6943SzhanglyGit
650bc7d6943SzhanglyGit    def needCancel(srcType: UInt, psrc: UInt, valid: Bool): Bool = {
651bc7d6943SzhanglyGit      val pdestMatch = pdest === psrc
652bc7d6943SzhanglyGit      pdestMatch && (
653bc7d6943SzhanglyGit        SrcType.isFp(srcType) && !this.rfWen ||
654bc7d6943SzhanglyGit          SrcType.isXp(srcType) && this.rfWen ||
655bc7d6943SzhanglyGit          SrcType.isVp(srcType) && !this.rfWen
656bc7d6943SzhanglyGit        ) && valid
657bc7d6943SzhanglyGit    }
658bc7d6943SzhanglyGit  }
659bc7d6943SzhanglyGit
6604ee69032SzhanglyGit  class MemExuInput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle {
661730cfbc0SXuan Hu    val uop = new DynInst
6624ee69032SzhanglyGit    val src = if (isVector) Vec(5, UInt(VLEN.W)) else Vec(3, UInt(XLEN.W))
663730cfbc0SXuan Hu    val iqIdx = UInt(log2Up(MemIQSizeMax).W)
664730cfbc0SXuan Hu    val isFirstIssue = Bool()
6650f55a0d3SHaojin Tang    val deqPortIdx = UInt(log2Ceil(LoadPipelineWidth).W)
666730cfbc0SXuan Hu  }
667730cfbc0SXuan Hu
6684ee69032SzhanglyGit  class MemExuOutput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle {
669730cfbc0SXuan Hu    val uop = new DynInst
6704ee69032SzhanglyGit    val data = if (isVector) UInt(VLEN.W) else UInt(XLEN.W)
671730cfbc0SXuan Hu    val debug = new DebugBundle
672730cfbc0SXuan Hu  }
673730cfbc0SXuan Hu
674730cfbc0SXuan Hu  class MemMicroOpRbExt(implicit p: Parameters) extends XSBundle {
675730cfbc0SXuan Hu    val uop = new DynInst
676730cfbc0SXuan Hu    val flag = UInt(1.W)
677730cfbc0SXuan Hu  }
6780f55a0d3SHaojin Tang
6790f55a0d3SHaojin Tang  object LoadShouldCancel {
6800f55a0d3SHaojin Tang    def apply(loadDependency: Option[Seq[UInt]], ldCancel: Seq[LoadCancelIO]): Bool = {
6810f55a0d3SHaojin Tang      val ld1Cancel = loadDependency.map(deps =>
6820f55a0d3SHaojin Tang        deps.zipWithIndex.map { case (dep, ldPortIdx) =>
6830f55a0d3SHaojin Tang          ldCancel.map(_.ld1Cancel).map(cancel => cancel.fire && dep(1) && cancel.bits === ldPortIdx.U).reduce(_ || _)
6840f55a0d3SHaojin Tang        }.reduce(_ || _)
6850f55a0d3SHaojin Tang      )
6860f55a0d3SHaojin Tang      val ld2Cancel = loadDependency.map(deps =>
6870f55a0d3SHaojin Tang        deps.zipWithIndex.map { case (dep, ldPortIdx) =>
6880f55a0d3SHaojin Tang          ldCancel.map(_.ld2Cancel).map(cancel => cancel.fire && dep(2) && cancel.bits === ldPortIdx.U).reduce(_ || _)
6890f55a0d3SHaojin Tang        }.reduce(_ || _)
6900f55a0d3SHaojin Tang      )
6910f55a0d3SHaojin Tang      ld1Cancel.map(_ || ld2Cancel.get).getOrElse(false.B)
6920f55a0d3SHaojin Tang    }
6930f55a0d3SHaojin Tang  }
694730cfbc0SXuan Hu}
695