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