xref: /XiangShan/src/main/scala/xiangshan/Parameters.scala (revision 2225d46ebbe2fd16b9b29963c27a7d0385a42709)
1*2225d46eSJiawei Linpackage xiangshan
2*2225d46eSJiawei Lin
3*2225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Field, Parameters}
4*2225d46eSJiawei Linimport chisel3._
5*2225d46eSJiawei Linimport chisel3.util._
6*2225d46eSJiawei Linimport xiangshan.backend.exu._
7*2225d46eSJiawei Linimport xiangshan.backend.fu._
8*2225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
9*2225d46eSJiawei Linimport xiangshan.backend.dispatch.DispatchParameters
10*2225d46eSJiawei Linimport xiangshan.cache.{DCacheParameters, ICacheParameters, L1plusCacheParameters}
11*2225d46eSJiawei Linimport xiangshan.cache.prefetch.{BOPParameters, L1plusPrefetcherParameters, L2PrefetcherParameters, StreamPrefetchParameters}
12*2225d46eSJiawei Lin
13*2225d46eSJiawei Lincase object XSCoreParamsKey extends Field[XSCoreParameters]
14*2225d46eSJiawei Lin
15*2225d46eSJiawei Lincase class XSCoreParameters
16*2225d46eSJiawei Lin(
17*2225d46eSJiawei Lin  HasL2Cache: Boolean = false,
18*2225d46eSJiawei Lin  HasPrefetch: Boolean = false,
19*2225d46eSJiawei Lin  HartId: Int = 0,
20*2225d46eSJiawei Lin  XLEN: Int = 64,
21*2225d46eSJiawei Lin  HasMExtension: Boolean = true,
22*2225d46eSJiawei Lin  HasCExtension: Boolean = true,
23*2225d46eSJiawei Lin  HasDiv: Boolean = true,
24*2225d46eSJiawei Lin  HasICache: Boolean = true,
25*2225d46eSJiawei Lin  HasDCache: Boolean = true,
26*2225d46eSJiawei Lin  EnableStoreQueue: Boolean = true,
27*2225d46eSJiawei Lin  AddrBits: Int = 64,
28*2225d46eSJiawei Lin  VAddrBits: Int = 39,
29*2225d46eSJiawei Lin  PAddrBits: Int = 40,
30*2225d46eSJiawei Lin  HasFPU: Boolean = true,
31*2225d46eSJiawei Lin  FetchWidth: Int = 8,
32*2225d46eSJiawei Lin  EnableBPU: Boolean = true,
33*2225d46eSJiawei Lin  EnableBPD: Boolean = true,
34*2225d46eSJiawei Lin  EnableRAS: Boolean = true,
35*2225d46eSJiawei Lin  EnableLB: Boolean = false,
36*2225d46eSJiawei Lin  EnableLoop: Boolean = true,
37*2225d46eSJiawei Lin  EnableSC: Boolean = true,
38*2225d46eSJiawei Lin  EnbaleTlbDebug: Boolean = false,
39*2225d46eSJiawei Lin  EnableJal: Boolean = false,
40*2225d46eSJiawei Lin  EnableUBTB: Boolean = true,
41*2225d46eSJiawei Lin  HistoryLength: Int = 64,
42*2225d46eSJiawei Lin  BtbSize: Int = 2048,
43*2225d46eSJiawei Lin  JbtacSize: Int = 1024,
44*2225d46eSJiawei Lin  JbtacBanks: Int = 8,
45*2225d46eSJiawei Lin  RasSize: Int = 16,
46*2225d46eSJiawei Lin  CacheLineSize: Int = 512,
47*2225d46eSJiawei Lin  UBtbWays: Int = 16,
48*2225d46eSJiawei Lin  BtbWays: Int = 2,
49*2225d46eSJiawei Lin
50*2225d46eSJiawei Lin  EnableL1plusPrefetcher: Boolean = true,
51*2225d46eSJiawei Lin  IBufSize: Int = 48,
52*2225d46eSJiawei Lin  DecodeWidth: Int = 6,
53*2225d46eSJiawei Lin  RenameWidth: Int = 6,
54*2225d46eSJiawei Lin  CommitWidth: Int = 6,
55*2225d46eSJiawei Lin  BrqSize: Int = 32,
56*2225d46eSJiawei Lin  FtqSize: Int = 48,
57*2225d46eSJiawei Lin  EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false
58*2225d46eSJiawei Lin  IssQueSize: Int = 16,
59*2225d46eSJiawei Lin  NRPhyRegs: Int = 160,
60*2225d46eSJiawei Lin  NRIntReadPorts: Int = 14,
61*2225d46eSJiawei Lin  NRIntWritePorts: Int = 8,
62*2225d46eSJiawei Lin  NRFpReadPorts: Int = 14,
63*2225d46eSJiawei Lin  NRFpWritePorts: Int = 8,
64*2225d46eSJiawei Lin  LoadQueueSize: Int = 64,
65*2225d46eSJiawei Lin  StoreQueueSize: Int = 48,
66*2225d46eSJiawei Lin  RoqSize: Int = 192,
67*2225d46eSJiawei Lin  dpParams: DispatchParameters = DispatchParameters(
68*2225d46eSJiawei Lin    IntDqSize = 16,
69*2225d46eSJiawei Lin    FpDqSize = 16,
70*2225d46eSJiawei Lin    LsDqSize = 16,
71*2225d46eSJiawei Lin    IntDqDeqWidth = 4,
72*2225d46eSJiawei Lin    FpDqDeqWidth = 4,
73*2225d46eSJiawei Lin    LsDqDeqWidth = 4
74*2225d46eSJiawei Lin  ),
75*2225d46eSJiawei Lin  exuParameters: ExuParameters = ExuParameters(
76*2225d46eSJiawei Lin    JmpCnt = 1,
77*2225d46eSJiawei Lin    AluCnt = 4,
78*2225d46eSJiawei Lin    MulCnt = 0,
79*2225d46eSJiawei Lin    MduCnt = 2,
80*2225d46eSJiawei Lin    FmacCnt = 4,
81*2225d46eSJiawei Lin    FmiscCnt = 2,
82*2225d46eSJiawei Lin    FmiscDivSqrtCnt = 0,
83*2225d46eSJiawei Lin    LduCnt = 2,
84*2225d46eSJiawei Lin    StuCnt = 2
85*2225d46eSJiawei Lin  ),
86*2225d46eSJiawei Lin  LoadPipelineWidth: Int = 2,
87*2225d46eSJiawei Lin  StorePipelineWidth: Int = 2,
88*2225d46eSJiawei Lin  StoreBufferSize: Int = 16,
89*2225d46eSJiawei Lin  RefillSize: Int = 512,
90*2225d46eSJiawei Lin  TlbEntrySize: Int = 32,
91*2225d46eSJiawei Lin  TlbSPEntrySize: Int = 4,
92*2225d46eSJiawei Lin  PtwL3EntrySize: Int = 4096, //(256 * 16) or 512
93*2225d46eSJiawei Lin  PtwSPEntrySize: Int = 16,
94*2225d46eSJiawei Lin  PtwL1EntrySize: Int = 16,
95*2225d46eSJiawei Lin  PtwL2EntrySize: Int = 2048, //(256 * 8)
96*2225d46eSJiawei Lin  NumPerfCounters: Int = 16,
97*2225d46eSJiawei Lin){
98*2225d46eSJiawei Lin  val loadExuConfigs = Seq.fill(exuParameters.LduCnt)(LdExeUnitCfg)
99*2225d46eSJiawei Lin  val storeExuConfigs = Seq.fill(exuParameters.StuCnt)(StExeUnitCfg)
100*2225d46eSJiawei Lin
101*2225d46eSJiawei Lin  val intExuConfigs = JumpExeUnitCfg +: (
102*2225d46eSJiawei Lin    Seq.fill(exuParameters.MduCnt)(MulDivExeUnitCfg) ++
103*2225d46eSJiawei Lin      Seq.fill(exuParameters.AluCnt)(AluExeUnitCfg)
104*2225d46eSJiawei Lin    )
105*2225d46eSJiawei Lin
106*2225d46eSJiawei Lin  val fpExuConfigs =
107*2225d46eSJiawei Lin    Seq.fill(exuParameters.FmacCnt)(FmacExeUnitCfg) ++
108*2225d46eSJiawei Lin      Seq.fill(exuParameters.FmiscCnt)(FmiscExeUnitCfg)
109*2225d46eSJiawei Lin
110*2225d46eSJiawei Lin  val exuConfigs: Seq[ExuConfig] = intExuConfigs ++ fpExuConfigs ++ loadExuConfigs ++ storeExuConfigs
111*2225d46eSJiawei Lin}
112*2225d46eSJiawei Lin
113*2225d46eSJiawei Lincase object DebugOptionsKey extends Field[DebugOptions]
114*2225d46eSJiawei Lin
115*2225d46eSJiawei Lincase class DebugOptions
116*2225d46eSJiawei Lin(
117*2225d46eSJiawei Lin  FPGAPlatform: Boolean = true,
118*2225d46eSJiawei Lin  EnableDebug: Boolean = false,
119*2225d46eSJiawei Lin  EnablePerfDebug: Boolean = true,
120*2225d46eSJiawei Lin  UseDRAMSim: Boolean = false
121*2225d46eSJiawei Lin)
122*2225d46eSJiawei Lin
123*2225d46eSJiawei Lintrait HasXSParameter {
124*2225d46eSJiawei Lin
125*2225d46eSJiawei Lin  implicit val p: Parameters
126*2225d46eSJiawei Lin
127*2225d46eSJiawei Lin  val coreParams = p(XSCoreParamsKey)
128*2225d46eSJiawei Lin  val env = p(DebugOptionsKey)
129*2225d46eSJiawei Lin
130*2225d46eSJiawei Lin  val XLEN = coreParams.XLEN
131*2225d46eSJiawei Lin  val hardId = coreParams.HartId
132*2225d46eSJiawei Lin  val minFLen = 32
133*2225d46eSJiawei Lin  val fLen = 64
134*2225d46eSJiawei Lin  def xLen = XLEN
135*2225d46eSJiawei Lin
136*2225d46eSJiawei Lin  val HasMExtension = coreParams.HasMExtension
137*2225d46eSJiawei Lin  val HasCExtension = coreParams.HasCExtension
138*2225d46eSJiawei Lin  val HasDiv = coreParams.HasDiv
139*2225d46eSJiawei Lin  val HasIcache = coreParams.HasICache
140*2225d46eSJiawei Lin  val HasDcache = coreParams.HasDCache
141*2225d46eSJiawei Lin  val EnableStoreQueue = coreParams.EnableStoreQueue
142*2225d46eSJiawei Lin  val AddrBits = coreParams.AddrBits // AddrBits is used in some cases
143*2225d46eSJiawei Lin  val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits
144*2225d46eSJiawei Lin  val PAddrBits = coreParams.PAddrBits // PAddrBits is Phyical Memory addr bits
145*2225d46eSJiawei Lin  val AddrBytes = AddrBits / 8 // unused
146*2225d46eSJiawei Lin  val DataBits = XLEN
147*2225d46eSJiawei Lin  val DataBytes = DataBits / 8
148*2225d46eSJiawei Lin  val HasFPU = coreParams.HasFPU
149*2225d46eSJiawei Lin  val FetchWidth = coreParams.FetchWidth
150*2225d46eSJiawei Lin  val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1)
151*2225d46eSJiawei Lin  val EnableBPU = coreParams.EnableBPU
152*2225d46eSJiawei Lin  val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3
153*2225d46eSJiawei Lin  val EnableRAS = coreParams.EnableRAS
154*2225d46eSJiawei Lin  val EnableLB = coreParams.EnableLB
155*2225d46eSJiawei Lin  val EnableLoop = coreParams.EnableLoop
156*2225d46eSJiawei Lin  val EnableSC = coreParams.EnableSC
157*2225d46eSJiawei Lin  val EnbaleTlbDebug = coreParams.EnbaleTlbDebug
158*2225d46eSJiawei Lin  val HistoryLength = coreParams.HistoryLength
159*2225d46eSJiawei Lin  val BtbSize = coreParams.BtbSize
160*2225d46eSJiawei Lin  // val BtbWays = 4
161*2225d46eSJiawei Lin  val BtbBanks = PredictWidth
162*2225d46eSJiawei Lin  // val BtbSets = BtbSize / BtbWays
163*2225d46eSJiawei Lin  val JbtacSize = coreParams.JbtacSize
164*2225d46eSJiawei Lin  val JbtacBanks = coreParams.JbtacBanks
165*2225d46eSJiawei Lin  val RasSize = coreParams.RasSize
166*2225d46eSJiawei Lin  val CacheLineSize = coreParams.CacheLineSize
167*2225d46eSJiawei Lin  val CacheLineHalfWord = CacheLineSize / 16
168*2225d46eSJiawei Lin  val ExtHistoryLength = HistoryLength + 64
169*2225d46eSJiawei Lin  val UBtbWays = coreParams.UBtbWays
170*2225d46eSJiawei Lin  val BtbWays = coreParams.BtbWays
171*2225d46eSJiawei Lin  val EnableL1plusPrefetcher = coreParams.EnableL1plusPrefetcher
172*2225d46eSJiawei Lin  val IBufSize = coreParams.IBufSize
173*2225d46eSJiawei Lin  val DecodeWidth = coreParams.DecodeWidth
174*2225d46eSJiawei Lin  val RenameWidth = coreParams.RenameWidth
175*2225d46eSJiawei Lin  val CommitWidth = coreParams.CommitWidth
176*2225d46eSJiawei Lin  val BrqSize = coreParams.BrqSize
177*2225d46eSJiawei Lin  val FtqSize = coreParams.FtqSize
178*2225d46eSJiawei Lin  val IssQueSize = coreParams.IssQueSize
179*2225d46eSJiawei Lin  val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp
180*2225d46eSJiawei Lin  val BrTagWidth = log2Up(BrqSize)
181*2225d46eSJiawei Lin  val NRPhyRegs = coreParams.NRPhyRegs
182*2225d46eSJiawei Lin  val PhyRegIdxWidth = log2Up(NRPhyRegs)
183*2225d46eSJiawei Lin  val RoqSize = coreParams.RoqSize
184*2225d46eSJiawei Lin  val LoadQueueSize = coreParams.LoadQueueSize
185*2225d46eSJiawei Lin  val StoreQueueSize = coreParams.StoreQueueSize
186*2225d46eSJiawei Lin  val dpParams = coreParams.dpParams
187*2225d46eSJiawei Lin  val exuParameters = coreParams.exuParameters
188*2225d46eSJiawei Lin  val NRIntReadPorts = coreParams.NRIntReadPorts
189*2225d46eSJiawei Lin  val NRIntWritePorts = coreParams.NRIntWritePorts
190*2225d46eSJiawei Lin  val NRMemReadPorts = exuParameters.LduCnt + 2 * exuParameters.StuCnt
191*2225d46eSJiawei Lin  val NRFpReadPorts = coreParams.NRFpReadPorts
192*2225d46eSJiawei Lin  val NRFpWritePorts = coreParams.NRFpWritePorts
193*2225d46eSJiawei Lin  val LoadPipelineWidth = coreParams.LoadPipelineWidth
194*2225d46eSJiawei Lin  val StorePipelineWidth = coreParams.StorePipelineWidth
195*2225d46eSJiawei Lin  val StoreBufferSize = coreParams.StoreBufferSize
196*2225d46eSJiawei Lin  val RefillSize = coreParams.RefillSize
197*2225d46eSJiawei Lin  val DTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth
198*2225d46eSJiawei Lin  val TlbEntrySize = coreParams.TlbEntrySize
199*2225d46eSJiawei Lin  val TlbSPEntrySize = coreParams.TlbSPEntrySize
200*2225d46eSJiawei Lin  val PtwL3EntrySize = coreParams.PtwL3EntrySize
201*2225d46eSJiawei Lin  val PtwSPEntrySize = coreParams.PtwSPEntrySize
202*2225d46eSJiawei Lin  val PtwL1EntrySize = coreParams.PtwL1EntrySize
203*2225d46eSJiawei Lin  val PtwL2EntrySize = coreParams.PtwL2EntrySize
204*2225d46eSJiawei Lin  val NumPerfCounters = coreParams.NumPerfCounters
205*2225d46eSJiawei Lin
206*2225d46eSJiawei Lin  val instBytes = if (HasCExtension) 2 else 4
207*2225d46eSJiawei Lin  val instOffsetBits = log2Ceil(instBytes)
208*2225d46eSJiawei Lin
209*2225d46eSJiawei Lin  val icacheParameters = ICacheParameters(
210*2225d46eSJiawei Lin    tagECC = Some("parity"),
211*2225d46eSJiawei Lin    dataECC = Some("parity"),
212*2225d46eSJiawei Lin    replacer = Some("setplru"),
213*2225d46eSJiawei Lin    nMissEntries = 2
214*2225d46eSJiawei Lin  )
215*2225d46eSJiawei Lin
216*2225d46eSJiawei Lin  val l1plusCacheParameters = L1plusCacheParameters(
217*2225d46eSJiawei Lin    tagECC = Some("secded"),
218*2225d46eSJiawei Lin    dataECC = Some("secded"),
219*2225d46eSJiawei Lin    replacer = Some("setplru"),
220*2225d46eSJiawei Lin    nMissEntries = 8
221*2225d46eSJiawei Lin  )
222*2225d46eSJiawei Lin
223*2225d46eSJiawei Lin  val dcacheParameters = DCacheParameters(
224*2225d46eSJiawei Lin    tagECC = Some("secded"),
225*2225d46eSJiawei Lin    dataECC = Some("secded"),
226*2225d46eSJiawei Lin    replacer = Some("setplru"),
227*2225d46eSJiawei Lin    nMissEntries = 16,
228*2225d46eSJiawei Lin    nProbeEntries = 16,
229*2225d46eSJiawei Lin    nReleaseEntries = 16,
230*2225d46eSJiawei Lin    nStoreReplayEntries = 16
231*2225d46eSJiawei Lin  )
232*2225d46eSJiawei Lin
233*2225d46eSJiawei Lin  val LRSCCycles = 100
234*2225d46eSJiawei Lin
235*2225d46eSJiawei Lin
236*2225d46eSJiawei Lin  // cache hierarchy configurations
237*2225d46eSJiawei Lin  val l1BusDataWidth = 256
238*2225d46eSJiawei Lin
239*2225d46eSJiawei Lin  // L2 configurations
240*2225d46eSJiawei Lin  val L1BusWidth = 256
241*2225d46eSJiawei Lin  val L2Size = 512 * 1024 // 512KB
242*2225d46eSJiawei Lin  val L2BlockSize = 64
243*2225d46eSJiawei Lin  val L2NWays = 8
244*2225d46eSJiawei Lin  val L2NSets = L2Size / L2BlockSize / L2NWays
245*2225d46eSJiawei Lin
246*2225d46eSJiawei Lin  // L3 configurations
247*2225d46eSJiawei Lin  val L2BusWidth = 256
248*2225d46eSJiawei Lin
249*2225d46eSJiawei Lin  // icache prefetcher
250*2225d46eSJiawei Lin  val l1plusPrefetcherParameters = L1plusPrefetcherParameters(
251*2225d46eSJiawei Lin    enable = true,
252*2225d46eSJiawei Lin    _type = "stream",
253*2225d46eSJiawei Lin    streamParams = StreamPrefetchParameters(
254*2225d46eSJiawei Lin      streamCnt = 2,
255*2225d46eSJiawei Lin      streamSize = 4,
256*2225d46eSJiawei Lin      ageWidth = 4,
257*2225d46eSJiawei Lin      blockBytes = l1plusCacheParameters.blockBytes,
258*2225d46eSJiawei Lin      reallocStreamOnMissInstantly = true,
259*2225d46eSJiawei Lin      cacheName = "icache"
260*2225d46eSJiawei Lin    )
261*2225d46eSJiawei Lin  )
262*2225d46eSJiawei Lin
263*2225d46eSJiawei Lin  // dcache prefetcher
264*2225d46eSJiawei Lin  val l2PrefetcherParameters = L2PrefetcherParameters(
265*2225d46eSJiawei Lin    enable = true,
266*2225d46eSJiawei Lin    _type = "bop", // "stream" or "bop"
267*2225d46eSJiawei Lin    streamParams = StreamPrefetchParameters(
268*2225d46eSJiawei Lin      streamCnt = 4,
269*2225d46eSJiawei Lin      streamSize = 4,
270*2225d46eSJiawei Lin      ageWidth = 4,
271*2225d46eSJiawei Lin      blockBytes = L2BlockSize,
272*2225d46eSJiawei Lin      reallocStreamOnMissInstantly = true,
273*2225d46eSJiawei Lin      cacheName = "dcache"
274*2225d46eSJiawei Lin    ),
275*2225d46eSJiawei Lin    bopParams = BOPParameters(
276*2225d46eSJiawei Lin      rrTableEntries = 256,
277*2225d46eSJiawei Lin      rrTagBits = 12,
278*2225d46eSJiawei Lin      scoreBits = 5,
279*2225d46eSJiawei Lin      roundMax = 50,
280*2225d46eSJiawei Lin      badScore = 1,
281*2225d46eSJiawei Lin      blockBytes = L2BlockSize,
282*2225d46eSJiawei Lin      nEntries = dcacheParameters.nMissEntries * 2 // TODO: this is too large
283*2225d46eSJiawei Lin    ),
284*2225d46eSJiawei Lin  )
285*2225d46eSJiawei Lin
286*2225d46eSJiawei Lin  val loadExuConfigs = coreParams.loadExuConfigs
287*2225d46eSJiawei Lin  val storeExuConfigs = coreParams.storeExuConfigs
288*2225d46eSJiawei Lin
289*2225d46eSJiawei Lin  val intExuConfigs = coreParams.intExuConfigs
290*2225d46eSJiawei Lin
291*2225d46eSJiawei Lin  val fpExuConfigs = coreParams.fpExuConfigs
292*2225d46eSJiawei Lin
293*2225d46eSJiawei Lin  val exuConfigs = coreParams.exuConfigs
294*2225d46eSJiawei Lin}
295