1/*************************************************************************************** 2* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3* Copyright (c) 2020-2021 Peng Cheng Laboratory 4* 5* XiangShan is licensed under Mulan PSL v2. 6* You can use this software according to the terms and conditions of the Mulan PSL v2. 7* You may obtain a copy of Mulan PSL v2 at: 8* http://license.coscl.org.cn/MulanPSL2 9* 10* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13* 14* See the Mulan PSL v2 for more details. 15***************************************************************************************/ 16 17package xiangshan 18 19import org.chipsalliance.cde.config.{Field, Parameters} 20import chisel3._ 21import chisel3.util._ 22import huancun._ 23import system.SoCParamsKey 24import xiangshan.backend.datapath.RdConfig._ 25import xiangshan.backend.datapath.WbConfig._ 26import xiangshan.backend.dispatch.DispatchParameters 27import xiangshan.backend.exu.ExeUnitParams 28import xiangshan.backend.fu.FuConfig._ 29import xiangshan.backend.issue.{IntScheduler, IssueBlockParams, MemScheduler, SchdBlockParams, SchedulerType, VfScheduler} 30import xiangshan.backend.regfile.{IntPregParams, PregParams, VfPregParams} 31import xiangshan.backend.BackendParams 32import xiangshan.cache.DCacheParameters 33import xiangshan.cache.prefetch._ 34import xiangshan.frontend.{BasePredictor, BranchPredictionResp, FTB, FakePredictor, RAS, Tage, ITTage, Tage_SC, FauFTB} 35import xiangshan.frontend.icache.ICacheParameters 36import xiangshan.cache.mmu.{L2TLBParameters, TLBParameters} 37import xiangshan.frontend._ 38import xiangshan.frontend.icache.ICacheParameters 39 40import freechips.rocketchip.diplomacy.AddressSet 41import system.SoCParamsKey 42import huancun._ 43import huancun.debug._ 44import xiangshan.cache.wpu.WPUParameters 45import coupledL2._ 46import xiangshan.backend.datapath.WakeUpConfig 47import xiangshan.mem.prefetch.{PrefetcherParams, SMSParams} 48 49import scala.math.min 50 51case object XSTileKey extends Field[Seq[XSCoreParameters]] 52 53case object XSCoreParamsKey extends Field[XSCoreParameters] 54 55case class XSCoreParameters 56( 57 HasPrefetch: Boolean = false, 58 HartId: Int = 0, 59 XLEN: Int = 64, 60 VLEN: Int = 128, 61 ELEN: Int = 64, 62 HasMExtension: Boolean = true, 63 HasCExtension: Boolean = true, 64 HasDiv: Boolean = true, 65 HasICache: Boolean = true, 66 HasDCache: Boolean = true, 67 AddrBits: Int = 64, 68 VAddrBits: Int = 39, 69 HasFPU: Boolean = true, 70 HasVPU: Boolean = true, 71 HasCustomCSRCacheOp: Boolean = true, 72 FetchWidth: Int = 8, 73 AsidLength: Int = 16, 74 EnableBPU: Boolean = true, 75 EnableBPD: Boolean = true, 76 EnableRAS: Boolean = true, 77 EnableLB: Boolean = false, 78 EnableLoop: Boolean = true, 79 EnableSC: Boolean = true, 80 EnbaleTlbDebug: Boolean = false, 81 EnableJal: Boolean = false, 82 EnableFauFTB: Boolean = true, 83 UbtbGHRLength: Int = 4, 84 // HistoryLength: Int = 512, 85 EnableGHistDiff: Boolean = true, 86 EnableCommitGHistDiff: Boolean = true, 87 UbtbSize: Int = 256, 88 FtbSize: Int = 2048, 89 RasSize: Int = 32, 90 RasSpecSize: Int = 64, 91 RasCtrSize: Int = 8, 92 CacheLineSize: Int = 512, 93 FtbWays: Int = 4, 94 TageTableInfos: Seq[Tuple3[Int,Int,Int]] = 95 // Sets Hist Tag 96 // Seq(( 2048, 2, 8), 97 // ( 2048, 9, 8), 98 // ( 2048, 13, 8), 99 // ( 2048, 20, 8), 100 // ( 2048, 26, 8), 101 // ( 2048, 44, 8), 102 // ( 2048, 73, 8), 103 // ( 2048, 256, 8)), 104 Seq(( 4096, 8, 8), 105 ( 4096, 13, 8), 106 ( 4096, 32, 8), 107 ( 4096, 119, 8)), 108 ITTageTableInfos: Seq[Tuple3[Int,Int,Int]] = 109 // Sets Hist Tag 110 Seq(( 256, 4, 9), 111 ( 256, 8, 9), 112 ( 512, 13, 9), 113 ( 512, 16, 9), 114 ( 512, 32, 9)), 115 SCNRows: Int = 512, 116 SCNTables: Int = 4, 117 SCCtrBits: Int = 6, 118 SCHistLens: Seq[Int] = Seq(0, 4, 10, 16), 119 numBr: Int = 2, 120 branchPredictor: Function2[BranchPredictionResp, Parameters, Tuple2[Seq[BasePredictor], BranchPredictionResp]] = 121 ((resp_in: BranchPredictionResp, p: Parameters) => { 122 val ftb = Module(new FTB()(p)) 123 val ubtb =Module(new FauFTB()(p)) 124 // val bim = Module(new BIM()(p)) 125 val tage = Module(new Tage_SC()(p)) 126 val ras = Module(new RAS()(p)) 127 val ittage = Module(new ITTage()(p)) 128 val preds = Seq(ubtb, tage, ftb, ittage, ras) 129 preds.map(_.io := DontCare) 130 131 // ubtb.io.resp_in(0) := resp_in 132 // bim.io.resp_in(0) := ubtb.io.resp 133 // btb.io.resp_in(0) := bim.io.resp 134 // tage.io.resp_in(0) := btb.io.resp 135 // loop.io.resp_in(0) := tage.io.resp 136 ubtb.io.in.bits.resp_in(0) := resp_in 137 tage.io.in.bits.resp_in(0) := ubtb.io.out 138 ftb.io.in.bits.resp_in(0) := tage.io.out 139 ittage.io.in.bits.resp_in(0) := ftb.io.out 140 ras.io.in.bits.resp_in(0) := ittage.io.out 141 142 (preds, ras.io.out) 143 }), 144 IBufSize: Int = 48, 145 DecodeWidth: Int = 6, 146 RenameWidth: Int = 6, 147 CommitWidth: Int = 6, 148 MaxUopSize: Int = 65, 149 EnableRenameSnapshot: Boolean = true, 150 RenameSnapshotNum: Int = 4, 151 FtqSize: Int = 64, 152 EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false 153 IntLogicRegs: Int = 32, 154 FpLogicRegs: Int = 33, 155 VecLogicRegs: Int = 32 + 1 + 15, // 15: tmp, 1: vconfig 156 VCONFIG_IDX: Int = 32, 157 NRPhyRegs: Int = 192, 158 VirtualLoadQueueSize: Int = 80, 159 LoadQueueRARSize: Int = 80, 160 LoadQueueRAWSize: Int = 64, // NOTE: make sure that LoadQueueRAWSize is power of 2. 161 RollbackGroupSize: Int = 8, 162 LoadQueueReplaySize: Int = 72, 163 LoadUncacheBufferSize: Int = 20, 164 LoadQueueNWriteBanks: Int = 8, // NOTE: make sure that LoadQueueRARSize/LoadQueueRAWSize is divided by LoadQueueNWriteBanks 165 StoreQueueSize: Int = 64, 166 StoreQueueNWriteBanks: Int = 8, // NOTE: make sure that StoreQueueSize is divided by StoreQueueNWriteBanks 167 StoreQueueForwardWithMask: Boolean = true, 168 VlsQueueSize: Int = 8, 169 RobSize: Int = 256, 170 RabSize: Int = 256, 171 IssueQueueSize: Int = 32, 172 dpParams: DispatchParameters = DispatchParameters( 173 IntDqSize = 16, 174 FpDqSize = 16, 175 LsDqSize = 18, 176 IntDqDeqWidth = 6, 177 FpDqDeqWidth = 6, 178 LsDqDeqWidth = 6, 179 ), 180 intPreg: PregParams = IntPregParams( 181 numEntries = 224, 182 numRead = None, 183 numWrite = None, 184 ), 185 vfPreg: VfPregParams = VfPregParams( 186 numEntries = 192, 187 numRead = None, 188 numWrite = None, 189 ), 190 prefetcher: Option[PrefetcherParams] = Some(SMSParams()), 191 LoadPipelineWidth: Int = 2, 192 StorePipelineWidth: Int = 2, 193 VecMemSrcInWidth: Int = 2, 194 VecMemInstWbWidth: Int = 1, 195 VecMemDispatchWidth: Int = 1, 196 StoreBufferSize: Int = 16, 197 StoreBufferThreshold: Int = 7, 198 EnsbufferWidth: Int = 2, 199 UncacheBufferSize: Int = 4, 200 EnableLoadToLoadForward: Boolean = true, 201 EnableFastForward: Boolean = true, 202 EnableLdVioCheckAfterReset: Boolean = true, 203 EnableSoftPrefetchAfterReset: Boolean = true, 204 EnableCacheErrorAfterReset: Boolean = true, 205 EnableAccurateLoadError: Boolean = true, 206 EnableUncacheWriteOutstanding: Boolean = false, 207 EnableStorePrefetchAtIssue: Boolean = false, 208 EnableStorePrefetchAtCommit: Boolean = false, 209 EnableAtCommitMissTrigger: Boolean = true, 210 EnableStorePrefetchSMS: Boolean = false, 211 EnableStorePrefetchSPB: Boolean = false, 212 MMUAsidLen: Int = 16, // max is 16, 0 is not supported now 213 ReSelectLen: Int = 7, // load replay queue replay select counter len 214 iwpuParameters: WPUParameters = WPUParameters( 215 enWPU = false, 216 algoName = "mmru", 217 isICache = true, 218 ), 219 dwpuParameters: WPUParameters = WPUParameters( 220 enWPU = false, 221 algoName = "mmru", 222 enCfPred = false, 223 isICache = false, 224 ), 225 itlbParameters: TLBParameters = TLBParameters( 226 name = "itlb", 227 fetchi = true, 228 useDmode = false, 229 NWays = 48, 230 ), 231 itlbPortNum: Int = 2 + ICacheParameters().prefetchPipeNum + 1, 232 ipmpPortNum: Int = 2 + ICacheParameters().prefetchPipeNum + 1, 233 ldtlbParameters: TLBParameters = TLBParameters( 234 name = "ldtlb", 235 NWays = 48, 236 outReplace = false, 237 partialStaticPMP = true, 238 outsideRecvFlush = true, 239 saveLevel = true 240 ), 241 sttlbParameters: TLBParameters = TLBParameters( 242 name = "sttlb", 243 NWays = 48, 244 outReplace = false, 245 partialStaticPMP = true, 246 outsideRecvFlush = true, 247 saveLevel = true 248 ), 249 pftlbParameters: TLBParameters = TLBParameters( 250 name = "pftlb", 251 NWays = 48, 252 outReplace = false, 253 partialStaticPMP = true, 254 outsideRecvFlush = true, 255 saveLevel = true 256 ), 257 refillBothTlb: Boolean = false, 258 btlbParameters: TLBParameters = TLBParameters( 259 name = "btlb", 260 NWays = 48, 261 ), 262 l2tlbParameters: L2TLBParameters = L2TLBParameters(), 263 NumPerfCounters: Int = 16, 264 icacheParameters: ICacheParameters = ICacheParameters( 265 tagECC = Some("parity"), 266 dataECC = Some("parity"), 267 replacer = Some("setplru"), 268 nMissEntries = 2, 269 nProbeEntries = 2, 270 nPrefetchEntries = 12, 271 nPrefBufferEntries = 32, 272 ), 273 dcacheParametersOpt: Option[DCacheParameters] = Some(DCacheParameters( 274 tagECC = Some("secded"), 275 dataECC = Some("secded"), 276 replacer = Some("setplru"), 277 nMissEntries = 16, 278 nProbeEntries = 8, 279 nReleaseEntries = 18, 280 nMaxPrefetchEntry = 6, 281 )), 282 L2CacheParamsOpt: Option[L2Param] = Some(L2Param( 283 name = "l2", 284 ways = 8, 285 sets = 1024, // default 512KB L2 286 prefetch = Some(coupledL2.prefetch.PrefetchReceiverParams()) 287 )), 288 L2NBanks: Int = 1, 289 usePTWRepeater: Boolean = false, 290 softTLB: Boolean = false, // dpi-c l1tlb debug only 291 softPTW: Boolean = false, // dpi-c l2tlb debug only 292 softPTWDelay: Int = 1 293){ 294 def vlWidth = log2Up(VLEN) + 1 295 296 val allHistLens = SCHistLens ++ ITTageTableInfos.map(_._2) ++ TageTableInfos.map(_._2) :+ UbtbGHRLength 297 val HistoryLength = allHistLens.max + numBr * FtqSize + 9 // 256 for the predictor configs now 298 299 val intSchdParams = { 300 implicit val schdType: SchedulerType = IntScheduler() 301 SchdBlockParams(Seq( 302 IssueBlockParams(Seq( 303 ExeUnitParams("ALU0", Seq(AluCfg), Seq(IntWB(port = 0, 0)), Seq(Seq(IntRD(0, 0)), Seq(IntRD(1, 0)))), 304 ExeUnitParams("ALU1", Seq(AluCfg), Seq(IntWB(port = 1, 0)), Seq(Seq(IntRD(2, 0)), Seq(IntRD(3, 0)))), 305 ), numEntries = IssueQueueSize, numEnq = 2), 306 IssueBlockParams(Seq( 307 ExeUnitParams("MUL0", Seq(AluCfg, MulCfg, BkuCfg), Seq(IntWB(port = 2, 0)), Seq(Seq(IntRD(4, 0)), Seq(IntRD(5, 0)))), 308 ExeUnitParams("MUL1", Seq(AluCfg, MulCfg, BkuCfg), Seq(IntWB(port = 3, 0)), Seq(Seq(IntRD(6, 0)), Seq(IntRD(7, 0)))), 309 ), numEntries = IssueQueueSize, numEnq = 2), 310 IssueBlockParams(Seq( 311 ExeUnitParams("BJU0", Seq(BrhCfg), Seq(), Seq(Seq(IntRD(8, 0)), Seq(IntRD(9, 0)))), 312 ExeUnitParams("BJU1", Seq(BrhCfg), Seq(), Seq(Seq(IntRD(10, 0)), Seq(IntRD(12, 1)))), 313 ), numEntries = IssueQueueSize, numEnq = 2), 314 IssueBlockParams(Seq( 315 ExeUnitParams("BJU2", Seq(BrhCfg), Seq(), Seq(Seq(IntRD(11, 0)), Seq(IntRD(7, 1)))), 316 ), numEntries = IssueQueueSize / 2, numEnq = 1), 317 IssueBlockParams(Seq( 318 ExeUnitParams("IMISC0", Seq(VSetRiWiCfg, I2fCfg, I2vCfg, VSetRiWvfCfg, JmpCfg, CsrCfg, FenceCfg), Seq(IntWB(port = 5, 0), VfWB(2, 0)), Seq(Seq(IntRD(5, 1)), Seq(IntRD(3, 1)))), 319 ExeUnitParams("IDIV0", Seq(DivCfg), Seq(IntWB(port = 7, 1)), Seq(Seq(IntRD(1, Int.MaxValue)), Seq(IntRD(9, Int.MaxValue)))), 320 ), numEntries = IssueQueueSize, numEnq = 2), 321 ), 322 numPregs = intPreg.numEntries, 323 numDeqOutside = 0, 324 schdType = schdType, 325 rfDataWidth = intPreg.dataCfg.dataWidth, 326 numUopIn = dpParams.IntDqDeqWidth, 327 ) 328 } 329 val vfSchdParams = { 330 implicit val schdType: SchedulerType = VfScheduler() 331 SchdBlockParams(Seq( 332 IssueBlockParams(Seq( 333 ExeUnitParams("VFEX0", Seq(VfaluCfg, VfmaCfg, VialuCfg, VppuCfg, F2fCfg, F2iCfg, VSetRvfWvfCfg), Seq(VfWB(port = 0, 0), IntWB(port = 4, 0)), Seq(Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)), Seq(VfRD(5, 0)))), 334 ExeUnitParams("VFEX1", Seq(VfaluCfg, VfmaCfg, VimacCfg, VipuCfg, VfcvtCfg), Seq(VfWB(port = 1, 0), IntWB(port = 8, 0)), Seq(Seq(VfRD(7, 0)), Seq(VfRD(8, 0)), Seq(VfRD(9, 0)), Seq(VfRD(10, 0)), Seq(VfRD(11, 0)))), 335 ), numEntries = IssueQueueSize, numEnq = 2), 336 IssueBlockParams(Seq( 337 ExeUnitParams("VFEX2", Seq(VfdivCfg), Seq(VfWB(port = 5, 1)), Seq(Seq(VfRD(7, 0)), Seq(VfRD(8, 0)), Seq(VfRD(9, 0)), Seq(VfRD(10, 0)), Seq(VfRD(11, 0)))), 338 ), numEntries = IssueQueueSize, numEnq = 2), 339 ), 340 numPregs = vfPreg.numEntries, 341 numDeqOutside = 0, 342 schdType = schdType, 343 rfDataWidth = vfPreg.dataCfg.dataWidth, 344 numUopIn = dpParams.FpDqDeqWidth, 345 ) 346 } 347 348 val memSchdParams = { 349 implicit val schdType: SchedulerType = MemScheduler() 350 val rfDataWidth = 64 351 352 SchdBlockParams(Seq( 353 IssueBlockParams(Seq( 354 ExeUnitParams("LDU0", Seq(LduCfg), Seq(IntWB(6, 0), VfWB(3, 0)), Seq(Seq(IntRD(12, 0)))), 355 ExeUnitParams("LDU1", Seq(LduCfg), Seq(IntWB(7, 0), VfWB(4, 0)), Seq(Seq(IntRD(13, 0)))), 356 ), numEntries = IssueQueueSize, numEnq = 2), 357 IssueBlockParams(Seq( 358 ExeUnitParams("STA0", Seq(StaCfg, MouCfg), Seq(IntWB(9, 0)), Seq(Seq(IntRD(3, 1)))), 359 ExeUnitParams("STA1", Seq(StaCfg, MouCfg), Seq(IntWB(10, 0)), Seq(Seq(IntRD(1, 1)))), 360 ), numEntries = IssueQueueSize, numEnq = 2), 361 IssueBlockParams(Seq( 362 ExeUnitParams("STD0", Seq(StdCfg, MoudCfg), Seq(), Seq(Seq(IntRD(13, 1), VfRD(12, Int.MaxValue)))), 363 ExeUnitParams("STD1", Seq(StdCfg, MoudCfg), Seq(), Seq(Seq(IntRD(5, 1), VfRD(10, Int.MaxValue)))), 364 ), numEntries = IssueQueueSize, numEnq = 2), 365 IssueBlockParams(Seq( 366 ExeUnitParams("VLDU0", Seq(VlduCfg), Seq(VfWB(3, 1)), Seq(Seq(VfRD(0, 0)), Seq(VfRD(1, 0)), Seq(VfRD(2, 0)), Seq(VfRD(3, 0)), Seq(VfRD(4, 0)))), 367 ExeUnitParams("VLDU1", Seq(VlduCfg), Seq(VfWB(4, 1)), Seq(Seq(VfRD(5, 0)), Seq(VfRD(6, 0)), Seq(VfRD(7, 0)), Seq(VfRD(8, 0)), Seq(VfRD(9, 0)))), 368 ), numEntries = IssueQueueSize, numEnq = 2), 369 ), 370 numPregs = intPreg.numEntries max vfPreg.numEntries, 371 numDeqOutside = 0, 372 schdType = schdType, 373 rfDataWidth = rfDataWidth, 374 numUopIn = dpParams.LsDqDeqWidth, 375 ) 376 } 377 378 def PregIdxWidthMax = intPreg.addrWidth max vfPreg.addrWidth 379 380 def iqWakeUpParams = { 381 Seq( 382 WakeUpConfig( 383 Seq("ALU0", "ALU1", "MUL0", "MUL1", "BJU0", "LDU0", "LDU1") -> 384 Seq("ALU0", "ALU1", "MUL0", "MUL1", "BJU0", "BJU1", "BJU2", "LDU0", "LDU1", "STA0", "STA1", "STD0", "STD1") 385 ), 386 WakeUpConfig(Seq("IMISC0") -> Seq("VFEX0")), 387 ).flatten 388 } 389 390 def backendParams: BackendParams = backend.BackendParams( 391 Map( 392 IntScheduler() -> intSchdParams, 393 VfScheduler() -> vfSchdParams, 394 MemScheduler() -> memSchdParams, 395 ), 396 Seq( 397 intPreg, 398 vfPreg, 399 ), 400 iqWakeUpParams, 401 ) 402} 403 404case object DebugOptionsKey extends Field[DebugOptions] 405 406case class DebugOptions 407( 408 FPGAPlatform: Boolean = false, 409 EnableDifftest: Boolean = false, 410 AlwaysBasicDiff: Boolean = true, 411 EnableDebug: Boolean = false, 412 EnablePerfDebug: Boolean = true, 413 UseDRAMSim: Boolean = false, 414 EnableConstantin: Boolean = false, 415 EnableChiselDB: Boolean = false, 416 AlwaysBasicDB: Boolean = true, 417 EnableTopDown: Boolean = false, 418 EnableRollingDB: Boolean = false 419) 420 421trait HasXSParameter { 422 423 implicit val p: Parameters 424 425 val PAddrBits = p(SoCParamsKey).PAddrBits // PAddrBits is Phyical Memory addr bits 426 427 val coreParams = p(XSCoreParamsKey) 428 val env = p(DebugOptionsKey) 429 430 val XLEN = coreParams.XLEN 431 val VLEN = coreParams.VLEN 432 val ELEN = coreParams.ELEN 433 val minFLen = 32 434 val fLen = 64 435 def xLen = XLEN 436 437 val HasMExtension = coreParams.HasMExtension 438 val HasCExtension = coreParams.HasCExtension 439 val HasDiv = coreParams.HasDiv 440 val HasIcache = coreParams.HasICache 441 val HasDcache = coreParams.HasDCache 442 val AddrBits = coreParams.AddrBits // AddrBits is used in some cases 443 val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits 444 val AsidLength = coreParams.AsidLength 445 val ReSelectLen = coreParams.ReSelectLen 446 val AddrBytes = AddrBits / 8 // unused 447 val DataBits = XLEN 448 val DataBytes = DataBits / 8 449 val VDataBytes = VLEN / 8 450 val HasFPU = coreParams.HasFPU 451 val HasVPU = coreParams.HasVPU 452 val HasCustomCSRCacheOp = coreParams.HasCustomCSRCacheOp 453 val FetchWidth = coreParams.FetchWidth 454 val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1) 455 val EnableBPU = coreParams.EnableBPU 456 val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3 457 val EnableRAS = coreParams.EnableRAS 458 val EnableLB = coreParams.EnableLB 459 val EnableLoop = coreParams.EnableLoop 460 val EnableSC = coreParams.EnableSC 461 val EnbaleTlbDebug = coreParams.EnbaleTlbDebug 462 val HistoryLength = coreParams.HistoryLength 463 val EnableGHistDiff = coreParams.EnableGHistDiff 464 val EnableCommitGHistDiff = coreParams.EnableCommitGHistDiff 465 val UbtbGHRLength = coreParams.UbtbGHRLength 466 val UbtbSize = coreParams.UbtbSize 467 val EnableFauFTB = coreParams.EnableFauFTB 468 val FtbSize = coreParams.FtbSize 469 val FtbWays = coreParams.FtbWays 470 val RasSize = coreParams.RasSize 471 val RasSpecSize = coreParams.RasSpecSize 472 val RasCtrSize = coreParams.RasCtrSize 473 474 def getBPDComponents(resp_in: BranchPredictionResp, p: Parameters) = { 475 coreParams.branchPredictor(resp_in, p) 476 } 477 val numBr = coreParams.numBr 478 val TageTableInfos = coreParams.TageTableInfos 479 val TageBanks = coreParams.numBr 480 val SCNRows = coreParams.SCNRows 481 val SCCtrBits = coreParams.SCCtrBits 482 val SCHistLens = coreParams.SCHistLens 483 val SCNTables = coreParams.SCNTables 484 485 val SCTableInfos = Seq.fill(SCNTables)((SCNRows, SCCtrBits)) zip SCHistLens map { 486 case ((n, cb), h) => (n, cb, h) 487 } 488 val ITTageTableInfos = coreParams.ITTageTableInfos 489 type FoldedHistoryInfo = Tuple2[Int, Int] 490 val foldedGHistInfos = 491 (TageTableInfos.map{ case (nRows, h, t) => 492 if (h > 0) 493 Set((h, min(log2Ceil(nRows/numBr), h)), (h, min(h, t)), (h, min(h, t-1))) 494 else 495 Set[FoldedHistoryInfo]() 496 }.reduce(_++_).toSet ++ 497 SCTableInfos.map{ case (nRows, _, h) => 498 if (h > 0) 499 Set((h, min(log2Ceil(nRows/TageBanks), h))) 500 else 501 Set[FoldedHistoryInfo]() 502 }.reduce(_++_).toSet ++ 503 ITTageTableInfos.map{ case (nRows, h, t) => 504 if (h > 0) 505 Set((h, min(log2Ceil(nRows), h)), (h, min(h, t)), (h, min(h, t-1))) 506 else 507 Set[FoldedHistoryInfo]() 508 }.reduce(_++_) ++ 509 Set[FoldedHistoryInfo]((UbtbGHRLength, log2Ceil(UbtbSize))) 510 ).toList 511 512 513 514 val CacheLineSize = coreParams.CacheLineSize 515 val CacheLineHalfWord = CacheLineSize / 16 516 val ExtHistoryLength = HistoryLength + 64 517 val IBufSize = coreParams.IBufSize 518 val DecodeWidth = coreParams.DecodeWidth 519 val RenameWidth = coreParams.RenameWidth 520 val CommitWidth = coreParams.CommitWidth 521 val MaxUopSize = coreParams.MaxUopSize 522 val EnableRenameSnapshot = coreParams.EnableRenameSnapshot 523 val RenameSnapshotNum = coreParams.RenameSnapshotNum 524 val FtqSize = coreParams.FtqSize 525 val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp 526 val IntLogicRegs = coreParams.IntLogicRegs 527 val FpLogicRegs = coreParams.FpLogicRegs 528 val VecLogicRegs = coreParams.VecLogicRegs 529 val VCONFIG_IDX = coreParams.VCONFIG_IDX 530 val IntPhyRegs = coreParams.intPreg.numEntries 531 val VfPhyRegs = coreParams.vfPreg.numEntries 532 val MaxPhyPregs = IntPhyRegs max VfPhyRegs 533 val PhyRegIdxWidth = log2Up(IntPhyRegs) max log2Up(VfPhyRegs) 534 val RobSize = coreParams.RobSize 535 val RabSize = coreParams.RabSize 536 val IntRefCounterWidth = log2Ceil(RobSize) 537 val VirtualLoadQueueSize = coreParams.VirtualLoadQueueSize 538 val LoadQueueRARSize = coreParams.LoadQueueRARSize 539 val LoadQueueRAWSize = coreParams.LoadQueueRAWSize 540 val RollbackGroupSize = coreParams.RollbackGroupSize 541 val LoadQueueReplaySize = coreParams.LoadQueueReplaySize 542 val LoadUncacheBufferSize = coreParams.LoadUncacheBufferSize 543 val LoadQueueNWriteBanks = coreParams.LoadQueueNWriteBanks 544 val StoreQueueSize = coreParams.StoreQueueSize 545 val StoreQueueNWriteBanks = coreParams.StoreQueueNWriteBanks 546 val StoreQueueForwardWithMask = coreParams.StoreQueueForwardWithMask 547 val VlsQueueSize = coreParams.VlsQueueSize 548 val dpParams = coreParams.dpParams 549 550 def backendParams: BackendParams = coreParams.backendParams 551 def MemIQSizeMax = backendParams.memSchdParams.get.issueBlockParams.map(_.numEntries).max 552 def IQSizeMax = backendParams.allSchdParams.map(_.issueBlockParams.map(_.numEntries).max).max 553 554 val NumRedirect = backendParams.numRedirect 555 val BackendRedirectNum = NumRedirect + 2 //2: ldReplay + Exception 556 val LoadPipelineWidth = coreParams.LoadPipelineWidth 557 val StorePipelineWidth = coreParams.StorePipelineWidth 558 val VecMemSrcInWidth = coreParams.VecMemSrcInWidth 559 val VecMemInstWbWidth = coreParams.VecMemInstWbWidth 560 val VecMemDispatchWidth = coreParams.VecMemDispatchWidth 561 val StoreBufferSize = coreParams.StoreBufferSize 562 val StoreBufferThreshold = coreParams.StoreBufferThreshold 563 val EnsbufferWidth = coreParams.EnsbufferWidth 564 val UncacheBufferSize = coreParams.UncacheBufferSize 565 val EnableLoadToLoadForward = coreParams.EnableLoadToLoadForward 566 val EnableFastForward = coreParams.EnableFastForward 567 val EnableLdVioCheckAfterReset = coreParams.EnableLdVioCheckAfterReset 568 val EnableSoftPrefetchAfterReset = coreParams.EnableSoftPrefetchAfterReset 569 val EnableCacheErrorAfterReset = coreParams.EnableCacheErrorAfterReset 570 val EnableAccurateLoadError = coreParams.EnableAccurateLoadError 571 val EnableUncacheWriteOutstanding = coreParams.EnableUncacheWriteOutstanding 572 val EnableStorePrefetchAtIssue = coreParams.EnableStorePrefetchAtIssue 573 val EnableStorePrefetchAtCommit = coreParams.EnableStorePrefetchAtCommit 574 val EnableAtCommitMissTrigger = coreParams.EnableAtCommitMissTrigger 575 val EnableStorePrefetchSMS = coreParams.EnableStorePrefetchSMS 576 val EnableStorePrefetchSPB = coreParams.EnableStorePrefetchSPB 577 val asidLen = coreParams.MMUAsidLen 578 val BTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth 579 val refillBothTlb = coreParams.refillBothTlb 580 val iwpuParam = coreParams.iwpuParameters 581 val dwpuParam = coreParams.dwpuParameters 582 val itlbParams = coreParams.itlbParameters 583 val ldtlbParams = coreParams.ldtlbParameters 584 val sttlbParams = coreParams.sttlbParameters 585 val pftlbParams = coreParams.pftlbParameters 586 val btlbParams = coreParams.btlbParameters 587 val l2tlbParams = coreParams.l2tlbParameters 588 val NumPerfCounters = coreParams.NumPerfCounters 589 590 val instBytes = if (HasCExtension) 2 else 4 591 val instOffsetBits = log2Ceil(instBytes) 592 593 val icacheParameters = coreParams.icacheParameters 594 val dcacheParameters = coreParams.dcacheParametersOpt.getOrElse(DCacheParameters()) 595 596 // dcache block cacheline when lr for LRSCCycles - LRSCBackOff cycles 597 // for constrained LR/SC loop 598 val LRSCCycles = 64 599 // for lr storm 600 val LRSCBackOff = 8 601 602 // cache hierarchy configurations 603 val l1BusDataWidth = 256 604 605 // load violation predict 606 val ResetTimeMax2Pow = 20 //1078576 607 val ResetTimeMin2Pow = 10 //1024 608 // wait table parameters 609 val WaitTableSize = 1024 610 val MemPredPCWidth = log2Up(WaitTableSize) 611 val LWTUse2BitCounter = true 612 // store set parameters 613 val SSITSize = WaitTableSize 614 val LFSTSize = 32 615 val SSIDWidth = log2Up(LFSTSize) 616 val LFSTWidth = 4 617 val StoreSetEnable = true // LWT will be disabled if SS is enabled 618 val LFSTEnable = false 619 620 val PCntIncrStep: Int = 6 621 val numPCntHc: Int = 25 622 val numPCntPtw: Int = 19 623 624 val numCSRPCntFrontend = 8 625 val numCSRPCntCtrl = 8 626 val numCSRPCntLsu = 8 627 val numCSRPCntHc = 5 628} 629