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; это не снятая аппаратная трасса.
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Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| clock | p.... | |
| valid | 01111 | |
| ready | 01011 | |
| fire | 01011 |
Попробуйте сами
Выходная ступень удерживает A с out_ready=0 при достоверном входе B. Что должны сделать ступень и производитель на следующем фронте?
Прочитать объяснение
Ступень опускает in_ready и сохраняет A с out_valid. Производитель сохраняет B с in_valid. Стабильные элементы позднее могут передаться ровно один раз.