1006e1884SZihao Yupackage system 2006e1884SZihao Yu 33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters 4*0584d3a8SLinJiaweiimport 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} 9*0584d3a8SLinJiaweiimport utils.{DataDontCareNode, DebugIdentityNode} 10737d2306SWang Huizheimport utils.XSInfo 11*0584d3a8SLinJiaweiimport 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} 17*0584d3a8SLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode 18*0584d3a8SLinJiaweiimport freechips.rocketchip.interrupts.{IntSinkNode, IntSinkParameters, IntSinkPortParameters, IntSinkPortSimple} 19*0584d3a8SLinJiaweiimport 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 40*0584d3a8SLinJiaweiclass L1CacheErrorInfo extends XSBundle{ 41*0584d3a8SLinJiawei val paddr = Valid(UInt(PAddrBits.W)) 42*0584d3a8SLinJiawei // for now, we only detect ecc 43*0584d3a8SLinJiawei val ecc_error = Valid(Bool()) 443e586e47Slinjiawei} 453e586e47Slinjiawei 46*0584d3a8SLinJiaweiclass XSL1BusErrors extends BusErrors { 47*0584d3a8SLinJiawei val icache = new L1CacheErrorInfo 48*0584d3a8SLinJiawei val dcache = new L1CacheErrorInfo 49*0584d3a8SLinJiawei override def toErrorList: List[Option[(ValidIO[UInt], String, String)]] = List( 50*0584d3a8SLinJiawei Some(icache.paddr, "IBUS", "Icache bus error"), 51*0584d3a8SLinJiawei Some(icache.ecc_error, "I_ECC", "Icache ecc error"), 52*0584d3a8SLinJiawei Some(dcache.paddr, "DBUS", "Dcache bus error"), 53*0584d3a8SLinJiawei Some(dcache.ecc_error, "D_ECC", "Dcache ecc error") 54*0584d3a8SLinJiawei ) 55*0584d3a8SLinJiawei} 563e586e47Slinjiawei 573e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 585d65f258SYinan Xu // CPU Cores 595d65f258SYinan Xu private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore())) 603e586e47Slinjiawei 615d65f258SYinan Xu // L1 to L2 network 625d65f258SYinan Xu // ------------------------------------------------- 635d65f258SYinan Xu private val l2_xbar = Seq.fill(NumCores)(TLXbar()) 645d65f258SYinan Xu 655d65f258SYinan Xu private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache( 665d65f258SYinan Xu CacheParameters( 675d65f258SYinan Xu level = 2, 685d65f258SYinan Xu ways = L2NWays, 695d65f258SYinan Xu sets = L2NSets, 705d65f258SYinan Xu blockBytes = L2BlockSize, 715d65f258SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 725d65f258SYinan Xu cacheName = s"L2" 735d65f258SYinan Xu ), 745d65f258SYinan Xu InclusiveCacheMicroParameters( 758d9f4ff7SAllen writeBytes = 32 765d65f258SYinan Xu ) 775d65f258SYinan Xu ))) 783e586e47Slinjiawei 7987b0fcb0Szhanglinjuan private val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher())) 8087b0fcb0Szhanglinjuan 816e91cacaSYinan Xu // L2 to L3 network 826e91cacaSYinan Xu // ------------------------------------------------- 836e91cacaSYinan Xu private val l3_xbar = TLXbar() 846e91cacaSYinan Xu 8597eae8a0SWang Huizhe private val l3_node = LazyModule(new InclusiveCache( 866e91cacaSYinan Xu CacheParameters( 876e91cacaSYinan Xu level = 3, 886e91cacaSYinan Xu ways = L3NWays, 896e91cacaSYinan Xu sets = L3NSets, 906e91cacaSYinan Xu blockBytes = L3BlockSize, 916e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 9297eae8a0SWang Huizhe cacheName = "L3" 936e91cacaSYinan Xu ), 946e91cacaSYinan Xu InclusiveCacheMicroParameters( 958d9f4ff7SAllen writeBytes = 32 966e91cacaSYinan Xu ) 9797eae8a0SWang Huizhe )).node 986e91cacaSYinan Xu 995d65f258SYinan Xu // L3 to memory network 1005d65f258SYinan Xu // ------------------------------------------------- 1015d65f258SYinan Xu private val memory_xbar = TLXbar() 1025d65f258SYinan Xu private val mmioXbar = TLXbar() 1035d65f258SYinan Xu 1045d65f258SYinan Xu // only mem, dma and extDev are visible externally 1055d65f258SYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 1065d65f258SYinan Xu val dma = AXI4IdentityNode() 1075d65f258SYinan Xu val extDev = AXI4IdentityNode() 1085d65f258SYinan Xu 1095d65f258SYinan Xu // connections 1105d65f258SYinan Xu // ------------------------------------------------- 1115d65f258SYinan Xu for (i <- 0 until NumCores) { 1120cff4510SAllen l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.dcache.clientNode 1135d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode 1145d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node 11587b0fcb0Szhanglinjuan l2_xbar(i) := TLBuffer() := DebugIdentityNode() := l2prefetcher(i).clientNode 11687b0fcb0Szhanglinjuan 1170cff4510SAllen mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.uncache.clientNode 118220f98bbSjinyue110 mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).frontend.instrUncache.clientNode 119279a83c2SAllen l2cache(i).node := DataDontCareNode(a = true, b = true) := TLBuffer() := DebugIdentityNode() := l2_xbar(i) 1205d65f258SYinan Xu l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node 1215d65f258SYinan Xu } 1226e91cacaSYinan Xu 1236e91cacaSYinan Xu // DMA should not go to MMIO 1246e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 1256e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 1266e91cacaSYinan Xu // add one here to make it happy. 1276e91cacaSYinan Xu val tlErrorParams = DevNullParams( 1286e91cacaSYinan Xu address = Seq(mmioRange), 1296e91cacaSYinan Xu maxAtomic = 8, 1306e91cacaSYinan Xu maxTransfer = 64) 1316e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 1326e91cacaSYinan Xu private val tlError_xbar = TLXbar() 1336e91cacaSYinan Xu tlError_xbar := 1346e91cacaSYinan Xu AXI4ToTL() := 1356e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 1366e91cacaSYinan Xu AXI4Fragmenter() := 1376e91cacaSYinan Xu AXI4IdIndexer(1) := 1386e91cacaSYinan Xu dma 1396e91cacaSYinan Xu tlError.node := tlError_xbar 1406e91cacaSYinan Xu 1416e91cacaSYinan Xu l3_xbar := 1426e91cacaSYinan Xu TLBuffer() := 1436e91cacaSYinan Xu DebugIdentityNode() := 1446e91cacaSYinan Xu tlError_xbar 1456e91cacaSYinan Xu 14697eae8a0SWang Huizhe val bankedNode = 14797eae8a0SWang Huizhe BankBinder(L3NBanks, L3BlockSize) :*= l3_node :*= TLBuffer() :*= DebugIdentityNode() :*= l3_xbar 1486e91cacaSYinan Xu 1496e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1506e91cacaSYinan Xu mem(i) := 1516e91cacaSYinan Xu AXI4UserYanker() := 1526e91cacaSYinan Xu TLToAXI4() := 1536e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 1546e91cacaSYinan Xu TLCacheCork() := 15597eae8a0SWang Huizhe bankedNode 1566e91cacaSYinan Xu } 1576e91cacaSYinan Xu 1583e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1593e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1603e586e47Slinjiawei sim = !env.FPGAPlatform 1613e586e47Slinjiawei )) 1623e586e47Slinjiawei 1635d65f258SYinan Xu clint.node := mmioXbar 1645d65f258SYinan Xu extDev := AXI4UserYanker() := TLToAXI4() := mmioXbar 1653e586e47Slinjiawei 166*0584d3a8SLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 167*0584d3a8SLinJiawei 168*0584d3a8SLinJiawei val beu = LazyModule( 169*0584d3a8SLinJiawei new BusErrorUnit(new XSL1BusErrors(), BusErrorUnitParams(0x38010000), fakeTreeNode)) 170*0584d3a8SLinJiawei beu.node := mmioXbar 171*0584d3a8SLinJiawei 172*0584d3a8SLinJiawei class BeuSinkNode()(implicit p: Parameters) extends LazyModule { 173*0584d3a8SLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 174*0584d3a8SLinJiawei lazy val module = new LazyModuleImp(this){ 175*0584d3a8SLinJiawei val interrupt = IO(Output(Bool())) 176*0584d3a8SLinJiawei interrupt := intSinkNode.in.head._1.head 177*0584d3a8SLinJiawei } 178*0584d3a8SLinJiawei } 179*0584d3a8SLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 180*0584d3a8SLinJiawei beuSink.intSinkNode := beu.intNode 181*0584d3a8SLinJiawei 1824a26299eSwangkaifan val plic = LazyModule(new AXI4Plic( 1834a26299eSwangkaifan Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 1844a26299eSwangkaifan sim = !env.FPGAPlatform 1854a26299eSwangkaifan )) 186*0584d3a8SLinJiawei plic.node := AXI4UserYanker() := TLToAXI4() := mmioXbar 1874a26299eSwangkaifan 1883e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 189006e1884SZihao Yu val io = IO(new Bundle{ 19084eb3d54SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 1914a26299eSwangkaifan // val meip = Input(Vec(NumCores, Bool())) 192a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 193006e1884SZihao Yu }) 194a165bd69Swangkaifan val difftestIO0 = IO(new DifftestBundle()) 195a165bd69Swangkaifan val difftestIO1 = IO(new DifftestBundle()) 196a165bd69Swangkaifan val difftestIO = Seq(difftestIO0, difftestIO1) 1975f00f642Swangkaifan 1985f00f642Swangkaifan val trapIO0 = IO(new xiangshan.TrapIO()) 1995f00f642Swangkaifan val trapIO1 = IO(new xiangshan.TrapIO()) 2005f00f642Swangkaifan val trapIO = Seq(trapIO0, trapIO1) 2015f00f642Swangkaifan 202*0584d3a8SLinJiawei beu.module.io.errors.icache <> DontCare 203*0584d3a8SLinJiawei beu.module.io.errors.dcache <> DontCare 204*0584d3a8SLinJiawei plic.module.io.extra.get.intrVec <> RegNext(beuSink.module.interrupt) 2054a26299eSwangkaifan 2065d65f258SYinan Xu for (i <- 0 until NumCores) { 2077a77cff2SYinan Xu xs_core(i).module.io.hartId := i.U 2080668d426Swangkaifan xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2090668d426Swangkaifan xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 2104a26299eSwangkaifan // xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip(i))) 2114a26299eSwangkaifan xs_core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 21292a86cc7Sljw l2prefetcher(i).module.io.enable := RegNext(xs_core(i).module.io.l2_pf_enable) 21321377543Szhanglinjuan l2prefetcher(i).module.io.in <> l2cache(i).module.io 2145d65f258SYinan Xu } 21521377543Szhanglinjuan 216a165bd69Swangkaifan difftestIO0 <> xs_core(0).module.difftestIO 2173d499721Swangkaifan difftestIO1 <> DontCare 2185f00f642Swangkaifan trapIO0 <> xs_core(0).module.trapIO 2193d499721Swangkaifan trapIO1 <> DontCare 2203d499721Swangkaifan 2213d499721Swangkaifan if (env.DualCore) { 2223d499721Swangkaifan difftestIO1 <> xs_core(1).module.difftestIO 2235f00f642Swangkaifan trapIO1 <> xs_core(1).module.trapIO 224a165bd69Swangkaifan } 2251e1cfa36SAllen // do not let dma AXI signals optimized out 22684eb3d54SYinan Xu dontTouch(dma.out.head._1) 22784eb3d54SYinan Xu dontTouch(extDev.out.head._1) 22884eb3d54SYinan Xu dontTouch(io.extIntrs) 229006e1884SZihao Yu } 2303e586e47Slinjiawei 2313e586e47Slinjiawei} 232