Altifigence Academy

15 / 24 · Travaux pratiques

TP : fenêtres résistant aux pauses

Si les cycles zéro, un, deux sont suspendus à la place et que toutes les entrées sont finalement acceptées, les valeurs ou le nombre de fenêtres changent-ils ? Quel est le nombre total de cycles ?

Objectif et exécution

Générez des fenêtres 3×3 depuis une entrée série et vérifiez que les pauses préservent leurs valeurs et leur ordre. Créez window-lab.mjs, copiez le code et exécutez node window-lab.mjs. Il nécessite Node.js et aucun paquet. Vous pouvez créer et examiner manuellement le même fichier via un parcours de fichiers pris en charge dans Digital Design Studio installé. Cela n’établit ni une exécution dans DDS ni une création automatique de projet distant.

Le modèle suspend uniquement l’entrée acceptée. Il n’implémente ni protocole complet output-ready, ni bus mémoire, ni remplissage, ni dilatation, ni moteur multicanal. Les entrées de stalls identifient les cycles écoulés ; accepted identifie les positions d’entrée. Séparer ces compteurs est l’objet de l’exercice. Une pause laisse tampons, fenêtres et indice d’entrée inchangés.

Attentes détaillées

Interprétez un à seize avec une largeur de quatre. La première fenêtre normale a acceptedIndex dix et les valeurs [1, 2, 3, 5, 6, 7, 9, 10, 11]. Les indices de fenêtre sont [10, 11, 14, 15]. L’exécution normale prend seize cycles. Suspendre les cycles deux, trois et douze prend dix-neuf cycles et déplace la première fenêtre au cycle treize. Son indice d’entrée acceptée reste dix. La temporisation change ; contenu et ordre ne changent pas.

Les dix-sept échantillons de stockage annoncés comprennent huit emplacements de retard de ligne et neuf de fenêtre. Les tableaux JavaScript ne mesurent ni octets SRAM ni surface synthétisés. Le journal windows non borné est un relevé de vérification, et non une file matérielle finie.

Exécutez d’abord les assertions originales. Faites temporairement avancer accepted pendant une pause et confirmez l’échec de comparaison des valeurs, puis rétablissez le code. Retirer l’effacement de début de ligne tout en permettant une sortie aux premières colonnes mélangerait des colonnes de lignes différentes. Validité et progression d’état doivent être testées ensemble.

Pour comparer à une convolution directe, faites le produit scalaire de chaque fenêtre avec le même noyau aplati et remettez les sorties dans l’ordre spatial. Vérifiez la première fenêtre à la main avant de vous fier à la comparaison automatique. Conservez configuration, indices acceptés et cycles écoulés dans vos preuves pour permettre une reproduction.

Fichier exécutable

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

TP RTL : fenêtre en flux bornée

Enregistrez ensemble les pièces jointes cnn_window3x3.sv, cnn_conv3x3.sv et tb_cnn_stream.sv. Le générateur de fenêtres synthétisable accepte une image 4×4 d’int8 signés dans l’ordre par lignes par réinitialisation synchrone active à l’état haut. Il prend en charge un canal, un noyau 3×3 sans remplissage, un pas/une dilatation de un et aucun remplissage. N’avancez que lorsque in_valid et in_ready sont tous deux hauts au front montant. Conservez données/valid d’entrée pendant une pause ; une fenêtre de sortie bloquée reste également stable. Réinitialisez avant l’image suivante.

Avec Icarus Verilog installé, exécutez en externe :

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

Le banc à vérification automatique compare les neuf échantillons et coordonnées de chaque fenêtre, les frontières de lignes, les pauses d’entrée/sortie, reset avec une sortie en attente et la fin de l’image. Pour les entrées un à seize, les coordonnées sont (0, 0), (0, 1), (1, 0), (1, 1). Son PASS final doit annoncer frames=6, windows=24, outputs=24, kernels=2 et stalled_cycles positif. Remettez votre journal réel ; une commande non exécutée n’est pas une réussite. Examinez manuellement les fichiers via un parcours de fichiers pris en charge dans DDS installé si disponible ; l’exécution DDS et la synthèse nécessitent des preuves distinctes.

Exercice de modification : remplacez la première entrée par deux, vérifiez la première fenêtre à la main et inspectez une forme d’onde de sortie bloquée. Valeurs et ordre des fenêtres doivent survivre à plusieurs cycles de ready bas. Retirer l’étage de fenêtre enregistré nécessite une nouvelle justification de contre-pression et de stabilité de l’état.

Essayez vous-même

Si les cycles zéro, un, deux sont suspendus à la place et que toutes les entrées sont finalement acceptées, les valeurs ou le nombre de fenêtres changent-ils ? Quel est le nombre total de cycles ?

Lire l’explication

Les quatre mêmes fenêtres restent dans le même ordre. Seize entrées acceptées plus trois pauses prennent dix-neuf cycles. Les indices acceptés restent fixes ; les instants d’arrivée écoulés sont retardés.

Lesson files

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

Votre choix s’applique à ce navigateur. Modifiez-le à tout moment en bas de page.