xref: /XiangShan/src/main/scala/system/SoC.scala (revision 213775432db77ec3a61c5a37f311ef842819438f)
1006e1884SZihao Yupackage system
2006e1884SZihao Yu
33e586e47Slinjiaweiimport chipsalliance.rocketchip.config.Parameters
44a26299eSwangkaifanimport device.{AXI4Timer, TLTimer, AXI4Plic}
5006e1884SZihao Yuimport chisel3._
6096ea47eSzhanglinjuanimport chisel3.util._
73e586e47Slinjiaweiimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp}
897eae8a0SWang Huizheimport freechips.rocketchip.tilelink.{BankBinder, TLBuffer, TLBundleParameters, TLCacheCork, TLClientNode, TLFilter, TLFuzzer, TLIdentityNode, TLToAXI4, TLWidthWidget, TLXbar}
9279a83c2SAllenimport utils.{DebugIdentityNode, DataDontCareNode}
10737d2306SWang Huizheimport utils.XSInfo
11a165bd69Swangkaifanimport xiangshan.{HasXSParameter, XSCore, HasXSLog, DifftestBundle}
1287b0fcb0Szhanglinjuanimport xiangshan.cache.prefetch._
136e91cacaSYinan Xuimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters}
1497eae8a0SWang Huizheimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp}
1597eae8a0SWang Huizheimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError}
1697eae8a0SWang Huizheimport freechips.rocketchip.amba.axi4.{AXI4Deinterleaver, AXI4Fragmenter, AXI4IdIndexer, AXI4IdentityNode, AXI4ToTL, AXI4UserYanker}
17a428082bSLinJiawei
18a428082bSLinJiaweicase class SoCParameters
19a428082bSLinJiawei(
20f874f036SYinan Xu  NumCores: Integer = 1,
21a428082bSLinJiawei  EnableILA: Boolean = false,
22a428082bSLinJiawei  HasL2Cache: Boolean = false,
23a428082bSLinJiawei  HasPrefetch: Boolean = false
24a428082bSLinJiawei)
25006e1884SZihao Yu
267d5ddbe6SLinJiaweitrait HasSoCParameter extends HasXSParameter{
273e586e47Slinjiawei  val soc = top.Parameters.get.socParameters
28f874f036SYinan Xu  val NumCores = soc.NumCores
29a428082bSLinJiawei  val EnableILA = soc.EnableILA
30a428082bSLinJiawei  val HasL2cache = soc.HasL2Cache
31a428082bSLinJiawei  val HasPrefetch = soc.HasPrefetch
32303b861dSZihao Yu}
33303b861dSZihao Yu
341e3fad10SLinJiaweiclass ILABundle extends Bundle {}
35303b861dSZihao Yu
363e586e47Slinjiawei
373e586e47Slinjiaweiclass DummyCore()(implicit p: Parameters) extends LazyModule {
383e586e47Slinjiawei  val mem = TLFuzzer(nOperations = 10)
393e586e47Slinjiawei  val mmio = TLFuzzer(nOperations = 10)
403e586e47Slinjiawei
413e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
423e586e47Slinjiawei
433e586e47Slinjiawei  }
443e586e47Slinjiawei}
453e586e47Slinjiawei
463e586e47Slinjiawei
473e586e47Slinjiaweiclass XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter {
485d65f258SYinan Xu  // CPU Cores
495d65f258SYinan Xu  private val xs_core = Seq.fill(NumCores)(LazyModule(new XSCore()))
503e586e47Slinjiawei
515d65f258SYinan Xu  // L1 to L2 network
525d65f258SYinan Xu  // -------------------------------------------------
535d65f258SYinan Xu  private val l2_xbar = Seq.fill(NumCores)(TLXbar())
545d65f258SYinan Xu
555d65f258SYinan Xu  private val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache(
565d65f258SYinan Xu    CacheParameters(
575d65f258SYinan Xu      level = 2,
585d65f258SYinan Xu      ways = L2NWays,
595d65f258SYinan Xu      sets = L2NSets,
605d65f258SYinan Xu      blockBytes = L2BlockSize,
615d65f258SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
625d65f258SYinan Xu      cacheName = s"L2"
635d65f258SYinan Xu    ),
645d65f258SYinan Xu    InclusiveCacheMicroParameters(
658d9f4ff7SAllen      writeBytes = 32
665d65f258SYinan Xu    )
675d65f258SYinan Xu  )))
683e586e47Slinjiawei
6987b0fcb0Szhanglinjuan  private val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher()))
7087b0fcb0Szhanglinjuan
716e91cacaSYinan Xu  // L2 to L3 network
726e91cacaSYinan Xu  // -------------------------------------------------
736e91cacaSYinan Xu  private val l3_xbar = TLXbar()
746e91cacaSYinan Xu
7597eae8a0SWang Huizhe  private val l3_node = LazyModule(new InclusiveCache(
766e91cacaSYinan Xu    CacheParameters(
776e91cacaSYinan Xu      level = 3,
786e91cacaSYinan Xu      ways = L3NWays,
796e91cacaSYinan Xu      sets = L3NSets,
806e91cacaSYinan Xu      blockBytes = L3BlockSize,
816e91cacaSYinan Xu      beatBytes = L2BusWidth / 8,
8297eae8a0SWang Huizhe      cacheName = "L3"
836e91cacaSYinan Xu    ),
846e91cacaSYinan Xu    InclusiveCacheMicroParameters(
858d9f4ff7SAllen      writeBytes = 32
866e91cacaSYinan Xu    )
8797eae8a0SWang Huizhe  )).node
886e91cacaSYinan Xu
895d65f258SYinan Xu  // L3 to memory network
905d65f258SYinan Xu  // -------------------------------------------------
915d65f258SYinan Xu  private val memory_xbar = TLXbar()
925d65f258SYinan Xu  private val mmioXbar = TLXbar()
935d65f258SYinan Xu
945d65f258SYinan Xu  // only mem, dma and extDev are visible externally
955d65f258SYinan Xu  val mem = Seq.fill(L3NBanks)(AXI4IdentityNode())
965d65f258SYinan Xu  val dma = AXI4IdentityNode()
975d65f258SYinan Xu  val extDev = AXI4IdentityNode()
985d65f258SYinan Xu
995d65f258SYinan Xu  // connections
1005d65f258SYinan Xu  // -------------------------------------------------
1015d65f258SYinan Xu  for (i <- 0 until NumCores) {
1020cff4510SAllen    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.dcache.clientNode
1035d65f258SYinan Xu    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).l1pluscache.clientNode
1045d65f258SYinan Xu    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := xs_core(i).ptw.node
10587b0fcb0Szhanglinjuan    l2_xbar(i) := TLBuffer() := DebugIdentityNode() := l2prefetcher(i).clientNode
10687b0fcb0Szhanglinjuan
1070cff4510SAllen    mmioXbar   := TLBuffer() := DebugIdentityNode() := xs_core(i).memBlock.uncache.clientNode
108220f98bbSjinyue110    mmioXbar   := TLBuffer() := DebugIdentityNode() := xs_core(i).frontend.instrUncache.clientNode
109279a83c2SAllen    l2cache(i).node := DataDontCareNode(a = true, b = true) := TLBuffer() := DebugIdentityNode() := l2_xbar(i)
1105d65f258SYinan Xu    l3_xbar := TLBuffer() := DebugIdentityNode() := l2cache(i).node
1115d65f258SYinan Xu  }
1126e91cacaSYinan Xu
1136e91cacaSYinan Xu  // DMA should not go to MMIO
1146e91cacaSYinan Xu  val mmioRange = AddressSet(base = 0x0000000000L, mask = 0x007fffffffL)
1156e91cacaSYinan Xu  // AXI4ToTL needs a TLError device to route error requests,
1166e91cacaSYinan Xu  // add one here to make it happy.
1176e91cacaSYinan Xu  val tlErrorParams = DevNullParams(
1186e91cacaSYinan Xu    address = Seq(mmioRange),
1196e91cacaSYinan Xu    maxAtomic = 8,
1206e91cacaSYinan Xu    maxTransfer = 64)
1216e91cacaSYinan Xu  val tlError = LazyModule(new TLError(params = tlErrorParams, beatBytes = L2BusWidth / 8))
1226e91cacaSYinan Xu  private val tlError_xbar = TLXbar()
1236e91cacaSYinan Xu  tlError_xbar :=
1246e91cacaSYinan Xu    AXI4ToTL() :=
1256e91cacaSYinan Xu    AXI4UserYanker(Some(1)) :=
1266e91cacaSYinan Xu    AXI4Fragmenter() :=
1276e91cacaSYinan Xu    AXI4IdIndexer(1) :=
1286e91cacaSYinan Xu    dma
1296e91cacaSYinan Xu  tlError.node := tlError_xbar
1306e91cacaSYinan Xu
1316e91cacaSYinan Xu  l3_xbar :=
1326e91cacaSYinan Xu    TLBuffer() :=
1336e91cacaSYinan Xu    DebugIdentityNode() :=
1346e91cacaSYinan Xu    tlError_xbar
1356e91cacaSYinan Xu
13697eae8a0SWang Huizhe  val bankedNode =
13797eae8a0SWang Huizhe    BankBinder(L3NBanks, L3BlockSize) :*= l3_node :*= TLBuffer() :*= DebugIdentityNode() :*= l3_xbar
1386e91cacaSYinan Xu
1396e91cacaSYinan Xu  for(i <- 0 until L3NBanks) {
1406e91cacaSYinan Xu    mem(i) :=
1416e91cacaSYinan Xu      AXI4UserYanker() :=
1426e91cacaSYinan Xu      TLToAXI4() :=
1436e91cacaSYinan Xu      TLWidthWidget(L3BusWidth / 8) :=
1446e91cacaSYinan Xu      TLCacheCork() :=
14597eae8a0SWang Huizhe      bankedNode
1466e91cacaSYinan Xu  }
1476e91cacaSYinan Xu
1483e586e47Slinjiawei  private val clint = LazyModule(new TLTimer(
1493e586e47Slinjiawei    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
1503e586e47Slinjiawei    sim = !env.FPGAPlatform
1513e586e47Slinjiawei  ))
1523e586e47Slinjiawei
1535d65f258SYinan Xu  clint.node := mmioXbar
1545d65f258SYinan Xu  extDev := AXI4UserYanker() := TLToAXI4() := mmioXbar
1553e586e47Slinjiawei
1564a26299eSwangkaifan  val plic = LazyModule(new AXI4Plic(
1574a26299eSwangkaifan    Seq(AddressSet(0x3c000000L, 0x03ffffffL)),
1584a26299eSwangkaifan    sim = !env.FPGAPlatform
1594a26299eSwangkaifan  ))
1604a26299eSwangkaifan  val plicIdentity = AXI4IdentityNode()
1614a26299eSwangkaifan  plic.node := plicIdentity := AXI4UserYanker() := TLToAXI4() := mmioXbar
1624a26299eSwangkaifan
1633e586e47Slinjiawei  lazy val module = new LazyModuleImp(this){
164006e1884SZihao Yu    val io = IO(new Bundle{
16584eb3d54SYinan Xu      val extIntrs = Input(UInt(NrExtIntr.W))
1664a26299eSwangkaifan      // val meip = Input(Vec(NumCores, Bool()))
167a428082bSLinJiawei      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
168006e1884SZihao Yu    })
169a165bd69Swangkaifan    val difftestIO0 = IO(new DifftestBundle())
170a165bd69Swangkaifan    val difftestIO1 = IO(new DifftestBundle())
171a165bd69Swangkaifan    val difftestIO = Seq(difftestIO0, difftestIO1)
1725f00f642Swangkaifan
1735f00f642Swangkaifan    val trapIO0 = IO(new xiangshan.TrapIO())
1745f00f642Swangkaifan    val trapIO1 = IO(new xiangshan.TrapIO())
1755f00f642Swangkaifan    val trapIO = Seq(trapIO0, trapIO1)
1765f00f642Swangkaifan
17784eb3d54SYinan Xu    plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs))
1784a26299eSwangkaifan
1795d65f258SYinan Xu    for (i <- 0 until NumCores) {
1807a77cff2SYinan Xu      xs_core(i).module.io.hartId := i.U
1810668d426Swangkaifan      xs_core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i)
1820668d426Swangkaifan      xs_core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i)
1834a26299eSwangkaifan      // xs_core(i).module.io.externalInterrupt.meip := RegNext(RegNext(io.meip(i)))
1844a26299eSwangkaifan      xs_core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i)
18587b0fcb0Szhanglinjuan      l2prefetcher(i).module.io.enable := xs_core(i).module.io.l2_pf_enable
186*21377543Szhanglinjuan      l2prefetcher(i).module.io.in <> l2cache(i).module.io
1875d65f258SYinan Xu    }
188*21377543Szhanglinjuan
189a165bd69Swangkaifan    difftestIO0 <> xs_core(0).module.difftestIO
1903d499721Swangkaifan    difftestIO1 <> DontCare
1915f00f642Swangkaifan    trapIO0 <> xs_core(0).module.trapIO
1923d499721Swangkaifan    trapIO1 <> DontCare
1933d499721Swangkaifan
1943d499721Swangkaifan    if (env.DualCore) {
1953d499721Swangkaifan      difftestIO1 <> xs_core(1).module.difftestIO
1965f00f642Swangkaifan      trapIO1 <> xs_core(1).module.trapIO
197a165bd69Swangkaifan    }
1981e1cfa36SAllen    // do not let dma AXI signals optimized out
19984eb3d54SYinan Xu    dontTouch(dma.out.head._1)
20084eb3d54SYinan Xu    dontTouch(extDev.out.head._1)
20184eb3d54SYinan Xu    dontTouch(io.extIntrs)
202006e1884SZihao Yu  }
2033e586e47Slinjiawei
2043e586e47Slinjiawei}
205