15 / 24 · Praktikum
Praktikum: jendela yang bertahan saat jeda
Jika siklus nol,satu,dua yang dijeda dan seluruh masukan akhirnya diterima, apakah nilai atau jumlah jendela berubah? Berapa jumlah siklus total?
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Tujuan dan eksekusi
Hasilkan jendela 3×3 dari masukan serial dan verifikasi bahwa jeda mempertahankan nilai serta urutannya. Buat window-lab.mjs, salin kode, lalu jalankan node window-lab.mjs. Program membutuhkan Node.js tanpa paket. Anda boleh membuat dan memeriksa berkas yang sama secara manual melalui alur berkas yang didukung dalam Digital Design Studio terpasang. Ini tidak membuktikan eksekusi di dalam DDS atau pembuatan proyek jarak jauh otomatis.
Model hanya menjeda masukan yang diterima. Model tidak mengimplementasikan protokol output-ready lengkap, bus memori, padding, dilation, atau mesin multikanal. Entri stalls mengidentifikasi siklus berlalu; accepted mengidentifikasi posisi masukan. Pemisahan penghitung tersebut merupakan inti latihan. Jeda membiarkan penyangga, jendela, dan indeks masukan tidak berubah.
Contoh hasil yang diharapkan
Tafsirkan satu hingga enam belas dengan lebar empat. Jendela normal pertama memiliki acceptedIndex sepuluh dan nilai [1,2,3,5,6,7,9,10,11]. Indeks jendela adalah [10,11,14,15]. Eksekusi normal membutuhkan enam belas siklus. Menjeda siklus dua, tiga, dan dua belas membutuhkan sembilan belas siklus serta memindahkan jendela pertama ke siklus tiga belas. Indeks masukan diterimanya tetap sepuluh. Pewaktuan berubah; isi dan urutan tidak.
Tujuh belas sampel penyimpanan yang dilaporkan terdiri dari delapan slot tundaan baris dan sembilan slot jendela. Larik JavaScript tidak mengukur byte atau luas SRAM hasil sintesis. Log windows tanpa batas merupakan catatan verifikasi, bukan antrean perangkat keras berhingga.
Jalankan assertion asli dahulu. Majukan accepted sementara selama jeda dan pastikan perbandingan nilai gagal, lalu pulihkan kode. Menghapus pengosongan awal baris sambil mengizinkan keluaran kolom awal akan mencampur kolom dari baris berbeda. Validitas dan kemajuan keadaan harus diuji bersama.
Untuk membandingkan dengan konvolusi langsung, hitung hasil kali titik setiap jendela dengan kernel rata yang sama dan susun keluaran dalam urutan spasial. Periksa jendela pertama secara manual sebelum mengandalkan perbandingan otomatis. Simpan konfigurasi, indeks yang diterima, dan siklus berlalu dalam bukti agar eksekusi lain dapat mereproduksi hasil.
Berkas yang dapat dijalankan
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}));Praktikum RTL: jendela aliran dengan cakupan terbatas
Simpan lampiran cnn_window3x3.sv, cnn_conv3x3.sv, dan tb_cnn_stream.sv bersama. Pembentuk jendela yang dapat disintesis menerima satu frame 4×4 bertanda int8 dalam urutan per baris per reset sinkron aktif-tinggi. Modul mendukung satu kanal, 3×3 valid, stride/dilation satu, dan tanpa padding. Maju hanya ketika in_valid dan in_ready sama-sama tinggi pada tepi naik. Tahan data/valid masukan selama jeda; jendela keluaran yang terblokir juga tetap stabil. Lakukan reset sebelum frame berikutnya.
Dengan Icarus Verilog terpasang, jalankan secara eksternal:
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-simTestbench yang memeriksa dirinya sendiri membandingkan sembilan sampel dan koordinat setiap jendela, batas baris, jeda masukan/keluaran, reset saat keluaran menunggu, dan penyelesaian frame. Untuk masukan satu hingga enam belas, koordinatnya (0,0),(0,1),(1,0),(1,1). PASS akhirnya harus melaporkan frames=6, windows=24, outputs=24, kernels=2, dan stalled_cycles positif. Serahkan log sebenarnya; perintah yang belum dijalankan bukan kelulusan. Periksa berkas secara manual melalui alur berkas DDS terpasang yang didukung jika tersedia; eksekusi DDS dan sintesis membutuhkan bukti terpisah.
Latihan perubahan: ganti masukan pertama dengan dua, periksa jendela pertama secara manual, dan amati bentuk gelombang keluaran berjeda. Nilai/urutan jendela harus bertahan selama beberapa siklus ready rendah. Penghapusan tahap jendela berregister memerlukan penalaran baru tentang tekanan balik dan kestabilan keadaan.
Coba sendiri
Jika siklus nol,satu,dua yang dijeda dan seluruh masukan akhirnya diterima, apakah nilai atau jumlah jendela berubah? Berapa jumlah siklus total?
Baca penjelasan
Empat jendela yang sama tetap dalam urutan sama. Enam belas masukan diterima ditambah tiga jeda membutuhkan sembilan belas siklus. Indeks diterima tetap; waktu kedatangan yang berlalu menjadi lebih lambat.