| @ -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) | |||||