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.
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
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 :
| Front | Gauche ligne 0 | Gauche ligne 1 | Haut col. 0 | Haut col. 1 |
|---|---|---|---|---|
| E0 | 1(k0) | invalide | 5(k0) | invalide |
| E1 | 2(k1) | 3(k0) | 7(k1) | 6(k0) |
| E2 | invalide | 4(k1) | invalide | 8(k1) |
| E3 | invalide | invalide | invalide | invalide |
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.
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 :
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpLes 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.