@@ -6,11 +6,6 @@ import difftest._
66
77import treecorel2 .common .InstConfig
88
9- object CSRReg {
10- val timeCause = " h8000_0000_0000_0007" .U (64 .W )
11- val ecallCause = " h0000_0000_0000_000b" .U (64 .W )
12- }
13-
149class CSRReg extends Module with InstConfig {
1510 val io = IO (new Bundle {
1611 val globalEn = Input (Bool ())
@@ -24,18 +19,6 @@ class CSRReg extends Module with InstConfig {
2419 val csrState = Flipped (new DiffCSRStateIO )
2520 })
2621
27- protected val csrrwVis = (io.inst === BitPat (" b????????????_?????_001_?????_1110011" ))
28- protected val csrrwiVis = (io.inst === BitPat (" b????????????_?????_101_?????_1110011" ))
29- protected val csrrsVis = (io.inst === BitPat (" b????????????_?????_010_?????_1110011" ))
30- protected val csrrsiVis = (io.inst === BitPat (" b????????????_?????_110_?????_1110011" ))
31- protected val csrrcVis = (io.inst === BitPat (" b????????????_?????_011_?????_1110011" ))
32- protected val csrrciVis = (io.inst === BitPat (" b????????????_?????_111_?????_1110011" ))
33- protected val csrVis = csrrcVis || csrrciVis || csrrsVis || csrrsiVis || csrrwVis || csrrwiVis
34- protected val mretVis = (io.inst === BitPat (" b001100000010_00000_000_00000_1110011" ))
35- protected val ecallVis = (io.inst === BitPat (" b000000000000_00000_000_00000_1110011" ))
36- protected val zimm = ZeroExt (io.inst(19 , 15 ), XLen )
37- protected val addr = io.inst(31 , 20 )
38-
3922 protected val mcycle = RegInit (0 .U (XLen .W ))
4023 protected val mstatus = RegInit (0 .U (XLen .W ))
4124 protected val mtvec = RegInit (0 .U (XLen .W ))
@@ -47,6 +30,24 @@ class CSRReg extends Module with InstConfig {
4730 protected val medeleg = RegInit (0 .U (XLen .W ))
4831 protected val mhartid = RegInit (0 .U (XLen .W ))
4932
33+ protected val csrVis = MuxLookup (
34+ io.inst,
35+ false .B ,
36+ Seq (
37+ instCSRRW -> true .B ,
38+ instCSRRWI -> true .B ,
39+ instCSRRS -> true .B ,
40+ instCSRRSI -> true .B ,
41+ instCSRRC -> true .B ,
42+ instCSRRCI -> true .B
43+ )
44+ )
45+
46+ protected val mretVis = io.inst === instMRET
47+ protected val ecallVis = io.inst === instECALL
48+ protected val zimm = ZeroExt (io.inst(19 , 15 ), XLen )
49+ protected val addr = io.inst(31 , 20 )
50+
5051 protected val mhartidVis = addr === mhartidAddr
5152 protected val mstatusVis = addr === mstatusAddr
5253 protected val mieVis = addr === mieAddr
@@ -58,18 +59,22 @@ class CSRReg extends Module with InstConfig {
5859 protected val mcycleVis = addr === mcycleAddr
5960 protected val medelegVis = addr === medelegAddr
6061
61- protected val mcycleVal = Mux (csrVis && mcycleVis, mcycle, 0 .U )
62- protected val mstatusVal = Mux (csrVis && mstatusVis, mstatus, 0 .U )
63- protected val mtvecVal = Mux (csrVis && mtvecVis, mtvec, 0 .U )
64- protected val mcauseVal = Mux (csrVis && mcauseVis, mcause, 0 .U )
65- protected val mepcVal = Mux (csrVis && mepcVis, mepc, 0 .U )
66- protected val mieVal = Mux (csrVis && mieVis, mie, 0 .U )
67- protected val mipVal = Mux (csrVis && mipVis, mip, 0 .U )
68- protected val mscratchVal = Mux (csrVis && mscratchVis, mscratch, 0 .U )
69- protected val medelegVal = Mux (csrVis && medelegVis, medeleg, 0 .U )
70- protected val mhartidVal = Mux (csrVis && mhartidVis, mhartid, 0 .U )
71- protected val rdVal = mcycleVal | mstatusVal | mtvecVal | mcauseVal | mepcVal | mieVal | mipVal |
72- mscratchVal | medelegVal | mhartidVal
62+ protected val rdVal = MuxLookup (
63+ addr,
64+ 0 .U (XLen .W ),
65+ Seq (
66+ mhartidAddr -> Mux (csrVis, mhartid, 0 .U ),
67+ mstatusAddr -> Mux (csrVis, mstatus, 0 .U ),
68+ mieAddr -> Mux (csrVis, mie, 0 .U ),
69+ mtvecAddr -> Mux (csrVis, mtvec, 0 .U ),
70+ mscratchAddr -> Mux (csrVis, mscratch, 0 .U ),
71+ mepcAddr -> Mux (csrVis, mepc, 0 .U ),
72+ mcauseAddr -> Mux (csrVis, mcause, 0 .U ),
73+ mipAddr -> Mux (csrVis, mip, 0 .U ),
74+ mcycleAddr -> Mux (csrVis, mcycle, 0 .U ),
75+ medelegAddr -> Mux (csrVis, medeleg, 0 .U )
76+ )
77+ )
7378
7479 protected val MIE = mstatus(3 )
7580 protected val MPIE = mstatus(7 )
@@ -83,15 +88,20 @@ class CSRReg extends Module with InstConfig {
8388 io.timeIntrEn := timeIntrEn
8489 io.ecallEn := ecallEn
8590
86- protected val rcData = SignExt (csrrcVis.asUInt, 64 ) & (rdVal & ~ io.src)
87- protected val rciData = SignExt (csrrciVis.asUInt, 64 ) & (rdVal & ~ zimm)
88- protected val rsData = SignExt (csrrsVis.asUInt, 64 ) & (rdVal | io.src)
89- protected val rsiData = SignExt (csrrsiVis.asUInt, 64 ) & (rdVal | zimm)
90- protected val rwData = SignExt (csrrwVis.asUInt, 64 ) & (io.src)
91- protected val rwiData = SignExt (csrrwiVis.asUInt, 64 ) & (zimm)
92- protected val wData = rcData | rciData | rsData | rsiData | rwData | rwiData
93-
94- protected val SD = wData(16 , 15 ) === 3 .U || wData(14 , 13 ) === 3 .U
91+ protected val wData = MuxLookup (
92+ io.inst,
93+ 0 .U (XLen .W ),
94+ Seq (
95+ instCSRRC -> (rdVal & ~ io.src),
96+ instCSRRCI -> (rdVal & ~ zimm),
97+ instCSRRS -> (rdVal | io.src),
98+ instCSRRSI -> (rdVal | zimm),
99+ instCSRRW -> (io.src),
100+ instCSRRWI -> (zimm)
101+ )
102+ )
103+
104+ protected val sdBits = wData(16 , 15 ) === 3 .U || wData(14 , 13 ) === 3 .U
95105 protected val nop3 = 0 .U (3 .W )
96106 protected val trapStatus = Cat (mstatus(63 , 13 ), 3 .U (2 .W ), nop3, MIE , nop3, 0 .U (1 .W ), nop3)
97107 protected val mretStatus = Cat (mstatus(63 , 13 ), 0 .U (2 .W ), nop3, 1 .U (1 .W ), nop3, MPIE , nop3)
@@ -108,7 +118,7 @@ class CSRReg extends Module with InstConfig {
108118 }.elsewhen(mretVis) {
109119 mstatus := mretStatus
110120 }.elsewhen(csrVis && mstatusVis) {
111- mstatus := Cat (SD .asUInt, wData(62 , 0 ))
121+ mstatus := Cat (sdBits .asUInt, wData(62 , 0 ))
112122 }
113123
114124 when(csrVis && mtvecVis) { mtvec := wData }
@@ -120,9 +130,9 @@ class CSRReg extends Module with InstConfig {
120130 }
121131
122132 when(timeIntrEn) {
123- mcause := CSRReg . timeCause
133+ mcause := timeCause
124134 }.elsewhen(ecallEn) {
125- mcause := CSRReg . ecallCause
135+ mcause := ecallCause
126136 }.elsewhen(csrVis && mcauseVis) {
127137 mcause := wData
128138 }
0 commit comments