xref: /XiangShan/src/main/scala/system/SoC.scala (revision 6e91cacaff17be7af90e5d5ff7d16f76d4048c3e)
1006e1884SZihao Yupackage system
2006e1884SZihao Yu
33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters
43e586e47Slinjiaweiimport device.{AXI4Timer, TLTimer}
5006e1884SZihao Yuimport chisel3._
6096ea47eSzhanglinjuanimport chisel3.util._
73e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp}
81865a66fSlinjiaweiimport freechips.rocketchip.tilelink.{TLBuffer, TLFuzzer, TLIdentityNode, TLXbar}
91865a66fSlinjiaweiimport utils.DebugIdentityNode
107d5ddbe6SLinJiaweiimport xiangshan.{HasXSParameter, XSCore}
11*6e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters}
12*6e91cacaSYinan Xuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp, AddressSet}
13*6e91cacaSYinan Xuimport freechips.rocketchip.tilelink.{TLBundleParameters, TLCacheCork, TLBuffer, TLClientNode, TLIdentityNode, TLXbar, TLWidthWidget, TLFilter, TLToAXI4}
14*6e91cacaSYinan Xuimport freechips.rocketchip.devices.tilelink.{TLError, DevNullParams}
15*6e91cacaSYinan Xuimport freechips.rocketchip.amba.axi4.{AXI4ToTL, AXI4IdentityNode, AXI4UserYanker, AXI4Fragmenter, AXI4IdIndexer, AXI4Deinterleaver}
16a428082bSLinJiawei
17a428082bSLinJiaweicase class SoCParameters
18a428082bSLinJiawei(
19a428082bSLinJiawei  EnableILA: Boolean = false,
20a428082bSLinJiawei  HasL2Cache: Boolean = false,
21a428082bSLinJiawei  HasPrefetch: Boolean = false
22a428082bSLinJiawei)
23006e1884SZihao Yu
247d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{
253e586e47Slinjiawei  val soc = top.Parameters.get.socParameters
26a428082bSLinJiawei  val EnableILA = soc.EnableILA
27a428082bSLinJiawei  val HasL2cache = soc.HasL2Cache
28a428082bSLinJiawei  val HasPrefetch = soc.HasPrefetch
29303b861dSZihao Yu}
30303b861dSZihao Yu
311e3fad10SLinJiaweiclass ILABundle extends Bundle {}
32303b861dSZihao Yu
333e586e47Slinjiawei
343e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule {
353e586e47Slinjiawei  val mem = TLFuzzer(nOperations = 10)
363e586e47Slinjiawei  val mmio = TLFuzzer(nOperations = 10)
373e586e47Slinjiawei
383e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
393e586e47Slinjiawei
403e586e47Slinjiawei  }
413e586e47Slinjiawei}
423e586e47Slinjiawei
433e586e47Slinjiawei
443e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter {
453e586e47Slinjiawei
46222e17e5Slinjiawei  private val xsCore = LazyModule(new XSCore())
473e586e47Slinjiawei
483e586e47Slinjiawei  // only mem and extDev visible externally
49*6e91cacaSYinan Xu  val cores = xsCore.mem
50d709d2f8SAllen  val dma = xsCore.dma
513e586e47Slinjiawei  val extDev = TLIdentityNode()
523e586e47Slinjiawei
53*6e91cacaSYinan Xu  // L2 to L3 network
54*6e91cacaSYinan Xu  // -------------------------------------------------
55*6e91cacaSYinan Xu  private val l3_xbar = TLXbar()
56*6e91cacaSYinan Xu
57*6e91cacaSYinan Xu  private val l3_banks = (0 until L3NBanks) map (i =>
58*6e91cacaSYinan Xu      LazyModule(new InclusiveCache(
59*6e91cacaSYinan Xu        CacheParameters(
60*6e91cacaSYinan Xu          level = 3,
61*6e91cacaSYinan Xu          ways = L3NWays,
62*6e91cacaSYinan Xu          sets = L3NSets,
63*6e91cacaSYinan Xu          blockBytes = L3BlockSize,
64*6e91cacaSYinan Xu          beatBytes = L2BusWidth / 8,
65*6e91cacaSYinan Xu          cacheName = s"L3_$i"
66*6e91cacaSYinan Xu        ),
67*6e91cacaSYinan Xu      InclusiveCacheMicroParameters(
68*6e91cacaSYinan Xu        writeBytes = 8
69*6e91cacaSYinan Xu      )
70*6e91cacaSYinan Xu    )))
71*6e91cacaSYinan Xu
72*6e91cacaSYinan Xu  l3_xbar := TLBuffer() := DebugIdentityNode() := cores
73*6e91cacaSYinan Xu
74*6e91cacaSYinan Xu  // DMA should not go to MMIO
75*6e91cacaSYinan Xu  val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL)
76*6e91cacaSYinan Xu  // AXI4ToTL needs a TLError device to route error requests,
77*6e91cacaSYinan Xu  // add one here to make it happy.
78*6e91cacaSYinan Xu  val tlErrorParams = DevNullParams(
79*6e91cacaSYinan Xu    address = Seq(mmioRange),
80*6e91cacaSYinan Xu    maxAtomic = 8,
81*6e91cacaSYinan Xu    maxTransfer = 64)
82*6e91cacaSYinan Xu  val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8))
83*6e91cacaSYinan Xu  private val tlError_xbar = TLXbar()
84*6e91cacaSYinan Xu  tlError_xbar :=
85*6e91cacaSYinan Xu    AXI4ToTL() :=
86*6e91cacaSYinan Xu    AXI4UserYanker(Some(1)) :=
87*6e91cacaSYinan Xu    AXI4Fragmenter() :=
88*6e91cacaSYinan Xu    AXI4IdIndexer(1) :=
89*6e91cacaSYinan Xu    dma
90*6e91cacaSYinan Xu  tlError.node := tlError_xbar
91*6e91cacaSYinan Xu
92*6e91cacaSYinan Xu  l3_xbar :=
93*6e91cacaSYinan Xu    TLBuffer() :=
94*6e91cacaSYinan Xu    DebugIdentityNode() :=
95*6e91cacaSYinan Xu    tlError_xbar
96*6e91cacaSYinan Xu
97*6e91cacaSYinan Xu  def bankFilter(bank: Int) = AddressSet(
98*6e91cacaSYinan Xu    base = bank * L3BlockSize,
99*6e91cacaSYinan Xu    mask = ~BigInt((L3NBanks -1) * L3BlockSize))
100*6e91cacaSYinan Xu
101*6e91cacaSYinan Xu  for(i <- 0 until L3NBanks) {
102*6e91cacaSYinan Xu    val filter = TLFilter(TLFilter.mSelectIntersect(bankFilter(i)))
103*6e91cacaSYinan Xu    l3_banks(i).node := TLBuffer() := DebugIdentityNode() := filter := l3_xbar
104*6e91cacaSYinan Xu  }
105*6e91cacaSYinan Xu
106*6e91cacaSYinan Xu
107*6e91cacaSYinan Xu  // L3 to memory network
108*6e91cacaSYinan Xu  // -------------------------------------------------
109*6e91cacaSYinan Xu  private val memory_xbar = TLXbar()
110*6e91cacaSYinan Xu
111*6e91cacaSYinan Xu  val mem = Seq.fill(L3NBanks)(AXI4IdentityNode())
112*6e91cacaSYinan Xu  for(i <- 0 until L3NBanks) {
113*6e91cacaSYinan Xu    mem(i) :=
114*6e91cacaSYinan Xu      AXI4UserYanker() :=
115*6e91cacaSYinan Xu      TLToAXI4() :=
116*6e91cacaSYinan Xu      TLWidthWidget(L3BusWidth / 8) :=
117*6e91cacaSYinan Xu      TLCacheCork() :=
118*6e91cacaSYinan Xu      l3_banks(i).node
119*6e91cacaSYinan Xu  }
120*6e91cacaSYinan Xu
1213e586e47Slinjiawei  private val mmioXbar = TLXbar()
1223e586e47Slinjiawei  private val clint = LazyModule(new TLTimer(
1233e586e47Slinjiawei    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
1243e586e47Slinjiawei    sim = !env.FPGAPlatform
1253e586e47Slinjiawei  ))
1263e586e47Slinjiawei
1271865a66fSlinjiawei  mmioXbar :=
1281865a66fSlinjiawei    TLBuffer() :=
1291865a66fSlinjiawei    DebugIdentityNode() :=
1301865a66fSlinjiawei    xsCore.mmio
1311865a66fSlinjiawei
1321865a66fSlinjiawei  clint.node :=
1331865a66fSlinjiawei    mmioXbar
1341865a66fSlinjiawei
1351865a66fSlinjiawei  extDev :=
1361865a66fSlinjiawei    mmioXbar
1373e586e47Slinjiawei
1383e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
139006e1884SZihao Yu    val io = IO(new Bundle{
140466eb0a8SZihao Yu      val meip = Input(Bool())
141a428082bSLinJiawei      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
142006e1884SZihao Yu    })
14335bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.mtip := clint.module.io.mtip
14435bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.msip := clint.module.io.msip
14535bfeecbSYinan Xu    xsCore.module.io.externalInterrupt.meip := RegNext(RegNext(io.meip))
146006e1884SZihao Yu  }
1473e586e47Slinjiawei
1483e586e47Slinjiawei}
1493e586e47Slinjiawei
1503e586e47Slinjiawei
1513e586e47Slinjiawei//class XSSoc extends Module with HasSoCParameter {
1523e586e47Slinjiawei//  val io = IO(new Bundle{
1533e586e47Slinjiawei//    val mem = new TLCached(l1BusParams)
1543e586e47Slinjiawei//    val mmio = new TLCached(l1BusParams)
1553e586e47Slinjiawei//    val frontend = Flipped(new AXI4) //TODO: do we need it ?
1563e586e47Slinjiawei//    val meip = Input(Bool())
1573e586e47Slinjiawei//    val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
1583e586e47Slinjiawei//  })
1593e586e47Slinjiawei//
1603e586e47Slinjiawei//  val xsCore = Module(new XSCore)
1613e586e47Slinjiawei//
1623e586e47Slinjiawei//  io.frontend <> DontCare
1633e586e47Slinjiawei//
1643e586e47Slinjiawei//  io.mem <> xsCore.io.mem
1653e586e47Slinjiawei//
1663e586e47Slinjiawei//  val addrSpace = List(
1673e586e47Slinjiawei//    (0x40000000L, 0x40000000L), // external devices
1683e586e47Slinjiawei//    (0x38000000L, 0x00010000L)  // CLINT
1693e586e47Slinjiawei//  )
1703e586e47Slinjiawei//  val mmioXbar = Module(new NaiveTL1toN(addrSpace, xsCore.io.mem.params))
1713e586e47Slinjiawei//  mmioXbar.io.in <> xsCore.io.mmio
1723e586e47Slinjiawei//
1733e586e47Slinjiawei//  val extDev = mmioXbar.io.out(0)
1743e586e47Slinjiawei//  val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform))
1753e586e47Slinjiawei//  clint.io.in <> AXI4ToAXI4Lite(MMIOTLToAXI4(mmioXbar.io.out(1)))
1763e586e47Slinjiawei//
1773e586e47Slinjiawei//  io.mmio <> extDev
1783e586e47Slinjiawei//
1793e586e47Slinjiawei//  val mtipSync = clint.io.extra.get.mtip
1803e586e47Slinjiawei//  val meipSync = RegNext(RegNext(io.meip))
1813e586e47Slinjiawei//  ExcitingUtils.addSource(mtipSync, "mtip")
1823e586e47Slinjiawei//  ExcitingUtils.addSource(meipSync, "meip")
1833e586e47Slinjiawei//}
184