6 / 20 · Thực hành
Thực hành: phần tử xử lý MAC có dấu
Dùng mô hình độc lập để kiểm tra toán hạng hợp lệ, dừng và xóa.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Chạy quy ước một PE
Lưu thành pe-lab.mjs và chạy node pe-lab.mjs với Node.js. Chương trình không dùng gói ngoài và in PE lab passed. Nó kiểm tra mô hình số học/điều khiển; không biên dịch SystemVerilog hay chứng minh thực thi trong DDS. Xem công việc hai số hạng thông thường là W=8, K=2, AW=17, còn mô hình dùng số nguyên rộng cho tham chiếu.
PE nhận cờ valid A và B riêng. Nó chỉ tích lũy khi cả hai đúng. Chuyển tiếp theo cờ valid riêng của từng toán hạng. Bài sau thêm thẻ để bảo đảm hai toán hạng hợp lệ thuộc cùng số hạng rút gọn.
import assert from 'node:assert/strict';
const pe = {acc:0,a:0,b:0,av:false,bv:false};
function edge({a=0,b=0,av=false,bv=false,
advance=true,clear=false,reset=false}={}) {
if (reset || clear) {
Object.assign(pe,{acc:0,a:0,b:0,av:false,bv:false});
} else if (advance) {
if (av && bv) pe.acc += a*b;
Object.assign(pe,{a,b,av,bv});
}
return {...pe};
}
edge({clear:true});
assert.equal(edge({a:-2,b:3,av:true,bv:true}).acc,-6);
const held={...pe};
assert.deepEqual(edge({a:99,b:99,av:true,bv:true,advance:false}),held);
assert.equal(edge({a:4,b:-5,av:true,bv:true}).acc,-26);
assert.equal(edge({a:8,b:8,av:true,bv:false}).acc,-26);
assert.equal(pe.av,true); assert.equal(pe.bv,false);
edge({clear:true,a:100,b:100,av:true,bv:true});
assert.equal(pe.acc,0); assert.equal(pe.av,false);
assert.equal(edge({a:-128,b:-128,av:true,bv:true}).acc,16384);
edge({reset:true,advance:false});
assert.deepEqual(pe,{acc:0,a:0,b:0,av:false,bv:false});
console.log('PE lab passed');Dự đoán và thử thách kết quả
Cặp đầu tạo −6. Tạm dừng bỏ qua các giá trị 99 được đưa ra và giữ toàn bộ trạng thái. Cặp hợp lệ tiếp theo đóng góp −20, đạt −26. Token A chưa ghép cặp được chuyển tiếp nhưng không đóng góp MAC. Clear ưu tiên hơn cặp hợp lệ đồng thời; sau đó nhỏ nhất×nhỏ nhất cho 16384. Reset xóa trạng thái valid ngay cả khi advance sai.
Chuyển cùng thứ tự ưu tiên vào always_ff bằng tín hiệu tích và số hạng cộng có dấu rõ ràng. Khi mô hình hóa mảng, đọc trạng thái cũ và ghi trạng thái tiếp theo riêng. Cập nhật đối tượng PE tại chỗ có thể vô tình cho token vượt nhiều PE trong một cạnh.
Đổi điều kiện tích lũy từ AND sang OR. Assertion token chưa ghép cặp phải thất bại. Cũng thử chỉ áp dụng advance cho bộ tích lũy trong khi cho chuyển tiếp di chuyển. Giải thích mỗi assertion bảo vệ quy ước nào; chỉ thông báo vượt kiểm tra chưa phải toàn bộ kết quả học tập.
Ghi riêng toán hạng đưa ra và toán hạng đã nhận:các giá trị chín mươi chín bị tạm dừng thấy được tại giao diện nhưng không bao giờ được nhận. Lớp bao phải giữ số hạng được lập lịch tiếp đến khi advance tiếp tục. Bản sao trạng thái trả về giữ quan sát trước đó. Xem cờ valid chuyển tiếp cùng bộ tích lũy khi chuyển các phép kiểm tra sang testbench dựa trên dạng sóng.
RTL thực: PE MAC có dấu
Lưu các tệp đính kèm signed_mac_pe.sv,systolic_2x2.sv và tb_systolic_2x2.sv cùng nhau. Hai tệp đầu là RTL tổng hợp được;testbench chỉ dùng mô phỏng. PE mở rộng dấu tích đầy đủ 2W bit sang AW trước tích lũy. Kiểm tra W=8,K=4 dùng AW=18 cho 65536,−65024 và 64516. Thẻ k có thứ tự từ chối số hạng không khớp qua protocol_error.
Ưu tiên là reset,clear rồi advance. Clear hoàn tất trước cạnh dữ liệu đầu. Quan sát bộ tích lũy cập nhật sau mỗi cạnh lên;phần tử bên cạnh nhận chuyển tiếp có thanh ghi tại cạnh advance tiếp theo. Tạm dừng giữ mọi giá trị,cờ valid,thẻ và count. Một công việc chạy giữa các clear,không lượng tử hóa đầu ra hay tích hợp DDS.
Khi đã cài Icarus Verilog,chạy:
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpKỳ vọng RTL PASS:;lỗi kết thúc bằng $fatal. Sửa addend dùng mở rộng bằng 0 và tái hiện lỗi ma trận âm. Giải thích bộ tích lũy PE sai đầu tiên,khôi phục mở rộng dấu rồi chạy lại. Giữ log Node và HDL riêng.
Tự thử
Chèn cặp hợp lệ (0,7) giữa (−2,3) và (4,−5). Tổng là gì, và số 0 hợp lệ khác token không hợp lệ thế nào?
Đọc giải thích
Tổng là −26. Số 0 hợp lệ vẫn nhận một số hạng k thực và tăng đếm số hạng cùng thẻ. Token không hợp lệ không nhận số hạng nào. Với công việc ba số hạng, cập nhật K, phân tích độ rộng và điều khiển hoàn thành tương ứng.