1*8b037849SYinan Xupackage top 2*8b037849SYinan Xu 3*8b037849SYinan Xuimport chisel3._ 4*8b037849SYinan Xuimport chisel3.util._ 5*8b037849SYinan Xuimport xiangshan._ 6*8b037849SYinan Xuimport system._ 7*8b037849SYinan Xuimport chisel3.stage.ChiselGeneratorAnnotation 8*8b037849SYinan Xuimport chipsalliance.rocketchip.config 9*8b037849SYinan Xuimport device.{TLTimer, AXI4Plic} 10*8b037849SYinan Xuimport freechips.rocketchip.diplomacy._ 11*8b037849SYinan Xuimport freechips.rocketchip.tilelink._ 12*8b037849SYinan Xuimport freechips.rocketchip.amba.axi4._ 13*8b037849SYinan Xuimport freechips.rocketchip.devices.tilelink.{DevNullParams, TLError} 14*8b037849SYinan Xuimport sifive.blocks.inclusivecache._ 15*8b037849SYinan Xuimport xiangshan.cache.prefetch.L2Prefetcher 16*8b037849SYinan Xu 17*8b037849SYinan Xu 18*8b037849SYinan Xuabstract class BaseXSSoc()(implicit p: config.Parameters) extends LazyModule with HasSoCParameter { 19*8b037849SYinan Xu val bankedNode = BankBinder(L3NBanks, L3BlockSize) 20*8b037849SYinan Xu val peripheralXbar = TLXbar() 21*8b037849SYinan Xu val l3_xbar = TLXbar() 22*8b037849SYinan Xu} 23*8b037849SYinan Xu 24*8b037849SYinan Xu// We adapt the following three traits from rocket-chip. 25*8b037849SYinan Xu// Source: rocket-chip/src/main/scala/subsystem/Ports.scala 26*8b037849SYinan Xutrait HaveSlaveAXI4Port { 27*8b037849SYinan Xu this: BaseXSSoc => 28*8b037849SYinan Xu 29*8b037849SYinan Xu val idBits = 16 30*8b037849SYinan Xu 31*8b037849SYinan Xu val l3FrontendAXI4Node = AXI4MasterNode(Seq(AXI4MasterPortParameters( 32*8b037849SYinan Xu Seq(AXI4MasterParameters( 33*8b037849SYinan Xu name = "dma", 34*8b037849SYinan Xu id = IdRange(0, 1 << idBits) 35*8b037849SYinan Xu )) 36*8b037849SYinan Xu ))) 37*8b037849SYinan Xu private val errorDevice = LazyModule(new TLError( 38*8b037849SYinan Xu params = DevNullParams( 39*8b037849SYinan Xu address = Seq(AddressSet(0x0, 0x7fffffffL)), 40*8b037849SYinan Xu maxAtomic = 8, 41*8b037849SYinan Xu maxTransfer = 64), 42*8b037849SYinan Xu beatBytes = L2BusWidth / 8 43*8b037849SYinan Xu )) 44*8b037849SYinan Xu private val error_xbar = TLXbar() 45*8b037849SYinan Xu 46*8b037849SYinan Xu error_xbar := 47*8b037849SYinan Xu AXI4ToTL() := 48*8b037849SYinan Xu AXI4UserYanker(Some(1)) := 49*8b037849SYinan Xu AXI4Fragmenter() := 50*8b037849SYinan Xu AXI4IdIndexer(1) := 51*8b037849SYinan Xu l3FrontendAXI4Node 52*8b037849SYinan Xu errorDevice.node := error_xbar 53*8b037849SYinan Xu l3_xbar := 54*8b037849SYinan Xu TLBuffer() := 55*8b037849SYinan Xu error_xbar 56*8b037849SYinan Xu 57*8b037849SYinan Xu val dma = InModuleBody { 58*8b037849SYinan Xu l3FrontendAXI4Node.makeIOs() 59*8b037849SYinan Xu } 60*8b037849SYinan Xu} 61*8b037849SYinan Xu 62*8b037849SYinan Xutrait HaveAXI4MemPort { 63*8b037849SYinan Xu this: BaseXSSoc => 64*8b037849SYinan Xu // 40-bit physical address 65*8b037849SYinan Xu val memRange = AddressSet(0x00000000L, 0xffffffffffL).subtract(AddressSet(0x0L, 0x7fffffffL)) 66*8b037849SYinan Xu val memAXI4SlaveNode = AXI4SlaveNode(Seq.tabulate(L3NBanks) { i => 67*8b037849SYinan Xu AXI4SlavePortParameters( 68*8b037849SYinan Xu slaves = Seq( 69*8b037849SYinan Xu AXI4SlaveParameters( 70*8b037849SYinan Xu address = memRange, 71*8b037849SYinan Xu regionType = RegionType.UNCACHED, 72*8b037849SYinan Xu executable = true, 73*8b037849SYinan Xu supportsRead = TransferSizes(1, L3BlockSize), 74*8b037849SYinan Xu supportsWrite = TransferSizes(1, L3BlockSize), 75*8b037849SYinan Xu interleavedId = Some(0) 76*8b037849SYinan Xu ) 77*8b037849SYinan Xu ), 78*8b037849SYinan Xu beatBytes = L3BusWidth / 8 79*8b037849SYinan Xu ) 80*8b037849SYinan Xu }) 81*8b037849SYinan Xu 82*8b037849SYinan Xu memAXI4SlaveNode :=* 83*8b037849SYinan Xu AXI4UserYanker() :=* 84*8b037849SYinan Xu AXI4IdIndexer(12) :=* 85*8b037849SYinan Xu TLToAXI4() :=* 86*8b037849SYinan Xu TLWidthWidget(L3BusWidth / 8) :=* 87*8b037849SYinan Xu TLCacheCork() :=* 88*8b037849SYinan Xu bankedNode 89*8b037849SYinan Xu 90*8b037849SYinan Xu val memory = InModuleBody { 91*8b037849SYinan Xu memAXI4SlaveNode.makeIOs() 92*8b037849SYinan Xu } 93*8b037849SYinan Xu} 94*8b037849SYinan Xu 95*8b037849SYinan Xu 96*8b037849SYinan Xutrait HaveAXI4PeripheralPort { this: BaseXSSoc => 97*8b037849SYinan Xu // on-chip devices: 0x3800_000 - 0x3fff_ffff 98*8b037849SYinan Xu val onChipPeripheralRange = AddressSet(0x38000000L, 0x07ffffffL) 99*8b037849SYinan Xu val peripheralRange = AddressSet(0x0, 0x7fffffff).subtract(onChipPeripheralRange) 100*8b037849SYinan Xu val peripheralNode = AXI4SlaveNode(Seq(AXI4SlavePortParameters( 101*8b037849SYinan Xu Seq(AXI4SlaveParameters( 102*8b037849SYinan Xu address = peripheralRange, 103*8b037849SYinan Xu regionType = RegionType.UNCACHED, 104*8b037849SYinan Xu supportsRead = TransferSizes(1, 8), 105*8b037849SYinan Xu supportsWrite = TransferSizes(1, 8), 106*8b037849SYinan Xu interleavedId = Some(0) 107*8b037849SYinan Xu )), 108*8b037849SYinan Xu beatBytes = 8 109*8b037849SYinan Xu ))) 110*8b037849SYinan Xu 111*8b037849SYinan Xu peripheralNode := 112*8b037849SYinan Xu AXI4UserYanker() := 113*8b037849SYinan Xu AXI4IdIndexer(14) :=* 114*8b037849SYinan Xu TLToAXI4() := 115*8b037849SYinan Xu peripheralXbar 116*8b037849SYinan Xu 117*8b037849SYinan Xu val peripheral = InModuleBody { 118*8b037849SYinan Xu peripheralNode.makeIOs() 119*8b037849SYinan Xu } 120*8b037849SYinan Xu 121*8b037849SYinan Xu} 122*8b037849SYinan Xu 123*8b037849SYinan Xu 124*8b037849SYinan Xuclass XSTop()(implicit p: config.Parameters) extends BaseXSSoc() 125*8b037849SYinan Xu with HaveAXI4MemPort 126*8b037849SYinan Xu with HaveAXI4PeripheralPort 127*8b037849SYinan Xu with HaveSlaveAXI4Port 128*8b037849SYinan Xu { 129*8b037849SYinan Xu 130*8b037849SYinan Xu println(s"FPGASoC cores: $NumCores banks: $L3NBanks block size: $L3BlockSize bus size: $L3BusWidth") 131*8b037849SYinan Xu 132*8b037849SYinan Xu val core = Seq.fill(NumCores)(LazyModule(new XSCore())) 133*8b037849SYinan Xu val l2prefetcher = Seq.fill(NumCores)(LazyModule(new L2Prefetcher())) 134*8b037849SYinan Xu val l2cache = Seq.fill(NumCores)(LazyModule(new InclusiveCache( 135*8b037849SYinan Xu CacheParameters( 136*8b037849SYinan Xu level = 2, 137*8b037849SYinan Xu ways = L2NWays, 138*8b037849SYinan Xu sets = L2NSets, 139*8b037849SYinan Xu blockBytes = L2BlockSize, 140*8b037849SYinan Xu beatBytes = L1BusWidth / 8, // beatBytes = l1BusDataWidth / 8 141*8b037849SYinan Xu cacheName = s"L2" 142*8b037849SYinan Xu ), 143*8b037849SYinan Xu InclusiveCacheMicroParameters( 144*8b037849SYinan Xu writeBytes = 32 145*8b037849SYinan Xu ) 146*8b037849SYinan Xu ))) 147*8b037849SYinan Xu val l2xbar = Seq.fill(NumCores)(TLXbar()) 148*8b037849SYinan Xu 149*8b037849SYinan Xu for (i <- 0 until NumCores) { 150*8b037849SYinan Xu peripheralXbar := TLBuffer() := core(i).frontend.instrUncache.clientNode 151*8b037849SYinan Xu peripheralXbar := TLBuffer() := core(i).memBlock.uncache.clientNode 152*8b037849SYinan Xu l2xbar(i) := TLBuffer() := core(i).memBlock.dcache.clientNode 153*8b037849SYinan Xu l2xbar(i) := TLBuffer() := core(i).l1pluscache.clientNode 154*8b037849SYinan Xu l2xbar(i) := TLBuffer() := core(i).ptw.node 155*8b037849SYinan Xu l2xbar(i) := TLBuffer() := l2prefetcher(i).clientNode 156*8b037849SYinan Xu l2cache(i).node := TLBuffer() := l2xbar(i) 157*8b037849SYinan Xu l3_xbar := TLBuffer() := l2cache(i).node 158*8b037849SYinan Xu } 159*8b037849SYinan Xu 160*8b037849SYinan Xu private val clint = LazyModule(new TLTimer( 161*8b037849SYinan Xu Seq(AddressSet(0x38000000L, 0x0000ffffL)), 162*8b037849SYinan Xu sim = !env.FPGAPlatform 163*8b037849SYinan Xu )) 164*8b037849SYinan Xu clint.node := peripheralXbar 165*8b037849SYinan Xu 166*8b037849SYinan Xu val plic = LazyModule(new AXI4Plic( 167*8b037849SYinan Xu Seq(AddressSet(0x3c000000L, 0x03ffffffL)), 168*8b037849SYinan Xu sim = !env.FPGAPlatform 169*8b037849SYinan Xu )) 170*8b037849SYinan Xu plic.node := AXI4IdentityNode() := AXI4UserYanker() := TLToAXI4() := peripheralXbar 171*8b037849SYinan Xu 172*8b037849SYinan Xu val l3cache = LazyModule(new InclusiveCache( 173*8b037849SYinan Xu CacheParameters( 174*8b037849SYinan Xu level = 3, 175*8b037849SYinan Xu ways = L3NWays, 176*8b037849SYinan Xu sets = L3NSets, 177*8b037849SYinan Xu blockBytes = L3BlockSize, 178*8b037849SYinan Xu beatBytes = L2BusWidth / 8, 179*8b037849SYinan Xu cacheName = "L3" 180*8b037849SYinan Xu ), 181*8b037849SYinan Xu InclusiveCacheMicroParameters( 182*8b037849SYinan Xu writeBytes = 32 183*8b037849SYinan Xu ) 184*8b037849SYinan Xu )).node 185*8b037849SYinan Xu 186*8b037849SYinan Xu bankedNode :*= l3cache :*= TLBuffer() :*= l3_xbar 187*8b037849SYinan Xu 188*8b037849SYinan Xu lazy val module = new LazyModuleImp(this) { 189*8b037849SYinan Xu val io = IO(new Bundle { 190*8b037849SYinan Xu val extIntrs = Input(UInt(NrExtIntr.W)) 191*8b037849SYinan Xu // val meip = Input(Vec(NumCores, Bool())) 192*8b037849SYinan Xu val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 193*8b037849SYinan Xu }) 194*8b037849SYinan Xu 195*8b037849SYinan Xu plic.module.io.extra.get.intrVec <> RegNext(RegNext(io.extIntrs)) 196*8b037849SYinan Xu 197*8b037849SYinan Xu for (i <- 0 until NumCores) { 198*8b037849SYinan Xu core(i).module.io.hartId := i.U 199*8b037849SYinan Xu core(i).module.io.externalInterrupt.mtip := clint.module.io.mtip(i) 200*8b037849SYinan Xu core(i).module.io.externalInterrupt.msip := clint.module.io.msip(i) 201*8b037849SYinan Xu core(i).module.io.externalInterrupt.meip := plic.module.io.extra.get.meip(i) 202*8b037849SYinan Xu l2prefetcher(i).module.io.enable := RegNext(core(i).module.io.l2_pf_enable) 203*8b037849SYinan Xu l2prefetcher(i).module.io.in <> l2cache(i).module.io 204*8b037849SYinan Xu } 205*8b037849SYinan Xu 206*8b037849SYinan Xu dontTouch(io.extIntrs) 207*8b037849SYinan Xu } 208*8b037849SYinan Xu} 209*8b037849SYinan Xu 210*8b037849SYinan Xuobject TopMain extends App { 211*8b037849SYinan Xu override def main(args: Array[String]): Unit = { 212*8b037849SYinan Xu Parameters.set( 213*8b037849SYinan Xu args.contains("--dual-core") match { 214*8b037849SYinan Xu case false => Parameters() 215*8b037849SYinan Xu case true => Parameters.dualCoreParameters 216*8b037849SYinan Xu } 217*8b037849SYinan Xu ) 218*8b037849SYinan Xu val otherArgs = args.filterNot(_ == "--dual-core") 219*8b037849SYinan Xu implicit val p = config.Parameters.empty 220*8b037849SYinan Xu XiangShanStage.execute(otherArgs, Seq( 221*8b037849SYinan Xu ChiselGeneratorAnnotation(() => { 222*8b037849SYinan Xu val soc = LazyModule(new XSTop()) 223*8b037849SYinan Xu soc.module 224*8b037849SYinan Xu }) 225*8b037849SYinan Xu )) 226*8b037849SYinan Xu } 227*8b037849SYinan Xu} 228