Skip to content

Commit b291032

Browse files
committed
frontend/dma/LiteDRAMDMAReader: Simplify FIFO reservation and add last generation support.
With this, last is now asserted on the last cycle of the DMA transfer, making behavior similar to WishboneDMAReader. This is useful to create packets from DRAM data.
1 parent 0ba7da9 commit b291032

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

litedram/frontend/dma.py

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,45 +70,42 @@ def __init__(self, port, fifo_depth=16, fifo_buffered=False, with_csr=False):
7070
else:
7171
raise NotImplementedError
7272

73+
# Reservation FIFO -------------------------------------------------------------------------
74+
75+
res_fifo = stream.SyncFIFO([("dummy", 1)], fifo_depth)
76+
self.submodules += res_fifo
77+
7378
# Request issuance -------------------------------------------------------------------------
74-
request_enable = Signal()
75-
request_issued = Signal()
7679

7780
if is_native:
7881
self.comb += cmd.we.eq(0)
7982
if is_axi:
8083
self.comb += cmd.size.eq(int(log2(port.data_width//8)))
8184
self.comb += [
8285
cmd.addr.eq(sink.address),
83-
cmd.valid.eq(enable & sink.valid & request_enable),
84-
sink.ready.eq(enable & cmd.ready & request_enable),
85-
request_issued.eq(cmd.valid & cmd.ready)
86+
cmd.last.eq(sink.last),
87+
cmd.valid.eq(enable & sink.valid & res_fifo.sink.ready),
88+
sink.ready.eq(enable & cmd.ready & res_fifo.sink.ready),
8689
]
87-
88-
# FIFO reservation level counter -----------------------------------------------------------
89-
# - Incremented when data is planned to be queued.
90-
# - Decremented when data is dequeued.
91-
data_dequeued = Signal()
92-
self.rsv_level = rsv_level = Signal(max=fifo_depth+1)
93-
self.sync += [
94-
If(request_issued,
95-
If(~data_dequeued, rsv_level.eq(self.rsv_level + 1))
96-
).Elif(data_dequeued,
97-
rsv_level.eq(rsv_level - 1)
98-
)
90+
self.comb += [
91+
res_fifo.sink.valid.eq(cmd.valid & cmd.ready),
92+
res_fifo.sink.last.eq(cmd.last),
9993
]
100-
self.comb += request_enable.eq(rsv_level != fifo_depth)
10194

10295
# FIFO -------------------------------------------------------------------------------------
10396
fifo = stream.SyncFIFO([("data", port.data_width)], fifo_depth, fifo_buffered)
10497
self.submodules += fifo
10598

10699
self.comb += [
107100
rdata.connect(fifo.sink, omit={"id", "resp", "dest", "user"}),
108-
fifo.source.connect(source, omit={"ready"}),
101+
fifo.source.connect(source, omit={"valid", "ready", "last"}),
102+
If(res_fifo.source.valid,
103+
source.valid.eq(fifo.source.valid),
104+
source.last.eq(res_fifo.source.last),
105+
),
109106
fifo.source.ready.eq(source.ready | ~enable), # Flush FIFO/Reservation counter when disabled.
110-
data_dequeued.eq(fifo.source.valid & fifo.source.ready)
111107
]
108+
self.comb += res_fifo.source.ready.eq(fifo.source.valid & fifo.source.ready)
112109

113110
if with_csr:
114111
self.add_csr()

0 commit comments

Comments
 (0)