Altifigence Academy

6 / 20 · Практика

Лабораторная работа: обрабатывающий элемент со знаковым MAC

Используйте автономную модель для проверки достоверных операндов, остановок и очистки.

Выполните спецификацию одного PE

Сохраните это как pe-lab.mjs и выполните node pe-lab.mjs с Node.js. Внешние пакеты не используются; программа печатает PE lab passed. Это проверяет арифметическую и управляющую модель; не компилирует SystemVerilog и не демонстрирует выполнение в DDS. Рассматривайте обычное задание из двух членов как W=8, K=2, AW=17, хотя эталон модели использует широкие целые числа.

PE получает отдельные флаги valid для A и B. Он накапливает только при истинности обоих. Пересылка следует собственному valid каждого операнда. Следующий урок добавляет метки для проверки принадлежности двух достоверных операндов одному члену свёртки.

javascript
import assert from 'node:assert/strict';
const pe = {acc:0,a:0,b:0,av:false,bv:false};
function edge({a=0,b=0,av=false,bv=false,
               advance=true,clear=false,reset=false}={}) {
  if (reset || clear) {
    Object.assign(pe,{acc:0,a:0,b:0,av:false,bv:false});
  } else if (advance) {
    if (av && bv) pe.acc += a*b;
    Object.assign(pe,{a,b,av,bv});
  }
  return {...pe};
}
edge({clear:true});
assert.equal(edge({a:-2,b:3,av:true,bv:true}).acc,-6);
const held={...pe};
assert.deepEqual(edge({a:99,b:99,av:true,bv:true,advance:false}),held);
assert.equal(edge({a:4,b:-5,av:true,bv:true}).acc,-26);
assert.equal(edge({a:8,b:8,av:true,bv:false}).acc,-26);
assert.equal(pe.av,true); assert.equal(pe.bv,false);
edge({clear:true,a:100,b:100,av:true,bv:true});
assert.equal(pe.acc,0); assert.equal(pe.av,false);
assert.equal(edge({a:-128,b:-128,av:true,bv:true}).acc,16384);
edge({reset:true,advance:false});
assert.deepEqual(pe,{acc:0,a:0,b:0,av:false,bv:false});
console.log('PE lab passed');

Предскажите и испытайте результат

Первая пара даёт −6. Пауза игнорирует предложенные значения 99 и удерживает всё состояние. Следующая достоверная пара вносит −20, достигая −26. Токен A без пары пересылается, но не вносит MAC. Clear побеждает одновременно достоверную пару; затем минимум×минимум даёт 16384. Reset очищает valid даже при ложном advance.

Перенесите тот же приоритет в always_ff с явно знаковыми сигналами произведения и слагаемого. При моделировании массива читайте старое состояние и записывайте отдельное следующее состояние. Изменение объектов PE на месте может случайно позволить токену пересечь несколько PE на одном фронте.

Измените условие накопления с AND на OR. Утверждение о непарном токене должно завершиться ошибкой. Также попробуйте применять advance только к аккумулятору, позволяя пересылке двигаться. Объясните, какое требование защищает каждое утверждение; одного сообщения об успехе недостаточно для полного учебного результата.

Записывайте предлагаемые операнды отдельно от потреблённых: задержанные значения девяносто девять видимы на интерфейсе, но никогда не потребляются. Оболочка должна удерживать следующий запланированный член до возобновления advance. Возвращённые копии состояния сохраняют ранние наблюдения. Проверяйте флаги valid пересылки вместе с аккумулятором при переносе проверок в тестовый стенд с временными диаграммами.

Настоящий RTL: PE со знаковым MAC

Сохраните вложения signed_mac_pe.sv, systolic_2x2.sv и tb_systolic_2x2.sv вместе. Первые два файла — синтезируемый RTL; тестовый стенд предназначен только для симуляции. PE знаково расширяет полное произведение 2W бит до AW перед накоплением. Проверки W=8,K=4 используют AW=18 для 65536, −65024 и 64516. Упорядоченные метки k отклоняют несовпадающие члены через protocol_error.

Приоритет: reset, clear, затем advance. Clear заканчивается до первого фронта данных. Наблюдайте обновлённый аккумулятор после каждого переднего фронта; соседи потребляют регистровую пересылку на следующем фронте advance. Пауза удерживает каждое значение, флаг valid, метку и count. Между очистками работает одно задание без выходного квантования или интеграции DDS.

При установленном Icarus Verilog выполните:

bash
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvp

Ожидайте RTL PASS:; ошибки завершаются с $fatal. Измените addend на расширение нулями и воспроизведите ошибку отрицательного произведения. Объясните первую неверную префиксную сумму, восстановите знаковое расширение и повторите. Сохраняйте отдельные журналы Node и HDL.

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

Вставьте достоверную пару (0,7) между (−2,3) и (4,−5). Чему равна сумма и чем достоверный ноль отличается от недостоверного токена?

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

Сумма равна −26. Достоверный ноль всё равно потребляет реальный член k и продвигает подсчёт членов и метки. Недостоверный токен не потребляет член. Для задания из трёх членов соответственно обновите K, анализ разрядности и управление завершением.

Lesson files

pe-lab.mjs ↓signed_mac_pe.sv ↓systolic_2x2.sv ↓tb_systolic_2x2.sv ↓

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