12225d46eSJiawei Linpackage xiangshan 22225d46eSJiawei Lin 32225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Field, Parameters} 42225d46eSJiawei Linimport chisel3._ 52225d46eSJiawei Linimport chisel3.util._ 62225d46eSJiawei Linimport xiangshan.backend.exu._ 72225d46eSJiawei Linimport xiangshan.backend.fu._ 82225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 92225d46eSJiawei Linimport xiangshan.backend.dispatch.DispatchParameters 102225d46eSJiawei Linimport xiangshan.cache.{DCacheParameters, ICacheParameters, L1plusCacheParameters} 112225d46eSJiawei Linimport xiangshan.cache.prefetch.{BOPParameters, L1plusPrefetcherParameters, L2PrefetcherParameters, StreamPrefetchParameters} 122225d46eSJiawei Lin 132225d46eSJiawei Lincase object XSCoreParamsKey extends Field[XSCoreParameters] 142225d46eSJiawei Lin 152225d46eSJiawei Lincase class XSCoreParameters 162225d46eSJiawei Lin( 172225d46eSJiawei Lin HasPrefetch: Boolean = false, 182225d46eSJiawei Lin HartId: Int = 0, 192225d46eSJiawei Lin XLEN: Int = 64, 202225d46eSJiawei Lin HasMExtension: Boolean = true, 212225d46eSJiawei Lin HasCExtension: Boolean = true, 222225d46eSJiawei Lin HasDiv: Boolean = true, 232225d46eSJiawei Lin HasICache: Boolean = true, 242225d46eSJiawei Lin HasDCache: Boolean = true, 252225d46eSJiawei Lin AddrBits: Int = 64, 262225d46eSJiawei Lin VAddrBits: Int = 39, 272225d46eSJiawei Lin PAddrBits: Int = 40, 282225d46eSJiawei Lin HasFPU: Boolean = true, 292225d46eSJiawei Lin FetchWidth: Int = 8, 302225d46eSJiawei Lin EnableBPU: Boolean = true, 312225d46eSJiawei Lin EnableBPD: Boolean = true, 322225d46eSJiawei Lin EnableRAS: Boolean = true, 332225d46eSJiawei Lin EnableLB: Boolean = false, 342225d46eSJiawei Lin EnableLoop: Boolean = true, 352225d46eSJiawei Lin EnableSC: Boolean = true, 362225d46eSJiawei Lin EnbaleTlbDebug: Boolean = false, 372225d46eSJiawei Lin EnableJal: Boolean = false, 382225d46eSJiawei Lin EnableUBTB: Boolean = true, 392225d46eSJiawei Lin HistoryLength: Int = 64, 402225d46eSJiawei Lin BtbSize: Int = 2048, 412225d46eSJiawei Lin JbtacSize: Int = 1024, 422225d46eSJiawei Lin JbtacBanks: Int = 8, 432225d46eSJiawei Lin RasSize: Int = 16, 442225d46eSJiawei Lin CacheLineSize: Int = 512, 452225d46eSJiawei Lin UBtbWays: Int = 16, 462225d46eSJiawei Lin BtbWays: Int = 2, 472225d46eSJiawei Lin 482225d46eSJiawei Lin EnableL1plusPrefetcher: Boolean = true, 492225d46eSJiawei Lin IBufSize: Int = 48, 502225d46eSJiawei Lin DecodeWidth: Int = 6, 512225d46eSJiawei Lin RenameWidth: Int = 6, 522225d46eSJiawei Lin CommitWidth: Int = 6, 532225d46eSJiawei Lin BrqSize: Int = 32, 542225d46eSJiawei Lin FtqSize: Int = 48, 552225d46eSJiawei Lin EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false 562225d46eSJiawei Lin IssQueSize: Int = 16, 572225d46eSJiawei Lin NRPhyRegs: Int = 160, 582225d46eSJiawei Lin NRIntReadPorts: Int = 14, 592225d46eSJiawei Lin NRIntWritePorts: Int = 8, 602225d46eSJiawei Lin NRFpReadPorts: Int = 14, 612225d46eSJiawei Lin NRFpWritePorts: Int = 8, 622225d46eSJiawei Lin LoadQueueSize: Int = 64, 632225d46eSJiawei Lin StoreQueueSize: Int = 48, 642225d46eSJiawei Lin RoqSize: Int = 192, 652225d46eSJiawei Lin dpParams: DispatchParameters = DispatchParameters( 662225d46eSJiawei Lin IntDqSize = 16, 672225d46eSJiawei Lin FpDqSize = 16, 682225d46eSJiawei Lin LsDqSize = 16, 692225d46eSJiawei Lin IntDqDeqWidth = 4, 702225d46eSJiawei Lin FpDqDeqWidth = 4, 712225d46eSJiawei Lin LsDqDeqWidth = 4 722225d46eSJiawei Lin ), 732225d46eSJiawei Lin exuParameters: ExuParameters = ExuParameters( 742225d46eSJiawei Lin JmpCnt = 1, 752225d46eSJiawei Lin AluCnt = 4, 762225d46eSJiawei Lin MulCnt = 0, 772225d46eSJiawei Lin MduCnt = 2, 782225d46eSJiawei Lin FmacCnt = 4, 792225d46eSJiawei Lin FmiscCnt = 2, 802225d46eSJiawei Lin FmiscDivSqrtCnt = 0, 812225d46eSJiawei Lin LduCnt = 2, 822225d46eSJiawei Lin StuCnt = 2 832225d46eSJiawei Lin ), 842225d46eSJiawei Lin LoadPipelineWidth: Int = 2, 852225d46eSJiawei Lin StorePipelineWidth: Int = 2, 862225d46eSJiawei Lin StoreBufferSize: Int = 16, 87*05f23f57SWilliam Wang StoreBufferThreshold: Int = 7, 882225d46eSJiawei Lin RefillSize: Int = 512, 892225d46eSJiawei Lin TlbEntrySize: Int = 32, 902225d46eSJiawei Lin TlbSPEntrySize: Int = 4, 912225d46eSJiawei Lin PtwL3EntrySize: Int = 4096, //(256 * 16) or 512 922225d46eSJiawei Lin PtwSPEntrySize: Int = 16, 932225d46eSJiawei Lin PtwL1EntrySize: Int = 16, 942225d46eSJiawei Lin PtwL2EntrySize: Int = 2048, //(256 * 8) 952225d46eSJiawei Lin NumPerfCounters: Int = 16, 96*05f23f57SWilliam Wang icacheParameters: ICacheParameters = ICacheParameters( 97*05f23f57SWilliam Wang tagECC = Some("parity"), 98*05f23f57SWilliam Wang dataECC = Some("parity"), 99*05f23f57SWilliam Wang replacer = Some("setplru"), 100*05f23f57SWilliam Wang nMissEntries = 2 101*05f23f57SWilliam Wang ), 102*05f23f57SWilliam Wang l1plusCacheParameters: L1plusCacheParameters = L1plusCacheParameters( 103*05f23f57SWilliam Wang tagECC = Some("secded"), 104*05f23f57SWilliam Wang dataECC = Some("secded"), 105*05f23f57SWilliam Wang replacer = Some("setplru"), 106*05f23f57SWilliam Wang nMissEntries = 8 107*05f23f57SWilliam Wang ), 108*05f23f57SWilliam Wang dcacheParameters: DCacheParameters = DCacheParameters( 109*05f23f57SWilliam Wang tagECC = Some("secded"), 110*05f23f57SWilliam Wang dataECC = Some("secded"), 111*05f23f57SWilliam Wang replacer = Some("setplru"), 112*05f23f57SWilliam Wang nMissEntries = 16, 113*05f23f57SWilliam Wang nProbeEntries = 16, 114*05f23f57SWilliam Wang nReleaseEntries = 16, 115*05f23f57SWilliam Wang nStoreReplayEntries = 16 116*05f23f57SWilliam Wang ), 117*05f23f57SWilliam Wang L2Size: Int = 512 * 1024, // 512KB 118*05f23f57SWilliam Wang L2NWays: Int = 8, 119175bcfe9SLinJiawei useFakePTW: Boolean = false, 120175bcfe9SLinJiawei useFakeDCache: Boolean = false, 121*05f23f57SWilliam Wang useFakeL1plusCache: Boolean = false, 122*05f23f57SWilliam Wang useFakeL2Cache: Boolean = false 1232225d46eSJiawei Lin){ 1242225d46eSJiawei Lin val loadExuConfigs = Seq.fill(exuParameters.LduCnt)(LdExeUnitCfg) 1252225d46eSJiawei Lin val storeExuConfigs = Seq.fill(exuParameters.StuCnt)(StExeUnitCfg) 1262225d46eSJiawei Lin 1272225d46eSJiawei Lin val intExuConfigs = JumpExeUnitCfg +: ( 1282225d46eSJiawei Lin Seq.fill(exuParameters.MduCnt)(MulDivExeUnitCfg) ++ 1292225d46eSJiawei Lin Seq.fill(exuParameters.AluCnt)(AluExeUnitCfg) 1302225d46eSJiawei Lin ) 1312225d46eSJiawei Lin 1322225d46eSJiawei Lin val fpExuConfigs = 1332225d46eSJiawei Lin Seq.fill(exuParameters.FmacCnt)(FmacExeUnitCfg) ++ 1342225d46eSJiawei Lin Seq.fill(exuParameters.FmiscCnt)(FmiscExeUnitCfg) 1352225d46eSJiawei Lin 1362225d46eSJiawei Lin val exuConfigs: Seq[ExuConfig] = intExuConfigs ++ fpExuConfigs ++ loadExuConfigs ++ storeExuConfigs 1372225d46eSJiawei Lin} 1382225d46eSJiawei Lin 1392225d46eSJiawei Lincase object DebugOptionsKey extends Field[DebugOptions] 1402225d46eSJiawei Lin 1412225d46eSJiawei Lincase class DebugOptions 1422225d46eSJiawei Lin( 1432225d46eSJiawei Lin FPGAPlatform: Boolean = true, 144156656b6SSteve Gou EnableDebug: Boolean = true, 1452225d46eSJiawei Lin EnablePerfDebug: Boolean = true, 1462225d46eSJiawei Lin UseDRAMSim: Boolean = false 1472225d46eSJiawei Lin) 1482225d46eSJiawei Lin 1492225d46eSJiawei Lintrait HasXSParameter { 1502225d46eSJiawei Lin 1512225d46eSJiawei Lin implicit val p: Parameters 1522225d46eSJiawei Lin 1532225d46eSJiawei Lin val coreParams = p(XSCoreParamsKey) 1542225d46eSJiawei Lin val env = p(DebugOptionsKey) 1552225d46eSJiawei Lin 1562225d46eSJiawei Lin val XLEN = coreParams.XLEN 1572225d46eSJiawei Lin val hardId = coreParams.HartId 1582225d46eSJiawei Lin val minFLen = 32 1592225d46eSJiawei Lin val fLen = 64 1602225d46eSJiawei Lin def xLen = XLEN 1612225d46eSJiawei Lin 1622225d46eSJiawei Lin val HasMExtension = coreParams.HasMExtension 1632225d46eSJiawei Lin val HasCExtension = coreParams.HasCExtension 1642225d46eSJiawei Lin val HasDiv = coreParams.HasDiv 1652225d46eSJiawei Lin val HasIcache = coreParams.HasICache 1662225d46eSJiawei Lin val HasDcache = coreParams.HasDCache 1672225d46eSJiawei Lin val AddrBits = coreParams.AddrBits // AddrBits is used in some cases 1682225d46eSJiawei Lin val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits 1692225d46eSJiawei Lin val PAddrBits = coreParams.PAddrBits // PAddrBits is Phyical Memory addr bits 1702225d46eSJiawei Lin val AddrBytes = AddrBits / 8 // unused 1712225d46eSJiawei Lin val DataBits = XLEN 1722225d46eSJiawei Lin val DataBytes = DataBits / 8 1732225d46eSJiawei Lin val HasFPU = coreParams.HasFPU 1742225d46eSJiawei Lin val FetchWidth = coreParams.FetchWidth 1752225d46eSJiawei Lin val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1) 1762225d46eSJiawei Lin val EnableBPU = coreParams.EnableBPU 1772225d46eSJiawei Lin val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3 1782225d46eSJiawei Lin val EnableRAS = coreParams.EnableRAS 1792225d46eSJiawei Lin val EnableLB = coreParams.EnableLB 1802225d46eSJiawei Lin val EnableLoop = coreParams.EnableLoop 1812225d46eSJiawei Lin val EnableSC = coreParams.EnableSC 1822225d46eSJiawei Lin val EnbaleTlbDebug = coreParams.EnbaleTlbDebug 1832225d46eSJiawei Lin val HistoryLength = coreParams.HistoryLength 1842225d46eSJiawei Lin val BtbSize = coreParams.BtbSize 1852225d46eSJiawei Lin // val BtbWays = 4 1862225d46eSJiawei Lin val BtbBanks = PredictWidth 1872225d46eSJiawei Lin // val BtbSets = BtbSize / BtbWays 1882225d46eSJiawei Lin val JbtacSize = coreParams.JbtacSize 1892225d46eSJiawei Lin val JbtacBanks = coreParams.JbtacBanks 1902225d46eSJiawei Lin val RasSize = coreParams.RasSize 1912225d46eSJiawei Lin val CacheLineSize = coreParams.CacheLineSize 1922225d46eSJiawei Lin val CacheLineHalfWord = CacheLineSize / 16 1932225d46eSJiawei Lin val ExtHistoryLength = HistoryLength + 64 1942225d46eSJiawei Lin val UBtbWays = coreParams.UBtbWays 1952225d46eSJiawei Lin val BtbWays = coreParams.BtbWays 1962225d46eSJiawei Lin val EnableL1plusPrefetcher = coreParams.EnableL1plusPrefetcher 1972225d46eSJiawei Lin val IBufSize = coreParams.IBufSize 1982225d46eSJiawei Lin val DecodeWidth = coreParams.DecodeWidth 1992225d46eSJiawei Lin val RenameWidth = coreParams.RenameWidth 2002225d46eSJiawei Lin val CommitWidth = coreParams.CommitWidth 2012225d46eSJiawei Lin val BrqSize = coreParams.BrqSize 2022225d46eSJiawei Lin val FtqSize = coreParams.FtqSize 2032225d46eSJiawei Lin val IssQueSize = coreParams.IssQueSize 2042225d46eSJiawei Lin val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp 2052225d46eSJiawei Lin val BrTagWidth = log2Up(BrqSize) 2062225d46eSJiawei Lin val NRPhyRegs = coreParams.NRPhyRegs 2072225d46eSJiawei Lin val PhyRegIdxWidth = log2Up(NRPhyRegs) 2082225d46eSJiawei Lin val RoqSize = coreParams.RoqSize 2092225d46eSJiawei Lin val LoadQueueSize = coreParams.LoadQueueSize 2102225d46eSJiawei Lin val StoreQueueSize = coreParams.StoreQueueSize 2112225d46eSJiawei Lin val dpParams = coreParams.dpParams 2122225d46eSJiawei Lin val exuParameters = coreParams.exuParameters 2132225d46eSJiawei Lin val NRIntReadPorts = coreParams.NRIntReadPorts 2142225d46eSJiawei Lin val NRIntWritePorts = coreParams.NRIntWritePorts 2152225d46eSJiawei Lin val NRMemReadPorts = exuParameters.LduCnt + 2 * exuParameters.StuCnt 2162225d46eSJiawei Lin val NRFpReadPorts = coreParams.NRFpReadPorts 2172225d46eSJiawei Lin val NRFpWritePorts = coreParams.NRFpWritePorts 2182225d46eSJiawei Lin val LoadPipelineWidth = coreParams.LoadPipelineWidth 2192225d46eSJiawei Lin val StorePipelineWidth = coreParams.StorePipelineWidth 2202225d46eSJiawei Lin val StoreBufferSize = coreParams.StoreBufferSize 221*05f23f57SWilliam Wang val StoreBufferThreshold = coreParams.StoreBufferThreshold 2222225d46eSJiawei Lin val RefillSize = coreParams.RefillSize 2232225d46eSJiawei Lin val DTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth 2242225d46eSJiawei Lin val TlbEntrySize = coreParams.TlbEntrySize 2252225d46eSJiawei Lin val TlbSPEntrySize = coreParams.TlbSPEntrySize 2262225d46eSJiawei Lin val PtwL3EntrySize = coreParams.PtwL3EntrySize 2272225d46eSJiawei Lin val PtwSPEntrySize = coreParams.PtwSPEntrySize 2282225d46eSJiawei Lin val PtwL1EntrySize = coreParams.PtwL1EntrySize 2292225d46eSJiawei Lin val PtwL2EntrySize = coreParams.PtwL2EntrySize 2302225d46eSJiawei Lin val NumPerfCounters = coreParams.NumPerfCounters 2312225d46eSJiawei Lin 2322225d46eSJiawei Lin val instBytes = if (HasCExtension) 2 else 4 2332225d46eSJiawei Lin val instOffsetBits = log2Ceil(instBytes) 2342225d46eSJiawei Lin 235*05f23f57SWilliam Wang val icacheParameters = coreParams.icacheParameters 236*05f23f57SWilliam Wang val l1plusCacheParameters = coreParams.l1plusCacheParameters 237*05f23f57SWilliam Wang val dcacheParameters = coreParams.dcacheParameters 2382225d46eSJiawei Lin 2392225d46eSJiawei Lin val LRSCCycles = 100 2402225d46eSJiawei Lin 2412225d46eSJiawei Lin 2422225d46eSJiawei Lin // cache hierarchy configurations 2432225d46eSJiawei Lin val l1BusDataWidth = 256 2442225d46eSJiawei Lin 245175bcfe9SLinJiawei val useFakeDCache = coreParams.useFakeDCache 246175bcfe9SLinJiawei val useFakePTW = coreParams.useFakePTW 247175bcfe9SLinJiawei val useFakeL1plusCache = coreParams.useFakeL1plusCache 2482225d46eSJiawei Lin // L2 configurations 249*05f23f57SWilliam Wang val useFakeL2Cache = useFakeDCache && useFakePTW && useFakeL1plusCache || coreParams.useFakeL2Cache 2502225d46eSJiawei Lin val L1BusWidth = 256 251*05f23f57SWilliam Wang val L2Size = coreParams.L2Size 2522225d46eSJiawei Lin val L2BlockSize = 64 253*05f23f57SWilliam Wang val L2NWays = coreParams.L2NWays 2542225d46eSJiawei Lin val L2NSets = L2Size / L2BlockSize / L2NWays 2552225d46eSJiawei Lin 2562225d46eSJiawei Lin // L3 configurations 2572225d46eSJiawei Lin val L2BusWidth = 256 2582225d46eSJiawei Lin 2592225d46eSJiawei Lin // icache prefetcher 2602225d46eSJiawei Lin val l1plusPrefetcherParameters = L1plusPrefetcherParameters( 2612225d46eSJiawei Lin enable = true, 2622225d46eSJiawei Lin _type = "stream", 2632225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 2642225d46eSJiawei Lin streamCnt = 2, 2652225d46eSJiawei Lin streamSize = 4, 2662225d46eSJiawei Lin ageWidth = 4, 2672225d46eSJiawei Lin blockBytes = l1plusCacheParameters.blockBytes, 2682225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 2692225d46eSJiawei Lin cacheName = "icache" 2702225d46eSJiawei Lin ) 2712225d46eSJiawei Lin ) 2722225d46eSJiawei Lin 2732225d46eSJiawei Lin // dcache prefetcher 2742225d46eSJiawei Lin val l2PrefetcherParameters = L2PrefetcherParameters( 2752225d46eSJiawei Lin enable = true, 2762225d46eSJiawei Lin _type = "bop", // "stream" or "bop" 2772225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 2782225d46eSJiawei Lin streamCnt = 4, 2792225d46eSJiawei Lin streamSize = 4, 2802225d46eSJiawei Lin ageWidth = 4, 2812225d46eSJiawei Lin blockBytes = L2BlockSize, 2822225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 2832225d46eSJiawei Lin cacheName = "dcache" 2842225d46eSJiawei Lin ), 2852225d46eSJiawei Lin bopParams = BOPParameters( 2862225d46eSJiawei Lin rrTableEntries = 256, 2872225d46eSJiawei Lin rrTagBits = 12, 2882225d46eSJiawei Lin scoreBits = 5, 2892225d46eSJiawei Lin roundMax = 50, 2902225d46eSJiawei Lin badScore = 1, 2912225d46eSJiawei Lin blockBytes = L2BlockSize, 2922225d46eSJiawei Lin nEntries = dcacheParameters.nMissEntries * 2 // TODO: this is too large 2932225d46eSJiawei Lin ), 2942225d46eSJiawei Lin ) 295de169c67SWilliam Wang 296de169c67SWilliam Wang // load violation predict 297de169c67SWilliam Wang val ResetTimeMax2Pow = 20 //1078576 298de169c67SWilliam Wang val ResetTimeMin2Pow = 10 //1024 299de169c67SWilliam Wang // wait table parameters 300de169c67SWilliam Wang val WaitTableSize = 1024 301de169c67SWilliam Wang val MemPredPCWidth = log2Up(WaitTableSize) 302de169c67SWilliam Wang val LWTUse2BitCounter = true 303de169c67SWilliam Wang // store set parameters 304de169c67SWilliam Wang val SSITSize = WaitTableSize 305de169c67SWilliam Wang val LFSTSize = 32 306de169c67SWilliam Wang val SSIDWidth = log2Up(LFSTSize) 307de169c67SWilliam Wang val LFSTWidth = 4 308de169c67SWilliam Wang val StoreSetEnable = true // LWT will be disabled if SS is enabled 3092225d46eSJiawei Lin 3102225d46eSJiawei Lin val loadExuConfigs = coreParams.loadExuConfigs 3112225d46eSJiawei Lin val storeExuConfigs = coreParams.storeExuConfigs 3122225d46eSJiawei Lin 3132225d46eSJiawei Lin val intExuConfigs = coreParams.intExuConfigs 3142225d46eSJiawei Lin 3152225d46eSJiawei Lin val fpExuConfigs = coreParams.fpExuConfigs 3162225d46eSJiawei Lin 3172225d46eSJiawei Lin val exuConfigs = coreParams.exuConfigs 3189d5a2027SYinan Xu 3192225d46eSJiawei Lin} 320