1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5import chisel3.experimental.BundleLiterals._ 6import org.chipsalliance.cde.config.Parameters 7import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, CSRWARLField => WARL, _} 8import xiangshan.backend.fu.NewCSR.CSRFunc._ 9import xiangshan.backend.fu.fpu.Bundles.Fflags 10import xiangshan.backend.fu.vector.Bundles.{Vl, Vstart, Vxsat} 11import xiangshan.frontend.BPUCtrl 12import chisel3.experimental.noPrefix 13 14object CSRBundles { 15 class XtvecBundle extends CSRBundle { 16 val mode = XtvecMode(1, 0, wNoFilter) 17 val addr = WARL(63, 2, wNoFilter) 18 } 19 20 class CauseBundle extends CSRBundle { 21 val Interrupt = RW(63) 22 val ExceptionCode = RW(62, 0) 23 } 24 25 class Counteren extends CSRBundle { 26 val CY = RW(0) 27 val TM = RW(1) 28 val IR = RW(2) 29 val HPM = RW(31, 3) 30 } 31 32 class OneFieldBundle extends CSRBundle { 33 val ALL = RW(63, 0) 34 } 35 36 class Envcfg extends CSRBundle { 37 val STCE = RO( 63).withReset(0.U) 38 val PBMTE = RO( 62).withReset(0.U) 39 val ADUE = RO( 61).withReset(0.U) 40 val PMM = RO(33, 32).withReset(0.U) 41 val CBZE = RO( 7).withReset(0.U) 42 val CBCFE = RO( 6).withReset(0.U) 43 val CBIE = RO( 5, 4).withReset(0.U) 44 val FIOM = RO( 0).withReset(0.U) 45 } 46 47 class PrivState extends Bundle { self => 48 val PRVM = PrivMode(0) 49 val V = VirtMode(0) 50 51 def isModeM: Bool = isModeMImpl() 52 53 def isModeHS: Bool = isModeHSImpl() 54 55 def isModeHU: Bool = isModeHUImpl() 56 57 def isModeVU: Bool = isModeVUImpl() 58 59 def isModeVS: Bool = isModeVSImpl() 60 61 def isModeHUorVU: Bool = this.PrvmIsU() 62 63 def isVirtual: Bool = this.V.isOneOf(VirtMode.On) 64 65 private[this] object PrvmIsM { 66 val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.M).suggestName("PrvmIsM")) 67 def apply(): Bool = v 68 } 69 70 private[this] object PrvmIsS { 71 val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.S).suggestName("PrvmIsS")) 72 def apply(): Bool = v 73 } 74 75 private[this] object PrvmIsU { 76 val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.U).suggestName("PrvmIsU")) 77 def apply(): Bool = v 78 } 79 80 private[this] object isModeMImpl { 81 val v: Bool = dontTouch(WireInit(PrvmIsM()).suggestName("isModeM")) 82 def apply(): Bool = v 83 } 84 85 private[this] object isModeHSImpl { 86 val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeHS")) 87 def apply(): Bool = v 88 } 89 90 private[this] object isModeHUImpl { 91 val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeHU")) 92 def apply(): Bool = v 93 } 94 95 private[this] object isModeVSImpl { 96 val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeVS")) 97 def apply(): Bool = v 98 } 99 100 private[this] object isModeVUImpl { 101 val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeVU")) 102 def apply(): Bool = v 103 } 104 105 // VU < VS < HS < M 106 // HU < HS < M 107 def < (that: PrivState): Bool = { 108 (this.isVirtual && (that.isModeM || that.isModeHS)) || 109 (this.V === that.V && this.PRVM < that.PRVM) 110 } 111 112 def > (that: PrivState): Bool = { 113 (that.isVirtual && (this.isModeM || this.isModeHS)) || 114 (that.V === this.V && that.PRVM < this.PRVM) 115 } 116 } 117 118 object PrivState { 119 def ModeM: PrivState = WireInit((new PrivState).Lit( 120 _.PRVM -> PrivMode.M, 121 _.V -> VirtMode.Off, 122 )) 123 124 def ModeHS: PrivState = WireInit((new PrivState).Lit( 125 _.PRVM -> PrivMode.S, 126 _.V -> VirtMode.Off, 127 )) 128 129 def ModeHU: PrivState = WireInit((new PrivState).Lit( 130 _.PRVM -> PrivMode.U, 131 _.V -> VirtMode.Off, 132 )) 133 134 def ModeVS: PrivState = WireInit((new PrivState).Lit( 135 _.PRVM -> PrivMode.S, 136 _.V -> VirtMode.On, 137 )) 138 139 def ModeVU: PrivState = WireInit((new PrivState).Lit( 140 _.PRVM -> PrivMode.U, 141 _.V -> VirtMode.On, 142 )) 143 } 144 145 class RobCommitCSR(implicit p: Parameters) extends Bundle { 146 // need contain 8x8 147 val instNum = ValidIO(UInt(7.W)) 148 val fflags = ValidIO(Fflags()) 149 val fsDirty = Bool() 150 val vxsat = ValidIO(Vxsat()) 151 val vsDirty = Bool() 152 val vtype = ValidIO(new CSRVTypeBundle) 153 val vl = ValidIO(Vl()) 154 val vstart = ValidIO(Vstart()) 155 } 156 157 class CSRCustomState(implicit p: Parameters) extends Bundle { 158 // Prefetcher 159 val l1I_pf_enable = Output(Bool()) 160 val l2_pf_enable = Output(Bool()) 161 val l1D_pf_enable = Output(Bool()) 162 val l1D_pf_train_on_hit = Output(Bool()) 163 val l1D_pf_enable_agt = Output(Bool()) 164 val l1D_pf_enable_pht = Output(Bool()) 165 val l1D_pf_active_threshold = Output(UInt(4.W)) 166 val l1D_pf_active_stride = Output(UInt(6.W)) 167 val l1D_pf_enable_stride = Output(Bool()) 168 val l2_pf_store_only = Output(Bool()) 169 // ICache 170 val icache_parity_enable = Output(Bool()) 171 // Labeled XiangShan 172 val dsid = Output(UInt(8.W)) // TODO: DsidWidth as parameter 173 // Load violation predictor 174 val lvpred_disable = Output(Bool()) 175 val no_spec_load = Output(Bool()) 176 val storeset_wait_store = Output(Bool()) 177 val storeset_no_fast_wakeup = Output(Bool()) 178 val lvpred_timeout = Output(UInt(5.W)) 179 // Branch predictor 180 val bp_ctrl = Output(new BPUCtrl) 181 // Memory Block 182 val sbuffer_threshold = Output(UInt(4.W)) 183 val ldld_vio_check_enable = Output(Bool()) 184 val soft_prefetch_enable = Output(Bool()) 185 val cache_error_enable = Output(Bool()) 186 val uncache_write_outstanding_enable = Output(Bool()) 187 // Rename 188 val fusion_enable = Output(Bool()) 189 val wfi_enable = Output(Bool()) 190 // Decode 191 val svinval_enable = Output(Bool()) 192 } 193} 194