1d2b20d1aSTang Haojin/*************************************************************************************** 2d2b20d1aSTang Haojin* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3d2b20d1aSTang Haojin* Copyright (c) 2020-2021 Peng Cheng Laboratory 4d2b20d1aSTang Haojin* 5d2b20d1aSTang Haojin* XiangShan is licensed under Mulan PSL v2. 6d2b20d1aSTang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7d2b20d1aSTang Haojin* You may obtain a copy of Mulan PSL v2 at: 8d2b20d1aSTang Haojin* http://license.coscl.org.cn/MulanPSL2 9d2b20d1aSTang Haojin* 10d2b20d1aSTang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11d2b20d1aSTang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12d2b20d1aSTang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13d2b20d1aSTang Haojin* 14d2b20d1aSTang Haojin* See the Mulan PSL v2 for more details. 15d2b20d1aSTang Haojin***************************************************************************************/ 16d2b20d1aSTang Haojin 1773be64b3SJiawei Linpackage xiangshan 1873be64b3SJiawei Lin 1973be64b3SJiawei Linimport chisel3._ 208891a219SYinan Xuimport org.chipsalliance.cde.config.{Config, Parameters} 2173be64b3SJiawei Linimport chisel3.util.{Valid, ValidIO} 224a2390a4SJiawei Linimport freechips.rocketchip.diplomacy._ 234a2390a4SJiawei Linimport freechips.rocketchip.interrupts._ 2473be64b3SJiawei Linimport freechips.rocketchip.tile.{BusErrorUnit, BusErrorUnitParams, BusErrors} 254a2390a4SJiawei Linimport freechips.rocketchip.tilelink._ 2615ee59e4Swakafaimport coupledL2.{L2ParamKey, CoupledL2} 2773be64b3SJiawei Linimport system.HasSoCParameter 2873be64b3SJiawei Linimport top.BusPerfMonitor 2962129679Swakafaimport utility.{DelayN, ResetGen, TLClientsMerger, TLEdgeBuffer, TLLogger} 3073be64b3SJiawei Lin 3173be64b3SJiawei Linclass XSTile()(implicit p: Parameters) extends LazyModule 3273be64b3SJiawei Lin with HasXSParameter 3373be64b3SJiawei Lin with HasSoCParameter 3473be64b3SJiawei Lin{ 3595e60e55STang Haojin override def shouldBeInlined: Boolean = false 3673be64b3SJiawei Lin private val core = LazyModule(new XSCore()) 374e12f40bSzhanglinjuan private val l2top = LazyModule(new L2Top()) 3873be64b3SJiawei Lin 394e12f40bSzhanglinjuan // =========== Public Ports ============ 400d32f713Shappy-lx val core_l3_pf_port = core.memBlock.l3_pf_sender_opt 414e12f40bSzhanglinjuan val memory_port = l2top.memory_port 424e12f40bSzhanglinjuan val uncache = l2top.mmio_port 434e12f40bSzhanglinjuan val beu_int_source = l2top.beu.intNode 448a167be7SHaojin Tang val core_reset_sink = BundleBridgeSink(Some(() => Reset())) 454e12f40bSzhanglinjuan val clint_int_node = l2top.clint_int_node 464e12f40bSzhanglinjuan val plic_int_node = l2top.plic_int_node 474e12f40bSzhanglinjuan val debug_int_node = l2top.debug_int_node 484e12f40bSzhanglinjuan core.memBlock.clint_int_sink := clint_int_node 494e12f40bSzhanglinjuan core.memBlock.plic_int_sink :*= plic_int_node 504e12f40bSzhanglinjuan core.memBlock.debug_int_sink := debug_int_node 5173be64b3SJiawei Lin 524e12f40bSzhanglinjuan // =========== Components' Connection ============ 53c20095f4SChen Xi // L1 to l1_xbar 544e12f40bSzhanglinjuan coreParams.dcacheParametersOpt.map { _ => 55c20095f4SChen Xi l2top.misc_l2_pmu := l2top.l1d_logger := core.memBlock.dcache_port := 56c20095f4SChen Xi core.memBlock.l1d_to_l2_buffer.node := core.memBlock.dcache.clientNode 5773be64b3SJiawei Lin } 5825cb35b6SJiawei Lin 5963cac807SChen Xi l2top.misc_l2_pmu := l2top.l1i_logger := core.memBlock.frontendBridge.icache_node 60a1c09046Ssfencevma if (!coreParams.softPTW) { 61c20095f4SChen Xi l2top.misc_l2_pmu := l2top.ptw_logger := l2top.ptw_to_l2_buffer.node := core.memBlock.ptw_to_l2_buffer.node 62a1c09046Ssfencevma } 634e12f40bSzhanglinjuan l2top.l1_xbar :=* l2top.misc_l2_pmu 6425cb35b6SJiawei Lin 654e12f40bSzhanglinjuan val l2cache = l2top.l2cache 664e12f40bSzhanglinjuan // l1_xbar to l2 6773be64b3SJiawei Lin l2cache match { 6873be64b3SJiawei Lin case Some(l2) => 69c20095f4SChen Xi l2.node :*= l2top.xbar_l2_buffer :*= l2top.l1_xbar 70c65495a4SLinJiawei l2.pf_recv_node.map(recv => { 71c65495a4SLinJiawei println("Connecting L1 prefetcher to L2!") 720d32f713Shappy-lx recv := core.memBlock.l2_pf_sender_opt.get 73c65495a4SLinJiawei }) 7473be64b3SJiawei Lin case None => 7573be64b3SJiawei Lin } 769672f0b7Swakafa 779672f0b7Swakafa val core_l3_tpmeta_source_port = l2cache match { 789672f0b7Swakafa case Some(l2) => l2.tpmeta_source_node 799672f0b7Swakafa case None => None 809672f0b7Swakafa } 819672f0b7Swakafa val core_l3_tpmeta_sink_port = l2cache match { 829672f0b7Swakafa case Some(l2) => l2.tpmeta_sink_node 839672f0b7Swakafa case None => None 849672f0b7Swakafa } 8573be64b3SJiawei Lin 864e12f40bSzhanglinjuan // mmio 87c20095f4SChen Xi l2top.i_mmio_port := l2top.i_mmio_buffer.node := core.memBlock.frontendBridge.instr_uncache_node 884e12f40bSzhanglinjuan l2top.d_mmio_port := core.memBlock.uncache.clientNode 8973be64b3SJiawei Lin 904e12f40bSzhanglinjuan // =========== IO Connection ============ 91935edac4STang Haojin class XSTileImp(wrapper: LazyModule) extends LazyModuleImp(wrapper) { 9273be64b3SJiawei Lin val io = IO(new Bundle { 9373be64b3SJiawei Lin val hartId = Input(UInt(64.W)) 94c4b44470SGuokai Chen val reset_vector = Input(UInt(PAddrBits.W)) 95b6900d94SYinan Xu val cpu_halt = Output(Bool()) 9660ebee38STang Haojin val debugTopDown = new Bundle { 9760ebee38STang Haojin val robHeadPaddr = Valid(UInt(PAddrBits.W)) 9860ebee38STang Haojin val l3MissMatch = Input(Bool()) 9960ebee38STang Haojin } 10073be64b3SJiawei Lin }) 10173be64b3SJiawei Lin 1025668a921SJiawei Lin dontTouch(io.hartId) 1035668a921SJiawei Lin 1044e12f40bSzhanglinjuan val core_soft_rst = core_reset_sink.in.head._1 // unused 10534ab1ae9SJiawei Lin 1064e12f40bSzhanglinjuan l2top.module.hartId.fromTile := io.hartId 1074e12f40bSzhanglinjuan core.module.io.hartId := l2top.module.hartId.toCore 1084e12f40bSzhanglinjuan core.module.io.reset_vector := l2top.module.reset_vector.toCore 1094e12f40bSzhanglinjuan l2top.module.reset_vector.fromTile := io.reset_vector 1104e12f40bSzhanglinjuan l2top.module.cpu_halt.fromCore := core.module.io.cpu_halt 1114e12f40bSzhanglinjuan io.cpu_halt := l2top.module.cpu_halt.toTile 1124e12f40bSzhanglinjuan 113cd365d4cSrvcoresjw if (l2cache.isDefined) { 11415ee59e4Swakafa // TODO: add perfEvents of L2 11515ee59e4Swakafa // core.module.io.perfEvents.zip(l2cache.get.module.io.perfEvents.flatten).foreach(x => x._1.value := x._2) 116935edac4STang Haojin core.module.io.perfEvents <> DontCare 117cd365d4cSrvcoresjw } 118cd365d4cSrvcoresjw else { 119cd365d4cSrvcoresjw core.module.io.perfEvents <> DontCare 120cd365d4cSrvcoresjw } 12173be64b3SJiawei Lin 1224e12f40bSzhanglinjuan l2top.module.beu_errors.icache <> core.module.io.beu_errors.icache 1234e12f40bSzhanglinjuan l2top.module.beu_errors.dcache <> core.module.io.beu_errors.dcache 12438005240SJiawei Lin if (l2cache.isDefined) { 12515ee59e4Swakafa // TODO: add ECC interface of L2 126*d2945707SHuijin Li 1274e12f40bSzhanglinjuan l2top.module.beu_errors.l2 <> 0.U.asTypeOf(l2top.module.beu_errors.l2) 128*d2945707SHuijin Li core.module.io.l2_hint.bits.sourceId := l2top.module.l2_hint.bits.sourceId 129*d2945707SHuijin Li core.module.io.l2_hint.bits.isKeyword := l2top.module.l2_hint.bits.isKeyword 1304e12f40bSzhanglinjuan core.module.io.l2_hint.valid := l2top.module.l2_hint.valid 131*d2945707SHuijin Li 1320d32f713Shappy-lx core.module.io.l2PfqBusy := false.B 1334e12f40bSzhanglinjuan core.module.io.debugTopDown.l2MissMatch := l2top.module.debugTopDown.l2MissMatch 1344e12f40bSzhanglinjuan l2top.module.debugTopDown.robHeadPaddr := core.module.io.debugTopDown.robHeadPaddr 13538005240SJiawei Lin } else { 136*d2945707SHuijin Li 1374e12f40bSzhanglinjuan l2top.module.beu_errors.l2 <> 0.U.asTypeOf(l2top.module.beu_errors.l2) 138*d2945707SHuijin Li core.module.io.l2_hint.bits.sourceId := l2top.module.l2_hint.bits.sourceId 139*d2945707SHuijin Li core.module.io.l2_hint.bits.isKeyword := l2top.module.l2_hint.bits.isKeyword 1404e12f40bSzhanglinjuan core.module.io.l2_hint.valid := l2top.module.l2_hint.valid 141*d2945707SHuijin Li 1420d32f713Shappy-lx core.module.io.l2PfqBusy := false.B 14360ebee38STang Haojin core.module.io.debugTopDown.l2MissMatch := false.B 14438005240SJiawei Lin } 14573be64b3SJiawei Lin 14660ebee38STang Haojin io.debugTopDown.robHeadPaddr := core.module.io.debugTopDown.robHeadPaddr 14760ebee38STang Haojin core.module.io.debugTopDown.l3MissMatch := io.debugTopDown.l3MissMatch 14860ebee38STang Haojin 14977bc15a2SYinan Xu // Modules are reset one by one 15077bc15a2SYinan Xu // io_reset ---- 15177bc15a2SYinan Xu // | 15277bc15a2SYinan Xu // v 15377bc15a2SYinan Xu // reset ----> OR_SYNC --> {Misc, L2 Cache, Cores} 1544e12f40bSzhanglinjuan // val resetChain = Seq( 1554e12f40bSzhanglinjuan // Seq(l2top.module, core.module) 1564e12f40bSzhanglinjuan // ) 1574e12f40bSzhanglinjuan // ResetGen(resetChain, reset, !debugOpts.FPGAPlatform) 15873be64b3SJiawei Lin } 159935edac4STang Haojin 160935edac4STang Haojin lazy val module = new XSTileImp(this) 16173be64b3SJiawei Lin} 162