58 lines
1.4 KiB
Python
58 lines
1.4 KiB
Python
|
|
from amaranth.sim import Simulator
|
||
|
|
from manta.uart import UARTTransmitter
|
||
|
|
from manta.utils import *
|
||
|
|
from random import sample
|
||
|
|
|
||
|
|
|
||
|
|
uart_tx = UARTTransmitter(clocks_per_baud=10)
|
||
|
|
|
||
|
|
|
||
|
|
def verify_bit_sequence(byte):
|
||
|
|
"""
|
||
|
|
Request a byte to be transmitted, and verify that the sequence of bits is correct.
|
||
|
|
"""
|
||
|
|
|
||
|
|
# Request byte to be transmitted
|
||
|
|
yield uart_tx.data_i.eq(byte)
|
||
|
|
yield uart_tx.start_i.eq(1)
|
||
|
|
yield
|
||
|
|
yield uart_tx.data_i.eq(0)
|
||
|
|
yield uart_tx.start_i.eq(0)
|
||
|
|
yield
|
||
|
|
|
||
|
|
# Check that data bit is correct on every clock baud period
|
||
|
|
|
||
|
|
# 8N1 serial, LSB sent first
|
||
|
|
data_bits = "0" + f"{byte:08b}"[::-1] + "1"
|
||
|
|
data_bits = [int(bit) for bit in data_bits]
|
||
|
|
|
||
|
|
for i in range(10 * uart_tx.clocks_per_baud):
|
||
|
|
bit_index = i // uart_tx.clocks_per_baud
|
||
|
|
|
||
|
|
if (yield uart_tx.tx) != data_bits[bit_index]:
|
||
|
|
raise ValueError("Wrong bit in sequence!")
|
||
|
|
|
||
|
|
if (yield uart_tx.done_o) and (bit_index != 9):
|
||
|
|
raise ValueError("Done asserted too early!")
|
||
|
|
|
||
|
|
yield
|
||
|
|
|
||
|
|
if not (yield uart_tx.done_o):
|
||
|
|
raise ValueError("Done not asserted at end of transmission!")
|
||
|
|
|
||
|
|
|
||
|
|
def test_all_possible_bytes():
|
||
|
|
def testbench():
|
||
|
|
for i in range(0xFF):
|
||
|
|
yield from verify_bit_sequence(i)
|
||
|
|
|
||
|
|
simulate(uart_tx, testbench)
|
||
|
|
|
||
|
|
|
||
|
|
def test_bytes_random_sample():
|
||
|
|
def testbench():
|
||
|
|
for i in sample(range(0xFF), k=0xFF):
|
||
|
|
yield from verify_bit_sequence(i)
|
||
|
|
|
||
|
|
simulate(uart_tx, testbench)
|