Altifigence Academy

14 / 24 · Теория

Ready/valid и остановленное состояние

Выходная ступень удерживает A с out_ready=0 при достоверном входе B. Что должны сделать ступень и производитель на следующем фронте?

Продвигайте только при передаче

Производитель устанавливает valid при доступности текущего элемента. Потребитель устанавливает ready, когда может его принять. На переднем фронте с обоими установленными происходит одна передача. Только тогда продвигайте координаты пикселя, строчный буфер и связанный вход накопления. Продвижение по одному valid теряет данные при паузе потребителя; по одному ready считает несуществующий вход.

При высоком valid и низком ready сохраняйте те же данные и valid. Чтобы продолжать принимать вход при блокированном выходе, предоставьте хранение и выводите готовность из оставшейся ёмкости. Пример RTL — ступень на один элемент: она принимает новый, когда пуста или текущий может выйти.

Разобранная последовательность передач

Для тактов ноль–четыре valid=[0,1,1,1,1] и ready=[0,1,0,1,1] дают fire=[0,1,0,1,1]. Пять тактов принимают три пикселя. Элемент, остановленный в такте два, остаётся до такта три. Счётчик строк ширины четыре ещё не завершил первую строку. Подсчёт тактов вместо передач сдвигает координаты всех последующих окон.

Если ступень удерживает A при высоком out_valid и низком out_ready, in_ready низок и A остаётся сохранённым. Когда out_ready становится высоким, она может отправить A и принять B на одном фронте. Без замещающего входа она снимает выходной valid. Документируйте разрешение одновременной замены и подразумеваемую задержку.

Reset очищает достоверность вместе с данными. Новому кадру нужен определённый сброс координат и достоверности окна. Приём последнего входа отличается от потребления последнего выхода; слишком ранний done может позволить новому кадру перезаписать незавершённую работу.

Код — ступень передачи, а не полный движок свёртки. Если установленный рабочий процесс поддерживает редактирование и симуляцию SystemVerilog, вручную создайте файл и проверьте стабильность при паузе и одновременную замену. Выполнение симулятора RTL здесь не заявляется. Диаграмма иллюстрирует fire; это не снятая аппаратная трасса.

SystemVerilog
module sample_stage (
  input logic clk, reset,
  input logic in_valid,
  output logic in_ready,
  input logic signed [7:0] in_data,
  output logic out_valid,
  input logic out_ready,
  output logic signed [7:0] out_data
);
  assign in_ready = !out_valid || out_ready;
  always_ff @(posedge clk) begin
    if (reset) begin
      out_valid <= 1'b0;
      out_data <= '0;
    end else if (in_ready) begin
      out_valid <= in_valid;
      if (in_valid) out_data <= in_data;
    end
  end
endmodule
Принятые передачи при паузе
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
clockp....
valid01111
ready01011
fire01011

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

Выходная ступень удерживает A с out_ready=0 при достоверном входе B. Что должны сделать ступень и производитель на следующем фронте?

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

Ступень опускает in_ready и сохраняет A с out_valid. Производитель сохраняет B с in_valid. Стабильные элементы позднее могут передаться ровно один раз.

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