import logging
							 | 
						|
								import random
							 | 
						|
								import cocotb
							 | 
						|
								from Uart import UartDriver
							 | 
						|
								from Vai import VaiReceiver
							 | 
						|
								from cocotb.clock import Clock
							 | 
						|
								from cocotb.triggers import RisingEdge, Timer
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								# 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 10 ns period clock
							 | 
						|
								    cocotb.start_soon(clock.start())  # Start the clock
							 | 
						|
								
							 | 
						|
								    # Execution will block until reset_dut has completed
							 | 
						|
								    await reset_dut(reset_n, 100)
							 | 
						|
								    dut._log.info("Released reset")
							 | 
						|
								
							 | 
						|
								    # Test 10 UART transmissions
							 | 
						|
								    for i in range(10):
							 | 
						|
								        await Timer(100, units="ns")
							 | 
						|
								        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)
							 |