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._ 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()) 1637a96cc7fSHaojin Tang val l1ExuOH = Vec(numSrc, ExuOH()) 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) 168f1ba628bSHaojin 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)) { 269b133b458SXuan Hu val loadDependency = Vec(backendParams.LduCnt + backendParams.HyuCnt, UInt(3.W)) 270b133b458SXuan Hu def fromExuInput(exuInput: ExuInput, l2ExuVecs: Vec[UInt]): 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() 3042d270511Ssinsanction val lastUop = Bool() 30578dc7ed0SXuan Hu // maybe used if data dependancy 30678dc7ed0SXuan Hu val vmask = UInt(MaskSrcData().dataWidth.W) 30778dc7ed0SXuan Hu val vl = Vl() 30878dc7ed0SXuan Hu 309730cfbc0SXuan Hu // vector load/store 31078dc7ed0SXuan Hu val nf = Nf() 311d9355d3aSZiyue-Zhang val veew = VEew() 312b6b11f60SXuan Hu 31342475509SXuan Hu val needScalaSrc = Bool() 31442475509SXuan Hu 315b6b11f60SXuan Hu val isReverse = Bool() // vrsub, vrdiv 316b6b11f60SXuan Hu val isExt = Bool() 317b6b11f60SXuan Hu val isNarrow = Bool() 318b6b11f60SXuan Hu val isDstMask = Bool() // vvm, vvvm, mmm 31930fcc710SZiyue Zhang val isOpMask = Bool() // vmand, vmnand 320b6b11f60SXuan Hu val isMove = Bool() // vmv.s.x, vmv.v.v, vmv.v.x, vmv.v.i 321b6b11f60SXuan Hu 322b6b11f60SXuan Hu def vtype: VType = { 323b6b11f60SXuan Hu val res = Wire(VType()) 324b6b11f60SXuan Hu res.illegal := this.vill 325b6b11f60SXuan Hu res.vma := this.vma 326b6b11f60SXuan Hu res.vta := this.vta 327b6b11f60SXuan Hu res.vsew := this.vsew 328b6b11f60SXuan Hu res.vlmul := this.vlmul 329b6b11f60SXuan Hu res 330b6b11f60SXuan Hu } 331b6b11f60SXuan Hu 332b6b11f60SXuan Hu def vconfig: VConfig = { 333b6b11f60SXuan Hu val res = Wire(VConfig()) 334b6b11f60SXuan Hu res.vtype := this.vtype 335b6b11f60SXuan Hu res.vl := this.vl 336b6b11f60SXuan Hu res 337b6b11f60SXuan Hu } 338730cfbc0SXuan Hu } 339730cfbc0SXuan Hu 340730cfbc0SXuan Hu // DynInst --[IssueQueue]--> DataPath 341730cfbc0SXuan Hu class IssueQueueIssueBundle( 342730cfbc0SXuan Hu iqParams: IssueBlockParams, 34339c59369SXuan Hu val exuParams: ExeUnitParams, 344730cfbc0SXuan Hu )(implicit 345730cfbc0SXuan Hu p: Parameters 346730cfbc0SXuan Hu ) extends Bundle { 347730cfbc0SXuan Hu private val rfReadDataCfgSet: Seq[Set[DataConfig]] = exuParams.getRfReadDataCfgSet 3480bfd9349SZiyue Zhang // check which set both have fp and vec and remove fp 3490bfd9349SZiyue Zhang private val rfReadDataCfgSetFilterFp = rfReadDataCfgSet.map((set: Set[DataConfig]) => 3500bfd9349SZiyue Zhang if (set.contains(FpData()) && set.contains(VecData())) set.filter(_ != FpData()) 3510bfd9349SZiyue Zhang else set 3520bfd9349SZiyue Zhang ) 353730cfbc0SXuan Hu 354730cfbc0SXuan Hu val rf: MixedVec[MixedVec[RfReadPortWithConfig]] = Flipped(MixedVec( 3550bfd9349SZiyue Zhang rfReadDataCfgSetFilterFp.map((set: Set[DataConfig]) => 35639c59369SXuan Hu MixedVec(set.map((x: DataConfig) => new RfReadPortWithConfig(x, exuParams.rdPregIdxWidth)).toSeq) 357730cfbc0SXuan Hu ) 358730cfbc0SXuan Hu )) 359bf35baadSXuan Hu 360730cfbc0SXuan Hu val srcType = Vec(exuParams.numRegSrc, SrcType()) // used to select imm or reg data 361730cfbc0SXuan Hu val immType = SelImm() // used to select imm extractor 362730cfbc0SXuan Hu val common = new ExuInput(exuParams) 363730cfbc0SXuan Hu val addrOH = UInt(iqParams.numEntries.W) 364730cfbc0SXuan Hu 365c0be7f33SXuan Hu def exuIdx = exuParams.exuIdx 366730cfbc0SXuan Hu def getSource: SchedulerType = exuParams.getWBSource 3673fd20becSczw def getIntWbBusyBundle = common.rfWen.toSeq 3683fd20becSczw def getVfWbBusyBundle = common.getVfWen.toSeq 36983ba63b3SXuan Hu def getIntRfReadBundle: Seq[RfReadPortWithConfig] = rf.flatten.filter(_.readInt).toSeq 37083ba63b3SXuan Hu def getVfRfReadBundle: Seq[RfReadPortWithConfig] = rf.flatten.filter(_.readVf).toSeq 37139c59369SXuan Hu 37239c59369SXuan Hu def getIntRfReadValidBundle(issueValid: Bool): Seq[ValidIO[RfReadPortWithConfig]] = { 37339c59369SXuan Hu getIntRfReadBundle.zip(srcType).map { 37439c59369SXuan Hu case (rfRd: RfReadPortWithConfig, t: UInt) => 37539c59369SXuan Hu makeValid(issueValid && SrcType.isXp(t), rfRd) 37639c59369SXuan Hu } 37739c59369SXuan Hu } 37839c59369SXuan Hu 37939c59369SXuan Hu def getVfRfReadValidBundle(issueValid: Bool): Seq[ValidIO[RfReadPortWithConfig]] = { 38039c59369SXuan Hu getVfRfReadBundle.zip(srcType).map { 38139c59369SXuan Hu case (rfRd: RfReadPortWithConfig, t: UInt) => 38239c59369SXuan Hu makeValid(issueValid && SrcType.isVfp(t), rfRd) 38339c59369SXuan Hu } 38439c59369SXuan Hu } 38539c59369SXuan Hu 38639c59369SXuan Hu def getIntRfWriteValidBundle(issueValid: Bool) = { 38739c59369SXuan Hu 38839c59369SXuan Hu } 389730cfbc0SXuan Hu } 390730cfbc0SXuan Hu 391730cfbc0SXuan Hu class OGRespBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle { 392d54d930bSfdy val issueQueueParams = this.params 3935db4956bSzhanglyGit val og0resp = Valid(new EntryDeqRespBundle) 3945db4956bSzhanglyGit val og1resp = Valid(new EntryDeqRespBundle) 395730cfbc0SXuan Hu } 396730cfbc0SXuan Hu 3978d29ec32Sczw class fuBusyRespBundle(implicit p: Parameters, params: IssueBlockParams) extends Bundle { 3988d29ec32Sczw val respType = RSFeedbackType() // update credit if needs replay 3998d29ec32Sczw val rfWen = Bool() // TODO: use params to identify IntWB/VfWB 4008d29ec32Sczw val fuType = FuType() 4018d29ec32Sczw } 4028d29ec32Sczw 403dd970561SzhanglyGit class WbFuBusyTableWriteBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle { 404dd970561SzhanglyGit private val intCertainLat = params.intLatencyCertain 405dd970561SzhanglyGit private val vfCertainLat = params.vfLatencyCertain 406dd970561SzhanglyGit private val intLat = params.intLatencyValMax 407dd970561SzhanglyGit private val vfLat = params.vfLatencyValMax 408dd970561SzhanglyGit 409dd970561SzhanglyGit val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W)) 410dd970561SzhanglyGit val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W)) 411dd970561SzhanglyGit val intDeqRespSet = OptionWrapper(intCertainLat, UInt((intLat + 1).W)) 412dd970561SzhanglyGit val vfDeqRespSet = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W)) 4138d29ec32Sczw } 4148d29ec32Sczw 4152e0a7dc5Sfdy class WbFuBusyTableReadBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle { 416bf44d649SXuan Hu private val intCertainLat = params.intLatencyCertain 417bf44d649SXuan Hu private val vfCertainLat = params.vfLatencyCertain 418bf44d649SXuan Hu private val intLat = params.intLatencyValMax 419bf44d649SXuan Hu private val vfLat = params.vfLatencyValMax 420bf44d649SXuan Hu 421bf44d649SXuan Hu val intWbBusyTable = OptionWrapper(intCertainLat, UInt((intLat + 1).W)) 422bf44d649SXuan Hu val vfWbBusyTable = OptionWrapper(vfCertainLat, UInt((vfLat + 1).W)) 4232e0a7dc5Sfdy } 4242e0a7dc5Sfdy 4252e0a7dc5Sfdy class WbConflictBundle(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle { 426bf44d649SXuan Hu private val intCertainLat = params.intLatencyCertain 427bf44d649SXuan Hu private val vfCertainLat = params.vfLatencyCertain 428bf44d649SXuan Hu 429bf44d649SXuan Hu val intConflict = OptionWrapper(intCertainLat, Bool()) 430bf44d649SXuan Hu val vfConflict = OptionWrapper(vfCertainLat, Bool()) 4312e0a7dc5Sfdy } 4322e0a7dc5Sfdy 433730cfbc0SXuan Hu // DataPath --[ExuInput]--> Exu 434730cfbc0SXuan Hu class ExuInput(val params: ExeUnitParams)(implicit p: Parameters) extends XSBundle { 435730cfbc0SXuan Hu val fuType = FuType() 436730cfbc0SXuan Hu val fuOpType = FuOpType() 437730cfbc0SXuan Hu val src = Vec(params.numRegSrc, UInt(params.dataBitsMax.W)) 438730cfbc0SXuan Hu val imm = UInt(XLEN.W) 439730cfbc0SXuan Hu val robIdx = new RobPtr 440730cfbc0SXuan Hu val iqIdx = UInt(log2Up(MemIQSizeMax).W)// Only used by store yet 441730cfbc0SXuan Hu val isFirstIssue = Bool() // Only used by store yet 442730cfbc0SXuan Hu val pdest = UInt(params.wbPregIdxWidth.W) 443730cfbc0SXuan Hu val rfWen = if (params.writeIntRf) Some(Bool()) else None 444730cfbc0SXuan Hu val fpWen = if (params.writeFpRf) Some(Bool()) else None 445730cfbc0SXuan Hu val vecWen = if (params.writeVecRf) Some(Bool()) else None 4463bc74e23SzhanglyGit val fpu = if (params.writeFflags) Some(new FPUCtrlSignals) else None 447b6b11f60SXuan Hu val vpu = if (params.needVPUCtrl) Some(new VPUCtrlSignals) else None 448730cfbc0SXuan Hu val flushPipe = if (params.flushPipe) Some(Bool()) else None 449730cfbc0SXuan Hu val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None 450730cfbc0SXuan Hu val preDecode = if (params.hasPredecode) Some(new PreDecodeInfo) else None 4516ce10964SXuan Hu val ftqIdx = if (params.needPc || params.replayInst || params.hasStoreAddrFu) 452730cfbc0SXuan Hu Some(new FtqPtr) else None 4536ce10964SXuan Hu val ftqOffset = if (params.needPc || params.replayInst || params.hasStoreAddrFu) 454730cfbc0SXuan Hu Some(UInt(log2Up(PredictWidth).W)) else None 455730cfbc0SXuan Hu val predictInfo = if (params.hasPredecode) Some(new Bundle { 456730cfbc0SXuan Hu val target = UInt(VAddrData().dataWidth.W) 457730cfbc0SXuan Hu val taken = Bool() 458730cfbc0SXuan Hu }) else None 459730cfbc0SXuan Hu val sqIdx = if (params.hasMemAddrFu || params.hasStdFu) Some(new SqPtr) else None 460730cfbc0SXuan Hu val lqIdx = if (params.hasMemAddrFu) Some(new LqPtr) else None 461c0be7f33SXuan Hu val dataSources = Vec(params.numRegSrc, DataSource()) 4627a96cc7fSHaojin Tang val l1ExuOH = Vec(params.numRegSrc, ExuOH()) 463ea46c302SXuan Hu val srcTimer = OptionWrapper(params.isIQWakeUpSink, Vec(params.numRegSrc, UInt(3.W))) 4640f55a0d3SHaojin Tang val loadDependency = OptionWrapper(params.isIQWakeUpSink, Vec(LoadPipelineWidth, UInt(3.W))) 46504c99ecaSXuan Hu val deqLdExuIdx = OptionWrapper(params.hasLoadFu || params.hasHyldaFu, UInt(log2Ceil(LoadPipelineWidth).W)) 466c0be7f33SXuan Hu 46796e858baSXuan Hu val perfDebugInfo = new PerfDebugInfo() 46896e858baSXuan Hu 469c0be7f33SXuan Hu def exuIdx = this.params.exuIdx 470c0be7f33SXuan Hu 4717a96cc7fSHaojin Tang def needCancel(og0CancelOH: UInt, og1CancelOH: UInt) : Bool = { 472c0be7f33SXuan Hu if (params.isIQWakeUpSink) { 473c0be7f33SXuan Hu require( 4747a96cc7fSHaojin Tang og0CancelOH.getWidth == l1ExuOH.head.getWidth, 4757a96cc7fSHaojin Tang s"cancelVecSize: {og0: ${og0CancelOH.getWidth}, og1: ${og1CancelOH.getWidth}}" 476c0be7f33SXuan Hu ) 4777a96cc7fSHaojin Tang val l1Cancel: Bool = l1ExuOH.zip(srcTimer.get).map { 4787a96cc7fSHaojin Tang case(exuOH: UInt, srcTimer: UInt) => 4797a96cc7fSHaojin Tang (exuOH & og0CancelOH).orR && srcTimer === 1.U 480ea46c302SXuan Hu }.reduce(_ | _) 48110434c39SXuan Hu l1Cancel 482c0be7f33SXuan Hu } else { 483c0be7f33SXuan Hu false.B 484c0be7f33SXuan Hu } 485c0be7f33SXuan Hu } 486730cfbc0SXuan Hu 4873fd20becSczw def getVfWen = { 4883fd20becSczw if (params.writeFpRf) this.fpWen 4893fd20becSczw else if(params.writeVecRf) this.vecWen 4903fd20becSczw else None 4913fd20becSczw } 4923fd20becSczw 493730cfbc0SXuan Hu def fromIssueBundle(source: IssueQueueIssueBundle): Unit = { 494730cfbc0SXuan Hu // src is assigned to rfReadData 495730cfbc0SXuan Hu this.fuType := source.common.fuType 496730cfbc0SXuan Hu this.fuOpType := source.common.fuOpType 497730cfbc0SXuan Hu this.imm := source.common.imm 498730cfbc0SXuan Hu this.robIdx := source.common.robIdx 499730cfbc0SXuan Hu this.pdest := source.common.pdest 500730cfbc0SXuan Hu this.isFirstIssue := source.common.isFirstIssue // Only used by mem debug log 501730cfbc0SXuan Hu this.iqIdx := source.common.iqIdx // Only used by mem feedback 502c0be7f33SXuan Hu this.dataSources := source.common.dataSources 5037a96cc7fSHaojin Tang this.l1ExuOH := source.common.l1ExuOH 504730cfbc0SXuan Hu this.rfWen .foreach(_ := source.common.rfWen.get) 505730cfbc0SXuan Hu this.fpWen .foreach(_ := source.common.fpWen.get) 506730cfbc0SXuan Hu this.vecWen .foreach(_ := source.common.vecWen.get) 507730cfbc0SXuan Hu this.fpu .foreach(_ := source.common.fpu.get) 508374ba8afSXuan Hu this.vpu .foreach(_ := source.common.vpu.get) 509730cfbc0SXuan Hu this.flushPipe .foreach(_ := source.common.flushPipe.get) 510427cfec3SHaojin Tang this.pc .foreach(_ := source.common.pc.get) 511730cfbc0SXuan Hu this.preDecode .foreach(_ := source.common.preDecode.get) 512730cfbc0SXuan Hu this.ftqIdx .foreach(_ := source.common.ftqIdx.get) 513730cfbc0SXuan Hu this.ftqOffset .foreach(_ := source.common.ftqOffset.get) 514730cfbc0SXuan Hu this.predictInfo .foreach(_ := source.common.predictInfo.get) 515730cfbc0SXuan Hu this.lqIdx .foreach(_ := source.common.lqIdx.get) 516730cfbc0SXuan Hu this.sqIdx .foreach(_ := source.common.sqIdx.get) 517ea46c302SXuan Hu this.srcTimer .foreach(_ := source.common.srcTimer.get) 5180f55a0d3SHaojin Tang this.loadDependency.foreach(_ := source.common.loadDependency.get.map(_ << 1)) 51904c99ecaSXuan Hu this.deqLdExuIdx .foreach(_ := source.common.deqLdExuIdx.get) 520730cfbc0SXuan Hu } 521730cfbc0SXuan Hu } 522730cfbc0SXuan Hu 523730cfbc0SXuan Hu // ExuInput --[FuncUnit]--> ExuOutput 524730cfbc0SXuan Hu class ExuOutput( 525730cfbc0SXuan Hu val params: ExeUnitParams, 526730cfbc0SXuan Hu )(implicit 527730cfbc0SXuan Hu val p: Parameters 528730cfbc0SXuan Hu ) extends Bundle with BundleSource with HasXSParameter { 529730cfbc0SXuan Hu val data = UInt(params.dataBitsMax.W) 530730cfbc0SXuan Hu val pdest = UInt(params.wbPregIdxWidth.W) 531730cfbc0SXuan Hu val robIdx = new RobPtr 532730cfbc0SXuan Hu val intWen = if (params.writeIntRf) Some(Bool()) else None 533730cfbc0SXuan Hu val fpWen = if (params.writeFpRf) Some(Bool()) else None 534730cfbc0SXuan Hu val vecWen = if (params.writeVecRf) Some(Bool()) else None 535730cfbc0SXuan Hu val redirect = if (params.hasRedirect) Some(ValidIO(new Redirect)) else None 536730cfbc0SXuan Hu val fflags = if (params.writeFflags) Some(UInt(5.W)) else None 5373bc74e23SzhanglyGit val wflags = if (params.writeFflags) Some(Bool()) else None 538a8db15d8Sfdy val vxsat = if (params.writeVxsat) Some(Bool()) else None 539730cfbc0SXuan Hu val exceptionVec = if (params.exceptionOut.nonEmpty) Some(ExceptionVec()) else None 540730cfbc0SXuan Hu val flushPipe = if (params.flushPipe) Some(Bool()) else None 541730cfbc0SXuan Hu val replay = if (params.replayInst) Some(Bool()) else None 542730cfbc0SXuan Hu val lqIdx = if (params.hasLoadFu) Some(new LqPtr()) else None 543730cfbc0SXuan Hu val sqIdx = if (params.hasStoreAddrFu || params.hasStdFu) 544730cfbc0SXuan Hu Some(new SqPtr()) else None 545730cfbc0SXuan Hu // uop info 546730cfbc0SXuan Hu val predecodeInfo = if(params.hasPredecode) Some(new PreDecodeInfo) else None 54798d3cb16SXuan Hu // vldu used only 54898d3cb16SXuan Hu val vls = OptionWrapper(params.hasVLoadFu, new Bundle { 54998d3cb16SXuan Hu val vpu = new VPUCtrlSignals 55098d3cb16SXuan Hu val oldVdPsrc = UInt(PhyRegIdxWidth.W) 55198d3cb16SXuan Hu val vdIdx = UInt(3.W) 55298d3cb16SXuan Hu }) 553730cfbc0SXuan Hu val debug = new DebugBundle 554730cfbc0SXuan Hu val debugInfo = new PerfDebugInfo 555730cfbc0SXuan Hu } 556730cfbc0SXuan Hu 557730cfbc0SXuan Hu // ExuOutput + DynInst --> WriteBackBundle 55839c59369SXuan Hu class WriteBackBundle(val params: PregWB, backendParams: BackendParams)(implicit p: Parameters) extends Bundle with BundleSource { 559730cfbc0SXuan Hu val rfWen = Bool() 560730cfbc0SXuan Hu val fpWen = Bool() 561730cfbc0SXuan Hu val vecWen = Bool() 56239c59369SXuan Hu val pdest = UInt(params.pregIdxWidth(backendParams).W) 563730cfbc0SXuan Hu val data = UInt(params.dataWidth.W) 564730cfbc0SXuan Hu val robIdx = new RobPtr()(p) 565730cfbc0SXuan Hu val flushPipe = Bool() 566730cfbc0SXuan Hu val replayInst = Bool() 567730cfbc0SXuan Hu val redirect = ValidIO(new Redirect) 568730cfbc0SXuan Hu val fflags = UInt(5.W) 56901ceb97cSZiyue Zhang val vxsat = Bool() 570730cfbc0SXuan Hu val exceptionVec = ExceptionVec() 571730cfbc0SXuan Hu val debug = new DebugBundle 572730cfbc0SXuan Hu val debugInfo = new PerfDebugInfo 573730cfbc0SXuan Hu 574bf35baadSXuan Hu this.wakeupSource = s"WB(${params.toString})" 575bf35baadSXuan Hu 576730cfbc0SXuan Hu def fromExuOutput(source: ExuOutput) = { 577730cfbc0SXuan Hu this.rfWen := source.intWen.getOrElse(false.B) 578730cfbc0SXuan Hu this.fpWen := source.fpWen.getOrElse(false.B) 579730cfbc0SXuan Hu this.vecWen := source.vecWen.getOrElse(false.B) 580730cfbc0SXuan Hu this.pdest := source.pdest 581730cfbc0SXuan Hu this.data := source.data 582730cfbc0SXuan Hu this.robIdx := source.robIdx 583730cfbc0SXuan Hu this.flushPipe := source.flushPipe.getOrElse(false.B) 584730cfbc0SXuan Hu this.replayInst := source.replay.getOrElse(false.B) 585730cfbc0SXuan Hu this.redirect := source.redirect.getOrElse(0.U.asTypeOf(this.redirect)) 586730cfbc0SXuan Hu this.fflags := source.fflags.getOrElse(0.U.asTypeOf(this.fflags)) 58701ceb97cSZiyue Zhang this.vxsat := source.vxsat.getOrElse(0.U.asTypeOf(this.vxsat)) 588730cfbc0SXuan Hu this.exceptionVec := source.exceptionVec.getOrElse(0.U.asTypeOf(this.exceptionVec)) 589730cfbc0SXuan Hu this.debug := source.debug 590730cfbc0SXuan Hu this.debugInfo := source.debugInfo 591730cfbc0SXuan Hu } 592730cfbc0SXuan Hu 593730cfbc0SXuan Hu def asIntRfWriteBundle(fire: Bool): RfWritePortWithConfig = { 59439c59369SXuan Hu val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(IntData()).addrWidth))) 595730cfbc0SXuan Hu rfWrite.wen := this.rfWen && fire 596730cfbc0SXuan Hu rfWrite.addr := this.pdest 597730cfbc0SXuan Hu rfWrite.data := this.data 598730cfbc0SXuan Hu rfWrite.intWen := this.rfWen 599730cfbc0SXuan Hu rfWrite.fpWen := false.B 600730cfbc0SXuan Hu rfWrite.vecWen := false.B 601730cfbc0SXuan Hu rfWrite 602730cfbc0SXuan Hu } 603730cfbc0SXuan Hu 604730cfbc0SXuan Hu def asVfRfWriteBundle(fire: Bool): RfWritePortWithConfig = { 60539c59369SXuan Hu val rfWrite = Wire(Output(new RfWritePortWithConfig(this.params.dataCfg, backendParams.getPregParams(VecData()).addrWidth))) 606730cfbc0SXuan Hu rfWrite.wen := (this.fpWen || this.vecWen) && fire 607730cfbc0SXuan Hu rfWrite.addr := this.pdest 608730cfbc0SXuan Hu rfWrite.data := this.data 609730cfbc0SXuan Hu rfWrite.intWen := false.B 610730cfbc0SXuan Hu rfWrite.fpWen := this.fpWen 611730cfbc0SXuan Hu rfWrite.vecWen := this.vecWen 612730cfbc0SXuan Hu rfWrite 613730cfbc0SXuan Hu } 614730cfbc0SXuan Hu } 615730cfbc0SXuan Hu 6165d2b9cadSXuan Hu // ExuOutput --> ExuBypassBundle --[DataPath]-->ExuInput 6175d2b9cadSXuan Hu // / 6185d2b9cadSXuan Hu // [IssueQueue]--> ExuInput -- 6195d2b9cadSXuan Hu class ExuBypassBundle( 6205d2b9cadSXuan Hu val params: ExeUnitParams, 6215d2b9cadSXuan Hu )(implicit 6225d2b9cadSXuan Hu val p: Parameters 6235d2b9cadSXuan Hu ) extends Bundle { 6245d2b9cadSXuan Hu val data = UInt(params.dataBitsMax.W) 6255d2b9cadSXuan Hu val pdest = UInt(params.wbPregIdxWidth.W) 6265d2b9cadSXuan Hu } 6275d2b9cadSXuan Hu 628730cfbc0SXuan Hu class ExceptionInfo extends Bundle { 629730cfbc0SXuan Hu val pc = UInt(VAddrData().dataWidth.W) 630730cfbc0SXuan Hu val instr = UInt(32.W) 631730cfbc0SXuan Hu val commitType = CommitType() 632730cfbc0SXuan Hu val exceptionVec = ExceptionVec() 633730cfbc0SXuan Hu val singleStep = Bool() 634730cfbc0SXuan Hu val crossPageIPFFix = Bool() 635730cfbc0SXuan Hu val isInterrupt = Bool() 636730cfbc0SXuan Hu } 637730cfbc0SXuan Hu 638303b5478SXuan Hu object UopIdx { 639303b5478SXuan Hu def apply()(implicit p: Parameters): UInt = UInt(log2Up(p(XSCoreParamsKey).MaxUopSize + 1).W) 640303b5478SXuan Hu } 641303b5478SXuan Hu 642bf35baadSXuan Hu object FuLatency { 643bf35baadSXuan Hu def apply(): UInt = UInt(width.W) 644bf35baadSXuan Hu 645bf35baadSXuan Hu def width = 4 // 0~15 // Todo: assosiate it with FuConfig 646bf35baadSXuan Hu } 647bf35baadSXuan Hu 6487a96cc7fSHaojin Tang object ExuOH { 6497a96cc7fSHaojin Tang def apply(exuNum: Int): UInt = UInt(exuNum.W) 650bf35baadSXuan Hu 6517a96cc7fSHaojin Tang def apply()(implicit p: Parameters): UInt = UInt(width.W) 652bf35baadSXuan Hu 653bf35baadSXuan Hu def width(implicit p: Parameters): Int = p(XSCoreParamsKey).backendParams.numExu 654bf35baadSXuan Hu } 655bf35baadSXuan Hu 656bc7d6943SzhanglyGit class CancelSignal(implicit p: Parameters) extends XSBundle { 657bc7d6943SzhanglyGit val rfWen = Bool() 65873b1b2e4SzhanglyGit val fpWen = Bool() 65973b1b2e4SzhanglyGit val vecWen = Bool() 660bc7d6943SzhanglyGit val pdest = UInt(PhyRegIdxWidth.W) 661bc7d6943SzhanglyGit 662bc7d6943SzhanglyGit def needCancel(srcType: UInt, psrc: UInt, valid: Bool): Bool = { 663bc7d6943SzhanglyGit val pdestMatch = pdest === psrc 664bc7d6943SzhanglyGit pdestMatch && ( 665bc7d6943SzhanglyGit SrcType.isFp(srcType) && !this.rfWen || 666bc7d6943SzhanglyGit SrcType.isXp(srcType) && this.rfWen || 667bc7d6943SzhanglyGit SrcType.isVp(srcType) && !this.rfWen 668bc7d6943SzhanglyGit ) && valid 669bc7d6943SzhanglyGit } 670bc7d6943SzhanglyGit } 671bc7d6943SzhanglyGit 6724ee69032SzhanglyGit class MemExuInput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle { 673730cfbc0SXuan Hu val uop = new DynInst 6744ee69032SzhanglyGit val src = if (isVector) Vec(5, UInt(VLEN.W)) else Vec(3, UInt(XLEN.W)) 675730cfbc0SXuan Hu val iqIdx = UInt(log2Up(MemIQSizeMax).W) 676730cfbc0SXuan Hu val isFirstIssue = Bool() 6770f55a0d3SHaojin Tang val deqPortIdx = UInt(log2Ceil(LoadPipelineWidth).W) 67820a5248fSzhanglinjuan 67920a5248fSzhanglinjuan def src_rs1 = src(0) 68020a5248fSzhanglinjuan def src_stride = src(1) 68120a5248fSzhanglinjuan def src_vs3 = src(2) 68220a5248fSzhanglinjuan def src_mask = if (isVector) src(3) else 0.U 68320a5248fSzhanglinjuan def src_vl = if (isVector) src(4) else 0.U 684730cfbc0SXuan Hu } 685730cfbc0SXuan Hu 6864ee69032SzhanglyGit class MemExuOutput(isVector: Boolean = false)(implicit p: Parameters) extends XSBundle { 687730cfbc0SXuan Hu val uop = new DynInst 6884ee69032SzhanglyGit val data = if (isVector) UInt(VLEN.W) else UInt(XLEN.W) 68998d3cb16SXuan Hu val mask = if (isVector) Some(UInt(VLEN.W)) else None 690*7ca7ad94Szhanglinjuan val vdIdx = if (isVector) Some(UInt(3.W)) else None // TODO: parameterize width 691730cfbc0SXuan Hu val debug = new DebugBundle 692730cfbc0SXuan Hu } 693730cfbc0SXuan Hu 694730cfbc0SXuan Hu class MemMicroOpRbExt(implicit p: Parameters) extends XSBundle { 695730cfbc0SXuan Hu val uop = new DynInst 696730cfbc0SXuan Hu val flag = UInt(1.W) 697730cfbc0SXuan Hu } 6980f55a0d3SHaojin Tang 6990f55a0d3SHaojin Tang object LoadShouldCancel { 7000f55a0d3SHaojin Tang def apply(loadDependency: Option[Seq[UInt]], ldCancel: Seq[LoadCancelIO]): Bool = { 7010f55a0d3SHaojin Tang val ld1Cancel = loadDependency.map(deps => 7020f55a0d3SHaojin Tang deps.zipWithIndex.map { case (dep, ldPortIdx) => 7030f55a0d3SHaojin Tang ldCancel.map(_.ld1Cancel).map(cancel => cancel.fire && dep(1) && cancel.bits === ldPortIdx.U).reduce(_ || _) 7040f55a0d3SHaojin Tang }.reduce(_ || _) 7050f55a0d3SHaojin Tang ) 7060f55a0d3SHaojin Tang val ld2Cancel = loadDependency.map(deps => 7070f55a0d3SHaojin Tang deps.zipWithIndex.map { case (dep, ldPortIdx) => 7080f55a0d3SHaojin Tang ldCancel.map(_.ld2Cancel).map(cancel => cancel.fire && dep(2) && cancel.bits === ldPortIdx.U).reduce(_ || _) 7090f55a0d3SHaojin Tang }.reduce(_ || _) 7100f55a0d3SHaojin Tang ) 7110f55a0d3SHaojin Tang ld1Cancel.map(_ || ld2Cancel.get).getOrElse(false.B) 7120f55a0d3SHaojin Tang } 7130f55a0d3SHaojin Tang } 714730cfbc0SXuan Hu} 715