Altifigence Academy

9 / 24 · Теория

Храните полную транзакцию на границах конвейера

Разделяйте сложение и масштабирование, согласуя valid, метку и разрядности.

Граница регистра переносит смысл вместе с битами

Разделим f(a,b)=3(a+b) на две ступени. Первая хранит девятибитную сумму двух беззнаковых восьмибитных операндов. Вторая формирует одиннадцатибитное масштабированное значение и хранит его младшие восемь бит. Максимальный широкий результат равен 1530. Сужение промежуточной суммы случайно сохраняет итоговое значение по модулю 256 для этого целочисленного выражения, но теряет информацию для сообщения о переполнении или последующих сравнений. Явно задавайте промежуточную разрядность.

Каждая ступень хранит valid и метку вместе с данными. Нулевой valid обозначает пустой такт. Старые биты данных могут оставаться в пустой ступени, но не должны считаться транзакцией. Метке нужна та же регистровая задержка, что и её значению. Два регистра данных при одном регистре метки присоединяют идентификатор транзакции B к результату транзакции A.

Это ядро предполагает отсутствие остановок и всегда готовые порты. Расширьте s1 и задайте размер константы перед умножением. Вторая ступень читает старые s1 и t1; новый вход не может пройти через оба регистра за один фронт.

SystemVerilog
logic [8:0] s1;
logic [7:0] s2, t1, t2;
logic v1, v2;
logic [10:0] scaled;
assign scaled = {2'b00, s1} * 11'd3;
always_ff @(posedge clk) begin
  if (rst) begin
    v1 <= 1'b0;
    v2 <= 1'b0;
  end else begin
    v1 <= in_valid;
    v2 <= v1;
    if (in_valid) begin
      s1 <= {1'b0, a} + {1'b0, b};
      t1 <= in_tag;
    end
    if (v1) begin
      s2 <= scaled[7:0];
      t2 <= t1;
    end
  end
end

Примите A=(1,2) на фронте 0: после него s1=3. Примите B=(250,10) на фронте 1: s1 станет 260, пока s2 сохранит результат A, равный 9. A достоверен после фронта 1 и может передаться на фронте 2. B позднее даст 780 по модулю 256, то есть 12.

Перемещайте пустые такты и через регистры valid. Удержание старого v1=1 при отсутствии входа может дублировать транзакцию. Сброс очищает valid, чтобы устаревшие данные не стали новым результатом. На каждой границе перечислите все сопутствующие поля: операцию, метку, исключение, адрес или признак конца пакета. Проверьте, что эти поля остаются одной транзакцией на всём конвейере.

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

A=(1,2,tag=10) и B=(250,10,tag=11) приняты последовательно. Если используется t2<=in_tag, какая метка сопровождает результат A? Укажите правильное соединение.

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

На фронте 1 s2 вычисляет старую транзакцию A, а текущий in_tag равен 11, поэтому результат 9 получает метку 11. Используйте t2<=t1 для фиксации старой метки A из первой ступени, равной 10.

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