1*8537b88aSTang Haojin/*************************************************************************************** 2*8537b88aSTang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3*8537b88aSTang Haojin* Copyright (c) 2024 Institute of Computing Technology, Chinese Academy of Sciences 4*8537b88aSTang Haojin* 5*8537b88aSTang Haojin* XiangShan is licensed under Mulan PSL v2. 6*8537b88aSTang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*8537b88aSTang Haojin* You may obtain a copy of Mulan PSL v2 at: 8*8537b88aSTang Haojin* http://license.coscl.org.cn/MulanPSL2 9*8537b88aSTang Haojin* 10*8537b88aSTang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*8537b88aSTang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*8537b88aSTang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*8537b88aSTang Haojin* 14*8537b88aSTang Haojin* See the Mulan PSL v2 for more details. 15*8537b88aSTang Haojin***************************************************************************************/ 16*8537b88aSTang Haojin 17*8537b88aSTang Haojinpackage xiangshan 18*8537b88aSTang Haojin 19*8537b88aSTang Haojinimport chisel3._ 20*8537b88aSTang Haojinimport chisel3.util._ 21*8537b88aSTang Haojinimport org.chipsalliance.cde.config._ 22*8537b88aSTang Haojinimport freechips.rocketchip.diplomacy._ 23*8537b88aSTang Haojinimport freechips.rocketchip.interrupts._ 24*8537b88aSTang Haojinimport freechips.rocketchip.util._ 25*8537b88aSTang Haojinimport system.HasSoCParameter 26*8537b88aSTang Haojinimport device.{IMSICAsync, MsiInfoBundle} 27*8537b88aSTang Haojinimport coupledL2.tl2chi.{PortIO, AsyncPortIO, CHIAsyncBridgeSource} 28*8537b88aSTang Haojinimport utility.IntBuffer 29*8537b88aSTang Haojin 30*8537b88aSTang Haojin// This module is used for XSNoCTop for async time domain and divide different 31*8537b88aSTang Haojin// voltage domain. Everything in this module should be in the core clock domain 32*8537b88aSTang Haojin// and higher voltage domain. 33*8537b88aSTang Haojinclass XSTileWrap()(implicit p: Parameters) extends LazyModule 34*8537b88aSTang Haojin with HasXSParameter 35*8537b88aSTang Haojin with HasSoCParameter 36*8537b88aSTang Haojin{ 37*8537b88aSTang Haojin override def shouldBeInlined: Boolean = false 38*8537b88aSTang Haojin 39*8537b88aSTang Haojin val tile = LazyModule(new XSTile()) 40*8537b88aSTang Haojin 41*8537b88aSTang Haojin // interrupts sync 42*8537b88aSTang Haojin val clintIntNode = IntIdentityNode() 43*8537b88aSTang Haojin val debugIntNode = IntIdentityNode() 44*8537b88aSTang Haojin val plicIntNode = IntIdentityNode() 45*8537b88aSTang Haojin tile.clint_int_node := IntBuffer(2) := clintIntNode 46*8537b88aSTang Haojin tile.debug_int_node := IntBuffer(2) := debugIntNode 47*8537b88aSTang Haojin tile.plic_int_node :*= IntBuffer(2) :*= plicIntNode 48*8537b88aSTang Haojin class XSTileWrapImp(wrapper: LazyModule) extends LazyModuleImp(wrapper) { 49*8537b88aSTang Haojin val chiAsyncBridgeParams = soc.CHIAsyncBridge 50*8537b88aSTang Haojin 51*8537b88aSTang Haojin val io = IO(new Bundle { 52*8537b88aSTang Haojin val hartId = Input(UInt(hartIdLen.W)) 53*8537b88aSTang Haojin val msiInfo = Input(ValidIO(new MsiInfoBundle)) 54*8537b88aSTang Haojin val reset_vector = Input(UInt(PAddrBits.W)) 55*8537b88aSTang Haojin val cpu_halt = Output(Bool()) 56*8537b88aSTang Haojin val debugTopDown = new Bundle { 57*8537b88aSTang Haojin val robHeadPaddr = Valid(UInt(PAddrBits.W)) 58*8537b88aSTang Haojin val l3MissMatch = Input(Bool()) 59*8537b88aSTang Haojin } 60*8537b88aSTang Haojin val chi = if (enableCHI) Some(new AsyncPortIO(chiAsyncBridgeParams)) else None 61*8537b88aSTang Haojin val nodeID = if (enableCHI) Some(Input(UInt(NodeIDWidth.W))) else None 62*8537b88aSTang Haojin val clintTimeAsync = Flipped(new AsyncBundle(UInt(64.W), AsyncQueueParams(1))) 63*8537b88aSTang Haojin }) 64*8537b88aSTang Haojin 65*8537b88aSTang Haojin val imsicAsync = Module(new IMSICAsync()) 66*8537b88aSTang Haojin imsicAsync.i.msiInfo := io.msiInfo 67*8537b88aSTang Haojin 68*8537b88aSTang Haojin tile.module.io.hartId := io.hartId 69*8537b88aSTang Haojin tile.module.io.msiInfo := imsicAsync.o.msiInfo 70*8537b88aSTang Haojin tile.module.io.reset_vector := io.reset_vector 71*8537b88aSTang Haojin io.cpu_halt := tile.module.io.cpu_halt 72*8537b88aSTang Haojin io.debugTopDown <> tile.module.io.debugTopDown 73*8537b88aSTang Haojin tile.module.io.nodeID.foreach(_ := io.nodeID.get) 74*8537b88aSTang Haojin 75*8537b88aSTang Haojin // CLINT Async Queue Sink 76*8537b88aSTang Haojin val clintTimeAsyncQueueSink = Module(new AsyncQueueSink(UInt(64.W), AsyncQueueParams(1))) 77*8537b88aSTang Haojin clintTimeAsyncQueueSink.io.async <> io.clintTimeAsync 78*8537b88aSTang Haojin clintTimeAsyncQueueSink.io.deq.ready := true.B 79*8537b88aSTang Haojin tile.module.io.clintTime.valid := clintTimeAsyncQueueSink.io.deq.valid 80*8537b88aSTang Haojin tile.module.io.clintTime.bits := clintTimeAsyncQueueSink.io.deq.bits 81*8537b88aSTang Haojin 82*8537b88aSTang Haojin // CHI Async Queue Source 83*8537b88aSTang Haojin if (enableCHI) { 84*8537b88aSTang Haojin val chiAsyncBridgeSource = Module(new CHIAsyncBridgeSource(chiAsyncBridgeParams)) 85*8537b88aSTang Haojin chiAsyncBridgeSource.io.enq <> tile.module.io.chi.get 86*8537b88aSTang Haojin io.chi.get <> chiAsyncBridgeSource.io.async 87*8537b88aSTang Haojin } 88*8537b88aSTang Haojin 89*8537b88aSTang Haojin dontTouch(io.hartId) 90*8537b88aSTang Haojin dontTouch(io.msiInfo) 91*8537b88aSTang Haojin } 92*8537b88aSTang Haojin lazy val module = new XSTileWrapImp(this) 93*8537b88aSTang Haojin} 94