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