manta/test/test_uart_tx_sim.py

51 lines
1.3 KiB
Python
Raw Permalink Normal View History

2023-12-28 23:22:29 +01:00
from manta.uart import UARTTransmitter
from manta.utils import *
uart_tx = UARTTransmitter(clocks_per_baud=10)
2024-06-20 20:47:34 +02:00
async def verify_bit_sequence(ctx, byte):
2023-12-28 23:22:29 +01:00
"""
Request a byte to be transmitted, and verify that the sequence of bits is correct.
"""
# Request byte to be transmitted
2024-06-20 20:47:34 +02:00
ctx.set(uart_tx.data_i, byte)
ctx.set(uart_tx.start_i, 1)
await ctx.tick()
ctx.set(uart_tx.data_i, 0)
ctx.set(uart_tx.start_i, 0)
2023-12-28 23:22:29 +01:00
# 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]
2024-02-19 00:50:51 +01:00
for i in range(10 * uart_tx._clocks_per_baud):
bit_index = i // uart_tx._clocks_per_baud
2023-12-28 23:22:29 +01:00
2024-06-20 20:47:34 +02:00
if ctx.get(uart_tx.tx) != data_bits[bit_index]:
2023-12-28 23:22:29 +01:00
raise ValueError("Wrong bit in sequence!")
2024-06-20 20:47:34 +02:00
if ctx.get(uart_tx.done_o) and (bit_index != 9):
2023-12-28 23:22:29 +01:00
raise ValueError("Done asserted too early!")
2024-06-20 20:47:34 +02:00
await ctx.tick()
2023-12-28 23:22:29 +01:00
2024-06-20 20:47:34 +02:00
if not ctx.get(uart_tx.done_o):
2023-12-28 23:22:29 +01:00
raise ValueError("Done not asserted at end of transmission!")
2024-03-03 11:14:12 +01:00
@simulate(uart_tx)
2024-06-20 20:47:34 +02:00
async def test_all_possible_bytes(ctx):
2024-03-03 11:14:12 +01:00
for i in range(0xFF):
2024-06-20 20:47:34 +02:00
await verify_bit_sequence(ctx, i)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
@simulate(uart_tx)
2024-06-20 20:47:34 +02:00
async def test_bytes_random_sample(ctx):
2024-03-04 09:17:36 +01:00
for i in jumble(range(0xFF)):
2024-06-20 20:47:34 +02:00
await verify_bit_sequence(ctx, i)