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 18*6c4d7a40SYinan Xuclass XSCoreWithL2()(implicit p: config.Parameters) extends LazyModule 19*6c4d7a40SYinan Xu with HasXSParameter { 20*6c4d7a40SYinan Xu val core = LazyModule(new XSCore()) 21*6c4d7a40SYinan Xu val l2prefetcher = LazyModule(new L2Prefetcher()) 22*6c4d7a40SYinan Xu val l2cache = LazyModule(new InclusiveCache( 23*6c4d7a40SYinan Xu CacheParameters( 24*6c4d7a40SYinan Xu level = 2, 25*6c4d7a40SYinan Xu ways = L2NWays, 26*6c4d7a40SYinan Xu sets = L2NSets, 27*6c4d7a40SYinan Xu blockBytes = L2BlockSize, 28*6c4d7a40SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 29*6c4d7a40SYinan Xu cacheName = s"L2" 30*6c4d7a40SYinan Xu ), 31*6c4d7a40SYinan Xu InclusiveCacheMicroParameters( 32*6c4d7a40SYinan Xu writeBytes = 32 33*6c4d7a40SYinan Xu ) 34*6c4d7a40SYinan Xu )) 35*6c4d7a40SYinan Xu private val l2xbar = TLXbar() 36*6c4d7a40SYinan Xu 37*6c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 38*6c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 39*6c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 40*6c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 41*6c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 42*6c4d7a40SYinan Xu 43*6c4d7a40SYinan Xu lazy val module = new XSCoreWithL2Imp(this) 44*6c4d7a40SYinan Xu} 45*6c4d7a40SYinan Xu 46*6c4d7a40SYinan Xuclass XSCoreWithL2Imp(outer: XSCoreWithL2) extends LazyModuleImp(outer) 47*6c4d7a40SYinan Xu with HasXSParameter { 48*6c4d7a40SYinan Xu val io = IO(new Bundle { 49*6c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 50*6c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 51*6c4d7a40SYinan Xu }) 52*6c4d7a40SYinan Xu 53*6c4d7a40SYinan Xu outer.core.module.io.hartId := io.hartId 54*6c4d7a40SYinan Xu outer.core.module.io.externalInterrupt := io.externalInterrupt 55*6c4d7a40SYinan Xu outer.l2prefetcher.module.io.enable := RegNext(outer.core.module.io.l2_pf_enable) 56*6c4d7a40SYinan Xu outer.l2prefetcher.module.io.in <> outer.l2cache.module.io 57*6c4d7a40SYinan Xu} 58*6c4d7a40SYinan Xu 59*6c4d7a40SYinan Xu 608b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 618b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 628b037849SYinan Xu val peripheralXbar = TLXbar() 638b037849SYinan Xu val l3_xbar = TLXbar() 648b037849SYinan Xu} 658b037849SYinan Xu 668b037849SYinan Xu// We adapt the following three traits from rocket-chip. 678b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 688b037849SYinan Xutrait HaveSlaveAXI4Port { 698b037849SYinan Xu this: BaseXSSoc => 708b037849SYinan Xu 718b037849SYinan Xu val idBits = 16 728b037849SYinan Xu 738b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 748b037849SYinan Xu Seq(AXI4MasterParameters( 758b037849SYinan Xu name = "dma", 768b037849SYinan Xu id = IdRange(0, 1 << idBits) 778b037849SYinan Xu )) 788b037849SYinan Xu ))) 798b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 808b037849SYinan Xu params = DevNullParams( 818b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 828b037849SYinan Xu maxAtomic = 8, 838b037849SYinan Xu maxTransfer = 64), 848b037849SYinan Xu beatBytes = L2BusWidth / 8 858b037849SYinan Xu )) 868b037849SYinan Xu private val error_xbar = TLXbar() 878b037849SYinan Xu 888b037849SYinan Xu error_xbar := 898b037849SYinan Xu AXI4ToTL() := 908b037849SYinan Xu AXI4UserYanker(Some(1)) := 918b037849SYinan Xu AXI4Fragmenter() := 928b037849SYinan Xu AXI4IdIndexer(1) := 938b037849SYinan Xu l3FrontendAXI4Node 948b037849SYinan Xu errorDevice.node := error_xbar 958b037849SYinan Xu l3_xbar := 968b037849SYinan Xu TLBuffer() := 978b037849SYinan Xu error_xbar 988b037849SYinan Xu 998b037849SYinan Xu val dma = InModuleBody { 1008b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1018b037849SYinan Xu } 1028b037849SYinan Xu} 1038b037849SYinan Xu 1048b037849SYinan Xutrait HaveAXI4MemPort { 1058b037849SYinan Xu this: BaseXSSoc => 1068b037849SYinan Xu // 40-bit physical address 1078b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 1088b037849SYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq.tabulate(L3NBanks) { i => 1098b037849SYinan Xu AXI4SlavePortParameters( 1108b037849SYinan Xu slaves = Seq( 1118b037849SYinan Xu AXI4SlaveParameters( 1128b037849SYinan Xu address = memRange, 1138b037849SYinan Xu regionType = RegionType.UNCACHED, 1148b037849SYinan Xu executable = true, 1158b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1168b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 1178b037849SYinan Xu interleavedId = Some(0) 1188b037849SYinan Xu ) 1198b037849SYinan Xu ), 1208b037849SYinan Xu beatBytes = L3BusWidth / 8 1218b037849SYinan Xu ) 1228b037849SYinan Xu }) 1238b037849SYinan Xu 1248b037849SYinan Xu memAXI4SlaveNode :=* 1258b037849SYinan Xu AXI4UserYanker() :=* 1269d4d50e0SYinan Xu AXI4Deinterleaver(L3BlockSize) :=* 1278b037849SYinan Xu TLToAXI4() :=* 1288b037849SYinan Xu TLWidthWidget(L3BusWidth / 8) :=* 1298b037849SYinan Xu TLCacheCork() :=* 1308b037849SYinan Xu bankedNode 1318b037849SYinan Xu 1328b037849SYinan Xu val memory = InModuleBody { 1338b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1348b037849SYinan Xu } 1358b037849SYinan Xu} 1368b037849SYinan Xu 1378b037849SYinan Xu 1388b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1398b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1408b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 1418b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 1428b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 1438b037849SYinan Xu Seq(AXI4SlaveParameters( 1448b037849SYinan Xu address = peripheralRange, 1458b037849SYinan Xu regionType = RegionType.UNCACHED, 1468b037849SYinan Xu supportsRead = TransferSizes(1, 8), 1478b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 1488b037849SYinan Xu interleavedId = Some(0) 1498b037849SYinan Xu )), 1508b037849SYinan Xu beatBytes = 8 1518b037849SYinan Xu ))) 1528b037849SYinan Xu 1538b037849SYinan Xu peripheralNode := 1548b037849SYinan Xu AXI4UserYanker() := 1559d4d50e0SYinan Xu AXI4Deinterleaver(8) := 1568b037849SYinan Xu TLToAXI4() := 1578b037849SYinan Xu peripheralXbar 1588b037849SYinan Xu 1598b037849SYinan Xu val peripheral = InModuleBody { 1608b037849SYinan Xu peripheralNode.makeIOs() 1618b037849SYinan Xu } 1628b037849SYinan Xu 1638b037849SYinan Xu} 1648b037849SYinan Xu 1658b037849SYinan Xu 1668b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 1678b037849SYinan Xu with HaveAXI4MemPort 1688b037849SYinan Xu with HaveAXI4PeripheralPort 1698b037849SYinan Xu with HaveSlaveAXI4Port 1708b037849SYinan Xu { 1718b037849SYinan Xu 1728b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 1738b037849SYinan Xu 174*6c4d7a40SYinan Xu val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2)) 1758b037849SYinan Xu 1768b037849SYinan Xu for (i <- 0 until NumCores) { 177*6c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.frontend.instrUncache.clientNode 178*6c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.memBlock.uncache.clientNode 179*6c4d7a40SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node 1808b037849SYinan Xu } 1818b037849SYinan Xu 1828b037849SYinan Xu private val clint = LazyModule(new TLTimer( 1838b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1848b037849SYinan Xu sim = !env.FPGAPlatform 1858b037849SYinan Xu )) 1868b037849SYinan Xu clint.node := peripheralXbar 1878b037849SYinan Xu 1888b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 1898b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 1908b037849SYinan Xu sim = !env.FPGAPlatform 1918b037849SYinan Xu )) 1928b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 1938b037849SYinan Xu 1948b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 1958b037849SYinan Xu CacheParameters( 1968b037849SYinan Xu level = 3, 1978b037849SYinan Xu ways = L3NWays, 1988b037849SYinan Xu sets = L3NSets, 1998b037849SYinan Xu blockBytes = L3BlockSize, 2008b037849SYinan Xu beatBytes = L2BusWidth / 8, 2018b037849SYinan Xu cacheName = "L3" 2028b037849SYinan Xu ), 2038b037849SYinan Xu InclusiveCacheMicroParameters( 2048b037849SYinan Xu writeBytes = 32 2058b037849SYinan Xu ) 2068b037849SYinan Xu )).node 2078b037849SYinan Xu 2088b037849SYinan Xu bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar 2098b037849SYinan Xu 2108b037849SYinan Xu lazy val module = new LazyModuleImp(this) { 2118b037849SYinan Xu val io = IO(new Bundle { 2128b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 2138b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 2148b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 2158b037849SYinan Xu }) 2168b037849SYinan Xu 2178b037849SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 2188b037849SYinan Xu 2198b037849SYinan Xu for (i <- 0 until NumCores) { 220*6c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 221*6c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 222*6c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 223*6c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 2248b037849SYinan Xu } 2258b037849SYinan Xu 2268b037849SYinan Xu dontTouch(io.extIntrs) 2278b037849SYinan Xu } 2288b037849SYinan Xu} 2298b037849SYinan Xu 2308b037849SYinan Xuobject TopMain extends App { 2318b037849SYinan Xu override def main(args: Array[String]): Unit = { 2328b037849SYinan Xu Parameters.set( 2338b037849SYinan Xu args.contains("--dual-core") match { 2348b037849SYinan Xu case false => Parameters() 2358b037849SYinan Xu case true => Parameters.dualCoreParameters 2368b037849SYinan Xu } 2378b037849SYinan Xu ) 2388b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 2398b037849SYinan Xu implicit val p = config.Parameters.empty 2408b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 2418b037849SYinan Xu ChiselGeneratorAnnotation(() => { 2428b037849SYinan Xu val soc = LazyModule(new XSTop()) 2438b037849SYinan Xu soc.module 2448b037849SYinan Xu }) 2458b037849SYinan Xu )) 2468b037849SYinan Xu } 2478b037849SYinan Xu} 248