RM0082
DDR memory controller (MPMC)
Doc ID 018672 Rev 1
133/844
The behavior of commands of different types from the same source ID is dependent on the
user configuration. For Memory Controller, the placement of new READ/WRITE commands
that collide in terms of source ID with existing entries in the command queue will only
depend on other commands of the same type, not on different types. This means that, if
there are no address conflicts, a READ command could be executed ahead of a WRITE
command with the same source ID, as a WRITE command could be executed ahead of a
READ command with the same source ID as well.
This feature is always enabled.
Write buffer collision
Incoming WRITE requests in the command queue are allocated to one of the 8 WRITE
buffers of the Memory Controller core automatically based on availability. New WRITE
commands will be designated to any available buffer. However, back-to-back write requests
from a particular source ID will be allocated to the same WRITE buffer as the previous
command.
Since the Memory Controller core must pull data out of the buffers in the order it was stored,
if a WRITE command is linked to a buffer associated with another command in the queue,
the new command will be placed in the command queue after that command, regardless of
priority.
This feature is always enabled.
Priority
Priorities are used to distinguish important commands from less important commands. Each
command is given a priority based on the command type through the programmable
parameters ahbX_r_priority and ahbX_w_priority (X is the x-th port), where '0' value is the
highest priority and '7' is the lowest.
The placement algorithm will attempt to place higher priority commands ahead lower priority
commands, as long as they have no source ID, WRITE buffer or address collisions.
Higher priority commands will be placed lower in the command queue in case:
●
They access the same address and
●
They are from the same requestor or
●
They use the same buffer used by lower priority commands being in the command
queue already.
This feature is enabled through the priorities parameter.
Bank splitting
Before accesses to two different rows within the same bank could be performed, first active
row must be closed (pre-charged) and the new row must be opened (activated). Therefore,
the both activities require some timing overhead for optimization, the placement queue will
attempt to insert the new command into the command queue such that commands to other
banks may execute during this timing overhead.
Still the placement of the new commands will follow priority, source ID, WRITE buffer and
address collision rules. The placement logic will also attempt to optimize the Memory
Controller core, by inserting a command to the same bank of any existing command in the
command queue, immediately after the original command. This reduces the overall timing
overhead by potentially eliminating one pre-charge/activate cycle. This placement will only