frontend/axi: Add Write Buffer reservation mechanisms to know when we have enough data in the buffer to generate the command.

This commit is contained in:
Florent Kermarrec 2022-02-17 17:21:02 +01:00
parent 963233aefb
commit a0580c7ae7
1 changed files with 22 additions and 1 deletions

View File

@ -43,6 +43,8 @@ class LiteDRAMAXI2NativeW(Module):
# # # # # #
can_write = Signal()
ashift = log2_int(port.data_width//8) ashift = log2_int(port.data_width//8)
# Burst to Beat ---------------------------------------------------------------------------- # Burst to Beat ----------------------------------------------------------------------------
@ -76,12 +78,31 @@ class LiteDRAMAXI2NativeW(Module):
resp_buffer.source.connect(axi.b) resp_buffer.source.connect(axi.b)
] ]
# Write Buffer reservation ------------------------------------------------------------------
# - Incremented when data cmd is send
# - Decremented when data is read
w_buffer_queue = Signal()
w_buffer_dequeue = Signal()
w_buffer_level = Signal(max=buffer_depth + 1)
self.comb += [
w_buffer_queue.eq(port.cmd.valid & port.cmd.ready & port.cmd.we),
w_buffer_dequeue.eq(w_buffer.source.valid & w_buffer.source.ready)
]
self.sync += [
If(w_buffer_queue,
If(~w_buffer_dequeue, w_buffer_level.eq(w_buffer_level + 1))
).Elif(w_buffer_dequeue,
w_buffer_level.eq(w_buffer_level - 1)
)
]
self.comb += can_write.eq(w_buffer.level > w_buffer_level)
# Command ---------------------------------------------------------------------------------- # Command ----------------------------------------------------------------------------------
# Accept and send command to the controller only if: # Accept and send command to the controller only if:
# - Address & Data request are *both* valid. # - Address & Data request are *both* valid.
# - Data buffer is not empty. # - Data buffer is not empty.
self.comb += [ self.comb += [
self.cmd_request.eq(aw.valid & w_buffer.source.valid), self.cmd_request.eq(aw.valid & can_write),
If(self.cmd_request & self.cmd_grant, If(self.cmd_request & self.cmd_grant,
port.cmd.valid.eq(1), port.cmd.valid.eq(1),
port.cmd.last.eq(aw.last), port.cmd.last.eq(aw.last),