Altifigence Academy

15 / 24 · Práctica

Práctica: ventanas que sobreviven a las pausas

Si se pausan en cambio los ciclos cero,uno,dos y finalmente se aceptan todas las entradas, ¿cambian los valores o el número de ventanas? ¿Cuál es el total de ciclos?

Objetivo y ejecución

Genera ventanas 3×3 desde una entrada serie y verifica que las pausas conservan sus valores y su orden. Crea window-lab.mjs, copia el código y ejecuta node window-lab.mjs. Necesita Node.js y ningún paquete. Puedes crear e inspeccionar manualmente el mismo archivo mediante un flujo de archivos admitido en Digital Design Studio instalado. Esto no acredita ejecución dentro de DDS ni creación automática de proyectos remotos.

El modelo pausa solo la entrada aceptada. No implementa un protocolo completo de output-ready, bus de memoria, relleno, dilatación ni motor multicanal. Las entradas de stalls identifican ciclos transcurridos; accepted identifica posiciones de entrada. Separar esos contadores es el objetivo del ejercicio. Una pausa deja sin cambios los búferes, las ventanas y el índice de entrada.

Resultados esperados resueltos

Interpreta de uno a dieciséis con anchura cuatro. La primera ventana normal tiene acceptedIndex diez y valores [1,2,3,5,6,7,9,10,11]. Los índices de ventanas son [10,11,14,15]. La ejecución normal tarda dieciséis ciclos. Pausar los ciclos dos, tres y doce requiere diecinueve ciclos y desplaza la primera ventana al ciclo trece. Su índice de entrada aceptada sigue siendo diez. Cambia la temporización; el contenido y el orden no.

Las diecisiete muestras de almacenamiento declaradas comprenden ocho posiciones de retardo de fila y nueve de ventana. Las matrices JavaScript no miden bytes de SRAM sintetizada ni área. El registro ilimitado windows es un registro de verificación, no una cola finita de hardware.

Ejecuta primero las aserciones originales. Haz avanzar temporalmente accepted durante una pausa y confirma que falla la comparación de valores; después restaura el código. Eliminar el borrado de inicio de fila permitiendo salida en las primeras columnas mezclaría columnas de filas distintas. La validez y el avance de estado deben probarse conjuntamente.

Para comparar con convolución directa, calcula el producto escalar de cada ventana con el mismo núcleo aplanado y reorganiza las salidas en orden espacial. Comprueba a mano la primera ventana antes de confiar en la comparación automática. Conserva configuración, índices aceptados y ciclos transcurridos en las pruebas para reproducir el resultado en otra ejecución.

Archivo ejecutable

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}));

Práctica RTL: una ventana en flujo acotada

Guarda juntos los adjuntos cnn_window3x3.sv, cnn_conv3x3.sv y tb_cnn_stream.sv. El generador sintetizable de ventanas acepta un fotograma 4×4 int8 con signo en orden por filas por cada reinicio síncrono activo a nivel alto. Admite un canal, 3×3 sin relleno y paso/dilatación uno. Avanza solo cuando in_valid e in_ready estén ambos a nivel alto en un flanco ascendente. Conserva datos/valid de entrada durante una pausa; una ventana de salida bloqueada también permanece estable. Reinicia antes del siguiente fotograma.

Con Icarus Verilog instalado, ejecuta externamente:

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

El banco con autocomprobación compara las nueve muestras y las coordenadas de cada ventana, límites de filas, pausas de entrada/salida, reinicio con salida pendiente y finalización de fotograma. Para entradas de uno a dieciséis, las coordenadas son (0,0),(0,1),(1,0),(1,1). Su PASS final debe informar frames=6, windows=24, outputs=24, kernels=2 y stalled_cycles positivo. Entrega tu registro real; un comando no ejecutado no es una prueba superada. Si está disponible, inspecciona manualmente los archivos mediante un flujo de archivos admitido de DDS instalado; ejecución DDS y síntesis requieren pruebas separadas.

Ejercicio de cambio: sustituye la primera entrada por dos, comprueba a mano la primera ventana e inspecciona una forma de onda de salida pausada. Los valores y el orden de ventanas deben sobrevivir a varios ciclos con ready a nivel bajo. Eliminar la etapa registrada de ventana requiere un nuevo razonamiento de contrapresión y estabilidad de estado.

Inténtalo tú

Si se pausan en cambio los ciclos cero,uno,dos y finalmente se aceptan todas las entradas, ¿cambian los valores o el número de ventanas? ¿Cuál es el total de ciclos?

Leer la explicación

Se mantienen las mismas cuatro ventanas en el mismo orden. Dieciséis entradas aceptadas más tres pausas requieren diecinueve ciclos. Los índices aceptados siguen fijos; las llegadas en tiempo transcurrido se retrasan.

Lesson files

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

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