Altifigence Academy

11 / 24 · Prática

Laboratório: acompanhe dois estágios e bolhas

Calcule o próximo estado a partir do estado anterior e compare etiquetas, valores e bordas das saídas.

Modele registradores que se atualizam juntos

Crie um modelo de ciclos da função de dois estágios f(a,b)=3(a+b). Cada iteração representa uma borda de subida. Primeiro, consuma o valor anterior de s2. Depois, calcule o novo segundo estágio a partir do valor anterior de s1 e atualize ambos os estágios. Atualizar s1 antes de calcular s2 permite incorretamente que uma entrada atravesse dois registradores em uma única borda.

Adicione manualmente pipeline-model.mjs ao seu projeto, salve-o e execute node pipeline-model.mjs em um terminal de Node.js. Aceite quatro entradas nas bordas 0 a 3 e depois esvazie o pipeline nas bordas 4 e 5. Todas as entradas são aceitas sob este contrato de prontidão permanente. Null significa um estágio vazio; não é o valor numérico zero. Um resultado válido igual a zero ainda representa uma transação.

javascript
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');
BordaEntrada aceitaSaída entregue
0tag0:1+2Nenhuma
1tag1:250+10Nenhuma
2tag2:100+0tag0:y9
3tag3:255+255tag1:y12
4Bolhatag2:y44
5Bolhatag3:y250

A segunda transação preserva a soma 260 e reduz 780 para 12. A última reduz 1530 para 250. Comparar explicitamente a borda, a etiqueta e o valor detecta erros de temporização além de erros aritméticos. As bolhas de esvaziamento limpam os dois estágios para que saídas antigas não se repitam.

Para explorar entradas ausentes, insira null em bordas de aceitação selecionadas e incremente as etiquetas apenas para transações aceitas. As lacunas na saída acompanham as bolhas, enquanto as transações válidas mantêm a latência de duas bordas. Este modelo não tem contrapressão na saída. O próximo capítulo acrescenta comportamento elástico. A aprovação das verificações em Node valida este modelo de estados, não a compilação de HDL nem uma execução de simulação no DDS.

Experimente

Se a borda 1 não tiver entrada e B,C,D forem aceitos nas bordas 2,3,4, quais serão as bordas de entrega para as etiquetas 0 a 3?

Ler a explicação

A é transferido na borda 2. B,C,D são transferidos nas bordas 4,5,6. A borda 3 é uma bolha na saída. Atribua etiquetas pela ordem de aceitação, 0,1,2,3, em vez de usar o número da borda física.

Lesson files

pipeline-model.mjs ↓

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