15 / 24 · Thực hành
Thực hành: cửa sổ được giữ qua tạm dừng
Nếu thay vào đó tạm dừng chu kỳ 0,một,hai và mọi đầu vào cuối cùng được chấp nhận, giá trị hay số cửa sổ có đổi không? Tổng số chu kỳ là gì?
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Mục tiêu và thực thi
Tạo cửa sổ 3×3 từ đầu vào nối tiếp và kiểm chứng tạm dừng giữ giá trị, thứ tự. Tạo window-lab.mjs, sao chép mã và chạy node window-lab.mjs. Cần Node.js, không có gói. Có thể tạo thủ công và xem cùng tệp qua quy trình tệp được hỗ trợ trong Digital Design Studio đã cài. Điều này không xác lập thực thi trong DDS hay tạo dự án từ xa tự động.
Mô hình chỉ tạm dừng đầu vào được chấp nhận. Nó không triển khai giao thức output-ready đầy đủ, bus bộ nhớ, đệm, giãn hay engine nhiều kênh. Phần tử trong stalls xác định chu kỳ đã qua; accepted xác định vị trí đầu vào. Tách các bộ đếm là mục tiêu bài tập. Tạm dừng giữ bộ đệm, cửa sổ và chỉ số đầu vào không đổi.
Tính kỳ vọng
Diễn giải một đến mười sáu theo độ rộng bốn. Cửa sổ thường đầu có acceptedIndex mười và giá trị [1,2,3,5,6,7,9,10,11]. Chỉ số cửa sổ là [10,11,14,15]. Thực thi thường mất mười sáu chu kỳ. Tạm dừng chu kỳ hai, ba và mười hai mất mười chín chu kỳ và đẩy cửa sổ đầu tới chu kỳ mười ba. Chỉ số đầu vào được chấp nhận vẫn là mười. Thời gian đổi; nội dung và thứ tự không đổi.
Mười bảy mẫu lưu trữ được báo gồm tám ô độ trễ hàng và chín ô cửa sổ. Mảng JavaScript không đo byte SRAM tổng hợp hay diện tích. Log windows không giới hạn là bản ghi kiểm chứng, không phải hàng đợi phần cứng hữu hạn.
Chạy assertion gốc trước. Tạm tăng accepted khi tạm dừng và xác nhận so giá trị thất bại, rồi khôi phục. Bỏ xóa đầu hàng trong khi cho đầu ra tại cột sớm sẽ trộn cột từ các hàng khác nhau. Phải kiểm tra tính hợp lệ và tiến trạng thái cùng nhau.
Để so với tích chập trực tiếp, tính tích vô hướng mỗi cửa sổ với cùng kernel trải phẳng rồi xếp đầu ra theo thứ tự không gian. Kiểm tra tay cửa sổ đầu trước khi dựa vào so sánh tự động. Giữ cấu hình, chỉ số chấp nhận và chu kỳ đã qua trong bằng chứng để lần chạy khác tái lập kết quả.
Tệp có thể chạy
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}));Thực hành RTL: cửa sổ luồng có giới hạn
Lưu các tệp đính kèm cnn_window3x3.sv,cnn_conv3x3.sv và tb_cnn_stream.sv cùng nhau. Bộ tạo cửa sổ tổng hợp được chấp nhận một khung 4×4 signed-int8 theo hàng mỗi lần reset đồng bộ tích cực mức cao. Nó hỗ trợ một kênh,3×3 không đệm,bước trượt/độ giãn một và không padding. Chỉ tiến khi in_valid và in_ready đều cao tại cạnh lên. Giữ dữ liệu/valid đầu vào khi tạm dừng;cửa sổ đầu ra bị chặn cũng giữ ổn định. Reset trước khung tiếp theo.
Khi đã cài Icarus Verilog,chạy bên ngoài:
iverilog -g2012 -s tb_cnn_stream -o cnn-sim cnn_window3x3.sv cnn_conv3x3.sv tb_cnn_stream.sv
vvp cnn-simTestbench tự kiểm tra so mọi cửa sổ với chín mẫu và tọa độ,ranh giới hàng,tạm dừng đầu vào/đầu ra,reset khi đầu ra đang chờ và hoàn thành khung. Với đầu vào một đến mười sáu,tọa độ là (0,0),(0,1),(1,0),(1,1). PASS cuối phải báo frames=6,windows=24,outputs=24,kernels=2 và stalled_cycles dương. Nộp log thực;lệnh chưa chạy không phải vượt kiểm tra. Xem thủ công tệp qua quy trình tệp DDS đã cài được hỗ trợ nếu có;thực thi DDS và tổng hợp cần bằng chứng riêng.
Bài thay đổi:thay đầu vào đầu bằng hai,kiểm tra tay cửa sổ đầu và xem dạng sóng đầu ra tạm dừng. Giá trị/thứ tự cửa sổ phải được giữ qua nhiều chu kỳ ready thấp. Bỏ tầng cửa sổ có thanh ghi cần lập luận mới về áp lực ngược và ổn định trạng thái.
Tự thử
Nếu thay vào đó tạm dừng chu kỳ 0,một,hai và mọi đầu vào cuối cùng được chấp nhận, giá trị hay số cửa sổ có đổi không? Tổng số chu kỳ là gì?
Đọc giải thích
Cùng bốn cửa sổ vẫn theo cùng thứ tự. Mười sáu đầu vào chấp nhận cộng ba tạm dừng mất mười chín chu kỳ. Chỉ số chấp nhận giữ nguyên; thời điểm đến thực trễ hơn.