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 11a165bd69Swangkaifanimport xiangshan.{HasXSParameter, XSCore, HasXSLog, DifftestBundle} 12*87b0fcb0Szhanglinjuanimport 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} 17a428082bSLinJiawei 18a428082bSLinJiaweicase class SoCParameters 19a428082bSLinJiawei( 20f874f036SYinan Xu NumCores: Integer = 1, 21a428082bSLinJiawei EnableILA: Boolean = false, 22a428082bSLinJiawei HasL2Cache: Boolean = false, 23a428082bSLinJiawei HasPrefetch: Boolean = false 24a428082bSLinJiawei) 25006e1884SZihao Yu 267d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{ 273e586e47Slinjiawei val soc = top.Parameters.get.socParameters 28f874f036SYinan Xu val NumCores = soc.NumCores 29a428082bSLinJiawei val EnableILA = soc.EnableILA 30a428082bSLinJiawei val HasL2cache = soc.HasL2Cache 31a428082bSLinJiawei val HasPrefetch = soc.HasPrefetch 32303b861dSZihao Yu} 33303b861dSZihao Yu 341e3fad10SLinJiaweiclass ILABundle extends Bundle {} 35303b861dSZihao Yu 363e586e47Slinjiawei 373e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule { 383e586e47Slinjiawei val mem = TLFuzzer(nOperations = 10) 393e586e47Slinjiawei val mmio = TLFuzzer(nOperations = 10) 403e586e47Slinjiawei 413e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 423e586e47Slinjiawei 433e586e47Slinjiawei } 443e586e47Slinjiawei} 453e586e47Slinjiawei 463e586e47Slinjiawei 473e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 485d65f258SYinan Xu // CPU Cores 495d65f258SYinan Xu private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore())) 503e586e47Slinjiawei 515d65f258SYinan Xu // L1 to L2 network 525d65f258SYinan Xu // ------------------------------------------------- 535d65f258SYinan Xu private val l2_xbar = Seq.fill(NumCores)(TLXbar()) 545d65f258SYinan Xu 555d65f258SYinan Xu private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache( 565d65f258SYinan Xu CacheParameters( 575d65f258SYinan Xu level = 2, 585d65f258SYinan Xu ways = L2NWays, 595d65f258SYinan Xu sets = L2NSets, 605d65f258SYinan Xu blockBytes = L2BlockSize, 615d65f258SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 625d65f258SYinan Xu cacheName = s"L2" 635d65f258SYinan Xu ), 645d65f258SYinan Xu InclusiveCacheMicroParameters( 658d9f4ff7SAllen writeBytes = 32 665d65f258SYinan Xu ) 675d65f258SYinan Xu ))) 683e586e47Slinjiawei 69*87b0fcb0Szhanglinjuan private val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher())) 70*87b0fcb0Szhanglinjuan 716e91cacaSYinan Xu // L2 to L3 network 726e91cacaSYinan Xu // ------------------------------------------------- 736e91cacaSYinan Xu private val l3_xbar = TLXbar() 746e91cacaSYinan Xu 7597eae8a0SWang Huizhe private val l3_node = LazyModule(new InclusiveCache( 766e91cacaSYinan Xu CacheParameters( 776e91cacaSYinan Xu level = 3, 786e91cacaSYinan Xu ways = L3NWays, 796e91cacaSYinan Xu sets = L3NSets, 806e91cacaSYinan Xu blockBytes = L3BlockSize, 816e91cacaSYinan Xu beatBytes = L2BusWidth / 8, 8297eae8a0SWang Huizhe cacheName = "L3" 836e91cacaSYinan Xu ), 846e91cacaSYinan Xu InclusiveCacheMicroParameters( 858d9f4ff7SAllen writeBytes = 32 866e91cacaSYinan Xu ) 8797eae8a0SWang Huizhe )).node 886e91cacaSYinan Xu 895d65f258SYinan Xu // L3 to memory network 905d65f258SYinan Xu // ------------------------------------------------- 915d65f258SYinan Xu private val memory_xbar = TLXbar() 925d65f258SYinan Xu private val mmioXbar = TLXbar() 935d65f258SYinan Xu 945d65f258SYinan Xu // only mem, dma and extDev are visible externally 955d65f258SYinan Xu val mem = Seq.fill(L3NBanks)(AXI4IdentityNode()) 965d65f258SYinan Xu val dma = AXI4IdentityNode() 975d65f258SYinan Xu val extDev = AXI4IdentityNode() 985d65f258SYinan Xu 995d65f258SYinan Xu // connections 1005d65f258SYinan Xu // ------------------------------------------------- 1015d65f258SYinan Xu for (i <- 0 until NumCores) { 1020cff4510SAllen l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.dcache.clientNode 1035d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode 1045d65f258SYinan Xu l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node 105*87b0fcb0Szhanglinjuan // l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l2Prefetcher.clientNode 106*87b0fcb0Szhanglinjuan l2_xbar(i) := TLBuffer() := DebugIdentityNode() := l2prefetcher(i).clientNode 107*87b0fcb0Szhanglinjuan l2prefetcher(i).module.io.in <> l2cache(i).module.io 108*87b0fcb0Szhanglinjuan 1090cff4510SAllen mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.uncache.clientNode 110220f98bbSjinyue110 mmioXbar := TLBuffer() := DebugIdentityNode() := xs_core(i).frontend.instrUncache.clientNode 111279a83c2SAllen l2cache(i).node := DataDontCareNode(a = true, b = true) := TLBuffer() := DebugIdentityNode() := l2_xbar(i) 1125d65f258SYinan Xu l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node 1135d65f258SYinan Xu } 1146e91cacaSYinan Xu 1156e91cacaSYinan Xu // DMA should not go to MMIO 1166e91cacaSYinan Xu val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL) 1176e91cacaSYinan Xu // AXI4ToTL needs a TLError device to route error requests, 1186e91cacaSYinan Xu // add one here to make it happy. 1196e91cacaSYinan Xu val tlErrorParams = DevNullParams( 1206e91cacaSYinan Xu address = Seq(mmioRange), 1216e91cacaSYinan Xu maxAtomic = 8, 1226e91cacaSYinan Xu maxTransfer = 64) 1236e91cacaSYinan Xu val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8)) 1246e91cacaSYinan Xu private val tlError_xbar = TLXbar() 1256e91cacaSYinan Xu tlError_xbar := 1266e91cacaSYinan Xu AXI4ToTL() := 1276e91cacaSYinan Xu AXI4UserYanker(Some(1)) := 1286e91cacaSYinan Xu AXI4Fragmenter() := 1296e91cacaSYinan Xu AXI4IdIndexer(1) := 1306e91cacaSYinan Xu dma 1316e91cacaSYinan Xu tlError.node := tlError_xbar 1326e91cacaSYinan Xu 1336e91cacaSYinan Xu l3_xbar := 1346e91cacaSYinan Xu TLBuffer() := 1356e91cacaSYinan Xu DebugIdentityNode() := 1366e91cacaSYinan Xu tlError_xbar 1376e91cacaSYinan Xu 13897eae8a0SWang Huizhe val bankedNode = 13997eae8a0SWang Huizhe BankBinder(L3NBanks, L3BlockSize) :*= l3_node :*= TLBuffer() :*= DebugIdentityNode() :*= l3_xbar 1406e91cacaSYinan Xu 1416e91cacaSYinan Xu for(i <- 0 until L3NBanks) { 1426e91cacaSYinan Xu mem(i) := 1436e91cacaSYinan Xu AXI4UserYanker() := 1446e91cacaSYinan Xu TLToAXI4() := 1456e91cacaSYinan Xu TLWidthWidget(L3BusWidth / 8) := 1466e91cacaSYinan Xu TLCacheCork() := 14797eae8a0SWang Huizhe bankedNode 1486e91cacaSYinan Xu } 1496e91cacaSYinan Xu 1503e586e47Slinjiawei private val clint = LazyModule(new TLTimer( 1513e586e47Slinjiawei Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1523e586e47Slinjiawei sim = !env.FPGAPlatform 1533e586e47Slinjiawei )) 1543e586e47Slinjiawei 1555d65f258SYinan Xu clint.node := mmioXbar 1565d65f258SYinan Xu extDev := AXI4UserYanker() := TLToAXI4() := mmioXbar 1573e586e47Slinjiawei 1584a26299eSwangkaifan val plic = LazyModule(new AXI4Plic( 1594a26299eSwangkaifan Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 1604a26299eSwangkaifan sim = !env.FPGAPlatform 1614a26299eSwangkaifan )) 1624a26299eSwangkaifan val plicIdentity = AXI4IdentityNode() 1634a26299eSwangkaifan plic.node := plicIdentity := AXI4UserYanker() := TLToAXI4() := mmioXbar 1644a26299eSwangkaifan 1653e586e47Slinjiawei lazy val module = new LazyModuleImp(this){ 166006e1884SZihao Yu val io = IO(new Bundle{ 16784eb3d54SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 1684a26299eSwangkaifan // val meip = Input(Vec(NumCores, Bool())) 169a428082bSLinJiawei val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 170006e1884SZihao Yu }) 171a165bd69Swangkaifan val difftestIO0 = IO(new DifftestBundle()) 172a165bd69Swangkaifan val difftestIO1 = IO(new DifftestBundle()) 173a165bd69Swangkaifan val difftestIO = Seq(difftestIO0, difftestIO1) 1745f00f642Swangkaifan 1755f00f642Swangkaifan val trapIO0 = IO(new xiangshan.TrapIO()) 1765f00f642Swangkaifan val trapIO1 = IO(new xiangshan.TrapIO()) 1775f00f642Swangkaifan val trapIO = Seq(trapIO0, trapIO1) 1785f00f642Swangkaifan 17984eb3d54SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 1804a26299eSwangkaifan 1815d65f258SYinan Xu for (i <- 0 until NumCores) { 1827a77cff2SYinan Xu xs_core(i).module.io.hartId := i.U 1830668d426Swangkaifan xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 1840668d426Swangkaifan xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 1854a26299eSwangkaifan // xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip(i))) 1864a26299eSwangkaifan xs_core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 187*87b0fcb0Szhanglinjuan l2prefetcher(i).module.io.enable := xs_core(i).module.io.l2_pf_enable 1885d65f258SYinan Xu } 189a165bd69Swangkaifan difftestIO0 <> xs_core(0).module.difftestIO 1903d499721Swangkaifan difftestIO1 <> DontCare 1915f00f642Swangkaifan trapIO0 <> xs_core(0).module.trapIO 1923d499721Swangkaifan trapIO1 <> DontCare 1933d499721Swangkaifan 1943d499721Swangkaifan if (env.DualCore) { 1953d499721Swangkaifan difftestIO1 <> xs_core(1).module.difftestIO 1965f00f642Swangkaifan trapIO1 <> xs_core(1).module.trapIO 197a165bd69Swangkaifan } 1981e1cfa36SAllen // do not let dma AXI signals optimized out 19984eb3d54SYinan Xu dontTouch(dma.out.head._1) 20084eb3d54SYinan Xu dontTouch(extDev.out.head._1) 20184eb3d54SYinan Xu dontTouch(io.extIntrs) 202006e1884SZihao Yu } 2033e586e47Slinjiawei 2043e586e47Slinjiawei} 205