Altifigence Academy

15 / 20 · Prática

Laboratório: contrapressão e reset

Execute pausa global, retenção do resultado e reset de um trabalho interrompido.

Pause o tempo lógico como uma unidade

Nossa matriz didática usa advance global. O escalonador da fronteira e cada PE se movem apenas quando o conjunto do próximo passo lógico está disponível. Uma via programada como inválida não exige um operando real. Avançar apenas um fluxo quebra a defasagem. Ligações pausadas independentemente precisam de buffers adicionais e regras de correspondência, além desta configuração básica.

A saída usa um contrato valid/ready separado. Quando um resultado estiver pronto, mantenha valid, data e job estáveis até que uma borda com valid&&ready o transfira exatamente uma vez. O módulo envolvente simples não inicia um novo trabalho enquanto um resultado antigo permanecer pendente. A prontidão do consumidor não precisa parar o cálculo quando há armazenamento adequado de resultados.

Salve este código como stall-lab.mjs e execute node stall-lab.mjs. Ele modela um PE de dois termos mais um registrador de resultado, não exige pacotes 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');

Interprete as verificações

Uma pausa mantém a primeira soma −6 e a posição do cronograma. O segundo termo produz −26. Duas bordas de saída bloqueadas preservam o resultado; uma borda pronta o transfere uma vez. Reset durante um trabalho incompleto limpa seu acumulador, sua posição e o estado de validade do resultado, portanto a recuperação reinicia o trabalho.

Acrescentar duas pausas globais ao cronograma 2×2 de quatro passos dá quatro bordas com advance e seis bordas físicas. Os resultados e as listas de k consumidos devem corresponder à execução sem pausas. A fórmula de conclusão lógica permanece igual.

Esta é uma referência síncrona de controle. A sincronização física de reset e os cruzamentos de domínios de clock exigem projeto separado. Um trabalho abortado por reset nunca deve informar conclusão bem-sucedida; limpe os buffers anteriores antes de reiniciar. O sucesso do modelo não estabelece aceitação de RTL, aplicativo instalado ou hardware.

Experimente

Mantenha valid=1 e ready=0 por três bordas e depois ative ready. Quais sinais devem ser mantidos, quantas transferências ocorrem e o que acontece se reset chegar durante a espera?

Ler a explicação

Mantenha data, job e valid. A espera transfere zero resultados; a borda pronta transfere um. Reset descarta o estado válido pendente e não deve entregar esse trabalho como bem-sucedido. Qualquer notificação de cancelamento precisa de um contrato de status separado.

Lesson files

stall-lab.mjs ↓

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.