|
@ -0,0 +1,50 @@ |
|
|
|
|
|
import logging |
|
|
|
|
|
import random |
|
|
|
|
|
import cocotb |
|
|
|
|
|
import wavedrom |
|
|
|
|
|
from Uart import UartDriver, UartReceiver |
|
|
|
|
|
from Vai import VaiDriver, VaiReceiver |
|
|
|
|
|
from cocotb.clock import Clock |
|
|
|
|
|
from cocotb.triggers import FallingEdge, RisingEdge, Timer, ReadOnly |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Reset coroutine |
|
|
|
|
|
async def reset_dut(reset_n, duration_ns): |
|
|
|
|
|
reset_n.value = 0 |
|
|
|
|
|
await Timer(duration_ns, units="ns") |
|
|
|
|
|
reset_n.value = 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@cocotb.test() |
|
|
|
|
|
async def test_uarttx(dut): |
|
|
|
|
|
""" First simple test """ |
|
|
|
|
|
|
|
|
|
|
|
clkedge = RisingEdge(dut.clk_i) |
|
|
|
|
|
|
|
|
|
|
|
# Connect reset |
|
|
|
|
|
reset_n = dut.reset_n_i |
|
|
|
|
|
|
|
|
|
|
|
# Instantiate VAI driver |
|
|
|
|
|
vai_driver = VaiDriver(dut.clk_i, dut.data_i, dut.valid_i, dut.accept_o) |
|
|
|
|
|
# Instantiate UART receiver |
|
|
|
|
|
uart_receiver = UartReceiver(dut.tx_o, dut.clk_i, 10, 8, True); |
|
|
|
|
|
|
|
|
|
|
|
# Drive input defaults (setimmediatevalue to avoid x asserts) |
|
|
|
|
|
dut.data_i.setimmediatevalue(0) |
|
|
|
|
|
dut.valid_i.setimmediatevalue(0) |
|
|
|
|
|
|
|
|
|
|
|
clock = Clock(dut.clk_i, 10, units="ns") # Create a 10 ns period clock |
|
|
|
|
|
cocotb.start_soon(clock.start()) # Start the clock |
|
|
|
|
|
|
|
|
|
|
|
# Execution will block until reset_dut has completed |
|
|
|
|
|
dut._log.info("Hold reset") |
|
|
|
|
|
await reset_dut(reset_n, 100) |
|
|
|
|
|
dut._log.info("Released reset") |
|
|
|
|
|
|
|
|
|
|
|
# Test 10 UART transmissions |
|
|
|
|
|
for i in range(10): |
|
|
|
|
|
await clkedge |
|
|
|
|
|
val = random.randint(0, 255) |
|
|
|
|
|
await vai_driver.send(val) |
|
|
|
|
|
rec = await uart_receiver.receive(); |
|
|
|
|
|
assert rec == val, "UART sent data was incorrect on the {}th cycle".format(i) |