test: add test_bitslip (initially in litedram)
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Mon, 24 Apr 2017 16:50:06 +0000 (18:50 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Mon, 24 Apr 2017 16:50:06 +0000 (18:50 +0200)
test/test_bitslip.py [new file with mode: 0644]

diff --git a/test/test_bitslip.py b/test/test_bitslip.py
new file mode 100644 (file)
index 0000000..8927f0c
--- /dev/null
@@ -0,0 +1,69 @@
+import unittest
+import random
+
+from litex.gen import *
+from litex.gen.genlib.misc import BitSlip
+
+
+class BitSlipModel:
+    def __init__(self, data_width, latency):
+        self.data_width = data_width
+        self.latency = latency
+
+    def simulate(self, bitslip, sequence):
+        # prepare sequence for simulation
+        s = [0]*self.latency
+        for d in sequence:
+            s.append(d)
+        # simulate bitslip
+        r = []
+        for i in range(len(s)-1):
+            v = (s[i+1] << self.data_width) | s[i]
+            v = v >> bitslip
+            v &= 2**self.data_width-1
+            r.append(v)
+        return r
+
+
+def main_generator(dut):
+    dut.o_sequence = []
+    yield dut.value.eq(dut.bitslip)
+    for i, data in enumerate(dut.i_sequence):
+        yield dut.i.eq(data)
+        dut.o_sequence.append((yield dut.o))
+        yield
+
+
+class TestBitSlip(unittest.TestCase):
+    def bitslip_test(self, data_width, length=128):
+        prng = random.Random(42)
+        sequence = [prng.randrange(2**data_width) for i in range(length)]
+
+        for i in range(data_width):
+            dut = BitSlip(data_width)
+            dut.bitslip = i
+            dut.i_sequence = sequence
+            run_simulation(dut, main_generator(dut))
+
+            model = BitSlipModel(data_width, 4)
+            m_sequence = model.simulate(i, sequence)
+
+            self.assertEqual(dut.o_sequence, m_sequence[:len(dut.o_sequence)])
+
+    def test_bitslip_4b(self):
+        self.bitslip_test(4)
+
+    def test_bitslip_8b(self):
+        self.bitslip_test(8)
+
+    def test_bitslip_16b(self):
+        self.bitslip_test(16)
+
+    def test_bitslip_32b(self):
+        self.bitslip_test(32)
+
+    def test_bitslip_64b(self):
+        self.bitslip_test(64)
+
+    def test_bitslip_128b(self):
+        self.bitslip_test(128)