1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 1745c767e3SLinJiaweipackage top 1845c767e3SLinJiawei 1945c767e3SLinJiaweiimport chisel3._ 2045c767e3SLinJiaweiimport chisel3.util._ 2145c767e3SLinJiaweiimport xiangshan._ 2245c767e3SLinJiaweiimport utils._ 2345c767e3SLinJiaweiimport system._ 2445c767e3SLinJiaweiimport chipsalliance.rocketchip.config._ 2545c767e3SLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen} 26f06ca0bfSLingrui98import xiangshan.frontend.{ICacheParameters} 27d4aca96cSlqreimport freechips.rocketchip.devices.debug._ 28d4aca96cSlqreimport freechips.rocketchip.tile.MaxHartIdBits 2945c767e3SLinJiaweiimport xiangshan.backend.dispatch.DispatchParameters 303a6496e9SYinan Xuimport xiangshan.backend.exu.ExuParameters 31f06ca0bfSLingrui98import xiangshan.cache.{DCacheParameters, L1plusCacheParameters} 32a0301c0dSLemoverimport xiangshan.cache.mmu.{L2TLBParameters, TLBParameters} 33*a1ea7f76SJiawei Linimport xiangshan.cache.prefetch._ 34*a1ea7f76SJiawei Linimport device.{EnableJtag, XSDebugModuleParams} 35*a1ea7f76SJiawei Linimport huancun.{CacheParameters, HCCacheParameters} 3645c767e3SLinJiawei 3745c767e3SLinJiaweiclass DefaultConfig(n: Int) extends Config((site, here, up) => { 3845c767e3SLinJiawei case XLen => 64 3945c767e3SLinJiawei case DebugOptionsKey => DebugOptions() 4045c767e3SLinJiawei case SoCParamsKey => SoCParameters( 4145c767e3SLinJiawei cores = List.tabulate(n){ i => XSCoreParameters(HartId = i) } 4245c767e3SLinJiawei ) 43d4aca96cSlqre case ExportDebug => DebugAttachParams(protocols = Set(JTAG)) 44d4aca96cSlqre case DebugModuleKey => Some(XSDebugModuleParams(site(XLen))) 45d4aca96cSlqre case JtagDTMKey => JtagDTMKey 46d4aca96cSlqre case MaxHartIdBits => 2 47d4aca96cSlqre case EnableJtag => false.B 4845c767e3SLinJiawei}) 4945c767e3SLinJiawei 5005f23f57SWilliam Wang// Synthesizable minimal XiangShan 5105f23f57SWilliam Wang// * It is still an out-of-order, super-scalaer arch 5205f23f57SWilliam Wang// * L1 cache included 5305f23f57SWilliam Wang// * L2 cache NOT included 5405f23f57SWilliam Wang// * L3 cache included 5545c767e3SLinJiaweiclass MinimalConfig(n: Int = 1) extends Config( 5645c767e3SLinJiawei new DefaultConfig(n).alter((site, here, up) => { 5745c767e3SLinJiawei case SoCParamsKey => up(SoCParamsKey).copy( 5845c767e3SLinJiawei cores = up(SoCParamsKey).cores.map(_.copy( 5905f23f57SWilliam Wang DecodeWidth = 2, 6005f23f57SWilliam Wang RenameWidth = 2, 6105f23f57SWilliam Wang FetchWidth = 4, 6245c767e3SLinJiawei IssQueSize = 8, 633a6496e9SYinan Xu NRPhyRegs = 64, 6445c767e3SLinJiawei LoadQueueSize = 16, 653a6496e9SYinan Xu StoreQueueSize = 12, 6645c767e3SLinJiawei RoqSize = 32, 6745c767e3SLinJiawei BrqSize = 8, 683a6496e9SYinan Xu FtqSize = 8, 6945c767e3SLinJiawei IBufSize = 16, 7005f23f57SWilliam Wang StoreBufferSize = 4, 7105f23f57SWilliam Wang StoreBufferThreshold = 3, 7245c767e3SLinJiawei dpParams = DispatchParameters( 733a6496e9SYinan Xu IntDqSize = 12, 743a6496e9SYinan Xu FpDqSize = 12, 753a6496e9SYinan Xu LsDqSize = 12, 7645c767e3SLinJiawei IntDqDeqWidth = 4, 7745c767e3SLinJiawei FpDqDeqWidth = 4, 7845c767e3SLinJiawei LsDqDeqWidth = 4 7945c767e3SLinJiawei ), 803a6496e9SYinan Xu exuParameters = ExuParameters( 813a6496e9SYinan Xu JmpCnt = 1, 823a6496e9SYinan Xu AluCnt = 2, 833a6496e9SYinan Xu MulCnt = 0, 843a6496e9SYinan Xu MduCnt = 1, 853a6496e9SYinan Xu FmacCnt = 1, 863a6496e9SYinan Xu FmiscCnt = 1, 873a6496e9SYinan Xu FmiscDivSqrtCnt = 0, 883a6496e9SYinan Xu LduCnt = 2, 893a6496e9SYinan Xu StuCnt = 2 903a6496e9SYinan Xu ), 9105f23f57SWilliam Wang icacheParameters = ICacheParameters( 923a6496e9SYinan Xu nSets = 64, // 16KB ICache 9305f23f57SWilliam Wang tagECC = Some("parity"), 9405f23f57SWilliam Wang dataECC = Some("parity"), 9505f23f57SWilliam Wang replacer = Some("setplru"), 9605f23f57SWilliam Wang nMissEntries = 2 9705f23f57SWilliam Wang ), 9805f23f57SWilliam Wang dcacheParameters = DCacheParameters( 993a6496e9SYinan Xu nSets = 64, // 32KB DCache 1003a6496e9SYinan Xu nWays = 8, 10105f23f57SWilliam Wang tagECC = Some("secded"), 10205f23f57SWilliam Wang dataECC = Some("secded"), 10305f23f57SWilliam Wang replacer = Some("setplru"), 10405f23f57SWilliam Wang nMissEntries = 4, 10505f23f57SWilliam Wang nProbeEntries = 4, 10605f23f57SWilliam Wang nReleaseEntries = 4, 10705f23f57SWilliam Wang nStoreReplayEntries = 4, 10805f23f57SWilliam Wang ), 10945c767e3SLinJiawei EnableBPD = false, // disable TAGE 11045c767e3SLinJiawei EnableLoop = false, 111a0301c0dSLemover itlbParameters = TLBParameters( 112a0301c0dSLemover name = "itlb", 113a0301c0dSLemover fetchi = true, 114a0301c0dSLemover useDmode = false, 115a0301c0dSLemover sameCycle = true, 116a0301c0dSLemover normalReplacer = Some("plru"), 117a0301c0dSLemover superReplacer = Some("plru"), 118a0301c0dSLemover normalNWays = 4, 119a0301c0dSLemover normalNSets = 1, 120a0301c0dSLemover superNWays = 2, 121a0301c0dSLemover shouldBlock = true 122a0301c0dSLemover ), 123a0301c0dSLemover ldtlbParameters = TLBParameters( 124a0301c0dSLemover name = "ldtlb", 125a0301c0dSLemover normalNSets = 4, // when da or sa 126a0301c0dSLemover normalNWays = 1, // when fa or sa 127a0301c0dSLemover normalAssociative = "sa", 128a0301c0dSLemover normalReplacer = Some("setplru"), 129a0301c0dSLemover superNWays = 4, 130a0301c0dSLemover normalAsVictim = true, 131a0301c0dSLemover outReplace = true 132a0301c0dSLemover ), 133a0301c0dSLemover sttlbParameters = TLBParameters( 134a0301c0dSLemover name = "sttlb", 135a0301c0dSLemover normalNSets = 4, // when da or sa 136a0301c0dSLemover normalNWays = 1, // when fa or sa 137a0301c0dSLemover normalAssociative = "sa", 138a0301c0dSLemover normalReplacer = Some("setplru"), 139a0301c0dSLemover normalAsVictim = true, 140a0301c0dSLemover superNWays = 4, 141a0301c0dSLemover outReplace = true 142a0301c0dSLemover ), 143a0301c0dSLemover btlbParameters = TLBParameters( 144a0301c0dSLemover name = "btlb", 145a0301c0dSLemover normalNSets = 1, 146a0301c0dSLemover normalNWays = 8, 147a0301c0dSLemover superNWays = 2 148a0301c0dSLemover ), 1495854c1edSLemover l2tlbParameters = L2TLBParameters( 1505854c1edSLemover l1Size = 4, 1515854c1edSLemover l2nSets = 4, 1525854c1edSLemover l2nWays = 4, 1535854c1edSLemover l3nSets = 4, 1545854c1edSLemover l3nWays = 8, 1555854c1edSLemover spSize = 2, 1565854c1edSLemover missQueueSize = 8 1575854c1edSLemover ), 1586c0058d3SYinan Xu useFakeL2Cache = true, // disable L2 Cache 15905f23f57SWilliam Wang )), 160*a1ea7f76SJiawei Lin L3CacheParams = up(SoCParamsKey).L3CacheParams.copy( 161*a1ea7f76SJiawei Lin sets = 1024 162*a1ea7f76SJiawei Lin ), 163*a1ea7f76SJiawei Lin L3NBanks = 1 16405f23f57SWilliam Wang ) 16505f23f57SWilliam Wang }) 16605f23f57SWilliam Wang) 16705f23f57SWilliam Wang 16805f23f57SWilliam Wang// Non-synthesizable MinimalConfig, for fast simulation only 16905f23f57SWilliam Wangclass MinimalSimConfig(n: Int = 1) extends Config( 17005f23f57SWilliam Wang new MinimalConfig(n).alter((site, here, up) => { 17105f23f57SWilliam Wang case SoCParamsKey => up(SoCParamsKey).copy( 17205f23f57SWilliam Wang cores = up(SoCParamsKey).cores.map(_.copy( 173175bcfe9SLinJiawei useFakeDCache = true, 174175bcfe9SLinJiawei useFakePTW = true, 175175bcfe9SLinJiawei useFakeL1plusCache = true, 176175bcfe9SLinJiawei )), 177175bcfe9SLinJiawei useFakeL3Cache = true 17845c767e3SLinJiawei ) 17945c767e3SLinJiawei }) 18045c767e3SLinJiawei) 18188825c5cSYinan Xu 182*a1ea7f76SJiawei Linclass WithNKBL2(n: Int, ways: Int = 8, inclusive: Boolean = true) extends Config((site, here, up) => { 183*a1ea7f76SJiawei Lin case SoCParamsKey => 184*a1ea7f76SJiawei Lin val upParams = up(SoCParamsKey) 185*a1ea7f76SJiawei Lin val l2sets = n * 1024 / ways / 64 186*a1ea7f76SJiawei Lin upParams.copy( 187*a1ea7f76SJiawei Lin cores = upParams.cores.map(p => p.copy( 188*a1ea7f76SJiawei Lin L2CacheParams = HCCacheParameters( 189*a1ea7f76SJiawei Lin name = "L2", 190*a1ea7f76SJiawei Lin level = 2, 191*a1ea7f76SJiawei Lin ways = ways, 192*a1ea7f76SJiawei Lin sets = l2sets, 193*a1ea7f76SJiawei Lin inclusive = inclusive, 194*a1ea7f76SJiawei Lin prefetch = Some(huancun.prefetch.BOPParameters()) 195*a1ea7f76SJiawei Lin ), 196*a1ea7f76SJiawei Lin useFakeL2Cache = false, 197*a1ea7f76SJiawei Lin useFakeDCache = false, 198*a1ea7f76SJiawei Lin useFakePTW = false, 199*a1ea7f76SJiawei Lin useFakeL1plusCache = false 200*a1ea7f76SJiawei Lin )) 201*a1ea7f76SJiawei Lin ) 202*a1ea7f76SJiawei Lin}) 203*a1ea7f76SJiawei Lin 204*a1ea7f76SJiawei Linclass WithNKBL3(n: Int, ways: Int = 8, inclusive: Boolean = true, banks: Int = 1) extends Config((site, here, up) => { 205*a1ea7f76SJiawei Lin case SoCParamsKey => 206*a1ea7f76SJiawei Lin val upParams = up(SoCParamsKey) 207*a1ea7f76SJiawei Lin val sets = n * 1024 / banks / ways / 64 208*a1ea7f76SJiawei Lin upParams.copy( 209*a1ea7f76SJiawei Lin L3NBanks = banks, 210*a1ea7f76SJiawei Lin L3CacheParams = HCCacheParameters( 211*a1ea7f76SJiawei Lin name = "L3", 212*a1ea7f76SJiawei Lin level = 3, 213*a1ea7f76SJiawei Lin ways = ways, 214*a1ea7f76SJiawei Lin sets = sets, 215*a1ea7f76SJiawei Lin inclusive = inclusive, 216*a1ea7f76SJiawei Lin clientCaches = upParams.cores.map{ core => 217*a1ea7f76SJiawei Lin val l2params = core.L2CacheParams.toCacheParams 218*a1ea7f76SJiawei Lin l2params.copy(ways = 2 * l2params.ways) 219*a1ea7f76SJiawei Lin } 220*a1ea7f76SJiawei Lin ) 221*a1ea7f76SJiawei Lin ) 222*a1ea7f76SJiawei Lin}) 223*a1ea7f76SJiawei Lin 224*a1ea7f76SJiawei Linclass WithL3DebugConfig extends Config( 225*a1ea7f76SJiawei Lin new WithNKBL3(256, inclusive = false) ++ new WithNKBL2(64) 226*a1ea7f76SJiawei Lin) 227*a1ea7f76SJiawei Lin 228*a1ea7f76SJiawei Linclass MinimalL3DebugConfig(n: Int = 1) extends Config( 229*a1ea7f76SJiawei Lin new WithL3DebugConfig ++ new MinimalConfig(n) 230*a1ea7f76SJiawei Lin) 231*a1ea7f76SJiawei Lin 232*a1ea7f76SJiawei Linclass DefaultL3DebugConfig(n: Int = 1) extends Config( 233*a1ea7f76SJiawei Lin new WithL3DebugConfig ++ new DefaultConfig(n) 234*a1ea7f76SJiawei Lin) 235*a1ea7f76SJiawei Lin 236*a1ea7f76SJiawei Linclass NonInclusiveL3Config(n: Int = 1) extends Config( 237*a1ea7f76SJiawei Lin new WithNKBL3(4096, inclusive = false, banks = 4) ++ new WithNKBL2(512) ++ new DefaultConfig(n) 238*a1ea7f76SJiawei Lin) 239