1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3.util._ 5bf35baadSXuan Huimport utils.SeqUtils 6dd473fffSXuan Huimport xiangshan.backend.BackendParams 710fe9778SXuan Huimport xiangshan.backend.Bundles._ 8bf35baadSXuan Huimport xiangshan.backend.datapath.WakeUpSource 939c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.PregWB 10730cfbc0SXuan Hu 11730cfbc0SXuan Hucase class SchdBlockParams( 12730cfbc0SXuan Hu issueBlockParams: Seq[IssueBlockParams], 13730cfbc0SXuan Hu numPregs : Int, 14730cfbc0SXuan Hu numDeqOutside : Int, 15730cfbc0SXuan Hu schdType : SchedulerType, 16730cfbc0SXuan Hu rfDataWidth : Int, 17730cfbc0SXuan Hu) { 18dd473fffSXuan Hu var backendParam: BackendParams = null 19dd473fffSXuan Hu 20730cfbc0SXuan Hu def isMemSchd: Boolean = schdType == MemScheduler() 21730cfbc0SXuan Hu 22730cfbc0SXuan Hu def isIntSchd: Boolean = schdType == IntScheduler() 23730cfbc0SXuan Hu 2482674533Sxiaofeibao def isFpSchd: Boolean = schdType == FpScheduler() 2582674533Sxiaofeibao 26730cfbc0SXuan Hu def isVfSchd: Boolean = schdType == VfScheduler() 27730cfbc0SXuan Hu 28730cfbc0SXuan Hu def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum 29730cfbc0SXuan Hu 30730cfbc0SXuan Hu def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum 31730cfbc0SXuan Hu 32730cfbc0SXuan Hu def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum 33730cfbc0SXuan Hu 34730cfbc0SXuan Hu def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum 35730cfbc0SXuan Hu 36730cfbc0SXuan Hu def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum 37730cfbc0SXuan Hu 38730cfbc0SXuan Hu def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum 39730cfbc0SXuan Hu 40730cfbc0SXuan Hu def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum 41730cfbc0SXuan Hu 42730cfbc0SXuan Hu def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum 43730cfbc0SXuan Hu 44730cfbc0SXuan Hu def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum 45730cfbc0SXuan Hu 46730cfbc0SXuan Hu def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum 47730cfbc0SXuan Hu 48730cfbc0SXuan Hu def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum 49730cfbc0SXuan Hu 50730cfbc0SXuan Hu def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum 51730cfbc0SXuan Hu 52730cfbc0SXuan Hu def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum 53730cfbc0SXuan Hu 54730cfbc0SXuan Hu def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum 55730cfbc0SXuan Hu 56730cfbc0SXuan Hu def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum 57730cfbc0SXuan Hu 58730cfbc0SXuan Hu def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum 59730cfbc0SXuan Hu 60b133b458SXuan Hu def HyuCnt: Int = issueBlockParams.map(_.HyuCnt).sum 61b133b458SXuan Hu 62596af5d2SHaojin Tang def LdExuCnt: Int = issueBlockParams.map(_.LdExuCnt).sum 63596af5d2SHaojin Tang 64730cfbc0SXuan Hu def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum 65730cfbc0SXuan Hu 66730cfbc0SXuan Hu def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum 67730cfbc0SXuan Hu 68730cfbc0SXuan Hu def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum 69730cfbc0SXuan Hu 70730cfbc0SXuan Hu def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum 71730cfbc0SXuan Hu 72670870b3SXuan Hu def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.fakeUnit)).sum 73730cfbc0SXuan Hu 74730cfbc0SXuan Hu def hasCSR = CsrCnt > 0 75730cfbc0SXuan Hu 76730cfbc0SXuan Hu def hasFence = FenceCnt > 0 77730cfbc0SXuan Hu 78730cfbc0SXuan Hu def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum 79730cfbc0SXuan Hu 80730cfbc0SXuan Hu def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum 81730cfbc0SXuan Hu 82730cfbc0SXuan Hu def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum 83730cfbc0SXuan Hu 84730cfbc0SXuan Hu def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum 85730cfbc0SXuan Hu 86730cfbc0SXuan Hu def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum 87730cfbc0SXuan Hu 8842b6cdf9Ssinsanction def needOg2Resp: Boolean = isVfSchd || isMemSchd && issueBlockParams.map(_.needOg2Resp).reduce(_ || _) 8942b6cdf9Ssinsanction 90730cfbc0SXuan Hu def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _) 91730cfbc0SXuan Hu 9217985fbbSZiyue Zhang def needSrcVxrm: Boolean = issueBlockParams.map(_.needSrcVxrm).reduce(_ || _) 9317985fbbSZiyue Zhang 94b6279fc6SZiyue Zhang def writeVConfig: Boolean = issueBlockParams.map(_.writeVConfig).reduce(_ || _) 95b6279fc6SZiyue Zhang 967e4f0b19SZiyue-Zhang def writeVType: Boolean = issueBlockParams.map(_.writeVType).reduce(_ || _) 977e4f0b19SZiyue-Zhang 98730cfbc0SXuan Hu def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum 99730cfbc0SXuan Hu 100730cfbc0SXuan Hu def pregIdxWidth: Int = log2Up(numPregs) 101730cfbc0SXuan Hu 102730cfbc0SXuan Hu def numWakeupFromWB: Int = schdType match { 103730cfbc0SXuan Hu case IntScheduler() | VfScheduler() => 8 104730cfbc0SXuan Hu case MemScheduler() => 16 // Todo 105730cfbc0SXuan Hu case _ => 0 106730cfbc0SXuan Hu } 107730cfbc0SXuan Hu 108730cfbc0SXuan Hu def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum 109730cfbc0SXuan Hu 11060f0c5aeSxiaofeibao def numFpRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numFpSrc).sum).sum 11160f0c5aeSxiaofeibao 112de8bd1d0Ssinsanction def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVecSrc).sum).sum 113de8bd1d0Ssinsanction 114de8bd1d0Ssinsanction def numV0RfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numV0Src).sum).sum 115de8bd1d0Ssinsanction 116de8bd1d0Ssinsanction def numVlRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVlSrc).sum).sum 117730cfbc0SXuan Hu 118dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 119dd473fffSXuan Hu backendParam = param 120dd473fffSXuan Hu } 121dd473fffSXuan Hu 122f8b278aaSsinsanction def numWriteRegCache: Int = issueBlockParams.map(_.numWriteRegCache).sum 123f8b278aaSsinsanction 124f8b278aaSsinsanction def needWriteRegCache: Boolean = numWriteRegCache > 0 125f8b278aaSsinsanction 126730cfbc0SXuan Hu def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = { 127730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle)) 128730cfbc0SXuan Hu } 129730cfbc0SXuan Hu 130*0ed0e482SGuanghui Cheng def genExuInputCopySrcBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = { 131*0ed0e482SGuanghui Cheng MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledCopySrcBundle)) 132*0ed0e482SGuanghui Cheng } 133*0ed0e482SGuanghui Cheng 134730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = { 135730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle)) 136730cfbc0SXuan Hu } 137730cfbc0SXuan Hu 138730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = { 139730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle)) 140730cfbc0SXuan Hu } 141730cfbc0SXuan Hu 1425d2b9cadSXuan Hu def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = { 1435d2b9cadSXuan Hu MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle)) 1445d2b9cadSXuan Hu } 1455d2b9cadSXuan Hu 146bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 147bf35baadSXuan Hu issueBlockParams 148bf35baadSXuan Hu .flatMap(_.wakeUpInExuSources) 149edb1dfafSHaojin Tang .distinctBy(_.name) 150bf35baadSXuan Hu } 151bf35baadSXuan Hu 152bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 153bf35baadSXuan Hu issueBlockParams 154bf35baadSXuan Hu .flatMap(_.wakeUpOutExuSources) 155edb1dfafSHaojin Tang .distinctBy(_.name) 156bf35baadSXuan Hu } 157bf35baadSXuan Hu 158c0be7f33SXuan Hu def genIQWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 1590c7ebb58Sxiaofeibao-xjtu MixedVec(this.wakeUpInExuSources.map(x => { 1600c7ebb58Sxiaofeibao-xjtu val param = x.getExuParam(backendParam.allExuParams) 1614c5a0d77Sxiaofeibao-xjtu val isCopyPdest = param.copyWakeupOut 1624c5a0d77Sxiaofeibao-xjtu val copyNum = param.copyNum 1630c7ebb58Sxiaofeibao-xjtu ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum)) 1640c7ebb58Sxiaofeibao-xjtu }) 1650c7ebb58Sxiaofeibao-xjtu ) 166bf35baadSXuan Hu } 167bf35baadSXuan Hu 168c0be7f33SXuan Hu def genIQWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 1690c7ebb58Sxiaofeibao-xjtu MixedVec(this.wakeUpOutExuSources.map(x => { 1700c7ebb58Sxiaofeibao-xjtu val param = x.getExuParam(backendParam.allExuParams) 1714c5a0d77Sxiaofeibao-xjtu val isCopyPdest = param.copyWakeupOut 1724c5a0d77Sxiaofeibao-xjtu val copyNum = param.copyNum 1730c7ebb58Sxiaofeibao-xjtu ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum)) 1740c7ebb58Sxiaofeibao-xjtu }) 1750c7ebb58Sxiaofeibao-xjtu ) 176c0be7f33SXuan Hu } 177c0be7f33SXuan Hu 178ec49b127Ssinsanction def genWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 179c0be7f33SXuan Hu val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match { 180c0be7f33SXuan Hu case IntScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 181c0be7f33SXuan Hu case _ => Seq() 182c0be7f33SXuan Hu } 18360f0c5aeSxiaofeibao val fpBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match { 18460f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 18560f0c5aeSxiaofeibao case _ => Seq() 18660f0c5aeSxiaofeibao } 187c0be7f33SXuan Hu val vfBundle = schdType match { 188c0be7f33SXuan Hu case VfScheduler() | MemScheduler() => backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 189c0be7f33SXuan Hu case _ => Seq() 190c0be7f33SXuan Hu } 191de8bd1d0Ssinsanction val v0Bundle = schdType match { 192de8bd1d0Ssinsanction case VfScheduler() | MemScheduler() => backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 193de8bd1d0Ssinsanction case _ => Seq() 194de8bd1d0Ssinsanction } 195de8bd1d0Ssinsanction val vlBundle = schdType match { 196de8bd1d0Ssinsanction case VfScheduler() | MemScheduler() => backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 197de8bd1d0Ssinsanction case _ => Seq() 198de8bd1d0Ssinsanction } 199de8bd1d0Ssinsanction MixedVec(intBundle ++ fpBundle ++ vfBundle ++ v0Bundle ++ vlBundle) 200bf35baadSXuan Hu } 201bf35baadSXuan Hu 202ec49b127Ssinsanction def genIntWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 203f39a61a1SzhanglyGit MixedVec(backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 204f39a61a1SzhanglyGit } 205f39a61a1SzhanglyGit 20660f0c5aeSxiaofeibao def genFpWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 20760f0c5aeSxiaofeibao MixedVec(backendParam.getFpWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 20860f0c5aeSxiaofeibao } 20960f0c5aeSxiaofeibao 210ec49b127Ssinsanction def genVfWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 211f39a61a1SzhanglyGit MixedVec(backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 212f39a61a1SzhanglyGit } 213f39a61a1SzhanglyGit 214de8bd1d0Ssinsanction def genV0WBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 215de8bd1d0Ssinsanction MixedVec(backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 216de8bd1d0Ssinsanction } 217de8bd1d0Ssinsanction 218de8bd1d0Ssinsanction def genVlWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 219de8bd1d0Ssinsanction MixedVec(backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 220de8bd1d0Ssinsanction } 221de8bd1d0Ssinsanction 222730cfbc0SXuan Hu // cfgs(issueIdx)(exuIdx)(set of exu's wb) 22339c59369SXuan Hu def getWbCfgs: Seq[Seq[Set[PregWB]]] = { 224730cfbc0SXuan Hu this.issueBlockParams.map(_.getWbCfgs) 225730cfbc0SXuan Hu } 226730cfbc0SXuan Hu} 227