1006e1884SZihao Yupackage system 2006e1884SZihao Yu 33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters 40584d3a8SLinJiaweiimport device.{AXI4Plic, AXI4Timer, TLTimer} 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} 90584d3a8SLinJiaweiimport utils.{DataDontCareNode, DebugIdentityNode} 10737d2306SWang Huizheimport utils.XSInfo 110584d3a8SLinJiaweiimport xiangshan.{DifftestBundle, HasXSLog, HasXSParameter, XSBundle, XSCore} 1287b0fcb0Szhanglinjuanimport xiangshan.cache.prefetch._ 136e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 1497eae8a0SWang Huizheimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp} 1597eae8a0SWang Huizheimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError} 1697eae8a0SWang Huizheimport freechips.rocketchip.amba.axi4.{AXI4Deinterleaver, AXI4Fragmenter, AXI4IdIndexer, AXI4IdentityNode, AXI4ToTL, AXI4UserYanker} 170584d3a8SLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode 180584d3a8SLinJiaweiimport freechips.rocketchip.interrupts.{IntSinkNode, IntSinkParameters, IntSinkPortParameters, IntSinkPortSimple} 190584d3a8SLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, BusErrors, L1BusErrors} 20a428082bSLinJiawei 21a428082bSLinJiaweicase class SoCParameters 22a428082bSLinJiawei( 23f874f036SYinan Xu NumCores: Integer = 1, 24a428082bSLinJiawei EnableILA: Boolean = false, 25a428082bSLinJiawei HasL2Cache: Boolean = false, 26a428082bSLinJiawei HasPrefetch: Boolean = false 27a428082bSLinJiawei) 28006e1884SZihao Yu 297d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{ 303e586e47Slinjiawei val soc = top.Parameters.get.socParameters 31f874f036SYinan Xu val NumCores = soc.NumCores 32a428082bSLinJiawei val EnableILA = soc.EnableILA 33a428082bSLinJiawei val HasL2cache = soc.HasL2Cache 34a428082bSLinJiawei val HasPrefetch = soc.HasPrefetch 35303b861dSZihao Yu} 36303b861dSZihao Yu 371e3fad10SLinJiaweiclass ILABundle extends Bundle {} 38303b861dSZihao Yu 393e586e47Slinjiawei 400584d3a8SLinJiaweiclass L1CacheErrorInfo extends XSBundle{ 410584d3a8SLinJiawei val paddr = Valid(UInt(PAddrBits.W)) 420584d3a8SLinJiawei // for now, we only detect ecc 430584d3a8SLinJiawei val ecc_error = Valid(Bool()) 443e586e47Slinjiawei} 453e586e47Slinjiawei 46*9637c0c6SLinJiaweiclass XSL1BusErrors(val nCores: Int) extends BusErrors { 47*9637c0c6SLinJiawei val icache = Vec(nCores, new L1CacheErrorInfo) 48*9637c0c6SLinJiawei val dcache = Vec(nCores, new L1CacheErrorInfo) 49*9637c0c6SLinJiawei 50*9637c0c6SLinJiawei override def toErrorList: List[Option[(ValidIO[UInt], String, String)]] = 51*9637c0c6SLinJiawei List.tabulate(nCores){i => 52*9637c0c6SLinJiawei List( 53*9637c0c6SLinJiawei Some(icache(i).paddr, s"IBUS_$i", s"Icache_$i bus error"), 54*9637c0c6SLinJiawei Some(icache(i).ecc_error, s"I_ECC_$i", s"Icache_$i ecc error"), 55*9637c0c6SLinJiawei Some(dcache(i).paddr, s"DBUS_$i", s"Dcache_$i bus error"), 56*9637c0c6SLinJiawei Some(dcache(i).ecc_error, s"D_ECC_$i", s"Dcache_$i ecc error") 570584d3a8SLinJiawei ) 58*9637c0c6SLinJiawei }.flatten 590584d3a8SLinJiawei} 603e586e47Slinjiawei 613e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 625d65f258SYinan Xu // CPU Cores 635d65f258SYinan Xu private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore())) 643e586e47Slinjiawei 655d65f258SYinan Xu // L1 to L2 network 665d65f258SYinan Xu // ------------------------------------------------- 675d65f258SYinan Xu private val l2_xbar = Seq.fill(NumCores)(TLXbar()) 685d65f258SYinan Xu 695d65f258SYinan Xu private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache( 705d65f258SYinan Xu CacheParameters( 715d65f258SYinan Xu level = 2, 725d65f258SYinan Xu ways = L2NWays, 735d65f258SYinan Xu sets = L2NSets, 745d65f258SYinan Xu blockBytes = L2BlockSize, 755d65f258SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 765d65f258SYinan Xu cacheName = s"L2" 775d65f258SYinan Xu ), 785d65f258SYinan Xu InclusiveCacheMicroParameters( 798d9f4ff7SAllen writeBytes = 32 805d65f258SYinan Xu ) 815d65f258SYinan Xu ))) 823e586e47Slinjiawei 8387b0fcb0Szhanglinjuan private val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher())) 8487b0fcb0Szhanglinjuan 856e91cacaSYinan Xu // L2 to L3 network 866e91cacaSYinan Xu // ------------------------------------------------- 876e91cacaSYinan Xu private val l3_xbar = TLXbar() 886e91cacaSYinan Xu 8997eae8a0SWang Huizhe private val l3_node = LazyModule(new InclusiveCache( 906e91cacaSYinan Xu CacheParameters( 916e91cacaSYinan Xu level = 3, 926e91cacaSYinan Xu ways = L3NWays, 936e91cacaSYinan Xu sets = L3NSets, 946e91cacaSYinan Xu blockBytes = L3BlockSize, 956e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 9697eae8a0SWang Huizhe cacheName = "L3" 976e91cacaSYinan Xu ), 986e91cacaSYinan Xu InclusiveCacheMicroParameters( 998d9f4ff7SAllen writeBytes = 32 1006e91cacaSYinan Xu ) 10197eae8a0SWang Huizhe )).node 1026e91cacaSYinan Xu 1035d65f258SYinan Xu // L3 to memory network 1045d65f258SYinan Xu // ------------------------------------------------- 1055d65f258SYinan Xu private val memory_xbar = TLXbar() 1065d65f258SYinan Xu private val mmioXbar = TLXbar() 1075d65f258SYinan Xu 1085d65f258SYinan Xu // only mem, dma and extDev are visible externally 1095d65f258SYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 1105d65f258SYinan Xu val dma = AXI4IdentityNode() 1115d65f258SYinan Xu val extDev = AXI4IdentityNode() 1125d65f258SYinan Xu 1135d65f258SYinan Xu // connections 1145d65f258SYinan Xu // ------------------------------------------------- 1155d65f258SYinan Xu for (i <- 0 until NumCores) { 1160cff4510SAllen l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.dcache.clientNode 1175d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode 1185d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node 11987b0fcb0Szhanglinjuan l2_xbar(i) := TLBuffer() := DebugIdentityNode() := l2prefetcher(i).clientNode 12087b0fcb0Szhanglinjuan 1210cff4510SAllen mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.uncache.clientNode 122220f98bbSjinyue110 mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).frontend.instrUncache.clientNode 123279a83c2SAllen l2cache(i).node := DataDontCareNode(a = true, b = true) := TLBuffer() := DebugIdentityNode() := l2_xbar(i) 1245d65f258SYinan Xu l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node 1255d65f258SYinan Xu } 1266e91cacaSYinan Xu 1276e91cacaSYinan Xu // DMA should not go to MMIO 1286e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 1296e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 1306e91cacaSYinan Xu // add one here to make it happy. 1316e91cacaSYinan Xu val tlErrorParams = DevNullParams( 1326e91cacaSYinan Xu address = Seq(mmioRange), 1336e91cacaSYinan Xu maxAtomic = 8, 1346e91cacaSYinan Xu maxTransfer = 64) 1356e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 1366e91cacaSYinan Xu private val tlError_xbar = TLXbar() 1376e91cacaSYinan Xu tlError_xbar := 1386e91cacaSYinan Xu AXI4ToTL() := 1396e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 1406e91cacaSYinan Xu AXI4Fragmenter() := 1416e91cacaSYinan Xu AXI4IdIndexer(1) := 1426e91cacaSYinan Xu dma 1436e91cacaSYinan Xu tlError.node := tlError_xbar 1446e91cacaSYinan Xu 1456e91cacaSYinan Xu l3_xbar := 1466e91cacaSYinan Xu TLBuffer() := 1476e91cacaSYinan Xu DebugIdentityNode() := 1486e91cacaSYinan Xu tlError_xbar 1496e91cacaSYinan Xu 15097eae8a0SWang Huizhe val bankedNode = 15197eae8a0SWang Huizhe BankBinder(L3NBanks, L3BlockSize) :*= l3_node :*= TLBuffer() :*= DebugIdentityNode() :*= l3_xbar 1526e91cacaSYinan Xu 1536e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1546e91cacaSYinan Xu mem(i) := 1556e91cacaSYinan Xu AXI4UserYanker() := 1566e91cacaSYinan Xu TLToAXI4() := 1576e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 1586e91cacaSYinan Xu TLCacheCork() := 15997eae8a0SWang Huizhe bankedNode 1606e91cacaSYinan Xu } 1616e91cacaSYinan Xu 1623e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1633e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1643e586e47Slinjiawei sim = !env.FPGAPlatform 1653e586e47Slinjiawei )) 1663e586e47Slinjiawei 1675d65f258SYinan Xu clint.node := mmioXbar 1685d65f258SYinan Xu extDev := AXI4UserYanker() := TLToAXI4() := mmioXbar 1693e586e47Slinjiawei 1700584d3a8SLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 1710584d3a8SLinJiawei 1720584d3a8SLinJiawei val beu = LazyModule( 173*9637c0c6SLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 1740584d3a8SLinJiawei beu.node := mmioXbar 1750584d3a8SLinJiawei 1760584d3a8SLinJiawei class BeuSinkNode()(implicit p: Parameters) extends LazyModule { 1770584d3a8SLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 1780584d3a8SLinJiawei lazy val module = new LazyModuleImp(this){ 1790584d3a8SLinJiawei val interrupt = IO(Output(Bool())) 1800584d3a8SLinJiawei interrupt := intSinkNode.in.head._1.head 1810584d3a8SLinJiawei } 1820584d3a8SLinJiawei } 1830584d3a8SLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 1840584d3a8SLinJiawei beuSink.intSinkNode := beu.intNode 1850584d3a8SLinJiawei 1864a26299eSwangkaifan val plic = LazyModule(new AXI4Plic( 1874a26299eSwangkaifan Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 1884a26299eSwangkaifan sim = !env.FPGAPlatform 1894a26299eSwangkaifan )) 1900584d3a8SLinJiawei plic.node := AXI4UserYanker() := TLToAXI4() := mmioXbar 1914a26299eSwangkaifan 1923e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 193006e1884SZihao Yu val io = IO(new Bundle{ 19484eb3d54SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 1954a26299eSwangkaifan // val meip = Input(Vec(NumCores, Bool())) 196a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 197006e1884SZihao Yu }) 198a165bd69Swangkaifan val difftestIO0 = IO(new DifftestBundle()) 199a165bd69Swangkaifan val difftestIO1 = IO(new DifftestBundle()) 200a165bd69Swangkaifan val difftestIO = Seq(difftestIO0, difftestIO1) 2015f00f642Swangkaifan 2025f00f642Swangkaifan val trapIO0 = IO(new xiangshan.TrapIO()) 2035f00f642Swangkaifan val trapIO1 = IO(new xiangshan.TrapIO()) 2045f00f642Swangkaifan val trapIO = Seq(trapIO0, trapIO1) 2055f00f642Swangkaifan 2060584d3a8SLinJiawei plic.module.io.extra.get.intrVec <> RegNext(beuSink.module.interrupt) 2074a26299eSwangkaifan 2085d65f258SYinan Xu for (i <- 0 until NumCores) { 2097a77cff2SYinan Xu xs_core(i).module.io.hartId := i.U 2100668d426Swangkaifan xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2110668d426Swangkaifan xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 212*9637c0c6SLinJiawei beu.module.io.errors.icache(i) := xs_core(i).module.io.icache_error 213*9637c0c6SLinJiawei beu.module.io.errors.dcache(i) := xs_core(i).module.io.dcache_error 2144a26299eSwangkaifan // xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip(i))) 2154a26299eSwangkaifan xs_core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 21692a86cc7Sljw l2prefetcher(i).module.io.enable := RegNext(xs_core(i).module.io.l2_pf_enable) 21721377543Szhanglinjuan l2prefetcher(i).module.io.in <> l2cache(i).module.io 2185d65f258SYinan Xu } 21921377543Szhanglinjuan 220a165bd69Swangkaifan difftestIO0 <> xs_core(0).module.difftestIO 2213d499721Swangkaifan difftestIO1 <> DontCare 2225f00f642Swangkaifan trapIO0 <> xs_core(0).module.trapIO 2233d499721Swangkaifan trapIO1 <> DontCare 2243d499721Swangkaifan 2253d499721Swangkaifan if (env.DualCore) { 2263d499721Swangkaifan difftestIO1 <> xs_core(1).module.difftestIO 2275f00f642Swangkaifan trapIO1 <> xs_core(1).module.trapIO 228a165bd69Swangkaifan } 2291e1cfa36SAllen // do not let dma AXI signals optimized out 23084eb3d54SYinan Xu dontTouch(dma.out.head._1) 23184eb3d54SYinan Xu dontTouch(extDev.out.head._1) 23284eb3d54SYinan Xu dontTouch(io.extIntrs) 233006e1884SZihao Yu } 2343e586e47Slinjiawei 2353e586e47Slinjiawei} 236