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.
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
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.
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');| Borda | Entrada aceita | Saída entregue |
|---|---|---|
| 0 | tag0:1+2 | Nenhuma |
| 1 | tag1:250+10 | Nenhuma |
| 2 | tag2:100+0 | tag0:y9 |
| 3 | tag3:255+255 | tag1:y12 |
| 4 | Bolha | tag2:y44 |
| 5 | Bolha | tag3: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.