1*c6d43980SLemover/*************************************************************************************** 2*c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*c6d43980SLemover* 4*c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 5*c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 6*c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 7*c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 8*c6d43980SLemover* 9*c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 10*c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 11*c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 12*c6d43980SLemover* 13*c6d43980SLemover* See the Mulan PSL v2 for more details. 14*c6d43980SLemover***************************************************************************************/ 15*c6d43980SLemover 162225d46eSJiawei Linpackage xiangshan 172225d46eSJiawei Lin 182225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Field, Parameters} 192225d46eSJiawei Linimport chisel3._ 202225d46eSJiawei Linimport chisel3.util._ 212225d46eSJiawei Linimport xiangshan.backend.exu._ 222225d46eSJiawei Linimport xiangshan.backend.fu._ 232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 242225d46eSJiawei Linimport xiangshan.backend.dispatch.DispatchParameters 252225d46eSJiawei Linimport xiangshan.cache.{DCacheParameters, ICacheParameters, L1plusCacheParameters} 262225d46eSJiawei Linimport xiangshan.cache.prefetch.{BOPParameters, L1plusPrefetcherParameters, L2PrefetcherParameters, StreamPrefetchParameters} 272225d46eSJiawei Lin 282225d46eSJiawei Lincase object XSCoreParamsKey extends Field[XSCoreParameters] 292225d46eSJiawei Lin 302225d46eSJiawei Lincase class XSCoreParameters 312225d46eSJiawei Lin( 322225d46eSJiawei Lin HasPrefetch: Boolean = false, 332225d46eSJiawei Lin HartId: Int = 0, 342225d46eSJiawei Lin XLEN: Int = 64, 352225d46eSJiawei Lin HasMExtension: Boolean = true, 362225d46eSJiawei Lin HasCExtension: Boolean = true, 372225d46eSJiawei Lin HasDiv: Boolean = true, 382225d46eSJiawei Lin HasICache: Boolean = true, 392225d46eSJiawei Lin HasDCache: Boolean = true, 402225d46eSJiawei Lin AddrBits: Int = 64, 412225d46eSJiawei Lin VAddrBits: Int = 39, 422225d46eSJiawei Lin PAddrBits: Int = 40, 432225d46eSJiawei Lin HasFPU: Boolean = true, 442225d46eSJiawei Lin FetchWidth: Int = 8, 452225d46eSJiawei Lin EnableBPU: Boolean = true, 462225d46eSJiawei Lin EnableBPD: Boolean = true, 472225d46eSJiawei Lin EnableRAS: Boolean = true, 482225d46eSJiawei Lin EnableLB: Boolean = false, 492225d46eSJiawei Lin EnableLoop: Boolean = true, 502225d46eSJiawei Lin EnableSC: Boolean = true, 512225d46eSJiawei Lin EnbaleTlbDebug: Boolean = false, 522225d46eSJiawei Lin EnableJal: Boolean = false, 532225d46eSJiawei Lin EnableUBTB: Boolean = true, 542225d46eSJiawei Lin HistoryLength: Int = 64, 552225d46eSJiawei Lin BtbSize: Int = 2048, 562225d46eSJiawei Lin JbtacSize: Int = 1024, 572225d46eSJiawei Lin JbtacBanks: Int = 8, 582225d46eSJiawei Lin RasSize: Int = 16, 592225d46eSJiawei Lin CacheLineSize: Int = 512, 602225d46eSJiawei Lin UBtbWays: Int = 16, 612225d46eSJiawei Lin BtbWays: Int = 2, 622225d46eSJiawei Lin 632225d46eSJiawei Lin EnableL1plusPrefetcher: Boolean = true, 642225d46eSJiawei Lin IBufSize: Int = 48, 652225d46eSJiawei Lin DecodeWidth: Int = 6, 662225d46eSJiawei Lin RenameWidth: Int = 6, 672225d46eSJiawei Lin CommitWidth: Int = 6, 682225d46eSJiawei Lin BrqSize: Int = 32, 692225d46eSJiawei Lin FtqSize: Int = 48, 702225d46eSJiawei Lin EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false 712225d46eSJiawei Lin IssQueSize: Int = 16, 722225d46eSJiawei Lin NRPhyRegs: Int = 160, 732225d46eSJiawei Lin NRIntReadPorts: Int = 14, 742225d46eSJiawei Lin NRIntWritePorts: Int = 8, 752225d46eSJiawei Lin NRFpReadPorts: Int = 14, 762225d46eSJiawei Lin NRFpWritePorts: Int = 8, 772225d46eSJiawei Lin LoadQueueSize: Int = 64, 782225d46eSJiawei Lin StoreQueueSize: Int = 48, 792225d46eSJiawei Lin RoqSize: Int = 192, 802225d46eSJiawei Lin dpParams: DispatchParameters = DispatchParameters( 812225d46eSJiawei Lin IntDqSize = 16, 822225d46eSJiawei Lin FpDqSize = 16, 832225d46eSJiawei Lin LsDqSize = 16, 842225d46eSJiawei Lin IntDqDeqWidth = 4, 852225d46eSJiawei Lin FpDqDeqWidth = 4, 862225d46eSJiawei Lin LsDqDeqWidth = 4 872225d46eSJiawei Lin ), 882225d46eSJiawei Lin exuParameters: ExuParameters = ExuParameters( 892225d46eSJiawei Lin JmpCnt = 1, 902225d46eSJiawei Lin AluCnt = 4, 912225d46eSJiawei Lin MulCnt = 0, 922225d46eSJiawei Lin MduCnt = 2, 932225d46eSJiawei Lin FmacCnt = 4, 942225d46eSJiawei Lin FmiscCnt = 2, 952225d46eSJiawei Lin FmiscDivSqrtCnt = 0, 962225d46eSJiawei Lin LduCnt = 2, 972225d46eSJiawei Lin StuCnt = 2 982225d46eSJiawei Lin ), 992225d46eSJiawei Lin LoadPipelineWidth: Int = 2, 1002225d46eSJiawei Lin StorePipelineWidth: Int = 2, 1012225d46eSJiawei Lin StoreBufferSize: Int = 16, 10205f23f57SWilliam Wang StoreBufferThreshold: Int = 7, 1032225d46eSJiawei Lin RefillSize: Int = 512, 1042225d46eSJiawei Lin TlbEntrySize: Int = 32, 1052225d46eSJiawei Lin TlbSPEntrySize: Int = 4, 1062225d46eSJiawei Lin PtwL3EntrySize: Int = 4096, //(256 * 16) or 512 1072225d46eSJiawei Lin PtwSPEntrySize: Int = 16, 1082225d46eSJiawei Lin PtwL1EntrySize: Int = 16, 1092225d46eSJiawei Lin PtwL2EntrySize: Int = 2048, //(256 * 8) 1104d586ba1SLemover PtwMissQueueSize: Int = 8, 1112225d46eSJiawei Lin NumPerfCounters: Int = 16, 11205f23f57SWilliam Wang icacheParameters: ICacheParameters = ICacheParameters( 11305f23f57SWilliam Wang tagECC = Some("parity"), 11405f23f57SWilliam Wang dataECC = Some("parity"), 11505f23f57SWilliam Wang replacer = Some("setplru"), 11605f23f57SWilliam Wang nMissEntries = 2 11705f23f57SWilliam Wang ), 11805f23f57SWilliam Wang l1plusCacheParameters: L1plusCacheParameters = L1plusCacheParameters( 11905f23f57SWilliam Wang tagECC = Some("secded"), 12005f23f57SWilliam Wang dataECC = Some("secded"), 12105f23f57SWilliam Wang replacer = Some("setplru"), 12205f23f57SWilliam Wang nMissEntries = 8 12305f23f57SWilliam Wang ), 12405f23f57SWilliam Wang dcacheParameters: DCacheParameters = DCacheParameters( 12505f23f57SWilliam Wang tagECC = Some("secded"), 12605f23f57SWilliam Wang dataECC = Some("secded"), 12705f23f57SWilliam Wang replacer = Some("setplru"), 12805f23f57SWilliam Wang nMissEntries = 16, 12905f23f57SWilliam Wang nProbeEntries = 16, 13005f23f57SWilliam Wang nReleaseEntries = 16, 13105f23f57SWilliam Wang nStoreReplayEntries = 16 13205f23f57SWilliam Wang ), 13305f23f57SWilliam Wang L2Size: Int = 512 * 1024, // 512KB 13405f23f57SWilliam Wang L2NWays: Int = 8, 135175bcfe9SLinJiawei useFakePTW: Boolean = false, 136175bcfe9SLinJiawei useFakeDCache: Boolean = false, 13705f23f57SWilliam Wang useFakeL1plusCache: Boolean = false, 13805f23f57SWilliam Wang useFakeL2Cache: Boolean = false 1392225d46eSJiawei Lin){ 1402225d46eSJiawei Lin val loadExuConfigs = Seq.fill(exuParameters.LduCnt)(LdExeUnitCfg) 1412225d46eSJiawei Lin val storeExuConfigs = Seq.fill(exuParameters.StuCnt)(StExeUnitCfg) 1422225d46eSJiawei Lin 1432225d46eSJiawei Lin val intExuConfigs = JumpExeUnitCfg +: ( 1442225d46eSJiawei Lin Seq.fill(exuParameters.MduCnt)(MulDivExeUnitCfg) ++ 1452225d46eSJiawei Lin Seq.fill(exuParameters.AluCnt)(AluExeUnitCfg) 1462225d46eSJiawei Lin ) 1472225d46eSJiawei Lin 1482225d46eSJiawei Lin val fpExuConfigs = 1492225d46eSJiawei Lin Seq.fill(exuParameters.FmacCnt)(FmacExeUnitCfg) ++ 1502225d46eSJiawei Lin Seq.fill(exuParameters.FmiscCnt)(FmiscExeUnitCfg) 1512225d46eSJiawei Lin 1522225d46eSJiawei Lin val exuConfigs: Seq[ExuConfig] = intExuConfigs ++ fpExuConfigs ++ loadExuConfigs ++ storeExuConfigs 1532225d46eSJiawei Lin} 1542225d46eSJiawei Lin 1552225d46eSJiawei Lincase object DebugOptionsKey extends Field[DebugOptions] 1562225d46eSJiawei Lin 1572225d46eSJiawei Lincase class DebugOptions 1582225d46eSJiawei Lin( 1592225d46eSJiawei Lin FPGAPlatform: Boolean = true, 160156656b6SSteve Gou EnableDebug: Boolean = true, 1612225d46eSJiawei Lin EnablePerfDebug: Boolean = true, 1622225d46eSJiawei Lin UseDRAMSim: Boolean = false 1632225d46eSJiawei Lin) 1642225d46eSJiawei Lin 1652225d46eSJiawei Lintrait HasXSParameter { 1662225d46eSJiawei Lin 1672225d46eSJiawei Lin implicit val p: Parameters 1682225d46eSJiawei Lin 1692225d46eSJiawei Lin val coreParams = p(XSCoreParamsKey) 1702225d46eSJiawei Lin val env = p(DebugOptionsKey) 1712225d46eSJiawei Lin 1722225d46eSJiawei Lin val XLEN = coreParams.XLEN 1732225d46eSJiawei Lin val hardId = coreParams.HartId 1742225d46eSJiawei Lin val minFLen = 32 1752225d46eSJiawei Lin val fLen = 64 1762225d46eSJiawei Lin def xLen = XLEN 1772225d46eSJiawei Lin 1782225d46eSJiawei Lin val HasMExtension = coreParams.HasMExtension 1792225d46eSJiawei Lin val HasCExtension = coreParams.HasCExtension 1802225d46eSJiawei Lin val HasDiv = coreParams.HasDiv 1812225d46eSJiawei Lin val HasIcache = coreParams.HasICache 1822225d46eSJiawei Lin val HasDcache = coreParams.HasDCache 1832225d46eSJiawei Lin val AddrBits = coreParams.AddrBits // AddrBits is used in some cases 1842225d46eSJiawei Lin val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits 1852225d46eSJiawei Lin val PAddrBits = coreParams.PAddrBits // PAddrBits is Phyical Memory addr bits 1862225d46eSJiawei Lin val AddrBytes = AddrBits / 8 // unused 1872225d46eSJiawei Lin val DataBits = XLEN 1882225d46eSJiawei Lin val DataBytes = DataBits / 8 1892225d46eSJiawei Lin val HasFPU = coreParams.HasFPU 1902225d46eSJiawei Lin val FetchWidth = coreParams.FetchWidth 1912225d46eSJiawei Lin val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1) 1922225d46eSJiawei Lin val EnableBPU = coreParams.EnableBPU 1932225d46eSJiawei Lin val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3 1942225d46eSJiawei Lin val EnableRAS = coreParams.EnableRAS 1952225d46eSJiawei Lin val EnableLB = coreParams.EnableLB 1962225d46eSJiawei Lin val EnableLoop = coreParams.EnableLoop 1972225d46eSJiawei Lin val EnableSC = coreParams.EnableSC 1982225d46eSJiawei Lin val EnbaleTlbDebug = coreParams.EnbaleTlbDebug 1992225d46eSJiawei Lin val HistoryLength = coreParams.HistoryLength 2002225d46eSJiawei Lin val BtbSize = coreParams.BtbSize 2012225d46eSJiawei Lin // val BtbWays = 4 2022225d46eSJiawei Lin val BtbBanks = PredictWidth 2032225d46eSJiawei Lin // val BtbSets = BtbSize / BtbWays 2042225d46eSJiawei Lin val JbtacSize = coreParams.JbtacSize 2052225d46eSJiawei Lin val JbtacBanks = coreParams.JbtacBanks 2062225d46eSJiawei Lin val RasSize = coreParams.RasSize 2072225d46eSJiawei Lin val CacheLineSize = coreParams.CacheLineSize 2082225d46eSJiawei Lin val CacheLineHalfWord = CacheLineSize / 16 2092225d46eSJiawei Lin val ExtHistoryLength = HistoryLength + 64 2102225d46eSJiawei Lin val UBtbWays = coreParams.UBtbWays 2112225d46eSJiawei Lin val BtbWays = coreParams.BtbWays 2122225d46eSJiawei Lin val EnableL1plusPrefetcher = coreParams.EnableL1plusPrefetcher 2132225d46eSJiawei Lin val IBufSize = coreParams.IBufSize 2142225d46eSJiawei Lin val DecodeWidth = coreParams.DecodeWidth 2152225d46eSJiawei Lin val RenameWidth = coreParams.RenameWidth 2162225d46eSJiawei Lin val CommitWidth = coreParams.CommitWidth 2172225d46eSJiawei Lin val BrqSize = coreParams.BrqSize 2182225d46eSJiawei Lin val FtqSize = coreParams.FtqSize 2192225d46eSJiawei Lin val IssQueSize = coreParams.IssQueSize 2202225d46eSJiawei Lin val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp 2212225d46eSJiawei Lin val BrTagWidth = log2Up(BrqSize) 2222225d46eSJiawei Lin val NRPhyRegs = coreParams.NRPhyRegs 2232225d46eSJiawei Lin val PhyRegIdxWidth = log2Up(NRPhyRegs) 2242225d46eSJiawei Lin val RoqSize = coreParams.RoqSize 2252225d46eSJiawei Lin val LoadQueueSize = coreParams.LoadQueueSize 2262225d46eSJiawei Lin val StoreQueueSize = coreParams.StoreQueueSize 2272225d46eSJiawei Lin val dpParams = coreParams.dpParams 2282225d46eSJiawei Lin val exuParameters = coreParams.exuParameters 2292225d46eSJiawei Lin val NRIntReadPorts = coreParams.NRIntReadPorts 2302225d46eSJiawei Lin val NRIntWritePorts = coreParams.NRIntWritePorts 2312225d46eSJiawei Lin val NRMemReadPorts = exuParameters.LduCnt + 2 * exuParameters.StuCnt 2322225d46eSJiawei Lin val NRFpReadPorts = coreParams.NRFpReadPorts 2332225d46eSJiawei Lin val NRFpWritePorts = coreParams.NRFpWritePorts 2342225d46eSJiawei Lin val LoadPipelineWidth = coreParams.LoadPipelineWidth 2352225d46eSJiawei Lin val StorePipelineWidth = coreParams.StorePipelineWidth 2362225d46eSJiawei Lin val StoreBufferSize = coreParams.StoreBufferSize 23705f23f57SWilliam Wang val StoreBufferThreshold = coreParams.StoreBufferThreshold 2382225d46eSJiawei Lin val RefillSize = coreParams.RefillSize 2392225d46eSJiawei Lin val DTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth 2402225d46eSJiawei Lin val TlbEntrySize = coreParams.TlbEntrySize 2412225d46eSJiawei Lin val TlbSPEntrySize = coreParams.TlbSPEntrySize 2422225d46eSJiawei Lin val PtwL3EntrySize = coreParams.PtwL3EntrySize 2432225d46eSJiawei Lin val PtwSPEntrySize = coreParams.PtwSPEntrySize 2442225d46eSJiawei Lin val PtwL1EntrySize = coreParams.PtwL1EntrySize 2452225d46eSJiawei Lin val PtwL2EntrySize = coreParams.PtwL2EntrySize 2464d586ba1SLemover val PtwMissQueueSize = coreParams.PtwMissQueueSize 2472225d46eSJiawei Lin val NumPerfCounters = coreParams.NumPerfCounters 2482225d46eSJiawei Lin 2492225d46eSJiawei Lin val instBytes = if (HasCExtension) 2 else 4 2502225d46eSJiawei Lin val instOffsetBits = log2Ceil(instBytes) 2512225d46eSJiawei Lin 25205f23f57SWilliam Wang val icacheParameters = coreParams.icacheParameters 25305f23f57SWilliam Wang val l1plusCacheParameters = coreParams.l1plusCacheParameters 25405f23f57SWilliam Wang val dcacheParameters = coreParams.dcacheParameters 2552225d46eSJiawei Lin 2562225d46eSJiawei Lin val LRSCCycles = 100 2572225d46eSJiawei Lin 2582225d46eSJiawei Lin 2592225d46eSJiawei Lin // cache hierarchy configurations 2602225d46eSJiawei Lin val l1BusDataWidth = 256 2612225d46eSJiawei Lin 262175bcfe9SLinJiawei val useFakeDCache = coreParams.useFakeDCache 263175bcfe9SLinJiawei val useFakePTW = coreParams.useFakePTW 264175bcfe9SLinJiawei val useFakeL1plusCache = coreParams.useFakeL1plusCache 2652225d46eSJiawei Lin // L2 configurations 26605f23f57SWilliam Wang val useFakeL2Cache = useFakeDCache && useFakePTW && useFakeL1plusCache || coreParams.useFakeL2Cache 2672225d46eSJiawei Lin val L1BusWidth = 256 26805f23f57SWilliam Wang val L2Size = coreParams.L2Size 2692225d46eSJiawei Lin val L2BlockSize = 64 27005f23f57SWilliam Wang val L2NWays = coreParams.L2NWays 2712225d46eSJiawei Lin val L2NSets = L2Size / L2BlockSize / L2NWays 2722225d46eSJiawei Lin 2732225d46eSJiawei Lin // L3 configurations 2742225d46eSJiawei Lin val L2BusWidth = 256 2752225d46eSJiawei Lin 2762225d46eSJiawei Lin // icache prefetcher 2772225d46eSJiawei Lin val l1plusPrefetcherParameters = L1plusPrefetcherParameters( 2782225d46eSJiawei Lin enable = true, 2792225d46eSJiawei Lin _type = "stream", 2802225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 2812225d46eSJiawei Lin streamCnt = 2, 2822225d46eSJiawei Lin streamSize = 4, 2832225d46eSJiawei Lin ageWidth = 4, 2842225d46eSJiawei Lin blockBytes = l1plusCacheParameters.blockBytes, 2852225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 2862225d46eSJiawei Lin cacheName = "icache" 2872225d46eSJiawei Lin ) 2882225d46eSJiawei Lin ) 2892225d46eSJiawei Lin 2902225d46eSJiawei Lin // dcache prefetcher 2912225d46eSJiawei Lin val l2PrefetcherParameters = L2PrefetcherParameters( 2922225d46eSJiawei Lin enable = true, 2932225d46eSJiawei Lin _type = "bop", // "stream" or "bop" 2942225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 2952225d46eSJiawei Lin streamCnt = 4, 2962225d46eSJiawei Lin streamSize = 4, 2972225d46eSJiawei Lin ageWidth = 4, 2982225d46eSJiawei Lin blockBytes = L2BlockSize, 2992225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 3002225d46eSJiawei Lin cacheName = "dcache" 3012225d46eSJiawei Lin ), 3022225d46eSJiawei Lin bopParams = BOPParameters( 3032225d46eSJiawei Lin rrTableEntries = 256, 3042225d46eSJiawei Lin rrTagBits = 12, 3052225d46eSJiawei Lin scoreBits = 5, 3062225d46eSJiawei Lin roundMax = 50, 3072225d46eSJiawei Lin badScore = 1, 3082225d46eSJiawei Lin blockBytes = L2BlockSize, 3092225d46eSJiawei Lin nEntries = dcacheParameters.nMissEntries * 2 // TODO: this is too large 3102225d46eSJiawei Lin ), 3112225d46eSJiawei Lin ) 312de169c67SWilliam Wang 313de169c67SWilliam Wang // load violation predict 314de169c67SWilliam Wang val ResetTimeMax2Pow = 20 //1078576 315de169c67SWilliam Wang val ResetTimeMin2Pow = 10 //1024 316de169c67SWilliam Wang // wait table parameters 317de169c67SWilliam Wang val WaitTableSize = 1024 318de169c67SWilliam Wang val MemPredPCWidth = log2Up(WaitTableSize) 319de169c67SWilliam Wang val LWTUse2BitCounter = true 320de169c67SWilliam Wang // store set parameters 321de169c67SWilliam Wang val SSITSize = WaitTableSize 322de169c67SWilliam Wang val LFSTSize = 32 323de169c67SWilliam Wang val SSIDWidth = log2Up(LFSTSize) 324de169c67SWilliam Wang val LFSTWidth = 4 325de169c67SWilliam Wang val StoreSetEnable = true // LWT will be disabled if SS is enabled 3262225d46eSJiawei Lin 3272225d46eSJiawei Lin val loadExuConfigs = coreParams.loadExuConfigs 3282225d46eSJiawei Lin val storeExuConfigs = coreParams.storeExuConfigs 3292225d46eSJiawei Lin 3302225d46eSJiawei Lin val intExuConfigs = coreParams.intExuConfigs 3312225d46eSJiawei Lin 3322225d46eSJiawei Lin val fpExuConfigs = coreParams.fpExuConfigs 3332225d46eSJiawei Lin 3342225d46eSJiawei Lin val exuConfigs = coreParams.exuConfigs 3359d5a2027SYinan Xu 3362225d46eSJiawei Lin} 337