xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/Unprivileged.scala (revision 65ddf865dd67a3cde75cd6c59e584bcd119a1288)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.util._
5import freechips.rocketchip.rocket.CSRs
6import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, CSRWARLField => WARL}
7import xiangshan.backend.fu.NewCSR.CSRFunc._
8import xiangshan.backend.fu.vector.Bundles._
9import xiangshan.backend.fu.NewCSR.CSRConfig._
10import xiangshan.backend.fu.fpu.Bundles.{Fflags, Frm}
11import xiangshan.backend.fu.NewCSR.CSREnumTypeImplicitCast._
12
13import scala.collection.immutable.SeqMap
14
15trait Unprivileged { self: NewCSR with MachineLevel with SupervisorLevel =>
16
17  val fcsr = Module(new CSRModule("Fcsr", new CSRBundle {
18    val NX = WARL(0, wNoFilter)
19    val UF = WARL(1, wNoFilter)
20    val OF = WARL(2, wNoFilter)
21    val DZ = WARL(3, wNoFilter)
22    val NV = WARL(4, wNoFilter)
23    val FRM = WARL(7, 5, wNoFilter)
24  }) with HasRobCommitBundle {
25    val wAliasFflags = IO(Input(new CSRAddrWriteBundle(new CSRFFlagsBundle)))
26    val wAliasFfm = IO(Input(new CSRAddrWriteBundle(new CSRFrmBundle)))
27    val fflags = IO(Output(Fflags()))
28    val frm = IO(Output(Frm()))
29
30    // write connection
31    this.wfn(reg)(Seq(wAliasFflags, wAliasFfm))
32
33    when (robCommit.fflags.valid) {
34      reg.NX := robCommit.fflags.bits(0) || reg.NX
35      reg.UF := robCommit.fflags.bits(1) || reg.UF
36      reg.OF := robCommit.fflags.bits(2) || reg.OF
37      reg.DZ := robCommit.fflags.bits(3) || reg.DZ
38      reg.NV := robCommit.fflags.bits(4) || reg.NV
39    }
40
41    // read connection
42    fflags := reg.asUInt(4, 0)
43    frm := reg.FRM.asUInt
44  }).setAddr(0x003)
45
46  // vec
47  val vstart = Module(new CSRModule("Vstart", new CSRBundle {
48    val vstart = RW(VlWidth - 2, 0) // hold [0, 128)
49  }) with HasRobCommitBundle {
50    // Todo make The use of vstart values greater than the largest element index for the current SEW setting is reserved.
51    // Not trap
52    when (wen && this.w.wdata < VLEN.U) {
53      reg.vstart := this.w.wdata(VlWidth - 2, 0)
54    }.elsewhen (robCommit.vstart.valid) {
55      reg.vstart := robCommit.vstart.bits
56    }
57  })
58    .setAddr(0x008)
59
60  val vcsr = Module(new CSRModule("Vcsr", new CSRBundle {
61    val VXSAT = RW(   0)
62    val VXRM  = RW(2, 1)
63  }) with HasRobCommitBundle {
64    val wAliasVxsat = IO(Input(new CSRAddrWriteBundle(new CSRBundle {
65      val VXSAT = RW(0)
66    })))
67    val wAlisaVxrm = IO(Input(new CSRAddrWriteBundle(new CSRBundle {
68      val VXRM = RW(1, 0)
69    })))
70    val vxsat = IO(Output(Vxsat()))
71    val vxrm  = IO(Output(Vxrm()))
72
73    // write connection
74    this.wfn(reg)(Seq(wAliasVxsat, wAlisaVxrm))
75
76    when(robCommit.vxsat.valid) {
77      reg.VXSAT := reg.VXSAT.asBool || robCommit.vxsat.bits.asBool
78    }
79
80    // read connection
81    vxsat := reg.VXSAT.asUInt
82    vxrm  := reg.VXRM.asUInt
83  }).setAddr(0x00F)
84
85  val vl = Module(new CSRModule("Vl", new CSRBundle {
86    val VL = RO(VlWidth - 1, 0)
87  }) with HasRobCommitBundle {
88    when (robCommit.vl.valid) {
89      reg.VL := robCommit.vl.bits
90    }
91  })
92    .setAddr(0xC20)
93
94  val vtype = Module(new CSRModule("Vtype", new CSRVTypeBundle) with HasRobCommitBundle {
95    when(robCommit.vtype.valid) {
96      reg := robCommit.vtype.bits
97    }
98  })
99    .setAddr(0xC21)
100
101  val vlenb = Module(new CSRModule("Vlenb", new CSRBundle {
102    val VLENB = VlenbField(63, 0).withReset(VlenbField.init)
103  }))
104    .setAddr(0xC22)
105
106  val cycle = Module(new CSRModule("cycle", new CSRBundle {
107    val cycle = RO(63, 0)
108  }) with HasMHPMSink {
109    regOut.cycle := mHPM.cycle
110  })
111    .setAddr(CSRs.cycle)
112
113  val time = Module(new CSRModule("time", new CSRBundle {
114    val time = RO(63, 0)
115  }) with HasMHPMSink {
116    when (mHPM.time.valid) {
117      reg.time := mHPM.time.bits
118    }
119  })
120    .setAddr(CSRs.time)
121
122  val instret = Module(new CSRModule("instret", new CSRBundle {
123    val instret = RO(63, 0)
124  }) with HasMHPMSink {
125    regOut.instret := mHPM.instret
126  })
127    .setAddr(CSRs.instret)
128
129  val unprivilegedCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], Data)] = SeqMap(
130    0x001 -> (fcsr.wAliasFflags -> fcsr.fflags),
131    0x002 -> (fcsr.wAliasFfm    -> fcsr.frm),
132    0x003 -> (fcsr.w            -> fcsr.rdata),
133    0x008 -> (vstart.w          -> vstart.rdata),
134    0x009 -> (vcsr.wAliasVxsat  -> vcsr.vxsat),
135    0x00A -> (vcsr.wAlisaVxrm   -> vcsr.vxrm),
136    0x00F -> (vcsr.w            -> vcsr.rdata),
137    0xC20 -> (vl.w              -> vl.rdata),
138    0xC21 -> (vtype.w           -> vtype.rdata),
139    0xC22 -> (vlenb.w           -> vlenb.rdata),
140    CSRs.cycle -> (cycle.w      -> cycle.rdata),
141    CSRs.time -> (time.w        -> time.rdata),
142    CSRs.instret -> (instret.w  -> instret.rdata),
143  )
144
145  val unprivilegedCSRMods: Seq[CSRModule[_]] = Seq(
146    fcsr,
147    vcsr,
148    vstart,
149    vl,
150    vtype,
151    vlenb,
152    cycle,
153    time,
154    instret,
155  )
156
157  val unprivilegedCSROutMap: SeqMap[Int, UInt] = SeqMap(
158    0x001 -> fcsr.fflags.asUInt,
159    0x002 -> fcsr.frm.asUInt,
160    0x003 -> fcsr.rdata.asUInt,
161    0x008 -> vcsr.rdata.asUInt,
162    0x009 -> vcsr.vxsat.asUInt,
163    0x00A -> vcsr.vxrm.asUInt,
164    0x00F -> vcsr.rdata.asUInt,
165    0xC20 -> vl.rdata.asUInt,
166    0xC21 -> vtype.rdata.asUInt,
167    0xC22 -> vlenb.rdata.asUInt,
168    CSRs.cycle   -> cycle.rdata,
169    CSRs.time    -> time.rdata,
170    CSRs.instret -> instret.rdata,
171  )
172}
173
174class CSRVTypeBundle extends CSRBundle {
175  val VILL  = RO(  63)
176  val VMA   = RO(   7)
177  val VTA   = RO(   6)
178  val VSEW  = RO(5, 3)
179  val VLMUL = RO(2, 0)
180}
181
182class CSRFrmBundle extends CSRBundle {
183  val FRM = WARL(2, 0, wNoFilter)
184}
185
186class CSRFFlagsBundle extends CSRBundle {
187  val NX = WARL(0, wNoFilter)
188  val UF = WARL(1, wNoFilter)
189  val OF = WARL(2, wNoFilter)
190  val DZ = WARL(3, wNoFilter)
191  val NV = WARL(4, wNoFilter)
192}
193
194object VlenbField extends CSREnum with ROApply {
195  val init = Value((VLEN / 8).U)
196}
197
198trait HasMHPMSink { self: CSRModule[_] =>
199  val mHPM = IO(Input(new Bundle {
200    val cycle   = UInt(64.W)
201    // ValidIO is used to update time reg
202    val time    = ValidIO(UInt(64.W))
203    val instret = UInt(64.W)
204  }))
205}
206