11 / 24 · Práctica
Práctica: sigue dos etapas y las burbujas
Calcula el estado siguiente a partir del anterior y compara las etiquetas, los valores y los flancos de salida.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Modela registros que se actualizan juntos
Construye un modelo por ciclos de la función de dos etapas f(a,b)=3(a+b). Cada iteración representa un flanco ascendente. Primero consume el valor anterior de s2. Después calcula la nueva segunda etapa a partir del valor anterior de s1 y, a continuación, actualiza ambas etapas. Actualizar s1 antes de calcular s2 permite incorrectamente que una entrada atraviese dos registros en un solo flanco.
Añade manualmente pipeline-model.mjs a tu proyecto, guárdalo y ejecuta node pipeline-model.mjs en una terminal de Node.js. Acepta cuatro entradas en los flancos 0 a 3 y después drena en los flancos 4 y 5. Todas las entradas se aceptan bajo este contrato de disponibilidad permanente. Null significa una etapa vacía; no es el número cero. Un resultado cero válido sigue representando una transacción.
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');| Flanco | Entrada aceptada | Salida entregada |
|---|---|---|
| 0 | tag0:1+2 | Ninguna |
| 1 | tag1:250+10 | Ninguna |
| 2 | tag2:100+0 | tag0:y9 |
| 3 | tag3:255+255 | tag1:y12 |
| 4 | Burbuja | tag2:y44 |
| 5 | Burbuja | tag3:y250 |
La segunda transacción conserva la suma 260 y reduce 780 a 12. La última reduce 1530 a 250. Comparar explícitamente el flanco, la etiqueta y el valor detecta errores temporales además de errores aritméticos. Las burbujas de drenaje vacían ambas etapas para que las salidas antiguas no se repitan.
Para explorar las entradas ausentes, inserta null en los flancos de aceptación elegidos e incrementa las etiquetas solo para las transacciones aceptadas. Los huecos de salida siguen a las burbujas mientras las transacciones válidas conservan una latencia de dos flancos. Este modelo no tiene contrapresión de salida. El siguiente capítulo añade un comportamiento elástico. Superar las comprobaciones de Node valida este modelo de estado, no la compilación HDL ni una ejecución de simulación de DDS.
Inténtalo tú
Si no hay entrada en el flanco 1 y B,C,D se aceptan en los flancos 2,3,4, ¿cuáles son los flancos de entrega de las etiquetas 0 a 3?
Leer la explicación
A se transfiere en el flanco 2. B,C,D se transfieren en los flancos 4,5,6. El flanco 3 contiene una burbuja de salida. Asigna etiquetas por orden de aceptación, 0,1,2,3, en lugar de usar el número físico del flanco.