-
Notifications
You must be signed in to change notification settings - Fork 11
/
RVA.core_desc
269 lines (247 loc) · 12 KB
/
RVA.core_desc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
import "RISCVBase.core_desc"
InstructionSet RV32A extends RISCVBase {
instructions {
LRW {
encoding: 5'b00010 :: aq[0:0] :: rl[0:0] :: 5'b00000 :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: "{name(rd)}, {name(rs1)}, {name(aq)}, {name(rl)}";
behavior: if ((rd % RFS) != 0) {
unsigned<XLEN> offs = X[rs1 % RFS];
X[rd % RFS] = (unsigned<XLEN>)((signed)MEM[offs+3:offs]);
RES[offs] = (unsigned<8>)-1;
}
}
SCW {
encoding: 5'b00011 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: "{name(rd)}, {name(rs1)}, {name(rs2)}, {name(aq)}, {name(rl)}";
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = RES[offs];
if (res1 != 0)
MEM[offs+3:offs] = X[rs2 % RFS];
if ((rd % RFS) != 0)
X[rd % RFS] = res1 ? 0 : 1;
}
}
AMOSWAPW {
encoding: 5'b00001 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amoswap.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)((signed)MEM[offs+3:offs]);
MEM[offs+3:offs] = (unsigned<32>)X[rs2 % RFS];
}
}
AMOADDW {
encoding: 5'b00000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amoadd.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<32> res1 = (signed)MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)res1;
signed<34> res2 = res1 + (signed<32>)X[rs2 % RFS];
MEM[offs+3:offs] = (unsigned<32>)res2;
}
}
AMOXORW {
encoding: 5'b00100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amoxor.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res1;
unsigned<32> res2 = res1 ^ (unsigned<32>)X[rs2 % RFS];
MEM[offs+3:offs] = res2;
}
}
AMOANDW {
encoding: 5'b01100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amoand.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res1;
unsigned<32> res2 = res1 & (unsigned<32>)X[rs2 % RFS];
MEM[offs+3:offs] = res2;
}
}
AMOORW {
encoding: 5'b01000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amoor.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res1;
unsigned<32> res2 = res1 | (unsigned<32>)X[rs2 % RFS];
MEM[offs+3:offs] = res2;
}
}
AMOMINW {
encoding: 5'b10000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amomin.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<32> res1 = (signed)MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)res1;
unsigned<32> res2 = res1 > (signed<32>)X[rs2 % RFS] ? (unsigned<32>)X[rs2 % RFS] : (unsigned)res1;
MEM[offs+3:offs] = res2;
}
}
AMOMAXW {
encoding: 5'b10100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amomax.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<32> res1 = (signed)MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)res1;
unsigned<32> res2 = res1 < (signed<32>)X[rs2 % RFS] ? (unsigned<32>)X[rs2 % RFS] : (unsigned)res1;
MEM[offs+3:offs] = res2;
}
}
AMOMINUW {
encoding: 5'b11000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amominu.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)res1;
unsigned<32> res2 = res1 > (unsigned<32>)X[rs2 % RFS] ? (unsigned<32>)X[rs2 % RFS] : res1;
MEM[offs+3:offs] = res2;
}
}
AMOMAXUW {
encoding: 5'b11100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b010 :: rd[4:0] :: 7'b0101111;
assembly: {"amomaxu.w", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<32> res1 = MEM[offs+3:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (unsigned<XLEN>)res1;
unsigned<32> res2 = res1 < (unsigned<32>)X[rs2 % RFS] ? (unsigned<32>)X[rs2 % RFS] : res1;
MEM[offs+3:offs] = res2;
}
}
}
}
InstructionSet RV64A extends RV32A {
instructions {
LRD {
encoding: 5'b00010 :: aq[0:0] :: rl[0:0] :: 5'b00000 :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: "{name(rd)}, {name(rs1)}";
behavior: {
if ((rd % RFS) != 0) {
unsigned<XLEN> offs = X[rs1 % RFS];
X[rd % RFS] = (signed<XLEN>)((signed<64>)MEM[offs+7:offs]);
MEM[offs+7:offs] = (unsigned<64>)-1;
}
}
}
SCD {
encoding: 5'b00011 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: "{name(rd)}, {name(rs1)}, {name(rs2)}";
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<64> res = RES[offs];
if (res != 0)
MEM[offs+7:offs] = X[rs2 % RFS];
if ((rd % RFS) != 0)
X[rd % RFS] = res ? 0 : 1;
}
}
AMOSWAPD {
encoding: 5'b00001 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amoswap.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
if ((rd % RFS) != 0) X[rd % RFS] = (signed<XLEN>)((signed<64>)MEM[offs+7:offs]);
MEM[offs+7:offs] = (unsigned<64>)X[rs2 % RFS];
}
}
AMOADDD {
encoding: 5'b00000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amoadd.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res;
unsigned<64> res2 = res + X[rs2 % RFS];
MEM[offs+7:offs] = res2;
}
}
AMOXORD {
encoding: 5'b00100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amoxor.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res;
unsigned<64> res2 = res ^ X[rs2 % RFS];
MEM[offs+7:offs] = res2;
}
}
AMOANDD {
encoding: 5'b01100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amoand.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res;
unsigned<64> res2 = res & X[rs2 % RFS];
MEM[offs+7:offs] = res2;
}
}
AMOORD {
encoding: 5'b01000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amoor.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res;
unsigned<64> res2 = res :: X[rs2 % RFS];
MEM[offs+7:offs] = res2;
}
}
AMOMIND {
encoding: 5'b10000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amomin.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res1 = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res1;
unsigned<64> res2 = res1 > (signed<64>)X[rs2 % RFS] ? X[rs2 % RFS] : res1;
MEM[offs+7:offs] = res2;
}
}
AMOMAXD {
encoding: 5'b10100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amomax.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
signed<64> res = (signed)MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = res;
unsigned<64> res2 = res < (signed<64>)X[rs2 % RFS] ? X[rs2 % RFS] : res;
MEM[offs+7:offs] = res2;
}
}
AMOMINUD {
encoding: 5'b11000 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amominu.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<64> res = MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (signed<64>)res;
unsigned<64> res2 = res > X[rs2 % RFS] ? X[rs2 % RFS] : res;
MEM[offs+7:offs] = res2;
}
}
AMOMAXUD {
encoding: 5'b11100 :: aq[0:0] :: rl[0:0] :: rs2[4:0] :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101111;
assembly: {"amomaxu.d", "{name(rd)}, {name(rs1)}, {name(rs2)} (aqu = {aq},rel = {rl})"};
behavior: {
unsigned<XLEN> offs = X[rs1 % RFS];
unsigned<64> res1 = MEM[offs+7:offs];
if ((rd % RFS) != 0) X[rd % RFS] = (signed<64>)res1;
unsigned<64> res2 = res1 < X[rs2 % RFS] ? X[rs2 % RFS] : res1;
MEM[offs+7:offs] = res2;
}
}
}
}