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_uartrx(dut): """ First simple test """ clkedge = RisingEdge(dut.clk_i) # Connect reset reset_n = dut.reset_n_i # Instantiate UART driver uart_driver = UartDriver(dut.rx_i, dut.clk_i, 10, 8, True); # Instantiate VAI receiver vai_receiver = VaiReceiver(dut.clk_i, dut.data_o, dut.valid_o, dut.accept_i) # Drive input defaults (setimmediatevalue to avoid x asserts) dut.rx_i.setimmediatevalue(1) dut.accept_i.setimmediatevalue(0) clock = Clock(dut.clk_i, 10, units="ns") # Create a 1 us 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 uart_driver.send(val) rec = await vai_receiver.receive(); assert rec == val, "UART received data was incorrect on the {}th cycle".format(i)