14 / 24 · Теория
Спроектируйте эластичный регистр на одно место
Принимайте данные в пустое место или заменяйте одновременно потреблённый элемент.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Выводите ready из доступного места хранения
Буфер на одно место содержит бит full и регистр полезных данных. Когда он пуст, он может принять вход даже при остановленном приёмнике. Когда полон, он может принять замену, если приёмник потребляет существующий выход на этом фронте. Поэтому input-ready равен !full OR output-ready, а output-valid — full. Этот регистровый буфер не имеет комбинационного сквозного прохода данных.
Если input-ready высок, следующий full равен input-valid. Фиксируйте полезные данные, если есть вход; иначе освобождайте место. Если input-ready низок, сохраняйте full и данные. Очистка full лишь потому, что выход передан, теряет одновременную замену. Фиксация только по input-valid перезаписывает полное остановленное место.
module elastic_byte (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data, in_tag,
output logic out_valid,
input logic out_ready,
output logic [7:0] out_data, out_tag
);
logic full;
assign in_ready = !full || out_ready;
assign out_valid = full;
always_ff @(posedge clk) begin
if (rst) full <= 1'b0;
else if (in_ready) begin
full <= in_valid;
if (in_valid) begin
out_data <= in_data;
out_tag <= in_tag;
end
end
end
endmodule| Старое full | out-ready | in-valid | Действие |
|---|---|---|---|
| 0 | 0 | 1 | Сохранить вход |
| 1 | 0 | 1 | Не принять вход и удерживать выход |
| 1 | 1 | 1 | Выдать старый элемент и сохранить замену |
| 1 | 1 | 0 | Выдать старый элемент и освободить место |
Сохраните tag0,y9 на фронте 0. Остановитесь на фронте 1. На фронте 2 потребите tag0 и сохраните tag1,y12; место остаётся полным. На фронте 3 потребите tag1 и освободите место, если входа нет. Замена позволяет одну транзакцию за такт.
Соединение многих ступеней создаёт обратный комбинационный путь ready. Регистрация ready требует дополнительного хранения для данных, прибывающих до вступления в силу уведомления об остановке. Отдельно проверьте ограничения комбинационных путей конкретной шины. Независимо от ширины полезных данных храните данные и все сопутствующие поля при одном условии и проверяйте все четыре случая обновления.
Попробуйте сами
На фронте с full=1, out-ready=1 и in-valid=1 потребляется tag7 и предлагается tag8. Чему равны следующие full и out-tag? Что неверно, если full всегда очищается при потреблении?
Прочитать объяснение
Input-ready высок, поэтому сохраните tag8 и оставьте full=1. Out-tag становится 8. Постоянная очистка full теряет tag8 после его приёма.