1006e1884SZihao Yupackage system 2006e1884SZihao Yu 33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters 44a26299eSwangkaifanimport device.{AXI4Timer, TLTimer, AXI4Plic} 5006e1884SZihao Yuimport chisel3._ 6096ea47eSzhanglinjuanimport chisel3.util._ 73e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp} 897eae8a0SWang Huizheimport freechips.rocketchip.tilelink.{BankBinder, TLBuffer, TLBundleParameters, TLCacheCork, TLClientNode, TLFilter, TLFuzzer, TLIdentityNode, TLToAXI4, TLWidthWidget, TLXbar} 9279a83c2SAllenimport utils.{DebugIdentityNode, DataDontCareNode} 10737d2306SWang Huizheimport utils.XSInfo 11737d2306SWang Huizheimport xiangshan.{HasXSParameter, XSCore, HasXSLog} 126e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 1397eae8a0SWang Huizheimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp} 1497eae8a0SWang Huizheimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError} 1597eae8a0SWang Huizheimport freechips.rocketchip.amba.axi4.{AXI4Deinterleaver, AXI4Fragmenter, AXI4IdIndexer, AXI4IdentityNode, AXI4ToTL, AXI4UserYanker} 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 { 475d65f258SYinan Xu // CPU Cores 485d65f258SYinan Xu private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore())) 493e586e47Slinjiawei 505d65f258SYinan Xu // L1 to L2 network 515d65f258SYinan Xu // ------------------------------------------------- 525d65f258SYinan Xu private val l2_xbar = Seq.fill(NumCores)(TLXbar()) 535d65f258SYinan Xu 545d65f258SYinan Xu private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache( 555d65f258SYinan Xu CacheParameters( 565d65f258SYinan Xu level = 2, 575d65f258SYinan Xu ways = L2NWays, 585d65f258SYinan Xu sets = L2NSets, 595d65f258SYinan Xu blockBytes = L2BlockSize, 605d65f258SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 615d65f258SYinan Xu cacheName = s"L2" 625d65f258SYinan Xu ), 635d65f258SYinan Xu InclusiveCacheMicroParameters( 64*8d9f4ff7SAllen writeBytes = 32 655d65f258SYinan Xu ) 665d65f258SYinan Xu ))) 673e586e47Slinjiawei 686e91cacaSYinan Xu // L2 to L3 network 696e91cacaSYinan Xu // ------------------------------------------------- 706e91cacaSYinan Xu private val l3_xbar = TLXbar() 716e91cacaSYinan Xu 7297eae8a0SWang Huizhe private val l3_node = LazyModule(new InclusiveCache( 736e91cacaSYinan Xu CacheParameters( 746e91cacaSYinan Xu level = 3, 756e91cacaSYinan Xu ways = L3NWays, 766e91cacaSYinan Xu sets = L3NSets, 776e91cacaSYinan Xu blockBytes = L3BlockSize, 786e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 7997eae8a0SWang Huizhe cacheName = "L3" 806e91cacaSYinan Xu ), 816e91cacaSYinan Xu InclusiveCacheMicroParameters( 82*8d9f4ff7SAllen writeBytes = 32 836e91cacaSYinan Xu ) 8497eae8a0SWang Huizhe )).node 856e91cacaSYinan Xu 865d65f258SYinan Xu // L3 to memory network 875d65f258SYinan Xu // ------------------------------------------------- 885d65f258SYinan Xu private val memory_xbar = TLXbar() 895d65f258SYinan Xu private val mmioXbar = TLXbar() 905d65f258SYinan Xu 915d65f258SYinan Xu // only mem, dma and extDev are visible externally 925d65f258SYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 935d65f258SYinan Xu val dma = AXI4IdentityNode() 945d65f258SYinan Xu val extDev = AXI4IdentityNode() 955d65f258SYinan Xu 965d65f258SYinan Xu // connections 975d65f258SYinan Xu // ------------------------------------------------- 985d65f258SYinan Xu for (i <- 0 until NumCores) { 990cff4510SAllen l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.dcache.clientNode 1005d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode 1015d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node 102189e7a33Szhanglinjuan l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l2Prefetcher.clientNode 1030cff4510SAllen mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.uncache.clientNode 104220f98bbSjinyue110 mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).frontend.instrUncache.clientNode 105279a83c2SAllen l2cache(i).node := DataDontCareNode(a = true, b = true) := TLBuffer() := DebugIdentityNode() := l2_xbar(i) 1065d65f258SYinan Xu l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node 1075d65f258SYinan Xu } 1086e91cacaSYinan Xu 1096e91cacaSYinan Xu // DMA should not go to MMIO 1106e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 1116e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 1126e91cacaSYinan Xu // add one here to make it happy. 1136e91cacaSYinan Xu val tlErrorParams = DevNullParams( 1146e91cacaSYinan Xu address = Seq(mmioRange), 1156e91cacaSYinan Xu maxAtomic = 8, 1166e91cacaSYinan Xu maxTransfer = 64) 1176e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 1186e91cacaSYinan Xu private val tlError_xbar = TLXbar() 1196e91cacaSYinan Xu tlError_xbar := 1206e91cacaSYinan Xu AXI4ToTL() := 1216e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 1226e91cacaSYinan Xu AXI4Fragmenter() := 1236e91cacaSYinan Xu AXI4IdIndexer(1) := 1246e91cacaSYinan Xu dma 1256e91cacaSYinan Xu tlError.node := tlError_xbar 1266e91cacaSYinan Xu 1276e91cacaSYinan Xu l3_xbar := 1286e91cacaSYinan Xu TLBuffer() := 1296e91cacaSYinan Xu DebugIdentityNode() := 1306e91cacaSYinan Xu tlError_xbar 1316e91cacaSYinan Xu 13297eae8a0SWang Huizhe val bankedNode = 13397eae8a0SWang Huizhe BankBinder(L3NBanks, L3BlockSize) :*= l3_node :*= TLBuffer() :*= DebugIdentityNode() :*= l3_xbar 1346e91cacaSYinan Xu 1356e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1366e91cacaSYinan Xu mem(i) := 1376e91cacaSYinan Xu AXI4UserYanker() := 1386e91cacaSYinan Xu TLToAXI4() := 1396e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 1406e91cacaSYinan Xu TLCacheCork() := 14197eae8a0SWang Huizhe bankedNode 1426e91cacaSYinan Xu } 1436e91cacaSYinan Xu 1443e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1453e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1463e586e47Slinjiawei sim = !env.FPGAPlatform 1473e586e47Slinjiawei )) 1483e586e47Slinjiawei 1495d65f258SYinan Xu clint.node := mmioXbar 1505d65f258SYinan Xu extDev := AXI4UserYanker() := TLToAXI4() := mmioXbar 1513e586e47Slinjiawei 1524a26299eSwangkaifan val plic = LazyModule(new AXI4Plic( 1534a26299eSwangkaifan Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 1544a26299eSwangkaifan sim = !env.FPGAPlatform 1554a26299eSwangkaifan )) 1564a26299eSwangkaifan val plicIdentity = AXI4IdentityNode() 1574a26299eSwangkaifan plic.node := plicIdentity := AXI4UserYanker() := TLToAXI4() := mmioXbar 1584a26299eSwangkaifan 1593e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 160006e1884SZihao Yu val io = IO(new Bundle{ 1614a26299eSwangkaifan val extIntrs = Input(Vec(NrExtIntr, Bool())) 1624a26299eSwangkaifan // val meip = Input(Vec(NumCores, Bool())) 163a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 164006e1884SZihao Yu }) 1654a26299eSwangkaifan 1664a26299eSwangkaifan plic.module.io.extra.get.intrVec <> RegNext(RegNext(Cat(io.extIntrs))) 1674a26299eSwangkaifan 1685d65f258SYinan Xu for (i <- 0 until NumCores) { 1690668d426Swangkaifan xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 1700668d426Swangkaifan xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 1714a26299eSwangkaifan // xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip(i))) 1724a26299eSwangkaifan xs_core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 1735d65f258SYinan Xu } 1741e1cfa36SAllen // do not let dma AXI signals optimized out 1751e1cfa36SAllen chisel3.dontTouch(dma.out.head._1) 1761e1cfa36SAllen chisel3.dontTouch(extDev.out.head._1) 177006e1884SZihao Yu } 1783e586e47Slinjiawei 1793e586e47Slinjiawei} 180