lib.fifo: fix {r,w}_level in AsyncFIFOBuffered
This commit is contained in:
		
							parent
							
								
									c7014f84ea
								
							
						
					
					
						commit
						b15f0562a6
					
				|  | @ -506,10 +506,15 @@ class AsyncFIFOBuffered(Elaboratable, FIFOInterface): | ||||||
|             fifo.w_data.eq(self.w_data), |             fifo.w_data.eq(self.w_data), | ||||||
|             self.w_rdy.eq(fifo.w_rdy), |             self.w_rdy.eq(fifo.w_rdy), | ||||||
|             fifo.w_en.eq(self.w_en), |             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): |         with m.If(self.r_en | ~self.r_rdy): | ||||||
|             m.d[self._r_domain] += [ |             m.d[self._r_domain] += [ | ||||||
|  |  | ||||||
|  | @ -282,6 +282,7 @@ class FIFOFormalCase(FHDLTestCase): | ||||||
|         self.check_async_fifo(AsyncFIFOBuffered(width=8, depth=4)) |         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): | class AsyncFIFOSimCase(FHDLTestCase): | ||||||
|     def test_async_fifo_r_level_latency(self): |     def test_async_fifo_r_level_latency(self): | ||||||
|         fifo = AsyncFIFO(width=32, depth=10, r_domain="sync", w_domain="sync") |         fifo = AsyncFIFO(width=32, depth=10, r_domain="sync", w_domain="sync") | ||||||
|  | @ -331,6 +332,18 @@ class AsyncFIFOSimCase(FHDLTestCase): | ||||||
|         with simulator.write_vcd("test.vcd"): |         with simulator.write_vcd("test.vcd"): | ||||||
|             simulator.run() |             simulator.run() | ||||||
| 
 | 
 | ||||||
|  |     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): |     def test_async_fifo_level_full(self): | ||||||
|         fifo = AsyncFIFO(width=32, depth=8, r_domain="read", w_domain="write") |         fifo = AsyncFIFO(width=32, depth=8, r_domain="read", w_domain="write") | ||||||
|         self.check_async_fifo_level(fifo, fill_in=10, expected_level=8) |         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) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jaro Habiger
						Jaro Habiger