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()) 37*4e12f40bSzhanglinjuan private val l2top = LazyModule(new L2Top()) 3873be64b3SJiawei Lin 39*4e12f40bSzhanglinjuan // =========== Public Ports ============ 400d32f713Shappy-lx val core_l3_pf_port = core.memBlock.l3_pf_sender_opt 41*4e12f40bSzhanglinjuan val memory_port = l2top.memory_port 42*4e12f40bSzhanglinjuan val uncache = l2top.mmio_port 43*4e12f40bSzhanglinjuan val beu_int_source = l2top.beu.intNode 448a167be7SHaojin Tang val core_reset_sink = BundleBridgeSink(Some(() => Reset())) 45*4e12f40bSzhanglinjuan val clint_int_node = l2top.clint_int_node 46*4e12f40bSzhanglinjuan val plic_int_node = l2top.plic_int_node 47*4e12f40bSzhanglinjuan val debug_int_node = l2top.debug_int_node 48*4e12f40bSzhanglinjuan core.memBlock.clint_int_sink := clint_int_node 49*4e12f40bSzhanglinjuan core.memBlock.plic_int_sink :*= plic_int_node 50*4e12f40bSzhanglinjuan core.memBlock.debug_int_sink := debug_int_node 5173be64b3SJiawei Lin 52*4e12f40bSzhanglinjuan // =========== Components' Connection ============ 53*4e12f40bSzhanglinjuan // L1 to l1_xbar (same as before) 54*4e12f40bSzhanglinjuan coreParams.dcacheParametersOpt.map { _ => 55*4e12f40bSzhanglinjuan l2top.misc_l2_pmu := l2top.l1d_logger := l2top.l1d_l2_bufferOpt.get.node := 56*4e12f40bSzhanglinjuan l2top.l1d_l2_pmu := core.memBlock.dcache.clientNode 5773be64b3SJiawei Lin } 5825cb35b6SJiawei Lin 59*4e12f40bSzhanglinjuan l2top.misc_l2_pmu := l2top.l1i_logger := core.memBlock.frontendBridge.icache_node 60a1c09046Ssfencevma if (!coreParams.softPTW) { 61*4e12f40bSzhanglinjuan l2top.misc_l2_pmu := l2top.ptw_logger := core.memBlock.ptw_to_l2_buffer.node 62a1c09046Ssfencevma } 63*4e12f40bSzhanglinjuan l2top.l1_xbar :=* l2top.misc_l2_pmu 6425cb35b6SJiawei Lin 65*4e12f40bSzhanglinjuan val l2cache = l2top.l2cache 66*4e12f40bSzhanglinjuan // l1_xbar to l2 6773be64b3SJiawei Lin l2cache match { 6873be64b3SJiawei Lin case Some(l2) => 69*4e12f40bSzhanglinjuan l2.node :*= 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 } 7673be64b3SJiawei Lin 77*4e12f40bSzhanglinjuan // mmio 78*4e12f40bSzhanglinjuan l2top.i_mmio_port := core.memBlock.frontendBridge.instr_uncache_node 79*4e12f40bSzhanglinjuan l2top.d_mmio_port := core.memBlock.uncache.clientNode 8073be64b3SJiawei Lin 81*4e12f40bSzhanglinjuan // =========== IO Connection ============ 82935edac4STang Haojin class XSTileImp(wrapper: LazyModule) extends LazyModuleImp(wrapper) { 8373be64b3SJiawei Lin val io = IO(new Bundle { 8473be64b3SJiawei Lin val hartId = Input(UInt(64.W)) 85c4b44470SGuokai Chen val reset_vector = Input(UInt(PAddrBits.W)) 86b6900d94SYinan Xu val cpu_halt = Output(Bool()) 8760ebee38STang Haojin val debugTopDown = new Bundle { 8860ebee38STang Haojin val robHeadPaddr = Valid(UInt(PAddrBits.W)) 8960ebee38STang Haojin val l3MissMatch = Input(Bool()) 9060ebee38STang Haojin } 9173be64b3SJiawei Lin }) 9273be64b3SJiawei Lin 935668a921SJiawei Lin dontTouch(io.hartId) 945668a921SJiawei Lin 95*4e12f40bSzhanglinjuan val core_soft_rst = core_reset_sink.in.head._1 // unused 9634ab1ae9SJiawei Lin 97*4e12f40bSzhanglinjuan l2top.module.hartId.fromTile := io.hartId 98*4e12f40bSzhanglinjuan core.module.io.hartId := l2top.module.hartId.toCore 99*4e12f40bSzhanglinjuan core.module.io.reset_vector := l2top.module.reset_vector.toCore 100*4e12f40bSzhanglinjuan l2top.module.reset_vector.fromTile := io.reset_vector 101*4e12f40bSzhanglinjuan l2top.module.cpu_halt.fromCore := core.module.io.cpu_halt 102*4e12f40bSzhanglinjuan io.cpu_halt := l2top.module.cpu_halt.toTile 103*4e12f40bSzhanglinjuan 104cd365d4cSrvcoresjw if (l2cache.isDefined) { 10515ee59e4Swakafa // TODO: add perfEvents of L2 10615ee59e4Swakafa // core.module.io.perfEvents.zip(l2cache.get.module.io.perfEvents.flatten).foreach(x => x._1.value := x._2) 107935edac4STang Haojin core.module.io.perfEvents <> DontCare 108cd365d4cSrvcoresjw } 109cd365d4cSrvcoresjw else { 110cd365d4cSrvcoresjw core.module.io.perfEvents <> DontCare 111cd365d4cSrvcoresjw } 11273be64b3SJiawei Lin 113*4e12f40bSzhanglinjuan l2top.module.beu_errors.icache <> core.module.io.beu_errors.icache 114*4e12f40bSzhanglinjuan l2top.module.beu_errors.dcache <> core.module.io.beu_errors.dcache 11538005240SJiawei Lin if (l2cache.isDefined) { 11615ee59e4Swakafa // TODO: add ECC interface of L2 117*4e12f40bSzhanglinjuan l2top.module.beu_errors.l2 <> 0.U.asTypeOf(l2top.module.beu_errors.l2) 118*4e12f40bSzhanglinjuan core.module.io.l2_hint.bits.sourceId := l2top.module.l2_hint.bits 119*4e12f40bSzhanglinjuan core.module.io.l2_hint.valid := l2top.module.l2_hint.valid 1200d32f713Shappy-lx core.module.io.l2PfqBusy := false.B 121*4e12f40bSzhanglinjuan core.module.io.debugTopDown.l2MissMatch := l2top.module.debugTopDown.l2MissMatch 122*4e12f40bSzhanglinjuan l2top.module.debugTopDown.robHeadPaddr := core.module.io.debugTopDown.robHeadPaddr 12338005240SJiawei Lin } else { 124*4e12f40bSzhanglinjuan l2top.module.beu_errors.l2 <> 0.U.asTypeOf(l2top.module.beu_errors.l2) 125*4e12f40bSzhanglinjuan core.module.io.l2_hint.bits.sourceId := l2top.module.l2_hint.bits 126*4e12f40bSzhanglinjuan core.module.io.l2_hint.valid := l2top.module.l2_hint.valid 1270d32f713Shappy-lx core.module.io.l2PfqBusy := false.B 12860ebee38STang Haojin core.module.io.debugTopDown.l2MissMatch := false.B 12938005240SJiawei Lin } 13073be64b3SJiawei Lin 13160ebee38STang Haojin io.debugTopDown.robHeadPaddr := core.module.io.debugTopDown.robHeadPaddr 13260ebee38STang Haojin core.module.io.debugTopDown.l3MissMatch := io.debugTopDown.l3MissMatch 13360ebee38STang Haojin 13477bc15a2SYinan Xu // Modules are reset one by one 13577bc15a2SYinan Xu // io_reset ---- 13677bc15a2SYinan Xu // | 13777bc15a2SYinan Xu // v 13877bc15a2SYinan Xu // reset ----> OR_SYNC --> {Misc, L2 Cache, Cores} 139*4e12f40bSzhanglinjuan // val resetChain = Seq( 140*4e12f40bSzhanglinjuan // Seq(l2top.module, core.module) 141*4e12f40bSzhanglinjuan // ) 142*4e12f40bSzhanglinjuan // ResetGen(resetChain, reset, !debugOpts.FPGAPlatform) 14373be64b3SJiawei Lin } 144935edac4STang Haojin 145935edac4STang Haojin lazy val module = new XSTileImp(this) 14673be64b3SJiawei Lin} 147