litedram/test/test_fifo.py

74 lines
2.2 KiB
Python

# This file is Copyright (c) 2019 Florent Kermarrec <florent@enjoy-digital.fr>
# License: BSD
import unittest
import random
from migen import *
from litex.soc.interconnect.stream import *
from litedram.common import LiteDRAMNativeWritePort
from litedram.common import LiteDRAMNativeReadPort
from litedram.frontend.fifo import LiteDRAMFIFO
from test.common import *
class FIFODUT(Module):
def __init__(self):
# ports
self.write_port = LiteDRAMNativeWritePort(address_width=32, data_width=32)
self.read_port = LiteDRAMNativeReadPort(address_width=32, data_width=32)
# fifo
self.submodules.fifo = LiteDRAMFIFO(
data_width = 32,
depth = 64,
base = 0,
write_port = self.write_port,
read_port = self.read_port,
read_threshold = 8,
write_threshold = 64-8
)
# memory
self.memory = DRAMMemory(32, 256)
class TestFIFO(unittest.TestCase):
def test_fifo(self):
def generator(dut, valid_random=90):
prng = random.Random(42)
for i in range(128 + 8):
while prng.randrange(100) < valid_random:
yield
yield dut.fifo.sink.valid.eq(1)
yield dut.fifo.sink.data.eq(i)
yield
while (yield dut.fifo.sink.ready) != 1:
yield
yield dut.fifo.sink.valid.eq(0)
def checker(dut, ready_random=90):
prng = random.Random(42)
for i in range(128):
yield dut.fifo.source.ready.eq(0)
yield
while (yield dut.fifo.source.valid) != 1:
yield
while prng.randrange(100) < ready_random:
yield
yield dut.fifo.source.ready.eq(1)
self.assertEqual((yield dut.fifo.source.data), i)
yield
dut = FIFODUT()
generators = [
generator(dut),
checker(dut),
dut.memory.write_handler(dut.write_port),
dut.memory.read_handler(dut.read_port)
]
run_simulation(dut, generators)