18b037849SYinan Xupackage top 28b037849SYinan Xu 38b037849SYinan Xuimport chisel3._ 48b037849SYinan Xuimport chisel3.util._ 58b037849SYinan Xuimport xiangshan._ 6*94c92d92SYinan 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} 19*94c92d92SYinan 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 { 25*94c92d92SYinan Xu private val core = LazyModule(new XSCore()) 26*94c92d92SYinan Xu private val l2prefetcher = LazyModule(new L2Prefetcher()) 27*94c92d92SYinan Xu private val l2xbar = TLXbar() 28*94c92d92SYinan 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", 3711b3c588SAllen enablePerf = false 386c4d7a40SYinan Xu ), 396c4d7a40SYinan Xu InclusiveCacheMicroParameters( 40f5089e26SWonicon memCycles = 25, 416c4d7a40SYinan Xu writeBytes = 32 426c4d7a40SYinan Xu ) 436c4d7a40SYinan Xu )) 44*94c92d92SYinan Xu val uncache = TLXbar() 456c4d7a40SYinan Xu 466c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 476c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 486c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 496c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 506c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 516c4d7a40SYinan Xu 52*94c92d92SYinan Xu uncache := TLBuffer() := core.frontend.instrUncache.clientNode 53*94c92d92SYinan Xu uncache := TLBuffer() := core.memBlock.uncache.clientNode 546c4d7a40SYinan Xu 55*94c92d92SYinan Xu lazy val module = new LazyModuleImp(this) { 566c4d7a40SYinan Xu val io = IO(new Bundle { 576c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 586c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 594e3ce935Sljw val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo 606c4d7a40SYinan Xu }) 616c4d7a40SYinan Xu 62*94c92d92SYinan Xu core.module.io.hartId := io.hartId 63*94c92d92SYinan Xu core.module.io.externalInterrupt := io.externalInterrupt 64*94c92d92SYinan Xu l2prefetcher.module.io.enable := RegNext(core.module.io.l2_pf_enable) 65*94c92d92SYinan Xu l2prefetcher.module.io.in <> l2cache.module.io 66*94c92d92SYinan Xu io.l1plus_error <> core.module.io.l1plus_error 67*94c92d92SYinan Xu io.icache_error <> core.module.io.icache_error 68*94c92d92SYinan Xu io.dcache_error <> core.module.io.dcache_error 696c4d7a40SYinan Xu 70*94c92d92SYinan Xu val core_reset_gen = Module(new ResetGen()) 71*94c92d92SYinan Xu core.module.reset := core_reset_gen.io.out 72*94c92d92SYinan Xu 73*94c92d92SYinan Xu val l2_reset_gen = Module(new ResetGen()) 74*94c92d92SYinan Xu l2prefetcher.module.reset := l2_reset_gen.io.out 75*94c92d92SYinan Xu l2cache.module.reset := l2_reset_gen.io.out 76*94c92d92SYinan Xu } 77*94c92d92SYinan Xu} 786c4d7a40SYinan Xu 798b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 808b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 818b037849SYinan Xu val peripheralXbar = TLXbar() 828b037849SYinan Xu val l3_xbar = TLXbar() 838b037849SYinan Xu} 848b037849SYinan Xu 858b037849SYinan Xu// We adapt the following three traits from rocket-chip. 868b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 878b037849SYinan Xutrait HaveSlaveAXI4Port { 888b037849SYinan Xu this: BaseXSSoc => 898b037849SYinan Xu 908b037849SYinan Xu val idBits = 16 918b037849SYinan Xu 928b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 938b037849SYinan Xu Seq(AXI4MasterParameters( 948b037849SYinan Xu name = "dma", 958b037849SYinan Xu id = IdRange(0, 1 << idBits) 968b037849SYinan Xu )) 978b037849SYinan Xu ))) 988b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 998b037849SYinan Xu params = DevNullParams( 1008b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 1018b037849SYinan Xu maxAtomic = 8, 1028b037849SYinan Xu maxTransfer = 64), 1038b037849SYinan Xu beatBytes = L2BusWidth / 8 1048b037849SYinan Xu )) 1058b037849SYinan Xu private val error_xbar = TLXbar() 1068b037849SYinan Xu 1078b037849SYinan Xu error_xbar := 1088b037849SYinan Xu AXI4ToTL() := 1098b037849SYinan Xu AXI4UserYanker(Some(1)) := 1108b037849SYinan Xu AXI4Fragmenter() := 1118b037849SYinan Xu AXI4IdIndexer(1) := 1128b037849SYinan Xu l3FrontendAXI4Node 1138b037849SYinan Xu errorDevice.node := error_xbar 1148b037849SYinan Xu l3_xbar := 1158b037849SYinan Xu TLBuffer() := 1168b037849SYinan Xu error_xbar 1178b037849SYinan Xu 1188b037849SYinan Xu val dma = InModuleBody { 1198b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1208b037849SYinan Xu } 1218b037849SYinan Xu} 1228b037849SYinan Xu 1238b037849SYinan Xutrait HaveAXI4MemPort { 1248b037849SYinan Xu this: BaseXSSoc => 1258b037849SYinan Xu // 40-bit physical address 1268b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 127329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1288b037849SYinan Xu AXI4SlavePortParameters( 1298b037849SYinan Xu slaves = Seq( 1308b037849SYinan Xu AXI4SlaveParameters( 1318b037849SYinan Xu address = memRange, 1328b037849SYinan Xu regionType = RegionType.UNCACHED, 1338b037849SYinan Xu executable = true, 1348b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1358b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 1368b037849SYinan Xu interleavedId = Some(0) 1378b037849SYinan Xu ) 1388b037849SYinan Xu ), 1398b037849SYinan Xu beatBytes = L3BusWidth / 8 1408b037849SYinan Xu ) 141329e267dSYinan Xu )) 1428b037849SYinan Xu 143329e267dSYinan Xu val mem_xbar = TLXbar() 144329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 145329e267dSYinan Xu memAXI4SlaveNode := 146329e267dSYinan Xu AXI4UserYanker() := 147329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 148329e267dSYinan Xu TLToAXI4() := 149329e267dSYinan Xu TLWidthWidget(L3BusWidth / 8) := 150329e267dSYinan Xu mem_xbar 1518b037849SYinan Xu 1528b037849SYinan Xu val memory = InModuleBody { 1538b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1548b037849SYinan Xu } 1558b037849SYinan Xu} 1568b037849SYinan Xu 1578b037849SYinan Xu 1588b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1598b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1608b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 1618b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 1628b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 1638b037849SYinan Xu Seq(AXI4SlaveParameters( 1648b037849SYinan Xu address = peripheralRange, 1658b037849SYinan Xu regionType = RegionType.UNCACHED, 1668b037849SYinan Xu supportsRead = TransferSizes(1, 8), 1678b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 1688b037849SYinan Xu interleavedId = Some(0) 1698b037849SYinan Xu )), 1708b037849SYinan Xu beatBytes = 8 1718b037849SYinan Xu ))) 1728b037849SYinan Xu 1738b037849SYinan Xu peripheralNode := 1748b037849SYinan Xu AXI4UserYanker() := 1759d4d50e0SYinan Xu AXI4Deinterleaver(8) := 1768b037849SYinan Xu TLToAXI4() := 1778b037849SYinan Xu peripheralXbar 1788b037849SYinan Xu 1798b037849SYinan Xu val peripheral = InModuleBody { 1808b037849SYinan Xu peripheralNode.makeIOs() 1818b037849SYinan Xu } 1828b037849SYinan Xu 1838b037849SYinan Xu} 1848b037849SYinan Xu 1858b037849SYinan Xu 1868b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 1878b037849SYinan Xu with HaveAXI4MemPort 1888b037849SYinan Xu with HaveAXI4PeripheralPort 1898b037849SYinan Xu with HaveSlaveAXI4Port 1908b037849SYinan Xu{ 1918b037849SYinan Xu 1928b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 1938b037849SYinan Xu 1946c4d7a40SYinan Xu val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2)) 1958b037849SYinan Xu 1968b037849SYinan Xu for (i <- 0 until NumCores) { 197*94c92d92SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).uncache 1986c4d7a40SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node 1998b037849SYinan Xu } 2008b037849SYinan Xu 2018b037849SYinan Xu private val clint = LazyModule(new TLTimer( 2028b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 2038b037849SYinan Xu sim = !env.FPGAPlatform 2048b037849SYinan Xu )) 2058b037849SYinan Xu clint.node := peripheralXbar 2068b037849SYinan Xu 2072e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 2082e3a956eSLinJiawei val beu = LazyModule( 2092e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 2102e3a956eSLinJiawei beu.node := peripheralXbar 2112e3a956eSLinJiawei 2122e3a956eSLinJiawei class BeuSinkNode()(implicit p: config.Parameters) extends LazyModule { 2132e3a956eSLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 2142e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 2152e3a956eSLinJiawei val interrupt = IO(Output(Bool())) 2162e3a956eSLinJiawei interrupt := intSinkNode.in.head._1.head 2172e3a956eSLinJiawei } 2182e3a956eSLinJiawei } 2192e3a956eSLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 2202e3a956eSLinJiawei beuSink.intSinkNode := beu.intNode 2212e3a956eSLinJiawei 2228b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 2238b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 2248b037849SYinan Xu sim = !env.FPGAPlatform 2258b037849SYinan Xu )) 2268b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 2278b037849SYinan Xu 2288b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 2298b037849SYinan Xu CacheParameters( 2308b037849SYinan Xu level = 3, 2318b037849SYinan Xu ways = L3NWays, 2328b037849SYinan Xu sets = L3NSets, 2338b037849SYinan Xu blockBytes = L3BlockSize, 2348b037849SYinan Xu beatBytes = L2BusWidth / 8, 23511b3c588SAllen cacheName = "L3", 23611b3c588SAllen enablePerf = false 2378b037849SYinan Xu ), 2388b037849SYinan Xu InclusiveCacheMicroParameters( 239f5089e26SWonicon memCycles = 25, 2408b037849SYinan Xu writeBytes = 32 2418b037849SYinan Xu ) 242*94c92d92SYinan Xu )) 2438b037849SYinan Xu 244*94c92d92SYinan Xu bankedNode :*= l3cache.node :*= TLBuffer() :*= l3_xbar 2458b037849SYinan Xu 246*94c92d92SYinan Xu lazy val module = new LazyRawModuleImp(this) { 2478b037849SYinan Xu val io = IO(new Bundle { 248*94c92d92SYinan Xu val clock = Input(Bool()) 249*94c92d92SYinan Xu val reset = Input(Bool()) 2508b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 2518b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 2528b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 2538b037849SYinan Xu }) 254*94c92d92SYinan Xu childClock := io.clock.asClock() 2558b037849SYinan Xu 256*94c92d92SYinan Xu withClockAndReset(childClock, io.reset) { 257*94c92d92SYinan Xu val resetGen = Module(new ResetGen()) 258*94c92d92SYinan Xu resetGen.suggestName("top_reset_gen") 259*94c92d92SYinan Xu childReset := resetGen.io.out 260*94c92d92SYinan Xu } 261*94c92d92SYinan Xu 262*94c92d92SYinan Xu withClockAndReset(childClock, childReset) { 2638b037849SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 2648b037849SYinan Xu for (i <- 0 until NumCores) { 265*94c92d92SYinan Xu val core_reset_gen = Module(new ResetGen()) 266*94c92d92SYinan Xu core_reset_gen.suggestName(s"core_${i}_reset_gen") 267*94c92d92SYinan Xu core_with_l2(i).module.reset := core_reset_gen.io.out 2686c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 2696c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2706c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 2716c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 2724e3ce935Sljw beu.module.io.errors.l1plus(i) := RegNext(core_with_l2(i).module.io.l1plus_error) 2732e3a956eSLinJiawei beu.module.io.errors.icache(i) := RegNext(core_with_l2(i).module.io.icache_error) 2742e3a956eSLinJiawei beu.module.io.errors.dcache(i) := RegNext(core_with_l2(i).module.io.dcache_error) 2758b037849SYinan Xu } 2768b037849SYinan Xu 277*94c92d92SYinan Xu val l3_reset_gen = Module(new ResetGen()) 278*94c92d92SYinan Xu l3_reset_gen.suggestName("l3_reset_gen") 279*94c92d92SYinan Xu l3cache.module.reset := l3_reset_gen.io.out 280*94c92d92SYinan Xu } 2818b037849SYinan Xu } 2828b037849SYinan Xu} 2838b037849SYinan Xu 2848b037849SYinan Xuobject TopMain extends App { 2858b037849SYinan Xu override def main(args: Array[String]): Unit = { 2868b037849SYinan Xu Parameters.set( 2878b037849SYinan Xu args.contains("--dual-core") match { 2888b037849SYinan Xu case false => Parameters() 2898b037849SYinan Xu case true => Parameters.dualCoreParameters 2908b037849SYinan Xu } 2918b037849SYinan Xu ) 2928b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 2932e3a956eSLinJiawei implicit val p = new Config((_, _, _) => { 2942e3a956eSLinJiawei case XLen => 64 2952e3a956eSLinJiawei }) 2968b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 2978b037849SYinan Xu ChiselGeneratorAnnotation(() => { 2988b037849SYinan Xu val soc = LazyModule(new XSTop()) 2998b037849SYinan Xu soc.module 3008b037849SYinan Xu }) 3018b037849SYinan Xu )) 3028b037849SYinan Xu } 3038b037849SYinan Xu} 304