xref: /XiangShan/src/main/scala/xiangshan/backend/issue/IssueBlockParams.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
1*730cfbc0SXuan Hupackage xiangshan.backend.issue
2*730cfbc0SXuan Hu
3*730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters
4*730cfbc0SXuan Huimport chisel3.util._
5*730cfbc0SXuan Huimport chisel3._
6*730cfbc0SXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput, IssueQueueIssueBundle, OGRespBundle}
7*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.WbConfig
8*730cfbc0SXuan Huimport xiangshan.backend.exu.ExeUnitParams
9*730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType}
10*730cfbc0SXuan Hu
11*730cfbc0SXuan Hucase class IssueBlockParams(
12*730cfbc0SXuan Hu  // top down
13*730cfbc0SXuan Hu  exuBlockParams     : Seq[ExeUnitParams],
14*730cfbc0SXuan Hu  numEntries         : Int,
15*730cfbc0SXuan Hu  pregBits           : Int,
16*730cfbc0SXuan Hu  numWakeupFromWB    : Int,
17*730cfbc0SXuan Hu  numDeqOutside      : Int = 0,
18*730cfbc0SXuan Hu  numWakeupFromOthers: Int = 0,
19*730cfbc0SXuan Hu  XLEN               : Int = 64,
20*730cfbc0SXuan Hu  VLEN               : Int = 128,
21*730cfbc0SXuan Hu  vaddrBits          : Int = 39,
22*730cfbc0SXuan Hu  // calculate in scheduler
23*730cfbc0SXuan Hu  var numEnq         : Int = 0,
24*730cfbc0SXuan Hu  var numWakeupFromIQ: Int = 0,
25*730cfbc0SXuan Hu)(
26*730cfbc0SXuan Hu  implicit
27*730cfbc0SXuan Hu  // top down
28*730cfbc0SXuan Hu  val schdType: SchedulerType,
29*730cfbc0SXuan Hu) {
30*730cfbc0SXuan Hu  def inMemSchd: Boolean = schdType == MemScheduler()
31*730cfbc0SXuan Hu
32*730cfbc0SXuan Hu  def inIntSchd: Boolean = schdType == IntScheduler()
33*730cfbc0SXuan Hu
34*730cfbc0SXuan Hu  def inVfSchd: Boolean = schdType == VfScheduler()
35*730cfbc0SXuan Hu
36*730cfbc0SXuan Hu  def isMemAddrIQ: Boolean = inMemSchd && StdCnt == 0
37*730cfbc0SXuan Hu
38*730cfbc0SXuan Hu  def isLdAddrIQ: Boolean = inMemSchd && LduCnt > 0
39*730cfbc0SXuan Hu
40*730cfbc0SXuan Hu  def isStAddrIQ: Boolean = inMemSchd && StaCnt > 0
41*730cfbc0SXuan Hu
42*730cfbc0SXuan Hu  def numExu: Int = exuBlockParams.length
43*730cfbc0SXuan Hu
44*730cfbc0SXuan Hu  def numIntSrc: Int = exuBlockParams.map(_.numIntSrc).max
45*730cfbc0SXuan Hu
46*730cfbc0SXuan Hu  def numFpSrc: Int = exuBlockParams.map(_.numFpSrc).max
47*730cfbc0SXuan Hu
48*730cfbc0SXuan Hu  def numVecSrc: Int = exuBlockParams.map(_.numVecSrc).max
49*730cfbc0SXuan Hu
50*730cfbc0SXuan Hu  def numVfSrc: Int = exuBlockParams.map(_.numVfSrc).max
51*730cfbc0SXuan Hu
52*730cfbc0SXuan Hu  def numRegSrc: Int = exuBlockParams.map(_.numRegSrc).max
53*730cfbc0SXuan Hu
54*730cfbc0SXuan Hu  def numSrc: Int = exuBlockParams.map(_.numSrc).max
55*730cfbc0SXuan Hu
56*730cfbc0SXuan Hu  def readIntRf: Boolean = numIntSrc > 0
57*730cfbc0SXuan Hu
58*730cfbc0SXuan Hu  def readFpRf: Boolean = numFpSrc > 0
59*730cfbc0SXuan Hu
60*730cfbc0SXuan Hu  def readVecRf: Boolean = numVecSrc > 0
61*730cfbc0SXuan Hu
62*730cfbc0SXuan Hu  def readVfRf: Boolean = numVfSrc > 0
63*730cfbc0SXuan Hu
64*730cfbc0SXuan Hu  def writeIntRf: Boolean = exuBlockParams.map(_.writeIntRf).reduce(_ || _)
65*730cfbc0SXuan Hu
66*730cfbc0SXuan Hu  def writeFpRf: Boolean = exuBlockParams.map(_.writeFpRf).reduce(_ || _)
67*730cfbc0SXuan Hu
68*730cfbc0SXuan Hu  def writeVecRf: Boolean = exuBlockParams.map(_.writeVecRf).reduce(_ || _)
69*730cfbc0SXuan Hu
70*730cfbc0SXuan Hu  def exceptionOut: Seq[Int] = exuBlockParams.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted
71*730cfbc0SXuan Hu
72*730cfbc0SXuan Hu  def hasLoadError: Boolean = exuBlockParams.map(_.hasLoadError).reduce(_ || _)
73*730cfbc0SXuan Hu
74*730cfbc0SXuan Hu  def flushPipe: Boolean = exuBlockParams.map(_.flushPipe).reduce(_ || _)
75*730cfbc0SXuan Hu
76*730cfbc0SXuan Hu  def replayInst: Boolean = exuBlockParams.map(_.replayInst).reduce(_ || _)
77*730cfbc0SXuan Hu
78*730cfbc0SXuan Hu  def trigger: Boolean = exuBlockParams.map(_.trigger).reduce(_ || _)
79*730cfbc0SXuan Hu
80*730cfbc0SXuan Hu  def needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger
81*730cfbc0SXuan Hu
82*730cfbc0SXuan Hu  def needPc: Boolean = JmpCnt + BrhCnt + FenceCnt > 0
83*730cfbc0SXuan Hu
84*730cfbc0SXuan Hu  def needSrcFrm: Boolean = exuBlockParams.map(_.needSrcFrm).reduce(_ || _)
85*730cfbc0SXuan Hu
86*730cfbc0SXuan Hu  def numPcReadPort: Int = (if (needPc) 1 else 0) * numEnq
87*730cfbc0SXuan Hu
88*730cfbc0SXuan Hu  def numWriteIntRf: Int = exuBlockParams.count(_.writeIntRf)
89*730cfbc0SXuan Hu
90*730cfbc0SXuan Hu  def numWriteFpRf: Int = exuBlockParams.count(_.writeFpRf)
91*730cfbc0SXuan Hu
92*730cfbc0SXuan Hu  def numWriteVecRf: Int = exuBlockParams.count(_.writeVecRf)
93*730cfbc0SXuan Hu
94*730cfbc0SXuan Hu  def numWriteVfRf: Int = exuBlockParams.count(_.writeVfRf)
95*730cfbc0SXuan Hu
96*730cfbc0SXuan Hu  def numNoDataWB: Int = exuBlockParams.count(_.hasNoDataWB)
97*730cfbc0SXuan Hu
98*730cfbc0SXuan Hu  def numRegSrcMax: Int = numIntSrc max numFpSrc max numVecSrc
99*730cfbc0SXuan Hu
100*730cfbc0SXuan Hu  def dataBitsMax: Int = if (numVecSrc > 0) VLEN else XLEN
101*730cfbc0SXuan Hu
102*730cfbc0SXuan Hu  def numDeq: Int = numDeqOutside + exuBlockParams.length
103*730cfbc0SXuan Hu
104*730cfbc0SXuan Hu  def JmpCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.jmp)).sum
105*730cfbc0SXuan Hu
106*730cfbc0SXuan Hu  def BrhCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.brh)).sum
107*730cfbc0SXuan Hu
108*730cfbc0SXuan Hu  def I2fCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.i2f)).sum
109*730cfbc0SXuan Hu
110*730cfbc0SXuan Hu  def CsrCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.csr)).sum
111*730cfbc0SXuan Hu
112*730cfbc0SXuan Hu  def AluCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.alu)).sum
113*730cfbc0SXuan Hu
114*730cfbc0SXuan Hu  def MulCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mul)).sum
115*730cfbc0SXuan Hu
116*730cfbc0SXuan Hu  def DivCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.div)).sum
117*730cfbc0SXuan Hu
118*730cfbc0SXuan Hu  def FenceCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fence)).sum
119*730cfbc0SXuan Hu
120*730cfbc0SXuan Hu  def BkuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.bku)).sum
121*730cfbc0SXuan Hu
122*730cfbc0SXuan Hu  def VsetCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vset)).sum
123*730cfbc0SXuan Hu
124*730cfbc0SXuan Hu  def FmacCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmac)).sum
125*730cfbc0SXuan Hu
126*730cfbc0SXuan Hu  def FmiscCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmisc)).sum
127*730cfbc0SXuan Hu
128*730cfbc0SXuan Hu  def fDivSqrtCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fDivSqrt)).sum
129*730cfbc0SXuan Hu
130*730cfbc0SXuan Hu  def LduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "ldu")).sum
131*730cfbc0SXuan Hu
132*730cfbc0SXuan Hu  def StaCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "sta")).sum
133*730cfbc0SXuan Hu
134*730cfbc0SXuan Hu  def MouCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mou)).sum
135*730cfbc0SXuan Hu
136*730cfbc0SXuan Hu  def StdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "std")).sum
137*730cfbc0SXuan Hu
138*730cfbc0SXuan Hu  def VipuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vipu)).sum
139*730cfbc0SXuan Hu
140*730cfbc0SXuan Hu  def VfpuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vfpu)).sum
141*730cfbc0SXuan Hu
142*730cfbc0SXuan Hu  def VlduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vldu)).sum
143*730cfbc0SXuan Hu
144*730cfbc0SXuan Hu  def VstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vstu)).sum
145*730cfbc0SXuan Hu
146*730cfbc0SXuan Hu  def numRedirect: Int = exuBlockParams.count(_.hasRedirect)
147*730cfbc0SXuan Hu
148*730cfbc0SXuan Hu  def numAllWakeUp = numWakeupFromWB + numWakeupFromIQ + numWakeupFromOthers
149*730cfbc0SXuan Hu
150*730cfbc0SXuan Hu  def getFuCfgs: Seq[FuConfig] = exuBlockParams.flatMap(_.fuConfigs).distinct
151*730cfbc0SXuan Hu
152*730cfbc0SXuan Hu  // cfgs(exuIdx)(set of exu's wb)
153*730cfbc0SXuan Hu  def getWbCfgs: Seq[Set[WbConfig]] = {
154*730cfbc0SXuan Hu    exuBlockParams.map(exu => exu.wbPortConfigs.toSet)
155*730cfbc0SXuan Hu  }
156*730cfbc0SXuan Hu
157*730cfbc0SXuan Hu  def canAccept(fuType: UInt): Bool = {
158*730cfbc0SXuan Hu    Cat(getFuCfgs.map(_.fuType.U === fuType)).orR
159*730cfbc0SXuan Hu  }
160*730cfbc0SXuan Hu
161*730cfbc0SXuan Hu  def genExuInputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = {
162*730cfbc0SXuan Hu    MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputBundle)))
163*730cfbc0SXuan Hu  }
164*730cfbc0SXuan Hu
165*730cfbc0SXuan Hu  def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuOutput]] = {
166*730cfbc0SXuan Hu    MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuOutputBundle)))
167*730cfbc0SXuan Hu  }
168*730cfbc0SXuan Hu
169*730cfbc0SXuan Hu  def genExuOutputValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = {
170*730cfbc0SXuan Hu    MixedVec(this.exuBlockParams.map(x => ValidIO(x.genExuOutputBundle)))
171*730cfbc0SXuan Hu  }
172*730cfbc0SXuan Hu
173*730cfbc0SXuan Hu  def genIssueDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[IssueQueueIssueBundle]] = {
174*730cfbc0SXuan Hu    MixedVec(exuBlockParams.map(x => DecoupledIO(new IssueQueueIssueBundle(this, x, pregBits, vaddrBits))))
175*730cfbc0SXuan Hu  }
176*730cfbc0SXuan Hu
177*730cfbc0SXuan Hu  def genOGRespBundle(implicit p: Parameters) = {
178*730cfbc0SXuan Hu    implicit val issueBlockParams = this
179*730cfbc0SXuan Hu    MixedVec(exuBlockParams.map(_ => new OGRespBundle))
180*730cfbc0SXuan Hu  }
181*730cfbc0SXuan Hu
182*730cfbc0SXuan Hu  def getIQName = {
183*730cfbc0SXuan Hu    "IssueQueue" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _)
184*730cfbc0SXuan Hu  }
185*730cfbc0SXuan Hu}
186