Source code for hwtLib.amba.axis_comp.builder
from typing import Union, Tuple
from hwt.code import If
from hwt.hdl.types.bitsConst import HBitsConst
from hwt.hdl.types.hdlType import HdlType
from hwt.hwIOs.hwIOStruct import HwIOStruct
from hwt.synthesizer.rtlLevel.rtlSignal import RtlSignal
from hwt.hwModule import HwModule
from hwtLib.abstract.streamBuilder import AbstractStreamBuilder
from hwtLib.amba.axi4s import Axi4Stream
from hwtLib.amba.axis_comp.cdc import Axi4SCdc
from hwtLib.amba.axis_comp.fifo import Axi4SFifo
from hwtLib.amba.axis_comp.fifoDrop import Axi4SFifoDrop
from hwtLib.amba.axis_comp.fifo_async import Axi4SFifoAsync
from hwtLib.amba.axis_comp.frame_deparser import Axi4S_frameDeparser
from hwtLib.amba.axis_comp.frame_parser import Axi4S_frameParser
from hwtLib.amba.axis_comp.joinPrioritized import Axi4SJoinPrioritized
from hwtLib.amba.axis_comp.reg import Axi4SReg
from hwtLib.amba.axis_comp.resizer import Axi4S_resizer
from hwtLib.amba.axis_comp.splitCopy import Axi4SSplitCopy
from hwtLib.amba.axis_comp.splitSelect import Axi4SSpliSelect
from hwtLib.amba.axis_comp.storedBurst import Axi4SStoredBurst
[docs]
class Axi4SBuilder(AbstractStreamBuilder):
"""
Helper class which simplifies building of large stream paths
"""
FifoCls = Axi4SFifo
FifoAsyncCls = Axi4SFifoAsync
FifoDropCls = Axi4SFifoDrop
RegCdcCls = Axi4SCdc
RegCls = Axi4SReg
SplitCopyCls = Axi4SSplitCopy
SplitSelectCls = Axi4SSpliSelect
ResizerCls = Axi4S_resizer
JoinPrioritizedCls = Axi4SJoinPrioritized
[docs]
def resize(self, newDataWidth):
"""
Change data width of axi stream
"""
def set_OUT_DATA_WIDTH(u):
if self.master_to_slave:
u.OUT_DATA_WIDTH = newDataWidth
else:
u.DATA_WIDTH = newDataWidth
u.OUT_DATA_WIDTH = self.end.DATA_WIDTH
return self._genericInstance(Axi4S_resizer,
"resize",
set_OUT_DATA_WIDTH)
[docs]
def startOfFrame(self) -> RtlSignal:
"""
generate start of frame signal, high when we expect new frame to start
"""
lastseen = self.parent._reg(self.name + "_sof_lastseen", def_val=1)
hwIO = self.end
ack = hwIO.valid & hwIO.ready
If(ack,
lastseen(hwIO.last)
)
return lastseen
[docs]
def parse(self, typeToParse) -> HwIOStruct:
"""
:param typeToParse: structuralized type to parse
:return: interface with parsed data (e.g. HwIOStruct for HStruct)
"""
assert self.master_to_slave
m = Axi4S_frameParser(typeToParse)
m._updateHwParamsFrom(self.end)
setattr(self.parent, self._findSuitableName("parser"), m)
self._propagateClkRstn(m)
m.dataIn(self.end)
self.lastComp = m
self.end = None
return m.dataOut
[docs]
@classmethod
def deparse(cls, parent: HwModule, typeToForge: HdlType, hwIO: Axi4Stream,
setupFn=None, name:str=None) -> Tuple["Axi4SBuilder", HwIOStruct]:
"""
generate frame assembler for specified type
:note: you can set endianity and others in setupFn
:param parent: HwModule where generated units should be instantiated
:param typeToForge: instance of HType used as template for frame to assembly
:param hwIO: class for output interface
:param setupFn: setup function for output interface
:param name: name prefix for generated units
:return: tuple (builder, interface with deparsed frame)
"""
m = Axi4S_frameDeparser(typeToForge)
if setupFn:
setupFn(m)
if name is None:
# name can not be empty due Axi4SBuilder initialization without interface
name = "deparsed"
self = cls(parent, None, name)
setattr(parent, self._findSuitableName("deparser"), m)
self._propagateClkRstn(m)
self.end = m.dataOut
self.lastComp = m
self.end = m.dataOut
return self, m.dataIn
[docs]
def buff_drop(self, items:int, export_size=False, export_space=False):
"""
Instantiate a FIFO buffer with externally controlled frame drop functionality
(use "dataIn_discard" signal)
"""
def set_params(u: Axi4SFifoDrop):
u.DEPTH = items
u.EXPORT_SIZE = export_size
u.EXPORT_SPACE = export_space
return self._genericInstance(self.FifoDropCls, "buff_drop", set_params)
[docs]
@classmethod
def constant_frame(cls,
parent: HwModule,
value: Union[bytes, Tuple[Union[int, HBitsConst, None], ...]],
data_width: int,
use_strb:bool=False,
use_keep:bool=False,
repeat=True,
name=None) -> "Axi4SBuilder":
"""
Instantiate a constant buffer which wil produce the frame of specified data
"""
m = Axi4SStoredBurst()
m.DATA = value
m.DATA_WIDTH = data_width
m.USE_STRB = use_strb
m.USE_KEEP = use_keep
m.REPEAT = repeat
if name is None:
# name can not be empty due Axi4SBuilder initialization without interface
name = "stored_burst"
self = cls(parent, None, name)
setattr(parent, self._findSuitableName("stored_burst"), m)
self._propagateClkRstn(m)
self.end = m.dataOut
self.lastComp = m
self.end = m.dataOut
return self
[docs]
def to_avalonSt(self) -> "AvalonSTBuilder":
from hwtLib.avalon.st_comp.avalonStBuilder import AvalonSTBuilder
return AvalonSTBuilder.from_axis(self.parent, self.end, self.name)