66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
from amaranth.sim import Simulator
|
|
from manta.uart import UARTReceiver
|
|
from manta.utils import *
|
|
from random import sample
|
|
|
|
|
|
uart_rx = UARTReceiver(clocks_per_baud=10)
|
|
|
|
|
|
def verify_receive(data):
|
|
# 8N1 serial, LSB sent first
|
|
data_bits = "0" + f"{data:08b}"[::-1] + "1"
|
|
data_bits = [int(bit) for bit in data_bits]
|
|
|
|
valid_asserted_before = False
|
|
|
|
for i in range(10 * uart_rx.clocks_per_baud):
|
|
bit_index = i // uart_rx.clocks_per_baud
|
|
|
|
# Every cycle, run checks on uart_rx:
|
|
if (yield uart_rx.valid_o):
|
|
if (yield uart_rx.data_o) != data:
|
|
a = yield uart_rx.data_o
|
|
print(data_bits)
|
|
raise ValueError(
|
|
f"Incorrect byte presented - gave {hex(a)} instead of {hex(data)}!"
|
|
)
|
|
|
|
if bit_index != 9:
|
|
print(bit_index)
|
|
raise ValueError("Byte presented before it is complete!")
|
|
|
|
if not valid_asserted_before:
|
|
valid_asserted_before = True
|
|
|
|
else:
|
|
raise ValueError("Valid asserted more than once!")
|
|
|
|
yield uart_rx.rx.eq(data_bits[bit_index])
|
|
yield
|
|
|
|
if not valid_asserted_before:
|
|
raise ValueError("Failed to assert valid!")
|
|
|
|
|
|
def test_all_possible_bytes():
|
|
def testbench():
|
|
yield uart_rx.rx.eq(1)
|
|
yield
|
|
|
|
for i in range(0xFF):
|
|
yield from verify_receive(i)
|
|
|
|
simulate(uart_rx, testbench)
|
|
|
|
|
|
def test_bytes_random_sample():
|
|
def testbench():
|
|
yield uart_rx.rx.eq(1)
|
|
yield
|
|
|
|
for i in sample(range(0xFF), k=0xFF):
|
|
yield from verify_receive(i)
|
|
|
|
simulate(uart_rx, testbench)
|