Skip to content

Commit

Permalink
gateware.iostream.IOStreamer: let o_stream transfer if i_stream not rdy
Browse files Browse the repository at this point in the history
  • Loading branch information
purdeaandrei committed Aug 24, 2024
1 parent 579ff96 commit 5240a4d
Showing 1 changed file with 14 additions and 8 deletions.
22 changes: 14 additions & 8 deletions software/glasgow/gateware/iostream.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,18 @@ def elaborate(self, platform):
m.d.comb += buffer_parts.oe.eq(latch_parts.oe)

def delay(value, name):
delayed_values = []
for stage in range(latency):
next_value = Signal.like(value, name=f"{name}_{stage}")
m.d.sync += next_value.eq(value)
value = next_value
return value
delayed_values.append(next_value)
return delayed_values

i_en = delay(self.o_stream.valid & self.o_stream.ready &
self.o_stream.p.i_en, name="i_en")
meta = delay(self.o_stream.p.meta, name="meta")
i_en_delays = delay(self.o_stream.valid & self.o_stream.ready &
self.o_stream.p.i_en, name="i_en")
i_en = i_en_delays[-1]
meta = delay(self.o_stream.p.meta, name="meta")[-1]

# This skid buffer is organized as a shift register to avoid any uncertainties associated
# with the use of an async read memory. On platforms that have LUTRAM, this implementation
Expand All @@ -182,17 +185,20 @@ def delay(value, name):
m.d.comb += skid[0].meta.eq(meta)

skid_at = Signal(range(1 + latency))

with m.If(i_en):
for n_shift in range(latency):
m.d.sync += skid[n_shift + 1].eq(skid[n_shift])

with m.If(i_en & ~self.i_stream.ready):
# m.d.sync += Assert(skid_at != latency)
m.d.sync += skid_at.eq(skid_at + 1)
for n_shift in range(latency):
m.d.sync += skid[n_shift + 1].eq(skid[n_shift])
with m.Elif((skid_at != 0) & self.i_stream.ready):
with m.Elif((skid_at != 0) & ~i_en & self.i_stream.ready):
m.d.sync += skid_at.eq(skid_at - 1)

m.d.comb += self.i_stream.payload.eq(skid[skid_at])
m.d.comb += self.i_stream.valid.eq(i_en | (skid_at != 0))
m.d.comb += self.o_stream.ready.eq(self.i_stream.ready & (skid_at == 0))
m.d.comb += self.o_stream.ready.eq(self.i_stream.ready | (skid_at + sum(i_en_delays) < latency))

return m

Expand Down

0 comments on commit 5240a4d

Please sign in to comment.