Altifigence Academy

15 / 20 · Práctica

Práctica: contrapresión y reinicio

Ejecuta una pausa global, la retención de resultados y el reinicio de un trabajo interrumpido.

Pausa el tiempo lógico como una unidad

Nuestra matriz didáctica usa advance global. El planificador del borde y todos los PE se mueven solo cuando está disponible el siguiente conjunto de entradas del paso lógico. Un carril planificado como no válido no requiere un operando real. Hacer avanzar solo un flujo rompe el desfase. Los enlaces detenidos de forma independiente necesitan búferes y reglas de emparejamiento adicionales, fuera de esta base.

La salida usa un contrato valid/ready separado. Una vez listo un resultado, conserva estables valid, data y job hasta que un flanco con valid&&ready lo transfiera exactamente una vez. El módulo envolvente sencillo no inicia ningún trabajo nuevo mientras queda pendiente un resultado anterior. La disponibilidad del consumidor no tiene por qué detener el cálculo cuando hay almacenamiento suficiente de resultados.

Guarda esto como stall-lab.mjs y ejecuta node stall-lab.mjs. Modela un PE de dos términos y un registro de resultado, no requiere paquetes e imprime Stall/reset lab passed.

javascript
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
 if(rst){reset();return null;}
 if(s.valid){if(!ready)return null;
  const out={data:s.data,job:s.job};s.valid=false;return out;}
 if(advance&&s.step<pairs.length){
  const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
  if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
 return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');

Interpreta las comprobaciones

Una pausa conserva la primera suma −6 y la posición de la planificación. El segundo término produce −26. Dos flancos de salida bloqueados conservan el resultado; un flanco listo lo transfiere una vez. Un reinicio durante un trabajo incompleto borra su acumulador, posición y estado de validez del resultado, así que la recuperación reinicia el trabajo.

Añadir dos pausas globales a la planificación 2×2 de cuatro pasos da cuatro flancos con avance y seis flancos físicos. Los resultados y las listas de k consumidos deben coincidir con la ejecución sin detenciones. La fórmula de finalización lógica permanece igual.

Esta es una referencia de control síncrono. La sincronización física del reinicio y los cruces entre dominios de reloj requieren diseño separado. Un trabajo abortado por reinicio nunca debe informar de finalización correcta; borra los búferes previos antes de volver a empezar. El éxito del modelo no acredita aceptación RTL, de la aplicación instalada ni del hardware.

Inténtalo tú

Mantén valid=1 y ready=0 durante tres flancos y después activa ready. ¿Qué señales deben conservarse, cuántas transferencias ocurren y qué pasa si llega un reinicio mientras se espera?

Leer la explicación

Conserva data, job y valid. Durante la espera se transfieren cero resultados; el flanco listo transfiere uno. El reinicio descarta el estado válido pendiente y no debe entregar ese trabajo como correcto. Toda notificación de cancelación necesita un contrato de estado separado.

Lesson files

stall-lab.mjs ↓

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.