e45015b5bcae2ec95b5c55748fce53afdb56ac4d
1 """SVP64 unit test for svshape2
2 svshape2 offs,yx,rmm,SVd,sk,mm
4 from nmigen
import Module
, Signal
5 from nmigen
.sim
import Simulator
, Delay
, Settle
6 from nmutil
.formaltest
import FHDLTestCase
8 from openpower
.decoder
.isa
.caller
import ISACaller
9 from openpower
.decoder
.power_decoder
import (create_pdecode
)
10 from openpower
.decoder
.power_decoder2
import (PowerDecode2
)
11 from openpower
.simulator
.program
import Program
12 from openpower
.decoder
.isa
.caller
import ISACaller
, SVP64State
, CRFields
13 from openpower
.decoder
.selectable_int
import SelectableInt
14 from openpower
.decoder
.orderedset
import OrderedSet
15 from openpower
.decoder
.isa
.all
import ISA
16 from openpower
.decoder
.isa
.test_caller
import Register
, run_tst
17 from openpower
.sv
.trans
.svp64
import SVP64Asm
18 from openpower
.consts
import SVP64CROffs
19 from copy
import deepcopy
22 class SVSTATETestCase(FHDLTestCase
):
24 def _check_regs(self
, sim
, expected
):
28 self
.assertEqual(sim
.gpr(i
), SelectableInt(expected
[i
], 64),
29 "GPR %d %x expected %x" % (i
, sim
.gpr(i
).value
, expected
[i
]))
31 def test_0_sv_shape2(self
):
32 """sets VL=10 (via SVSTATE) then does svshape mm=0, checks SPRs after
34 isa
= SVP64Asm(['svshape2 6, 1, 1, 15, 5, 0, 0'
39 # initial values in GPR regfile
40 initial_regs
= [0] * 32
41 initial_regs
[9] = 0x1234
42 initial_regs
[10] = 0x1111
43 initial_regs
[5] = 0x4321
44 initial_regs
[6] = 0x2223
47 svstate
= SVP64State()
49 svstate
.maxvl
= 10 # MAXVL
50 print("SVSTATE", bin(svstate
.asint()))
53 expected_regs
= deepcopy(initial_regs
)
54 #expected_regs[1] = 0x3334
56 with
Program(lst
, bigendian
=False) as program
:
57 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
58 self
._check
_regs
(sim
, expected_regs
)
61 SVSHAPE0
= sim
.spr
['SVSHAPE0']
62 print("SVSTATE after", bin(sim
.svstate
.asint()))
63 print(" vl", bin(sim
.svstate
.vl
))
64 print(" mvl", bin(sim
.svstate
.maxvl
))
65 print(" srcstep", bin(sim
.svstate
.srcstep
))
66 print(" dststep", bin(sim
.svstate
.dststep
))
67 print(" RMpst", bin(sim
.svstate
.RMpst
))
68 print(" SVme", bin(sim
.svstate
.SVme
))
69 print(" mo0", bin(sim
.svstate
.mo0
))
70 print(" mo1", bin(sim
.svstate
.mo1
))
71 print(" mi0", bin(sim
.svstate
.mi0
))
72 print(" mi1", bin(sim
.svstate
.mi1
))
73 print(" mi2", bin(sim
.svstate
.mi2
))
74 print("STATE0 ", SVSHAPE0
)
75 print("STATE0 offs", SVSHAPE0
.offset
)
76 print("STATE0 xdim", SVSHAPE0
.xdimsz
)
77 print("STATE0 ydim", SVSHAPE0
.ydimsz
)
78 print("STATE0 skip", bin(SVSHAPE0
.skip
))
79 print("STATE0 inv", SVSHAPE0
.invxyz
)
80 print("STATE0order", SVSHAPE0
.order
)
81 self
.assertEqual(SVSHAPE0
.xdimsz
, 5) # set
82 self
.assertEqual(SVSHAPE0
.ydimsz
, 2) # calculated from MVL/xdimsz
83 self
.assertEqual(SVSHAPE0
.skip
, 0) # no skip
84 # invert y rather than x because yx=1
85 self
.assertEqual(SVSHAPE0
.invxyz
, [0, 1, 0])
86 self
.assertEqual(SVSHAPE0
.offset
, 6)
87 self
.assertEqual(SVSHAPE0
.order
, (1, 0, 2)) # y,x(,z)
88 self
.assertEqual(sim
.svstate
.RMpst
, 0) # mm=0 so persist=0
89 self
.assertEqual(sim
.svstate
.SVme
, 0b01111) # same as rmm
90 # rmm is 0b01111 which means mi0=0 mi1=1 mi2=2 mo0=3 mo1=0
91 self
.assertEqual(sim
.svstate
.mi0
, 0)
92 self
.assertEqual(sim
.svstate
.mi1
, 1)
93 self
.assertEqual(sim
.svstate
.mi2
, 2)
94 self
.assertEqual(sim
.svstate
.mo0
, 3)
95 self
.assertEqual(sim
.svstate
.mo1
, 0)
97 def tst_1_sv_index(self
):
98 """sets VL=10 (via SVSTATE) then does svindex mm=1, checks SPRs after
100 # rmm: bits 0-2 (MSB0) are 0b011 and bits 3-4 are 0b10.
101 # therefore rmm is 0b011 || 0b10 --> 0b01110 -> 14
102 isa
= SVP64Asm(['svindex 1, 14, 5, 0, 0, 1, 0'
105 print("listing", lst
)
107 # initial values in GPR regfile
108 initial_regs
= [0] * 32
109 initial_regs
[9] = 0x1234
110 initial_regs
[10] = 0x1111
111 initial_regs
[5] = 0x4321
112 initial_regs
[6] = 0x2223
115 svstate
= SVP64State()
117 svstate
.maxvl
= 10 # MAXVL
118 print("SVSTATE", bin(svstate
.asint()))
120 # copy before running
121 expected_regs
= deepcopy(initial_regs
)
122 #expected_regs[1] = 0x3334
124 with
Program(lst
, bigendian
=False) as program
:
125 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
126 self
._check
_regs
(sim
, expected_regs
)
129 SVSHAPE2
= sim
.spr
['SVSHAPE2']
130 print("SVSTATE after", bin(sim
.svstate
.asint()))
131 print(" vl", bin(sim
.svstate
.vl
))
132 print(" mvl", bin(sim
.svstate
.maxvl
))
133 print(" srcstep", bin(sim
.svstate
.srcstep
))
134 print(" dststep", bin(sim
.svstate
.dststep
))
135 print(" RMpst", bin(sim
.svstate
.RMpst
))
136 print(" SVme", bin(sim
.svstate
.SVme
))
137 print(" mo0", bin(sim
.svstate
.mo0
))
138 print(" mo1", bin(sim
.svstate
.mo1
))
139 print(" mi0", bin(sim
.svstate
.mi0
))
140 print(" mi1", bin(sim
.svstate
.mi1
))
141 print(" mi2", bin(sim
.svstate
.mi2
))
142 print("STATE2svgpr", hex(SVSHAPE2
.svgpr
))
143 print("STATE2 xdim", SVSHAPE2
.xdimsz
)
144 print("STATE2 ydim", SVSHAPE2
.ydimsz
)
145 print("STATE2 skip", bin(SVSHAPE2
.skip
))
146 print("STATE2 inv", SVSHAPE2
.invxyz
)
147 print("STATE2order", SVSHAPE2
.order
)
148 self
.assertEqual(sim
.svstate
.RMpst
, 1) # mm=1 so persist=1
149 # rmm is 0b01110 which means mo0 = 2
150 self
.assertEqual(sim
.svstate
.mi0
, 0)
151 self
.assertEqual(sim
.svstate
.mi1
, 0)
152 self
.assertEqual(sim
.svstate
.mi2
, 0)
153 self
.assertEqual(sim
.svstate
.mo0
, 2)
154 self
.assertEqual(sim
.svstate
.mo1
, 0)
155 # and mo0 should be activated
156 self
.assertEqual(sim
.svstate
.SVme
, 0b01000)
157 # now check the SVSHAPEs. 2 was the one targetted
158 self
.assertEqual(SVSHAPE2
.svgpr
, 2) # SVG is shifted up by 1
159 self
.assertEqual(SVSHAPE2
.xdimsz
, 5) # SHAPE2 xdim set to 5
160 self
.assertEqual(SVSHAPE2
.ydimsz
, 1) # SHAPE2 ydim 1
161 # all others must be zero
163 shape
= sim
.spr
['SVSHAPE%d' % i
]
164 self
.assertEqual(shape
.asint(), 0) # all others zero
166 def tst_0_sv_index_add(self
):
167 """sets VL=6 (via SVSTATE) then does svindex, and an add.
169 only RA is re-mapped via Indexing, not RB or RT
171 isa
= SVP64Asm(['svindex 8, 1, 1, 0, 0, 0, 0',
175 print("listing", lst
)
177 # initial values in GPR regfile
178 initial_regs
= [0] * 32
179 idxs
= [1, 0, 5, 2, 4, 3] # random enough
181 initial_regs
[16+i
] = idxs
[i
]
185 svstate
= SVP64State()
187 svstate
.maxvl
= 6 # MAXVL
188 print("SVSTATE", bin(svstate
.asint()))
190 # copy before running
191 expected_regs
= deepcopy(initial_regs
)
193 RA
= initial_regs
[0+idxs
[i
]]
194 RB
= initial_regs
[0+i
]
195 expected_regs
[i
+8] = RA
+RB
196 print("expected", i
, expected_regs
[i
+8])
198 with
Program(lst
, bigendian
=False) as program
:
199 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
202 SVSHAPE0
= sim
.spr
['SVSHAPE0']
203 print("SVSTATE after", bin(sim
.svstate
.asint()))
204 print(" vl", bin(sim
.svstate
.vl
))
205 print(" mvl", bin(sim
.svstate
.maxvl
))
206 print(" srcstep", bin(sim
.svstate
.srcstep
))
207 print(" dststep", bin(sim
.svstate
.dststep
))
208 print(" RMpst", bin(sim
.svstate
.RMpst
))
209 print(" SVme", bin(sim
.svstate
.SVme
))
210 print(" mo0", bin(sim
.svstate
.mo0
))
211 print(" mo1", bin(sim
.svstate
.mo1
))
212 print(" mi0", bin(sim
.svstate
.mi0
))
213 print(" mi1", bin(sim
.svstate
.mi1
))
214 print(" mi2", bin(sim
.svstate
.mi2
))
215 print("STATE0svgpr", hex(SVSHAPE0
.svgpr
))
216 print(sim
.gpr
.dump())
217 self
.assertEqual(sim
.svstate
.RMpst
, 0) # mm=0 so persist=0
218 self
.assertEqual(sim
.svstate
.SVme
, 0b00001) # same as rmm
219 # rmm is 0b00001 which means mi0=0 and all others inactive (0)
220 self
.assertEqual(sim
.svstate
.mi0
, 0)
221 self
.assertEqual(sim
.svstate
.mi1
, 0)
222 self
.assertEqual(sim
.svstate
.mi2
, 0)
223 self
.assertEqual(sim
.svstate
.mo0
, 0)
224 self
.assertEqual(sim
.svstate
.mo1
, 0)
225 self
.assertEqual(SVSHAPE0
.svgpr
, 16) # SVG is shifted up by 1
226 for i
in range(1, 4):
227 shape
= sim
.spr
['SVSHAPE%d' % i
]
228 self
.assertEqual(shape
.svgpr
, 0)
229 self
._check
_regs
(sim
, expected_regs
)
231 def tst_1_sv_index_add(self
):
232 """sets VL=6 (via SVSTATE) then does modulo 3 svindex, and an add.
234 only RA is re-mapped via Indexing, not RB or RT
236 isa
= SVP64Asm(['svindex 8, 1, 3, 0, 0, 0, 0',
240 print("listing", lst
)
242 # initial values in GPR regfile
243 initial_regs
= [0] * 32
244 idxs
= [1, 0, 5, 2, 4, 3] # random enough
246 initial_regs
[16+i
] = idxs
[i
]
250 svstate
= SVP64State()
252 svstate
.maxvl
= 6 # MAXVL
253 print("SVSTATE", bin(svstate
.asint()))
255 # copy before running
256 expected_regs
= deepcopy(initial_regs
)
258 RA
= initial_regs
[0+idxs
[i
% 3]] # modulo 3 but still indexed
259 RB
= initial_regs
[0+i
]
260 expected_regs
[i
+8] = RA
+RB
261 print("expected", i
, expected_regs
[i
+8])
263 with
Program(lst
, bigendian
=False) as program
:
264 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
267 SVSHAPE0
= sim
.spr
['SVSHAPE0']
268 print("SVSTATE after", bin(sim
.svstate
.asint()))
269 print(" vl", bin(sim
.svstate
.vl
))
270 print(" mvl", bin(sim
.svstate
.maxvl
))
271 print(" srcstep", bin(sim
.svstate
.srcstep
))
272 print(" dststep", bin(sim
.svstate
.dststep
))
273 print(" RMpst", bin(sim
.svstate
.RMpst
))
274 print(" SVme", bin(sim
.svstate
.SVme
))
275 print(" mo0", bin(sim
.svstate
.mo0
))
276 print(" mo1", bin(sim
.svstate
.mo1
))
277 print(" mi0", bin(sim
.svstate
.mi0
))
278 print(" mi1", bin(sim
.svstate
.mi1
))
279 print(" mi2", bin(sim
.svstate
.mi2
))
280 print("STATE0svgpr", hex(SVSHAPE0
.svgpr
))
281 print("STATE0 xdim", SVSHAPE0
.xdimsz
)
282 print("STATE0 ydim", SVSHAPE0
.ydimsz
)
283 print("STATE0 skip", bin(SVSHAPE0
.skip
))
284 print("STATE0 inv", SVSHAPE0
.invxyz
)
285 print("STATE0order", SVSHAPE0
.order
)
286 print(sim
.gpr
.dump())
287 self
.assertEqual(sim
.svstate
.RMpst
, 0) # mm=0 so persist=0
288 self
.assertEqual(sim
.svstate
.SVme
, 0b00001) # same as rmm
289 # rmm is 0b00001 which means mi0=0 and all others inactive (0)
290 self
.assertEqual(sim
.svstate
.mi0
, 0)
291 self
.assertEqual(sim
.svstate
.mi1
, 0)
292 self
.assertEqual(sim
.svstate
.mi2
, 0)
293 self
.assertEqual(sim
.svstate
.mo0
, 0)
294 self
.assertEqual(sim
.svstate
.mo1
, 0)
295 self
.assertEqual(SVSHAPE0
.svgpr
, 16) # SVG is shifted up by 1
296 for i
in range(1, 4):
297 shape
= sim
.spr
['SVSHAPE%d' % i
]
298 self
.assertEqual(shape
.svgpr
, 0)
299 self
._check
_regs
(sim
, expected_regs
)
301 def tst_2_sv_index_add(self
):
302 """sets VL=6 (via SVSTATE) then does 2D remapped svindex, and an add.
305 only RA is re-mapped via Indexing, not RB or RT
307 isa
= SVP64Asm(['svindex 8, 1, 3, 0, 1, 0, 0',
311 print("listing", lst
)
313 # initial values in GPR regfile
314 initial_regs
= [0] * 32
315 idxs
= [1, 0, 5, 2, 4, 3] # random enough
317 initial_regs
[16+i
] = idxs
[i
]
321 svstate
= SVP64State()
323 svstate
.maxvl
= 6 # MAXVL
324 print("SVSTATE", bin(svstate
.asint()))
326 # copy before running
327 expected_regs
= deepcopy(initial_regs
)
332 RA
= initial_regs
[0+idxs
[remap
]] # modulo 3 but still indexed
333 RB
= initial_regs
[0+i
]
334 expected_regs
[i
+8] = RA
+RB
335 print("expected", i
, expected_regs
[i
+8])
337 with
Program(lst
, bigendian
=False) as program
:
338 sim
= self
.run_tst_program(program
, initial_regs
, svstate
=svstate
)
341 SVSHAPE0
= sim
.spr
['SVSHAPE0']
342 print("SVSTATE after", bin(sim
.svstate
.asint()))
343 print(" vl", bin(sim
.svstate
.vl
))
344 print(" mvl", bin(sim
.svstate
.maxvl
))
345 print(" srcstep", bin(sim
.svstate
.srcstep
))
346 print(" dststep", bin(sim
.svstate
.dststep
))
347 print(" RMpst", bin(sim
.svstate
.RMpst
))
348 print(" SVme", bin(sim
.svstate
.SVme
))
349 print(" mo0", bin(sim
.svstate
.mo0
))
350 print(" mo1", bin(sim
.svstate
.mo1
))
351 print(" mi0", bin(sim
.svstate
.mi0
))
352 print(" mi1", bin(sim
.svstate
.mi1
))
353 print(" mi2", bin(sim
.svstate
.mi2
))
354 print("STATE0svgpr", hex(SVSHAPE0
.svgpr
))
355 print("STATE0 xdim", SVSHAPE0
.xdimsz
)
356 print("STATE0 ydim", SVSHAPE0
.ydimsz
)
357 print("STATE0 skip", bin(SVSHAPE0
.skip
))
358 print("STATE0 inv", SVSHAPE0
.invxyz
)
359 print("STATE0order", SVSHAPE0
.order
)
360 print(sim
.gpr
.dump())
361 self
.assertEqual(sim
.svstate
.RMpst
, 0) # mm=0 so persist=0
362 self
.assertEqual(sim
.svstate
.SVme
, 0b00001) # same as rmm
363 # rmm is 0b00001 which means mi0=0 and all others inactive (0)
364 self
.assertEqual(sim
.svstate
.mi0
, 0)
365 self
.assertEqual(sim
.svstate
.mi1
, 0)
366 self
.assertEqual(sim
.svstate
.mi2
, 0)
367 self
.assertEqual(sim
.svstate
.mo0
, 0)
368 self
.assertEqual(sim
.svstate
.mo1
, 0)
369 self
.assertEqual(SVSHAPE0
.svgpr
, 16) # SVG is shifted up by 1
370 for i
in range(1, 4):
371 shape
= sim
.spr
['SVSHAPE%d' % i
]
372 self
.assertEqual(shape
.svgpr
, 0)
373 self
._check
_regs
(sim
, expected_regs
)
375 def run_tst_program(self
, prog
, initial_regs
=None,
377 if initial_regs
is None:
378 initial_regs
= [0] * 32
379 simulator
= run_tst(prog
, initial_regs
, svstate
=svstate
)
384 if __name__
== "__main__":