xref: /XiangShan/src/main/scala/top/Top.scala (revision 9d4d50e0b3182d6b10ef60d4bd6d07a2774a64c8)
18b037849SYinan Xupackage top
28b037849SYinan Xu
38b037849SYinan Xuimport chisel3._
48b037849SYinan Xuimport chisel3.util._
58b037849SYinan Xuimport xiangshan._
68b037849SYinan Xuimport system._
78b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation
88b037849SYinan Xuimport chipsalliance.rocketchip.config
98b037849SYinan Xuimport device.{TLTimer, AXI4Plic}
108b037849SYinan Xuimport freechips.rocketchip.diplomacy._
118b037849SYinan Xuimport freechips.rocketchip.tilelink._
128b037849SYinan Xuimport freechips.rocketchip.amba.axi4._
138b037849SYinan Xuimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError}
148b037849SYinan Xuimport sifive.blocks.inclusivecache._
158b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher
168b037849SYinan Xu
178b037849SYinan Xu
188b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter {
198b037849SYinan Xu  val bankedNode = BankBinder(L3NBanks, L3BlockSize)
208b037849SYinan Xu  val peripheralXbar = TLXbar()
218b037849SYinan Xu  val l3_xbar = TLXbar()
228b037849SYinan Xu}
238b037849SYinan Xu
248b037849SYinan Xu// We adapt the following three traits from rocket-chip.
258b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala
268b037849SYinan Xutrait HaveSlaveAXI4Port {
278b037849SYinan Xu  this: BaseXSSoc =>
288b037849SYinan Xu
298b037849SYinan Xu  val idBits = 16
308b037849SYinan Xu
318b037849SYinan Xu  val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters(
328b037849SYinan Xu    Seq(AXI4MasterParameters(
338b037849SYinan Xu      name = "dma",
348b037849SYinan Xu      id = IdRange(0, 1 << idBits)
358b037849SYinan Xu    ))
368b037849SYinan Xu  )))
378b037849SYinan Xu  private val errorDevice = LazyModule(new TLError(
388b037849SYinan Xu    params = DevNullParams(
398b037849SYinan Xu      address = Seq(AddressSet(0x0, 0x7fffffffL)),
408b037849SYinan Xu      maxAtomic = 8,
418b037849SYinan Xu      maxTransfer = 64),
428b037849SYinan Xu    beatBytes = L2BusWidth / 8
438b037849SYinan Xu  ))
448b037849SYinan Xu  private val error_xbar = TLXbar()
458b037849SYinan Xu
468b037849SYinan Xu  error_xbar :=
478b037849SYinan Xu    AXI4ToTL() :=
488b037849SYinan Xu    AXI4UserYanker(Some(1)) :=
498b037849SYinan Xu    AXI4Fragmenter() :=
508b037849SYinan Xu    AXI4IdIndexer(1) :=
518b037849SYinan Xu    l3FrontendAXI4Node
528b037849SYinan Xu  errorDevice.node := error_xbar
538b037849SYinan Xu  l3_xbar :=
548b037849SYinan Xu    TLBuffer() :=
558b037849SYinan Xu    error_xbar
568b037849SYinan Xu
578b037849SYinan Xu  val dma = InModuleBody {
588b037849SYinan Xu    l3FrontendAXI4Node.makeIOs()
598b037849SYinan Xu  }
608b037849SYinan Xu}
618b037849SYinan Xu
628b037849SYinan Xutrait HaveAXI4MemPort {
638b037849SYinan Xu  this: BaseXSSoc =>
648b037849SYinan Xu  // 40-bit physical address
658b037849SYinan Xu  val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL))
668b037849SYinan Xu  val memAXI4SlaveNode = AXI4SlaveNode(Seq.tabulate(L3NBanks) { i =>
678b037849SYinan Xu    AXI4SlavePortParameters(
688b037849SYinan Xu      slaves = Seq(
698b037849SYinan Xu        AXI4SlaveParameters(
708b037849SYinan Xu          address = memRange,
718b037849SYinan Xu          regionType = RegionType.UNCACHED,
728b037849SYinan Xu          executable = true,
738b037849SYinan Xu          supportsRead = TransferSizes(1, L3BlockSize),
748b037849SYinan Xu          supportsWrite = TransferSizes(1, L3BlockSize),
758b037849SYinan Xu          interleavedId = Some(0)
768b037849SYinan Xu        )
778b037849SYinan Xu      ),
788b037849SYinan Xu      beatBytes = L3BusWidth / 8
798b037849SYinan Xu    )
808b037849SYinan Xu  })
818b037849SYinan Xu
828b037849SYinan Xu  memAXI4SlaveNode :=*
838b037849SYinan Xu    AXI4UserYanker() :=*
84*9d4d50e0SYinan Xu    AXI4Deinterleaver(L3BlockSize) :=*
858b037849SYinan Xu    TLToAXI4() :=*
868b037849SYinan Xu    TLWidthWidget(L3BusWidth / 8) :=*
878b037849SYinan Xu    TLCacheCork() :=*
888b037849SYinan Xu    bankedNode
898b037849SYinan Xu
908b037849SYinan Xu  val memory = InModuleBody {
918b037849SYinan Xu    memAXI4SlaveNode.makeIOs()
928b037849SYinan Xu  }
938b037849SYinan Xu}
948b037849SYinan Xu
958b037849SYinan Xu
968b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc =>
978b037849SYinan Xu  // on-chip devices: 0x3800_000 - 0x3fff_ffff
988b037849SYinan Xu  val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL)
998b037849SYinan Xu  val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange)
1008b037849SYinan Xu  val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters(
1018b037849SYinan Xu    Seq(AXI4SlaveParameters(
1028b037849SYinan Xu      address = peripheralRange,
1038b037849SYinan Xu      regionType = RegionType.UNCACHED,
1048b037849SYinan Xu      supportsRead = TransferSizes(1, 8),
1058b037849SYinan Xu      supportsWrite = TransferSizes(1, 8),
1068b037849SYinan Xu      interleavedId = Some(0)
1078b037849SYinan Xu    )),
1088b037849SYinan Xu    beatBytes = 8
1098b037849SYinan Xu  )))
1108b037849SYinan Xu
1118b037849SYinan Xu  peripheralNode :=
1128b037849SYinan Xu    AXI4UserYanker() :=
113*9d4d50e0SYinan Xu    AXI4Deinterleaver(8) :=
1148b037849SYinan Xu    TLToAXI4() :=
1158b037849SYinan Xu    peripheralXbar
1168b037849SYinan Xu
1178b037849SYinan Xu  val peripheral = InModuleBody {
1188b037849SYinan Xu    peripheralNode.makeIOs()
1198b037849SYinan Xu  }
1208b037849SYinan Xu
1218b037849SYinan Xu}
1228b037849SYinan Xu
1238b037849SYinan Xu
1248b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc()
1258b037849SYinan Xu  with HaveAXI4MemPort
1268b037849SYinan Xu  with HaveAXI4PeripheralPort
1278b037849SYinan Xu  with HaveSlaveAXI4Port
1288b037849SYinan Xu  {
1298b037849SYinan Xu
1308b037849SYinan Xu  println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth")
1318b037849SYinan Xu
1328b037849SYinan Xu  val core = Seq.fill(NumCores)(LazyModule(new XSCore()))
1338b037849SYinan Xu  val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher()))
1348b037849SYinan Xu  val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache(
1358b037849SYinan Xu    CacheParameters(
1368b037849SYinan Xu      level = 2,
1378b037849SYinan Xu      ways = L2NWays,
1388b037849SYinan Xu      sets = L2NSets,
1398b037849SYinan Xu      blockBytes = L2BlockSize,
1408b037849SYinan Xu      beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8
1418b037849SYinan Xu      cacheName = s"L2"
1428b037849SYinan Xu    ),
1438b037849SYinan Xu    InclusiveCacheMicroParameters(
1448b037849SYinan Xu      writeBytes = 32
1458b037849SYinan Xu    )
1468b037849SYinan Xu  )))
1478b037849SYinan Xu  val l2xbar = Seq.fill(NumCores)(TLXbar())
1488b037849SYinan Xu
1498b037849SYinan Xu  for (i <- 0 until NumCores) {
1508b037849SYinan Xu    peripheralXbar := TLBuffer() := core(i).frontend.instrUncache.clientNode
1518b037849SYinan Xu    peripheralXbar := TLBuffer() := core(i).memBlock.uncache.clientNode
1528b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).memBlock.dcache.clientNode
1538b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).l1pluscache.clientNode
1548b037849SYinan Xu    l2xbar(i) := TLBuffer() := core(i).ptw.node
1558b037849SYinan Xu    l2xbar(i) := TLBuffer() := l2prefetcher(i).clientNode
1568b037849SYinan Xu    l2cache(i).node := TLBuffer() := l2xbar(i)
1578b037849SYinan Xu    l3_xbar := TLBuffer() := l2cache(i).node
1588b037849SYinan Xu  }
1598b037849SYinan Xu
1608b037849SYinan Xu  private val clint = LazyModule(new TLTimer(
1618b037849SYinan Xu    Seq(AddressSet(0x38000000L, 0x0000ffffL)),
1628b037849SYinan Xu    sim = !env.FPGAPlatform
1638b037849SYinan Xu  ))
1648b037849SYinan Xu  clint.node := peripheralXbar
1658b037849SYinan Xu
1668b037849SYinan Xu  val plic = LazyModule(new AXI4Plic(
1678b037849SYinan Xu    Seq(AddressSet(0x3c000000L, 0x03ffffffL)),
1688b037849SYinan Xu    sim = !env.FPGAPlatform
1698b037849SYinan Xu  ))
1708b037849SYinan Xu  plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar
1718b037849SYinan Xu
1728b037849SYinan Xu  val l3cache = LazyModule(new InclusiveCache(
1738b037849SYinan Xu    CacheParameters(
1748b037849SYinan Xu      level = 3,
1758b037849SYinan Xu      ways = L3NWays,
1768b037849SYinan Xu      sets = L3NSets,
1778b037849SYinan Xu      blockBytes = L3BlockSize,
1788b037849SYinan Xu      beatBytes = L2BusWidth / 8,
1798b037849SYinan Xu      cacheName = "L3"
1808b037849SYinan Xu    ),
1818b037849SYinan Xu    InclusiveCacheMicroParameters(
1828b037849SYinan Xu      writeBytes = 32
1838b037849SYinan Xu    )
1848b037849SYinan Xu  )).node
1858b037849SYinan Xu
1868b037849SYinan Xu  bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar
1878b037849SYinan Xu
1888b037849SYinan Xu  lazy val module = new LazyModuleImp(this) {
1898b037849SYinan Xu    val io = IO(new Bundle {
1908b037849SYinan Xu      val extIntrs = Input(UInt(NrExtIntr.W))
1918b037849SYinan Xu      // val meip = Input(Vec(NumCores, Bool()))
1928b037849SYinan Xu      val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None
1938b037849SYinan Xu    })
1948b037849SYinan Xu
1958b037849SYinan Xu    plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs))
1968b037849SYinan Xu
1978b037849SYinan Xu    for (i <- 0 until NumCores) {
1988b037849SYinan Xu      core(i).module.io.hartId := i.U
1998b037849SYinan Xu      core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i)
2008b037849SYinan Xu      core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i)
2018b037849SYinan Xu      core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i)
2028b037849SYinan Xu      l2prefetcher(i).module.io.enable := RegNext(core(i).module.io.l2_pf_enable)
2038b037849SYinan Xu      l2prefetcher(i).module.io.in <> l2cache(i).module.io
2048b037849SYinan Xu    }
2058b037849SYinan Xu
2068b037849SYinan Xu    dontTouch(io.extIntrs)
2078b037849SYinan Xu  }
2088b037849SYinan Xu}
2098b037849SYinan Xu
2108b037849SYinan Xuobject TopMain extends App {
2118b037849SYinan Xu  override def main(args: Array[String]): Unit = {
2128b037849SYinan Xu    Parameters.set(
2138b037849SYinan Xu      args.contains("--dual-core") match {
2148b037849SYinan Xu        case false => Parameters()
2158b037849SYinan Xu        case true  => Parameters.dualCoreParameters
2168b037849SYinan Xu      }
2178b037849SYinan Xu    )
2188b037849SYinan Xu    val otherArgs = args.filterNot(_ == "--dual-core")
2198b037849SYinan Xu    implicit val p = config.Parameters.empty
2208b037849SYinan Xu    XiangShanStage.execute(otherArgs, Seq(
2218b037849SYinan Xu      ChiselGeneratorAnnotation(() => {
2228b037849SYinan Xu        val soc = LazyModule(new XSTop())
2238b037849SYinan Xu        soc.module
2248b037849SYinan Xu      })
2258b037849SYinan Xu    ))
2268b037849SYinan Xu  }
2278b037849SYinan Xu}
228