1039cdc35SXuan Hupackage xiangshan.backend.fu.NewCSR 2039cdc35SXuan Hu 3039cdc35SXuan Huimport chisel3._ 40c2ba7aeSXuan Huimport chisel3.util._ 5237d4cfdSXuan Huimport chisel3.experimental.BundleLiterals._ 60c2ba7aeSXuan Huimport org.chipsalliance.cde.config.Parameters 70c2ba7aeSXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, CSRWARLField => WARL, _} 8039cdc35SXuan Huimport xiangshan.backend.fu.NewCSR.CSRFunc._ 901cdded8SXuan Huimport xiangshan.backend.fu.fpu.Bundles.Fflags 1001cdded8SXuan Huimport xiangshan.backend.fu.vector.Bundles.{Vl, Vstart, Vxsat} 118419d406SXuan Huimport xiangshan.frontend.BPUCtrl 12*881e32f5SZifei Zhangimport xiangshan.mem.prefetch.PrefetchCtrl 13760398d7SXuan Huimport chisel3.experimental.noPrefix 14039cdc35SXuan Hu 15039cdc35SXuan Huobject CSRBundles { 16039cdc35SXuan Hu class XtvecBundle extends CSRBundle { 17499d09b3SsinceforYy val mode = XtvecMode(1, 0, wNoFilter).withReset(0.U) 18499d09b3SsinceforYy val addr = WARL(63, 2, wNoFilter).withReset(0.U) 19039cdc35SXuan Hu } 20039cdc35SXuan Hu 21039cdc35SXuan Hu class CauseBundle extends CSRBundle { 22499d09b3SsinceforYy val Interrupt = RW(63).withReset(0.U) 23499d09b3SsinceforYy val ExceptionCode = RW(62, 0).withReset(0.U) 24039cdc35SXuan Hu } 25039cdc35SXuan Hu 26039cdc35SXuan Hu class Counteren extends CSRBundle { 27d25ac328SXuan Hu // Todo: remove reset after adding mcounteren in difftest 28d25ac328SXuan Hu val CY = RW(0).withReset(0.U) 29499d09b3SsinceforYy val TM = RW(1).withReset(0.U) 30499d09b3SsinceforYy val IR = RW(2).withReset(0.U) 31499d09b3SsinceforYy val HPM = RW(31, 3).withReset(0.U) 32039cdc35SXuan Hu } 33039cdc35SXuan Hu 34039cdc35SXuan Hu class OneFieldBundle extends CSRBundle { 35039cdc35SXuan Hu val ALL = RW(63, 0) 36039cdc35SXuan Hu } 37039cdc35SXuan Hu 38499d09b3SsinceforYy class FieldInitBundle extends OneFieldBundle { 39499d09b3SsinceforYy this.ALL.setRW().withReset(0.U) 40499d09b3SsinceforYy } 41499d09b3SsinceforYy 42499d09b3SsinceforYy class XtvalBundle extends FieldInitBundle 43499d09b3SsinceforYy 44499d09b3SsinceforYy class XtinstBundle extends FieldInitBundle 45499d09b3SsinceforYy 460b4c00ffSXuan Hu abstract class EnvCfg extends CSRBundle { 47e9f7c490SXuan Hu // Set all fields not supported as RO in base class 480b4c00ffSXuan Hu val STCE = RO( 63) .withReset(0.U) // Sstc Enable 490b4c00ffSXuan Hu val PBMTE = RO( 62) .withReset(0.U) // Svpbmt Enable 500b4c00ffSXuan Hu val ADUE = RO( 61) .withReset(0.U) // Svadu extension Enable 516808b803SZehao Liu val DTE = RO( 59) .withReset(0.U) // Ssdbltrp extension Enable 52189833a1SHaoyuan Feng val PMM = EnvPMM(33, 32, wNoEffect).withReset(EnvPMM.Disable) // Smnpm extension 53e9f7c490SXuan Hu val CBZE = RW( 7) .withReset(1.U) // Zicboz extension 54e9f7c490SXuan Hu val CBCFE = RW( 6) .withReset(1.U) // Zicbom extension 55e9f7c490SXuan Hu val CBIE = EnvCBIE( 5, 4, wNoEffect).withReset(EnvCBIE.Inval) // Zicbom extension 560b4c00ffSXuan Hu val SSE = RO( 3) .withReset(0.U) // Zicfiss extension Enable in S mode 570b4c00ffSXuan Hu val LPE = RO( 2) .withReset(0.U) // Zicfilp extension 580b4c00ffSXuan Hu val FIOM = RO( 0) .withReset(0.U) // Fence of I/O implies Memory 59039cdc35SXuan Hu } 60237d4cfdSXuan Hu 61760398d7SXuan Hu class PrivState extends Bundle { self => 62237d4cfdSXuan Hu val PRVM = PrivMode(0) 63237d4cfdSXuan Hu val V = VirtMode(0) 64237d4cfdSXuan Hu 65760398d7SXuan Hu def isModeM: Bool = isModeMImpl() 66237d4cfdSXuan Hu 67760398d7SXuan Hu def isModeHS: Bool = isModeHSImpl() 68237d4cfdSXuan Hu 69760398d7SXuan Hu def isModeHU: Bool = isModeHUImpl() 70237d4cfdSXuan Hu 71760398d7SXuan Hu def isModeVU: Bool = isModeVUImpl() 72237d4cfdSXuan Hu 73760398d7SXuan Hu def isModeVS: Bool = isModeVSImpl() 74237d4cfdSXuan Hu 75760398d7SXuan Hu def isModeHUorVU: Bool = this.PrvmIsU() 76237d4cfdSXuan Hu 77260a087dSXuan Hu def isModeHSorHU: Bool = (this.PrvmIsU() || this.PrvmIsS()) && !this.isVirtual 78260a087dSXuan Hu 79760398d7SXuan Hu def isVirtual: Bool = this.V.isOneOf(VirtMode.On) 80dafddbf0SXuan Hu 81760398d7SXuan Hu private[this] object PrvmIsM { 82760398d7SXuan Hu val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.M).suggestName("PrvmIsM")) 83760398d7SXuan Hu def apply(): Bool = v 84760398d7SXuan Hu } 85760398d7SXuan Hu 86760398d7SXuan Hu private[this] object PrvmIsS { 87760398d7SXuan Hu val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.S).suggestName("PrvmIsS")) 88760398d7SXuan Hu def apply(): Bool = v 89760398d7SXuan Hu } 90760398d7SXuan Hu 91760398d7SXuan Hu private[this] object PrvmIsU { 92760398d7SXuan Hu val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.U).suggestName("PrvmIsU")) 93760398d7SXuan Hu def apply(): Bool = v 94760398d7SXuan Hu } 95760398d7SXuan Hu 96760398d7SXuan Hu private[this] object isModeMImpl { 97760398d7SXuan Hu val v: Bool = dontTouch(WireInit(PrvmIsM()).suggestName("isModeM")) 98760398d7SXuan Hu def apply(): Bool = v 99760398d7SXuan Hu } 100760398d7SXuan Hu 101760398d7SXuan Hu private[this] object isModeHSImpl { 102760398d7SXuan Hu val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeHS")) 103760398d7SXuan Hu def apply(): Bool = v 104760398d7SXuan Hu } 105760398d7SXuan Hu 106760398d7SXuan Hu private[this] object isModeHUImpl { 107760398d7SXuan Hu val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeHU")) 108760398d7SXuan Hu def apply(): Bool = v 109760398d7SXuan Hu } 110760398d7SXuan Hu 111760398d7SXuan Hu private[this] object isModeVSImpl { 112760398d7SXuan Hu val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeVS")) 113760398d7SXuan Hu def apply(): Bool = v 114760398d7SXuan Hu } 115760398d7SXuan Hu 116760398d7SXuan Hu private[this] object isModeVUImpl { 117760398d7SXuan Hu val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeVU")) 118760398d7SXuan Hu def apply(): Bool = v 119760398d7SXuan Hu } 120dafddbf0SXuan Hu 121dafddbf0SXuan Hu // VU < VS < HS < M 122dafddbf0SXuan Hu // HU < HS < M 123dafddbf0SXuan Hu def < (that: PrivState): Bool = { 124dafddbf0SXuan Hu (this.isVirtual && (that.isModeM || that.isModeHS)) || 125dafddbf0SXuan Hu (this.V === that.V && this.PRVM < that.PRVM) 126dafddbf0SXuan Hu } 127dafddbf0SXuan Hu 128dafddbf0SXuan Hu def > (that: PrivState): Bool = { 129dafddbf0SXuan Hu (that.isVirtual && (this.isModeM || this.isModeHS)) || 130dafddbf0SXuan Hu (that.V === this.V && that.PRVM < this.PRVM) 131dafddbf0SXuan Hu } 132237d4cfdSXuan Hu } 133237d4cfdSXuan Hu 134237d4cfdSXuan Hu object PrivState { 135237d4cfdSXuan Hu def ModeM: PrivState = WireInit((new PrivState).Lit( 136237d4cfdSXuan Hu _.PRVM -> PrivMode.M, 137237d4cfdSXuan Hu _.V -> VirtMode.Off, 138237d4cfdSXuan Hu )) 139237d4cfdSXuan Hu 140237d4cfdSXuan Hu def ModeHS: PrivState = WireInit((new PrivState).Lit( 141237d4cfdSXuan Hu _.PRVM -> PrivMode.S, 142237d4cfdSXuan Hu _.V -> VirtMode.Off, 143237d4cfdSXuan Hu )) 144237d4cfdSXuan Hu 145237d4cfdSXuan Hu def ModeHU: PrivState = WireInit((new PrivState).Lit( 146237d4cfdSXuan Hu _.PRVM -> PrivMode.U, 147237d4cfdSXuan Hu _.V -> VirtMode.Off, 148237d4cfdSXuan Hu )) 149237d4cfdSXuan Hu 150237d4cfdSXuan Hu def ModeVS: PrivState = WireInit((new PrivState).Lit( 151237d4cfdSXuan Hu _.PRVM -> PrivMode.S, 152237d4cfdSXuan Hu _.V -> VirtMode.On, 153237d4cfdSXuan Hu )) 154237d4cfdSXuan Hu 155237d4cfdSXuan Hu def ModeVU: PrivState = WireInit((new PrivState).Lit( 156237d4cfdSXuan Hu _.PRVM -> PrivMode.U, 157237d4cfdSXuan Hu _.V -> VirtMode.On, 158237d4cfdSXuan Hu )) 159237d4cfdSXuan Hu } 16001cdded8SXuan Hu 16101cdded8SXuan Hu class RobCommitCSR(implicit p: Parameters) extends Bundle { 16201cdded8SXuan Hu // need contain 8x8 16301cdded8SXuan Hu val instNum = ValidIO(UInt(7.W)) 16401cdded8SXuan Hu val fflags = ValidIO(Fflags()) 16501cdded8SXuan Hu val fsDirty = Bool() 16601cdded8SXuan Hu val vxsat = ValidIO(Vxsat()) 16701cdded8SXuan Hu val vsDirty = Bool() 16801cdded8SXuan Hu val vtype = ValidIO(new CSRVTypeBundle) 169d23963a8SXuan Hu val vl = Vl() 17001cdded8SXuan Hu val vstart = ValidIO(Vstart()) 17101cdded8SXuan Hu } 1728419d406SXuan Hu 1738419d406SXuan Hu class CSRCustomState(implicit p: Parameters) extends Bundle { 1748419d406SXuan Hu // Prefetcher 175*881e32f5SZifei Zhang val pf_ctrl = Output(new PrefetchCtrl) 1768419d406SXuan Hu // Load violation predictor 1778419d406SXuan Hu val lvpred_disable = Output(Bool()) 1788419d406SXuan Hu val no_spec_load = Output(Bool()) 1798419d406SXuan Hu val storeset_wait_store = Output(Bool()) 1808419d406SXuan Hu val storeset_no_fast_wakeup = Output(Bool()) 1818419d406SXuan Hu val lvpred_timeout = Output(UInt(5.W)) 1828419d406SXuan Hu // Branch predictor 1838419d406SXuan Hu val bp_ctrl = Output(new BPUCtrl) 1848419d406SXuan Hu // Memory Block 1858419d406SXuan Hu val sbuffer_threshold = Output(UInt(4.W)) 1868419d406SXuan Hu val ldld_vio_check_enable = Output(Bool()) 1878419d406SXuan Hu val soft_prefetch_enable = Output(Bool()) 1888419d406SXuan Hu val cache_error_enable = Output(Bool()) 1898419d406SXuan Hu val uncache_write_outstanding_enable = Output(Bool()) 19041d8d239Shappy-lx val hd_misalign_st_enable = Output(Bool()) 19141d8d239Shappy-lx val hd_misalign_ld_enable = Output(Bool()) 192b7a63495SNewPaulWalker val power_down_enable = Output(Bool()) 193b7a63495SNewPaulWalker val flush_l2_enable = Output(Bool()) 1948419d406SXuan Hu // Rename 1958419d406SXuan Hu val fusion_enable = Output(Bool()) 1968419d406SXuan Hu val wfi_enable = Output(Bool()) 1978419d406SXuan Hu } 198039cdc35SXuan Hu} 199