Altifigence Academy

31 / 37 · Теория

Конвейер умножения и сложения, выравнивание данных

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

От выражения к двум ступеням

Предварительные знания: signed-арифметика, неблокирующие присваиванияНеблокирующее присваивание обозначается <= в последовательностном RTL. Оно вычисляет правую часть, затем планирует обновление, позволяя регистрам на одном фронте рассчитываться по предыдущему состоянию. Подробнее, setupВремя предустановки (setup) — минимальное время, в течение которого входные данные должны быть стабильны до захватывающего фронта такта. При нарушении результат записи не гарантирован. Подробнее и valid.

Каждая входная транзакция содержит signed 8-битные a,b и signed 16-битное c; результат задаётся ниже. Это независимое multiply-add для каждой транзакции, а не аккумулятор.

y=a×b+cy=a\times b+c

Точному произведению двух 8-битных чисел нужны 16 бит. Если при добавлении c сначала сложить в 16 битах, последующее расширение не восстановит потерянный старший бит. Сначала расширьте оба операнда знаком до 17 бит.

Первая ступень сохраняет произведение вместе с c, вторая складывает два значения одной транзакции. Без задержки c прежнее произведение смешается с c текущей транзакции.

SystemVerilog
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Выходной регистр
E0AПроизведение и c для Ainvalid
E1BПроизведение и c для BРезультат A, valid
E2НетinvalidРезультат B, valid
E3Нетinvalidinvalid

Результат A готов сразу после E1. Следующая схема на том же такте выбирает его на E2. От входного приёма E0 до выходного приёма E2 — два периода. Не смешивайте изменение выходного регистра с приёмом следующей схемой при описании задержки.

Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Транзакции A=(2,3,10), B=(4,5,100). Первая ступень сохраняет произведение и c вместе; на следующем фронте складываются прежние значения этой ступени. Прочерки — invalid-интервалы.

Произведение и c должны относиться к одной транзакции
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт2345E0 → 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.

Tone≥3.2+1.1+0.2=4.5 nsT_{\mathrm{one}}\ge3.2+1.1+0.2=4.5\ \mathrm{ns}
Tpipe≥max⁡(3.2,1.1)+0.2=3.4 nsT_{\mathrm{pipe}}\ge\max(3.2,1.1)+0.2=3.4\ \mathrm{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 не исправляет рассогласование операндов.

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