Altifigence Academy

15 / 24 · Практика

Лабораторная работа: окна, переживающие паузы

Если вместо этого приостановить такты ноль,один,два и все входы со временем принять, изменятся ли значения или число окон? Каково общее число тактов?

Цель и выполнение

Генерируйте окна 3×3 из последовательного входа и проверяйте сохранение их значений и порядка при паузах. Создайте window-lab.mjs, скопируйте код и выполните node window-lab.mjs. Нужен Node.js без пакетов. Можно вручную создать и исследовать тот же файл через поддерживаемую работу с файлами в установленной Digital Design Studio. Это не устанавливает выполнение внутри DDS или автоматическое создание удалённого проекта.

Модель приостанавливает только приём входа. Она не реализует полный протокол output-ready, шину памяти, дополнение, прореживание или многоканальный движок. Записи stalls обозначают прошедшие такты; accepted — входные позиции. Разделение этих счётчиков — цель упражнения. Пауза оставляет буферы, окна и индекс входа неизменными.

Разобранные ожидания

Интерпретируйте один–шестнадцать с шириной четыре. Первое обычное окно имеет acceptedIndex десять и значения [1,2,3,5,6,7,9,10,11]. Индексы окон — [10,11,14,15]. Обычное выполнение занимает шестнадцать тактов. Паузы тактов два, три и двенадцать дают девятнадцать тактов и перемещают первое окно в такт тринадцать. Его индекс принятого входа остаётся десять. Время меняется; содержимое и порядок — нет.

Сообщаемые семнадцать хранимых отсчётов состоят из восьми мест задержки строк и девяти мест окна. Массивы JavaScript не измеряют синтезированные байты SRAM или площадь. Неограниченный журнал windows — запись верификации, а не конечная аппаратная очередь.

Сначала выполните исходные утверждения. Временно продвигайте accepted во время паузы и подтвердите провал сравнения значений, затем восстановите код. Удаление очистки начала строки при разрешении выхода ранних столбцов смешало бы столбцы разных строк. Достоверность и продвижение состояния нужно проверять вместе.

Для сравнения с прямой свёрткой вычислите скалярное произведение каждого окна с тем же развёрнутым ядром и сложите выходы в пространственном порядке. Проверьте первое окно вручную до автоматического сравнения. Сохраняйте конфигурацию, принятые индексы и прошедшие такты в свидетельствах для воспроизводимости.

Исполняемый файл

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

Лабораторная работа RTL: ограниченное потоковое окно

Сохраните вложения cnn_window3x3.sv, cnn_conv3x3.sv и tb_cnn_stream.sv вместе. Синтезируемый генератор окон принимает один знаковый кадр int8 4×4 с обходом по строкам на каждый синхронный сброс активного высокого уровня. Он поддерживает один канал, 3×3 без дополнения, единичные шаг/прореживание. Продвигайте только при одновременно высоких in_valid и in_ready на переднем фронте. Удерживайте входные data/valid при паузе; заблокированное выходное окно тоже остаётся стабильным. Сбрасывайте перед следующим кадром.

При установленном Icarus Verilog выполните внешней командой:

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

Самопроверяющийся стенд сравнивает девять отсчётов и координаты каждого окна, границы строк, паузы входа/выхода, сброс с ожидающим выходом и завершение кадра. Для входов один–шестнадцать координаты — (0,0),(0,1),(1,0),(1,1). Итоговый PASS должен сообщить frames=6, windows=24, outputs=24, kernels=2 и положительный stalled_cycles. Предоставьте реальный журнал; невыполненная команда не является успехом. Вручную исследуйте файлы через поддерживаемый процесс установленной DDS, если доступен; выполнение DDS и синтез требуют отдельных свидетельств.

Упражнение изменения: замените первый вход на два, вручную проверьте первое окно и исследуйте временную диаграмму остановленного выхода. Значения/порядок окон должны переживать несколько тактов низкого ready. Удаление регистровой ступени окна требует нового обоснования обратного давления и стабильности состояния.

Попробуйте сами

Если вместо этого приостановить такты ноль,один,два и все входы со временем принять, изменятся ли значения или число окон? Каково общее число тактов?

Прочитать объяснение

Те же четыре окна остаются в том же порядке. Шестнадцать принятых входов плюс три паузы занимают девятнадцать тактов. Принятые индексы фиксированы; прошедшее время прибытия сдвигается позже.

Lesson files

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

Выбор действует в этом браузере. Его можно изменить внизу страницы.