Altifigence Academy

15 / 24 · Prática

Laboratório: janelas que sobrevivem a pausas

Se, em vez disso, os ciclos zero,um,dois forem pausados e todas as entradas forem eventualmente aceitas, os valores ou a quantidade de janelas mudam? Qual é a quantidade total de ciclos?

Objetivo e execução

Gere janelas 3×3 a partir de uma entrada serial e verifique se pausas preservam seus valores e ordem. Crie window-lab.mjs, copie o código e execute node window-lab.mjs. Ele precisa de Node.js e de nenhum pacote. Você pode criar e inspecionar manualmente o mesmo arquivo por um fluxo suportado de arquivos no Digital Design Studio instalado. Isso não estabelece execução dentro do DDS nem criação automática de projeto remoto.

O modelo pausa apenas a entrada aceita. Ele não implementa um protocolo completo de output-ready, barramento de memória, preenchimento, dilatação ou mecanismo multicanal. As entradas de stalls identificam ciclos decorridos; accepted identifica posições de entrada. Separar esses contadores é o objetivo do exercício. Uma pausa deixa buffers, janelas e índice da entrada inalterados.

Resultados esperados resolvidos

Interprete os valores de um a dezesseis como largura quatro. A primeira janela normal tem acceptedIndex dez e valores [1,2,3,5,6,7,9,10,11]. Os índices das janelas são [10,11,14,15]. A execução normal leva dezesseis ciclos. Pausar os ciclos dois, três e doze leva dezenove ciclos e move a primeira janela para o ciclo treze. Seu índice de entrada aceita permanece dez. A temporização muda; conteúdo e ordenação não.

As dezessete amostras de armazenamento informadas compreendem oito posições de atraso de linha e nove posições de janela. Arranjos de JavaScript não medem bytes nem área de SRAM sintetizada. O log ilimitado de windows é um registro de verificação, não uma fila finita de hardware.

Execute primeiro as asserções originais. Avance temporariamente accepted durante uma pausa e confirme que a comparação de valores falha; depois, restaure o código. Remover a limpeza no início da linha e permitir saída nas primeiras colunas misturaria colunas de linhas diferentes. A validade e o avanço de estado devem ser testados juntos.

Para comparar com convolução direta, calcule o produto escalar de cada janela com o mesmo kernel linearizado e reorganize as saídas na ordem espacial. Confira manualmente a primeira janela antes de confiar na comparação automática. Preserve configuração, índices aceitos e ciclos decorridos nas evidências para que outra execução possa reproduzir o resultado.

Arquivo executável

javascript
import assert from 'node:assert/strict';
// Two row delays plus three horizontal shift registers: valid 3x3, one channel.
export function streamWindows(pixels, width, stalls = new Set()) {
  const previous = Array(width).fill(0), older = Array(width).fill(0);
  const window = Array.from({length: 3}, () => Array(3).fill(0));
  const windows = []; let accepted = 0, cycles = 0;
  while (accepted < pixels.length) {
    if (stalls.has(cycles++)) continue;
    const row = Math.floor(accepted / width), col = accepted % width;
    if (col === 0) window.forEach(r => r.fill(0));
    const current = pixels[accepted];
    [older[col], previous[col], current].forEach((v, r) => {window[r].shift(); window[r].push(v);});
    older[col] = previous[col]; previous[col] = current;
    if (row >= 2 && col >= 2) windows.push({acceptedIndex: accepted, cycle: cycles - 1, values: window.flat()});
    accepted++;
  }
  return {windows, accepted, cycles, storageSamples: 2 * width + 9};
}
const pixels = Array.from({length: 16}, (_, i) => i + 1);
const normal = streamWindows(pixels, 4);
const paused = streamWindows(pixels, 4, new Set([2, 3, 12]));
assert.deepEqual(normal.windows.map(w => w.acceptedIndex), [10, 11, 14, 15]);
assert.deepEqual(normal.windows[0].values, [1, 2, 3, 5, 6, 7, 9, 10, 11]);
assert.deepEqual(paused.windows.map(w => w.values), normal.windows.map(w => w.values));
assert.equal(paused.cycles, 19);
console.log(JSON.stringify({normal, paused}));

Laboratório RTL: janela em fluxo com escopo limitado

Salve os anexos cnn_window3x3.sv, cnn_conv3x3.sv e tb_cnn_stream.sv juntos. O gerador sintetizável de janelas aceita um quadro 4×4 de int8 com sinal na ordem por linhas a cada reset síncrono ativo em nível alto. Ele suporta um canal, janelas 3×3 sem preenchimento, passo/dilatação um e nenhum padding. Avance apenas quando in_valid e in_ready estiverem ambos altos em uma borda de subida. Mantenha dados/valid da entrada durante uma pausa; uma janela de saída bloqueada também permanece estável. Aplique reset antes do próximo quadro.

Com Icarus Verilog instalado, execute externamente:

sh
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-sim

O testbench com autoverificação compara as nove amostras e as coordenadas de cada janela, fronteiras de linhas, pausas de entrada/saída, reset com saída pendente e conclusão do quadro. Para entradas de um a dezesseis, as coordenadas são (0,0),(0,1),(1,0),(1,1). Seu PASS final deve informar frames=6, windows=24, outputs=24, kernels=2 e stalled_cycles positivo. Entregue seu log real; um comando não executado não é uma aprovação. Inspecione arquivos manualmente por um fluxo suportado de arquivos no DDS instalado, se disponível; execução no DDS e síntese exigem evidências separadas.

Exercício de alteração: substitua a primeira entrada por dois, confira manualmente a primeira janela e inspecione uma forma de onda de saída em pausa. Os valores/ordem das janelas devem sobreviver a vários ciclos de ready baixo. Remover o estágio registrado de janela exige um novo argumento de contrapressão e estabilidade de estado.

Experimente

Se, em vez disso, os ciclos zero,um,dois forem pausados e todas as entradas forem eventualmente aceitas, os valores ou a quantidade de janelas mudam? Qual é a quantidade total de ciclos?

Ler a explicação

As mesmas quatro janelas permanecem na mesma ordem. Dezesseis entradas aceitas mais três pausas levam dezenove ciclos. Os índices aceitos permanecem fixos; os tempos de chegada decorridos ficam mais tardios.

Lesson files

window-lab.mjs ↓cnn_window3x3.sv ↓cnn_conv3x3.sv ↓tb_cnn_stream.sv ↓

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