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.
94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
3 years ago
|
import unittest
|
||
|
|
||
|
from nmigen import Elaboratable, Module
|
||
|
from nmigen_soc.wishbone import Interface as WishboneInterface
|
||
|
from nmigen.sim import Simulator
|
||
|
|
||
|
from lpcperipheral.lpc_ctrl import LPC_Ctrl
|
||
|
|
||
|
from .ROM import ROM
|
||
|
from .helpers import Helpers
|
||
|
|
||
|
|
||
|
class LPC_AND_ROM(Elaboratable):
|
||
|
def __init__(self):
|
||
|
self.io_wb = WishboneInterface(data_width=32, addr_width=2, granularity=8)
|
||
|
self.lpc_wb = WishboneInterface(data_width=32, addr_width=26, granularity=8)
|
||
|
|
||
|
def elaborate(self, platform):
|
||
|
m = Module()
|
||
|
|
||
|
m.submodules.ctrl = ctrl = LPC_Ctrl()
|
||
|
|
||
|
m.d.comb += [
|
||
|
self.io_wb.connect(ctrl.io_wb),
|
||
|
self.lpc_wb.connect(ctrl.lpc_wb),
|
||
|
]
|
||
|
|
||
|
# Initialize ROM with the offset so we can easily determine if we are
|
||
|
# reading from the right address
|
||
|
data = range(128)
|
||
|
m.submodules.rom = rom = ROM(data=data)
|
||
|
m.d.comb += ctrl.dma_wb.connect(rom)
|
||
|
|
||
|
return m
|
||
|
|
||
|
|
||
|
class TestSum(unittest.TestCase, Helpers):
|
||
|
def setUp(self):
|
||
|
self.dut = LPC_AND_ROM()
|
||
|
|
||
|
def test_read_write(self):
|
||
|
def bench():
|
||
|
# base register, offset 0
|
||
|
# Note CSRs have an extra cycle before ack, hence delay=2
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 0, 0x12345678, delay=2)
|
||
|
yield
|
||
|
yield from self.wishbone_read(self.dut.io_wb, 0, 0x12345678, delay=2)
|
||
|
|
||
|
# mask register, offset 2
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 2, 0xBADC0FFE, delay=2)
|
||
|
yield
|
||
|
yield from self.wishbone_read(self.dut.io_wb, 2, 0xBADC0FFE, delay=2)
|
||
|
|
||
|
sim = Simulator(self.dut)
|
||
|
sim.add_clock(1e-6) # 1 MHz
|
||
|
sim.add_sync_process(bench)
|
||
|
with sim.write_vcd("test_lpc_ctrl_read_write.vcd"):
|
||
|
sim.run()
|
||
|
|
||
|
def test_base_offset(self):
|
||
|
def bench():
|
||
|
yield
|
||
|
|
||
|
# No offset, don't mask off any bits
|
||
|
# Note CSRs have an extra cycle before ack, hence delay=2
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 0, 0x0, delay=2)
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 0x2, 0xffffffff, delay=2)
|
||
|
|
||
|
for i in range(64):
|
||
|
yield from self.wishbone_read(self.dut.lpc_wb, i, i)
|
||
|
|
||
|
# Apply offset and test. The base/mask registers are in bytes
|
||
|
# So we have to convert from wishbone addresses (assuming a 32
|
||
|
# bit wishbone, multiply by 4)
|
||
|
base = 32 # In wishbone units
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 0, base * 4, delay=2)
|
||
|
for i in range(32):
|
||
|
yield from self.wishbone_read(self.dut.lpc_wb, i, i + base, delay=2)
|
||
|
|
||
|
# Apply mask and test
|
||
|
yield from self.wishbone_write(self.dut.io_wb, 0x2, 0xf * 4, delay=2)
|
||
|
for i in range(32):
|
||
|
yield from self.wishbone_read(self.dut.lpc_wb, i, ((i % 0x10) + base), delay=2)
|
||
|
|
||
|
sim = Simulator(self.dut)
|
||
|
sim.add_clock(1e-6) # 1 MHz
|
||
|
sim.add_sync_process(bench)
|
||
|
with sim.write_vcd("test_lpc_ctrl_base_offset.vcd"):
|
||
|
sim.run()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|