1006e1884SZihao Yupackage system 2006e1884SZihao Yu 31e3fad10SLinJiaweiimport noop.{Cache,CacheConfig} 4006e1884SZihao Yuimport bus.axi4.{AXI4, AXI4Lite} 58f36f779SZihao Yuimport bus.simplebus._ 61b2d260fSZihao Yuimport device.AXI4Timer 7006e1884SZihao Yuimport chisel3._ 8096ea47eSzhanglinjuanimport chisel3.util._ 9fe820c3dSZihao Yuimport chisel3.util.experimental.BoringUtils 101e3fad10SLinJiaweiimport xiangshan.{XSConfig, XSCore} 11006e1884SZihao Yu 122f7e16feSZihao Yutrait HasSoCParameter { 1326cb1857SYinan Xu val EnableILA = false 1426cb1857SYinan Xu val HasL2cache = false 1526cb1857SYinan Xu val HasPrefetch = false 16303b861dSZihao Yu} 17303b861dSZihao Yu 181e3fad10SLinJiaweiclass ILABundle extends Bundle {} 19303b861dSZihao Yu 201e3fad10SLinJiaweiclass XSSoc(implicit val p: XSConfig) extends Module with HasSoCParameter { 21006e1884SZihao Yu val io = IO(new Bundle{ 22cdd59e9fSZihao Yu val mem = new AXI4 231e3fad10SLinJiawei val mmio = if (p.FPGAPlatform) { new AXI4Lite } else { new SimpleBusUC } 248656be21SWang Huizhe val frontend = Flipped(new AXI4) 25466eb0a8SZihao Yu val meip = Input(Bool()) 262f7e16feSZihao Yu val ila = if (p.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 27006e1884SZihao Yu }) 28006e1884SZihao Yu 291e3fad10SLinJiawei val xsCore = Module(new XSCore) 30635253aaSZihao Yu val cohMg = Module(new CoherenceManager) 31635253aaSZihao Yu val xbar = Module(new SimpleBusCrossbarNto1(2)) 321e3fad10SLinJiawei cohMg.io.in <> xsCore.io.imem.mem 331e3fad10SLinJiawei xsCore.io.dmem.coh <> cohMg.io.out.coh 34635253aaSZihao Yu xbar.io.in(0) <> cohMg.io.out.mem 351e3fad10SLinJiawei xbar.io.in(1) <> xsCore.io.dmem.mem 36d2d827d9Szhanglinjuan 378656be21SWang Huizhe val axi2sb = Module(new AXI42SimpleBusConverter()) 388656be21SWang Huizhe axi2sb.io.in <> io.frontend 391e3fad10SLinJiawei xsCore.io.frontend <> axi2sb.io.out 408656be21SWang Huizhe 41eb8bdfa7SZihao Yu if (HasL2cache) { 4235377176Szhanglinjuan val l2cacheOut = Wire(new SimpleBusC) 43614aaf64SZihao Yu val l2cacheIn = if (HasPrefetch) { 44096ea47eSzhanglinjuan val prefetcher = Module(new Prefetcher) 45096ea47eSzhanglinjuan val l2cacheIn = Wire(new SimpleBusUC) 46ccd497e4Szhanglinjuan prefetcher.io.in <> xbar.io.out.req 47ccd497e4Szhanglinjuan l2cacheIn.req <> prefetcher.io.out 4835377176Szhanglinjuan xbar.io.out.resp <> l2cacheIn.resp 49614aaf64SZihao Yu l2cacheIn 50614aaf64SZihao Yu } else xbar.io.out 5139ac6601SZihao Yu val l2Empty = Wire(Bool()) 52b0cf5de6SZihao Yu l2cacheOut <> Cache(in = l2cacheIn, mmio = 0.U.asTypeOf(new SimpleBusUC) :: Nil, flush = "b00".U, empty = l2Empty, enable = true)( 534cd61964SZihao Yu CacheConfig(name = "l2cache", totalSize = 128, cacheLevel = 2)) 5435377176Szhanglinjuan io.mem <> l2cacheOut.mem.toAXI4() 5535377176Szhanglinjuan l2cacheOut.coh.resp.ready := true.B 5635377176Szhanglinjuan l2cacheOut.coh.req.valid := false.B 5735377176Szhanglinjuan l2cacheOut.coh.req.bits := DontCare 58eb8bdfa7SZihao Yu } else { 59635253aaSZihao Yu io.mem <> xbar.io.out.toAXI4() 60eb8bdfa7SZihao Yu } 611e3fad10SLinJiawei xsCore.io.imem.coh.resp.ready := true.B 621e3fad10SLinJiawei xsCore.io.imem.coh.req.valid := false.B 631e3fad10SLinJiawei xsCore.io.imem.coh.req.bits := DontCare 64096ea47eSzhanglinjuan 651b2d260fSZihao Yu val addrSpace = List( 66*3f7f5fbbSZihao Yu (0x40000000L, 0x40000000L), // external devices 67e96e3809SLinJiawei (0x38000000L, 0x00010000L) // CLINT 681b2d260fSZihao Yu ) 691b2d260fSZihao Yu val mmioXbar = Module(new SimpleBusCrossbar1toN(addrSpace)) 701e3fad10SLinJiawei mmioXbar.io.in <> xsCore.io.mmio 71d2d827d9Szhanglinjuan 721b2d260fSZihao Yu val extDev = mmioXbar.io.out(0) 731b2d260fSZihao Yu val clint = Module(new AXI4Timer(sim = !p.FPGAPlatform)) 741b2d260fSZihao Yu clint.io.in <> mmioXbar.io.out(1).toAXI4Lite() 751b2d260fSZihao Yu if (p.FPGAPlatform) io.mmio <> extDev.toAXI4Lite() 761b2d260fSZihao Yu else io.mmio <> extDev 771b2d260fSZihao Yu 781b2d260fSZihao Yu val mtipSync = clint.io.extra.get.mtip 79466eb0a8SZihao Yu val meipSync = RegNext(RegNext(io.meip)) 805d41d760SZihao Yu BoringUtils.addSource(mtipSync, "mtip") 81466eb0a8SZihao Yu BoringUtils.addSource(meipSync, "meip") 82006e1884SZihao Yu} 83