11 / 24 · Esercitazione
Laboratorio: segui due stadi e le bolle
Calcola lo stato successivo da quello precedente e confronta tag, valori e fronti di uscita.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Modella registri che si aggiornano insieme
Costruisci un modello a cicli della funzione a due stadi f(a,b)=3(a+b). Ogni iterazione rappresenta un fronte di salita. Consuma prima s2 precedente. Poi calcola il nuovo secondo stadio da s1 precedente e infine aggiorna entrambi gli stadi. Aggiornare s1 prima di calcolare s2 consente erroneamente a un ingresso di attraversare due registri in un solo fronte.
Aggiungi manualmente pipeline-model.mjs al progetto, salvalo ed esegui node pipeline-model.mjs in un terminale Node.js. Accetta quattro ingressi ai fronti da 0 a 3, poi svuota ai fronti 4 e 5. Tutti gli ingressi vengono accettati secondo questo contratto sempre pronto. Null indica uno stadio vuoto; non è lo zero numerico. Un risultato zero valido rappresenta comunque una transazione.
import assert from 'node:assert/strict';
const inputs = [[1,2], [250,10], [100,0], [255,255]];
let s1 = null, s2 = null;
const seen = [];
for (let edge = 0; edge < 6; edge++) {
if (s2 !== null) seen.push({ edge, ...s2 });
const next2 = s1 === null ? null : {
tag: s1.tag, y: (s1.sum * 3) % 256
};
const next1 = edge < inputs.length ? {
tag: edge, sum: inputs[edge][0] + inputs[edge][1]
} : null;
s1 = next1;
s2 = next2;
}
assert.deepEqual(seen, [
{ edge: 2, tag: 0, y: 9 },
{ edge: 3, tag: 1, y: 12 },
{ edge: 4, tag: 2, y: 44 },
{ edge: 5, tag: 3, y: 250 }
]);
assert.equal(s1, null);
assert.equal(s2, null);
console.log('PIPELINE PASS: 4 ordered results, latency=2');| Fronte | Ingresso accettato | Uscita consegnata |
|---|---|---|
| 0 | tag0:1+2 | Nessuna |
| 1 | tag1:250+10 | Nessuna |
| 2 | tag2:100+0 | tag0:y9 |
| 3 | tag3:255+255 | tag1:y12 |
| 4 | Bolla | tag2:y44 |
| 5 | Bolla | tag3:y250 |
La seconda transazione conserva la somma 260 e riduce 780 a 12. L'ultima riduce 1530 a 250. Confrontare esplicitamente fronte, tag e valore rileva errori temporali oltre a quelli aritmetici. Le bolle di svuotamento liberano entrambi gli stadi affinché le vecchie uscite non possano ripetersi.
Per esplorare ingressi mancanti, inserisci null ai fronti di accettazione scelti e incrementa i tag soltanto per le transazioni accettate. Gli intervalli vuoti in uscita seguono le bolle, mentre le transazioni valide mantengono una latenza di due fronti. Questo modello non prevede contropressione in uscita. Il capitolo successivo aggiunge il comportamento elastico. Superare le verifiche Node convalida questo modello di stato, non la compilazione HDL o un'esecuzione di simulazione DDS.
Prova tu
Se al fronte 1 non c'è alcun ingresso e B,C,D vengono accettate ai fronti 2,3,4, quali sono i fronti di consegna per i tag da 0 a 3?
Leggi la spiegazione
A viene trasferita al fronte 2. B,C,D vengono trasferite ai fronti 4,5,6. Il fronte 3 è una bolla in uscita. Assegna i tag in ordine di accettazione, 0,1,2,3, anziché usare il numero fisico del fronte.