Parameters.scala 25.5 KB
Newer Older
L
Lemover 已提交
1 2
/***************************************************************************************
* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
Y
Yinan Xu 已提交
3
* Copyright (c) 2020-2021 Peng Cheng Laboratory
L
Lemover 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16
*
* XiangShan is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*          http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
*
* See the Mulan PSL v2 for more details.
***************************************************************************************/

17 18 19 20 21
package xiangshan

import chipsalliance.rocketchip.config.{Field, Parameters}
import chisel3._
import chisel3.util._
X
Xuan Hu 已提交
22 23
import huancun._
import system.SoCParamsKey
X
Xuan Hu 已提交
24 25
import xiangshan.backend.datapath.RdConfig._
import xiangshan.backend.datapath.WbConfig._
26
import xiangshan.backend.dispatch.DispatchParameters
X
Xuan Hu 已提交
27 28 29 30 31
import xiangshan.backend.exu.ExeUnitParams
import xiangshan.backend.fu.FuConfig._
import xiangshan.backend.issue.{IntScheduler, IssueBlockParams, MemScheduler, SchdBlockParams, SchedulerType, VfScheduler}
import xiangshan.backend.regfile.{IntPregParams, PregParams, VfPregParams}
import xiangshan.backend.BackendParams
32
import xiangshan.cache.DCacheParameters
33
import xiangshan.cache.prefetch._
L
Lingrui98 已提交
34
import xiangshan.frontend.{BasePredictor, BranchPredictionResp, FTB, FakePredictor, RAS, Tage, ITTage, Tage_SC, FauFTB}
35
import xiangshan.frontend.icache.ICacheParameters
X
Xuan Hu 已提交
36 37
import xiangshan.cache.mmu.{L2TLBParameters, TLBParameters}
import xiangshan.frontend._
38
import xiangshan.frontend.icache.ICacheParameters
X
Xuan Hu 已提交
39

40
import freechips.rocketchip.diplomacy.AddressSet
41
import system.SoCParamsKey
42 43
import huancun._
import huancun.debug._
W
wakafa 已提交
44
import coupledL2._
X
Xuan Hu 已提交
45
import xiangshan.backend.datapath.WakeUpConfig
L
LinJiawei 已提交
46 47
import xiangshan.mem.prefetch.{PrefetcherParams, SMSParams}

48
import scala.math.min
J
Jiawei Lin 已提交
49 50 51

case object XSTileKey extends Field[Seq[XSCoreParameters]]

52 53 54 55 56 57 58
case object XSCoreParamsKey extends Field[XSCoreParameters]

