Source code for hwtLib.avalon.st_comp.axi4sToAvalonSt

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

from hwt.hwIOs.utils import addClkRstn
from hwt.hwModule import HwModule
from hwt.pyUtils.typingFuture import override
from hwtLib.amba.axi4s import Axi4Stream
from hwtLib.avalon.st import AvalonST
from hwtLib.logic.countLeading import CountTrailingZeros, CountLeadingZeros


[docs] class Axi4Stream_to_AvalonST(HwModule): """ :note: expect user signal to be Concat(error, sof) .. hwt-autodoc:: _example_Axi4Stream_to_AvalonST """ @override def hwConfig(self) -> None: Axi4Stream.hwConfig(self) @override def hwDeclr(self) -> None: addClkRstn(self) with self._hwParamsShared(): self.dataIn = Axi4Stream() self.dataOut: AvalonST = AvalonST()._m() m = self.dataOut assert m.dataBitsPerSymbol == 8, self.dataBitsPerSymbol if self.ID_WIDTH: m.maxChannel = int(2 ** self.ID_WIDTH) assert m.readyLatency == 0, m.readyLatency assert not m.readyAllowance, m.readyAllowance if self.USER_WIDTH > 1: m.ERROR_WIDTH = self.USER_WIDTH - 1 m.USE_EMPTY = self.USE_KEEP or self.USE_STRB assert m.packetsPerClock == 1, m.packetsPerClock m.firstSymbolInHighOrderBits = self.IS_BIGENDIAN @override def hwImpl(self) -> None: s: Axi4Stream = self.dataIn m: AvalonST = self.dataOut if self.ID_WIDTH: m.channel(s.id) if m.USE_EMPTY: if self.USE_KEEP and self.USE_STRB: keep = s.keep & s.strb elif self.USE_KEEP: keep = s.keep else: assert self.USE_STRB keep = s.strb if self.IS_BIGENDIAN: ctz = CountLeadingZeros() else: ctz = CountTrailingZeros() ctz.DATA_WIDTH = keep._dtype.bit_length() self.ctz = ctz ctz.data_in(keep) m.empty(ctz.data_out._trunc(m.empty._dtype.bit_length())) # cttz coputes also the number for keep==0 m.vld(s.valid) s.ready(m.rd) m.data(s.data) m.endOfPacket(s.last) m.startOfPacket(s.user[0]) if self.USER_WIDTH > 1: m.error(s.user[:1])
[docs] def _example_Axi4Stream_to_AvalonST(): m = Axi4Stream_to_AvalonST() m.USE_STRB = True m.USE_KEEP = True m.ID_WIDTH = 4 m.USER_WIDTH = 1 + 4 return m
if __name__ == "__main__": from hwt.synth import to_rtl_str m = _example_Axi4Stream_to_AvalonST() print(to_rtl_str(m))