riscv debug multiple harts
This commit is contained in:
parent
0313f84419
commit
95c656ceef
|
@ -8,6 +8,7 @@ import spinal.lib.generator._
|
||||||
import spinal.lib.{sexport, slave}
|
import spinal.lib.{sexport, slave}
|
||||||
import vexriscv.plugin._
|
import vexriscv.plugin._
|
||||||
import spinal.core.fiber._
|
import spinal.core.fiber._
|
||||||
|
import spinal.lib.cpu.riscv.debug.DebugHartBus
|
||||||
|
|
||||||
object VexRiscvBmbGenerator{
|
object VexRiscvBmbGenerator{
|
||||||
val DEBUG_NONE = 0
|
val DEBUG_NONE = 0
|
||||||
|
@ -15,6 +16,7 @@ object VexRiscvBmbGenerator{
|
||||||
val DEBUG_JTAG_CTRL = 2
|
val DEBUG_JTAG_CTRL = 2
|
||||||
val DEBUG_BUS = 3
|
val DEBUG_BUS = 3
|
||||||
val DEBUG_BMB = 4
|
val DEBUG_BMB = 4
|
||||||
|
val DEBUG_RISCV = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
case class VexRiscvBmbGenerator()(implicit interconnectSmp: BmbInterconnectGenerator = null) extends Area {
|
case class VexRiscvBmbGenerator()(implicit interconnectSmp: BmbInterconnectGenerator = null) extends Area {
|
||||||
|
@ -63,6 +65,12 @@ case class VexRiscvBmbGenerator()(implicit interconnectSmp: BmbInterconnectGener
|
||||||
withDebug.load(DEBUG_BUS)
|
withDebug.load(DEBUG_BUS)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def enableRiscvDebug(debugCd : Handle[ClockDomain], resetCd : ClockDomainResetGenerator) : Unit = debugCd.on{
|
||||||
|
this.debugClockDomain.load(debugCd)
|
||||||
|
debugAskReset.loadNothing()
|
||||||
|
withDebug.load(DEBUG_RISCV)
|
||||||
|
}
|
||||||
|
|
||||||
val debugBmbAccessSource = Handle[BmbAccessCapabilities]
|
val debugBmbAccessSource = Handle[BmbAccessCapabilities]
|
||||||
val debugBmbAccessRequirements = Handle[BmbAccessParameter]
|
val debugBmbAccessRequirements = Handle[BmbAccessParameter]
|
||||||
def enableDebugBmb(debugCd : Handle[ClockDomain], resetCd : ClockDomainResetGenerator, mapping : AddressMapping)(implicit debugMaster : BmbImplicitDebugDecoder = null) : Unit = debugCd.on{
|
def enableDebugBmb(debugCd : Handle[ClockDomain], resetCd : ClockDomainResetGenerator, mapping : AddressMapping)(implicit debugMaster : BmbImplicitDebugDecoder = null) : Unit = debugCd.on{
|
||||||
|
@ -85,11 +93,14 @@ case class VexRiscvBmbGenerator()(implicit interconnectSmp: BmbInterconnectGener
|
||||||
val jtagInstructionCtrl = withDebug.produce(withDebug.get == DEBUG_JTAG_CTRL generate JtagTapInstructionCtrl())
|
val jtagInstructionCtrl = withDebug.produce(withDebug.get == DEBUG_JTAG_CTRL generate JtagTapInstructionCtrl())
|
||||||
val debugBus = withDebug.produce(withDebug.get == DEBUG_BUS generate DebugExtensionBus())
|
val debugBus = withDebug.produce(withDebug.get == DEBUG_BUS generate DebugExtensionBus())
|
||||||
val debugBmb = Handle[Bmb]
|
val debugBmb = Handle[Bmb]
|
||||||
|
val debugRiscv = withDebug.produce(withDebug.get == DEBUG_RISCV generate DebugHartBus())
|
||||||
val jtagClockDomain = Handle[ClockDomain]
|
val jtagClockDomain = Handle[ClockDomain]
|
||||||
|
|
||||||
val logic = Handle(new Area {
|
val logic = Handle(new Area {
|
||||||
withDebug.get != DEBUG_NONE generate new Area {
|
withDebug.get match {
|
||||||
config.add(new DebugPlugin(debugClockDomain, hardwareBreakpointCount))
|
case DEBUG_NONE =>
|
||||||
|
case DEBUG_RISCV =>
|
||||||
|
case _ => config.add(new DebugPlugin(debugClockDomain, hardwareBreakpointCount))
|
||||||
}
|
}
|
||||||
|
|
||||||
val cpu = new VexRiscv(config)
|
val cpu = new VexRiscv(config)
|
||||||
|
@ -126,6 +137,10 @@ case class VexRiscvBmbGenerator()(implicit interconnectSmp: BmbInterconnectGener
|
||||||
timerInterrupt load plugin.timerInterrupt
|
timerInterrupt load plugin.timerInterrupt
|
||||||
softwareInterrupt load plugin.softwareInterrupt
|
softwareInterrupt load plugin.softwareInterrupt
|
||||||
if (plugin.config.supervisorGen) externalSupervisorInterrupt load plugin.externalInterruptS
|
if (plugin.config.supervisorGen) externalSupervisorInterrupt load plugin.externalInterruptS
|
||||||
|
withDebug.get match {
|
||||||
|
case DEBUG_RISCV => debugRiscv <> plugin.debugBus
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case plugin: DebugPlugin => plugin.debugClockDomain {
|
case plugin: DebugPlugin => plugin.debugClockDomain {
|
||||||
if(debugAskReset.get != null) when(RegNext(plugin.io.resetOut)) {
|
if(debugAskReset.get != null) when(RegNext(plugin.io.resetOut)) {
|
||||||
|
|
|
@ -805,7 +805,7 @@ class CsrPlugin(val config: CsrPluginConfig) extends Plugin[VexRiscv] with Excep
|
||||||
}
|
}
|
||||||
|
|
||||||
val wakeService = serviceElse(classOf[IWake], null)
|
val wakeService = serviceElse(classOf[IWake], null)
|
||||||
if(wakeService != null) when(debugMode || step){
|
if(wakeService != null) when(debugMode || step || bus.haltReq){
|
||||||
wakeService.askWake()
|
wakeService.askWake()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue