xref: /XiangShan/src/main/scala/xiangshan/backend/issue/SchdBlockParams.scala (revision 5d2b9cad647cd0cbcbbe806f2f733d2b9ec0863a)
1package xiangshan.backend.issue
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3.util._
5import utils.SeqUtils
6import xiangshan.backend.BackendParams
7import xiangshan.backend.Bundles.{ExuBypassBundle, ExuInput, ExuOutput, IssueQueueWakeUpBundle}
8import xiangshan.backend.datapath.WakeUpSource
9import xiangshan.backend.datapath.WbConfig.WbConfig
10
11case class SchdBlockParams(
12  issueBlockParams: Seq[IssueBlockParams],
13  numPregs        : Int,
14  numRfReadWrite  : Option[(Int, Int)],
15  numDeqOutside   : Int,
16  schdType        : SchedulerType,
17  rfDataWidth     : Int,
18  numUopIn        : Int,
19) {
20  var backendParam: BackendParams = null
21
22  def isMemSchd: Boolean = schdType == MemScheduler()
23
24  def isIntSchd: Boolean = schdType == IntScheduler()
25
26  def isVfSchd: Boolean = schdType == VfScheduler()
27
28  def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum
29
30  def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum
31
32  def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum
33
34  def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum
35
36  def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum
37
38  def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum
39
40  def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum
41
42  def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum
43
44  def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum
45
46  def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum
47
48  def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum
49
50  def FmiscCnt: Int = issueBlockParams.map(_.FmiscCnt).sum
51
52  def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum
53
54  def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum
55
56  def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum
57
58  def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum
59
60  def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum
61
62  def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum
63
64  def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum
65
66  def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum
67
68  def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum
69
70  def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.hasStdFu)).sum
71
72  def hasCSR = CsrCnt > 0
73
74  def hasFence = FenceCnt > 0
75
76  def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum
77
78  def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum
79
80  def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum
81
82  def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum
83
84  def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum
85
86  def numPcReadPort = {
87    val bjIssueQueues = issueBlockParams.filter(x => (x.JmpCnt + x.BrhCnt + x.FenceCnt) > 0)
88    if (bjIssueQueues.map(x => x.numEnq).sum > 0) numUopIn else 0
89  }
90
91  def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _)
92
93  def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum
94
95  def pregIdxWidth: Int = log2Up(numPregs)
96
97  def numWakeupFromWB: Int = schdType match {
98    case IntScheduler() | VfScheduler() => 8
99    case MemScheduler() => 16 // Todo
100    case _ => 0
101  }
102
103  def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum
104
105  def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(x => x.numFpSrc + x.numVecSrc).sum).sum
106
107  // Todo: 14R8W
108  def numIntRfRead: Int = numIntRfReadByExu
109
110  def bindBackendParam(param: BackendParams): Unit = {
111    backendParam = param
112  }
113
114  def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = {
115    MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle))
116  }
117
118  def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = {
119    MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle))
120  }
121
122  def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = {
123    MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle))
124  }
125
126  def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = {
127    MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle))
128  }
129
130  def wakeUpInExuSources: Seq[WakeUpSource] = {
131    SeqUtils.distinctBy(
132      issueBlockParams
133        .flatMap(_.wakeUpInExuSources)
134    )(_.name)
135  }
136
137  def wakeUpOutExuSources: Seq[WakeUpSource] = {
138    SeqUtils.distinctBy(
139      issueBlockParams
140        .flatMap(_.wakeUpOutExuSources)
141    )(_.name)
142  }
143
144  def genWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = {
145    MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam))))
146  }
147
148  def genWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = {
149    MixedVec(this.wakeUpOutExuSources.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam))))
150  }
151
152  // cfgs(issueIdx)(exuIdx)(set of exu's wb)
153  def getWbCfgs: Seq[Seq[Set[WbConfig]]] = {
154    this.issueBlockParams.map(_.getWbCfgs)
155  }
156}
157