xref: /XiangShan/src/main/scala/top/Top.scala (revision f320e0f01bd645f0a3045a8a740e60dd770734a9)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
178b037849SYinan Xupackage top
188b037849SYinan Xu
198b037849SYinan Xuimport chisel3._
208b037849SYinan Xuimport chisel3.util._
218b037849SYinan Xuimport xiangshan._
2294c92d92SYinan Xuimport utils._
238b037849SYinan Xuimport system._
248b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation
252225d46eSJiawei Linimport chipsalliance.rocketchip.config._
262e3a956eSLinJiaweiimport device.{AXI4Plic, TLTimer}
27afcc4f2aSJiawei Linimport firrtl.stage.RunFirrtlTransformAnnotation
288b037849SYinan Xuimport freechips.rocketchip.diplomacy._
298b037849SYinan Xuimport freechips.rocketchip.tilelink._
308b037849SYinan Xuimport freechips.rocketchip.amba.axi4._
31afcc4f2aSJiawei Linimport freechips.rocketchip.devices.tilelink._
322e3a956eSLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode
33afcc4f2aSJiawei Linimport freechips.rocketchip.interrupts._
34afcc4f2aSJiawei Linimport freechips.rocketchip.stage.phases.GenerateArtefacts
352e3a956eSLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen}
36afcc4f2aSJiawei Linimport freechips.rocketchip.util.{ElaborationArtefacts, HasRocketChipStageUtils}
37afcc4f2aSJiawei Linimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters}
388b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher
398b037849SYinan Xu
408b037849SYinan Xu
412225d46eSJiawei Linclass XSCoreWithL2()(implicit p: Parameters) extends LazyModule
422225d46eSJiawei Lin  with HasXSParameter with HasSoCParameter {
43afcc4f2aSJiawei Lin  private val core = LazyModule(new XSCore)
4494c92d92SYinan Xu  private val l2prefetcher = LazyModule(new L2Prefetcher())
4594c92d92SYinan Xu  private val l2xbar = TLXbar()
469d5a2027SYinan Xu  private val l2cache = if (useFakeL2Cache) null else LazyModule(new InclusiveCache(
476c4d7a40SYinan Xu    CacheParameters(
486c4d7a40SYinan Xu      level = 2,
496c4d7a40SYinan Xu      ways = L2NWays,
506c4d7a40SYinan Xu      sets = L2NSets,
516c4d7a40SYinan Xu      blockBytes = L2BlockSize,
526c4d7a40SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
5311b3c588SAllen      cacheName = s"L2",
5483cb791fSallen      uncachedGet = true,
5511b3c588SAllen      enablePerf = false
566c4d7a40SYinan Xu    ),
576c4d7a40SYinan Xu    InclusiveCacheMicroParameters(
58f5089e26SWonicon      memCycles = 25,
596c4d7a40SYinan Xu      writeBytes = 32
602791c549Szfw    ),
612225d46eSJiawei Lin    fpga = debugOpts.FPGAPlatform
626c4d7a40SYinan Xu  ))
63afcc4f2aSJiawei Lin  if(!useFakeL2Cache) {
64afcc4f2aSJiawei Lin    ResourceBinding {
65afcc4f2aSJiawei Lin      Resource(l2cache.device, "reg").bind(ResourceAddress(hardId))
66afcc4f2aSJiawei Lin    }
67afcc4f2aSJiawei Lin  }
689d5a2027SYinan Xu
699d5a2027SYinan Xu  val memory_port = TLIdentityNode()
7094c92d92SYinan Xu  val uncache = TLXbar()
716c4d7a40SYinan Xu
729d5a2027SYinan Xu  if (!useFakeDCache) {
736c4d7a40SYinan Xu    l2xbar := TLBuffer() := core.memBlock.dcache.clientNode
749d5a2027SYinan Xu  }
759d5a2027SYinan Xu  if (!useFakeL1plusCache) {
766c4d7a40SYinan Xu    l2xbar := TLBuffer() := core.l1pluscache.clientNode
779d5a2027SYinan Xu  }
789d5a2027SYinan Xu  if (!useFakePTW) {
796c4d7a40SYinan Xu    l2xbar := TLBuffer() := core.ptw.node
809d5a2027SYinan Xu  }
816c4d7a40SYinan Xu  l2xbar := TLBuffer() := l2prefetcher.clientNode
829d5a2027SYinan Xu  if (useFakeL2Cache) {
839d5a2027SYinan Xu    memory_port := l2xbar
849d5a2027SYinan Xu  }
859d5a2027SYinan Xu  else {
866c4d7a40SYinan Xu    l2cache.node := TLBuffer() := l2xbar
879d5a2027SYinan Xu    memory_port := l2cache.node
889d5a2027SYinan Xu  }
896c4d7a40SYinan Xu
9094c92d92SYinan Xu  uncache := TLBuffer() := core.frontend.instrUncache.clientNode
9194c92d92SYinan Xu  uncache := TLBuffer() := core.memBlock.uncache.clientNode
926c4d7a40SYinan Xu
9394c92d92SYinan Xu  lazy val module = new LazyModuleImp(this) {
946c4d7a40SYinan Xu    val io = IO(new Bundle {
956c4d7a40SYinan Xu      val hartId = Input(UInt(64.W))
966c4d7a40SYinan Xu      val externalInterrupt = new ExternalInterruptIO
974e3ce935Sljw      val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo
986c4d7a40SYinan Xu    })
996c4d7a40SYinan Xu
10094c92d92SYinan Xu    core.module.io.hartId := io.hartId
10194c92d92SYinan Xu    core.module.io.externalInterrupt := io.externalInterrupt
102c0bc1ee4SYinan Xu    l2prefetcher.module.io.enable := core.module.io.l2_pf_enable
1039d5a2027SYinan Xu    if (useFakeL2Cache) {
1049d5a2027SYinan Xu      l2prefetcher.module.io.in := DontCare
1059d5a2027SYinan Xu    }
1069d5a2027SYinan Xu    else {
10794c92d92SYinan Xu      l2prefetcher.module.io.in <> l2cache.module.io
1089d5a2027SYinan Xu    }
10994c92d92SYinan Xu    io.l1plus_error <> core.module.io.l1plus_error
11094c92d92SYinan Xu    io.icache_error <> core.module.io.icache_error
11194c92d92SYinan Xu    io.dcache_error <> core.module.io.dcache_error
1126c4d7a40SYinan Xu
1132225d46eSJiawei Lin    val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
11494c92d92SYinan Xu    core.module.reset := core_reset_gen.io.out
11594c92d92SYinan Xu
1162225d46eSJiawei Lin    val l2_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
11794c92d92SYinan Xu    l2prefetcher.module.reset := l2_reset_gen.io.out
1189d5a2027SYinan Xu    if (!useFakeL2Cache) {
11994c92d92SYinan Xu      l2cache.module.reset := l2_reset_gen.io.out
12094c92d92SYinan Xu    }
12194c92d92SYinan Xu  }
1229d5a2027SYinan Xu}
1236c4d7a40SYinan Xu
124afcc4f2aSJiawei Linabstract class BaseXSSoc()(implicit p: Parameters) extends LazyModule
125afcc4f2aSJiawei Lin  with HasSoCParameter
126afcc4f2aSJiawei Lin  with BindingScope
127afcc4f2aSJiawei Lin{
1288b037849SYinan Xu  val bankedNode = BankBinder(L3NBanks, L3BlockSize)
1298b037849SYinan Xu  val peripheralXbar = TLXbar()
1308b037849SYinan Xu  val l3_xbar = TLXbar()
131afcc4f2aSJiawei Lin  lazy val dts = DTS(bindingTree)
1328b037849SYinan Xu}
1338b037849SYinan Xu
1348b037849SYinan Xu// We adapt the following three traits from rocket-chip.
1358b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala
1368b037849SYinan Xutrait HaveSlaveAXI4Port {
1378b037849SYinan Xu  this: BaseXSSoc =>
1388b037849SYinan Xu
1398b037849SYinan Xu  val idBits = 16
1408b037849SYinan Xu
1418b037849SYinan Xu  val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters(
1428b037849SYinan Xu    Seq(AXI4MasterParameters(
1438b037849SYinan Xu      name = "dma",
1448b037849SYinan Xu      id = IdRange(0, 1 << idBits)
1458b037849SYinan Xu    ))
1468b037849SYinan Xu  )))
1478b037849SYinan Xu  private val errorDevice = LazyModule(new TLError(
1488b037849SYinan Xu    params = DevNullParams(
1498b037849SYinan Xu      address = Seq(AddressSet(0x0, 0x7fffffffL)),
1508b037849SYinan Xu      maxAtomic = 8,
1518b037849SYinan Xu      maxTransfer = 64),
1522225d46eSJiawei Lin    beatBytes = L3InnerBusWidth / 8
1538b037849SYinan Xu  ))
1548b037849SYinan Xu  private val error_xbar = TLXbar()
1558b037849SYinan Xu
1568b037849SYinan Xu  error_xbar :=
1578b037849SYinan Xu    AXI4ToTL() :=
1588b037849SYinan Xu    AXI4UserYanker(Some(1)) :=
1598b037849SYinan Xu    AXI4Fragmenter() :=
1608b037849SYinan Xu    AXI4IdIndexer(1) :=
1618b037849SYinan Xu    l3FrontendAXI4Node
1628b037849SYinan Xu  errorDevice.node := error_xbar
1638b037849SYinan Xu  l3_xbar :=
1648b037849SYinan Xu    TLBuffer() :=
1658b037849SYinan Xu    error_xbar
1668b037849SYinan Xu
1678b037849SYinan Xu  val dma = InModuleBody {
1688b037849SYinan Xu    l3FrontendAXI4Node.makeIOs()
1698b037849SYinan Xu  }
1708b037849SYinan Xu}
1718b037849SYinan Xu
1728b037849SYinan Xutrait HaveAXI4MemPort {
1738b037849SYinan Xu  this: BaseXSSoc =>
174afcc4f2aSJiawei Lin  val device = new MemoryDevice
1758b037849SYinan Xu  // 40-bit physical address
1768b037849SYinan Xu  val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL))
177329e267dSYinan Xu  val memAXI4SlaveNode = AXI4SlaveNode(Seq(
1788b037849SYinan Xu    AXI4SlavePortParameters(
1798b037849SYinan Xu      slaves = Seq(
1808b037849SYinan Xu        AXI4SlaveParameters(
1818b037849SYinan Xu          address = memRange,
1828b037849SYinan Xu          regionType = RegionType.UNCACHED,
1838b037849SYinan Xu          executable = true,
1848b037849SYinan Xu          supportsRead = TransferSizes(1, L3BlockSize),
1858b037849SYinan Xu          supportsWrite = TransferSizes(1, L3BlockSize),
186afcc4f2aSJiawei Lin          interleavedId = Some(0),
187afcc4f2aSJiawei Lin          resources = device.reg("mem")
1888b037849SYinan Xu        )
1898b037849SYinan Xu      ),
1902225d46eSJiawei Lin      beatBytes = L3OuterBusWidth / 8
1918b037849SYinan Xu    )
192329e267dSYinan Xu  ))
1938b037849SYinan Xu
194329e267dSYinan Xu  val mem_xbar = TLXbar()
195329e267dSYinan Xu  mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode
196329e267dSYinan Xu  memAXI4SlaveNode :=
197329e267dSYinan Xu    AXI4UserYanker() :=
198329e267dSYinan Xu    AXI4Deinterleaver(L3BlockSize) :=
199329e267dSYinan Xu    TLToAXI4() :=
2002225d46eSJiawei Lin    TLWidthWidget(L3OuterBusWidth / 8) :=
201329e267dSYinan Xu    mem_xbar
2028b037849SYinan Xu
2038b037849SYinan Xu  val memory = InModuleBody {
2048b037849SYinan Xu    memAXI4SlaveNode.makeIOs()
2058b037849SYinan Xu  }
2068b037849SYinan Xu}
2078b037849SYinan Xu
2088b037849SYinan Xu
2098b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc =>
2108b037849SYinan Xu  // on-chip devices: 0x3800_000 - 0x3fff_ffff
2118b037849SYinan Xu  val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL)
212afcc4f2aSJiawei Lin  val uartRange = AddressSet(0x40600000, 0xf)
213afcc4f2aSJiawei Lin  val uartDevice = new SimpleDevice("serial", Seq("xilinx,uartlite"))
214afcc4f2aSJiawei Lin  val uartParams = AXI4SlaveParameters(
215afcc4f2aSJiawei Lin    address = Seq(uartRange),
216afcc4f2aSJiawei Lin    regionType = RegionType.UNCACHED,
217afcc4f2aSJiawei Lin    supportsRead = TransferSizes(1, 8),
218afcc4f2aSJiawei Lin    supportsWrite = TransferSizes(1, 8),
219afcc4f2aSJiawei Lin    resources = uartDevice.reg
220afcc4f2aSJiawei Lin  )
221afcc4f2aSJiawei Lin  val peripheralRange = AddressSet(
222afcc4f2aSJiawei Lin    0x0, 0x7fffffff
223afcc4f2aSJiawei Lin  ).subtract(onChipPeripheralRange).flatMap(x => x.subtract(uartRange))
2248b037849SYinan Xu  val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters(
2258b037849SYinan Xu    Seq(AXI4SlaveParameters(
2268b037849SYinan Xu      address = peripheralRange,
2278b037849SYinan Xu      regionType = RegionType.UNCACHED,
2288b037849SYinan Xu      supportsRead = TransferSizes(1, 8),
2298b037849SYinan Xu      supportsWrite = TransferSizes(1, 8),
2308b037849SYinan Xu      interleavedId = Some(0)
231afcc4f2aSJiawei Lin    ), uartParams),
2328b037849SYinan Xu    beatBytes = 8
2338b037849SYinan Xu  )))
2348b037849SYinan Xu
2358b037849SYinan Xu  peripheralNode :=
2368b037849SYinan Xu    AXI4UserYanker() :=
2379d4d50e0SYinan Xu    AXI4Deinterleaver(8) :=
2388b037849SYinan Xu    TLToAXI4() :=
2398b037849SYinan Xu    peripheralXbar
2408b037849SYinan Xu
2418b037849SYinan Xu  val peripheral = InModuleBody {
2428b037849SYinan Xu    peripheralNode.makeIOs()
2438b037849SYinan Xu  }
2448b037849SYinan Xu
2458b037849SYinan Xu}
2468b037849SYinan Xu
2472225d46eSJiawei Linclass XSTop()(implicit p: Parameters) extends XSTopWithoutDMA
2482225d46eSJiawei Lin  with HaveSlaveAXI4Port
2498b037849SYinan Xu
2502225d46eSJiawei Linclass XSTopWithoutDMA()(implicit p: Parameters) extends BaseXSSoc()
2518b037849SYinan Xu  with HaveAXI4MemPort
2528b037849SYinan Xu  with HaveAXI4PeripheralPort
2538b037849SYinan Xu{
254afcc4f2aSJiawei Lin  ResourceBinding {
255afcc4f2aSJiawei Lin    val width = ResourceInt(2)
256afcc4f2aSJiawei Lin    val model = "freechips,rocketchip-unknown"
257afcc4f2aSJiawei Lin    Resource(ResourceAnchors.root, "model").bind(ResourceString(model))
258afcc4f2aSJiawei Lin    Resource(ResourceAnchors.root, "compat").bind(ResourceString(model + "-dev"))
259afcc4f2aSJiawei Lin    Resource(ResourceAnchors.soc, "compat").bind(ResourceString(model + "-soc"))
260afcc4f2aSJiawei Lin    Resource(ResourceAnchors.root, "width").bind(width)
261afcc4f2aSJiawei Lin    Resource(ResourceAnchors.soc, "width").bind(width)
262afcc4f2aSJiawei Lin    Resource(ResourceAnchors.cpus, "width").bind(ResourceInt(1))
263afcc4f2aSJiawei Lin    def bindManagers(xbar: TLNexusNode) = {
264afcc4f2aSJiawei Lin      ManagerUnification(xbar.edges.in.head.manager.managers).foreach{ manager =>
265afcc4f2aSJiawei Lin        manager.resources.foreach(r => r.bind(manager.toResource))
266afcc4f2aSJiawei Lin      }
267afcc4f2aSJiawei Lin    }
268afcc4f2aSJiawei Lin    bindManagers(l3_xbar.asInstanceOf[TLNexusNode])
269afcc4f2aSJiawei Lin    bindManagers(peripheralXbar.asInstanceOf[TLNexusNode])
270afcc4f2aSJiawei Lin  }
2718b037849SYinan Xu
2722225d46eSJiawei Lin  println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3OuterBusWidth")
2738b037849SYinan Xu
2742225d46eSJiawei Lin  val core_with_l2 = soc.cores.map(coreParams =>
2752225d46eSJiawei Lin    LazyModule(new XSCoreWithL2()(p.alterPartial({
2762225d46eSJiawei Lin      case XSCoreParamsKey => coreParams
2772225d46eSJiawei Lin    })))
2782225d46eSJiawei Lin  )
2798b037849SYinan Xu
2808b037849SYinan Xu  for (i <- 0 until NumCores) {
28194c92d92SYinan Xu    peripheralXbar := TLBuffer() := core_with_l2(i).uncache
2829d5a2027SYinan Xu    l3_xbar := TLBuffer() := core_with_l2(i).memory_port
2838b037849SYinan Xu  }
2848b037849SYinan Xu
285afcc4f2aSJiawei Lin  val clint = LazyModule(new CLINT(CLINTParams(0x38000000L), 8))
2868b037849SYinan Xu  clint.node := peripheralXbar
2878b037849SYinan Xu
288afcc4f2aSJiawei Lin  val clintIntSinks = Array.fill(NumCores){
289afcc4f2aSJiawei Lin    val clintSink = LazyModule(new IntSinkNodeToModule(2))
290afcc4f2aSJiawei Lin    clintSink.sinkNode := clint.intnode
291afcc4f2aSJiawei Lin    clintSink
292afcc4f2aSJiawei Lin  }
293afcc4f2aSJiawei Lin
2942e3a956eSLinJiawei  val fakeTreeNode = new GenericLogicalTreeNode
2952e3a956eSLinJiawei  val beu = LazyModule(
2962e3a956eSLinJiawei    new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode))
2972e3a956eSLinJiawei  beu.node := peripheralXbar
2982e3a956eSLinJiawei
299afcc4f2aSJiawei Lin  class IntSinkNodeToModule(val sinks: Int)(implicit p: Parameters) extends LazyModule {
300afcc4f2aSJiawei Lin    val sinkNode = IntSinkNode(IntSinkPortSimple(1, sinks))
3012e3a956eSLinJiawei    lazy val module = new LazyModuleImp(this){
302afcc4f2aSJiawei Lin      val out = IO(Output(Vec(sinks, Bool())))
303afcc4f2aSJiawei Lin      out.zip(sinkNode.in.head._1).foreach{ case (o, i) => o := i }
3042e3a956eSLinJiawei    }
3052e3a956eSLinJiawei  }
3062e3a956eSLinJiawei
307afcc4f2aSJiawei Lin  class IntSourceNodeToModule(val num: Int)(implicit p: Parameters) extends LazyModule {
308afcc4f2aSJiawei Lin    val sourceNode = IntSourceNode(IntSourcePortSimple(num, ports = 1, sources = 1))
309afcc4f2aSJiawei Lin    lazy val module = new LazyModuleImp(this){
310afcc4f2aSJiawei Lin      val in = IO(Input(Vec(num, Bool())))
311afcc4f2aSJiawei Lin      in.zip(sourceNode.out.head._1).foreach{ case (i, s) => s := i }
312afcc4f2aSJiawei Lin    }
313afcc4f2aSJiawei Lin  }
314afcc4f2aSJiawei Lin
315afcc4f2aSJiawei Lin  val plic = LazyModule(new TLPLIC(PLICParams(0x3c000000L), 8))
316afcc4f2aSJiawei Lin  val plicSource = LazyModule(new IntSourceNodeToModule(NrExtIntr))
317afcc4f2aSJiawei Lin  val plicIntSinks = Array.fill(NumCores){
318afcc4f2aSJiawei Lin    val plicSink = LazyModule(new IntSinkNodeToModule(1))
319afcc4f2aSJiawei Lin    plicSink.sinkNode := plic.intnode
320afcc4f2aSJiawei Lin    plicSink
321afcc4f2aSJiawei Lin  }
322afcc4f2aSJiawei Lin  plic.intnode := beu.intNode
323afcc4f2aSJiawei Lin  plic.intnode := plicSource.sourceNode
324afcc4f2aSJiawei Lin
325afcc4f2aSJiawei Lin  plic.node := peripheralXbar
3268b037849SYinan Xu
3279d5a2027SYinan Xu  val l3cache = if (useFakeL3Cache) null else LazyModule(new InclusiveCache(
3288b037849SYinan Xu    CacheParameters(
3298b037849SYinan Xu      level = 3,
3308b037849SYinan Xu      ways = L3NWays,
3318b037849SYinan Xu      sets = L3NSets,
3328b037849SYinan Xu      blockBytes = L3BlockSize,
3332225d46eSJiawei Lin      beatBytes = L3InnerBusWidth / 8,
33411b3c588SAllen      cacheName = "L3",
33583cb791fSallen      uncachedGet = false,
33611b3c588SAllen      enablePerf = false
3378b037849SYinan Xu    ),
3388b037849SYinan Xu    InclusiveCacheMicroParameters(
339f5089e26SWonicon      memCycles = 25,
3408b037849SYinan Xu      writeBytes = 32
3412791c549Szfw    ),
3422225d46eSJiawei Lin    fpga = debugOpts.FPGAPlatform
34394c92d92SYinan Xu  ))
344afcc4f2aSJiawei Lin  if(!useFakeL3Cache){
345afcc4f2aSJiawei Lin    ResourceBinding{
346afcc4f2aSJiawei Lin      Resource(l3cache.device, "reg").bind(ResourceAddress(0))
347afcc4f2aSJiawei Lin    }
348afcc4f2aSJiawei Lin  }
3499d5a2027SYinan Xu  val l3Ignore = if (useFakeL3Cache) TLIgnoreNode() else null
3508b037849SYinan Xu
3519d5a2027SYinan Xu  if (useFakeL3Cache) {
3529d5a2027SYinan Xu    bankedNode :*= l3Ignore :*= l3_xbar
3539d5a2027SYinan Xu  }
3549d5a2027SYinan Xu  else {
35594c92d92SYinan Xu    bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar
3569d5a2027SYinan Xu  }
3578b037849SYinan Xu
35894c92d92SYinan Xu  lazy val module = new LazyRawModuleImp(this) {
359afcc4f2aSJiawei Lin    ElaborationArtefacts.add("dts", dts)
3608b037849SYinan Xu    val io = IO(new Bundle {
36194c92d92SYinan Xu      val clock = Input(Bool())
36294c92d92SYinan Xu      val reset = Input(Bool())
3638b037849SYinan Xu      val extIntrs = Input(UInt(NrExtIntr.W))
3648b037849SYinan Xu      // val meip = Input(Vec(NumCores, Bool()))
3652225d46eSJiawei Lin      val ila = if(debugOpts.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
3668b037849SYinan Xu    })
36794c92d92SYinan Xu    childClock := io.clock.asClock()
3688b037849SYinan Xu
36994c92d92SYinan Xu    withClockAndReset(childClock, io.reset) {
3702225d46eSJiawei Lin      val resetGen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
37194c92d92SYinan Xu      resetGen.suggestName("top_reset_gen")
37294c92d92SYinan Xu      childReset := resetGen.io.out
37394c92d92SYinan Xu    }
37494c92d92SYinan Xu
37594c92d92SYinan Xu    withClockAndReset(childClock, childReset) {
376afcc4f2aSJiawei Lin      plicSource.module.in := io.extIntrs.asBools()
377c0bc1ee4SYinan Xu
3788b037849SYinan Xu      for (i <- 0 until NumCores) {
3792225d46eSJiawei Lin        val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
38094c92d92SYinan Xu        core_reset_gen.suggestName(s"core_${i}_reset_gen")
38194c92d92SYinan Xu        core_with_l2(i).module.reset := core_reset_gen.io.out
3826c4d7a40SYinan Xu        core_with_l2(i).module.io.hartId := i.U
383afcc4f2aSJiawei Lin        core_with_l2(i).module.io.externalInterrupt.msip := clintIntSinks(i).module.out(0)
384afcc4f2aSJiawei Lin        core_with_l2(i).module.io.externalInterrupt.mtip := clintIntSinks(i).module.out(1)
385afcc4f2aSJiawei Lin        core_with_l2(i).module.io.externalInterrupt.meip := plicIntSinks(i).module.out(0)
386c0bc1ee4SYinan Xu        beu.module.io.errors.l1plus(i) := core_with_l2(i).module.io.l1plus_error
387c0bc1ee4SYinan Xu        beu.module.io.errors.icache(i) := core_with_l2(i).module.io.icache_error
388c0bc1ee4SYinan Xu        beu.module.io.errors.dcache(i) := core_with_l2(i).module.io.dcache_error
3898b037849SYinan Xu      }
3908b037849SYinan Xu
3919d5a2027SYinan Xu      if (!useFakeL3Cache) {
3922225d46eSJiawei Lin        val l3_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform))
39394c92d92SYinan Xu        l3_reset_gen.suggestName("l3_reset_gen")
39494c92d92SYinan Xu        l3cache.module.reset := l3_reset_gen.io.out
39594c92d92SYinan Xu      }
396330595dfSJiawei Lin      // TODO: wrap this in a module
397330595dfSJiawei Lin      val freq = 100
398330595dfSJiawei Lin      val cnt = RegInit(freq.U)
399330595dfSJiawei Lin      val tick = cnt === 0.U
400330595dfSJiawei Lin      cnt := Mux(tick, freq.U, cnt - 1.U)
401330595dfSJiawei Lin      clint.module.io.rtcTick := tick
4028b037849SYinan Xu    }
4038b037849SYinan Xu  }
4049d5a2027SYinan Xu}
4058b037849SYinan Xu
406afcc4f2aSJiawei Linobject TopMain extends App with HasRocketChipStageUtils {
4078b037849SYinan Xu  override def main(args: Array[String]): Unit = {
40845c767e3SLinJiawei    val (config, firrtlOpts) = ArgParser.parse(args)
40945c767e3SLinJiawei    XiangShanStage.execute(firrtlOpts, Seq(
4108b037849SYinan Xu      ChiselGeneratorAnnotation(() => {
41145c767e3SLinJiawei        val soc = LazyModule(new XSTop()(config))
4128b037849SYinan Xu        soc.module
4138b037849SYinan Xu      })
4148b037849SYinan Xu    ))
415afcc4f2aSJiawei Lin    ElaborationArtefacts.files.foreach{ case (extension, contents) =>
416afcc4f2aSJiawei Lin      writeOutputFile("./build", s"XSTop.${extension}", contents())
417afcc4f2aSJiawei Lin    }
4188b037849SYinan Xu  }
4198b037849SYinan Xu}
420