Altifigence Academy

10 / 20 · Travaux pratiques

TP : réseau 2×2 à entrées décalées

Modélisez les délais de transmission d’un front et vérifiez chaque accumulateur intermédiaire.

Faire se rencontrer des valeurs k identiques

Injectez A(i, k) à la frontière gauche au front logique k+i et B(k, j) à la frontière supérieure à k+j. La transmission enregistrée ajoute j fronts horizontalement et i verticalement. Les deux opérandes atteignent donc PE(i, j) à k+i+j. Cette injection échelonnée est le décalage des entrées.

Pour A=[[1, 2], [3, 4]], B=[[5, 6], [7, 8]], clear se termine avant E0. Les ordonnancements de frontière sont :

FrontGauche ligne 0Gauche ligne 1Haut col. 0Haut col. 1
E01(k0)invalide5(k0)invalide
E12(k1)3(k0)7(k1)6(k0)
E2invalide4(k1)invalide8(k1)
E3invalideinvalideinvalideinvalide

Enregistrez ce qui suit sous schedule-lab.mjs et exécutez node schedule-lab.mjs. Aucun paquet n’est nécessaire et le programme affiche Schedule lab passed. Les jetons invalides sont null ; les jetons valides transportent value et k. Ce modèle à traitement unique omet les étiquettes job mais vérifie explicitement 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');

Chaque PE lit l’état précédent et écrit l’état suivant. Une itération avec modification sur place permettrait à tort une transmission sur plusieurs sauts au cours d’un front.

Après E0, seul l’accumulateur de C(0, 0) vaut cinq. E1 le termine à dix-neuf et commence ses voisins à six et quinze. E2 les termine à vingt-deux et quarante-trois, tandis que le dernier PE ne vaut encore que dix-huit. E3 ajoute trente-deux pour produire cinquante.

Remplacez l’injection de ligne t−i par t. Une assertion d’étiquette doit détecter le désalignement. La fin nécessite quatre fronts advance et tous les compteurs égaux à deux. L’initialisation et le transfert série des sorties sont exclus. Ce modèle exécutable valide l’ordonnancement défini sans prétendre à une exécution RTL ou DDS.

RTL réel : la grille 2×2 enregistrée

Le fichier joint systolic_2x2.sv connecte quatre instances de signed_mac_pe.sv, limitées à N=K=2. A se déplace vers la droite et B vers le bas par des liaisons enregistrées portant valid et les étiquettes k. Le fournisseur externe de frontière effectue le décalage ; la tâche step du banc de test applique directement l’ordonnancement E0..E3. Clear se termine avant E0 et aucun pipeline multiplicateur supplémentaire n’existe.

Enregistrez les trois pièces jointes ensemble et exécutez 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

Les matrices après les fronts sont [[5, 0], [0, 0]], [[19, 6], [15, 0]], [[19, 22], [43, 18]] et [[19, 22], [43, 50]]. Done ne s’active qu’après E3. Deux pauses donnent quatre fronts advance et six fronts physiques de calcul. Les vérifications couvrent aussi [[10, 9], [−6, 3]], la conservation complète de l’état et reset à mi-traitement. Attendez RTL PASS:.

Pour un exercice de modification RTL, remplacez une liaison d’opérande enregistrée par un chemin combinatoire. Prévoyez le premier échec d’alignement d’étiquettes ou de somme intermédiaire, comparez le journal et rétablissez le registre. Étendre cette grille à N×N exige de revoir ensemble câblage, décalage, largeurs, étiquettes et fin.

Essayez vous-même

Après E2, que valent l’accumulateur de PE(1, 1) et le terme restant ? Pourquoi change-t-il à E3 malgré des entrées de frontière invalides ?

Lire l’explication

L’accumulateur vaut 18, issu de 3×6, et il reste 4×8=32. Ces opérandes sont dans les registres internes de transmission et arrivent à E3 ; des frontières invalides ne vident pas instantanément le réseau.

Lesson files

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

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.