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 92e3a956eSLinJiaweiimport chipsalliance.rocketchip.config.Config 102e3a956eSLinJiaweiimport device.{AXI4Plic, TLTimer} 118b037849SYinan Xuimport freechips.rocketchip.diplomacy._ 128b037849SYinan Xuimport freechips.rocketchip.tilelink._ 138b037849SYinan Xuimport freechips.rocketchip.amba.axi4._ 148b037849SYinan Xuimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError} 152e3a956eSLinJiaweiimport freechips.rocketchip.diplomaticobjectmodel.logicaltree.GenericLogicalTreeNode 162e3a956eSLinJiaweiimport freechips.rocketchip.interrupts.{IntSinkNode, IntSinkPortSimple} 172e3a956eSLinJiaweiimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, XLen} 188b037849SYinan Xuimport sifive.blocks.inclusivecache._ 198b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher 208b037849SYinan Xu 218b037849SYinan Xu 226c4d7a40SYinan Xuclass XSCoreWithL2()(implicit p: config.Parameters) extends LazyModule 236c4d7a40SYinan Xu with HasXSParameter { 246c4d7a40SYinan Xu val core = LazyModule(new XSCore()) 256c4d7a40SYinan Xu val l2prefetcher = LazyModule(new L2Prefetcher()) 266c4d7a40SYinan Xu val l2cache = LazyModule(new InclusiveCache( 276c4d7a40SYinan Xu CacheParameters( 286c4d7a40SYinan Xu level = 2, 296c4d7a40SYinan Xu ways = L2NWays, 306c4d7a40SYinan Xu sets = L2NSets, 316c4d7a40SYinan Xu blockBytes = L2BlockSize, 326c4d7a40SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 336c4d7a40SYinan Xu cacheName = s"L2" 346c4d7a40SYinan Xu ), 356c4d7a40SYinan Xu InclusiveCacheMicroParameters( 36*f5089e26SWonicon memCycles = 25, 376c4d7a40SYinan Xu writeBytes = 32 386c4d7a40SYinan Xu ) 396c4d7a40SYinan Xu )) 406c4d7a40SYinan Xu private val l2xbar = TLXbar() 416c4d7a40SYinan Xu 426c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 436c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 446c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 456c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 466c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 476c4d7a40SYinan Xu 486c4d7a40SYinan Xu lazy val module = new XSCoreWithL2Imp(this) 496c4d7a40SYinan Xu} 506c4d7a40SYinan Xu 516c4d7a40SYinan Xuclass XSCoreWithL2Imp(outer: XSCoreWithL2) extends LazyModuleImp(outer) 526c4d7a40SYinan Xu with HasXSParameter { 536c4d7a40SYinan Xu val io = IO(new Bundle { 546c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 556c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 564e3ce935Sljw val l1plus_error, icache_error, dcache_error = new L1CacheErrorInfo 576c4d7a40SYinan Xu }) 586c4d7a40SYinan Xu 596c4d7a40SYinan Xu outer.core.module.io.hartId := io.hartId 606c4d7a40SYinan Xu outer.core.module.io.externalInterrupt := io.externalInterrupt 616c4d7a40SYinan Xu outer.l2prefetcher.module.io.enable := RegNext(outer.core.module.io.l2_pf_enable) 626c4d7a40SYinan Xu outer.l2prefetcher.module.io.in <> outer.l2cache.module.io 634e3ce935Sljw io.l1plus_error <> outer.core.module.io.l1plus_error 642e3a956eSLinJiawei io.icache_error <> outer.core.module.io.icache_error 652e3a956eSLinJiawei io.dcache_error <> outer.core.module.io.dcache_error 666c4d7a40SYinan Xu} 676c4d7a40SYinan Xu 686c4d7a40SYinan Xu 698b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 708b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 718b037849SYinan Xu val peripheralXbar = TLXbar() 728b037849SYinan Xu val l3_xbar = TLXbar() 738b037849SYinan Xu} 748b037849SYinan Xu 758b037849SYinan Xu// We adapt the following three traits from rocket-chip. 768b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 778b037849SYinan Xutrait HaveSlaveAXI4Port { 788b037849SYinan Xu this: BaseXSSoc => 798b037849SYinan Xu 808b037849SYinan Xu val idBits = 16 818b037849SYinan Xu 828b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 838b037849SYinan Xu Seq(AXI4MasterParameters( 848b037849SYinan Xu name = "dma", 858b037849SYinan Xu id = IdRange(0, 1 << idBits) 868b037849SYinan Xu )) 878b037849SYinan Xu ))) 888b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 898b037849SYinan Xu params = DevNullParams( 908b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 918b037849SYinan Xu maxAtomic = 8, 928b037849SYinan Xu maxTransfer = 64), 938b037849SYinan Xu beatBytes = L2BusWidth / 8 948b037849SYinan Xu )) 958b037849SYinan Xu private val error_xbar = TLXbar() 968b037849SYinan Xu 978b037849SYinan Xu error_xbar := 988b037849SYinan Xu AXI4ToTL() := 998b037849SYinan Xu AXI4UserYanker(Some(1)) := 1008b037849SYinan Xu AXI4Fragmenter() := 1018b037849SYinan Xu AXI4IdIndexer(1) := 1028b037849SYinan Xu l3FrontendAXI4Node 1038b037849SYinan Xu errorDevice.node := error_xbar 1048b037849SYinan Xu l3_xbar := 1058b037849SYinan Xu TLBuffer() := 1068b037849SYinan Xu error_xbar 1078b037849SYinan Xu 1088b037849SYinan Xu val dma = InModuleBody { 1098b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1108b037849SYinan Xu } 1118b037849SYinan Xu} 1128b037849SYinan Xu 1138b037849SYinan Xutrait HaveAXI4MemPort { 1148b037849SYinan Xu this: BaseXSSoc => 1158b037849SYinan Xu // 40-bit physical address 1168b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 117329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1188b037849SYinan Xu AXI4SlavePortParameters( 1198b037849SYinan Xu slaves = Seq( 1208b037849SYinan Xu AXI4SlaveParameters( 1218b037849SYinan Xu address = memRange, 1228b037849SYinan Xu regionType = RegionType.UNCACHED, 1238b037849SYinan Xu executable = true, 1248b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1258b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 1268b037849SYinan Xu interleavedId = Some(0) 1278b037849SYinan Xu ) 1288b037849SYinan Xu ), 1298b037849SYinan Xu beatBytes = L3BusWidth / 8 1308b037849SYinan Xu ) 131329e267dSYinan Xu )) 1328b037849SYinan Xu 133329e267dSYinan Xu val mem_xbar = TLXbar() 134329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 135329e267dSYinan Xu memAXI4SlaveNode := 136329e267dSYinan Xu AXI4UserYanker() := 137329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 138329e267dSYinan Xu TLToAXI4() := 139329e267dSYinan Xu TLWidthWidget(L3BusWidth / 8) := 140329e267dSYinan Xu mem_xbar 1418b037849SYinan Xu 1428b037849SYinan Xu val memory = InModuleBody { 1438b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1448b037849SYinan Xu } 1458b037849SYinan Xu} 1468b037849SYinan Xu 1478b037849SYinan Xu 1488b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1498b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1508b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 1518b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 1528b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 1538b037849SYinan Xu Seq(AXI4SlaveParameters( 1548b037849SYinan Xu address = peripheralRange, 1558b037849SYinan Xu regionType = RegionType.UNCACHED, 1568b037849SYinan Xu supportsRead = TransferSizes(1, 8), 1578b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 1588b037849SYinan Xu interleavedId = Some(0) 1598b037849SYinan Xu )), 1608b037849SYinan Xu beatBytes = 8 1618b037849SYinan Xu ))) 1628b037849SYinan Xu 1638b037849SYinan Xu peripheralNode := 1648b037849SYinan Xu AXI4UserYanker() := 1659d4d50e0SYinan Xu AXI4Deinterleaver(8) := 1668b037849SYinan Xu TLToAXI4() := 1678b037849SYinan Xu peripheralXbar 1688b037849SYinan Xu 1698b037849SYinan Xu val peripheral = InModuleBody { 1708b037849SYinan Xu peripheralNode.makeIOs() 1718b037849SYinan Xu } 1728b037849SYinan Xu 1738b037849SYinan Xu} 1748b037849SYinan Xu 1758b037849SYinan Xu 1768b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 1778b037849SYinan Xu with HaveAXI4MemPort 1788b037849SYinan Xu with HaveAXI4PeripheralPort 1798b037849SYinan Xu with HaveSlaveAXI4Port 1808b037849SYinan Xu{ 1818b037849SYinan Xu 1828b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 1838b037849SYinan Xu 1846c4d7a40SYinan Xu val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2)) 1858b037849SYinan Xu 1868b037849SYinan Xu for (i <- 0 until NumCores) { 1876c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.frontend.instrUncache.clientNode 1886c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.memBlock.uncache.clientNode 1896c4d7a40SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node 1908b037849SYinan Xu } 1918b037849SYinan Xu 1928b037849SYinan Xu private val clint = LazyModule(new TLTimer( 1938b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1948b037849SYinan Xu sim = !env.FPGAPlatform 1958b037849SYinan Xu )) 1968b037849SYinan Xu clint.node := peripheralXbar 1978b037849SYinan Xu 1982e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 1992e3a956eSLinJiawei val beu = LazyModule( 2002e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 2012e3a956eSLinJiawei beu.node := peripheralXbar 2022e3a956eSLinJiawei 2032e3a956eSLinJiawei class BeuSinkNode()(implicit p: config.Parameters) extends LazyModule { 2042e3a956eSLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 2052e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 2062e3a956eSLinJiawei val interrupt = IO(Output(Bool())) 2072e3a956eSLinJiawei interrupt := intSinkNode.in.head._1.head 2082e3a956eSLinJiawei } 2092e3a956eSLinJiawei } 2102e3a956eSLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 2112e3a956eSLinJiawei beuSink.intSinkNode := beu.intNode 2122e3a956eSLinJiawei 2138b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 2148b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 2158b037849SYinan Xu sim = !env.FPGAPlatform 2168b037849SYinan Xu )) 2178b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 2188b037849SYinan Xu 2198b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 2208b037849SYinan Xu CacheParameters( 2218b037849SYinan Xu level = 3, 2228b037849SYinan Xu ways = L3NWays, 2238b037849SYinan Xu sets = L3NSets, 2248b037849SYinan Xu blockBytes = L3BlockSize, 2258b037849SYinan Xu beatBytes = L2BusWidth / 8, 2268b037849SYinan Xu cacheName = "L3" 2278b037849SYinan Xu ), 2288b037849SYinan Xu InclusiveCacheMicroParameters( 229*f5089e26SWonicon memCycles = 25, 2308b037849SYinan Xu writeBytes = 32 2318b037849SYinan Xu ) 2328b037849SYinan Xu )).node 2338b037849SYinan Xu 2348b037849SYinan Xu bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar 2358b037849SYinan Xu 2368b037849SYinan Xu lazy val module = new LazyModuleImp(this) { 2378b037849SYinan Xu val io = IO(new Bundle { 2388b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 2398b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 2408b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 2418b037849SYinan Xu }) 2428b037849SYinan Xu 2438b037849SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 2448b037849SYinan Xu 2458b037849SYinan Xu for (i <- 0 until NumCores) { 2466c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 2476c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2486c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 2496c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 2504e3ce935Sljw beu.module.io.errors.l1plus(i) := RegNext(core_with_l2(i).module.io.l1plus_error) 2512e3a956eSLinJiawei beu.module.io.errors.icache(i) := RegNext(core_with_l2(i).module.io.icache_error) 2522e3a956eSLinJiawei beu.module.io.errors.dcache(i) := RegNext(core_with_l2(i).module.io.dcache_error) 2538b037849SYinan Xu } 2548b037849SYinan Xu 2558b037849SYinan Xu dontTouch(io.extIntrs) 2568b037849SYinan Xu } 2578b037849SYinan Xu} 2588b037849SYinan Xu 2598b037849SYinan Xuobject TopMain extends App { 2608b037849SYinan Xu override def main(args: Array[String]): Unit = { 2618b037849SYinan Xu Parameters.set( 2628b037849SYinan Xu args.contains("--dual-core") match { 2638b037849SYinan Xu case false => Parameters() 2648b037849SYinan Xu case true => Parameters.dualCoreParameters 2658b037849SYinan Xu } 2668b037849SYinan Xu ) 2678b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 2682e3a956eSLinJiawei implicit val p = new Config((_, _, _) => { 2692e3a956eSLinJiawei case XLen => 64 2702e3a956eSLinJiawei }) 2718b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 2728b037849SYinan Xu ChiselGeneratorAnnotation(() => { 2738b037849SYinan Xu val soc = LazyModule(new XSTop()) 2748b037849SYinan Xu soc.module 2758b037849SYinan Xu }) 2768b037849SYinan Xu )) 2778b037849SYinan Xu } 2788b037849SYinan Xu} 279