xref: /XiangShan/src/main/scala/xiangshan/backend/issue/SchdBlockParams.scala (revision 94aa21c6009c2f39c5c5dae9c87260c78887efcc)
1package xiangshan.backend.issue
2
3import org.chipsalliance.cde.config.Parameters
4import chisel3.util._
5import utils.SeqUtils
6import xiangshan.backend.BackendParams
7import xiangshan.backend.Bundles._
8import xiangshan.backend.datapath.WakeUpSource
9import xiangshan.backend.datapath.WbConfig.PregWB
10
11case class SchdBlockParams(
12  issueBlockParams: Seq[IssueBlockParams],
13  numPregs        : Int,
14  numDeqOutside   : Int,
15  schdType        : SchedulerType,
16  rfDataWidth     : Int,
17  numUopIn        : Int,
18) {
19  var backendParam: BackendParams = null
20
21  def isMemSchd: Boolean = schdType == MemScheduler()
22
23  def isIntSchd: Boolean = schdType == IntScheduler()
24
25  def isFpSchd: Boolean = schdType == FpScheduler()
26
27  def isVfSchd: Boolean = schdType == VfScheduler()
28
29  def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum
30
31  def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum
32
33  def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum
34
35  def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum
36
37  def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum
38
39  def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum
40
41  def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum
42
43  def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum
44
45  def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum
46
47  def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum
48
49  def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum
50
51  def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum
52
53  def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum
54
55  def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum
56
57  def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum
58
59  def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum
60
61  def HyuCnt: Int = issueBlockParams.map(_.HyuCnt).sum
62
63  def LdExuCnt: Int = issueBlockParams.map(_.LdExuCnt).sum
64
65  def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum
66
67  def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum
68
69  def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum
70
71  def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum
72
73  def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.fakeUnit)).sum
74
75  def hasCSR = CsrCnt > 0
76
77  def hasFence = FenceCnt > 0
78
79  def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum
80
81  def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum
82
83  def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum
84
85  def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum
86
87  def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum
88
89  def numPcReadPort = {
90    val bjIssueQueues = issueBlockParams.filter(x => (x.JmpCnt + x.BrhCnt + x.FenceCnt) > 0)
91    if (bjIssueQueues.map(x => x.numEnq).sum > 0) numUopIn else 0
92  }
93
94  def needOg2Resp: Boolean = isVfSchd || isMemSchd && issueBlockParams.map(_.needOg2Resp).reduce(_ || _)
95
96  def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _)
97
98  def needSrcVxrm: Boolean = issueBlockParams.map(_.needSrcVxrm).reduce(_ || _)
99
100  def writeVConfig: Boolean = issueBlockParams.map(_.writeVConfig).reduce(_ || _)
101
102  def writeVType: Boolean = issueBlockParams.map(_.writeVType).reduce(_ || _)
103
104  def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum
105
106  def pregIdxWidth: Int = log2Up(numPregs)
107
108  def numWakeupFromWB: Int = schdType match {
109    case IntScheduler() | VfScheduler() => 8
110    case MemScheduler() => 16 // Todo
111    case _ => 0
112  }
113
114  def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum
115
116  def numFpRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numFpSrc).sum).sum
117
118  def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVecSrc).sum).sum
119
120  def numV0RfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numV0Src).sum).sum
121
122  def numVlRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVlSrc).sum).sum
123
124  def bindBackendParam(param: BackendParams): Unit = {
125    backendParam = param
126  }
127
128  def numWriteRegCache: Int = issueBlockParams.map(_.numWriteRegCache).sum
129
130  def needWriteRegCache: Boolean = numWriteRegCache > 0
131
132  def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = {
133    MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle))
134  }
135
136  def genExuInputCopySrcBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = {
137    MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledCopySrcBundle))
138  }
139
140  def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = {
141    MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle))
142  }
143
144  def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = {
145    MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle))
146  }
147
148  def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = {
149    MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle))
150  }
151
152  def wakeUpInExuSources: Seq[WakeUpSource] = {
153    issueBlockParams
154      .flatMap(_.wakeUpInExuSources)
155      .distinctBy(_.name)
156  }
157
158  def wakeUpOutExuSources: Seq[WakeUpSource] = {
159    issueBlockParams
160      .flatMap(_.wakeUpOutExuSources)
161      .distinctBy(_.name)
162  }
163
164  def genIQWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
165    MixedVec(this.wakeUpInExuSources.map(x => {
166      val param = x.getExuParam(backendParam.allExuParams)
167      val isCopyPdest = param.copyWakeupOut
168      val copyNum = param.copyNum
169      ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum))
170      })
171    )
172  }
173
174  def genIQWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
175    MixedVec(this.wakeUpOutExuSources.map(x => {
176      val param = x.getExuParam(backendParam.allExuParams)
177      val isCopyPdest = param.copyWakeupOut
178      val copyNum = param.copyNum
179      ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum))
180      })
181    )
182  }
183
184  def genWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
185    val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match {
186      case IntScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
187      case _ => Seq()
188    }
189    val fpBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match {
190      case FpScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
191      case _ => Seq()
192    }
193    val vfBundle = schdType match {
194      case VfScheduler() | MemScheduler() => backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
195      case _ => Seq()
196    }
197    val v0Bundle = schdType match {
198      case VfScheduler() | MemScheduler() => backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
199      case _ => Seq()
200    }
201    val vlBundle = schdType match {
202      case VfScheduler() | MemScheduler() => backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
203      case _ => Seq()
204    }
205    MixedVec(intBundle ++ fpBundle ++ vfBundle ++ v0Bundle ++ vlBundle)
206  }
207
208  def genIntWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
209    MixedVec(backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
210  }
211
212  def genFpWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
213    MixedVec(backendParam.getFpWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
214  }
215
216  def genVfWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
217    MixedVec(backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
218  }
219
220  def genV0WBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
221    MixedVec(backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
222  }
223
224  def genVlWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
225    MixedVec(backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
226  }
227
228  // cfgs(issueIdx)(exuIdx)(set of exu's wb)
229  def getWbCfgs: Seq[Seq[Set[PregWB]]] = {
230    this.issueBlockParams.map(_.getWbCfgs)
231  }
232}
233