Altifigence Academy

10 / 20 · Prática

Laboratório: matriz 2×2 com entradas defasadas

Modele atrasos de encaminhamento de uma borda e verifique cada acumulador intermediário.

Faça valores k iguais se encontrarem

Injete A(i,k) na fronteira esquerda na borda lógica k+i e B(k,j) na superior em k+j. O encaminhamento registrado acrescenta j bordas na horizontal e i na vertical. Portanto, ambos os operandos chegam a PE(i,j) em k+i+j. Essa injeção escalonada é a defasagem de entrada.

Para A=[[1,2],[3,4]], B=[[5,6],[7,8]], clear termina antes de E0. Os cronogramas das fronteiras são:

BordaEsquerda, linha 0Esquerda, linha 1Superior, coluna 0Superior, coluna 1
E01(k0)inválido5(k0)inválido
E12(k1)3(k0)7(k1)6(k0)
E2inválido4(k1)inválido8(k1)
E3inválidoinválidoinválidoinválido

Salve o código a seguir como schedule-lab.mjs e execute node schedule-lab.mjs. Ele não exige pacotes e imprime Schedule lab passed. Tokens inválidos são null; tokens válidos transportam value e k. Este modelo de um único trabalho omite etiquetas job, mas verifica k explicitamente.

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');

Cada PE lê o estado anterior e escreve o próximo estado. Uma iteração com atualizações diretas permitiria incorretamente encaminhamento por vários saltos em uma borda.

Após E0, apenas o acumulador de C(0,0) vale cinco. E1 o conclui em dezenove e inicia seus vizinhos em seis e quinze. E2 conclui esses em vinte e dois e quarenta e três, enquanto o PE final tem apenas dezoito. E3 soma trinta e dois para produzir cinquenta.

Mude a injeção das linhas de t−i para t. Uma asserção de etiqueta deve detectar o desalinhamento. A conclusão exige quatro bordas com advance e todos os count iguais a dois. A inicialização e a transferência serial da saída estão excluídas. Este modelo executável valida o cronograma declarado sem afirmar execução de RTL ou no DDS.

RTL real: a grade registrada 2×2

O anexo systolic_2x2.sv conecta quatro instâncias de signed_mac_pe.sv, limitado a N=K=2. A se move para a direita e B para baixo por ligações registradas que transportam valid e etiquetas k. O fornecedor externo da fronteira aplica a defasagem; a tarefa step do testbench aplica diretamente o cronograma E0..E3. Clear termina antes de E0 e não existe pipeline adicional do multiplicador.

Salve os três anexos juntos e execute 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

As matrizes após cada borda são [[5,0],[0,0]], [[19,6],[15,0]], [[19,22],[43,18]] e [[19,22],[43,50]]. Done é ativado apenas após E3. Duas pausas dão quatro bordas com advance e seis bordas físicas de cálculo. As verificações também cobrem [[10,9],[−6,3]], manutenção completa do estado e reset no meio do trabalho. Espere RTL PASS:.

Como exercício de modificação RTL, substitua uma ligação registrada de operando por um caminho combinacional. Preveja a primeira falha de alinhamento de etiquetas ou soma intermediária, compare o log e restaure o registrador. Estender esta grade para N×N exige revisar conexões, defasagem, larguras, etiquetas e conclusão juntos.

Experimente

Após E2, qual é o acumulador de PE(1,1) e qual termo falta? Por que ele muda em E3 apesar de entradas de fronteira inválidas?

Ler a explicação

O acumulador vale 18 de 3×6, faltando 4×8=32. Esses operandos estão nos registradores internos de encaminhamento e chegam em E3; fronteiras inválidas não esvaziam a matriz instantaneamente.

Lesson files

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

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.