c004cbcd89c560ab1db88b244d1009d4464487c4
1 from nmigen
import Module
, Signal
2 from nmigen
.back
.pysim
import Simulator
, Delay
3 from nmutil
.formaltest
import FHDLTestCase
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
, Float64
13 float_class_for_bits
= {64: Float64
,
18 class SinCosTestCase(FHDLTestCase
):
19 def run_test(self
, zin
=0, bits
=64, expected_sin
=0, expected_cos
=0):
23 m
.submodules
.dut
= dut
= CORDIC(32)
24 z
= Signal(dut
.z0
.width
)
27 sin
= Signal(dut
.sin
.shape())
28 cos
= Signal(dut
.cos
.shape())
43 yield z
.eq(zin
.get_bits())
49 for i
in range(dut
.fracbits
+1):
52 if rdy
and not asserted
:
53 frac
= self
.get_frac(zo
, dut
.z_out
.width
- 2)
54 print(f
"{zo:x} {frac}", end
=' ')
55 #self.assertEqual(str(frac), zin.__str__())
58 real_sin
= yield dut
.sin
59 real_sin
= self
.get_frac(real_sin
, dut
.sin
.width
- 2)
60 diff
= abs(real_sin
- expected_sin
)
61 print(f
"{real_sin} {expected_sin} {diff}", end
=' ')
62 #self.assertTrue(diff < 0.001)
63 real_cos
= yield dut
.cos
64 real_cos
= self
.get_frac(real_cos
, dut
.cos
.width
- 2)
65 diff
= abs(real_cos
- expected_cos
)
66 print(f
"{real_cos} {expected_cos} {diff}")
67 #self.assertTrue(diff < 0.001)
71 sim
.add_sync_process(process
)
72 with sim
.write_vcd("fpsin_cos.vcd", "fpsin_cos.gtkw", traces
=[
73 cos
, sin
, ready
, start
]):
76 def run_test_assert(self
, z
, bits
=64):
77 kls
= float_class_for_bits
[bits
]
78 zpi
= z
* kls(math
.pi
/2)
81 self
.run_test(zin
=z
, expected_sin
=e_sin
,
86 self
.run_test_assert(x
)
90 self
.run_test_assert(x
, bits
=32)
93 for i
in range(10000):
96 self
.run_test_assert(f
)
98 def get_frac(self
, value
, bits
):
99 return value
/(1 << bits
)
102 if __name__
== "__main__":