Altifigence Academy

15 / 24 · Esercitazione

Laboratorio: finestre che resistono alle pause

Se invece i cicli zero,uno,due sono in pausa e tutti gli ingressi vengono infine accettati, cambiano valori o numero delle finestre? Qual è il conteggio totale dei cicli?

Obiettivo ed esecuzione

Genera finestre 3×3 da un ingresso seriale e verifica che le pause ne conservino valori e ordine. Crea window-lab.mjs, copia il codice ed esegui node window-lab.mjs. Richiede Node.js e nessun pacchetto. Puoi creare e ispezionare manualmente lo stesso file tramite un flusso file supportato in Digital Design Studio installato. Questo non attesta esecuzione dentro DDS o creazione automatica di un progetto remoto.

Il modello ferma soltanto l'ingresso accettato. Non implementa un protocollo completo output-ready, un bus di memoria, riempimento, dilatazione o un motore multicanale. Gli elementi in stalls identificano cicli trascorsi; accepted identifica posizioni di ingresso. Separare questi contatori è il punto dell'esercizio. Una pausa lascia invariati buffer, finestre e indice di ingresso.

Risultati attesi svolti

Interpreta da uno a sedici con larghezza quattro. La prima finestra normale ha acceptedIndex dieci e valori [1,2,3,5,6,7,9,10,11]. Gli indici delle finestre sono [10,11,14,15]. L'esecuzione normale richiede sedici cicli. Fermare i cicli due, tre e dodici richiede diciannove cicli e sposta la prima finestra al ciclo tredici. Il suo indice di ingresso accettato rimane dieci. Cambia la temporizzazione; contenuto e ordinamento rimangono uguali.

I diciassette campioni di memoria riportati comprendono otto posizioni di ritardo di riga e nove della finestra. Gli array JavaScript non misurano byte SRAM o area sintetizzati. Il log windows illimitato è un registro di verifica, non una coda hardware finita.

Esegui prima le asserzioni originali. Avanza temporaneamente accepted durante una pausa e conferma che il confronto dei valori fallisce, poi ripristina il codice. Rimuovere l'azzeramento a inizio riga consentendo uscite dalle prime colonne mescolerebbe colonne di righe differenti. Validità e avanzamento dello stato devono essere verificati insieme.

Per confrontare con la convoluzione diretta, calcola il prodotto scalare di ogni finestra con lo stesso kernel appiattito e ricomponi le uscite in ordine spaziale. Verifica a mano la prima finestra prima di affidarti al confronto automatico. Conserva configurazione, indici accettati e cicli trascorsi nelle prove affinché un'altra esecuzione possa riprodurre il risultato.

File eseguibile

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

Laboratorio RTL: finestra in streaming limitata

Salva insieme gli allegati cnn_window3x3.sv, cnn_conv3x3.sv e tb_cnn_stream.sv. Il generatore sintetizzabile di finestre accetta un frame 4×4 int8 con segno in ordine per righe per ogni reset sincrono attivo alto. Supporta un solo canale, 3×3 senza riempimento, passo/dilatazione uno. Avanza soltanto quando in_valid e in_ready sono entrambi alti a un fronte di salita. Mantieni dati/valid di ingresso durante una pausa; anche una finestra di uscita bloccata rimane stabile. Applica reset prima del frame successivo.

Con Icarus Verilog installato, esegui esternamente:

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

Il testbench autoverificante confronta i nove campioni e le coordinate di ogni finestra, i confini di riga, le pause di ingresso/uscita, il reset con uscita in sospeso e il completamento del frame. Per gli ingressi da uno a sedici, le coordinate sono (0,0),(0,1),(1,0),(1,1). Il PASS finale deve riportare frames=6, windows=24, outputs=24, kernels=2 e stalled_cycles positivo. Consegna il log effettivo; un comando non eseguito non è un test superato. Ispeziona manualmente i file tramite un flusso file supportato di DDS installato, se disponibile; esecuzione DDS e sintesi richiedono prove separate.

Esercizio di modifica: sostituisci il primo ingresso con due, verifica a mano la prima finestra ed esamina una forma d'onda di uscita in pausa. Valori/ordine delle finestre devono resistere a più cicli con ready basso. Rimuovere lo stadio registrato della finestra richiede una nuova argomentazione di contropressione e stabilità dello stato.

Prova tu

Se invece i cicli zero,uno,due sono in pausa e tutti gli ingressi vengono infine accettati, cambiano valori o numero delle finestre? Qual è il conteggio totale dei cicli?

Leggi la spiegazione

Le stesse quattro finestre rimangono nello stesso ordine. Sedici ingressi accettati più tre pause richiedono diciannove cicli. Gli indici accettati rimangono fissi; i tempi di arrivo trascorsi si spostano più avanti.

Lesson files

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

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.