case class XSCoreParameters
(
  HasPrefetch: Boolean = false,
  HartId: Int = 0,
  XLEN: Int = 64,
59
  VLEN: Int = 128,
F
fdy 已提交
60
  ELEN: Int = 64,
61 62 63 64 65 66 67 68
  HasMExtension: Boolean = true,
  HasCExtension: Boolean = true,
  HasDiv: Boolean = true,
  HasICache: Boolean = true,
  HasDCache: Boolean = true,
  AddrBits: Int = 64,
  VAddrBits: Int = 39,
  HasFPU: Boolean = true,
Z
Ziyue Zhang 已提交
69
  HasVPU: Boolean = true,
Z
zhanglinjuan 已提交
70
  HasCustomCSRCacheOp: Boolean = true,
71
  FetchWidth: Int = 8,
72
  AsidLength: Int = 16,
73 74 75 76 77
  EnableBPU: Boolean = true,
  EnableBPD: Boolean = true,
  EnableRAS: Boolean = true,
  EnableLB: Boolean = false,
  EnableLoop: Boolean = true,
78
  EnableSC: Boolean = true,
79 80
  EnbaleTlbDebug: Boolean = false,
  EnableJal: Boolean = false,
81
  EnableFauFTB: Boolean = true,
82
  UbtbGHRLength: Int = 4,
83
  // HistoryLength: Int = 512,
84
  EnableGHistDiff: Boolean = true,
85
  EnableCommitGHistDiff: Boolean = true,
86
  UbtbSize: Int = 256,
87
  FtbSize: Int = 2048,
88
  RasSize: Int = 32,
89
  CacheLineSize: Int = 512,
90
  FtbWays: Int = 4,
91 92
  TageTableInfos: Seq[Tuple3[Int,Int,Int]] =
  //       Sets  Hist   Tag
L
Lingrui98 已提交
93 94 95 96 97 98 99 100 101 102 103 104
    // Seq(( 2048,    2,    8),
    //     ( 2048,    9,    8),
    //     ( 2048,   13,    8),
    //     ( 2048,   20,    8),
    //     ( 2048,   26,    8),
    //     ( 2048,   44,    8),
    //     ( 2048,   73,    8),
    //     ( 2048,  256,    8)),
    Seq(( 4096,    8,    8),
        ( 4096,   13,    8),
        ( 4096,   32,    8),
        ( 4096,  119,    8)),
105 106
  ITTageTableInfos: Seq[Tuple3[Int,Int,Int]] =
  //      Sets  Hist   Tag
L
Lingrui98 已提交
107
    Seq(( 256,    4,    9),
108
        ( 256,    8,    9),
L
Lingrui98 已提交
109
        ( 512,   13,    9),
110
        ( 512,   16,    9),
111
        ( 512,   32,    9)),
112 113
  SCNRows: Int = 512,
  SCNTables: Int = 4,
114
  SCCtrBits: Int = 6,
115
  SCHistLens: Seq[Int] = Seq(0, 4, 10, 16),
116
  numBr: Int = 2,
117 118
  branchPredictor: Function2[BranchPredictionResp, Parameters, Tuple2[Seq[BasePredictor], BranchPredictionResp]] =
    ((resp_in: BranchPredictionResp, p: Parameters) => {
Z
zoujr 已提交
119
      val ftb = Module(new FTB()(p))
L
Lingrui98 已提交
120
      val ubtb =Module(new FauFTB()(p))
121
      // val bim = Module(new BIM()(p))
122
      val tage = Module(new Tage_SC()(p))
L
Lingrui98 已提交
123
      val ras = Module(new RAS()(p))
124
      val ittage = Module(new ITTage()(p))
125
      val preds = Seq(ubtb, tage, ftb, ittage, ras)
Z
zoujr 已提交
126 127 128 129 130 131 132
      preds.map(_.io := DontCare)

      // ubtb.io.resp_in(0)  := resp_in
      // bim.io.resp_in(0)   := ubtb.io.resp
      // btb.io.resp_in(0)   := bim.io.resp
      // tage.io.resp_in(0)  := btb.io.resp
      // loop.io.resp_in(0)  := tage.io.resp
133
      ubtb.io.in.bits.resp_in(0) := resp_in
L
Lingrui98 已提交
134 135 136 137
      tage.io.in.bits.resp_in(0) := ubtb.io.out
      ftb.io.in.bits.resp_in(0)  := tage.io.out
      ittage.io.in.bits.resp_in(0)  := ftb.io.out
      ras.io.in.bits.resp_in(0) := ittage.io.out
Y
Yinan Xu 已提交
138

L
Lingrui98 已提交
139
      (preds, ras.io.out)
Z
zoujr 已提交
140
    }),
141 142 143 144
  IBufSize: Int = 48,
  DecodeWidth: Int = 6,
  RenameWidth: Int = 6,
  CommitWidth: Int = 6,
145
  MaxUopSize: Int = 65,
L
Lingrui98 已提交
146
  FtqSize: Int = 64,
147
  EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false
F
fdy 已提交
148
  IntLogicRegs: Int = 32,
F
fdy 已提交
149
  FpLogicRegs: Int = 33,
150 151
  VecLogicRegs: Int = 32 + 1 + 15, // 15: tmp, 1: vconfig
  VCONFIG_IDX: Int = 32,
152
  NRPhyRegs: Int = 192,
X
Xuan Hu 已提交
153 154
  IntPhyRegs: Int = 192,
  VfPhyRegs: Int = 192,
155 156 157 158 159 160 161
  VirtualLoadQueueSize: Int = 80,
  LoadQueueRARSize: Int = 80,
  LoadQueueRAWSize: Int = 64, // NOTE: make sure that LoadQueueRAWSize is power of 2.
  RollbackGroupSize: Int = 8,
  LoadQueueReplaySize: Int = 80,
  LoadUncacheBufferSize: Int = 20,
  LoadQueueNWriteBanks: Int = 8, // NOTE: make sure that LoadQueueRARSize/LoadQueueRAWSize is divided by LoadQueueNWriteBanks
162
  StoreQueueSize: Int = 64,
163 164
  StoreQueueNWriteBanks: Int = 8, // NOTE: make sure that StoreQueueSize is divided by StoreQueueNWriteBanks
  StoreQueueForwardWithMask: Boolean = true,
W
William Wang 已提交
165
  VlsQueueSize: Int = 8,
166
  RobSize: Int = 256,
F
fdy 已提交
167
  RabSize: Int = 256,
168 169 170 171
  dpParams: DispatchParameters = DispatchParameters(
    IntDqSize = 16,
    FpDqSize = 16,
    LsDqSize = 16,
X
Xuan Hu 已提交
172 173 174
    IntDqDeqWidth = 6,
    FpDqDeqWidth = 6,
    LsDqDeqWidth = 6,
175
  ),
X
Xuan Hu 已提交
176
  intPreg: PregParams = IntPregParams(
Z
zhanglyGit 已提交
177
    numEntries = 256,
X
Xuan Hu 已提交
178 179
    numRead = 14,
    numWrite = 8,
180
  ),
X
Xuan Hu 已提交
181
  vfPreg: VfPregParams = VfPregParams(
Z
zhanglyGit 已提交
182
    numEntries = 256,
X
Xuan Hu 已提交
183 184 185
    numRead = 14,
    numWrite = 8,
  ),
L
LinJiawei 已提交
186
  prefetcher: Option[PrefetcherParams] = Some(SMSParams()),
187 188
  LoadPipelineWidth: Int = 2,
  StorePipelineWidth: Int = 2,
W
William Wang 已提交
189 190 191
  VecMemSrcInWidth: Int = 2,
  VecMemInstWbWidth: Int = 1,
  VecMemDispatchWidth: Int = 1,
192
  StoreBufferSize: Int = 16,
193
  StoreBufferThreshold: Int = 7,
194
  EnsbufferWidth: Int = 2,
195
  UncacheBufferSize: Int = 4,
196
  EnableLoadToLoadForward: Boolean = true,
W
William Wang 已提交
197
  EnableFastForward: Boolean = false,
198
  EnableLdVioCheckAfterReset: Boolean = true,
199 200
  EnableSoftPrefetchAfterReset: Boolean = true,
  EnableCacheErrorAfterReset: Boolean = true,
201
  EnableDCacheWPU: Boolean = false,
202
  EnableAccurateLoadError: Boolean = true,
203
  EnableUncacheWriteOutstanding: Boolean = false,
204
  MMUAsidLen: Int = 16, // max is 16, 0 is not supported now
205
  ReSelectLen: Int = 7, // load replay queue replay select counter len
206 207 208 209
  itlbParameters: TLBParameters = TLBParameters(
    name = "itlb",
    fetchi = true,
    useDmode = false,
210
    normalNWays = 32,
211
    normalReplacer = Some("plru"),
212
    superNWays = 4,
213
    superReplacer = Some("plru")
214
  ),
215 216
  itlbPortNum: Int = 2 + ICacheParameters().prefetchPipeNum + 1,
  ipmpPortNum: Int = 2 + ICacheParameters().prefetchPipeNum + 1,
217 218
  ldtlbParameters: TLBParameters = TLBParameters(
    name = "ldtlb",
219
    normalNSets = 64,
220 221 222
    normalNWays = 1,
    normalAssociative = "sa",
    normalReplacer = Some("setplru"),
223
    superNWays = 16,
224
    normalAsVictim = true,
225
    outReplace = false,
226
    partialStaticPMP = true,
227
    outsideRecvFlush = true,
228
    saveLevel = true
229 230 231
  ),
  sttlbParameters: TLBParameters = TLBParameters(
    name = "sttlb",
232
    normalNSets = 64,
233 234 235
    normalNWays = 1,
    normalAssociative = "sa",
    normalReplacer = Some("setplru"),
236
    superNWays = 16,
237
    normalAsVictim = true,
238
    outReplace = false,
239
    partialStaticPMP = true,
240
    outsideRecvFlush = true,
241
    saveLevel = true
242
  ),
243 244 245 246 247 248 249 250 251 252 253 254 255
  pftlbParameters: TLBParameters = TLBParameters(
    name = "pftlb",
    normalNSets = 64,
    normalNWays = 1,
    normalAssociative = "sa",
    normalReplacer = Some("setplru"),
    superNWays = 16,
    normalAsVictim = true,
    outReplace = false,
    partialStaticPMP = true,
    outsideRecvFlush = true,
    saveLevel = true
  ),
256
  refillBothTlb: Boolean = false,
257 258 259 260 261 262
  btlbParameters: TLBParameters = TLBParameters(
    name = "btlb",
    normalNSets = 1,
    normalNWays = 64,
    superNWays = 4,
  ),
263
  l2tlbParameters: L2TLBParameters = L2TLBParameters(),
264
  NumPerfCounters: Int = 16,
265 266 267 268
  icacheParameters: ICacheParameters = ICacheParameters(
    tagECC = Some("parity"),
    dataECC = Some("parity"),
    replacer = Some("setplru"),
269
    nMissEntries = 2,
270
    nProbeEntries = 2,
271
    nPrefetchEntries = 12,
272
    nPrefBufferEntries = 64,
273
    hasPrefetch = true,
274
  ),
J
Jiawei Lin 已提交
275
  dcacheParametersOpt: Option[DCacheParameters] = Some(DCacheParameters(
276 277 278 279
    tagECC = Some("secded"),
    dataECC = Some("secded"),
    replacer = Some("setplru"),
    nMissEntries = 16,
W
William Wang 已提交
280 281
    nProbeEntries = 8,
    nReleaseEntries = 18
J
Jiawei Lin 已提交
282
  )),
W
wakafa 已提交
283
  L2CacheParamsOpt: Option[L2Param] = Some(L2Param(
284 285 286
    name = "l2",
    ways = 8,
    sets = 1024, // default 512KB L2
W
wakafa 已提交
287
    prefetch = Some(coupledL2.prefetch.PrefetchReceiverParams())
J
Jiawei Lin 已提交
288
  )),
J
Jiawei Lin 已提交
289
  L2NBanks: Int = 1,
290
  usePTWRepeater: Boolean = false,
H
Haoyuan Feng 已提交
291 292
  softTLB: Boolean = false, // dpi-c l1tlb debug only
  softPTW: Boolean = false, // dpi-c l2tlb debug only
293
  softPTWDelay: Int = 1
294
){
295 296
  def vlWidth = log2Up(VLEN) + 1

297 298 299
  val allHistLens = SCHistLens ++ ITTageTableInfos.map(_._2) ++ TageTableInfos.map(_._2) :+ UbtbGHRLength
  val HistoryLength = allHistLens.max + numBr * FtqSize + 9 // 256 for the predictor configs now

X
Xuan Hu 已提交
300 301 302 303 304 305
  def intSchdParams = {
    implicit val schdType: SchedulerType = IntScheduler()
    val pregBits = intPreg.addrWidth
    val numRfRead = intPreg.numRead
    val numRfWrite = intPreg.numWrite
    SchdBlockParams(Seq(
306
      IssueBlockParams(Seq(
307 308
        ExeUnitParams("IEX0", Seq(AluCfg), Seq(IntWB(port = 0, 0)), Seq(Seq(IntRD(0, 0)), Seq(IntRD(1, 0)))),
        ExeUnitParams("IEX1", Seq(AluCfg), Seq(IntWB(port = 1, 0)), Seq(Seq(IntRD(2, 0)), Seq(IntRD(3, 0)))),
309
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
X
Xuan Hu 已提交
310
      IssueBlockParams(Seq(
311 312
        ExeUnitParams("IEX2", Seq(AluCfg, MulCfg, BkuCfg), Seq(IntWB(port = 2, 0)), Seq(Seq(IntRD(4, 0)), Seq(IntRD(5, 0)))),
        ExeUnitParams("IEX3", Seq(AluCfg, MulCfg, BkuCfg), Seq(IntWB(port = 3, 0)), Seq(Seq(IntRD(6, 0)), Seq(IntRD(7, 0)))),
X
Xuan Hu 已提交
313 314
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
315 316
        ExeUnitParams("BJU0", Seq(BrhCfg, JmpCfg, CsrCfg, FenceCfg), Seq(IntWB(port = 4, 0)), Seq(Seq(IntRD(8, 0)), Seq(IntRD(9, 0)))),
        ExeUnitParams("BJU1", Seq(BrhCfg), Seq(), Seq(Seq(IntRD(2, 1)), Seq(IntRD(3, 1)))),
X
Xuan Hu 已提交
317 318
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
319
        ExeUnitParams("IMISC0", Seq(VSetRiWiCfg, I2fCfg, VSetRiWvfCfg), Seq(IntWB(port = 4, 1), VfWB(4, 0)), Seq(Seq(IntRD(8, 1)), Seq(IntRD(9, 1)))),
X
Xuan Hu 已提交
320 321
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
322
        ExeUnitParams("IDIV0", Seq(DivCfg), Seq(IntWB(port = 5, 1)), Seq(Seq(IntRD(6, Int.MaxValue)), Seq(IntRD(7, Int.MaxValue)))),
F
fdy 已提交
323
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
X
Xuan Hu 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
    ),
      numPregs = intPreg.numEntries,
      numRfReadWrite = Some((numRfRead, numRfWrite)),
      numDeqOutside = 0,
      schdType = schdType,
      rfDataWidth = intPreg.dataCfg.dataWidth,
      numUopIn = dpParams.IntDqDeqWidth,
    )
  }
  def vfSchdParams = {
    implicit val schdType: SchedulerType = VfScheduler()
    val pregBits = vfPreg.addrWidth
    val numRfRead = vfPreg.numRead
    val numRfWrite = vfPreg.numWrite
    SchdBlockParams(Seq(
      IssueBlockParams(Seq(
X
xiaofeibao-xjtu 已提交
340 341 342 343 344
        ExeUnitParams("VEX0", Seq(VialuCfg), Seq(VfWB(port = 0, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
        ExeUnitParams("VEX1", Seq(VimacCfg), Seq(VfWB(port = 0, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
        ExeUnitParams("FEX0", Seq(FmacCfg), Seq(VfWB(port = 1, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)))),
345
        ExeUnitParams("FEX1", Seq(FmacCfg), Seq(VfWB(port = 1, 0)), Seq(Seq(VfRD(4, 0)), Seq(VfRD(5, 0)), Seq(VfRD(6, 0)))),
346
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
X
xiaofeibao-xjtu 已提交
347
      IssueBlockParams(Seq(
348
        ExeUnitParams("FEX2", Seq(FDivSqrtCfg), Seq(VfWB(port = 2, 0)), Seq(Seq(VfRD(11, 0)), Seq(VfRD(12, 0)))),
X
xiaofeibao-xjtu 已提交
349 350 351 352 353 354 355 356 357
        ExeUnitParams("FEX3", Seq(F2fCfg, F2iCfg, VSetRvfWvfCfg), Seq(VfWB(port = 2, 0), IntWB(port = 5, 0)), Seq(Seq(VfRD(7, 0)), Seq(VfRD(8, 0)))),
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
        ExeUnitParams("VEX2", Seq(VppuCfg), Seq(VfWB(port = 3, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
        ExeUnitParams("VEX3", Seq(VipuCfg), Seq(VfWB(port = 3, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
      IssueBlockParams(Seq(
        ExeUnitParams("VEX2", Seq(VfaluCfg), Seq(VfWB(port = 4, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
        ExeUnitParams("VEX3", Seq(VfmaCfg), Seq(VfWB(port = 4, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
X
xiaofeibao-xjtu 已提交
358
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
359
      IssueBlockParams(Seq(
X
xiaofeibao-xjtu 已提交
360
        ExeUnitParams("VEX4", Seq(VfdivCfg), Seq(VfWB(port = 5, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))),
361
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = numRfWrite, numEnq = 2),
X
Xuan Hu 已提交
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
    ),
      numPregs = vfPreg.numEntries,
      numRfReadWrite = Some((numRfRead, numRfWrite)),
      numDeqOutside = 0,
      schdType = schdType,
      rfDataWidth = vfPreg.dataCfg.dataWidth,
      numUopIn = dpParams.FpDqDeqWidth,
    )
  }
  def memSchdParams = {
    implicit val schdType: SchedulerType = MemScheduler()
    val pregBits = vfPreg.addrWidth max intPreg.addrWidth
    val rfDataWidth = 64

    SchdBlockParams(Seq(
      IssueBlockParams(Seq(
378 379
        ExeUnitParams("LDU0", Seq(LduCfg), Seq(IntWB(6, 0), VfWB(6, 0)), Seq(Seq(IntRD(10, 0)))),
        ExeUnitParams("LDU1", Seq(LduCfg), Seq(IntWB(7, 0), VfWB(7, 0)), Seq(Seq(IntRD(11, 0)))),
X
Xuan Hu 已提交
380
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = 16, numEnq = 2),
X
Xuan Hu 已提交
381
      IssueBlockParams(Seq(
382 383
        ExeUnitParams("STA0", Seq(StaCfg, MouCfg), Seq(IntWB(6, 1)), Seq(Seq(IntRD(12, 0)))),
        ExeUnitParams("STA1", Seq(StaCfg, MouCfg), Seq(IntWB(7, 1)), Seq(Seq(IntRD(13, 0)))),
X
Xuan Hu 已提交
384
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = 16, numEnq = 2),
X
Xuan Hu 已提交
385
      IssueBlockParams(Seq(
386 387
        ExeUnitParams("STD0", Seq(StdCfg, MoudCfg), Seq(), Seq(Seq(IntRD(8, Int.MaxValue), VfRD(12, Int.MaxValue)))),
        ExeUnitParams("STD1", Seq(StdCfg, MoudCfg), Seq(), Seq(Seq(IntRD(9, Int.MaxValue), VfRD(13, Int.MaxValue)))),
X
Xuan Hu 已提交
388
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = 16, numEnq = 2),
Z
zhanglyGit 已提交
389
      IssueBlockParams(Seq(
X
xiaofeibao-xjtu 已提交
390 391
        ExeUnitParams("VLDU0", Seq(VlduCfg), Seq(VfWB(6, 1)), Seq(Seq(VfRD(0, 0)), Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)))),
        ExeUnitParams("VLDU1", Seq(VlduCfg), Seq(VfWB(7, 1)), Seq(Seq(VfRD(5, 0)), Seq(VfRD(6, 0)), Seq(VfRD(7, 0)), Seq(VfRD(8, 0)), Seq(VfRD(9, 0)))),
Z
zhanglyGit 已提交
392
      ), numEntries = 8, pregBits = pregBits, numWakeupFromWB = 16, numEnq = 2),
X
Xuan Hu 已提交
393
    ),
X
Xuan Hu 已提交
394
      numPregs = intPreg.numEntries max vfPreg.numEntries,
X
Xuan Hu 已提交
395 396 397 398 399 400 401
      numRfReadWrite = None,
      numDeqOutside = 0,
      schdType = schdType,
      rfDataWidth = rfDataWidth,
      numUopIn = dpParams.LsDqDeqWidth,
    )
  }
402

X
Xuan Hu 已提交
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
  def PregIdxWidthMax = intPreg.addrWidth max vfPreg.addrWidth

  def iqWakeUpParams = {
    Seq(
      WakeUpConfig("IEX0" -> "IEX0"),
      WakeUpConfig("IEX0" -> "IEX1"),
      WakeUpConfig("IEX1" -> "IEX0"),
      WakeUpConfig("IEX1" -> "IEX1"),
      WakeUpConfig("IEX0" -> "BJU0"),
      WakeUpConfig("IEX0" -> "BJU1"),
      WakeUpConfig("IEX1" -> "BJU0"),
      WakeUpConfig("IEX1" -> "BJU1"),
      WakeUpConfig("IEX0" -> "LDU0"),
      WakeUpConfig("IEX0" -> "LDU1"),
      WakeUpConfig("IEX1" -> "LDU0"),
      WakeUpConfig("IEX1" -> "LDU1"),
      WakeUpConfig("IEX0" -> "STA0"),
      WakeUpConfig("IEX0" -> "STA1"),
      WakeUpConfig("IEX1" -> "STA0"),
      WakeUpConfig("IEX1" -> "STA1"),
423 424 425 426 427
      WakeUpConfig("IMISC0" -> "FEX0"),
      WakeUpConfig("IMISC0" -> "FEX1"),
      WakeUpConfig("IMISC0" -> "FEX2"),
      WakeUpConfig("IMISC0" -> "FEX3"),
      WakeUpConfig("IMISC0" -> "FEX4"),
428 429 430 431
      WakeUpConfig("FEX3" -> "FEX0"),
      WakeUpConfig("FEX3" -> "FEX1"),
      WakeUpConfig("FEX3" -> "FEX2"),
      WakeUpConfig("FEX3" -> "FEX3"),
X
Xuan Hu 已提交
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
    )
  }

  def backendParams: BackendParams = backend.BackendParams(
    Map(
      IntScheduler() -> intSchdParams,
      VfScheduler() -> vfSchdParams,
      MemScheduler() -> memSchdParams,
    ),
    Seq(
      intPreg,
      vfPreg,
    ),
    iqWakeUpParams,
  )
447 448 449 450 451 452
}

case object DebugOptionsKey extends Field[DebugOptions]

case class DebugOptions
(
453 454
  FPGAPlatform: Boolean = false,
  EnableDifftest: Boolean = false,
455
  AlwaysBasicDiff: Boolean = true,
456
  EnableDebug: Boolean = false,
457
  EnablePerfDebug: Boolean = true,
458
  UseDRAMSim: Boolean = false,
Maxpicca's avatar
Maxpicca 已提交
459
  EnableConstantin: Boolean = false,
460
  EnableTopDown: Boolean = false
461 462 463 464 465 466
)

trait HasXSParameter {

  implicit val p: Parameters

467 468
  val PAddrBits = p(SoCParamsKey).PAddrBits // PAddrBits is Phyical Memory addr bits

469 470 471 472
  val coreParams = p(XSCoreParamsKey)
  val env = p(DebugOptionsKey)

  val XLEN = coreParams.XLEN
473
  val VLEN = coreParams.VLEN
F
fdy 已提交
474
  val ELEN = coreParams.ELEN
475 476 477 478 479 480 481 482 483 484 485
  val minFLen = 32
  val fLen = 64
  def xLen = XLEN

  val HasMExtension = coreParams.HasMExtension
  val HasCExtension = coreParams.HasCExtension
  val HasDiv = coreParams.HasDiv
  val HasIcache = coreParams.HasICache
  val HasDcache = coreParams.HasDCache
  val AddrBits = coreParams.AddrBits // AddrBits is used in some cases
  val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits
486
  val AsidLength = coreParams.AsidLength
487
  val ReSelectLen = coreParams.ReSelectLen
488 489 490 491
  val AddrBytes = AddrBits / 8 // unused
  val DataBits = XLEN
  val DataBytes = DataBits / 8
  val HasFPU = coreParams.HasFPU
Z
Ziyue Zhang 已提交
492
  val HasVPU = coreParams.HasVPU
Z
zhanglinjuan 已提交
493
  val HasCustomCSRCacheOp = coreParams.HasCustomCSRCacheOp
494 495 496 497 498 499 500 501 502 503
  val FetchWidth = coreParams.FetchWidth
  val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1)
  val EnableBPU = coreParams.EnableBPU
  val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3
  val EnableRAS = coreParams.EnableRAS
  val EnableLB = coreParams.EnableLB
  val EnableLoop = coreParams.EnableLoop
  val EnableSC = coreParams.EnableSC
  val EnbaleTlbDebug = coreParams.EnbaleTlbDebug
  val HistoryLength = coreParams.HistoryLength
504
  val EnableGHistDiff = coreParams.EnableGHistDiff
505
  val EnableCommitGHistDiff = coreParams.EnableCommitGHistDiff
506
  val UbtbGHRLength = coreParams.UbtbGHRLength
507
  val UbtbSize = coreParams.UbtbSize
508
  val EnableFauFTB = coreParams.EnableFauFTB
509 510
  val FtbSize = coreParams.FtbSize
  val FtbWays = coreParams.FtbWays
511
  val RasSize = coreParams.RasSize
Z
zoujr 已提交
512

513 514
  def getBPDComponents(resp_in: BranchPredictionResp, p: Parameters) = {
    coreParams.branchPredictor(resp_in, p)
Z
zoujr 已提交
515
  }
516 517
  val numBr = coreParams.numBr
  val TageTableInfos = coreParams.TageTableInfos
L
Lingrui98 已提交
518
  val TageBanks = coreParams.numBr
519 520
  val SCNRows = coreParams.SCNRows
  val SCCtrBits = coreParams.SCCtrBits
L
Lingrui98 已提交
521 522
  val SCHistLens = coreParams.SCHistLens
  val SCNTables = coreParams.SCNTables
523

L
Lingrui98 已提交
524 525
  val SCTableInfos = Seq.fill(SCNTables)((SCNRows, SCCtrBits)) zip SCHistLens map {
    case ((n, cb), h) => (n, cb, h)
526 527 528 529
  }
  val ITTageTableInfos = coreParams.ITTageTableInfos
  type FoldedHistoryInfo = Tuple2[Int, Int]
  val foldedGHistInfos =
530
    (TageTableInfos.map{ case (nRows, h, t) =>
531
      if (h > 0)
532
        Set((h, min(log2Ceil(nRows/numBr), h)), (h, min(h, t)), (h, min(h, t-1)))
533 534
      else
        Set[FoldedHistoryInfo]()
535
    }.reduce(_++_).toSet ++
L
Lingrui98 已提交
536
    SCTableInfos.map{ case (nRows, _, h) =>
537
      if (h > 0)
L
Lingrui98 已提交
538
        Set((h, min(log2Ceil(nRows/TageBanks), h)))
539 540
      else
        Set[FoldedHistoryInfo]()
L
Lingrui98 已提交
541
    }.reduce(_++_).toSet ++
542 543 544 545 546
    ITTageTableInfos.map{ case (nRows, h, t) =>
      if (h > 0)
        Set((h, min(log2Ceil(nRows), h)), (h, min(h, t)), (h, min(h, t-1)))
      else
        Set[FoldedHistoryInfo]()
547 548 549
    }.reduce(_++_) ++
      Set[FoldedHistoryInfo]((UbtbGHRLength, log2Ceil(UbtbSize)))
    ).toList
550

551

Z
zoujr 已提交
552

553 554 555 556 557 558 559
  val CacheLineSize = coreParams.CacheLineSize
  val CacheLineHalfWord = CacheLineSize / 16
  val ExtHistoryLength = HistoryLength + 64
  val IBufSize = coreParams.IBufSize
  val DecodeWidth = coreParams.DecodeWidth
  val RenameWidth = coreParams.RenameWidth
  val CommitWidth = coreParams.CommitWidth
F
fdy 已提交
560
  val MaxUopSize = coreParams.MaxUopSize
561 562
  val FtqSize = coreParams.FtqSize
  val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp
F
fdy 已提交
563 564 565
  val IntLogicRegs = coreParams.IntLogicRegs
  val FpLogicRegs = coreParams.FpLogicRegs
  val VecLogicRegs = coreParams.VecLogicRegs
X
Xuan Hu 已提交
566
  val VCONFIG_IDX = coreParams.VCONFIG_IDX
567 568
  val NRPhyRegs = coreParams.NRPhyRegs
  val PhyRegIdxWidth = log2Up(NRPhyRegs)
X
Xuan Hu 已提交
569 570 571 572
  val IntPhyRegs = coreParams.IntPhyRegs
  val VfPhyRegs = coreParams.VfPhyRegs
  val IntPregIdxWidth = log2Up(IntPhyRegs)
  val VfPregIdxWidth = log2Up(VfPhyRegs)
Y
Yinan Xu 已提交
573
  val RobSize = coreParams.RobSize
F
fdy 已提交
574
  val RabSize = coreParams.RabSize
575
  val IntRefCounterWidth = log2Ceil(RobSize)
576 577 578 579 580 581
  val VirtualLoadQueueSize = coreParams.VirtualLoadQueueSize
  val LoadQueueRARSize = coreParams.LoadQueueRARSize
  val LoadQueueRAWSize = coreParams.LoadQueueRAWSize
  val RollbackGroupSize = coreParams.RollbackGroupSize
  val LoadQueueReplaySize = coreParams.LoadQueueReplaySize
  val LoadUncacheBufferSize = coreParams.LoadUncacheBufferSize
582
  val LoadQueueNWriteBanks = coreParams.LoadQueueNWriteBanks
583
  val StoreQueueSize = coreParams.StoreQueueSize
584
  val StoreQueueNWriteBanks = coreParams.StoreQueueNWriteBanks
585
  val StoreQueueForwardWithMask = coreParams.StoreQueueForwardWithMask
W
William Wang 已提交
586
  val VlsQueueSize = coreParams.VlsQueueSize
587
  val dpParams = coreParams.dpParams
X
Xuan Hu 已提交
588 589

  def backendParams: BackendParams = coreParams.backendParams
590 591
  def MemIQSizeMax = backendParams.memSchdParams.get.issueBlockParams.map(_.numEntries).max
  def IQSizeMax = backendParams.allSchdParams.map(_.issueBlockParams.map(_.numEntries).max).max
592 593
  val LoadPipelineWidth = coreParams.LoadPipelineWidth
  val StorePipelineWidth = coreParams.StorePipelineWidth
W
William Wang 已提交
594 595 596
  val VecMemSrcInWidth = coreParams.VecMemSrcInWidth
  val VecMemInstWbWidth = coreParams.VecMemInstWbWidth
  val VecMemDispatchWidth = coreParams.VecMemDispatchWidth
597
  val StoreBufferSize = coreParams.StoreBufferSize
598
  val StoreBufferThreshold = coreParams.StoreBufferThreshold
599
  val EnsbufferWidth = coreParams.EnsbufferWidth
600
  val UncacheBufferSize = coreParams.UncacheBufferSize
601
  val EnableLoadToLoadForward = coreParams.EnableLoadToLoadForward
602
  val EnableFastForward = coreParams.EnableFastForward
W
William Wang 已提交
603
  val EnableLdVioCheckAfterReset = coreParams.EnableLdVioCheckAfterReset
604 605
  val EnableSoftPrefetchAfterReset = coreParams.EnableSoftPrefetchAfterReset
  val EnableCacheErrorAfterReset = coreParams.EnableCacheErrorAfterReset
606
  val EnableDCacheWPU = coreParams.EnableDCacheWPU
607
  val EnableAccurateLoadError = coreParams.EnableAccurateLoadError
608
  val EnableUncacheWriteOutstanding = coreParams.EnableUncacheWriteOutstanding
609
  val asidLen = coreParams.MMUAsidLen
610
  val BTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth
611
  val refillBothTlb = coreParams.refillBothTlb
612 613 614
  val itlbParams = coreParams.itlbParameters
  val ldtlbParams = coreParams.ldtlbParameters
  val sttlbParams = coreParams.sttlbParameters
615
  val pftlbParams = coreParams.pftlbParameters
616
  val btlbParams = coreParams.btlbParameters
617
  val l2tlbParams = coreParams.l2tlbParameters
618 619 620 621 622
  val NumPerfCounters = coreParams.NumPerfCounters

  val instBytes = if (HasCExtension) 2 else 4
  val instOffsetBits = log2Ceil(instBytes)

623
  val icacheParameters = coreParams.icacheParameters
J
Jiawei Lin 已提交
624
  val dcacheParameters = coreParams.dcacheParametersOpt.getOrElse(DCacheParameters())
625

626
  // dcache block cacheline when lr for LRSCCycles - LRSCBackOff cycles
627
  // for constrained LR/SC loop
628 629 630
  val LRSCCycles = 64
  // for lr storm
  val LRSCBackOff = 8
631 632 633 634

  // cache hierarchy configurations
  val l1BusDataWidth = 256

635 636 637 638 639 640 641 642 643 644 645 646 647
  // load violation predict
  val ResetTimeMax2Pow = 20 //1078576
  val ResetTimeMin2Pow = 10 //1024
  // wait table parameters
  val WaitTableSize = 1024
  val MemPredPCWidth = log2Up(WaitTableSize)
  val LWTUse2BitCounter = true
  // store set parameters
  val SSITSize = WaitTableSize
  val LFSTSize = 32
  val SSIDWidth = log2Up(LFSTSize)
  val LFSTWidth = 4
  val StoreSetEnable = true // LWT will be disabled if SS is enabled
648 649
  val LFSTEnable = false

650 651 652 653 654 655 656 657
  val PCntIncrStep: Int = 6
  val numPCntHc: Int = 25
  val numPCntPtw: Int = 19

  val numCSRPCntFrontend = 8
  val numCSRPCntCtrl     = 8
  val numCSRPCntLsu      = 8
  val numCSRPCntHc       = 5
658 659 660

  // source stages of cancel signal to issue queues
  val cancelStages = Seq("IS", "OG0", "OG1")
661
}