10 / 20 · Praktikum
Praktikum: larik 2×2 dengan jadwal masukan bergeser
Modelkan tundaan penerusan satu tepi dan periksa setiap akumulator antara.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Pertemukan nilai k yang sama
Injeksikan A(i,k) pada batas kiri di tepi logis k+i dan B(k,j) pada batas atas di k+j. Penerusan berregister menambahkan j tepi secara horizontal dan i secara vertikal. Karena itu kedua operand mencapai PE(i,j) pada k+i+j. Injeksi bertahap ini adalah penggeseran jadwal masukan.
Untuk A=[[1,2],[3,4]], B=[[5,6],[7,8]], clear selesai sebelum E0. Jadwal batasnya adalah:
| Tepi | Baris kiri 0 | Baris kiri 1 | Kolom atas 0 | Kolom atas 1 |
|---|---|---|---|---|
| E0 | 1(k0) | tidak valid | 5(k0) | tidak valid |
| E1 | 2(k1) | 3(k0) | 7(k1) | 6(k0) |
| E2 | tidak valid | 4(k1) | tidak valid | 8(k1) |
| E3 | tidak valid | tidak valid | tidak valid | tidak valid |
Simpan berikut ini sebagai schedule-lab.mjs dan jalankan node schedule-lab.mjs. Program tidak memerlukan paket dan mencetak Schedule lab passed. Token tidak valid adalah null; token valid membawa value dan k. Model satu pekerjaan ini tidak menyertakan tag job, tetapi memeriksa k secara eksplisit.
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');Setiap PE membaca keadaan lama dan menulis keadaan berikutnya. Iterasi yang memperbarui langsung di tempat secara keliru mengizinkan penerusan beberapa lompatan dalam satu tepi.
Setelah E0 hanya akumulator C(0,0) bernilai lima. E1 menyelesaikannya pada sembilan belas dan memulai tetangganya pada enam dan lima belas. E2 menyelesaikan keduanya pada dua puluh dua dan empat puluh tiga, sementara PE terakhir baru memiliki delapan belas. E3 menambahkan tiga puluh dua untuk menghasilkan lima puluh.
Ubah injeksi baris dari t−i menjadi t. Assertion tag seharusnya mendeteksi ketidakselarasan. Penyelesaian membutuhkan empat tepi advance dan setiap count sama dengan dua. Inisialisasi dan transfer keluaran serial tidak termasuk. Model yang dapat dijalankan ini memvalidasi jadwal yang dinyatakan tanpa mengklaim eksekusi RTL atau DDS.
RTL nyata: kisi 2×2 berregister
Lampiran systolic_2x2.sv menghubungkan empat instans dari signed_mac_pe.sv, dibatasi ke N=K=2. A bergerak ke kanan dan B ke bawah melalui sambungan berregister yang membawa valid serta tag k. Pemasok batas eksternal melakukan penggeseran jadwal; task step pada testbench menggerakkan jadwal E0..E3 secara langsung. Clear selesai sebelum E0 dan tidak ada pipeline pengali tambahan.
Simpan ketiga lampiran bersama dan jalankan Icarus Verilog:
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpMatriks setelah tepi adalah [[5,0],[0,0]], [[19,6],[15,0]], [[19,22],[43,18]], dan [[19,22],[43,50]]. Done aktif hanya setelah E3. Dua jeda memberi empat tepi advance dan enam tepi komputasi fisik. Pemeriksaan juga mencakup [[10,9],[−6,3]], penahanan keadaan lengkap, dan reset di tengah pekerjaan. Harapkan RTL PASS:.
Untuk latihan modifikasi RTL, ganti sambungan operand berregister dengan jalur kombinasional. Prediksi kegagalan keselarasan tag atau jumlah antara pertama, bandingkan log, lalu pulihkan register. Perluasan kisi ini menjadi N×N membutuhkan peninjauan ulang pengawatan, penggeseran jadwal, lebar, tag, dan penyelesaian secara bersama.
Coba sendiri
Setelah E2, berapa akumulator PE(1,1) dan suku yang tersisa? Mengapa nilainya berubah pada E3 meskipun masukan batas tidak valid?
Baca penjelasan
Akumulatornya 18 dari 3×6, dengan 4×8=32 tersisa. Operand itu berada dalam register penerusan internal dan tiba pada E3; batas tidak valid tidak langsung mengosongkan larik.