mirror of
https://github.com/myhdl/myhdl.git
synced 2024-12-14 07:44:38 +08:00
147 lines
4.0 KiB
Python
147 lines
4.0 KiB
Python
import sys
|
|
from random import randrange
|
|
import unittest
|
|
from unittest import TestCase
|
|
|
|
from rs232_rx import rs232_rx
|
|
from myhdl import Simulation, Signal, intbv, join
|
|
|
|
from rs232_tx import rs232_tx
|
|
from rs232_util import Config, EVEN, ODD, ParityError, Error
|
|
|
|
class rs232Test(TestCase):
|
|
|
|
""" rs232 functional unit test """
|
|
|
|
def default(self):
|
|
tx = Signal(intbv(0))
|
|
rx = tx
|
|
actual = intbv(0)
|
|
cfg = Config()
|
|
for i in range(256):
|
|
data = intbv(i)
|
|
yield join(rs232_tx(tx, data, cfg), rs232_rx(rx, actual, cfg))
|
|
self.assertEqual(data, actual)
|
|
|
|
def testDefault(self):
|
|
""" Check default case """
|
|
Simulation(self.default()).run(quiet=1)
|
|
|
|
def oddParity(self):
|
|
tx = Signal(intbv(0))
|
|
rx = tx
|
|
actual = intbv(0)
|
|
cfg = Config(parity=ODD)
|
|
for i in range(256):
|
|
data = intbv(i)
|
|
yield join(rs232_tx(tx, data, cfg), rs232_rx(rx, actual, cfg))
|
|
self.assertEqual(data, actual)
|
|
|
|
def testOddParity(self):
|
|
""" Check odd parity """
|
|
Simulation(self.oddParity()).run(quiet=1)
|
|
|
|
def sevenBitsEvenParity(self):
|
|
tx = Signal(intbv(0))
|
|
rx = tx
|
|
actual = intbv(0)
|
|
cfg = Config(parity=EVEN, n_bits=7)
|
|
cfg_rx = Config(parity=EVEN, n_bits=7)
|
|
for i in range(256):
|
|
data = intbv(i)
|
|
yield join(rs232_tx(tx, data, cfg), rs232_rx(rx, actual, cfg_rx))
|
|
self.assertEqual(data, actual)
|
|
|
|
def testSevenBitsEvenParity(self):
|
|
""" Check 7 bits with even parity """
|
|
Simulation(self.sevenBitsEvenParity()).run(quiet=1)
|
|
|
|
def ParityError(self):
|
|
tx = Signal(intbv(0))
|
|
rx = tx
|
|
actual = intbv(0)
|
|
cfg_rx = Config(parity=ODD)
|
|
cfg_tx = Config(parity=EVEN)
|
|
data = intbv(randrange(256))
|
|
yield join(rs232_tx(tx, data, cfg_tx), rs232_rx(rx, actual, cfg_rx))
|
|
|
|
def testParityError(self):
|
|
""" Expect a parity error """
|
|
try:
|
|
Simulation(self.ParityError()).run(quiet=1)
|
|
except ParityError:
|
|
pass
|
|
else:
|
|
self.fail("Expected parity error")
|
|
|
|
|
|
class rs232Characterize(TestCase):
|
|
|
|
""" rs232 baud rate characterization test """
|
|
|
|
def bench(self, tx_baud_rate):
|
|
tx = Signal(intbv(0))
|
|
rx = tx
|
|
actual = intbv(0)
|
|
cfg_tx = Config(baud_rate=tx_baud_rate)
|
|
cfg_rx = Config()
|
|
for i in range(256):
|
|
data = intbv(i)
|
|
yield join(rs232_tx(tx, data, cfg_tx), rs232_rx(rx, actual, cfg_rx))
|
|
if not data == actual:
|
|
raise Error
|
|
|
|
def testCharacterize(self):
|
|
""" Find min/max tx baud rate tolerance by simulation """
|
|
coarseOffset = 100
|
|
fineOffset = 5
|
|
tx_baud_rate = 9600
|
|
try:
|
|
while 1:
|
|
tx_baud_rate += coarseOffset
|
|
Simulation(self.bench(tx_baud_rate)).run(quiet=1)
|
|
except Error:
|
|
pass
|
|
while 1:
|
|
try:
|
|
tx_baud_rate -= fineOffset
|
|
Simulation(self.bench(tx_baud_rate)).run(quiet=1)
|
|
except Error:
|
|
continue
|
|
else:
|
|
print "Max tx baudrate: %s" % tx_baud_rate
|
|
break
|
|
tx_baud_rate = 9600
|
|
try:
|
|
while 1:
|
|
tx_baud_rate -= coarseOffset
|
|
Simulation(self.bench(tx_baud_rate)).run(quiet=1)
|
|
except Error:
|
|
pass
|
|
while 1:
|
|
try:
|
|
tx_baud_rate += fineOffset
|
|
Simulation(self.bench(tx_baud_rate)).run(quiet=1)
|
|
except Error:
|
|
continue
|
|
else:
|
|
print "Min tx baudrate: %s" % tx_baud_rate
|
|
break
|
|
|
|
|
|
if __name__ == "__main__":
|
|
testRunner = unittest.TextTestRunner(verbosity=2)
|
|
unittest.main(testRunner=testRunner)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|