31 / 37 · Теория
Конвейер умножения и сложения, выравнивание данных
Разделите вычисление регистрами и сохраните принадлежность данных, valid и вспомогательных операндов одной транзакции.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
От выражения к двум ступеням
Предварительные знания: signed-арифметика, неблокирующие присваиванияНеблокирующее присваивание обозначается <= в последовательностном RTL. Оно вычисляет правую часть, затем планирует обновление, позволяя регистрам на одном фронте рассчитываться по предыдущему состоянию. Подробнее, setupВремя предустановки (setup) — минимальное время, в течение которого входные данные должны быть стабильны до захватывающего фронта такта. При нарушении результат записи не гарантирован. Подробнее и valid.
Каждая входная транзакция содержит signed 8-битные a,b и signed 16-битное c; результат задаётся ниже. Это независимое multiply-add для каждой транзакции, а не аккумулятор.
Точному произведению двух 8-битных чисел нужны 16 бит. Если при добавлении c сначала сложить в 16 битах, последующее расширение не восстановит потерянный старший бит. Сначала расширьте оба операнда знаком до 17 бит.
Первая ступень сохраняет произведение вместе с c, вторая складывает два значения одной транзакции. Без задержки c прежнее произведение смешается с c текущей транзакции.
module multiply_add_pipeline (
input logic clk, rst, in_valid,
input logic signed [7:0] a, b,
input logic signed [15:0] c,
output logic out_valid,
output logic signed [16:0] y
);
logic v1;
logic signed [15:0] p1, c1;
logic signed [16:0] p_ext, c_ext;
assign p_ext = {p1[15], p1};
assign c_ext = {c1[15], c1};
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
out_valid <= 1'b0;
end else begin
v1 <= in_valid;
out_valid <= v1;
if (in_valid) begin
p1 <= a * b;
c1 <= c;
end
if (v1) y <= p_ext + c_ext;
end
end
endmoduleИнтерфейс принимает вход каждый фронт и предполагает постоянно готового получателя. Y при out_valid=0 не сравнивается. Инициализация valid позволяет отличать неиспользуемые данные даже без сбросаСброс возвращает состояние к заданному начальному значению. Нужно определить, синхронен он или асинхронен и имеет ли приоритет над другими управляющими сигналами. Подробнее регистровРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее данных.
Различайте «две ступени» и момент наблюдения
Таблица показывает приём на каждом фронте и регистры сразу после фронта. A и B — разные транзакции.
| Фронт | Принятый вход | Ступень 1 | Выходной регистр |
|---|---|---|---|
| E0 | A | Произведение и c для A | invalid |
| E1 | B | Произведение и c для B | Результат A, valid |
| E2 | Нет | invalid | Результат B, valid |
| E3 | Нет | invalid | invalid |
Результат A готов сразу после E1. Следующая схема на том же такте выбирает его на E2. От входного приёма E0 до выходного приёма E2 — два периода. Не смешивайте изменение выходного регистра с приёмом следующей схемой при описании задержки.
Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Транзакции A=(2,3,10), B=(4,5,100). Первая ступень сохраняет произведение и c вместе; на следующем фронте складываются прежние значения этой ступени. Прочерки — invalid-интервалы.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| фронт | 2345 | E0 → E1 → E2 → E3 |
| принято | 234. | A → B → - |
| product1 после | 234. | 6 → 20 → - |
| c1 после | 234. | 10 → 100 → - |
| y после | 2345 | - → 16 → 120 → - |
| out_valid после | 01.0 |
Насколько конвейер ускоряет работу
Возьмём простой расчётный пример: умножение 3.2 ns, сложение 1.1 ns, регистровые накладные расходы 0.2 ns.
Оценочный предел максимальной частоты меняется примерно с 222 MHz на 294 MHz. Две ступени не гарантируют удвоения пропускной способности: период задают самая медленная ступень и стоимость регистров. Фактический результат зависит от синтеза, размещения и ограничений.
Проверяйте по транзакциям
При приёме входа добавляйте целочисленный эталон a×b+c в очередь. На фронте приёма действительного выхода извлекайте и сравнивайте голову. Вставляйте интервалы in_valid=0, проверяя движение пузырей вместе с данными. Резкое изменение только c между транзакциями хорошо выявляет отсутствие его задержки.
Дополнительное чтение: MIT OpenCourseWare — Performance Measures
Попробуйте сами
Поданы последовательные транзакции A=(a=3,b=−4,c=10), B=(a=2,b=5,c=100). Найдите правильные выходы и возможную ошибку для A, если c не задержать, а использовать текущий вход.
Прочитать объяснение
Правильно: A даёт −12+10=−2, B — 10+100=110. Если во второй ступени произведение A складывается с текущим c=100 от B, получится 88. Даже правильно задержанный valid не исправляет рассогласование операндов.