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