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( 366c4d7a40SYinan Xu writeBytes = 32 376c4d7a40SYinan Xu ) 386c4d7a40SYinan Xu )) 396c4d7a40SYinan Xu private val l2xbar = TLXbar() 406c4d7a40SYinan Xu 416c4d7a40SYinan Xu l2xbar := TLBuffer() := core.memBlock.dcache.clientNode 426c4d7a40SYinan Xu l2xbar := TLBuffer() := core.l1pluscache.clientNode 436c4d7a40SYinan Xu l2xbar := TLBuffer() := core.ptw.node 446c4d7a40SYinan Xu l2xbar := TLBuffer() := l2prefetcher.clientNode 456c4d7a40SYinan Xu l2cache.node := TLBuffer() := l2xbar 466c4d7a40SYinan Xu 476c4d7a40SYinan Xu lazy val module = new XSCoreWithL2Imp(this) 486c4d7a40SYinan Xu} 496c4d7a40SYinan Xu 506c4d7a40SYinan Xuclass XSCoreWithL2Imp(outer: XSCoreWithL2) extends LazyModuleImp(outer) 516c4d7a40SYinan Xu with HasXSParameter { 526c4d7a40SYinan Xu val io = IO(new Bundle { 536c4d7a40SYinan Xu val hartId = Input(UInt(64.W)) 546c4d7a40SYinan Xu val externalInterrupt = new ExternalInterruptIO 552e3a956eSLinJiawei val icache_error, dcache_error = new L1CacheErrorInfo 566c4d7a40SYinan Xu }) 576c4d7a40SYinan Xu 586c4d7a40SYinan Xu outer.core.module.io.hartId := io.hartId 596c4d7a40SYinan Xu outer.core.module.io.externalInterrupt := io.externalInterrupt 606c4d7a40SYinan Xu outer.l2prefetcher.module.io.enable := RegNext(outer.core.module.io.l2_pf_enable) 616c4d7a40SYinan Xu outer.l2prefetcher.module.io.in <> outer.l2cache.module.io 622e3a956eSLinJiawei io.icache_error <> outer.core.module.io.icache_error 632e3a956eSLinJiawei io.dcache_error <> outer.core.module.io.dcache_error 646c4d7a40SYinan Xu} 656c4d7a40SYinan Xu 666c4d7a40SYinan Xu 678b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 688b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 698b037849SYinan Xu val peripheralXbar = TLXbar() 708b037849SYinan Xu val l3_xbar = TLXbar() 718b037849SYinan Xu} 728b037849SYinan Xu 738b037849SYinan Xu// We adapt the following three traits from rocket-chip. 748b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 758b037849SYinan Xutrait HaveSlaveAXI4Port { 768b037849SYinan Xu this: BaseXSSoc => 778b037849SYinan Xu 788b037849SYinan Xu val idBits = 16 798b037849SYinan Xu 808b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 818b037849SYinan Xu Seq(AXI4MasterParameters( 828b037849SYinan Xu name = "dma", 838b037849SYinan Xu id = IdRange(0, 1 << idBits) 848b037849SYinan Xu )) 858b037849SYinan Xu ))) 868b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 878b037849SYinan Xu params = DevNullParams( 888b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 898b037849SYinan Xu maxAtomic = 8, 908b037849SYinan Xu maxTransfer = 64), 918b037849SYinan Xu beatBytes = L2BusWidth / 8 928b037849SYinan Xu )) 938b037849SYinan Xu private val error_xbar = TLXbar() 948b037849SYinan Xu 958b037849SYinan Xu error_xbar := 968b037849SYinan Xu AXI4ToTL() := 978b037849SYinan Xu AXI4UserYanker(Some(1)) := 988b037849SYinan Xu AXI4Fragmenter() := 998b037849SYinan Xu AXI4IdIndexer(1) := 1008b037849SYinan Xu l3FrontendAXI4Node 1018b037849SYinan Xu errorDevice.node := error_xbar 1028b037849SYinan Xu l3_xbar := 1038b037849SYinan Xu TLBuffer() := 1048b037849SYinan Xu error_xbar 1058b037849SYinan Xu 1068b037849SYinan Xu val dma = InModuleBody { 1078b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 1088b037849SYinan Xu } 1098b037849SYinan Xu} 1108b037849SYinan Xu 1118b037849SYinan Xutrait HaveAXI4MemPort { 1128b037849SYinan Xu this: BaseXSSoc => 1138b037849SYinan Xu // 40-bit physical address 1148b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 115*329e267dSYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq( 1168b037849SYinan Xu AXI4SlavePortParameters( 1178b037849SYinan Xu slaves = Seq( 1188b037849SYinan Xu AXI4SlaveParameters( 1198b037849SYinan Xu address = memRange, 1208b037849SYinan Xu regionType = RegionType.UNCACHED, 1218b037849SYinan Xu executable = true, 1228b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 1238b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 1248b037849SYinan Xu interleavedId = Some(0) 1258b037849SYinan Xu ) 1268b037849SYinan Xu ), 1278b037849SYinan Xu beatBytes = L3BusWidth / 8 1288b037849SYinan Xu ) 129*329e267dSYinan Xu )) 1308b037849SYinan Xu 131*329e267dSYinan Xu val mem_xbar = TLXbar() 132*329e267dSYinan Xu mem_xbar :=* TLBuffer() :=* TLCacheCork() :=* bankedNode 133*329e267dSYinan Xu memAXI4SlaveNode := 134*329e267dSYinan Xu AXI4UserYanker() := 135*329e267dSYinan Xu AXI4Deinterleaver(L3BlockSize) := 136*329e267dSYinan Xu TLToAXI4() := 137*329e267dSYinan Xu TLWidthWidget(L3BusWidth / 8) := 138*329e267dSYinan Xu mem_xbar 1398b037849SYinan Xu 1408b037849SYinan Xu val memory = InModuleBody { 1418b037849SYinan Xu memAXI4SlaveNode.makeIOs() 1428b037849SYinan Xu } 1438b037849SYinan Xu} 1448b037849SYinan Xu 1458b037849SYinan Xu 1468b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 1478b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 1488b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 1498b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 1508b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 1518b037849SYinan Xu Seq(AXI4SlaveParameters( 1528b037849SYinan Xu address = peripheralRange, 1538b037849SYinan Xu regionType = RegionType.UNCACHED, 1548b037849SYinan Xu supportsRead = TransferSizes(1, 8), 1558b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 1568b037849SYinan Xu interleavedId = Some(0) 1578b037849SYinan Xu )), 1588b037849SYinan Xu beatBytes = 8 1598b037849SYinan Xu ))) 1608b037849SYinan Xu 1618b037849SYinan Xu peripheralNode := 1628b037849SYinan Xu AXI4UserYanker() := 1639d4d50e0SYinan Xu AXI4Deinterleaver(8) := 1648b037849SYinan Xu TLToAXI4() := 1658b037849SYinan Xu peripheralXbar 1668b037849SYinan Xu 1678b037849SYinan Xu val peripheral = InModuleBody { 1688b037849SYinan Xu peripheralNode.makeIOs() 1698b037849SYinan Xu } 1708b037849SYinan Xu 1718b037849SYinan Xu} 1728b037849SYinan Xu 1738b037849SYinan Xu 1748b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 1758b037849SYinan Xu with HaveAXI4MemPort 1768b037849SYinan Xu with HaveAXI4PeripheralPort 1778b037849SYinan Xu with HaveSlaveAXI4Port 1788b037849SYinan Xu{ 1798b037849SYinan Xu 1808b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 1818b037849SYinan Xu 1826c4d7a40SYinan Xu val core_with_l2 = Seq.fill(NumCores)(LazyModule(new XSCoreWithL2)) 1838b037849SYinan Xu 1848b037849SYinan Xu for (i <- 0 until NumCores) { 1856c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.frontend.instrUncache.clientNode 1866c4d7a40SYinan Xu peripheralXbar := TLBuffer() := core_with_l2(i).core.memBlock.uncache.clientNode 1876c4d7a40SYinan Xu l3_xbar := TLBuffer() := core_with_l2(i).l2cache.node 1888b037849SYinan Xu } 1898b037849SYinan Xu 1908b037849SYinan Xu private val clint = LazyModule(new TLTimer( 1918b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 1928b037849SYinan Xu sim = !env.FPGAPlatform 1938b037849SYinan Xu )) 1948b037849SYinan Xu clint.node := peripheralXbar 1958b037849SYinan Xu 1962e3a956eSLinJiawei val fakeTreeNode = new GenericLogicalTreeNode 1972e3a956eSLinJiawei val beu = LazyModule( 1982e3a956eSLinJiawei new BusErrorUnit(new XSL1BusErrors(NumCores), BusErrorUnitParams(0x38010000), fakeTreeNode)) 1992e3a956eSLinJiawei beu.node := peripheralXbar 2002e3a956eSLinJiawei 2012e3a956eSLinJiawei class BeuSinkNode()(implicit p: config.Parameters) extends LazyModule { 2022e3a956eSLinJiawei val intSinkNode = IntSinkNode(IntSinkPortSimple()) 2032e3a956eSLinJiawei lazy val module = new LazyModuleImp(this){ 2042e3a956eSLinJiawei val interrupt = IO(Output(Bool())) 2052e3a956eSLinJiawei interrupt := intSinkNode.in.head._1.head 2062e3a956eSLinJiawei } 2072e3a956eSLinJiawei } 2082e3a956eSLinJiawei val beuSink = LazyModule(new BeuSinkNode()) 2092e3a956eSLinJiawei beuSink.intSinkNode := beu.intNode 2102e3a956eSLinJiawei 2118b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 2128b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 2138b037849SYinan Xu sim = !env.FPGAPlatform 2148b037849SYinan Xu )) 2158b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 2168b037849SYinan Xu 2178b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 2188b037849SYinan Xu CacheParameters( 2198b037849SYinan Xu level = 3, 2208b037849SYinan Xu ways = L3NWays, 2218b037849SYinan Xu sets = L3NSets, 2228b037849SYinan Xu blockBytes = L3BlockSize, 2238b037849SYinan Xu beatBytes = L2BusWidth / 8, 2248b037849SYinan Xu cacheName = "L3" 2258b037849SYinan Xu ), 2268b037849SYinan Xu InclusiveCacheMicroParameters( 2278b037849SYinan Xu writeBytes = 32 2288b037849SYinan Xu ) 2298b037849SYinan Xu )).node 2308b037849SYinan Xu 2318b037849SYinan Xu bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar 2328b037849SYinan Xu 2338b037849SYinan Xu lazy val module = new LazyModuleImp(this) { 2348b037849SYinan Xu val io = IO(new Bundle { 2358b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 2368b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 2378b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 2388b037849SYinan Xu }) 2398b037849SYinan Xu 2408b037849SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 2418b037849SYinan Xu 2428b037849SYinan Xu for (i <- 0 until NumCores) { 2436c4d7a40SYinan Xu core_with_l2(i).module.io.hartId := i.U 2446c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 2456c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 2466c4d7a40SYinan Xu core_with_l2(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 2472e3a956eSLinJiawei beu.module.io.errors.icache(i) := RegNext(core_with_l2(i).module.io.icache_error) 2482e3a956eSLinJiawei beu.module.io.errors.dcache(i) := RegNext(core_with_l2(i).module.io.dcache_error) 2498b037849SYinan Xu } 2508b037849SYinan Xu 2518b037849SYinan Xu dontTouch(io.extIntrs) 2528b037849SYinan Xu } 2538b037849SYinan Xu} 2548b037849SYinan Xu 2558b037849SYinan Xuobject TopMain extends App { 2568b037849SYinan Xu override def main(args: Array[String]): Unit = { 2578b037849SYinan Xu Parameters.set( 2588b037849SYinan Xu args.contains("--dual-core") match { 2598b037849SYinan Xu case false => Parameters() 2608b037849SYinan Xu case true => Parameters.dualCoreParameters 2618b037849SYinan Xu } 2628b037849SYinan Xu ) 2638b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 2642e3a956eSLinJiawei implicit val p = new Config((_, _, _) => { 2652e3a956eSLinJiawei case XLen => 64 2662e3a956eSLinJiawei }) 2678b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 2688b037849SYinan Xu ChiselGeneratorAnnotation(() => { 2698b037849SYinan Xu val soc = LazyModule(new XSTop()) 2708b037849SYinan Xu soc.module 2718b037849SYinan Xu }) 2728b037849SYinan Xu )) 2738b037849SYinan Xu } 2748b037849SYinan Xu} 275