Cache signal presence

Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
Alex Forencich
2023-01-20 15:48:23 -08:00
parent 39686b849a
commit be6d490adb

View File

@@ -485,17 +485,25 @@ class AxiStreamSource(AxiStreamBase, AxiStreamPause):
frame_offset = 0 frame_offset = 0
self.active = False self.active = False
has_tready = hasattr(self.bus, "tready")
has_tvalid = hasattr(self.bus, "tvalid")
has_tlast = hasattr(self.bus, "tlast")
has_tkeep = hasattr(self.bus, "tkeep")
has_tid = hasattr(self.bus, "tid")
has_tdest = hasattr(self.bus, "tdest")
has_tuser = hasattr(self.bus, "tuser")
clock_edge_event = RisingEdge(self.clock) clock_edge_event = RisingEdge(self.clock)
while True: while True:
await clock_edge_event await clock_edge_event
# read handshake signals # read handshake signals
tready_sample = (not hasattr(self.bus, "tready")) or self.bus.tready.value tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not hasattr(self.bus, "tvalid")) or self.bus.tvalid.value tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
if (tready_sample and tvalid_sample) or not tvalid_sample: if (tready_sample and tvalid_sample) or not tvalid_sample:
if frame is None and not self.queue.empty(): if not frame and not self.queue.empty():
frame = self.queue.get_nowait() frame = self.queue.get_nowait()
self.dequeue_event.set() self.dequeue_event.set()
self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_bytes -= len(frame)
@@ -533,22 +541,22 @@ class AxiStreamSource(AxiStreamBase, AxiStreamPause):
break break
self.bus.tdata.value = tdata_val self.bus.tdata.value = tdata_val
if hasattr(self.bus, "tvalid"): if has_tvalid:
self.bus.tvalid.value = 1 self.bus.tvalid.value = 1
if hasattr(self.bus, "tlast"): if has_tlast:
self.bus.tlast.value = tlast_val self.bus.tlast.value = tlast_val
if hasattr(self.bus, "tkeep"): if has_tkeep:
self.bus.tkeep.value = tkeep_val self.bus.tkeep.value = tkeep_val
if hasattr(self.bus, "tid"): if has_tid:
self.bus.tid.value = tid_val self.bus.tid.value = tid_val
if hasattr(self.bus, "tdest"): if has_tdest:
self.bus.tdest.value = tdest_val self.bus.tdest.value = tdest_val
if hasattr(self.bus, "tuser"): if has_tuser:
self.bus.tuser.value = tuser_val self.bus.tuser.value = tuser_val
else: else:
if hasattr(self.bus, "tvalid"): if has_tvalid:
self.bus.tvalid.value = 0 self.bus.tvalid.value = 0
if hasattr(self.bus, "tlast"): if has_tlast:
self.bus.tlast.value = 0 self.bus.tlast.value = 0
self.active = bool(frame) self.active = bool(frame)
if not frame and self.queue.empty(): if not frame and self.queue.empty():
@@ -619,17 +627,25 @@ class AxiStreamMonitor(AxiStreamBase):
frame = None frame = None
self.active = False self.active = False
has_tready = hasattr(self.bus, "tready")
has_tvalid = hasattr(self.bus, "tvalid")
has_tlast = hasattr(self.bus, "tlast")
has_tkeep = hasattr(self.bus, "tkeep")
has_tid = hasattr(self.bus, "tid")
has_tdest = hasattr(self.bus, "tdest")
has_tuser = hasattr(self.bus, "tuser")
clock_edge_event = RisingEdge(self.clock) clock_edge_event = RisingEdge(self.clock)
while True: while True:
await clock_edge_event await clock_edge_event
# read handshake signals # read handshake signals
tready_sample = (not hasattr(self.bus, "tready")) or self.bus.tready.value tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not hasattr(self.bus, "tvalid")) or self.bus.tvalid.value tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
if tready_sample and tvalid_sample: if tready_sample and tvalid_sample:
if frame is None: if not frame:
if self.byte_size == 8: if self.byte_size == 8:
frame = AxiStreamFrame(bytearray(), [], [], [], []) frame = AxiStreamFrame(bytearray(), [], [], [], [])
else: else:
@@ -639,16 +655,16 @@ class AxiStreamMonitor(AxiStreamBase):
for offset in range(self.byte_lanes): for offset in range(self.byte_lanes):
frame.tdata.append((self.bus.tdata.value.integer >> (offset * self.byte_size)) & self.byte_mask) frame.tdata.append((self.bus.tdata.value.integer >> (offset * self.byte_size)) & self.byte_mask)
if hasattr(self.bus, "tkeep"): if has_tkeep:
frame.tkeep.append((self.bus.tkeep.value.integer >> offset) & 1) frame.tkeep.append((self.bus.tkeep.value.integer >> offset) & 1)
if hasattr(self.bus, "tid"): if has_tid:
frame.tid.append(self.bus.tid.value.integer) frame.tid.append(self.bus.tid.value.integer)
if hasattr(self.bus, "tdest"): if has_tdest:
frame.tdest.append(self.bus.tdest.value.integer) frame.tdest.append(self.bus.tdest.value.integer)
if hasattr(self.bus, "tuser"): if has_tuser:
frame.tuser.append(self.bus.tuser.value.integer) frame.tuser.append(self.bus.tuser.value.integer)
if not hasattr(self.bus, "tlast") or self.bus.tlast.value: if not has_tlast or self.bus.tlast.value:
frame.sim_time_end = get_sim_time() frame.sim_time_end = get_sim_time()
self.log.info("RX frame: %s", frame) self.log.info("RX frame: %s", frame)
@@ -699,17 +715,25 @@ class AxiStreamSink(AxiStreamMonitor, AxiStreamPause):
frame = None frame = None
self.active = False self.active = False
has_tready = hasattr(self.bus, "tready")
has_tvalid = hasattr(self.bus, "tvalid")
has_tlast = hasattr(self.bus, "tlast")
has_tkeep = hasattr(self.bus, "tkeep")
has_tid = hasattr(self.bus, "tid")
has_tdest = hasattr(self.bus, "tdest")
has_tuser = hasattr(self.bus, "tuser")
clock_edge_event = RisingEdge(self.clock) clock_edge_event = RisingEdge(self.clock)
while True: while True:
await clock_edge_event await clock_edge_event
# read handshake signals # read handshake signals
tready_sample = (not hasattr(self.bus, "tready")) or self.bus.tready.value tready_sample = (not has_tready) or self.bus.tready.value
tvalid_sample = (not hasattr(self.bus, "tvalid")) or self.bus.tvalid.value tvalid_sample = (not has_tvalid) or self.bus.tvalid.value
if tready_sample and tvalid_sample: if tready_sample and tvalid_sample:
if frame is None: if not frame:
if self.byte_size == 8: if self.byte_size == 8:
frame = AxiStreamFrame(bytearray(), [], [], [], []) frame = AxiStreamFrame(bytearray(), [], [], [], [])
else: else:
@@ -719,16 +743,16 @@ class AxiStreamSink(AxiStreamMonitor, AxiStreamPause):
for offset in range(self.byte_lanes): for offset in range(self.byte_lanes):
frame.tdata.append((self.bus.tdata.value.integer >> (offset * self.byte_size)) & self.byte_mask) frame.tdata.append((self.bus.tdata.value.integer >> (offset * self.byte_size)) & self.byte_mask)
if hasattr(self.bus, "tkeep"): if has_tkeep:
frame.tkeep.append((self.bus.tkeep.value.integer >> offset) & 1) frame.tkeep.append((self.bus.tkeep.value.integer >> offset) & 1)
if hasattr(self.bus, "tid"): if has_tid:
frame.tid.append(self.bus.tid.value.integer) frame.tid.append(self.bus.tid.value.integer)
if hasattr(self.bus, "tdest"): if has_tdest:
frame.tdest.append(self.bus.tdest.value.integer) frame.tdest.append(self.bus.tdest.value.integer)
if hasattr(self.bus, "tuser"): if has_tuser:
frame.tuser.append(self.bus.tuser.value.integer) frame.tuser.append(self.bus.tuser.value.integer)
if not hasattr(self.bus, "tlast") or self.bus.tlast.value: if not has_tlast or self.bus.tlast.value:
frame.sim_time_end = get_sim_time() frame.sim_time_end = get_sim_time()
self.log.info("RX frame: %s", frame) self.log.info("RX frame: %s", frame)
@@ -742,5 +766,5 @@ class AxiStreamSink(AxiStreamMonitor, AxiStreamPause):
else: else:
self.active = bool(frame) self.active = bool(frame)
if hasattr(self.bus, "tready"): if has_tready:
self.bus.tready.value = (not self.full() and not self.pause) self.bus.tready.value = (not self.full() and not self.pause)