Altifigence Academy

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

Лабораторная работа: массив 2×2 со сдвигом входов

Моделируйте задержки пересылки в один фронт и проверяйте каждый промежуточный аккумулятор.

Обеспечьте встречу одинаковых k

Подавайте A(i,k) на левую границу на логическом фронте k+i, а B(k,j) на верхнюю — на k+j. Регистровая пересылка добавляет j фронтов горизонтально и i вертикально. Поэтому оба операнда достигают PE(i,j) на k+i+j. Такая ступенчатая подача — сдвиг входов.

При A=[[1,2],[3,4]], B=[[5,6],[7,8]] очистка завершается до E0. Граничные расписания:

ФронтСлева строка 0Слева строка 1Сверху столбец 0Сверху столбец 1
E01(k0)недостоверно5(k0)недостоверно
E12(k1)3(k0)7(k1)6(k0)
E2недостоверно4(k1)недостоверно8(k1)
E3недостовернонедостовернонедостовернонедостоверно

Сохраните следующий код как schedule-lab.mjs и выполните node schedule-lab.mjs. Пакеты не нужны; он печатает Schedule lab passed. Недостоверные токены — null; достоверные несут value и k. Эта модель одного задания опускает метки job, но явно проверяет k.

javascript
import assert from 'node:assert/strict';
const A=[[1,2],[3,4]],B=[[5,6],[7,8]],N=2,K=2;
const fresh=()=>({a:null,b:null,acc:0,count:0});
let grid=Array.from({length:N},()=>Array.from({length:N},fresh));
const expected=[[[5,0],[0,0]],[[19,6],[15,0]],
                [[19,22],[43,18]],[[19,22],[43,50]]];
const token=(value,k)=>({value,k});
for(let t=0;t<K+2*N-2;t++) {
 const next=grid.map(r=>r.map(p=>({...p})));
 for(let i=0;i<N;i++) for(let j=0;j<N;j++) {
  const ka=t-i,kb=t-j;
  const a=j?grid[i][j-1].a:(ka>=0&&ka<K?token(A[i][ka],ka):null);
  const b=i?grid[i-1][j].b:(kb>=0&&kb<K?token(B[kb][j],kb):null);
  const p=next[i][j];p.a=a;p.b=b;
  if(a&&b){assert.equal(a.k,b.k);assert.equal(a.k,p.count);
   p.acc+=a.value*b.value;p.count++;}
 }
 grid=next;
 assert.deepEqual(grid.map(r=>r.map(p=>p.acc)),expected[t]);
}
assert.deepEqual(grid.map(r=>r.map(p=>p.count)),[[2,2],[2,2]]);
console.log('Schedule lab passed');

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

После E0 только аккумулятор C(0,0) равен пяти. E1 завершает его на девятнадцати и начинает соседей на шести и пятнадцати. E2 завершает их на двадцати двух и сорока трёх, а последний PE имеет лишь восемнадцать. E3 добавляет тридцать два, получая пятьдесят.

Измените подачу строки с t−i на t. Утверждение о метках должно обнаружить рассогласование. Завершение требует четырёх фронтов advance и всех count, равных двум. Инициализация и последовательная выдача выходов исключены. Эта исполняемая модель подтверждает заданное расписание без заявления о выполнении RTL или DDS.

Настоящий RTL: регистровая сетка 2×2

Вложенный systolic_2x2.sv соединяет четыре экземпляра signed_mac_pe.sv, ограниченные N=K=2. A движется вправо, B вниз по регистровым связям с valid и метками k. Внешний поставщик границы выполняет сдвиг; задача step тестового стенда напрямую подаёт расписание E0..E3. Clear заканчивается до E0, дополнительного конвейера умножителя нет.

Сохраните все три вложения вместе и выполните 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

Матрицы после фронтов: [[5,0],[0,0]], [[19,6],[15,0]], [[19,22],[43,18]] и [[19,22],[43,50]]. Done устанавливается только после E3. Две паузы дают четыре фронта advance и шесть физических вычислительных фронтов. Проверки также охватывают [[10,9],[−6,3]], полное удержание состояния и сброс в середине задания. Ожидайте RTL PASS:.

В упражнении изменения RTL замените регистровую связь операнда комбинационным путём. Предскажите первую ошибку согласования меток или промежуточной суммы, сравните журнал и восстановите регистр. Расширение сетки до N×N требует совместного пересмотра соединений, сдвига, разрядностей, меток и завершения.

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

После E2 чему равен аккумулятор PE(1,1) и какой член остался? Почему он меняется на E3 при недостоверных граничных входах?

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

Аккумулятор равен 18 от 3×6, остаётся 4×8=32. Эти операнды находятся во внутренних регистрах пересылки и прибывают на E3; недостоверные границы не опустошают массив мгновенно.

Lesson files

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

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