From: Florent Kermarrec Date: Mon, 24 Apr 2017 16:50:06 +0000 (+0200) Subject: test: add test_bitslip (initially in litedram) X-Git-Tag: 24jan2021_ls180~1866 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dc66dfcb55dccd356316f3cae0002575279a72b3;p=litex.git test: add test_bitslip (initially in litedram) --- diff --git a/test/test_bitslip.py b/test/test_bitslip.py new file mode 100644 index 00000000..8927f0c0 --- /dev/null +++ b/test/test_bitslip.py @@ -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)