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} 116e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 126e91cacaSYinan Xuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp, AddressSet} 136e91cacaSYinan Xuimport freechips.rocketchip.tilelink.{TLBundleParameters, TLCacheCork, TLBuffer, TLClientNode, TLIdentityNode, TLXbar, TLWidthWidget, TLFilter, TLToAXI4} 146e91cacaSYinan Xuimport freechips.rocketchip.devices.tilelink.{TLError, DevNullParams} 156e91cacaSYinan Xuimport freechips.rocketchip.amba.axi4.{AXI4ToTL, AXI4IdentityNode, AXI4UserYanker, AXI4Fragmenter, AXI4IdIndexer, AXI4Deinterleaver} 16a428082bSLinJiawei 17a428082bSLinJiaweicase class SoCParameters 18a428082bSLinJiawei( 19f874f036SYinan Xu NumCores: Integer = 1, 20a428082bSLinJiawei EnableILA: Boolean = false, 21a428082bSLinJiawei HasL2Cache: Boolean = false, 22a428082bSLinJiawei HasPrefetch: Boolean = false 23a428082bSLinJiawei) 24006e1884SZihao Yu 257d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{ 263e586e47Slinjiawei val soc = top.Parameters.get.socParameters 27f874f036SYinan Xu val NumCores = soc.NumCores 28a428082bSLinJiawei val EnableILA = soc.EnableILA 29a428082bSLinJiawei val HasL2cache = soc.HasL2Cache 30a428082bSLinJiawei val HasPrefetch = soc.HasPrefetch 31303b861dSZihao Yu} 32303b861dSZihao Yu 331e3fad10SLinJiaweiclass ILABundle extends Bundle {} 34303b861dSZihao Yu 353e586e47Slinjiawei 363e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule { 373e586e47Slinjiawei val mem = TLFuzzer(nOperations = 10) 383e586e47Slinjiawei val mmio = TLFuzzer(nOperations = 10) 393e586e47Slinjiawei 403e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 413e586e47Slinjiawei 423e586e47Slinjiawei } 433e586e47Slinjiawei} 443e586e47Slinjiawei 453e586e47Slinjiawei 463e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 47f874f036SYinan Xu private val cores = Seq.fill(NumCores)(LazyModule(new XSCore())) 483e586e47Slinjiawei 493e586e47Slinjiawei // only mem and extDev visible externally 508825f7bfSYinan Xu val dma = AXI4IdentityNode() 51be5d77a1SAllen val extDev = AXI4IdentityNode() 523e586e47Slinjiawei 536e91cacaSYinan Xu // L2 to L3 network 546e91cacaSYinan Xu // ------------------------------------------------- 556e91cacaSYinan Xu private val l3_xbar = TLXbar() 566e91cacaSYinan Xu 576e91cacaSYinan Xu private val l3_banks = (0 until L3NBanks) map (i => 586e91cacaSYinan Xu LazyModule(new InclusiveCache( 596e91cacaSYinan Xu CacheParameters( 606e91cacaSYinan Xu level = 3, 616e91cacaSYinan Xu ways = L3NWays, 626e91cacaSYinan Xu sets = L3NSets, 636e91cacaSYinan Xu blockBytes = L3BlockSize, 646e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 656e91cacaSYinan Xu cacheName = s"L3_$i" 666e91cacaSYinan Xu ), 676e91cacaSYinan Xu InclusiveCacheMicroParameters( 686e91cacaSYinan Xu writeBytes = 8 696e91cacaSYinan Xu ) 706e91cacaSYinan Xu ))) 716e91cacaSYinan Xu 728825f7bfSYinan Xu cores.foreach(core => l3_xbar := TLBuffer() := DebugIdentityNode() := core.mem) 736e91cacaSYinan Xu 746e91cacaSYinan Xu // DMA should not go to MMIO 756e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 766e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 776e91cacaSYinan Xu // add one here to make it happy. 786e91cacaSYinan Xu val tlErrorParams = DevNullParams( 796e91cacaSYinan Xu address = Seq(mmioRange), 806e91cacaSYinan Xu maxAtomic = 8, 816e91cacaSYinan Xu maxTransfer = 64) 826e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 836e91cacaSYinan Xu private val tlError_xbar = TLXbar() 846e91cacaSYinan Xu tlError_xbar := 856e91cacaSYinan Xu AXI4ToTL() := 866e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 876e91cacaSYinan Xu AXI4Fragmenter() := 886e91cacaSYinan Xu AXI4IdIndexer(1) := 896e91cacaSYinan Xu dma 906e91cacaSYinan Xu tlError.node := tlError_xbar 916e91cacaSYinan Xu 926e91cacaSYinan Xu l3_xbar := 936e91cacaSYinan Xu TLBuffer() := 946e91cacaSYinan Xu DebugIdentityNode() := 956e91cacaSYinan Xu tlError_xbar 966e91cacaSYinan Xu 976e91cacaSYinan Xu def bankFilter(bank: Int) = AddressSet( 986e91cacaSYinan Xu base = bank * L3BlockSize, 996e91cacaSYinan Xu mask = ~BigInt((L3NBanks -1) * L3BlockSize)) 1006e91cacaSYinan Xu 1016e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1026e91cacaSYinan Xu val filter = TLFilter(TLFilter.mSelectIntersect(bankFilter(i))) 1036e91cacaSYinan Xu l3_banks(i).node := TLBuffer() := DebugIdentityNode() := filter := l3_xbar 1046e91cacaSYinan Xu } 1056e91cacaSYinan Xu 1066e91cacaSYinan Xu 1076e91cacaSYinan Xu // L3 to memory network 1086e91cacaSYinan Xu // ------------------------------------------------- 1096e91cacaSYinan Xu private val memory_xbar = TLXbar() 1106e91cacaSYinan Xu 1116e91cacaSYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 1126e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1136e91cacaSYinan Xu mem(i) := 1146e91cacaSYinan Xu AXI4UserYanker() := 1156e91cacaSYinan Xu TLToAXI4() := 1166e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 1176e91cacaSYinan Xu TLCacheCork() := 1186e91cacaSYinan Xu l3_banks(i).node 1196e91cacaSYinan Xu } 1206e91cacaSYinan Xu 1213e586e47Slinjiawei private val mmioXbar = TLXbar() 1223e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1233e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1243e586e47Slinjiawei sim = !env.FPGAPlatform 1253e586e47Slinjiawei )) 1263e586e47Slinjiawei 1278825f7bfSYinan Xu cores.foreach(core => 1281865a66fSlinjiawei mmioXbar := 1291865a66fSlinjiawei TLBuffer() := 1301865a66fSlinjiawei DebugIdentityNode() := 1318825f7bfSYinan Xu core.mmio 1328825f7bfSYinan Xu ) 1331865a66fSlinjiawei 1341865a66fSlinjiawei clint.node := 1351865a66fSlinjiawei mmioXbar 1361865a66fSlinjiawei 1371865a66fSlinjiawei extDev := 138be5d77a1SAllen AXI4UserYanker() := 139be5d77a1SAllen TLToAXI4() := 1401865a66fSlinjiawei mmioXbar 1413e586e47Slinjiawei 1423e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 143006e1884SZihao Yu val io = IO(new Bundle{ 144466eb0a8SZihao Yu val meip = Input(Bool()) 145a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 146006e1884SZihao Yu }) 1478825f7bfSYinan Xu cores.foreach(core => { 1488825f7bfSYinan Xu core.module.io.externalInterrupt.mtip := clint.module.io.mtip 1498825f7bfSYinan Xu core.module.io.externalInterrupt.msip := clint.module.io.msip 1508825f7bfSYinan Xu core.module.io.externalInterrupt.meip := RegNext(RegNext(io.meip)) 1518825f7bfSYinan Xu }) 152*1e1cfa36SAllen // do not let dma AXI signals optimized out 153*1e1cfa36SAllen chisel3.dontTouch(dma.out.head._1) 154*1e1cfa36SAllen chisel3.dontTouch(extDev.out.head._1) 155006e1884SZihao Yu } 1563e586e47Slinjiawei 1573e586e47Slinjiawei} 158