2
0
mirror of https://github.com/m-labs/artiq.git synced 2025-02-02 22:00:20 +08:00

analyzer: revert lookahead buffer

CTI can be inferred by the last signal.
This commit is contained in:
occheung 2025-01-10 16:08:30 +08:00
parent 7a5e5e4ab4
commit 41933b8849

View File

@ -151,56 +151,25 @@ class DMAWriter(Module, AutoCSR):
alignment_bits=data_alignment) alignment_bits=data_alignment)
self.byte_count = CSRStatus(64) # only read when shut down self.byte_count = CSRStatus(64) # only read when shut down
layout = [ self.sink = stream.Endpoint(
("data", dw), [("data", dw),
("valid_token_count", bits_for(messages_per_dw)) ("valid_token_count", bits_for(messages_per_dw))])
]
self.sink = stream.Endpoint(layout)
self.done = Signal()
# # # # # #
lookahead_buf = stream.Endpoint(layout)
buffer_open = Signal()
self.comb += [ self.comb += [
buffer_open.eq(~lookahead_buf.stb | lookahead_buf.ack), membus.cyc.eq(self.sink.stb),
self.sink.ack.eq(buffer_open), membus.stb.eq(self.sink.stb),
] membus.cti.eq(Mux(self.sink.last, 0b111, 0b010)),
self.sync += [ self.sink.ack.eq(membus.ack),
If(buffer_open,
self.sink.connect(lookahead_buf, omit={"ack"}),
),
]
# RULE 4.30: Set End-Of-Burst to signal the end of the current burst.
last = Signal()
stale_last = Signal()
self.comb += last.eq(lookahead_buf.eop | (lookahead_buf.stb & ~self.sink.stb))
self.sync += \
If(~buffer_open,
If(last, stale_last.eq(1)),
).Else(
stale_last.eq(0)
)
# Write operations completes once EoP is transmitted
self.comb += self.done.eq(
lookahead_buf.stb & lookahead_buf.ack & lookahead_buf.eop)
self.comb += [
membus.cyc.eq(lookahead_buf.stb),
membus.stb.eq(lookahead_buf.stb),
membus.cti.eq(Mux(last | stale_last, 0b111, 0b010)),
lookahead_buf.ack.eq(membus.ack),
membus.we.eq(1), membus.we.eq(1),
membus.dat_w.eq(dma.convert_signal(lookahead_buf.data, cpu_dw//8)) membus.dat_w.eq(dma.convert_signal(self.sink.data, cpu_dw//8))
] ]
if messages_per_dw > 1: if messages_per_dw > 1:
for i in range(dw//8): for i in range(dw//8):
self.comb += membus.sel[i].eq( self.comb += membus.sel[i].eq(
lookahead_buf.valid_token_count >= i//(256//8)) self.sink.valid_token_count >= i//(256//8))
else: else:
self.comb += membus.sel.eq(2**(dw//8)-1) self.comb += membus.sel.eq(2**(dw//8)-1)
@ -222,7 +191,7 @@ class DMAWriter(Module, AutoCSR):
self.sync += [ self.sync += [
If(self.reset.re, message_count.eq(0)), If(self.reset.re, message_count.eq(0)),
If(membus.ack, message_count.eq( If(membus.ack, message_count.eq(
message_count + lookahead_buf.valid_token_count)) message_count + self.sink.valid_token_count))
] ]
@ -247,8 +216,8 @@ class Analyzer(Module, AutoCSR):
enable_r.eq(self.enable.storage), enable_r.eq(self.enable.storage),
If(self.enable.storage & ~enable_r, If(self.enable.storage & ~enable_r,
self.busy.status.eq(1)), self.busy.status.eq(1)),
If(self.dma.done, If(self.dma.sink.stb & self.dma.sink.ack & self.dma.sink.eop,
self.busy.status.eq(0)), self.busy.status.eq(0))
] ]
self.comb += [ self.comb += [