Altifigence Academy

7 / 24 · Теория

Временные требования к запросам и ответам памяти

Различайте синхронное чтение, задержанные метки и конфликты одинакового адреса.

Память — больше, чем большой массив регистров

Интерфейс памяти требует временной спецификации наряду с ёмкостью. Асинхронное чтение меняет комбинационный выход при изменении адреса. Синхронное чтение фиксирует адрес на фронте и меняет выход после него. Этим моделям нужны разные расписания. Отображение на ресурс памяти устройства также зависит от стиля кода и целевого инструмента. Здесь задаются шестнадцать восьмибитных ячеек с синхронным чтением.

Фиксируйте адрес и метку на фронте k. Соответствующие данные и задержанная метка появляются после этого фронта; первая возможность потребления — фронт k+1. Чтение за один такт не означает немедленного комбинационного ответа. Valid ответа должен следовать той же задержке. Соединение задержанного значения с текущей входной меткой нарушает последовательные запросы.

SystemVerilog
logic [7:0] mem [0:15];
logic [7:0] rd_data;
logic [3:0] rd_tag;
logic rd_valid;
always_ff @(posedge clk) begin
  if (wr_en) mem[wr_addr] <= wr_data;
  rd_valid <= req_valid;
  if (req_valid) begin
    rd_data <= mem[req_addr];
    rd_tag <= req_tag;
  end
  if (rst) rd_valid <= 1'b0;
end

В этой поведенческой модели одновременное чтение и запись одного адреса возвращает старое значение, поскольку неблокирующие присваивания читают старое состояние. Реальные примитивы памяти имеют явные режимы конфликтов и ограничения; см. режимы чтения/записи AMD UG901 и проверьте нужный режим по целевому устройству и результатам синтеза. Сброс valid не инициализирует массив.

ФронтПринятый запросЭффект
2addr=3,tag=7Зафиксировать старое mem[3]=42
3addr=4,tag=8Потребить 42,7 и зафиксировать следующее значение
4Нет запросаСнять valid ответа

Это расписание предполагает, что потребитель никогда не останавливается. Если он остановится на фронте 3, следующий ответ может перезаписать rd_data. Добавьте хранение ответов или ограничьте запросы по доступной ёмкости, учитывая уже выполняемые ответы. Явно инициализируйте тестовую память до проверки значений. Проверяйте соответствие адреса и метки, а не только данные ответа; правильное значение у неправильного запроса всё равно является ошибкой.

Попробуйте сами

При mem[3]=42 прочитайте адрес 3 и запишите в него 99 на одном фронте. Что эта модель поместит в rd_data и каким станет значение памяти? Что необходимо для остановок выхода?

Прочитать объяснение

rd_data становится 42, а mem[3] — 99. Оба присваивания читают старое состояние. Остановки требуют хранения ответов и контроля приёма, учитывающего выполняемые ответы. Отдельно проверьте режим конфликтов реальной целевой памяти.

Выбор действует в этом браузере. Его можно изменить внизу страницы.