missing test.mem arg for ISA in test_core
[soc.git] / src / soc / simple / test / test_core.py
1 """simple core test
2
3 related bugs:
4
5 * https://bugs.libre-soc.org/show_bug.cgi?id=363
6 """
7 from nmigen import Module, Signal, Cat
8 from nmigen.back.pysim import Simulator, Delay, Settle
9 from nmutil.formaltest import FHDLTestCase
10 from nmigen.cli import rtlil
11 import unittest
12 from soc.decoder.isa.caller import special_sprs
13 from soc.decoder.power_decoder import create_pdecode
14 from soc.decoder.power_decoder2 import PowerDecode2
15 from soc.decoder.isa.all import ISA
16 from soc.decoder.power_enums import Function, XER_bits
17
18
19 from soc.simple.core import NonProductionCore
20 from soc.experiment.compalu_multi import find_ok # hack
21
22 # test with ALU data and Logical data
23 from soc.fu.alu.test.test_pipe_caller import ALUTestCase
24 from soc.fu.logical.test.test_pipe_caller import LogicalTestCase
25 from soc.fu.shift_rot.test.test_pipe_caller import ShiftRotTestCase
26 from soc.fu.cr.test.test_pipe_caller import CRTestCase
27 from soc.fu.branch.test.test_pipe_caller import BranchTestCase
28
29
30 def set_issue(core, dec2, sim):
31 yield core.issue_i.eq(1)
32 yield
33 yield core.issue_i.eq(0)
34 while True:
35 busy_o = yield core.busy_o
36 if busy_o:
37 break
38 print("!busy",)
39 yield
40
41
42 def wait_for_busy_clear(cu):
43 while True:
44 busy_o = yield cu.busy_o
45 if not busy_o:
46 break
47 print("busy",)
48 yield
49
50
51 class TestRunner(FHDLTestCase):
52 def __init__(self, tst_data):
53 super().__init__("run_all")
54 self.test_data = tst_data
55
56 def run_all(self):
57 m = Module()
58 comb = m.d.comb
59 instruction = Signal(32)
60 ivalid_i = Signal()
61
62 m.submodules.core = core = NonProductionCore()
63 pdecode = core.pdecode
64 pdecode2 = core.pdecode2
65
66 comb += pdecode2.dec.raw_opcode_in.eq(instruction)
67 comb += core.ivalid_i.eq(ivalid_i)
68 sim = Simulator(m)
69
70 sim.add_clock(1e-6)
71
72 def process():
73 yield core.issue_i.eq(0)
74 yield
75
76 for test in self.test_data:
77 print(test.name)
78 program = test.program
79 self.subTest(test.name)
80 sim = ISA(pdecode2, test.regs, test.sprs, test.cr, test.mem)
81 gen = program.generate_instructions()
82 instructions = list(zip(gen, program.assembly.splitlines()))
83
84 # set up INT regfile, "direct" write (bypass rd/write ports)
85 for i in range(32):
86 yield core.regs.int.regs[i].reg.eq(test.regs[i])
87
88 # set up CR regfile, "direct" write across all CRs
89 cr = test.cr
90 #cr = int('{:32b}'.format(cr)[::-1], 2)
91 print ("cr reg", hex(cr))
92 for i in range(8):
93 #j = 7-i
94 cri = (cr>>(i*4)) & 0xf
95 #cri = int('{:04b}'.format(cri)[::-1], 2)
96 print ("cr reg", hex(cri), i,
97 core.regs.cr.regs[i].reg.shape())
98 yield core.regs.cr.regs[i].reg.eq(cri)
99
100 # set up XER. "direct" write (bypass rd/write ports)
101 xregs = core.regs.xer
102 print ("sprs", test.sprs)
103 if special_sprs['XER'] in test.sprs:
104 xer = test.sprs[special_sprs['XER']]
105 sobit = xer[XER_bits['SO']].asint()
106 yield xregs.regs[xregs.SO].reg.eq(sobit)
107 cabit = xer[XER_bits['CA']].asint()
108 ca32bit = xer[XER_bits['CA32']].asint()
109 yield xregs.regs[xregs.CA].reg.eq(Cat(cabit, ca32bit))
110 ovbit = xer[XER_bits['OV']].asint()
111 ov32bit = xer[XER_bits['OV32']].asint()
112 yield xregs.regs[xregs.OV].reg.eq(Cat(ovbit, ov32bit))
113 else:
114 yield xregs.regs[xregs.SO].reg.eq(0)
115 yield xregs.regs[xregs.OV].reg.eq(0)
116 yield xregs.regs[xregs.CA].reg.eq(0)
117
118 index = sim.pc.CIA.value//4
119 while index < len(instructions):
120 ins, code = instructions[index]
121
122 print("0x{:X}".format(ins & 0xffffffff))
123 print(code)
124
125 # ask the decoder to decode this binary data (endian'd)
126 yield pdecode2.dec.bigendian.eq(0) # little / big?
127 yield instruction.eq(ins) # raw binary instr.
128 yield ivalid_i.eq(1)
129 yield Settle()
130 #fn_unit = yield pdecode2.e.fn_unit
131 #fuval = self.funit.value
132 #self.assertEqual(fn_unit & fuval, fuval)
133
134 # set operand and get inputs
135 yield from set_issue(core, pdecode2, sim)
136 yield Settle()
137
138 yield from wait_for_busy_clear(core)
139 yield ivalid_i.eq(0)
140 yield
141
142 print ("sim", code)
143 # call simulated operation
144 opname = code.split(' ')[0]
145 yield from sim.call(opname)
146 index = sim.pc.CIA.value//4
147
148 # int regs
149 intregs = []
150 for i in range(32):
151 rval = yield core.regs.int.regs[i].reg
152 intregs.append(rval)
153 print ("int regs", list(map(hex, intregs)))
154 for i in range(32):
155 simregval = sim.gpr[i].asint()
156 self.assertEqual(simregval, intregs[i],
157 "int reg %d not equal %s" % (i, repr(code)))
158
159 # CRs
160 crregs = []
161 for i in range(8):
162 rval = yield core.regs.cr.regs[i].reg
163 crregs.append(rval)
164 print ("cr regs", list(map(hex, crregs)))
165 print ("sim cr reg", hex(cr))
166 for i in range(8):
167 rval = crregs[i]
168 cri = sim.crl[7-i].get_range().value
169 print ("cr reg", i, hex(cri), i, hex(rval))
170 # XXX https://bugs.libre-soc.org/show_bug.cgi?id=363
171 #self.assertEqual(cri, rval,
172 # "cr reg %d not equal %s" % (i, repr(code)))
173
174 sim.add_sync_process(process)
175 with sim.write_vcd("core_simulator.vcd", "core_simulator.gtkw",
176 traces=[]):
177 sim.run()
178
179
180 if __name__ == "__main__":
181 unittest.main(exit=False)
182 suite = unittest.TestSuite()
183 suite.addTest(TestRunner(CRTestCase.test_data))
184 #suite.addTest(TestRunner(ShiftRotTestCase.test_data))
185 #suite.addTest(TestRunner(LogicalTestCase.test_data))
186 #suite.addTest(TestRunner(ALUTestCase.test_data))
187 #suite.addTest(TestRunner(BranchTestCase.test_data))
188
189 runner = unittest.TextTestRunner()
190 runner.run(suite)
191