1*2225d46eSJiawei Linpackage xiangshan 2*2225d46eSJiawei Lin 3*2225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Field, Parameters} 4*2225d46eSJiawei Linimport chisel3._ 5*2225d46eSJiawei Linimport chisel3.util._ 6*2225d46eSJiawei Linimport xiangshan.backend.exu._ 7*2225d46eSJiawei Linimport xiangshan.backend.fu._ 8*2225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 9*2225d46eSJiawei Linimport xiangshan.backend.dispatch.DispatchParameters 10*2225d46eSJiawei Linimport xiangshan.cache.{DCacheParameters, ICacheParameters, L1plusCacheParameters} 11*2225d46eSJiawei Linimport xiangshan.cache.prefetch.{BOPParameters, L1plusPrefetcherParameters, L2PrefetcherParameters, StreamPrefetchParameters} 12*2225d46eSJiawei Lin 13*2225d46eSJiawei Lincase object XSCoreParamsKey extends Field[XSCoreParameters] 14*2225d46eSJiawei Lin 15*2225d46eSJiawei Lincase class XSCoreParameters 16*2225d46eSJiawei Lin( 17*2225d46eSJiawei Lin HasL2Cache: Boolean = false, 18*2225d46eSJiawei Lin HasPrefetch: Boolean = false, 19*2225d46eSJiawei Lin HartId: Int = 0, 20*2225d46eSJiawei Lin XLEN: Int = 64, 21*2225d46eSJiawei Lin HasMExtension: Boolean = true, 22*2225d46eSJiawei Lin HasCExtension: Boolean = true, 23*2225d46eSJiawei Lin HasDiv: Boolean = true, 24*2225d46eSJiawei Lin HasICache: Boolean = true, 25*2225d46eSJiawei Lin HasDCache: Boolean = true, 26*2225d46eSJiawei Lin EnableStoreQueue: Boolean = true, 27*2225d46eSJiawei Lin AddrBits: Int = 64, 28*2225d46eSJiawei Lin VAddrBits: Int = 39, 29*2225d46eSJiawei Lin PAddrBits: Int = 40, 30*2225d46eSJiawei Lin HasFPU: Boolean = true, 31*2225d46eSJiawei Lin FetchWidth: Int = 8, 32*2225d46eSJiawei Lin EnableBPU: Boolean = true, 33*2225d46eSJiawei Lin EnableBPD: Boolean = true, 34*2225d46eSJiawei Lin EnableRAS: Boolean = true, 35*2225d46eSJiawei Lin EnableLB: Boolean = false, 36*2225d46eSJiawei Lin EnableLoop: Boolean = true, 37*2225d46eSJiawei Lin EnableSC: Boolean = true, 38*2225d46eSJiawei Lin EnbaleTlbDebug: Boolean = false, 39*2225d46eSJiawei Lin EnableJal: Boolean = false, 40*2225d46eSJiawei Lin EnableUBTB: Boolean = true, 41*2225d46eSJiawei Lin HistoryLength: Int = 64, 42*2225d46eSJiawei Lin BtbSize: Int = 2048, 43*2225d46eSJiawei Lin JbtacSize: Int = 1024, 44*2225d46eSJiawei Lin JbtacBanks: Int = 8, 45*2225d46eSJiawei Lin RasSize: Int = 16, 46*2225d46eSJiawei Lin CacheLineSize: Int = 512, 47*2225d46eSJiawei Lin UBtbWays: Int = 16, 48*2225d46eSJiawei Lin BtbWays: Int = 2, 49*2225d46eSJiawei Lin 50*2225d46eSJiawei Lin EnableL1plusPrefetcher: Boolean = true, 51*2225d46eSJiawei Lin IBufSize: Int = 48, 52*2225d46eSJiawei Lin DecodeWidth: Int = 6, 53*2225d46eSJiawei Lin RenameWidth: Int = 6, 54*2225d46eSJiawei Lin CommitWidth: Int = 6, 55*2225d46eSJiawei Lin BrqSize: Int = 32, 56*2225d46eSJiawei Lin FtqSize: Int = 48, 57*2225d46eSJiawei Lin EnableLoadFastWakeUp: Boolean = true, // NOTE: not supported now, make it false 58*2225d46eSJiawei Lin IssQueSize: Int = 16, 59*2225d46eSJiawei Lin NRPhyRegs: Int = 160, 60*2225d46eSJiawei Lin NRIntReadPorts: Int = 14, 61*2225d46eSJiawei Lin NRIntWritePorts: Int = 8, 62*2225d46eSJiawei Lin NRFpReadPorts: Int = 14, 63*2225d46eSJiawei Lin NRFpWritePorts: Int = 8, 64*2225d46eSJiawei Lin LoadQueueSize: Int = 64, 65*2225d46eSJiawei Lin StoreQueueSize: Int = 48, 66*2225d46eSJiawei Lin RoqSize: Int = 192, 67*2225d46eSJiawei Lin dpParams: DispatchParameters = DispatchParameters( 68*2225d46eSJiawei Lin IntDqSize = 16, 69*2225d46eSJiawei Lin FpDqSize = 16, 70*2225d46eSJiawei Lin LsDqSize = 16, 71*2225d46eSJiawei Lin IntDqDeqWidth = 4, 72*2225d46eSJiawei Lin FpDqDeqWidth = 4, 73*2225d46eSJiawei Lin LsDqDeqWidth = 4 74*2225d46eSJiawei Lin ), 75*2225d46eSJiawei Lin exuParameters: ExuParameters = ExuParameters( 76*2225d46eSJiawei Lin JmpCnt = 1, 77*2225d46eSJiawei Lin AluCnt = 4, 78*2225d46eSJiawei Lin MulCnt = 0, 79*2225d46eSJiawei Lin MduCnt = 2, 80*2225d46eSJiawei Lin FmacCnt = 4, 81*2225d46eSJiawei Lin FmiscCnt = 2, 82*2225d46eSJiawei Lin FmiscDivSqrtCnt = 0, 83*2225d46eSJiawei Lin LduCnt = 2, 84*2225d46eSJiawei Lin StuCnt = 2 85*2225d46eSJiawei Lin ), 86*2225d46eSJiawei Lin LoadPipelineWidth: Int = 2, 87*2225d46eSJiawei Lin StorePipelineWidth: Int = 2, 88*2225d46eSJiawei Lin StoreBufferSize: Int = 16, 89*2225d46eSJiawei Lin RefillSize: Int = 512, 90*2225d46eSJiawei Lin TlbEntrySize: Int = 32, 91*2225d46eSJiawei Lin TlbSPEntrySize: Int = 4, 92*2225d46eSJiawei Lin PtwL3EntrySize: Int = 4096, //(256 * 16) or 512 93*2225d46eSJiawei Lin PtwSPEntrySize: Int = 16, 94*2225d46eSJiawei Lin PtwL1EntrySize: Int = 16, 95*2225d46eSJiawei Lin PtwL2EntrySize: Int = 2048, //(256 * 8) 96*2225d46eSJiawei Lin NumPerfCounters: Int = 16, 97*2225d46eSJiawei Lin){ 98*2225d46eSJiawei Lin val loadExuConfigs = Seq.fill(exuParameters.LduCnt)(LdExeUnitCfg) 99*2225d46eSJiawei Lin val storeExuConfigs = Seq.fill(exuParameters.StuCnt)(StExeUnitCfg) 100*2225d46eSJiawei Lin 101*2225d46eSJiawei Lin val intExuConfigs = JumpExeUnitCfg +: ( 102*2225d46eSJiawei Lin Seq.fill(exuParameters.MduCnt)(MulDivExeUnitCfg) ++ 103*2225d46eSJiawei Lin Seq.fill(exuParameters.AluCnt)(AluExeUnitCfg) 104*2225d46eSJiawei Lin ) 105*2225d46eSJiawei Lin 106*2225d46eSJiawei Lin val fpExuConfigs = 107*2225d46eSJiawei Lin Seq.fill(exuParameters.FmacCnt)(FmacExeUnitCfg) ++ 108*2225d46eSJiawei Lin Seq.fill(exuParameters.FmiscCnt)(FmiscExeUnitCfg) 109*2225d46eSJiawei Lin 110*2225d46eSJiawei Lin val exuConfigs: Seq[ExuConfig] = intExuConfigs ++ fpExuConfigs ++ loadExuConfigs ++ storeExuConfigs 111*2225d46eSJiawei Lin} 112*2225d46eSJiawei Lin 113*2225d46eSJiawei Lincase object DebugOptionsKey extends Field[DebugOptions] 114*2225d46eSJiawei Lin 115*2225d46eSJiawei Lincase class DebugOptions 116*2225d46eSJiawei Lin( 117*2225d46eSJiawei Lin FPGAPlatform: Boolean = true, 118*2225d46eSJiawei Lin EnableDebug: Boolean = false, 119*2225d46eSJiawei Lin EnablePerfDebug: Boolean = true, 120*2225d46eSJiawei Lin UseDRAMSim: Boolean = false 121*2225d46eSJiawei Lin) 122*2225d46eSJiawei Lin 123*2225d46eSJiawei Lintrait HasXSParameter { 124*2225d46eSJiawei Lin 125*2225d46eSJiawei Lin implicit val p: Parameters 126*2225d46eSJiawei Lin 127*2225d46eSJiawei Lin val coreParams = p(XSCoreParamsKey) 128*2225d46eSJiawei Lin val env = p(DebugOptionsKey) 129*2225d46eSJiawei Lin 130*2225d46eSJiawei Lin val XLEN = coreParams.XLEN 131*2225d46eSJiawei Lin val hardId = coreParams.HartId 132*2225d46eSJiawei Lin val minFLen = 32 133*2225d46eSJiawei Lin val fLen = 64 134*2225d46eSJiawei Lin def xLen = XLEN 135*2225d46eSJiawei Lin 136*2225d46eSJiawei Lin val HasMExtension = coreParams.HasMExtension 137*2225d46eSJiawei Lin val HasCExtension = coreParams.HasCExtension 138*2225d46eSJiawei Lin val HasDiv = coreParams.HasDiv 139*2225d46eSJiawei Lin val HasIcache = coreParams.HasICache 140*2225d46eSJiawei Lin val HasDcache = coreParams.HasDCache 141*2225d46eSJiawei Lin val EnableStoreQueue = coreParams.EnableStoreQueue 142*2225d46eSJiawei Lin val AddrBits = coreParams.AddrBits // AddrBits is used in some cases 143*2225d46eSJiawei Lin val VAddrBits = coreParams.VAddrBits // VAddrBits is Virtual Memory addr bits 144*2225d46eSJiawei Lin val PAddrBits = coreParams.PAddrBits // PAddrBits is Phyical Memory addr bits 145*2225d46eSJiawei Lin val AddrBytes = AddrBits / 8 // unused 146*2225d46eSJiawei Lin val DataBits = XLEN 147*2225d46eSJiawei Lin val DataBytes = DataBits / 8 148*2225d46eSJiawei Lin val HasFPU = coreParams.HasFPU 149*2225d46eSJiawei Lin val FetchWidth = coreParams.FetchWidth 150*2225d46eSJiawei Lin val PredictWidth = FetchWidth * (if (HasCExtension) 2 else 1) 151*2225d46eSJiawei Lin val EnableBPU = coreParams.EnableBPU 152*2225d46eSJiawei Lin val EnableBPD = coreParams.EnableBPD // enable backing predictor(like Tage) in BPUStage3 153*2225d46eSJiawei Lin val EnableRAS = coreParams.EnableRAS 154*2225d46eSJiawei Lin val EnableLB = coreParams.EnableLB 155*2225d46eSJiawei Lin val EnableLoop = coreParams.EnableLoop 156*2225d46eSJiawei Lin val EnableSC = coreParams.EnableSC 157*2225d46eSJiawei Lin val EnbaleTlbDebug = coreParams.EnbaleTlbDebug 158*2225d46eSJiawei Lin val HistoryLength = coreParams.HistoryLength 159*2225d46eSJiawei Lin val BtbSize = coreParams.BtbSize 160*2225d46eSJiawei Lin // val BtbWays = 4 161*2225d46eSJiawei Lin val BtbBanks = PredictWidth 162*2225d46eSJiawei Lin // val BtbSets = BtbSize / BtbWays 163*2225d46eSJiawei Lin val JbtacSize = coreParams.JbtacSize 164*2225d46eSJiawei Lin val JbtacBanks = coreParams.JbtacBanks 165*2225d46eSJiawei Lin val RasSize = coreParams.RasSize 166*2225d46eSJiawei Lin val CacheLineSize = coreParams.CacheLineSize 167*2225d46eSJiawei Lin val CacheLineHalfWord = CacheLineSize / 16 168*2225d46eSJiawei Lin val ExtHistoryLength = HistoryLength + 64 169*2225d46eSJiawei Lin val UBtbWays = coreParams.UBtbWays 170*2225d46eSJiawei Lin val BtbWays = coreParams.BtbWays 171*2225d46eSJiawei Lin val EnableL1plusPrefetcher = coreParams.EnableL1plusPrefetcher 172*2225d46eSJiawei Lin val IBufSize = coreParams.IBufSize 173*2225d46eSJiawei Lin val DecodeWidth = coreParams.DecodeWidth 174*2225d46eSJiawei Lin val RenameWidth = coreParams.RenameWidth 175*2225d46eSJiawei Lin val CommitWidth = coreParams.CommitWidth 176*2225d46eSJiawei Lin val BrqSize = coreParams.BrqSize 177*2225d46eSJiawei Lin val FtqSize = coreParams.FtqSize 178*2225d46eSJiawei Lin val IssQueSize = coreParams.IssQueSize 179*2225d46eSJiawei Lin val EnableLoadFastWakeUp = coreParams.EnableLoadFastWakeUp 180*2225d46eSJiawei Lin val BrTagWidth = log2Up(BrqSize) 181*2225d46eSJiawei Lin val NRPhyRegs = coreParams.NRPhyRegs 182*2225d46eSJiawei Lin val PhyRegIdxWidth = log2Up(NRPhyRegs) 183*2225d46eSJiawei Lin val RoqSize = coreParams.RoqSize 184*2225d46eSJiawei Lin val LoadQueueSize = coreParams.LoadQueueSize 185*2225d46eSJiawei Lin val StoreQueueSize = coreParams.StoreQueueSize 186*2225d46eSJiawei Lin val dpParams = coreParams.dpParams 187*2225d46eSJiawei Lin val exuParameters = coreParams.exuParameters 188*2225d46eSJiawei Lin val NRIntReadPorts = coreParams.NRIntReadPorts 189*2225d46eSJiawei Lin val NRIntWritePorts = coreParams.NRIntWritePorts 190*2225d46eSJiawei Lin val NRMemReadPorts = exuParameters.LduCnt + 2 * exuParameters.StuCnt 191*2225d46eSJiawei Lin val NRFpReadPorts = coreParams.NRFpReadPorts 192*2225d46eSJiawei Lin val NRFpWritePorts = coreParams.NRFpWritePorts 193*2225d46eSJiawei Lin val LoadPipelineWidth = coreParams.LoadPipelineWidth 194*2225d46eSJiawei Lin val StorePipelineWidth = coreParams.StorePipelineWidth 195*2225d46eSJiawei Lin val StoreBufferSize = coreParams.StoreBufferSize 196*2225d46eSJiawei Lin val RefillSize = coreParams.RefillSize 197*2225d46eSJiawei Lin val DTLBWidth = coreParams.LoadPipelineWidth + coreParams.StorePipelineWidth 198*2225d46eSJiawei Lin val TlbEntrySize = coreParams.TlbEntrySize 199*2225d46eSJiawei Lin val TlbSPEntrySize = coreParams.TlbSPEntrySize 200*2225d46eSJiawei Lin val PtwL3EntrySize = coreParams.PtwL3EntrySize 201*2225d46eSJiawei Lin val PtwSPEntrySize = coreParams.PtwSPEntrySize 202*2225d46eSJiawei Lin val PtwL1EntrySize = coreParams.PtwL1EntrySize 203*2225d46eSJiawei Lin val PtwL2EntrySize = coreParams.PtwL2EntrySize 204*2225d46eSJiawei Lin val NumPerfCounters = coreParams.NumPerfCounters 205*2225d46eSJiawei Lin 206*2225d46eSJiawei Lin val instBytes = if (HasCExtension) 2 else 4 207*2225d46eSJiawei Lin val instOffsetBits = log2Ceil(instBytes) 208*2225d46eSJiawei Lin 209*2225d46eSJiawei Lin val icacheParameters = ICacheParameters( 210*2225d46eSJiawei Lin tagECC = Some("parity"), 211*2225d46eSJiawei Lin dataECC = Some("parity"), 212*2225d46eSJiawei Lin replacer = Some("setplru"), 213*2225d46eSJiawei Lin nMissEntries = 2 214*2225d46eSJiawei Lin ) 215*2225d46eSJiawei Lin 216*2225d46eSJiawei Lin val l1plusCacheParameters = L1plusCacheParameters( 217*2225d46eSJiawei Lin tagECC = Some("secded"), 218*2225d46eSJiawei Lin dataECC = Some("secded"), 219*2225d46eSJiawei Lin replacer = Some("setplru"), 220*2225d46eSJiawei Lin nMissEntries = 8 221*2225d46eSJiawei Lin ) 222*2225d46eSJiawei Lin 223*2225d46eSJiawei Lin val dcacheParameters = DCacheParameters( 224*2225d46eSJiawei Lin tagECC = Some("secded"), 225*2225d46eSJiawei Lin dataECC = Some("secded"), 226*2225d46eSJiawei Lin replacer = Some("setplru"), 227*2225d46eSJiawei Lin nMissEntries = 16, 228*2225d46eSJiawei Lin nProbeEntries = 16, 229*2225d46eSJiawei Lin nReleaseEntries = 16, 230*2225d46eSJiawei Lin nStoreReplayEntries = 16 231*2225d46eSJiawei Lin ) 232*2225d46eSJiawei Lin 233*2225d46eSJiawei Lin val LRSCCycles = 100 234*2225d46eSJiawei Lin 235*2225d46eSJiawei Lin 236*2225d46eSJiawei Lin // cache hierarchy configurations 237*2225d46eSJiawei Lin val l1BusDataWidth = 256 238*2225d46eSJiawei Lin 239*2225d46eSJiawei Lin // L2 configurations 240*2225d46eSJiawei Lin val L1BusWidth = 256 241*2225d46eSJiawei Lin val L2Size = 512 * 1024 // 512KB 242*2225d46eSJiawei Lin val L2BlockSize = 64 243*2225d46eSJiawei Lin val L2NWays = 8 244*2225d46eSJiawei Lin val L2NSets = L2Size / L2BlockSize / L2NWays 245*2225d46eSJiawei Lin 246*2225d46eSJiawei Lin // L3 configurations 247*2225d46eSJiawei Lin val L2BusWidth = 256 248*2225d46eSJiawei Lin 249*2225d46eSJiawei Lin // icache prefetcher 250*2225d46eSJiawei Lin val l1plusPrefetcherParameters = L1plusPrefetcherParameters( 251*2225d46eSJiawei Lin enable = true, 252*2225d46eSJiawei Lin _type = "stream", 253*2225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 254*2225d46eSJiawei Lin streamCnt = 2, 255*2225d46eSJiawei Lin streamSize = 4, 256*2225d46eSJiawei Lin ageWidth = 4, 257*2225d46eSJiawei Lin blockBytes = l1plusCacheParameters.blockBytes, 258*2225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 259*2225d46eSJiawei Lin cacheName = "icache" 260*2225d46eSJiawei Lin ) 261*2225d46eSJiawei Lin ) 262*2225d46eSJiawei Lin 263*2225d46eSJiawei Lin // dcache prefetcher 264*2225d46eSJiawei Lin val l2PrefetcherParameters = L2PrefetcherParameters( 265*2225d46eSJiawei Lin enable = true, 266*2225d46eSJiawei Lin _type = "bop", // "stream" or "bop" 267*2225d46eSJiawei Lin streamParams = StreamPrefetchParameters( 268*2225d46eSJiawei Lin streamCnt = 4, 269*2225d46eSJiawei Lin streamSize = 4, 270*2225d46eSJiawei Lin ageWidth = 4, 271*2225d46eSJiawei Lin blockBytes = L2BlockSize, 272*2225d46eSJiawei Lin reallocStreamOnMissInstantly = true, 273*2225d46eSJiawei Lin cacheName = "dcache" 274*2225d46eSJiawei Lin ), 275*2225d46eSJiawei Lin bopParams = BOPParameters( 276*2225d46eSJiawei Lin rrTableEntries = 256, 277*2225d46eSJiawei Lin rrTagBits = 12, 278*2225d46eSJiawei Lin scoreBits = 5, 279*2225d46eSJiawei Lin roundMax = 50, 280*2225d46eSJiawei Lin badScore = 1, 281*2225d46eSJiawei Lin blockBytes = L2BlockSize, 282*2225d46eSJiawei Lin nEntries = dcacheParameters.nMissEntries * 2 // TODO: this is too large 283*2225d46eSJiawei Lin ), 284*2225d46eSJiawei Lin ) 285*2225d46eSJiawei Lin 286*2225d46eSJiawei Lin val loadExuConfigs = coreParams.loadExuConfigs 287*2225d46eSJiawei Lin val storeExuConfigs = coreParams.storeExuConfigs 288*2225d46eSJiawei Lin 289*2225d46eSJiawei Lin val intExuConfigs = coreParams.intExuConfigs 290*2225d46eSJiawei Lin 291*2225d46eSJiawei Lin val fpExuConfigs = coreParams.fpExuConfigs 292*2225d46eSJiawei Lin 293*2225d46eSJiawei Lin val exuConfigs = coreParams.exuConfigs 294*2225d46eSJiawei Lin} 295