xref: /XiangShan/src/main/scala/system/SoC.scala (revision 189e7a33e7a15c3831915e78cdd51bf510e3046e)
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}
116e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters}
126e91cacaSYinan Xuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp, AddressSet}
136e91cacaSYinan Xuimport freechips.rocketchip.tilelink.{TLBundleParameters, TLCacheCork, TLBuffer, TLClientNode, TLIdentityNode, TLXbar, TLWidthWidget, TLFilter, TLToAXI4}
146e91cacaSYinan Xuimport freechips.rocketchip.devices.tilelink.{TLError, DevNullParams}
156e91cacaSYinan Xuimport freechips.rocketchip.amba.axi4.{AXI4ToTL, AXI4IdentityNode, AXI4UserYanker, AXI4Fragmenter, AXI4IdIndexer, AXI4Deinterleaver}
16a428082bSLinJiawei
17a428082bSLinJiaweicase class SoCParameters
18a428082bSLinJiawei(
19f874f036SYinan Xu  NumCores: Integer = 1,
20a428082bSLinJiawei  EnableILA: Boolean = false,
21a428082bSLinJiawei  HasL2Cache: Boolean = false,
22a428082bSLinJiawei  HasPrefetch: Boolean = false
23a428082bSLinJiawei)
24006e1884SZihao Yu
257d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{
263e586e47Slinjiawei  val soc = top.Parameters.get.socParameters
27f874f036SYinan Xu  val NumCores = soc.NumCores
28a428082bSLinJiawei  val EnableILA = soc.EnableILA
29a428082bSLinJiawei  val HasL2cache = soc.HasL2Cache
30a428082bSLinJiawei  val HasPrefetch = soc.HasPrefetch
31303b861dSZihao Yu}
32303b861dSZihao Yu
331e3fad10SLinJiaweiclass ILABundle extends Bundle {}
34303b861dSZihao Yu
353e586e47Slinjiawei
363e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule {
373e586e47Slinjiawei  val mem = TLFuzzer(nOperations = 10)
383e586e47Slinjiawei  val mmio = TLFuzzer(nOperations = 10)
393e586e47Slinjiawei
403e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
413e586e47Slinjiawei
423e586e47Slinjiawei  }
433e586e47Slinjiawei}
443e586e47Slinjiawei
453e586e47Slinjiawei
463e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter {
475d65f258SYinan Xu  // CPU Cores
485d65f258SYinan Xu  private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore()))
493e586e47Slinjiawei
505d65f258SYinan Xu  // L1 to L2 network
515d65f258SYinan Xu  // -------------------------------------------------
525d65f258SYinan Xu  private val l2_xbar = Seq.fill(NumCores)(TLXbar())
535d65f258SYinan Xu
545d65f258SYinan Xu  private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache(
555d65f258SYinan Xu    CacheParameters(
565d65f258SYinan Xu      level = 2,
575d65f258SYinan Xu      ways = L2NWays,
585d65f258SYinan Xu      sets = L2NSets,
595d65f258SYinan Xu      blockBytes = L2BlockSize,
605d65f258SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
615d65f258SYinan Xu      cacheName = s"L2"
625d65f258SYinan Xu    ),
635d65f258SYinan Xu    InclusiveCacheMicroParameters(
645d65f258SYinan Xu      writeBytes = 8
655d65f258SYinan Xu    )
665d65f258SYinan Xu  )))
673e586e47Slinjiawei
686e91cacaSYinan Xu  // L2 to L3 network
696e91cacaSYinan Xu  // -------------------------------------------------
706e91cacaSYinan Xu  private val l3_xbar = TLXbar()
716e91cacaSYinan Xu
726e91cacaSYinan Xu  private val l3_banks = (0 until L3NBanks) map (i =>
736e91cacaSYinan Xu      LazyModule(new InclusiveCache(
746e91cacaSYinan Xu        CacheParameters(
756e91cacaSYinan Xu          level = 3,
766e91cacaSYinan Xu          ways = L3NWays,
776e91cacaSYinan Xu          sets = L3NSets,
786e91cacaSYinan Xu          blockBytes = L3BlockSize,
796e91cacaSYinan Xu          beatBytes = L2BusWidth / 8,
806e91cacaSYinan Xu          cacheName = s"L3_$i"
816e91cacaSYinan Xu        ),
826e91cacaSYinan Xu      InclusiveCacheMicroParameters(
836e91cacaSYinan Xu        writeBytes = 8
846e91cacaSYinan Xu      )
856e91cacaSYinan Xu    )))
866e91cacaSYinan Xu
875d65f258SYinan Xu  // L3 to memory network
885d65f258SYinan Xu  // -------------------------------------------------
895d65f258SYinan Xu  private val memory_xbar = TLXbar()
905d65f258SYinan Xu  private val mmioXbar = TLXbar()
915d65f258SYinan Xu
925d65f258SYinan Xu  // only mem, dma and extDev are visible externally
935d65f258SYinan Xu  val mem = Seq.fill(L3NBanks)(AXI4IdentityNode())
945d65f258SYinan Xu  val dma = AXI4IdentityNode()
955d65f258SYinan Xu  val extDev = AXI4IdentityNode()
965d65f258SYinan Xu
975d65f258SYinan Xu  // connections
985d65f258SYinan Xu  // -------------------------------------------------
995d65f258SYinan Xu  for (i <- 0 until NumCores) {
1005d65f258SYinan Xu    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).dcache.clientNode
1015d65f258SYinan Xu    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode
1025d65f258SYinan Xu    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node
103*189e7a33Szhanglinjuan    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l2Prefetcher.clientNode
1045d65f258SYinan Xu    mmioXbar   := TLBuffer() := DebugIdentityNode() := xs_core(i).uncache.clientNode
1055d65f258SYinan Xu    l2cache(i).node := TLBuffer() := DebugIdentityNode() := l2_xbar(i)
1065d65f258SYinan Xu    l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node
1075d65f258SYinan Xu  }
1086e91cacaSYinan Xu
1096e91cacaSYinan Xu  // DMA should not go to MMIO
1106e91cacaSYinan Xu  val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL)
1116e91cacaSYinan Xu  // AXI4ToTL needs a TLError device to route error requests,
1126e91cacaSYinan Xu  // add one here to make it happy.
1136e91cacaSYinan Xu  val tlErrorParams = DevNullParams(
1146e91cacaSYinan Xu    address = Seq(mmioRange),
1156e91cacaSYinan Xu    maxAtomic = 8,
1166e91cacaSYinan Xu    maxTransfer = 64)
1176e91cacaSYinan Xu  val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8))
1186e91cacaSYinan Xu  private val tlError_xbar = TLXbar()
1196e91cacaSYinan Xu  tlError_xbar :=
1206e91cacaSYinan Xu    AXI4ToTL() :=
1216e91cacaSYinan Xu    AXI4UserYanker(Some(1)) :=
1226e91cacaSYinan Xu    AXI4Fragmenter() :=
1236e91cacaSYinan Xu    AXI4IdIndexer(1) :=
1246e91cacaSYinan Xu    dma
1256e91cacaSYinan Xu  tlError.node := tlError_xbar
1266e91cacaSYinan Xu
1276e91cacaSYinan Xu  l3_xbar :=
1286e91cacaSYinan Xu    TLBuffer() :=
1296e91cacaSYinan Xu    DebugIdentityNode() :=
1306e91cacaSYinan Xu    tlError_xbar
1316e91cacaSYinan Xu
1326e91cacaSYinan Xu  def bankFilter(bank: Int) = AddressSet(
1336e91cacaSYinan Xu    base = bank * L3BlockSize,
1346e91cacaSYinan Xu    mask = ~BigInt((L3NBanks -1) * L3BlockSize))
1356e91cacaSYinan Xu
1366e91cacaSYinan Xu  for(i <- 0 until L3NBanks) {
1376e91cacaSYinan Xu    val filter = TLFilter(TLFilter.mSelectIntersect(bankFilter(i)))
1386e91cacaSYinan Xu    l3_banks(i).node := TLBuffer() := DebugIdentityNode() := filter := l3_xbar
1396e91cacaSYinan Xu  }
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() :=
1476e91cacaSYinan Xu      l3_banks(i).node
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
1583e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
159006e1884SZihao Yu    val io = IO(new Bundle{
160466eb0a8SZihao Yu      val meip = Input(Bool())
161a428082bSLinJiawei      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
162006e1884SZihao Yu    })
1635d65f258SYinan Xu    for (i <- 0 until NumCores) {
1645d65f258SYinan Xu      xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip
1655d65f258SYinan Xu      xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip
1665d65f258SYinan Xu      xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip))
1675d65f258SYinan Xu    }
1681e1cfa36SAllen    // do not let dma AXI signals optimized out
1691e1cfa36SAllen    chisel3.dontTouch(dma.out.head._1)
1701e1cfa36SAllen    chisel3.dontTouch(extDev.out.head._1)
171006e1884SZihao Yu  }
1723e586e47Slinjiawei
1733e586e47Slinjiawei}
174