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

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