Accept byte_size or byte_lanes arguments in AXI stream constructors if tkeep is not used
This commit is contained in:
@@ -214,7 +214,7 @@ class AxiStreamSource(object):
|
|||||||
_signals = ["tdata"]
|
_signals = ["tdata"]
|
||||||
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
||||||
|
|
||||||
def __init__(self, entity, name, clock, reset=None, *args, **kwargs):
|
def __init__(self, entity, name, clock, reset=None, byte_size=None, byte_lanes=None, *args, **kwargs):
|
||||||
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
||||||
self.entity = entity
|
self.entity = entity
|
||||||
self.clock = clock
|
self.clock = clock
|
||||||
@@ -249,7 +249,6 @@ class AxiStreamSource(object):
|
|||||||
if hasattr(self.bus, "tlast"):
|
if hasattr(self.bus, "tlast"):
|
||||||
self.bus.tlast.setimmediatevalue(0)
|
self.bus.tlast.setimmediatevalue(0)
|
||||||
if hasattr(self.bus, "tkeep"):
|
if hasattr(self.bus, "tkeep"):
|
||||||
self.byte_lanes = len(self.bus.tkeep)
|
|
||||||
self.bus.tkeep.setimmediatevalue(0)
|
self.bus.tkeep.setimmediatevalue(0)
|
||||||
if hasattr(self.bus, "tid"):
|
if hasattr(self.bus, "tid"):
|
||||||
self.bus.tid.setimmediatevalue(0)
|
self.bus.tid.setimmediatevalue(0)
|
||||||
@@ -258,6 +257,18 @@ class AxiStreamSource(object):
|
|||||||
if hasattr(self.bus, "tuser"):
|
if hasattr(self.bus, "tuser"):
|
||||||
self.bus.tuser.setimmediatevalue(0)
|
self.bus.tuser.setimmediatevalue(0)
|
||||||
|
|
||||||
|
if hasattr(self.bus, "tkeep"):
|
||||||
|
self.byte_lanes = len(self.bus.tkeep)
|
||||||
|
if byte_size is not None or byte_lanes is not None:
|
||||||
|
raise ValueError("Cannot specify byte_size or byte_lanes if tkeep is connected")
|
||||||
|
else:
|
||||||
|
if byte_lanes is not None:
|
||||||
|
self.byte_lanes = byte_lanes
|
||||||
|
if byte_size is not None:
|
||||||
|
raise ValueError("Cannot specify both byte_size and byte_lanes")
|
||||||
|
elif byte_size is not None:
|
||||||
|
self.byte_lanes = self.width // byte_size
|
||||||
|
|
||||||
self.byte_size = self.width // self.byte_lanes
|
self.byte_size = self.width // self.byte_lanes
|
||||||
self.byte_mask = 2**self.byte_size-1
|
self.byte_mask = 2**self.byte_size-1
|
||||||
|
|
||||||
@@ -284,6 +295,10 @@ class AxiStreamSource(object):
|
|||||||
else:
|
else:
|
||||||
self.log.info(" tuser: not present")
|
self.log.info(" tuser: not present")
|
||||||
|
|
||||||
|
if self.byte_lanes * self.byte_size != self.width:
|
||||||
|
raise ValueError(f"Bus does not evenly divide into byte lanes "
|
||||||
|
f"({self.byte_lanes} * {self.byte_size} != {self.width})")
|
||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def send(self, frame):
|
def send(self, frame):
|
||||||
@@ -413,7 +428,7 @@ class AxiStreamSink(object):
|
|||||||
_signals = ["tdata"]
|
_signals = ["tdata"]
|
||||||
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
||||||
|
|
||||||
def __init__(self, entity, name, clock, reset=None, *args, **kwargs):
|
def __init__(self, entity, name, clock, reset=None, byte_size=None, byte_lanes=None, *args, **kwargs):
|
||||||
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
||||||
self.entity = entity
|
self.entity = entity
|
||||||
self.clock = clock
|
self.clock = clock
|
||||||
@@ -448,8 +463,18 @@ class AxiStreamSink(object):
|
|||||||
|
|
||||||
if hasattr(self.bus, "tready"):
|
if hasattr(self.bus, "tready"):
|
||||||
self.bus.tready.setimmediatevalue(0)
|
self.bus.tready.setimmediatevalue(0)
|
||||||
|
|
||||||
if hasattr(self.bus, "tkeep"):
|
if hasattr(self.bus, "tkeep"):
|
||||||
self.byte_lanes = len(self.bus.tkeep)
|
self.byte_lanes = len(self.bus.tkeep)
|
||||||
|
if byte_size is not None or byte_lanes is not None:
|
||||||
|
raise ValueError("Cannot specify byte_size or byte_lanes if tkeep is connected")
|
||||||
|
else:
|
||||||
|
if byte_lanes is not None:
|
||||||
|
self.byte_lanes = byte_lanes
|
||||||
|
if byte_size is not None:
|
||||||
|
raise ValueError("Cannot specify both byte_size and byte_lanes")
|
||||||
|
elif byte_size is not None:
|
||||||
|
self.byte_lanes = self.width // byte_size
|
||||||
|
|
||||||
self.byte_size = self.width // self.byte_lanes
|
self.byte_size = self.width // self.byte_lanes
|
||||||
self.byte_mask = 2**self.byte_size-1
|
self.byte_mask = 2**self.byte_size-1
|
||||||
@@ -477,6 +502,10 @@ class AxiStreamSink(object):
|
|||||||
else:
|
else:
|
||||||
self.log.info(" tuser: not present")
|
self.log.info(" tuser: not present")
|
||||||
|
|
||||||
|
if self.byte_lanes * self.byte_size != self.width:
|
||||||
|
raise ValueError(f"Bus does not evenly divide into byte lanes "
|
||||||
|
f"({self.byte_lanes} * {self.byte_size} != {self.width})")
|
||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def recv(self, compact=True):
|
def recv(self, compact=True):
|
||||||
@@ -602,7 +631,7 @@ class AxiStreamMonitor(object):
|
|||||||
_signals = ["tdata"]
|
_signals = ["tdata"]
|
||||||
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
_optional_signals = ["tvalid", "tready", "tlast", "tkeep", "tid", "tdest", "tuser"]
|
||||||
|
|
||||||
def __init__(self, entity, name, clock, reset=None, *args, **kwargs):
|
def __init__(self, entity, name, clock, reset=None, byte_size=None, byte_lanes=None, *args, **kwargs):
|
||||||
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
self.log = SimLog("cocotb.%s.%s" % (entity._name, name))
|
||||||
self.entity = entity
|
self.entity = entity
|
||||||
self.clock = clock
|
self.clock = clock
|
||||||
@@ -631,6 +660,15 @@ class AxiStreamMonitor(object):
|
|||||||
|
|
||||||
if hasattr(self.bus, "tkeep"):
|
if hasattr(self.bus, "tkeep"):
|
||||||
self.byte_lanes = len(self.bus.tkeep)
|
self.byte_lanes = len(self.bus.tkeep)
|
||||||
|
if byte_size is not None or byte_lanes is not None:
|
||||||
|
raise ValueError("Cannot specify byte_size or byte_lanes if tkeep is connected")
|
||||||
|
else:
|
||||||
|
if byte_lanes is not None:
|
||||||
|
self.byte_lanes = byte_lanes
|
||||||
|
if byte_size is not None:
|
||||||
|
raise ValueError("Cannot specify both byte_size and byte_lanes")
|
||||||
|
elif byte_size is not None:
|
||||||
|
self.byte_lanes = self.width // byte_size
|
||||||
|
|
||||||
self.byte_size = self.width // self.byte_lanes
|
self.byte_size = self.width // self.byte_lanes
|
||||||
self.byte_mask = 2**self.byte_size-1
|
self.byte_mask = 2**self.byte_size-1
|
||||||
@@ -658,6 +696,10 @@ class AxiStreamMonitor(object):
|
|||||||
else:
|
else:
|
||||||
self.log.info(" tuser: not present")
|
self.log.info(" tuser: not present")
|
||||||
|
|
||||||
|
if self.byte_lanes * self.byte_size != self.width:
|
||||||
|
raise ValueError(f"Bus does not evenly divide into byte lanes "
|
||||||
|
f"({self.byte_lanes} * {self.byte_size} != {self.width})")
|
||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def recv(self, compact=True):
|
def recv(self, compact=True):
|
||||||
|
|||||||
Reference in New Issue
Block a user