1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5import CSRConfig._ 6import xiangshan.backend.fu.NewCSR.CSRDefines._ 7import xiangshan.backend.fu.NewCSR.CSRDefines.{ 8 CSRWARLField => WARL, 9 CSRRWField => RW, 10 CSRROField => RO, 11} 12import xiangshan.backend.fu.NewCSR.CSRFunc._ 13 14import scala.collection.immutable.SeqMap 15 16trait DebugLevel { self: NewCSR => 17 val dcsr = Module(new CSRModule("dcsr", new DcsrBundle)) 18 .setAddr(0x7B0) 19 20 val dpc = Module(new CSRModule("dpc", new Dpc)) 21 .setAddr(0x7B1) 22 23 val dscratch0 = Module(new CSRModule("dscratch0")) 24 .setAddr(0x7B2) 25 26 val dscratch1 = Module(new CSRModule("dscratch1")) 27 .setAddr(0x7B3) 28 29 val debugCSRMods = Seq( 30 dcsr, 31 dpc, 32 dscratch0, 33 dscratch1, 34 ) 35 36 val debugCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_ <: CSRBundle], UInt)] = SeqMap.from( 37 debugCSRMods.map(csr => csr.addr -> (csr.w -> csr.rdata.asInstanceOf[CSRBundle].asUInt)).iterator 38 ) 39 40 val debugCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 41 debugCSRMods.map(csr => csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt).iterator 42 ) 43} 44 45class DcsrBundle extends CSRBundle { 46 val DEBUGVER = DcsrDebugVer(31, 28).withReset(DcsrDebugVer.Spec) // Debug implementation as it described in 0.13 draft // todo 47 // All ebreak Privileges are RW, instead of WARL, since XiangShan support U/S/VU/VS. 48 val EBREAKVS = RW( 17).withReset(0.U) 49 val EBREAKVU = RW( 16).withReset(0.U) 50 val EBREAKM = RW( 15).withReset(0.U) 51 val EBREAKS = RW( 13).withReset(0.U) 52 val EBREAKU = RW( 12).withReset(0.U) 53 // STEPIE is RW, instead of WARL, since XiangShan support interrupts being enabled single stepping. 54 val STEPIE = RW( 11).withReset(0.U) 55 val STOPCOUNT = RO( 10).withReset(0.U) // Stop count updating has not been supported 56 val STOPTIME = RO( 9).withReset(0.U) // Stop time updating has not been supported 57 val CAUSE = DcsrCause( 8, 6).withReset(DcsrCause.none) 58 val V = VirtMode( 5).withReset(VirtMode.Off) 59 // MPRVEN is RW, instead of WARL, since XiangShan support use mstatus.mprv in debug mode 60 // Whether use mstatus.mprv 61 val MPRVEN = RW( 4).withReset(0.U) 62 // TODO: support non-maskable interrupt 63 val NMIP = RO( 3).withReset(0.U) 64 // MPRVEN is RW, instead of WARL, since XiangShan support use mstatus.mprv in debug mode 65 val STEP = RW( 2).withReset(0.U) 66 val PRV = PrivMode( 1, 0).withReset(PrivMode.M) 67} 68 69class Dpc extends CSRBundle { 70 val ALL = RW(63, 1) 71} 72 73object DcsrDebugVer extends CSREnum with ROApply { 74 val None = Value(0.U) 75 val Spec = Value(4.U) 76 val Custom = Value(15.U) 77} 78 79object DcsrCause extends CSREnum with ROApply { 80 val none = Value(0.U) 81 val ebreak = Value(1.U) 82 val trigger = Value(2.U) 83 val haltreq = Value(3.U) 84 val step = Value(4.U) 85 val resethaltreq = Value(5.U) 86 val group = Value(6.U) 87} 88