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