xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRBundles.scala (revision 881e32f5b63c435bafbaf5dc1d792ffcc9ea103e)
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