xref: /XiangShan/src/main/scala/system/SoC.scala (revision a428082bef7028cc9106c4e0689b54831896e293)
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