1720dd621STang Haojin/*************************************************************************************** 23a520554STang Haojin* Copyright (c) 2024-2025 Beijing Institute of Open Source Chip (BOSC) 33a520554STang Haojin* Copyright (c) 2024-2025 Institute of Computing Technology, Chinese Academy of Sciences 4720dd621STang Haojin* 5720dd621STang Haojin* XiangShan is licensed under Mulan PSL v2. 6720dd621STang Haojin* You can use this software according to the terms and conditions of the Mulan PSL v2. 7720dd621STang Haojin* You may obtain a copy of Mulan PSL v2 at: 8720dd621STang Haojin* http://license.coscl.org.cn/MulanPSL2 9720dd621STang Haojin* 10720dd621STang Haojin* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11720dd621STang Haojin* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12720dd621STang Haojin* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13720dd621STang Haojin* 14720dd621STang Haojin* See the Mulan PSL v2 for more details. 15720dd621STang Haojin***************************************************************************************/ 16720dd621STang Haojin 17720dd621STang Haojinpackage device.standalone 18720dd621STang Haojin 19720dd621STang Haojinimport chisel3._ 202f9ea954STang Haojinimport chisel3.util._ 21720dd621STang Haojinimport freechips.rocketchip.diplomacy._ 22720dd621STang Haojinimport org.chipsalliance.cde.config.Parameters 23aef22314STang Haojinimport freechips.rocketchip.devices.debug.DebugModuleKey 24720dd621STang Haojinimport freechips.rocketchip.devices.tilelink._ 25720dd621STang Haojinimport freechips.rocketchip.interrupts._ 267ff4ebdcSTang Haojinimport freechips.rocketchip.util.AsyncResetSynchronizerShiftReg 27720dd621STang Haojinimport system.SoCParamsKey 28720dd621STang Haojinimport xiangshan.XSCoreParamsKey 29720dd621STang Haojinimport xiangshan.XSTileKey 30720dd621STang Haojinimport device.DebugModule 31*36e010abSGuanghui Chengimport utility.{IntBuffer, RegNextN, ResetGen} 3276ed5703Schengguanghuiimport freechips.rocketchip.tilelink.TLWidthWidget 33720dd621STang Haojin 34720dd621STang Haojinclass StandAloneDebugModule ( 35720dd621STang Haojin useTL: Boolean = false, 36720dd621STang Haojin baseAddress: BigInt, 37720dd621STang Haojin addrWidth: Int, 38720dd621STang Haojin dataWidth: Int = 64, 39720dd621STang Haojin hartNum: Int 40720dd621STang Haojin)(implicit p: Parameters) extends StandAloneDevice( 41720dd621STang Haojin useTL, baseAddress, addrWidth, dataWidth, hartNum 42720dd621STang Haojin) with HasMasterInterface { 43720dd621STang Haojin 444adf8eb8STang Haojin def masterAddrWidth: Int = 48 454adf8eb8STang Haojin 46aef22314STang Haojin def addressSet: AddressSet = p(DebugModuleKey).get.address 47720dd621STang Haojin 48720dd621STang Haojin val debugModule = LazyModule(new DebugModule(hartNum)(p)) 49720dd621STang Haojin debugModule.debug.node := xbar 5076ed5703Schengguanghui debugModule.debug.dmInner.dmInner.sb2tlOpt.foreach(masternode := TLWidthWidget(1) := _.node) 51720dd621STang Haojin // interrupts 52720dd621STang Haojin val debugModuleIntNode = IntSinkNode(IntSinkPortSimple(hartNum, 1)) 532f9ea954STang Haojin debugModuleIntNode :*= IntBuffer() :*= debugModule.debug.dmOuter.dmOuter.intnode 54720dd621STang Haojin val int = InModuleBody(debugModuleIntNode.makeIOs()) 55720dd621STang Haojin 56b6ace320STang Haojin class StandAloneDebugModuleImp(val outer: StandAloneDebugModule)(implicit p: Parameters) extends StandAloneDeviceRawImp(outer) { 57720dd621STang Haojin val io = IO(new outer.debugModule.DebugModuleIO) 5820957846SZihao Yu childClock := io.clock 5930e7906fSHaojin Tang childReset := io.reset.asAsyncReset 60720dd621STang Haojin io <> outer.debugModule.module.io 6130e7906fSHaojin Tang outer.debugModule.module.io.reset := io.reset.asAsyncReset 6230e7906fSHaojin Tang outer.debugModule.module.io.debugIO.reset := io.debugIO.reset.asAsyncReset 63*36e010abSGuanghui Cheng outer.debugModule.module.io.debugIO.systemjtag.foreach( 64*36e010abSGuanghui Cheng _.reset := (withClockAndReset(io.debugIO.systemjtag.get.jtag.TCK, io.debugIO.systemjtag.get.reset.asAsyncReset) { ResetGen() }) 65*36e010abSGuanghui Cheng ) 6620957846SZihao Yu withClockAndReset(io.clock, io.reset.asAsyncReset) { 677ff4ebdcSTang Haojin outer.debugModule.module.io.resetCtrl.hartIsInReset := AsyncResetSynchronizerShiftReg(io.resetCtrl.hartIsInReset, 3, 0) 682f9ea954STang Haojin io.resetCtrl.hartResetReq.foreach(req => 693a3744e4Schengguanghui req := RegNext(outer.debugModule.module.io.resetCtrl.hartResetReq.getOrElse(0.U.asTypeOf(req)), 0.U.asTypeOf(req))) 70720dd621STang Haojin } 71b6ace320STang Haojin } 72720dd621STang Haojin 73720dd621STang Haojin override lazy val module = new StandAloneDebugModuleImp(this) 74720dd621STang Haojin 75720dd621STang Haojin} 76