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 во время паузы и подтвердите провал сравнения значений, затем восстановите код. Удаление очистки начала строки при разрешении выхода ранних столбцов смешало бы столбцы разных строк. Достоверность и продвижение состояния нужно проверять вместе.
Для сравнения с прямой свёрткой вычислите скалярное произведение каждого окна с тем же развёрнутым ядром и сложите выходы в пространственном порядке. Проверьте первое окно вручную до автоматического сравнения. Сохраняйте конфигурацию, принятые индексы и прошедшие такты в свидетельствах для воспроизводимости.
Исполняемый файл
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 выполните внешней командой:
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. Удаление регистровой ступени окна требует нового обоснования обратного давления и стабильности состояния.
Попробуйте сами
Если вместо этого приостановить такты ноль,один,два и все входы со временем принять, изменятся ли значения или число окон? Каково общее число тактов?
Прочитать объяснение
Те же четыре окна остаются в том же порядке. Шестнадцать принятых входов плюс три паузы занимают девятнадцать тактов. Принятые индексы фиксированы; прошедшее время прибытия сдвигается позже.