Altifigence Academy

10 / 20 · Praktikum

Praktikum: larik 2×2 dengan jadwal masukan bergeser

Modelkan tundaan penerusan satu tepi dan periksa setiap akumulator antara.

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:

TepiBaris kiri 0Baris kiri 1Kolom atas 0Kolom atas 1
E01(k0)tidak valid5(k0)tidak valid
E12(k1)3(k0)7(k1)6(k0)
E2tidak valid4(k1)tidak valid8(k1)
E3tidak validtidak validtidak validtidak 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.

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');

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:

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

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

Lesson files

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

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.