1006e1884SZihao Yupackage system 2006e1884SZihao Yu 33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters 43e586e47Slinjiaweiimport device.{AXI4Timer, TLTimer} 5006e1884SZihao Yuimport chisel3._ 6096ea47eSzhanglinjuanimport chisel3.util._ 73e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp} 81865a66fSlinjiaweiimport freechips.rocketchip.tilelink.{TLBuffer, TLFuzzer, TLIdentityNode, TLXbar} 91865a66fSlinjiaweiimport utils.DebugIdentityNode 107d5ddbe6SLinJiaweiimport xiangshan.{HasXSParameter, XSCore} 11*6e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 12*6e91cacaSYinan Xuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp, AddressSet} 13*6e91cacaSYinan Xuimport freechips.rocketchip.tilelink.{TLBundleParameters, TLCacheCork, TLBuffer, TLClientNode, TLIdentityNode, TLXbar, TLWidthWidget, TLFilter, TLToAXI4} 14*6e91cacaSYinan Xuimport freechips.rocketchip.devices.tilelink.{TLError, DevNullParams} 15*6e91cacaSYinan Xuimport freechips.rocketchip.amba.axi4.{AXI4ToTL, AXI4IdentityNode, AXI4UserYanker, AXI4Fragmenter, AXI4IdIndexer, AXI4Deinterleaver} 16a428082bSLinJiawei 17a428082bSLinJiaweicase class SoCParameters 18a428082bSLinJiawei( 19a428082bSLinJiawei EnableILA: Boolean = false, 20a428082bSLinJiawei HasL2Cache: Boolean = false, 21a428082bSLinJiawei HasPrefetch: Boolean = false 22a428082bSLinJiawei) 23006e1884SZihao Yu 247d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{ 253e586e47Slinjiawei val soc = top.Parameters.get.socParameters 26a428082bSLinJiawei val EnableILA = soc.EnableILA 27a428082bSLinJiawei val HasL2cache = soc.HasL2Cache 28a428082bSLinJiawei val HasPrefetch = soc.HasPrefetch 29303b861dSZihao Yu} 30303b861dSZihao Yu 311e3fad10SLinJiaweiclass ILABundle extends Bundle {} 32303b861dSZihao Yu 333e586e47Slinjiawei 343e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule { 353e586e47Slinjiawei val mem = TLFuzzer(nOperations = 10) 363e586e47Slinjiawei val mmio = TLFuzzer(nOperations = 10) 373e586e47Slinjiawei 383e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 393e586e47Slinjiawei 403e586e47Slinjiawei } 413e586e47Slinjiawei} 423e586e47Slinjiawei 433e586e47Slinjiawei 443e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 453e586e47Slinjiawei 46222e17e5Slinjiawei private val xsCore = LazyModule(new XSCore()) 473e586e47Slinjiawei 483e586e47Slinjiawei // only mem and extDev visible externally 49*6e91cacaSYinan Xu val cores = xsCore.mem 50d709d2f8SAllen val dma = xsCore.dma 513e586e47Slinjiawei val extDev = TLIdentityNode() 523e586e47Slinjiawei 53*6e91cacaSYinan Xu // L2 to L3 network 54*6e91cacaSYinan Xu // ------------------------------------------------- 55*6e91cacaSYinan Xu private val l3_xbar = TLXbar() 56*6e91cacaSYinan Xu 57*6e91cacaSYinan Xu private val l3_banks = (0 until L3NBanks) map (i => 58*6e91cacaSYinan Xu LazyModule(new InclusiveCache( 59*6e91cacaSYinan Xu CacheParameters( 60*6e91cacaSYinan Xu level = 3, 61*6e91cacaSYinan Xu ways = L3NWays, 62*6e91cacaSYinan Xu sets = L3NSets, 63*6e91cacaSYinan Xu blockBytes = L3BlockSize, 64*6e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 65*6e91cacaSYinan Xu cacheName = s"L3_$i" 66*6e91cacaSYinan Xu ), 67*6e91cacaSYinan Xu InclusiveCacheMicroParameters( 68*6e91cacaSYinan Xu writeBytes = 8 69*6e91cacaSYinan Xu ) 70*6e91cacaSYinan Xu ))) 71*6e91cacaSYinan Xu 72*6e91cacaSYinan Xu l3_xbar := TLBuffer() := DebugIdentityNode() := cores 73*6e91cacaSYinan Xu 74*6e91cacaSYinan Xu // DMA should not go to MMIO 75*6e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 76*6e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 77*6e91cacaSYinan Xu // add one here to make it happy. 78*6e91cacaSYinan Xu val tlErrorParams = DevNullParams( 79*6e91cacaSYinan Xu address = Seq(mmioRange), 80*6e91cacaSYinan Xu maxAtomic = 8, 81*6e91cacaSYinan Xu maxTransfer = 64) 82*6e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 83*6e91cacaSYinan Xu private val tlError_xbar = TLXbar() 84*6e91cacaSYinan Xu tlError_xbar := 85*6e91cacaSYinan Xu AXI4ToTL() := 86*6e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 87*6e91cacaSYinan Xu AXI4Fragmenter() := 88*6e91cacaSYinan Xu AXI4IdIndexer(1) := 89*6e91cacaSYinan Xu dma 90*6e91cacaSYinan Xu tlError.node := tlError_xbar 91*6e91cacaSYinan Xu 92*6e91cacaSYinan Xu l3_xbar := 93*6e91cacaSYinan Xu TLBuffer() := 94*6e91cacaSYinan Xu DebugIdentityNode() := 95*6e91cacaSYinan Xu tlError_xbar 96*6e91cacaSYinan Xu 97*6e91cacaSYinan Xu def bankFilter(bank: Int) = AddressSet( 98*6e91cacaSYinan Xu base = bank * L3BlockSize, 99*6e91cacaSYinan Xu mask = ~BigInt((L3NBanks -1) * L3BlockSize)) 100*6e91cacaSYinan Xu 101*6e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 102*6e91cacaSYinan Xu val filter = TLFilter(TLFilter.mSelectIntersect(bankFilter(i))) 103*6e91cacaSYinan Xu l3_banks(i).node := TLBuffer() := DebugIdentityNode() := filter := l3_xbar 104*6e91cacaSYinan Xu } 105*6e91cacaSYinan Xu 106*6e91cacaSYinan Xu 107*6e91cacaSYinan Xu // L3 to memory network 108*6e91cacaSYinan Xu // ------------------------------------------------- 109*6e91cacaSYinan Xu private val memory_xbar = TLXbar() 110*6e91cacaSYinan Xu 111*6e91cacaSYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 112*6e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 113*6e91cacaSYinan Xu mem(i) := 114*6e91cacaSYinan Xu AXI4UserYanker() := 115*6e91cacaSYinan Xu TLToAXI4() := 116*6e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 117*6e91cacaSYinan Xu TLCacheCork() := 118*6e91cacaSYinan Xu l3_banks(i).node 119*6e91cacaSYinan Xu } 120*6e91cacaSYinan Xu 1213e586e47Slinjiawei private val mmioXbar = TLXbar() 1223e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1233e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1243e586e47Slinjiawei sim = !env.FPGAPlatform 1253e586e47Slinjiawei )) 1263e586e47Slinjiawei 1271865a66fSlinjiawei mmioXbar := 1281865a66fSlinjiawei TLBuffer() := 1291865a66fSlinjiawei DebugIdentityNode() := 1301865a66fSlinjiawei xsCore.mmio 1311865a66fSlinjiawei 1321865a66fSlinjiawei clint.node := 1331865a66fSlinjiawei mmioXbar 1341865a66fSlinjiawei 1351865a66fSlinjiawei extDev := 1361865a66fSlinjiawei mmioXbar 1373e586e47Slinjiawei 1383e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 139006e1884SZihao Yu val io = IO(new Bundle{ 140466eb0a8SZihao Yu val meip = Input(Bool()) 141a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 142006e1884SZihao Yu }) 14335bfeecbSYinan Xu xsCore.module.io.externalInterrupt.mtip := clint.module.io.mtip 14435bfeecbSYinan Xu xsCore.module.io.externalInterrupt.msip := clint.module.io.msip 14535bfeecbSYinan Xu xsCore.module.io.externalInterrupt.meip := RegNext(RegNext(io.meip)) 146006e1884SZihao Yu } 1473e586e47Slinjiawei 1483e586e47Slinjiawei} 1493e586e47Slinjiawei 1503e586e47Slinjiawei 1513e586e47Slinjiawei//class XSSoc extends Module with HasSoCParameter { 1523e586e47Slinjiawei// val io = IO(new Bundle{ 1533e586e47Slinjiawei// val mem = new TLCached(l1BusParams) 1543e586e47Slinjiawei// val mmio = new TLCached(l1BusParams) 1553e586e47Slinjiawei// val frontend = Flipped(new AXI4) //TODO: do we need it ? 1563e586e47Slinjiawei// val meip = Input(Bool()) 1573e586e47Slinjiawei// val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 1583e586e47Slinjiawei// }) 1593e586e47Slinjiawei// 1603e586e47Slinjiawei// val xsCore = Module(new XSCore) 1613e586e47Slinjiawei// 1623e586e47Slinjiawei// io.frontend <> DontCare 1633e586e47Slinjiawei// 1643e586e47Slinjiawei// io.mem <> xsCore.io.mem 1653e586e47Slinjiawei// 1663e586e47Slinjiawei// val addrSpace = List( 1673e586e47Slinjiawei// (0x40000000L, 0x40000000L), // external devices 1683e586e47Slinjiawei// (0x38000000L, 0x00010000L) // CLINT 1693e586e47Slinjiawei// ) 1703e586e47Slinjiawei// val mmioXbar = Module(new NaiveTL1toN(addrSpace, xsCore.io.mem.params)) 1713e586e47Slinjiawei// mmioXbar.io.in <> xsCore.io.mmio 1723e586e47Slinjiawei// 1733e586e47Slinjiawei// val extDev = mmioXbar.io.out(0) 1743e586e47Slinjiawei// val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform)) 1753e586e47Slinjiawei// clint.io.in <> AXI4ToAXI4Lite(MMIOTLToAXI4(mmioXbar.io.out(1))) 1763e586e47Slinjiawei// 1773e586e47Slinjiawei// io.mmio <> extDev 1783e586e47Slinjiawei// 1793e586e47Slinjiawei// val mtipSync = clint.io.extra.get.mtip 1803e586e47Slinjiawei// val meipSync = RegNext(RegNext(io.meip)) 1813e586e47Slinjiawei// ExcitingUtils.addSource(mtipSync, "mtip") 1823e586e47Slinjiawei// ExcitingUtils.addSource(meipSync, "meip") 1833e586e47Slinjiawei//} 184