forked from librebmc/lpcperipheral
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.3 KiB
Python
152 lines
5.3 KiB
Python
3 years ago
|
import unittest
|
||
|
|
||
|
from nmigen.sim import Simulator
|
||
|
|
||
|
from lpcperipheral.vuart import VUart, RegEnum, LCR_DLAB
|
||
|
from .helpers import Helpers
|
||
|
|
||
|
|
||
|
class TestSum(unittest.TestCase, Helpers):
|
||
|
def setUp(self):
|
||
|
self.dut = VUart()
|
||
|
|
||
|
def test_vuart(self):
|
||
|
def bench():
|
||
|
yield
|
||
|
|
||
|
# Test reading and writing to LCR, MCR, MSR, SCR
|
||
|
val = 0xF
|
||
|
for r in (RegEnum.LCR, RegEnum.MCR, RegEnum.MSR, RegEnum.SCR):
|
||
|
yield from self.wishbone_write(self.dut.wb, r, val)
|
||
|
yield from self.wishbone_read(self.dut.wb, r, val)
|
||
|
val = val + 1
|
||
|
|
||
|
# Test writing to FCR (write only)
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.IIR_FCR, val)
|
||
|
|
||
|
# Test reading from LSR (THRE and TEMT bits should be set)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.LSR, 0b01100000)
|
||
|
|
||
|
# Test reading from LSR with data ready (RD, THRE and TEMT bits should be set)
|
||
|
yield self.dut.r_rdy.eq(1)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.LSR, 0b01100001)
|
||
|
|
||
|
# Set DLAB bit
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.LCR, 1 << LCR_DLAB)
|
||
|
|
||
|
# Test reading and writing to DLL and DLM
|
||
|
for r in (RegEnum.RXTX_DLL, RegEnum.IER_DLM):
|
||
|
yield from self.wishbone_write(self.dut.wb, r, val)
|
||
|
yield from self.wishbone_read(self.dut.wb, r, val)
|
||
|
val = val + 1
|
||
|
|
||
|
# Clear DLAB bit
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.LCR, 0x00)
|
||
|
|
||
|
# Test read from non empty FIFO
|
||
|
yield self.dut.r_rdy.eq(1)
|
||
|
yield self.dut.r_data.eq(0x45)
|
||
|
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.RXTX_DLL, 0x45)
|
||
|
self.assertEqual((yield self.dut.r_en), 1)
|
||
|
self.assertEqual((yield self.dut.r_data), 0x45)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.r_en), 0)
|
||
|
|
||
|
# Test read from empty FIFO, check we don't attempt a read from the FIFO
|
||
|
# and we return 0 over wishbone
|
||
|
yield self.dut.r_rdy.eq(0)
|
||
|
yield self.dut.r_data.eq(0x33)
|
||
|
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.RXTX_DLL, 0x00)
|
||
|
self.assertEqual((yield self.dut.r_en), 0)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.r_en), 0)
|
||
|
|
||
|
# Test write to non full FIFO
|
||
|
yield self.dut.w_rdy.eq(1)
|
||
|
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.RXTX_DLL, 0x65)
|
||
|
self.assertEqual((yield self.dut.w_en), 1)
|
||
|
self.assertEqual((yield self.dut.w_data), 0x65)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.w_en), 0)
|
||
|
|
||
|
# Test write to full FIFO
|
||
|
yield self.dut.w_rdy.eq(0)
|
||
|
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.RXTX_DLL, 0x77)
|
||
|
self.assertEqual((yield self.dut.w_en), 0)
|
||
|
|
||
|
# XXX Need to test ier lsr
|
||
|
# IIR - read only
|
||
|
# IER
|
||
|
|
||
|
sim = Simulator(self.dut)
|
||
|
sim.add_clock(1e-6) # 1 MHz
|
||
|
sim.add_sync_process(bench)
|
||
|
with sim.write_vcd("test_vuart.vcd"):
|
||
|
sim.run()
|
||
|
|
||
|
def test_vuart_irqs(self):
|
||
|
def bench():
|
||
|
yield
|
||
|
|
||
|
# Clear DLAB bit
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.LCR, 0x00)
|
||
|
|
||
|
# Test RX irq
|
||
|
|
||
|
# No irqs if IER=0
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.IER_DLM, 0x0)
|
||
|
self.assertEqual((yield self.dut.irq), 0)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0001)
|
||
|
|
||
|
# Set RX FIFO not empty
|
||
|
yield self.dut.r_rdy.eq(1)
|
||
|
yield self.dut.r_data.eq(0x45)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.irq), 0)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0001)
|
||
|
|
||
|
# RX irq if bit 1 is set
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.IER_DLM, 0x1)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.irq), 1)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0100)
|
||
|
|
||
|
# No RX irq if IER=1 but empty RX FIFO
|
||
|
yield self.dut.r_rdy.eq(0)
|
||
|
yield self.dut.r_data.eq(0x00)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.irq), 0)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0001)
|
||
|
|
||
|
# Test TX irq
|
||
|
|
||
|
# TX irq whenever IER bit 2 is set
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.IER_DLM, 0x2)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.irq), 1)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0010)
|
||
|
|
||
|
# Test TX and RX irq together
|
||
|
|
||
|
# Test RX irq priority over TX
|
||
|
yield from self.wishbone_write(self.dut.wb, RegEnum.IER_DLM, 0x3)
|
||
|
yield self.dut.r_rdy.eq(1)
|
||
|
yield self.dut.r_data.eq(0x45)
|
||
|
yield
|
||
|
self.assertEqual((yield self.dut.irq), 1)
|
||
|
yield from self.wishbone_read(self.dut.wb, RegEnum.IIR_FCR, 0b0100)
|
||
|
|
||
|
sim = Simulator(self.dut)
|
||
|
sim.add_clock(1e-6) # 1 MHz
|
||
|
sim.add_sync_process(bench)
|
||
|
with sim.write_vcd("test_vuart_irqs.vcd"):
|
||
|
sim.run()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|