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 10*a428082bSLinJiaweiimport top.Parameters 11*a428082bSLinJiaweiimport xiangshan.XSCore 12*a428082bSLinJiawei 13*a428082bSLinJiawei 14*a428082bSLinJiaweicase class SoCParameters 15*a428082bSLinJiawei( 16*a428082bSLinJiawei EnableILA: Boolean = false, 17*a428082bSLinJiawei HasL2Cache: Boolean = false, 18*a428082bSLinJiawei HasPrefetch: Boolean = false 19*a428082bSLinJiawei) 20006e1884SZihao Yu 212f7e16feSZihao Yutrait HasSoCParameter { 22*a428082bSLinJiawei val soc = Parameters.get.socParameters 23*a428082bSLinJiawei val env = Parameters.get.envParameters 24*a428082bSLinJiawei val EnableILA = soc.EnableILA 25*a428082bSLinJiawei val HasL2cache = soc.HasL2Cache 26*a428082bSLinJiawei val HasPrefetch = soc.HasPrefetch 27303b861dSZihao Yu} 28303b861dSZihao Yu 291e3fad10SLinJiaweiclass ILABundle extends Bundle {} 30303b861dSZihao Yu 31*a428082bSLinJiaweiclass XSSoc extends Module with HasSoCParameter { 32006e1884SZihao Yu val io = IO(new Bundle{ 33cdd59e9fSZihao Yu val mem = new AXI4 34*a428082bSLinJiawei val mmio = if (env.FPGAPlatform) { new AXI4Lite } else { new SimpleBusUC } 358656be21SWang Huizhe val frontend = Flipped(new AXI4) 36466eb0a8SZihao Yu val meip = Input(Bool()) 37*a428082bSLinJiawei val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 38006e1884SZihao Yu }) 39006e1884SZihao Yu 401e3fad10SLinJiawei val xsCore = Module(new XSCore) 41635253aaSZihao Yu val cohMg = Module(new CoherenceManager) 42635253aaSZihao Yu val xbar = Module(new SimpleBusCrossbarNto1(2)) 431e3fad10SLinJiawei cohMg.io.in <> xsCore.io.imem.mem 441e3fad10SLinJiawei xsCore.io.dmem.coh <> cohMg.io.out.coh 45635253aaSZihao Yu xbar.io.in(0) <> cohMg.io.out.mem 461e3fad10SLinJiawei xbar.io.in(1) <> xsCore.io.dmem.mem 47d2d827d9Szhanglinjuan 488656be21SWang Huizhe val axi2sb = Module(new AXI42SimpleBusConverter()) 498656be21SWang Huizhe axi2sb.io.in <> io.frontend 501e3fad10SLinJiawei xsCore.io.frontend <> axi2sb.io.out 518656be21SWang Huizhe 52eb8bdfa7SZihao Yu if (HasL2cache) { 5335377176Szhanglinjuan val l2cacheOut = Wire(new SimpleBusC) 54614aaf64SZihao Yu val l2cacheIn = if (HasPrefetch) { 55096ea47eSzhanglinjuan val prefetcher = Module(new Prefetcher) 56096ea47eSzhanglinjuan val l2cacheIn = Wire(new SimpleBusUC) 57ccd497e4Szhanglinjuan prefetcher.io.in <> xbar.io.out.req 58ccd497e4Szhanglinjuan l2cacheIn.req <> prefetcher.io.out 5935377176Szhanglinjuan xbar.io.out.resp <> l2cacheIn.resp 60614aaf64SZihao Yu l2cacheIn 61614aaf64SZihao Yu } else xbar.io.out 6239ac6601SZihao Yu val l2Empty = Wire(Bool()) 63b0cf5de6SZihao Yu l2cacheOut <> Cache(in = l2cacheIn, mmio = 0.U.asTypeOf(new SimpleBusUC) :: Nil, flush = "b00".U, empty = l2Empty, enable = true)( 644cd61964SZihao Yu CacheConfig(name = "l2cache", totalSize = 128, cacheLevel = 2)) 6535377176Szhanglinjuan io.mem <> l2cacheOut.mem.toAXI4() 6635377176Szhanglinjuan l2cacheOut.coh.resp.ready := true.B 6735377176Szhanglinjuan l2cacheOut.coh.req.valid := false.B 6835377176Szhanglinjuan l2cacheOut.coh.req.bits := DontCare 69eb8bdfa7SZihao Yu } else { 70635253aaSZihao Yu io.mem <> xbar.io.out.toAXI4() 71eb8bdfa7SZihao Yu } 721e3fad10SLinJiawei xsCore.io.imem.coh.resp.ready := true.B 731e3fad10SLinJiawei xsCore.io.imem.coh.req.valid := false.B 741e3fad10SLinJiawei xsCore.io.imem.coh.req.bits := DontCare 75096ea47eSzhanglinjuan 761b2d260fSZihao Yu val addrSpace = List( 773f7f5fbbSZihao Yu (0x40000000L, 0x40000000L), // external devices 78e96e3809SLinJiawei (0x38000000L, 0x00010000L) // CLINT 791b2d260fSZihao Yu ) 801b2d260fSZihao Yu val mmioXbar = Module(new SimpleBusCrossbar1toN(addrSpace)) 811e3fad10SLinJiawei mmioXbar.io.in <> xsCore.io.mmio 82d2d827d9Szhanglinjuan 831b2d260fSZihao Yu val extDev = mmioXbar.io.out(0) 84*a428082bSLinJiawei val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform)) 851b2d260fSZihao Yu clint.io.in <> mmioXbar.io.out(1).toAXI4Lite() 86*a428082bSLinJiawei if (env.FPGAPlatform) io.mmio <> extDev.toAXI4Lite() 871b2d260fSZihao Yu else io.mmio <> extDev 881b2d260fSZihao Yu 891b2d260fSZihao Yu val mtipSync = clint.io.extra.get.mtip 90466eb0a8SZihao Yu val meipSync = RegNext(RegNext(io.meip)) 915d41d760SZihao Yu BoringUtils.addSource(mtipSync, "mtip") 92466eb0a8SZihao Yu BoringUtils.addSource(meipSync, "meip") 93006e1884SZihao Yu} 94