Source code for hwtLib.handshaked.fifoAsync

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from hwt.interfaces.std import Clk, Rst_n, VectSignal
from hwt.math import log2ceil, isPow2
from hwt.serializer.mode import serializeParamsUniq
from hwt.synthesizer.param import Param
from hwtLib.handshaked.fifo import HandshakedFifo
from hwtLib.mem.fifoAsync import FifoAsync


[docs]@serializeParamsUniq class HsFifoAsync(HandshakedFifo): """ Asynchronous FIFO using BRAM/LUT memory, based on: :note: same functionality as :class:`hwtLib.handshaked.fifo.HandshakedFifo` except it has separated clock for input/output .. hwt-autodoc:: _example_HsFifoAsync """ def _config(self): HandshakedFifo._config(self) self.IN_FREQ = Param(int(100e6)) self.OUT_FREQ = Param(int(100e6)) def _declr(self): assert isPow2(self.DEPTH - 1), ( "DEPTH has to be 2**n + 1" " because fifo has have DEPTH 2**n" " and 1 item is stored on output reg", self.DEPTH) self.dataIn_clk = Clk() self.dataOut_clk = Clk() with self._paramsShared(): with self._associated(clk=self.dataIn_clk): self.dataIn_rst_n = Rst_n() with self._associated(rst=self.dataIn_rst_n): self.dataIn = self.intfCls() with self._associated(clk=self.dataOut_clk): self.dataOut_rst_n = Rst_n() with self._associated(rst=self.dataOut_rst_n): self.dataOut = self.intfCls()._m() f = self.fifo = FifoAsync() f.IN_FREQ = self.IN_FREQ f.OUT_FREQ = self.OUT_FREQ DW = self.dataIn._bit_length() - 2 # 2 for control (valid, ready) f.DATA_WIDTH = DW # because the output register is used as another item storage f.DEPTH = self.DEPTH - 1 f.EXPORT_SIZE = self.EXPORT_SIZE f.EXPORT_SPACE = self.EXPORT_SPACE SIZE_W = log2ceil(self.DEPTH + 1 + 1) if self.EXPORT_SIZE: self.size = VectSignal(SIZE_W, signed=False) if self.EXPORT_SPACE: self.space = VectSignal(SIZE_W, signed=False) def _impl(self): HandshakedFifo._impl( self, clk_rst=( (self.dataIn_clk, self.dataIn_rst_n), (self.dataOut_clk, self.dataOut_rst_n) ) )
[docs]def _example_HsFifoAsync(): from hwt.interfaces.std import Handshaked u = HsFifoAsync(Handshaked) u.DEPTH = 5 return u
if __name__ == "__main__": from hwt.synthesizer.utils import to_rtl_str u = _example_HsFifoAsync() print(to_rtl_str(u))