Altifigence Academy

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.

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ạnhHàng trái 0Hàng trái 1Cột trên 0Cột trên 1
E01(k0)không hợp lệ5(k0)không hợp lệ
E12(k1)3(k0)7(k1)6(k0)
E2không hợp lệ4(k1)không hợp lệ8(k1)
E3khô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.

javascript
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:

bash
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvp

Ma 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.

Lesson files

schedule-lab.mjs ↓signed_mac_pe.sv ↓systolic_2x2.sv ↓tb_systolic_2x2.sv ↓

Lựa chọn áp dụng cho trình duyệt này. Có thể đổi ở chân trang bất cứ lúc nào.