#!/usr/bin/env python3
import unittest
from migen import *
from migen.fhdl.decorators import CEInserter, ResetInserter
from ..utils.packet import b
from ..test.common import BaseUsbTestCase
from .shifter import TxShifter
[docs]class TestTxShifter(BaseUsbTestCase):
[docs] def shifter_test(self, vector, name):
def send(reset, ce, data):
out = ""
get = ""
empty = ""
yield dut.i_data.eq(data.pop(0))
for i in range(len(ce)+1):
if i < len(ce):
if ce[i] == "|":
continue
yield dut.reset.eq(reset[i] == '-')
yield dut.ce.eq(ce[i] == '-')
yield
if i < 1:
continue
out += str((yield dut.o_data))
o_get = yield dut.o_get
o_empty = yield dut.o_empty
get += {
0: "_",
1: "-",
}[o_get]
empty += {
0: "_",
1: "-",
}[o_empty]
if o_get:
if data:
yield dut.i_data.eq(data.pop(0))
else:
yield dut.i_data.eq(0)
if ce[i-1] == "|":
out += "|"
get += "|"
empty += "|"
return out, empty, get
def stim(width, data, reset, ce, out, empty, get):
actual_out, actual_empty, actual_get = yield from send(reset, ce, data)
self.assertSequenceEqual(out, actual_out)
self.assertSequenceEqual(empty, actual_empty)
self.assertSequenceEqual(get, actual_get)
with self.subTest(name=name, vector=vector):
fname = name.replace(' ', '_')
dut = TxShifter(vector["width"])
run_simulation(dut, stim(**vector),
vcd_name=self.make_vcd_name(testsuffix=fname))
[docs] def test_basic_shift_out_1(self):
return self.shifter_test(
dict(
width = 8,
data = [b("00000001"), b("00000001"), b("00000001"), 0],
reset = "-|________|________|________",
ce = "-|--------|--------|--------",
out = "0|00000001|00000001|00000001",
empty = "-|_______-|_______-|_______-",
get = "_|-_______|-_______|-_______",
), "basic shift out 1")
[docs] def test_basic_shift_out_2(self):
return self.shifter_test(
dict(
width = 8,
data = [b("10000000"), b("10000000"), b("10000000"), 0],
reset = "-|________|________|________",
ce = "-|--------|--------|--------",
out = "0|10000000|10000000|10000000",
empty = "-|_______-|_______-|_______-",
get = "_|-_______|-_______|-_______",
), "basic shift out 2")
[docs] def test_basic_shift_out_3(self):
return self.shifter_test(
dict(
width = 8,
data = [b("01100110"), b("10000001"), b("10000000"), 0],
reset = "-|________|________|________",
ce = "-|--------|--------|--------",
out = "0|01100110|10000001|10000000",
empty = "-|_______-|_______-|_______-",
get = "_|-_______|-_______|-_______",
), "basic shift out 3")
[docs] def test_stall_shift_out_1(self):
return self.shifter_test(
dict(
width = 8,
data = [b("00000001"), b("00000001"), b("00000001"), 0],
reset = "-|_________|________|________",
ce = "-|--_------|--------|--------",
out = "0|000000001|00000001|00000001",
empty = "-|________-|_______-|_______-",
get = "_|-________|-_______|-_______",
), "stall shift out 1")
[docs] def test_stall_shift_out_2(self):
return self.shifter_test(
dict(
width = 8,
data = [b("10000000"), b("10000000"), b("10000000"), 0],
reset = "-|_________|________|________",
ce = "-|---_-----|--------|--------",
out = "0|100000000|10000000|10000000",
empty = "-|________-|_______-|_______-",
get = "_|-________|-_______|-_______",
), "stall shift out 2")
[docs] def test_stall_shift_out_3(self):
return self.shifter_test(
dict(
width = 8,
data = [b("01100110"), b("10000001"), b("10000000"), 0],
reset = "-|_________|________|________",
ce = "-|---_-----|--------|--------",
out = "0|011100110|10000001|10000000",
empty = "-|________-|_______-|_______-",
get = "_|-________|-_______|-_______",
), "stall shift out 3")
[docs] def test_multistall_shift_out_1(self):
return self.shifter_test(
dict(
width = 8,
data = [b("00000001"), b("00000001"), b("00000001"), 0],
reset = "-|___________|_________|_________",
ce = "-|--___------|--------_|----_----",
out = "0|00000000001|000000011|000000001",
empty = "-|__________-|_______--|________-",
get = "_|-__________|-________|-________",
), "mutlistall shift out 1")
[docs] def test_multistall_shift_out_2(self):
return self.shifter_test(
dict(
width = 8,
data = [b("10000000"), b("10000000"), b("10000000"), 0],
reset = "-|____________|________|__________",
ce = "-|---____-----|--------|-_----_---",
out = "0|100000000000|10000000|1100000000",
empty = "-|___________-|_______-|_________-",
get = "_|-___________|-_______|--________",
), "mutlistall shift out 2")
[docs] def test_multistall_shift_out_3(self):
return self.shifter_test(
dict(
width = 8,
data = [b("01100110"), b("10000001"), b("10000000"), 0],
reset = "-|____________|___________|_________",
ce = "-|---____-----|--------___|-_-------",
out = "0|011111100110|10000001111|110000000",
empty = "-|___________-|_______----|________-",
get = "_|-___________|-__________|--_______",
), "mutlistall shift out 3")
if __name__ == "__main__":
unittest.main()