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 |
|---|---|---|---|---|
| E0 | 1(k0) | недостоверно | 5(k0) | недостоверно |
| E1 | 2(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.
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:
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; недостоверные границы не опустошают массив мгновенно.