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