18b037849SYinan Xupackage top 28b037849SYinan Xu 38b037849SYinan Xuimport chisel3._ 48b037849SYinan Xuimport chisel3.util._ 58b037849SYinan Xuimport xiangshan._ 694c92d92SYinan 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} 1994c92d92SYinan 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 { 2594c92d92SYinan Xu private val core = LazyModule(new XSCore()) 2694c92d92SYinan Xu private val l2prefetcher = LazyModule(new L2Prefetcher()) 2794c92d92SYinan Xu private val l2xbar = TLXbar() 2894c92d92SYinan 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", 3783cb791fSallen uncachedGet = true, 3811b3c588SAllen enablePerf = false 396c4d7a40SYinan Xu ), 406c4d7a40SYinan Xu InclusiveCacheMicroParameters( 41f5089e26SWonicon memCycles = 25, 426c4d7a40SYinan Xu writeBytes = 32 436c4d7a40SYinan Xu ) 446c4d7a40SYinan Xu )) 4594c92d92SYinan Xu val uncache = TLXbar() 466c4d7a40SYinan Xu 476c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 486c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 496c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 506c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 516c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 526c4d7a40SYinan Xu 5394c92d92SYinan Xu uncache := TLBuffer() := core.frontend.instrUncache.clientNode 5494c92d92SYinan Xu uncache := TLBuffer() := core.memBlock.uncache.clientNode 556c4d7a40SYinan Xu 5694c92d92SYinan Xu lazy val module = new LazyModuleImp(this) { 576c4d7a40SYinan Xu val io = IO(new Bundle { 586c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 596c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 604e3ce935Sljw val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo 616c4d7a40SYinan Xu }) 626c4d7a40SYinan Xu 6394c92d92SYinan Xu core.module.io.hartId := io.hartId 6494c92d92SYinan Xu core.module.io.externalInterrupt := io.externalInterrupt 65*c0bc1ee4SYinan Xu l2prefetcher.module.io.enable := core.module.io.l2_pf_enable 6694c92d92SYinan Xu l2prefetcher.module.io.in <> l2cache.module.io 6794c92d92SYinan Xu io.l1plus_error <> core.module.io.l1plus_error 6894c92d92SYinan Xu io.icache_error <> core.module.io.icache_error 6994c92d92SYinan Xu io.dcache_error <> core.module.io.dcache_error 706c4d7a40SYinan Xu 7194c92d92SYinan Xu val core_reset_gen = Module(new ResetGen()) 7294c92d92SYinan Xu core.module.reset := core_reset_gen.io.out 7394c92d92SYinan Xu 7494c92d92SYinan Xu val l2_reset_gen = Module(new ResetGen()) 7594c92d92SYinan Xu l2prefetcher.module.reset := l2_reset_gen.io.out 7694c92d92SYinan Xu l2cache.module.reset := l2_reset_gen.io.out 7794c92d92SYinan Xu } 7894c92d92SYinan Xu} 796c4d7a40SYinan Xu 808b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 818b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 828b037849SYinan Xu val peripheralXbar = TLXbar() 838b037849SYinan Xu val l3_xbar = TLXbar() 848b037849SYinan Xu} 858b037849SYinan Xu 868b037849SYinan Xu// We adapt the following three traits from rocket-chip. 878b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 888b037849SYinan Xutrait HaveSlaveAXI4Port { 898b037849SYinan Xu this: BaseXSSoc => 908b037849SYinan Xu 918b037849SYinan Xu val idBits = 16 928b037849SYinan Xu 938b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 948b037849SYinan Xu Seq(AXI4MasterParameters( 958b037849SYinan Xu name = "dma", 968b037849SYinan Xu id = IdRange(0, 1 << idBits) 978b037849SYinan Xu )) 988b037849SYinan Xu ))) 998b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 1008b037849SYinan Xu params = DevNullParams( 1018b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 1028b037849SYinan Xu maxAtomic = 8, 1038b037849SYinan Xu maxTransfer = 64), 1048b037849SYinan Xu beatBytes = L2BusWidth / 8 1058b037849SYinan Xu )) 1068b037849SYinan Xu private val error_xbar = TLXbar() 1078b037849SYinan Xu 1088b037849SYinan Xu error_xbar := 1098b037849SYinan Xu AXI4ToTL() := 1108b037849SYinan Xu AXI4UserYanker(Some(1)) := 1118b037849SYinan Xu AXI4Fragmenter() := 1128b037849SYinan Xu AXI4IdIndexer(1) := 1138b037849SYinan Xu l3FrontendAXI4Node 1148b037849SYinan Xu errorDevice.node := error_xbar 1158b037849SYinan Xu l3_xbar := 1168b037849SYinan Xu TLBuffer() := 1178b037849SYinan Xu error_xbar 1188b037849SYinan Xu 1198b037849SYinan Xu val dma = InModuleBody { 1208b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1218b037849SYinan Xu } 1228b037849SYinan Xu} 1238b037849SYinan Xu 1248b037849SYinan Xutrait HaveAXI4MemPort { 1258b037849SYinan Xu this: BaseXSSoc => 1268b037849SYinan Xu // 40-bit physical address 1278b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 128329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1298b037849SYinan Xu AXI4SlavePortParameters( 1308b037849SYinan Xu slaves = Seq( 1318b037849SYinan Xu AXI4SlaveParameters( 1328b037849SYinan Xu address = memRange, 1338b037849SYinan Xu regionType = RegionType.UNCACHED, 1348b037849SYinan Xu executable = true, 1358b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1368b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 1378b037849SYinan Xu interleavedId = Some(0) 1388b037849SYinan Xu ) 1398b037849SYinan Xu ), 1408b037849SYinan Xu beatBytes = L3BusWidth / 8 1418b037849SYinan Xu ) 142329e267dSYinan Xu )) 1438b037849SYinan Xu 144329e267dSYinan Xu val mem_xbar = TLXbar() 145329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 146329e267dSYinan Xu memAXI4SlaveNode := 147329e267dSYinan Xu AXI4UserYanker() := 148329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 149329e267dSYinan Xu TLToAXI4() := 150329e267dSYinan Xu TLWidthWidget(L3BusWidth / 8) := 151329e267dSYinan Xu mem_xbar 1528b037849SYinan Xu 1538b037849SYinan Xu val memory = InModuleBody { 1548b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1558b037849SYinan Xu } 1568b037849SYinan Xu} 1578b037849SYinan Xu 1588b037849SYinan Xu 1598b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1608b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1618b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 1628b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 1638b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 1648b037849SYinan Xu Seq(AXI4SlaveParameters( 1658b037849SYinan Xu address = peripheralRange, 1668b037849SYinan Xu regionType = RegionType.UNCACHED, 1678b037849SYinan Xu supportsRead = TransferSizes(1, 8), 1688b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 1698b037849SYinan Xu interleavedId = Some(0) 1708b037849SYinan Xu )), 1718b037849SYinan Xu beatBytes = 8 1728b037849SYinan Xu ))) 1738b037849SYinan Xu 1748b037849SYinan Xu peripheralNode := 1758b037849SYinan Xu AXI4UserYanker() := 1769d4d50e0SYinan Xu AXI4Deinterleaver(8) := 1778b037849SYinan Xu TLToAXI4() := 1788b037849SYinan Xu peripheralXbar 1798b037849SYinan Xu 1808b037849SYinan Xu val peripheral = InModuleBody { 1818b037849SYinan Xu peripheralNode.makeIOs() 1828b037849SYinan Xu } 1838b037849SYinan Xu 1848b037849SYinan Xu} 1858b037849SYinan Xu 1868b037849SYinan Xu 1878b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 1888b037849SYinan Xu with HaveAXI4MemPort 1898b037849SYinan Xu with HaveAXI4PeripheralPort 1908b037849SYinan Xu with HaveSlaveAXI4Port 1918b037849SYinan Xu{ 1928b037849SYinan Xu 1938b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 1948b037849SYinan Xu 1956c4d7a40SYinan Xu val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2)) 1968b037849SYinan Xu 1978b037849SYinan Xu for (i <- 0 until NumCores) { 19894c92d92SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).uncache 1996c4d7a40SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node 2008b037849SYinan Xu } 2018b037849SYinan Xu 2028b037849SYinan Xu private val clint = LazyModule(new TLTimer( 2038b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 2048b037849SYinan Xu sim = !env.FPGAPlatform 2058b037849SYinan Xu )) 2068b037849SYinan Xu clint.node := peripheralXbar 2078b037849SYinan Xu 2082e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 2092e3a956eSLinJiawei val beu = LazyModule( 2102e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 2112e3a956eSLinJiawei beu.node := peripheralXbar 2122e3a956eSLinJiawei 2132e3a956eSLinJiawei class BeuSinkNode()(implicit p: config.Parameters) extends LazyModule { 2142e3a956eSLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 2152e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 2162e3a956eSLinJiawei val interrupt = IO(Output(Bool())) 2172e3a956eSLinJiawei interrupt := intSinkNode.in.head._1.head 2182e3a956eSLinJiawei } 2192e3a956eSLinJiawei } 2202e3a956eSLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 2212e3a956eSLinJiawei beuSink.intSinkNode := beu.intNode 2222e3a956eSLinJiawei 2238b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 2248b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 2258b037849SYinan Xu sim = !env.FPGAPlatform 2268b037849SYinan Xu )) 2278b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 2288b037849SYinan Xu 2298b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 2308b037849SYinan Xu CacheParameters( 2318b037849SYinan Xu level = 3, 2328b037849SYinan Xu ways = L3NWays, 2338b037849SYinan Xu sets = L3NSets, 2348b037849SYinan Xu blockBytes = L3BlockSize, 2358b037849SYinan Xu beatBytes = L2BusWidth / 8, 23611b3c588SAllen cacheName = "L3", 23783cb791fSallen uncachedGet = false, 23811b3c588SAllen enablePerf = false 2398b037849SYinan Xu ), 2408b037849SYinan Xu InclusiveCacheMicroParameters( 241f5089e26SWonicon memCycles = 25, 2428b037849SYinan Xu writeBytes = 32 2438b037849SYinan Xu ) 24494c92d92SYinan Xu )) 2458b037849SYinan Xu 24694c92d92SYinan Xu bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar 2478b037849SYinan Xu 24894c92d92SYinan Xu lazy val module = new LazyRawModuleImp(this) { 2498b037849SYinan Xu val io = IO(new Bundle { 25094c92d92SYinan Xu val clock = Input(Bool()) 25194c92d92SYinan Xu val reset = Input(Bool()) 2528b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 2538b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 2548b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 2558b037849SYinan Xu }) 25694c92d92SYinan Xu childClock := io.clock.asClock() 2578b037849SYinan Xu 25894c92d92SYinan Xu withClockAndReset(childClock, io.reset) { 25994c92d92SYinan Xu val resetGen = Module(new ResetGen()) 26094c92d92SYinan Xu resetGen.suggestName("top_reset_gen") 26194c92d92SYinan Xu childReset := resetGen.io.out 26294c92d92SYinan Xu } 26394c92d92SYinan Xu 26494c92d92SYinan Xu withClockAndReset(childClock, childReset) { 265*c0bc1ee4SYinan Xu plic.module.io.extra.get.intrVec <> Cat(beuSink.module.interrupt, io.extIntrs) 266*c0bc1ee4SYinan Xu require(io.extIntrs.getWidth + beuSink.module.interrupt.getWidth == NrPlicIntr) 267*c0bc1ee4SYinan Xu 2688b037849SYinan Xu for (i <- 0 until NumCores) { 26994c92d92SYinan Xu val core_reset_gen = Module(new ResetGen()) 27094c92d92SYinan Xu core_reset_gen.suggestName(s"core_${i}_reset_gen") 27194c92d92SYinan Xu core_with_l2(i).module.reset := core_reset_gen.io.out 2726c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 2736c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2746c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 2756c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 276*c0bc1ee4SYinan Xu beu.module.io.errors.l1plus(i) := core_with_l2(i).module.io.l1plus_error 277*c0bc1ee4SYinan Xu beu.module.io.errors.icache(i) := core_with_l2(i).module.io.icache_error 278*c0bc1ee4SYinan Xu beu.module.io.errors.dcache(i) := core_with_l2(i).module.io.dcache_error 2798b037849SYinan Xu } 2808b037849SYinan Xu 28194c92d92SYinan Xu val l3_reset_gen = Module(new ResetGen()) 28294c92d92SYinan Xu l3_reset_gen.suggestName("l3_reset_gen") 28394c92d92SYinan Xu l3cache.module.reset := l3_reset_gen.io.out 28494c92d92SYinan Xu } 2858b037849SYinan Xu } 2868b037849SYinan Xu} 2878b037849SYinan Xu 2888b037849SYinan Xuobject TopMain extends App { 2898b037849SYinan Xu override def main(args: Array[String]): Unit = { 2908b037849SYinan Xu Parameters.set( 2918b037849SYinan Xu args.contains("--dual-core") match { 2928b037849SYinan Xu case false => Parameters() 2938b037849SYinan Xu case true => Parameters.dualCoreParameters 2948b037849SYinan Xu } 2958b037849SYinan Xu ) 2968b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 2972e3a956eSLinJiawei implicit val p = new Config((_, _, _) => { 2982e3a956eSLinJiawei case XLen => 64 2992e3a956eSLinJiawei }) 3008b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 3018b037849SYinan Xu ChiselGeneratorAnnotation(() => { 3028b037849SYinan Xu val soc = LazyModule(new XSTop()) 3038b037849SYinan Xu soc.module 3048b037849SYinan Xu }) 3058b037849SYinan Xu )) 3068b037849SYinan Xu } 3078b037849SYinan Xu} 308