xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/Unprivileged.scala (revision e628dd84afb37a9f416694ac22e581bed6a45729)
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 time = Module(new CSRModule("time", new CSRBundle {
107    val time = RO(63, 0)
108  }) with HasZicntrSink {
109    when (cntr.time.valid) {
110      reg.time := cntr.time.bits
111    }
112  })
113    .setAddr(CSRs.time)
114
115  val unprivilegedCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], Data)] = SeqMap(
116    0x001 -> (fcsr.wAliasFflags -> fcsr.fflags),
117    0x002 -> (fcsr.wAliasFfm    -> fcsr.frm),
118    0x003 -> (fcsr.w            -> fcsr.rdata),
119    0x008 -> (vstart.w          -> vstart.rdata),
120    0x009 -> (vcsr.wAliasVxsat  -> vcsr.vxsat),
121    0x00A -> (vcsr.wAlisaVxrm   -> vcsr.vxrm),
122    0x00F -> (vcsr.w            -> vcsr.rdata),
123    0xC20 -> (vl.w              -> vl.rdata),
124    0xC21 -> (vtype.w           -> vtype.rdata),
125    0xC22 -> (vlenb.w           -> vlenb.rdata),
126    CSRs.time -> (time.w        -> time.rdata),
127  )
128
129  val unprivilegedCSRMods: Seq[CSRModule[_]] = Seq(
130    fcsr,
131    vcsr,
132    vstart,
133    vl,
134    vtype,
135    vlenb,
136    time,
137  )
138
139  val unprivilegedCSROutMap: SeqMap[Int, UInt] = SeqMap(
140    0x001 -> fcsr.fflags.asUInt,
141    0x002 -> fcsr.frm.asUInt,
142    0x003 -> fcsr.rdata.asUInt,
143    0x008 -> vcsr.rdata.asUInt,
144    0x009 -> vcsr.vxsat.asUInt,
145    0x00A -> vcsr.vxrm.asUInt,
146    0x00F -> vcsr.rdata.asUInt,
147    0xC20 -> vl.rdata.asUInt,
148    0xC21 -> vtype.rdata.asUInt,
149    0xC22 -> vlenb.rdata.asUInt,
150    CSRs.time -> time.rdata,
151  )
152}
153
154class CSRVTypeBundle extends CSRBundle {
155  val VILL  = RO(  63)
156  val VMA   = RO(   7)
157  val VTA   = RO(   6)
158  val VSEW  = RO(5, 3)
159  val VLMUL = RO(2, 0)
160}
161
162class CSRFrmBundle extends CSRBundle {
163  val FRM = WARL(2, 0, wNoFilter)
164}
165
166class CSRFFlagsBundle extends CSRBundle {
167  val NX = WARL(0, wNoFilter)
168  val UF = WARL(1, wNoFilter)
169  val OF = WARL(2, wNoFilter)
170  val DZ = WARL(3, wNoFilter)
171  val NV = WARL(4, wNoFilter)
172}
173
174object VlenbField extends CSREnum with ROApply {
175  val init = Value((VLEN / 8).U)
176}
177
178trait HasZicntrSink { self: CSRModule[_] =>
179  val cntr = IO(Input(new Bundle {
180    val time    = ValidIO(UInt(64.W))
181  }))
182}
183