Begin working on multi cycle float cordic
[ieee754fpu.git] / src / ieee754 / cordic / test / test_fpsin_cos.py
1 from nmigen import Module, Signal
2 from nmigen.back.pysim import Simulator, Delay
3 from nmigen.test.utils import FHDLTestCase
4
5 from ieee754.cordic.fpsin_cos import CORDIC
6 from ieee754.fpcommon.fpbase import FPNumBaseRecord
7 from python_sin_cos import run_cordic
8 from sfpy import Float16, Float32
9 import unittest
10 import math
11 import random
12
13
14 class SinCosTestCase(FHDLTestCase):
15 def run_test(self, zin=0, fracbits=8, expected_sin=0, expected_cos=0):
16
17 m = Module()
18
19 m.submodules.dut = dut = CORDIC(32)
20 z = Signal(dut.z0.width)
21 start = Signal()
22
23 sin = Signal(dut.sin.shape())
24 cos = Signal(dut.cos.shape())
25 ready = Signal()
26
27 m.d.comb += [
28 dut.z0.eq(z),
29 dut.start.eq(start),
30 sin.eq(dut.sin),
31 cos.eq(dut.cos),
32 ready.eq(dut.ready)]
33
34 sim = Simulator(m)
35 sim.add_clock(1e-6)
36
37 def process():
38 yield z.eq(zin.get_bits())
39 yield start.eq(1)
40
41 yield
42 yield start.eq(0)
43 yield
44 for i in range(fracbits * 3):
45 rdy = yield ready
46 yield
47
48 sim.add_sync_process(process)
49 with sim.write_vcd("fpsin_cos.vcd", "fpsin_cos.gtkw", traces=[
50 cos, sin, ready, start]):
51 sim.run()
52
53 def run_test_assert(self, z, fracbits=8):
54 self.run_test(zin=z, fracbits=fracbits)
55
56 def test_1(self):
57 x = Float32(1.0)
58 self.run_test_assert(x)
59
60 # def test_neg(self):
61 # self.run_test_assert(-6)
62
63 # def test_rand(self):
64 # fracbits = 16
65 # M = (1 << fracbits)
66 # ZMAX = int(round(M * math.pi/2))
67 # for i in range(500):
68 # z = random.randrange(-ZMAX, ZMAX-1)
69 # self.run_test_assert(z, fracbits=fracbits)
70
71
72 if __name__ == "__main__":
73 unittest.main()