1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 178b037849SYinan Xupackage top 188b037849SYinan Xu 198b037849SYinan Xuimport chisel3._ 208b037849SYinan Xuimport chisel3.util._ 218b037849SYinan Xuimport xiangshan._ 2294c92d92SYinan Xuimport utils._ 238b037849SYinan Xuimport system._ 24*d4aca96cSlqreimport device._ 258b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation 262225d46eSJiawei Linimport chipsalliance.rocketchip.config._ 27*d4aca96cSlqreimport device.{AXI4Plic, TLTimer, DebugModule} 28afcc4f2aSJiawei Linimport firrtl.stage.RunFirrtlTransformAnnotation 298b037849SYinan Xuimport freechips.rocketchip.diplomacy._ 308b037849SYinan Xuimport freechips.rocketchip.tilelink._ 318b037849SYinan Xuimport freechips.rocketchip.amba.axi4._ 32afcc4f2aSJiawei Linimport freechips.rocketchip.devices.tilelink._ 332e3a956eSLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode 34afcc4f2aSJiawei Linimport freechips.rocketchip.interrupts._ 35afcc4f2aSJiawei Linimport freechips.rocketchip.stage.phases.GenerateArtefacts 36*d4aca96cSlqreimport freechips.rocketchip.jtag.JTAGIO 372e3a956eSLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen} 38afcc4f2aSJiawei Linimport freechips.rocketchip.util.{ElaborationArtefacts, HasRocketChipStageUtils} 39*d4aca96cSlqreimport freechips.rocketchip.devices.debug.{DebugIO, ResetCtrlIO} 40afcc4f2aSJiawei Linimport sifive.blocks.inclusivecache.{CacheParameters, InclusiveCache, InclusiveCacheMicroParameters} 418b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher 428b037849SYinan Xu 438b037849SYinan Xu 44*d4aca96cSlqre 452225d46eSJiawei Linclass XSCoreWithL2()(implicit p: Parameters) extends LazyModule 462225d46eSJiawei Lin with HasXSParameter with HasSoCParameter { 47afcc4f2aSJiawei Lin private val core = LazyModule(new XSCore) 4894c92d92SYinan Xu private val l2prefetcher = LazyModule(new L2Prefetcher()) 4994c92d92SYinan Xu private val l2xbar = TLXbar() 509d5a2027SYinan Xu private val l2cache = if (useFakeL2Cache) null else LazyModule(new InclusiveCache( 516c4d7a40SYinan Xu CacheParameters( 526c4d7a40SYinan Xu level = 2, 536c4d7a40SYinan Xu ways = L2NWays, 546c4d7a40SYinan Xu sets = L2NSets, 556c4d7a40SYinan Xu blockBytes = L2BlockSize, 566c4d7a40SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 5711b3c588SAllen cacheName = s"L2", 5883cb791fSallen uncachedGet = true, 5911b3c588SAllen enablePerf = false 606c4d7a40SYinan Xu ), 616c4d7a40SYinan Xu InclusiveCacheMicroParameters( 62f5089e26SWonicon memCycles = 25, 636c4d7a40SYinan Xu writeBytes = 32 642791c549Szfw ), 652225d46eSJiawei Lin fpga = debugOpts.FPGAPlatform 666c4d7a40SYinan Xu )) 67afcc4f2aSJiawei Lin if(!useFakeL2Cache) { 68afcc4f2aSJiawei Lin ResourceBinding { 69afcc4f2aSJiawei Lin Resource(l2cache.device, "reg").bind(ResourceAddress(hardId)) 70afcc4f2aSJiawei Lin } 71afcc4f2aSJiawei Lin } 729d5a2027SYinan Xu 739d5a2027SYinan Xu val memory_port = TLIdentityNode() 7494c92d92SYinan Xu val uncache = TLXbar() 756c4d7a40SYinan Xu 769d5a2027SYinan Xu if (!useFakeDCache) { 776c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 789d5a2027SYinan Xu } 799d5a2027SYinan Xu if (!useFakeL1plusCache) { 806c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 819d5a2027SYinan Xu } 829d5a2027SYinan Xu if (!useFakePTW) { 836c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 849d5a2027SYinan Xu } 856c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 869d5a2027SYinan Xu if (useFakeL2Cache) { 879d5a2027SYinan Xu memory_port := l2xbar 889d5a2027SYinan Xu } 899d5a2027SYinan Xu else { 906c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 919d5a2027SYinan Xu memory_port := l2cache.node 929d5a2027SYinan Xu } 936c4d7a40SYinan Xu 9494c92d92SYinan Xu uncache := TLBuffer() := core.frontend.instrUncache.clientNode 9594c92d92SYinan Xu uncache := TLBuffer() := core.memBlock.uncache.clientNode 966c4d7a40SYinan Xu 9794c92d92SYinan Xu lazy val module = new LazyModuleImp(this) { 986c4d7a40SYinan Xu val io = IO(new Bundle { 996c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 1006c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 1014e3ce935Sljw val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo 1026c4d7a40SYinan Xu }) 1036c4d7a40SYinan Xu 10494c92d92SYinan Xu core.module.io.hartId := io.hartId 10594c92d92SYinan Xu core.module.io.externalInterrupt := io.externalInterrupt 106c0bc1ee4SYinan Xu l2prefetcher.module.io.enable := core.module.io.l2_pf_enable 1079d5a2027SYinan Xu if (useFakeL2Cache) { 1089d5a2027SYinan Xu l2prefetcher.module.io.in := DontCare 1099d5a2027SYinan Xu } 1109d5a2027SYinan Xu else { 11194c92d92SYinan Xu l2prefetcher.module.io.in <> l2cache.module.io 1129d5a2027SYinan Xu } 11394c92d92SYinan Xu io.l1plus_error <> core.module.io.l1plus_error 11494c92d92SYinan Xu io.icache_error <> core.module.io.icache_error 11594c92d92SYinan Xu io.dcache_error <> core.module.io.dcache_error 1166c4d7a40SYinan Xu 1172225d46eSJiawei Lin val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 11894c92d92SYinan Xu core.module.reset := core_reset_gen.io.out 11994c92d92SYinan Xu 1202225d46eSJiawei Lin val l2_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 12194c92d92SYinan Xu l2prefetcher.module.reset := l2_reset_gen.io.out 1229d5a2027SYinan Xu if (!useFakeL2Cache) { 12394c92d92SYinan Xu l2cache.module.reset := l2_reset_gen.io.out 12494c92d92SYinan Xu } 12594c92d92SYinan Xu } 1269d5a2027SYinan Xu} 1276c4d7a40SYinan Xu 128afcc4f2aSJiawei Linabstract class BaseXSSoc()(implicit p: Parameters) extends LazyModule 129afcc4f2aSJiawei Lin with HasSoCParameter 130afcc4f2aSJiawei Lin with BindingScope 131afcc4f2aSJiawei Lin{ 1328b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 1338b037849SYinan Xu val peripheralXbar = TLXbar() 1348b037849SYinan Xu val l3_xbar = TLXbar() 135afcc4f2aSJiawei Lin lazy val dts = DTS(bindingTree) 1364f0a2459Swakafa lazy val json = JSON(bindingTree) 1378b037849SYinan Xu} 1388b037849SYinan Xu 1398b037849SYinan Xu// We adapt the following three traits from rocket-chip. 1408b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 1418b037849SYinan Xutrait HaveSlaveAXI4Port { 1428b037849SYinan Xu this: BaseXSSoc => 1438b037849SYinan Xu 1448b037849SYinan Xu val idBits = 16 1458b037849SYinan Xu 1468b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 1478b037849SYinan Xu Seq(AXI4MasterParameters( 1488b037849SYinan Xu name = "dma", 1498b037849SYinan Xu id = IdRange(0, 1 << idBits) 1508b037849SYinan Xu )) 1518b037849SYinan Xu ))) 1528b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 1538b037849SYinan Xu params = DevNullParams( 1548b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 1558b037849SYinan Xu maxAtomic = 8, 1568b037849SYinan Xu maxTransfer = 64), 1572225d46eSJiawei Lin beatBytes = L3InnerBusWidth / 8 1588b037849SYinan Xu )) 1598b037849SYinan Xu private val error_xbar = TLXbar() 1608b037849SYinan Xu 1618b037849SYinan Xu error_xbar := 1628b037849SYinan Xu AXI4ToTL() := 1638b037849SYinan Xu AXI4UserYanker(Some(1)) := 1648b037849SYinan Xu AXI4Fragmenter() := 1658b037849SYinan Xu AXI4IdIndexer(1) := 1668b037849SYinan Xu l3FrontendAXI4Node 1678b037849SYinan Xu errorDevice.node := error_xbar 1688b037849SYinan Xu l3_xbar := 1698b037849SYinan Xu TLBuffer() := 1708b037849SYinan Xu error_xbar 1718b037849SYinan Xu 1728b037849SYinan Xu val dma = InModuleBody { 1738b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1748b037849SYinan Xu } 1758b037849SYinan Xu} 1768b037849SYinan Xu 1778b037849SYinan Xutrait HaveAXI4MemPort { 1788b037849SYinan Xu this: BaseXSSoc => 179afcc4f2aSJiawei Lin val device = new MemoryDevice 1808b037849SYinan Xu // 40-bit physical address 1818b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 182329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1838b037849SYinan Xu AXI4SlavePortParameters( 1848b037849SYinan Xu slaves = Seq( 1858b037849SYinan Xu AXI4SlaveParameters( 1868b037849SYinan Xu address = memRange, 1878b037849SYinan Xu regionType = RegionType.UNCACHED, 1888b037849SYinan Xu executable = true, 1898b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1908b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 191afcc4f2aSJiawei Lin interleavedId = Some(0), 192afcc4f2aSJiawei Lin resources = device.reg("mem") 1938b037849SYinan Xu ) 1948b037849SYinan Xu ), 1952225d46eSJiawei Lin beatBytes = L3OuterBusWidth / 8 1968b037849SYinan Xu ) 197329e267dSYinan Xu )) 1988b037849SYinan Xu 199329e267dSYinan Xu val mem_xbar = TLXbar() 200329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 201329e267dSYinan Xu memAXI4SlaveNode := 202329e267dSYinan Xu AXI4UserYanker() := 203329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 204329e267dSYinan Xu TLToAXI4() := 2052225d46eSJiawei Lin TLWidthWidget(L3OuterBusWidth / 8) := 206329e267dSYinan Xu mem_xbar 2078b037849SYinan Xu 2088b037849SYinan Xu val memory = InModuleBody { 2098b037849SYinan Xu memAXI4SlaveNode.makeIOs() 2108b037849SYinan Xu } 2118b037849SYinan Xu} 2128b037849SYinan Xu 2138b037849SYinan Xu 2148b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 215*d4aca96cSlqre // on-chip devices: 0x3800_0000 - 0x3fff_ffff 0x0000_0000 - 0x0000_0fff 2168b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 217afcc4f2aSJiawei Lin val uartRange = AddressSet(0x40600000, 0xf) 218afcc4f2aSJiawei Lin val uartDevice = new SimpleDevice("serial", Seq("xilinx,uartlite")) 219afcc4f2aSJiawei Lin val uartParams = AXI4SlaveParameters( 220afcc4f2aSJiawei Lin address = Seq(uartRange), 221afcc4f2aSJiawei Lin regionType = RegionType.UNCACHED, 222afcc4f2aSJiawei Lin supportsRead = TransferSizes(1, 8), 223afcc4f2aSJiawei Lin supportsWrite = TransferSizes(1, 8), 224afcc4f2aSJiawei Lin resources = uartDevice.reg 225afcc4f2aSJiawei Lin ) 226afcc4f2aSJiawei Lin val peripheralRange = AddressSet( 227afcc4f2aSJiawei Lin 0x0, 0x7fffffff 228afcc4f2aSJiawei Lin ).subtract(onChipPeripheralRange).flatMap(x => x.subtract(uartRange)) 2298b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 2308b037849SYinan Xu Seq(AXI4SlaveParameters( 2318b037849SYinan Xu address = peripheralRange, 2328b037849SYinan Xu regionType = RegionType.UNCACHED, 2338b037849SYinan Xu supportsRead = TransferSizes(1, 8), 2348b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 2358b037849SYinan Xu interleavedId = Some(0) 236afcc4f2aSJiawei Lin ), uartParams), 2378b037849SYinan Xu beatBytes = 8 2388b037849SYinan Xu ))) 2398b037849SYinan Xu 2408b037849SYinan Xu peripheralNode := 2418b037849SYinan Xu AXI4UserYanker() := 2429d4d50e0SYinan Xu AXI4Deinterleaver(8) := 2438b037849SYinan Xu TLToAXI4() := 2448b037849SYinan Xu peripheralXbar 2458b037849SYinan Xu 2468b037849SYinan Xu val peripheral = InModuleBody { 2478b037849SYinan Xu peripheralNode.makeIOs() 2488b037849SYinan Xu } 2498b037849SYinan Xu 2508b037849SYinan Xu} 2518b037849SYinan Xu 2522225d46eSJiawei Linclass XSTop()(implicit p: Parameters) extends XSTopWithoutDMA 2532225d46eSJiawei Lin with HaveSlaveAXI4Port 2548b037849SYinan Xu 2552225d46eSJiawei Linclass XSTopWithoutDMA()(implicit p: Parameters) extends BaseXSSoc() 2568b037849SYinan Xu with HaveAXI4MemPort 2578b037849SYinan Xu with HaveAXI4PeripheralPort 2588b037849SYinan Xu{ 259afcc4f2aSJiawei Lin ResourceBinding { 260afcc4f2aSJiawei Lin val width = ResourceInt(2) 261afcc4f2aSJiawei Lin val model = "freechips,rocketchip-unknown" 262afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "model").bind(ResourceString(model)) 263afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "compat").bind(ResourceString(model + "-dev")) 264afcc4f2aSJiawei Lin Resource(ResourceAnchors.soc, "compat").bind(ResourceString(model + "-soc")) 265afcc4f2aSJiawei Lin Resource(ResourceAnchors.root, "width").bind(width) 266afcc4f2aSJiawei Lin Resource(ResourceAnchors.soc, "width").bind(width) 267afcc4f2aSJiawei Lin Resource(ResourceAnchors.cpus, "width").bind(ResourceInt(1)) 268afcc4f2aSJiawei Lin def bindManagers(xbar: TLNexusNode) = { 269afcc4f2aSJiawei Lin ManagerUnification(xbar.edges.in.head.manager.managers).foreach{ manager => 270afcc4f2aSJiawei Lin manager.resources.foreach(r => r.bind(manager.toResource)) 271afcc4f2aSJiawei Lin } 272afcc4f2aSJiawei Lin } 273afcc4f2aSJiawei Lin bindManagers(l3_xbar.asInstanceOf[TLNexusNode]) 274afcc4f2aSJiawei Lin bindManagers(peripheralXbar.asInstanceOf[TLNexusNode]) 275afcc4f2aSJiawei Lin } 2768b037849SYinan Xu 2772225d46eSJiawei Lin println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3OuterBusWidth") 2788b037849SYinan Xu 2792225d46eSJiawei Lin val core_with_l2 = soc.cores.map(coreParams => 2802225d46eSJiawei Lin LazyModule(new XSCoreWithL2()(p.alterPartial({ 2812225d46eSJiawei Lin case XSCoreParamsKey => coreParams 2822225d46eSJiawei Lin }))) 2832225d46eSJiawei Lin ) 2848b037849SYinan Xu 2858b037849SYinan Xu for (i <- 0 until NumCores) { 28694c92d92SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).uncache 2879d5a2027SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).memory_port 2888b037849SYinan Xu } 2898b037849SYinan Xu 290afcc4f2aSJiawei Lin val clint = LazyModule(new CLINT(CLINTParams(0x38000000L), 8)) 2918b037849SYinan Xu clint.node := peripheralXbar 2928b037849SYinan Xu 293afcc4f2aSJiawei Lin val clintIntSinks = Array.fill(NumCores){ 294afcc4f2aSJiawei Lin val clintSink = LazyModule(new IntSinkNodeToModule(2)) 295afcc4f2aSJiawei Lin clintSink.sinkNode := clint.intnode 296afcc4f2aSJiawei Lin clintSink 297afcc4f2aSJiawei Lin } 298afcc4f2aSJiawei Lin 2992e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 3002e3a956eSLinJiawei val beu = LazyModule( 3012e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 3022e3a956eSLinJiawei beu.node := peripheralXbar 3032e3a956eSLinJiawei 304afcc4f2aSJiawei Lin class IntSinkNodeToModule(val sinks: Int)(implicit p: Parameters) extends LazyModule { 305afcc4f2aSJiawei Lin val sinkNode = IntSinkNode(IntSinkPortSimple(1, sinks)) 3062e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 307afcc4f2aSJiawei Lin val out = IO(Output(Vec(sinks, Bool()))) 308afcc4f2aSJiawei Lin out.zip(sinkNode.in.head._1).foreach{ case (o, i) => o := i } 3092e3a956eSLinJiawei } 3102e3a956eSLinJiawei } 3112e3a956eSLinJiawei 312afcc4f2aSJiawei Lin class IntSourceNodeToModule(val num: Int)(implicit p: Parameters) extends LazyModule { 313afcc4f2aSJiawei Lin val sourceNode = IntSourceNode(IntSourcePortSimple(num, ports = 1, sources = 1)) 314afcc4f2aSJiawei Lin lazy val module = new LazyModuleImp(this){ 315afcc4f2aSJiawei Lin val in = IO(Input(Vec(num, Bool()))) 316afcc4f2aSJiawei Lin in.zip(sourceNode.out.head._1).foreach{ case (i, s) => s := i } 317afcc4f2aSJiawei Lin } 318afcc4f2aSJiawei Lin } 319afcc4f2aSJiawei Lin 320afcc4f2aSJiawei Lin val plic = LazyModule(new TLPLIC(PLICParams(0x3c000000L), 8)) 321afcc4f2aSJiawei Lin val plicSource = LazyModule(new IntSourceNodeToModule(NrExtIntr)) 322afcc4f2aSJiawei Lin val plicIntSinks = Array.fill(NumCores){ 323afcc4f2aSJiawei Lin val plicSink = LazyModule(new IntSinkNodeToModule(1)) 324afcc4f2aSJiawei Lin plicSink.sinkNode := plic.intnode 325afcc4f2aSJiawei Lin plicSink 326afcc4f2aSJiawei Lin } 327afcc4f2aSJiawei Lin plic.intnode := beu.intNode 328afcc4f2aSJiawei Lin plic.intnode := plicSource.sourceNode 329afcc4f2aSJiawei Lin 330afcc4f2aSJiawei Lin plic.node := peripheralXbar 3318b037849SYinan Xu 3329d5a2027SYinan Xu val l3cache = if (useFakeL3Cache) null else LazyModule(new InclusiveCache( 3338b037849SYinan Xu CacheParameters( 3348b037849SYinan Xu level = 3, 3358b037849SYinan Xu ways = L3NWays, 3368b037849SYinan Xu sets = L3NSets, 3378b037849SYinan Xu blockBytes = L3BlockSize, 3382225d46eSJiawei Lin beatBytes = L3InnerBusWidth / 8, 33911b3c588SAllen cacheName = "L3", 34083cb791fSallen uncachedGet = false, 34111b3c588SAllen enablePerf = false 3428b037849SYinan Xu ), 3438b037849SYinan Xu InclusiveCacheMicroParameters( 344f5089e26SWonicon memCycles = 25, 3458b037849SYinan Xu writeBytes = 32 3462791c549Szfw ), 3472225d46eSJiawei Lin fpga = debugOpts.FPGAPlatform 34894c92d92SYinan Xu )) 349afcc4f2aSJiawei Lin if(!useFakeL3Cache){ 350afcc4f2aSJiawei Lin ResourceBinding{ 351afcc4f2aSJiawei Lin Resource(l3cache.device, "reg").bind(ResourceAddress(0)) 352afcc4f2aSJiawei Lin } 353afcc4f2aSJiawei Lin } 3549d5a2027SYinan Xu val l3Ignore = if (useFakeL3Cache) TLIgnoreNode() else null 3558b037849SYinan Xu 3569d5a2027SYinan Xu if (useFakeL3Cache) { 3579d5a2027SYinan Xu bankedNode :*= l3Ignore :*= l3_xbar 3589d5a2027SYinan Xu } 3599d5a2027SYinan Xu else { 36094c92d92SYinan Xu bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar 3619d5a2027SYinan Xu } 3628b037849SYinan Xu 363*d4aca96cSlqre val debugModule = LazyModule(new DebugModule(NumCores)(p)) 364*d4aca96cSlqre debugModule.debug.node := peripheralXbar 365*d4aca96cSlqre val debugIntSink = LazyModule(new IntSinkNodeToModule(NumCores)) 366*d4aca96cSlqre debugIntSink.sinkNode := debugModule.debug.dmOuter.dmOuter.intnode 367*d4aca96cSlqre debugModule.debug.dmInner.dmInner.sb2tlOpt.foreach { sb2tl => 368*d4aca96cSlqre l3_xbar := TLBuffer() := TLWidthWidget(1) := sb2tl.node 369*d4aca96cSlqre } 370*d4aca96cSlqre 37194c92d92SYinan Xu lazy val module = new LazyRawModuleImp(this) { 372afcc4f2aSJiawei Lin ElaborationArtefacts.add("dts", dts) 3734f0a2459Swakafa ElaborationArtefacts.add("graphml", graphML) 3744f0a2459Swakafa ElaborationArtefacts.add("json", json) 3754f0a2459Swakafa ElaborationArtefacts.add("plusArgs", freechips.rocketchip.util.PlusArgArtefacts.serialize_cHeader()) 3764f0a2459Swakafa 3778b037849SYinan Xu val io = IO(new Bundle { 37894c92d92SYinan Xu val clock = Input(Bool()) 37994c92d92SYinan Xu val reset = Input(Bool()) 3808b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 3818b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 3822225d46eSJiawei Lin val ila = if(debugOpts.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 383*d4aca96cSlqre val systemjtag = new Bundle { 384*d4aca96cSlqre val jtag = Flipped(new JTAGIO(hasTRSTn = false)) 385*d4aca96cSlqre val reset = Input(Bool()) // No reset allowed on top 386*d4aca96cSlqre val mfr_id = Input(UInt(11.W)) 387*d4aca96cSlqre val part_number = Input(UInt(16.W)) 388*d4aca96cSlqre val version = Input(UInt(4.W)) 389*d4aca96cSlqre } 390*d4aca96cSlqre // val resetCtrl = new ResetCtrlIO(NumCores)(p) 3918b037849SYinan Xu }) 39294c92d92SYinan Xu childClock := io.clock.asClock() 3938b037849SYinan Xu 39494c92d92SYinan Xu withClockAndReset(childClock, io.reset) { 3952225d46eSJiawei Lin val resetGen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 39694c92d92SYinan Xu resetGen.suggestName("top_reset_gen") 397*d4aca96cSlqre childReset := resetGen.io.out | debugModule.module.io.debugIO.ndreset 39894c92d92SYinan Xu } 39994c92d92SYinan Xu 40094c92d92SYinan Xu withClockAndReset(childClock, childReset) { 401afcc4f2aSJiawei Lin plicSource.module.in := io.extIntrs.asBools() 402c0bc1ee4SYinan Xu 4038b037849SYinan Xu for (i <- 0 until NumCores) { 4042225d46eSJiawei Lin val core_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 40594c92d92SYinan Xu core_reset_gen.suggestName(s"core_${i}_reset_gen") 40694c92d92SYinan Xu core_with_l2(i).module.reset := core_reset_gen.io.out 4076c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 408afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.msip := clintIntSinks(i).module.out(0) 409afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.mtip := clintIntSinks(i).module.out(1) 410afcc4f2aSJiawei Lin core_with_l2(i).module.io.externalInterrupt.meip := plicIntSinks(i).module.out(0) 411*d4aca96cSlqre core_with_l2(i).module.io.externalInterrupt.debug := debugIntSink.module.out(i) 412c0bc1ee4SYinan Xu beu.module.io.errors.l1plus(i) := core_with_l2(i).module.io.l1plus_error 413c0bc1ee4SYinan Xu beu.module.io.errors.icache(i) := core_with_l2(i).module.io.icache_error 414c0bc1ee4SYinan Xu beu.module.io.errors.dcache(i) := core_with_l2(i).module.io.dcache_error 4158b037849SYinan Xu } 4168b037849SYinan Xu 4179d5a2027SYinan Xu if (!useFakeL3Cache) { 4182225d46eSJiawei Lin val l3_reset_gen = Module(new ResetGen(1, !debugOpts.FPGAPlatform)) 41994c92d92SYinan Xu l3_reset_gen.suggestName("l3_reset_gen") 42094c92d92SYinan Xu l3cache.module.reset := l3_reset_gen.io.out 42194c92d92SYinan Xu } 422330595dfSJiawei Lin // TODO: wrap this in a module 423330595dfSJiawei Lin val freq = 100 424330595dfSJiawei Lin val cnt = RegInit(freq.U) 425330595dfSJiawei Lin val tick = cnt === 0.U 426330595dfSJiawei Lin cnt := Mux(tick, freq.U, cnt - 1.U) 427330595dfSJiawei Lin clint.module.io.rtcTick := tick 428*d4aca96cSlqre 429*d4aca96cSlqre debugModule.module.io.resetCtrl.hartIsInReset.foreach {x => x := childReset.asBool() } 430*d4aca96cSlqre debugModule.module.io.clock := io.clock 431*d4aca96cSlqre debugModule.module.io.reset := io.reset 432*d4aca96cSlqre 433*d4aca96cSlqre debugModule.module.io.debugIO.reset := io.systemjtag.reset // TODO: use synchronizer? 434*d4aca96cSlqre debugModule.module.io.debugIO.clock := childClock 435*d4aca96cSlqre debugModule.module.io.debugIO.dmactiveAck := debugModule.module.io.debugIO.dmactive // TODO: delay 3 cycles? 436*d4aca96cSlqre // jtag connector 437*d4aca96cSlqre debugModule.module.io.debugIO.systemjtag.foreach { x => 438*d4aca96cSlqre x.jtag <> io.systemjtag.jtag 439*d4aca96cSlqre x.reset := io.systemjtag.reset 440*d4aca96cSlqre x.mfr_id := io.systemjtag.mfr_id 441*d4aca96cSlqre x.part_number := io.systemjtag.part_number 442*d4aca96cSlqre x.version := io.systemjtag.version 443*d4aca96cSlqre } 4448b037849SYinan Xu } 4458b037849SYinan Xu } 4469d5a2027SYinan Xu} 4478b037849SYinan Xu 448afcc4f2aSJiawei Linobject TopMain extends App with HasRocketChipStageUtils { 4498b037849SYinan Xu override def main(args: Array[String]): Unit = { 45045c767e3SLinJiawei val (config, firrtlOpts) = ArgParser.parse(args) 45145c767e3SLinJiawei XiangShanStage.execute(firrtlOpts, Seq( 4528b037849SYinan Xu ChiselGeneratorAnnotation(() => { 45345c767e3SLinJiawei val soc = LazyModule(new XSTop()(config)) 4548b037849SYinan Xu soc.module 4558b037849SYinan Xu }) 4568b037849SYinan Xu )) 457afcc4f2aSJiawei Lin ElaborationArtefacts.files.foreach{ case (extension, contents) => 458afcc4f2aSJiawei Lin writeOutputFile("./build", s"XSTop.${extension}", contents()) 459afcc4f2aSJiawei Lin } 4608b037849SYinan Xu } 4618b037849SYinan Xu} 462