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 92225d46eSJiawei Linimport chipsalliance.rocketchip.config._ 102e3a956eSLinJiaweiimport device.{AXI4Plic, TLTimer} 11*afcc4f2aSJiawei Linimport firrtl.stage.RunFirrtlTransformAnnotation 128b037849SYinan Xuimport freechips.rocketchip.diplomacy._ 138b037849SYinan Xuimport freechips.rocketchip.tilelink._ 148b037849SYinan Xuimport freechips.rocketchip.amba.axi4._ 15*afcc4f2aSJiawei Linimport freechips.rocketchip.devices.tilelink._ 162e3a956eSLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode 17*afcc4f2aSJiawei Linimport freechips.rocketchip.interrupts._ 18*afcc4f2aSJiawei Linimport freechips.rocketchip.stage.phases.GenerateArtefacts 192e3a956eSLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen} 20*afcc4f2aSJiawei Linimport freechips.rocketchip.util.{ElaborationArtefacts, HasRocketChipStageUtils} 21*afcc4f2aSJiawei Linimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 228b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher 238b037849SYinan Xu 248b037849SYinan Xu 252225d46eSJiawei Linclass XSCoreWithL2()(implicit p: Parameters) extends LazyModule 262225d46eSJiawei Lin with HasXSParameter with HasSoCParameter { 27*afcc4f2aSJiawei Lin private val core = LazyModule(new XSCore) 2894c92d92SYinan Xu private val l2prefetcher = LazyModule(new L2Prefetcher()) 2994c92d92SYinan Xu private val l2xbar = TLXbar() 309d5a2027SYinan Xu private val l2cache = if (useFakeL2Cache) null else LazyModule(new InclusiveCache( 316c4d7a40SYinan Xu CacheParameters( 326c4d7a40SYinan Xu level = 2, 336c4d7a40SYinan Xu ways = L2NWays, 346c4d7a40SYinan Xu sets = L2NSets, 356c4d7a40SYinan Xu blockBytes = L2BlockSize, 366c4d7a40SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 3711b3c588SAllen cacheName = s"L2", 3883cb791fSallen uncachedGet = true, 3911b3c588SAllen enablePerf = false 406c4d7a40SYinan Xu ), 416c4d7a40SYinan Xu InclusiveCacheMicroParameters( 42f5089e26SWonicon memCycles = 25, 436c4d7a40SYinan Xu writeBytes = 32 442791c549Szfw ), 452225d46eSJiawei Lin fpga = debugOpts.FPGAPlatform 466c4d7a40SYinan Xu )) 47*afcc4f2aSJiawei Lin if(!useFakeL2Cache) { 48*afcc4f2aSJiawei Lin ResourceBinding { 49*afcc4f2aSJiawei Lin Resource(l2cache.device, "reg").bind(ResourceAddress(hardId)) 50*afcc4f2aSJiawei Lin } 51*afcc4f2aSJiawei Lin } 529d5a2027SYinan Xu 539d5a2027SYinan Xu val memory_port = TLIdentityNode() 5494c92d92SYinan Xu val uncache = TLXbar() 556c4d7a40SYinan Xu 569d5a2027SYinan Xu if (!useFakeDCache) { 576c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 589d5a2027SYinan Xu } 599d5a2027SYinan Xu if (!useFakeL1plusCache) { 606c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 619d5a2027SYinan Xu } 629d5a2027SYinan Xu if (!useFakePTW) { 636c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 649d5a2027SYinan Xu } 656c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 669d5a2027SYinan Xu if (useFakeL2Cache) { 679d5a2027SYinan Xu memory_port := l2xbar 689d5a2027SYinan Xu } 699d5a2027SYinan Xu else { 706c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 719d5a2027SYinan Xu memory_port := l2cache.node 729d5a2027SYinan Xu } 736c4d7a40SYinan Xu 7494c92d92SYinan Xu uncache := TLBuffer() := core.frontend.instrUncache.clientNode 7594c92d92SYinan Xu uncache := TLBuffer() := core.memBlock.uncache.clientNode 766c4d7a40SYinan Xu 7794c92d92SYinan Xu lazy val module = new LazyModuleImp(this) { 786c4d7a40SYinan Xu val io = IO(new Bundle { 796c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 806c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 814e3ce935Sljw val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo 826c4d7a40SYinan Xu }) 836c4d7a40SYinan Xu 8494c92d92SYinan Xu core.module.io.hartId := io.hartId 8594c92d92SYinan Xu core.module.io.externalInterrupt := io.externalInterrupt 86c0bc1ee4SYinan Xu l2prefetcher.module.io.enable := core.module.io.l2_pf_enable 879d5a2027SYinan Xu if (useFakeL2Cache) { 889d5a2027SYinan Xu l2prefetcher.module.io.in := DontCare 899d5a2027SYinan Xu } 909d5a2027SYinan Xu else { 9194c92d92SYinan Xu l2prefetcher.module.io.in <> l2cache.module.io 929d5a2027SYinan Xu } 9394c92d92SYinan Xu io.l1plus_error <> core.module.io.l1plus_error 9494c92d92SYinan Xu io.icache_error <> core.module.io.icache_error 9594c92d92SYinan Xu io.dcache_error <> core.module.io.dcache_error 966c4d7a40SYinan Xu 972225d46eSJiawei Lin val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 9894c92d92SYinan Xu core.module.reset := core_reset_gen.io.out 9994c92d92SYinan Xu 1002225d46eSJiawei Lin val l2_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 10194c92d92SYinan Xu l2prefetcher.module.reset := l2_reset_gen.io.out 1029d5a2027SYinan Xu if (!useFakeL2Cache) { 10394c92d92SYinan Xu l2cache.module.reset := l2_reset_gen.io.out 10494c92d92SYinan Xu } 10594c92d92SYinan Xu } 1069d5a2027SYinan Xu} 1076c4d7a40SYinan Xu 108*afcc4f2aSJiawei Linabstract class BaseXSSoc()(implicit p: Parameters) extends LazyModule 109*afcc4f2aSJiawei Lin with HasSoCParameter 110*afcc4f2aSJiawei Lin with BindingScope 111*afcc4f2aSJiawei Lin{ 1128b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 1138b037849SYinan Xu val peripheralXbar = TLXbar() 1148b037849SYinan Xu val l3_xbar = TLXbar() 115*afcc4f2aSJiawei Lin lazy val dts = DTS(bindingTree) 1168b037849SYinan Xu} 1178b037849SYinan Xu 1188b037849SYinan Xu// We adapt the following three traits from rocket-chip. 1198b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 1208b037849SYinan Xutrait HaveSlaveAXI4Port { 1218b037849SYinan Xu this: BaseXSSoc => 1228b037849SYinan Xu 1238b037849SYinan Xu val idBits = 16 1248b037849SYinan Xu 1258b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 1268b037849SYinan Xu Seq(AXI4MasterParameters( 1278b037849SYinan Xu name = "dma", 1288b037849SYinan Xu id = IdRange(0, 1 << idBits) 1298b037849SYinan Xu )) 1308b037849SYinan Xu ))) 1318b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 1328b037849SYinan Xu params = DevNullParams( 1338b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 1348b037849SYinan Xu maxAtomic = 8, 1358b037849SYinan Xu maxTransfer = 64), 1362225d46eSJiawei Lin beatBytes = L3InnerBusWidth / 8 1378b037849SYinan Xu )) 1388b037849SYinan Xu private val error_xbar = TLXbar() 1398b037849SYinan Xu 1408b037849SYinan Xu error_xbar := 1418b037849SYinan Xu AXI4ToTL() := 1428b037849SYinan Xu AXI4UserYanker(Some(1)) := 1438b037849SYinan Xu AXI4Fragmenter() := 1448b037849SYinan Xu AXI4IdIndexer(1) := 1458b037849SYinan Xu l3FrontendAXI4Node 1468b037849SYinan Xu errorDevice.node := error_xbar 1478b037849SYinan Xu l3_xbar := 1488b037849SYinan Xu TLBuffer() := 1498b037849SYinan Xu error_xbar 1508b037849SYinan Xu 1518b037849SYinan Xu val dma = InModuleBody { 1528b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1538b037849SYinan Xu } 1548b037849SYinan Xu} 1558b037849SYinan Xu 1568b037849SYinan Xutrait HaveAXI4MemPort { 1578b037849SYinan Xu this: BaseXSSoc => 158*afcc4f2aSJiawei Lin val device = new MemoryDevice 1598b037849SYinan Xu // 40-bit physical address 1608b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 161329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1628b037849SYinan Xu AXI4SlavePortParameters( 1638b037849SYinan Xu slaves = Seq( 1648b037849SYinan Xu AXI4SlaveParameters( 1658b037849SYinan Xu address = memRange, 1668b037849SYinan Xu regionType = RegionType.UNCACHED, 1678b037849SYinan Xu executable = true, 1688b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1698b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 170*afcc4f2aSJiawei Lin interleavedId = Some(0), 171*afcc4f2aSJiawei Lin resources = device.reg("mem") 1728b037849SYinan Xu ) 1738b037849SYinan Xu ), 1742225d46eSJiawei Lin beatBytes = L3OuterBusWidth / 8 1758b037849SYinan Xu ) 176329e267dSYinan Xu )) 1778b037849SYinan Xu 178329e267dSYinan Xu val mem_xbar = TLXbar() 179329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 180329e267dSYinan Xu memAXI4SlaveNode := 181329e267dSYinan Xu AXI4UserYanker() := 182329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 183329e267dSYinan Xu TLToAXI4() := 1842225d46eSJiawei Lin TLWidthWidget(L3OuterBusWidth / 8) := 185329e267dSYinan Xu mem_xbar 1868b037849SYinan Xu 1878b037849SYinan Xu val memory = InModuleBody { 1888b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1898b037849SYinan Xu } 1908b037849SYinan Xu} 1918b037849SYinan Xu 1928b037849SYinan Xu 1938b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1948b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1958b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 196*afcc4f2aSJiawei Lin val uartRange = AddressSet(0x40600000, 0xf) 197*afcc4f2aSJiawei Lin val uartDevice = new SimpleDevice("serial", Seq("xilinx,uartlite")) 198*afcc4f2aSJiawei Lin val uartParams = AXI4SlaveParameters( 199*afcc4f2aSJiawei Lin address = Seq(uartRange), 200*afcc4f2aSJiawei Lin regionType = RegionType.UNCACHED, 201*afcc4f2aSJiawei Lin supportsRead = TransferSizes(1, 8), 202*afcc4f2aSJiawei Lin supportsWrite = TransferSizes(1, 8), 203*afcc4f2aSJiawei Lin resources = uartDevice.reg 204*afcc4f2aSJiawei Lin ) 205*afcc4f2aSJiawei Lin val peripheralRange = AddressSet( 206*afcc4f2aSJiawei Lin 0x0, 0x7fffffff 207*afcc4f2aSJiawei Lin ).subtract(onChipPeripheralRange).flatMap(x => x.subtract(uartRange)) 2088b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 2098b037849SYinan Xu Seq(AXI4SlaveParameters( 2108b037849SYinan Xu address = peripheralRange, 2118b037849SYinan Xu regionType = RegionType.UNCACHED, 2128b037849SYinan Xu supportsRead = TransferSizes(1, 8), 2138b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 2148b037849SYinan Xu interleavedId = Some(0) 215*afcc4f2aSJiawei Lin ), uartParams), 2168b037849SYinan Xu beatBytes = 8 2178b037849SYinan Xu ))) 2188b037849SYinan Xu 2198b037849SYinan Xu peripheralNode := 2208b037849SYinan Xu AXI4UserYanker() := 2219d4d50e0SYinan Xu AXI4Deinterleaver(8) := 2228b037849SYinan Xu TLToAXI4() := 2238b037849SYinan Xu peripheralXbar 2248b037849SYinan Xu 2258b037849SYinan Xu val peripheral = InModuleBody { 2268b037849SYinan Xu peripheralNode.makeIOs() 2278b037849SYinan Xu } 2288b037849SYinan Xu 2298b037849SYinan Xu} 2308b037849SYinan Xu 2312225d46eSJiawei Linclass XSTop()(implicit p: Parameters) extends XSTopWithoutDMA 2322225d46eSJiawei Lin with HaveSlaveAXI4Port 2338b037849SYinan Xu 2342225d46eSJiawei Linclass XSTopWithoutDMA()(implicit p: Parameters) extends BaseXSSoc() 2358b037849SYinan Xu with HaveAXI4MemPort 2368b037849SYinan Xu with HaveAXI4PeripheralPort 2378b037849SYinan Xu{ 238*afcc4f2aSJiawei Lin ResourceBinding { 239*afcc4f2aSJiawei Lin val width = ResourceInt(2) 240*afcc4f2aSJiawei Lin val model = "freechips,rocketchip-unknown" 241*afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "model").bind(ResourceString(model)) 242*afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "compat").bind(ResourceString(model + "-dev")) 243*afcc4f2aSJiawei Lin Resource(ResourceAnchors.soc, "compat").bind(ResourceString(model + "-soc")) 244*afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "width").bind(width) 245*afcc4f2aSJiawei Lin Resource(ResourceAnchors.soc, "width").bind(width) 246*afcc4f2aSJiawei Lin Resource(ResourceAnchors.cpus, "width").bind(ResourceInt(1)) 247*afcc4f2aSJiawei Lin def bindManagers(xbar: TLNexusNode) = { 248*afcc4f2aSJiawei Lin ManagerUnification(xbar.edges.in.head.manager.managers).foreach{ manager => 249*afcc4f2aSJiawei Lin manager.resources.foreach(r => r.bind(manager.toResource)) 250*afcc4f2aSJiawei Lin } 251*afcc4f2aSJiawei Lin } 252*afcc4f2aSJiawei Lin bindManagers(l3_xbar.asInstanceOf[TLNexusNode]) 253*afcc4f2aSJiawei Lin bindManagers(peripheralXbar.asInstanceOf[TLNexusNode]) 254*afcc4f2aSJiawei Lin } 2558b037849SYinan Xu 2562225d46eSJiawei Lin println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3OuterBusWidth") 2578b037849SYinan Xu 2582225d46eSJiawei Lin val core_with_l2 = soc.cores.map(coreParams => 2592225d46eSJiawei Lin LazyModule(new XSCoreWithL2()(p.alterPartial({ 2602225d46eSJiawei Lin case XSCoreParamsKey => coreParams 2612225d46eSJiawei Lin }))) 2622225d46eSJiawei Lin ) 2638b037849SYinan Xu 2648b037849SYinan Xu for (i <- 0 until NumCores) { 26594c92d92SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).uncache 2669d5a2027SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).memory_port 2678b037849SYinan Xu } 2688b037849SYinan Xu 269*afcc4f2aSJiawei Lin val clint = LazyModule(new CLINT(CLINTParams(0x38000000L), 8)) 2708b037849SYinan Xu clint.node := peripheralXbar 2718b037849SYinan Xu 272*afcc4f2aSJiawei Lin val clintIntSinks = Array.fill(NumCores){ 273*afcc4f2aSJiawei Lin val clintSink = LazyModule(new IntSinkNodeToModule(2)) 274*afcc4f2aSJiawei Lin clintSink.sinkNode := clint.intnode 275*afcc4f2aSJiawei Lin clintSink 276*afcc4f2aSJiawei Lin } 277*afcc4f2aSJiawei Lin 2782e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 2792e3a956eSLinJiawei val beu = LazyModule( 2802e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 2812e3a956eSLinJiawei beu.node := peripheralXbar 2822e3a956eSLinJiawei 283*afcc4f2aSJiawei Lin class IntSinkNodeToModule(val sinks: Int)(implicit p: Parameters) extends LazyModule { 284*afcc4f2aSJiawei Lin val sinkNode = IntSinkNode(IntSinkPortSimple(1, sinks)) 2852e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 286*afcc4f2aSJiawei Lin val out = IO(Output(Vec(sinks, Bool()))) 287*afcc4f2aSJiawei Lin out.zip(sinkNode.in.head._1).foreach{ case (o, i) => o := i } 2882e3a956eSLinJiawei } 2892e3a956eSLinJiawei } 2902e3a956eSLinJiawei 291*afcc4f2aSJiawei Lin class IntSourceNodeToModule(val num: Int)(implicit p: Parameters) extends LazyModule { 292*afcc4f2aSJiawei Lin val sourceNode = IntSourceNode(IntSourcePortSimple(num, ports = 1, sources = 1)) 293*afcc4f2aSJiawei Lin lazy val module = new LazyModuleImp(this){ 294*afcc4f2aSJiawei Lin val in = IO(Input(Vec(num, Bool()))) 295*afcc4f2aSJiawei Lin in.zip(sourceNode.out.head._1).foreach{ case (i, s) => s := i } 296*afcc4f2aSJiawei Lin } 297*afcc4f2aSJiawei Lin } 298*afcc4f2aSJiawei Lin 299*afcc4f2aSJiawei Lin val plic = LazyModule(new TLPLIC(PLICParams(0x3c000000L), 8)) 300*afcc4f2aSJiawei Lin val plicSource = LazyModule(new IntSourceNodeToModule(NrExtIntr)) 301*afcc4f2aSJiawei Lin val plicIntSinks = Array.fill(NumCores){ 302*afcc4f2aSJiawei Lin val plicSink = LazyModule(new IntSinkNodeToModule(1)) 303*afcc4f2aSJiawei Lin plicSink.sinkNode := plic.intnode 304*afcc4f2aSJiawei Lin plicSink 305*afcc4f2aSJiawei Lin } 306*afcc4f2aSJiawei Lin plic.intnode := beu.intNode 307*afcc4f2aSJiawei Lin plic.intnode := plicSource.sourceNode 308*afcc4f2aSJiawei Lin 309*afcc4f2aSJiawei Lin plic.node := peripheralXbar 3108b037849SYinan Xu 3119d5a2027SYinan Xu val l3cache = if (useFakeL3Cache) null else LazyModule(new InclusiveCache( 3128b037849SYinan Xu CacheParameters( 3138b037849SYinan Xu level = 3, 3148b037849SYinan Xu ways = L3NWays, 3158b037849SYinan Xu sets = L3NSets, 3168b037849SYinan Xu blockBytes = L3BlockSize, 3172225d46eSJiawei Lin beatBytes = L3InnerBusWidth / 8, 31811b3c588SAllen cacheName = "L3", 31983cb791fSallen uncachedGet = false, 32011b3c588SAllen enablePerf = false 3218b037849SYinan Xu ), 3228b037849SYinan Xu InclusiveCacheMicroParameters( 323f5089e26SWonicon memCycles = 25, 3248b037849SYinan Xu writeBytes = 32 3252791c549Szfw ), 3262225d46eSJiawei Lin fpga = debugOpts.FPGAPlatform 32794c92d92SYinan Xu )) 328*afcc4f2aSJiawei Lin if(!useFakeL3Cache){ 329*afcc4f2aSJiawei Lin ResourceBinding{ 330*afcc4f2aSJiawei Lin Resource(l3cache.device, "reg").bind(ResourceAddress(0)) 331*afcc4f2aSJiawei Lin } 332*afcc4f2aSJiawei Lin } 3339d5a2027SYinan Xu val l3Ignore = if (useFakeL3Cache) TLIgnoreNode() else null 3348b037849SYinan Xu 3359d5a2027SYinan Xu if (useFakeL3Cache) { 3369d5a2027SYinan Xu bankedNode :*= l3Ignore :*= l3_xbar 3379d5a2027SYinan Xu } 3389d5a2027SYinan Xu else { 33994c92d92SYinan Xu bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar 3409d5a2027SYinan Xu } 3418b037849SYinan Xu 34294c92d92SYinan Xu lazy val module = new LazyRawModuleImp(this) { 343*afcc4f2aSJiawei Lin ElaborationArtefacts.add("dts", dts) 3448b037849SYinan Xu val io = IO(new Bundle { 34594c92d92SYinan Xu val clock = Input(Bool()) 34694c92d92SYinan Xu val reset = Input(Bool()) 3478b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 3488b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 3492225d46eSJiawei Lin val ila = if(debugOpts.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 3508b037849SYinan Xu }) 35194c92d92SYinan Xu childClock := io.clock.asClock() 3528b037849SYinan Xu 35394c92d92SYinan Xu withClockAndReset(childClock, io.reset) { 3542225d46eSJiawei Lin val resetGen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 35594c92d92SYinan Xu resetGen.suggestName("top_reset_gen") 35694c92d92SYinan Xu childReset := resetGen.io.out 35794c92d92SYinan Xu } 35894c92d92SYinan Xu 35994c92d92SYinan Xu withClockAndReset(childClock, childReset) { 360*afcc4f2aSJiawei Lin plicSource.module.in := io.extIntrs.asBools() 361c0bc1ee4SYinan Xu 3628b037849SYinan Xu for (i <- 0 until NumCores) { 3632225d46eSJiawei Lin val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 36494c92d92SYinan Xu core_reset_gen.suggestName(s"core_${i}_reset_gen") 36594c92d92SYinan Xu core_with_l2(i).module.reset := core_reset_gen.io.out 3666c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 367*afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.msip := clintIntSinks(i).module.out(0) 368*afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.mtip := clintIntSinks(i).module.out(1) 369*afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.meip := plicIntSinks(i).module.out(0) 370c0bc1ee4SYinan Xu beu.module.io.errors.l1plus(i) := core_with_l2(i).module.io.l1plus_error 371c0bc1ee4SYinan Xu beu.module.io.errors.icache(i) := core_with_l2(i).module.io.icache_error 372c0bc1ee4SYinan Xu beu.module.io.errors.dcache(i) := core_with_l2(i).module.io.dcache_error 3738b037849SYinan Xu } 3748b037849SYinan Xu 3759d5a2027SYinan Xu if (!useFakeL3Cache) { 3762225d46eSJiawei Lin val l3_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 37794c92d92SYinan Xu l3_reset_gen.suggestName("l3_reset_gen") 37894c92d92SYinan Xu l3cache.module.reset := l3_reset_gen.io.out 37994c92d92SYinan Xu } 3808b037849SYinan Xu } 3818b037849SYinan Xu } 3829d5a2027SYinan Xu} 3838b037849SYinan Xu 384*afcc4f2aSJiawei Linobject TopMain extends App with HasRocketChipStageUtils { 3858b037849SYinan Xu override def main(args: Array[String]): Unit = { 38645c767e3SLinJiawei val (config, firrtlOpts) = ArgParser.parse(args) 38745c767e3SLinJiawei XiangShanStage.execute(firrtlOpts, Seq( 3888b037849SYinan Xu ChiselGeneratorAnnotation(() => { 38945c767e3SLinJiawei val soc = LazyModule(new XSTop()(config)) 3908b037849SYinan Xu soc.module 3918b037849SYinan Xu }) 3928b037849SYinan Xu )) 393*afcc4f2aSJiawei Lin ElaborationArtefacts.files.foreach{ case (extension, contents) => 394*afcc4f2aSJiawei Lin writeOutputFile("./build", s"XSTop.${extension}", contents()) 395*afcc4f2aSJiawei Lin } 3968b037849SYinan Xu } 3978b037849SYinan Xu} 398