xref: /XiangShan/src/main/scala/device/standalone/StandAloneDebugModule.scala (revision 36e010ab9b22ed84a4a1d011eace71cb421e3450)
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