Source code for hwtLib.handshaked.fifoAsync

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

from hwt.hwIOs.std import HwIOClk, HwIORst_n, HwIOVectSignal
from hwt.hwParam import HwParam
from hwt.math import log2ceil, isPow2
from hwt.pyUtils.typingFuture import override
from hwt.serializer.mode import serializeParamsUniq
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 """ @override def hwConfig(self): HandshakedFifo.hwConfig(self) self.IN_FREQ = HwParam(int(100e6)) self.OUT_FREQ = HwParam(int(100e6)) @override def hwDeclr(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 = HwIOClk() self.dataOut_clk = HwIOClk() with self._hwParamsShared(): with self._associated(clk=self.dataIn_clk): self.dataIn_rst_n = HwIORst_n() with self._associated(rst=self.dataIn_rst_n): self.dataIn = self.hwIOCls() with self._associated(clk=self.dataOut_clk): self.dataOut_rst_n = HwIORst_n() with self._associated(rst=self.dataOut_rst_n): self.dataOut = self.hwIOCls()._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 = HwIOVectSignal(SIZE_W, signed=False) if self.EXPORT_SPACE: self.space = HwIOVectSignal(SIZE_W, signed=False) @override def hwImpl(self): HandshakedFifo.hwImpl( self, clk_rst=( (self.dataIn_clk, self.dataIn_rst_n), (self.dataOut_clk, self.dataOut_rst_n) ) )
[docs] def _example_HsFifoAsync(): from hwt.hwIOs.std import HwIODataRdVld m = HsFifoAsync(HwIODataRdVld) m.DEPTH = 5 return m
if __name__ == "__main__": from hwt.synth import to_rtl_str m = _example_HsFifoAsync() print(to_rtl_str(m))