10 / 20 · Thực hành
Thực hành: mảng 2×2 lệch thời gian
Mô hình hóa độ trễ chuyển tiếp một cạnh và kiểm tra mọi bộ tích lũy trung gian.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Cho các giá trị k bằng nhau gặp nhau
Đưa A(i,k) vào biên trái tại cạnh logic k+i và B(k,j) vào phía trên tại k+j. Chuyển tiếp có thanh ghi thêm j cạnh ngang và i cạnh dọc. Vì vậy cả hai toán hạng tới PE(i,j) tại k+i+j. Việc đưa vào so le này là độ lệch đầu vào.
Với A=[[1,2],[3,4]], B=[[5,6],[7,8]], clear hoàn tất trước E0. Lịch biên là:
| Cạnh | Hàng trái 0 | Hàng trái 1 | Cột trên 0 | Cột trên 1 |
|---|---|---|---|---|
| E0 | 1(k0) | không hợp lệ | 5(k0) | không hợp lệ |
| E1 | 2(k1) | 3(k0) | 7(k1) | 6(k0) |
| E2 | không hợp lệ | 4(k1) | không hợp lệ | 8(k1) |
| E3 | không hợp lệ | không hợp lệ | không hợp lệ | không hợp lệ |
Lưu đoạn sau thành schedule-lab.mjs và chạy node schedule-lab.mjs. Không cần gói và chương trình in Schedule lab passed. Token không hợp lệ là null; token hợp lệ mang value và k. Mô hình một công việc này bỏ thẻ job nhưng kiểm tra k rõ ràng.
import assert from 'node:assert/strict';
const A=[[1,2],[3,4]],B=[[5,6],[7,8]],N=2,K=2;
const fresh=()=>({a:null,b:null,acc:0,count:0});
let grid=Array.from({length:N},()=>Array.from({length:N},fresh));
const expected=[[[5,0],[0,0]],[[19,6],[15,0]],
[[19,22],[43,18]],[[19,22],[43,50]]];
const token=(value,k)=>({value,k});
for(let t=0;t<K+2*N-2;t++) {
const next=grid.map(r=>r.map(p=>({...p})));
for(let i=0;i<N;i++) for(let j=0;j<N;j++) {
const ka=t-i,kb=t-j;
const a=j?grid[i][j-1].a:(ka>=0&&ka<K?token(A[i][ka],ka):null);
const b=i?grid[i-1][j].b:(kb>=0&&kb<K?token(B[kb][j],kb):null);
const p=next[i][j];p.a=a;p.b=b;
if(a&&b){assert.equal(a.k,b.k);assert.equal(a.k,p.count);
p.acc+=a.value*b.value;p.count++;}
}
grid=next;
assert.deepEqual(grid.map(r=>r.map(p=>p.acc)),expected[t]);
}
assert.deepEqual(grid.map(r=>r.map(p=>p.count)),[[2,2],[2,2]]);
console.log('Schedule lab passed');Mỗi PE đọc trạng thái cũ và ghi trạng thái tiếp theo. Lặp tại chỗ sẽ cho chuyển tiếp nhiều bước trong một cạnh một cách sai lệch.
Sau E0 chỉ bộ tích lũy C(0,0) bằng năm. E1 hoàn thành nó tại mười chín và bắt đầu các phần tử bên cạnh tại sáu và mười lăm. E2 hoàn thành chúng tại hai mươi hai và bốn mươi ba, trong khi PE cuối chỉ có mười tám. E3 cộng ba mươi hai để được năm mươi.
Đổi việc đưa vào hàng từ t−i thành t. Assertion thẻ phải phát hiện mất đồng bộ. Hoàn thành đòi hỏi bốn cạnh advance và mọi count bằng hai. Không tính khởi tạo và truyền đầu ra nối tiếp. Mô hình có thể chạy này xác nhận lịch đã nêu mà không khẳng định thực thi RTL hay DDS.
RTL thực: lưới 2×2 có thanh ghi
Tệp systolic_2x2.sv đính kèm nối bốn thực thể từ signed_mac_pe.sv,giới hạn N=K=2. A sang phải,B xuống dưới qua liên kết có thanh ghi mang valid và thẻ k. Bên cấp biên ngoài tạo độ lệch;task step của testbench trực tiếp lái lịch E0..E3. Clear hoàn tất trước E0,không có pipeline bộ nhân bổ sung.
Lưu cả ba tệp đính kèm cùng nhau rồi chạy Icarus Verilog:
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpMa trận sau cạnh là [[5,0],[0,0]],[[19,6],[15,0]],[[19,22],[43,18]] và [[19,22],[43,50]]. Done chỉ kích hoạt sau E3. Hai tạm dừng cho bốn cạnh advance và sáu cạnh tính toán vật lý. Kiểm tra cũng bao quát [[10,9],[−6,3]],giữ toàn bộ trạng thái và reset giữa công việc. Kỳ vọng RTL PASS:.
Trong bài sửa RTL,thay một liên kết toán hạng có thanh ghi bằng đường tổ hợp. Dự đoán lỗi đồng bộ thẻ hoặc tổng trung gian đầu tiên,so log và khôi phục thanh ghi. Mở rộng lưới lên N×N cần xem lại kết nối,độ lệch,độ rộng,thẻ và hoàn thành cùng nhau.
Tự thử
Sau E2, bộ tích lũy và số hạng còn lại của PE(1,1) là gì? Vì sao nó đổi tại E3 dù đầu vào biên không hợp lệ?
Đọc giải thích
Bộ tích lũy bằng 18 từ 3×6, còn 4×8=32. Các toán hạng đó nằm trong thanh ghi chuyển tiếp nội bộ và tới tại E3; biên không hợp lệ không làm mảng trống tức thời.