Skip to content

Commit

Permalink
lib.fifo: fix {r,w}_level in AsyncFIFOBuffered
Browse files Browse the repository at this point in the history
  • Loading branch information
anuejn committed Nov 3, 2020
1 parent c2e4567 commit 54051b8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
9 changes: 7 additions & 2 deletions nmigen/lib/fifo.py
Expand Up @@ -506,10 +506,15 @@ def elaborate(self, platform):
fifo.w_data.eq(self.w_data),
self.w_rdy.eq(fifo.w_rdy),
fifo.w_en.eq(self.w_en),
self.w_level.eq(fifo.w_level),
]

m.d[self._r_domain] += self.r_level.eq(fifo.r_level + self.r_rdy - self.r_en)
r_consume_buffered = Signal()
m.d.comb += r_consume_buffered.eq(self.r_rdy - self.r_en)
m.d[self._r_domain] += self.r_level.eq(fifo.r_level + r_consume_buffered)

w_consume_buffered = Signal()
m.submodules.consume_buffered_cdc = AsyncFFSynchronizer(r_consume_buffered, w_consume_buffered, o_domain=self._w_domain)
m.d.comb += self.w_level.eq(fifo.w_level + w_consume_buffered)

with m.If(self.r_en | ~self.r_rdy):
m.d[self._r_domain] += [
Expand Down
19 changes: 19 additions & 0 deletions tests/test_lib_fifo.py
Expand Up @@ -282,6 +282,7 @@ def test_async_buffered(self):
self.check_async_fifo(AsyncFIFOBuffered(width=8, depth=4))


# we need this testcase because we cant do model equivalence checking on the async fifos (at the moment)
class AsyncFIFOSimCase(FHDLTestCase):
def test_async_fifo_r_level_latency(self):
fifo = AsyncFIFO(width=32, depth=10, r_domain="sync", w_domain="sync")
Expand Down Expand Up @@ -331,6 +332,24 @@ def read_process():
with simulator.write_vcd("test.vcd"):
simulator.run()

<<<<<<< HEAD
def test_async_fifo_level_full(self):
fifo = AsyncFIFO(width=32, depth=8, r_domain="read", w_domain="write")
self.check_async_fifo_level(fifo, fill_in=10, expected_level=8)
=======
def test_async_fifo_level(self):
fifo = AsyncFIFO(width=32, depth=8, r_domain="read", w_domain="write")
self.check_async_fifo_level(fifo, fill_in=5, expected_level=5)

def test_async_fifo_level_full(self):
fifo = AsyncFIFO(width=32, depth=8, r_domain="read", w_domain="write")
self.check_async_fifo_level(fifo, fill_in=10, expected_level=8)

def test_async_buffered_fifo_level(self):
fifo = AsyncFIFOBuffered(width=32, depth=9, r_domain="read", w_domain="write")
self.check_async_fifo_level(fifo, fill_in=5, expected_level=5)

def test_async_buffered_fifo_level_full(self):
fifo = AsyncFIFOBuffered(width=32, depth=9, r_domain="read", w_domain="write")
self.check_async_fifo_level(fifo, fill_in=10, expected_level=9)
>>>>>>> 474b44d (add simulation test to AsyncFIFO; fix overflow in {r,w}_level)

0 comments on commit 54051b8

Please sign in to comment.