xref: /XiangShan/src/main/scala/top/Top.scala (revision 94c92d9235829ac598307345069f2016121bee4c)
18b037849SYinan Xupackage top
28b037849SYinan Xu
38b037849SYinan Xuimport chisel3._
48b037849SYinan Xuimport chisel3.util._
58b037849SYinan Xuimport xiangshan._
6*94c92d92SYinan Xuimport utils._
78b037849SYinan Xuimport system._
88b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation
98b037849SYinan Xuimport chipsalliance.rocketchip.config
102e3a956eSLinJiaweiimport chipsalliance.rocketchip.config.Config
112e3a956eSLinJiaweiimport device.{AXI4Plic, TLTimer}
128b037849SYinan Xuimport freechips.rocketchip.diplomacy._
138b037849SYinan Xuimport freechips.rocketchip.tilelink._
148b037849SYinan Xuimport freechips.rocketchip.amba.axi4._
158b037849SYinan Xuimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError}
162e3a956eSLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode
172e3a956eSLinJiaweiimport freechips.rocketchip.interrupts.{IntSinkNode, IntSinkPortSimple}
182e3a956eSLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen}
19*94c92d92SYinan Xuimport sifive.blocks.inclusivecache.{InclusiveCache, InclusiveCacheMicroParameters, CacheParameters}
208b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher
218b037849SYinan Xu
228b037849SYinan Xu
236c4d7a40SYinan Xuclass XSCoreWithL2()(implicit p: config.Parameters) extends LazyModule
246c4d7a40SYinan Xu  with HasXSParameter {
25*94c92d92SYinan Xu  private val core = LazyModule(new XSCore())
26*94c92d92SYinan Xu  private val l2prefetcher = LazyModule(new L2Prefetcher())
27*94c92d92SYinan Xu  private val l2xbar = TLXbar()
28*94c92d92SYinan Xu
296c4d7a40SYinan Xu  val l2cache = LazyModule(new InclusiveCache(
306c4d7a40SYinan Xu    CacheParameters(
316c4d7a40SYinan Xu      level = 2,
326c4d7a40SYinan Xu      ways = L2NWays,
336c4d7a40SYinan Xu      sets = L2NSets,
346c4d7a40SYinan Xu      blockBytes = L2BlockSize,
356c4d7a40SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
3611b3c588SAllen      cacheName = s"L2",
3711b3c588SAllen      enablePerf = false
386c4d7a40SYinan Xu    ),
396c4d7a40SYinan Xu    InclusiveCacheMicroParameters(
40f5089e26SWonicon      memCycles = 25,
416c4d7a40SYinan Xu      writeBytes = 32
426c4d7a40SYinan Xu    )
436c4d7a40SYinan Xu  ))
44*94c92d92SYinan Xu  val uncache = TLXbar()
456c4d7a40SYinan Xu
466c4d7a40SYinan Xu  l2xbar := TLBuffer() := core.memBlock.dcache.clientNode
476c4d7a40SYinan Xu  l2xbar := TLBuffer() := core.l1pluscache.clientNode
486c4d7a40SYinan Xu  l2xbar := TLBuffer() := core.ptw.node
496c4d7a40SYinan Xu  l2xbar := TLBuffer() := l2prefetcher.clientNode
506c4d7a40SYinan Xu  l2cache.node := TLBuffer() := l2xbar
516c4d7a40SYinan Xu
52*94c92d92SYinan Xu  uncache := TLBuffer() := core.frontend.instrUncache.clientNode
53*94c92d92SYinan Xu  uncache := TLBuffer() := core.memBlock.uncache.clientNode
546c4d7a40SYinan Xu
55*94c92d92SYinan Xu  lazy val module = new LazyModuleImp(this) {
566c4d7a40SYinan Xu    val io = IO(new Bundle {
576c4d7a40SYinan Xu      val hartId = Input(UInt(64.W))
586c4d7a40SYinan Xu      val externalInterrupt = new ExternalInterruptIO
594e3ce935Sljw      val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo
606c4d7a40SYinan Xu    })
616c4d7a40SYinan Xu
62*94c92d92SYinan Xu    core.module.io.hartId := io.hartId
63*94c92d92SYinan Xu    core.module.io.externalInterrupt := io.externalInterrupt
64*94c92d92SYinan Xu    l2prefetcher.module.io.enable := RegNext(core.module.io.l2_pf_enable)
65*94c92d92SYinan Xu    l2prefetcher.module.io.in <> l2cache.module.io
66*94c92d92SYinan Xu    io.l1plus_error <> core.module.io.l1plus_error
67*94c92d92SYinan Xu    io.icache_error <> core.module.io.icache_error
68*94c92d92SYinan Xu    io.dcache_error <> core.module.io.dcache_error
696c4d7a40SYinan Xu
70*94c92d92SYinan Xu    val core_reset_gen = Module(new ResetGen())
71*94c92d92SYinan Xu    core.module.reset := core_reset_gen.io.out
72*94c92d92SYinan Xu
73*94c92d92SYinan Xu    val l2_reset_gen = Module(new ResetGen())
74*94c92d92SYinan Xu    l2prefetcher.module.reset := l2_reset_gen.io.out
75*94c92d92SYinan Xu    l2cache.module.reset := l2_reset_gen.io.out
76*94c92d92SYinan Xu  }
77*94c92d92SYinan Xu}
786c4d7a40SYinan Xu
798b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter {
808b037849SYinan Xu  val bankedNode = BankBinder(L3NBanks, L3BlockSize)
818b037849SYinan Xu  val peripheralXbar = TLXbar()
828b037849SYinan Xu  val l3_xbar = TLXbar()
838b037849SYinan Xu}
848b037849SYinan Xu
858b037849SYinan Xu// We adapt the following three traits from rocket-chip.
868b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala
878b037849SYinan Xutrait HaveSlaveAXI4Port {
888b037849SYinan Xu  this: BaseXSSoc =>
898b037849SYinan Xu
908b037849SYinan Xu  val idBits = 16
918b037849SYinan Xu
928b037849SYinan Xu  val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters(
938b037849SYinan Xu    Seq(AXI4MasterParameters(
948b037849SYinan Xu      name = "dma",
958b037849SYinan Xu      id = IdRange(0, 1 << idBits)
968b037849SYinan Xu    ))
978b037849SYinan Xu  )))
988b037849SYinan Xu  private val errorDevice = LazyModule(new TLError(
998b037849SYinan Xu    params = DevNullParams(
1008b037849SYinan Xu      address = Seq(AddressSet(0x0, 0x7fffffffL)),
1018b037849SYinan Xu      maxAtomic = 8,
1028b037849SYinan Xu      maxTransfer = 64),
1038b037849SYinan Xu    beatBytes = L2BusWidth / 8
1048b037849SYinan Xu  ))
1058b037849SYinan Xu  private val error_xbar = TLXbar()
1068b037849SYinan Xu
1078b037849SYinan Xu  error_xbar :=
1088b037849SYinan Xu    AXI4ToTL() :=
1098b037849SYinan Xu    AXI4UserYanker(Some(1)) :=
1108b037849SYinan Xu    AXI4Fragmenter() :=
1118b037849SYinan Xu    AXI4IdIndexer(1) :=
1128b037849SYinan Xu    l3FrontendAXI4Node
1138b037849SYinan Xu  errorDevice.node := error_xbar
1148b037849SYinan Xu  l3_xbar :=
1158b037849SYinan Xu    TLBuffer() :=
1168b037849SYinan Xu    error_xbar
1178b037849SYinan Xu
1188b037849SYinan Xu  val dma = InModuleBody {
1198b037849SYinan Xu    l3FrontendAXI4Node.makeIOs()
1208b037849SYinan Xu  }
1218b037849SYinan Xu}
1228b037849SYinan Xu
1238b037849SYinan Xutrait HaveAXI4MemPort {
1248b037849SYinan Xu  this: BaseXSSoc =>
1258b037849SYinan Xu  // 40-bit physical address
1268b037849SYinan Xu  val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL))
127329e267dSYinan Xu  val memAXI4SlaveNode = AXI4SlaveNode(Seq(
1288b037849SYinan Xu    AXI4SlavePortParameters(
1298b037849SYinan Xu      slaves = Seq(
1308b037849SYinan Xu        AXI4SlaveParameters(
1318b037849SYinan Xu          address = memRange,
1328b037849SYinan Xu          regionType = RegionType.UNCACHED,
1338b037849SYinan Xu          executable = true,
1348b037849SYinan Xu          supportsRead = TransferSizes(1, L3BlockSize),
1358b037849SYinan Xu          supportsWrite = TransferSizes(1, L3BlockSize),
1368b037849SYinan Xu          interleavedId = Some(0)
1378b037849SYinan Xu        )
1388b037849SYinan Xu      ),
1398b037849SYinan Xu      beatBytes = L3BusWidth / 8
1408b037849SYinan Xu    )
141329e267dSYinan Xu  ))
1428b037849SYinan Xu
143329e267dSYinan Xu  val mem_xbar = TLXbar()
144329e267dSYinan Xu  mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode
145329e267dSYinan Xu  memAXI4SlaveNode :=
146329e267dSYinan Xu    AXI4UserYanker() :=
147329e267dSYinan Xu    AXI4Deinterleaver(L3BlockSize) :=
148329e267dSYinan Xu    TLToAXI4() :=
149329e267dSYinan Xu    TLWidthWidget(L3BusWidth / 8) :=
150329e267dSYinan Xu    mem_xbar
1518b037849SYinan Xu
1528b037849SYinan Xu  val memory = InModuleBody {
1538b037849SYinan Xu    memAXI4SlaveNode.makeIOs()
1548b037849SYinan Xu  }
1558b037849SYinan Xu}
1568b037849SYinan Xu
1578b037849SYinan Xu
1588b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc =>
1598b037849SYinan Xu  // on-chip devices: 0x3800_000 - 0x3fff_ffff
1608b037849SYinan Xu  val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL)
1618b037849SYinan Xu  val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange)
1628b037849SYinan Xu  val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters(
1638b037849SYinan Xu    Seq(AXI4SlaveParameters(
1648b037849SYinan Xu      address = peripheralRange,
1658b037849SYinan Xu      regionType = RegionType.UNCACHED,
1668b037849SYinan Xu      supportsRead = TransferSizes(1, 8),
1678b037849SYinan Xu      supportsWrite = TransferSizes(1, 8),
1688b037849SYinan Xu      interleavedId = Some(0)
1698b037849SYinan Xu    )),
1708b037849SYinan Xu    beatBytes = 8
1718b037849SYinan Xu  )))
1728b037849SYinan Xu
1738b037849SYinan Xu  peripheralNode :=
1748b037849SYinan Xu    AXI4UserYanker() :=
1759d4d50e0SYinan Xu    AXI4Deinterleaver(8) :=
1768b037849SYinan Xu    TLToAXI4() :=
1778b037849SYinan Xu    peripheralXbar
1788b037849SYinan Xu
1798b037849SYinan Xu  val peripheral = InModuleBody {
1808b037849SYinan Xu    peripheralNode.makeIOs()
1818b037849SYinan Xu  }
1828b037849SYinan Xu
1838b037849SYinan Xu}
1848b037849SYinan Xu
1858b037849SYinan Xu
1868b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc()
1878b037849SYinan Xu  with HaveAXI4MemPort
1888b037849SYinan Xu  with HaveAXI4PeripheralPort
1898b037849SYinan Xu  with HaveSlaveAXI4Port
1908b037849SYinan Xu{
1918b037849SYinan Xu
1928b037849SYinan Xu  println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth")
1938b037849SYinan Xu
1946c4d7a40SYinan Xu  val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2))
1958b037849SYinan Xu
1968b037849SYinan Xu  for (i <- 0 until NumCores) {
197*94c92d92SYinan Xu    peripheralXbar := TLBuffer() := core_with_l2(i).uncache
1986c4d7a40SYinan Xu    l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node
1998b037849SYinan Xu  }
2008b037849SYinan Xu
2018b037849SYinan Xu  private val clint = LazyModule(new TLTimer(
2028b037849SYinan Xu    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
2038b037849SYinan Xu    sim = !env.FPGAPlatform
2048b037849SYinan Xu  ))
2058b037849SYinan Xu  clint.node := peripheralXbar
2068b037849SYinan Xu
2072e3a956eSLinJiawei  val fakeTreeNode = new GenericLogicalTreeNode
2082e3a956eSLinJiawei  val beu = LazyModule(
2092e3a956eSLinJiawei    new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode))
2102e3a956eSLinJiawei  beu.node := peripheralXbar
2112e3a956eSLinJiawei
2122e3a956eSLinJiawei  class BeuSinkNode()(implicit p: config.Parameters) extends LazyModule {
2132e3a956eSLinJiawei    val intSinkNode = IntSinkNode(IntSinkPortSimple())
2142e3a956eSLinJiawei    lazy val module = new LazyModuleImp(this){
2152e3a956eSLinJiawei      val interrupt = IO(Output(Bool()))
2162e3a956eSLinJiawei      interrupt := intSinkNode.in.head._1.head
2172e3a956eSLinJiawei    }
2182e3a956eSLinJiawei  }
2192e3a956eSLinJiawei  val beuSink = LazyModule(new BeuSinkNode())
2202e3a956eSLinJiawei  beuSink.intSinkNode := beu.intNode
2212e3a956eSLinJiawei
2228b037849SYinan Xu  val plic = LazyModule(new AXI4Plic(
2238b037849SYinan Xu    Seq(AddressSet(0x3c000000L, 0x03ffffffL)),
2248b037849SYinan Xu    sim = !env.FPGAPlatform
2258b037849SYinan Xu  ))
2268b037849SYinan Xu  plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar
2278b037849SYinan Xu
2288b037849SYinan Xu  val l3cache = LazyModule(new InclusiveCache(
2298b037849SYinan Xu    CacheParameters(
2308b037849SYinan Xu      level = 3,
2318b037849SYinan Xu      ways = L3NWays,
2328b037849SYinan Xu      sets = L3NSets,
2338b037849SYinan Xu      blockBytes = L3BlockSize,
2348b037849SYinan Xu      beatBytes = L2BusWidth / 8,
23511b3c588SAllen      cacheName = "L3",
23611b3c588SAllen      enablePerf = false
2378b037849SYinan Xu    ),
2388b037849SYinan Xu    InclusiveCacheMicroParameters(
239f5089e26SWonicon      memCycles = 25,
2408b037849SYinan Xu      writeBytes = 32
2418b037849SYinan Xu    )
242*94c92d92SYinan Xu  ))
2438b037849SYinan Xu
244*94c92d92SYinan Xu  bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar
2458b037849SYinan Xu
246*94c92d92SYinan Xu  lazy val module = new LazyRawModuleImp(this) {
2478b037849SYinan Xu    val io = IO(new Bundle {
248*94c92d92SYinan Xu      val clock = Input(Bool())
249*94c92d92SYinan Xu      val reset = Input(Bool())
2508b037849SYinan Xu      val extIntrs = Input(UInt(NrExtIntr.W))
2518b037849SYinan Xu      // val meip = Input(Vec(NumCores, Bool()))
2528b037849SYinan Xu      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
2538b037849SYinan Xu    })
254*94c92d92SYinan Xu    childClock := io.clock.asClock()
2558b037849SYinan Xu
256*94c92d92SYinan Xu    withClockAndReset(childClock, io.reset) {
257*94c92d92SYinan Xu      val resetGen = Module(new ResetGen())
258*94c92d92SYinan Xu      resetGen.suggestName("top_reset_gen")
259*94c92d92SYinan Xu      childReset := resetGen.io.out
260*94c92d92SYinan Xu    }
261*94c92d92SYinan Xu
262*94c92d92SYinan Xu    withClockAndReset(childClock, childReset) {
2638b037849SYinan Xu      plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs))
2648b037849SYinan Xu      for (i <- 0 until NumCores) {
265*94c92d92SYinan Xu        val core_reset_gen = Module(new ResetGen())
266*94c92d92SYinan Xu        core_reset_gen.suggestName(s"core_${i}_reset_gen")
267*94c92d92SYinan Xu        core_with_l2(i).module.reset := core_reset_gen.io.out
2686c4d7a40SYinan Xu        core_with_l2(i).module.io.hartId := i.U
2696c4d7a40SYinan Xu        core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i)
2706c4d7a40SYinan Xu        core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i)
2716c4d7a40SYinan Xu        core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i)
2724e3ce935Sljw        beu.module.io.errors.l1plus(i) := RegNext(core_with_l2(i).module.io.l1plus_error)
2732e3a956eSLinJiawei        beu.module.io.errors.icache(i) := RegNext(core_with_l2(i).module.io.icache_error)
2742e3a956eSLinJiawei        beu.module.io.errors.dcache(i) := RegNext(core_with_l2(i).module.io.dcache_error)
2758b037849SYinan Xu      }
2768b037849SYinan Xu
277*94c92d92SYinan Xu      val l3_reset_gen = Module(new ResetGen())
278*94c92d92SYinan Xu      l3_reset_gen.suggestName("l3_reset_gen")
279*94c92d92SYinan Xu      l3cache.module.reset := l3_reset_gen.io.out
280*94c92d92SYinan Xu    }
2818b037849SYinan Xu  }
2828b037849SYinan Xu}
2838b037849SYinan Xu
2848b037849SYinan Xuobject TopMain extends App {
2858b037849SYinan Xu  override def main(args: Array[String]): Unit = {
2868b037849SYinan Xu    Parameters.set(
2878b037849SYinan Xu      args.contains("--dual-core") match {
2888b037849SYinan Xu        case false => Parameters()
2898b037849SYinan Xu        case true  => Parameters.dualCoreParameters
2908b037849SYinan Xu      }
2918b037849SYinan Xu    )
2928b037849SYinan Xu    val otherArgs = args.filterNot(_ == "--dual-core")
2932e3a956eSLinJiawei    implicit val p = new Config((_, _, _) => {
2942e3a956eSLinJiawei      case XLen => 64
2952e3a956eSLinJiawei    })
2968b037849SYinan Xu    XiangShanStage.execute(otherArgs, Seq(
2978b037849SYinan Xu      ChiselGeneratorAnnotation(() => {
2988b037849SYinan Xu        val soc = LazyModule(new XSTop())
2998b037849SYinan Xu        soc.module
3008b037849SYinan Xu      })
3018b037849SYinan Xu    ))
3028b037849SYinan Xu  }
3038b037849SYinan Xu}
304