6 / 20 · Praktikum
Praktikum: elemen pemrosesan MAC bertanda
Gunakan model mandiri untuk memeriksa operand valid, penundaan, dan clear.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Jalankan kontrak satu PE
Simpan ini sebagai pe-lab.mjs dan jalankan node pe-lab.mjs dengan Node.js. Program tidak menggunakan paket eksternal dan mencetak PE lab passed. Ini memeriksa model aritmetika/kendali; tidak mengompilasi SystemVerilog atau menunjukkan eksekusi dalam DDS. Anggap pekerjaan dua suku biasa memiliki W=8, K=2, AW=17, sedangkan model menggunakan bilangan bulat lebar untuk acuannya.
PE menerima flag valid A dan B secara terpisah. PE hanya mengakumulasi ketika keduanya benar. Penerusan mengikuti flag valid masing-masing operand. Pelajaran berikutnya menambahkan tag untuk memastikan bahwa dua operand valid berasal dari suku reduksi yang sama.
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');Prediksi dan tantang hasilnya
Pasangan pertama menghasilkan −6. Jeda mengabaikan nilai 99 yang ditawarkan dan menahan seluruh keadaan. Pasangan valid berikutnya menyumbangkan −20, sehingga mencapai −26. Token A tanpa pasangan diteruskan, tetapi tidak menyumbangkan MAC. Clear mengalahkan pasangan valid yang hadir bersamaan; minimum×minimum kemudian menghasilkan 16384. Reset mengosongkan status valid bahkan ketika advance bernilai false.
Terjemahkan prioritas yang sama ke dalam always_ff dengan sinyal hasil perkalian dan nilai tambah yang secara eksplisit bertanda. Saat memodelkan larik, baca keadaan lama dan tulis keadaan berikutnya secara terpisah. Memperbarui objek PE langsung di tempat dapat secara tidak sengaja membiarkan token melintasi beberapa PE dalam satu tepi.
Ubah kondisi akumulasi dari AND menjadi OR. Assertion untuk token tanpa pasangan harus gagal. Coba juga menerapkan advance hanya pada akumulator sementara penerusan diizinkan bergerak. Jelaskan kontrak mana yang dilindungi setiap assertion; pesan kelulusan saja bukan seluruh hasil pembelajaran.
Catat operand yang ditawarkan secara terpisah dari operand yang dikonsumsi: nilai sembilan puluh sembilan saat jeda terlihat pada antarmuka tetapi tidak pernah dikonsumsi. Pembungkus harus mempertahankan suku terjadwal berikutnya hingga advance berlanjut. Salinan keadaan yang dikembalikan mempertahankan pengamatan sebelumnya. Periksa flag valid penerusan serta akumulator saat menerjemahkan pemeriksaan ini menjadi testbench berbasis bentuk gelombang.
RTL nyata: PE MAC bertanda
Simpan lampiran signed_mac_pe.sv, systolic_2x2.sv, dan tb_systolic_2x2.sv bersama. Dua berkas pertama merupakan RTL yang dapat disintesis; testbench hanya untuk simulasi. PE memperluas tanda hasil perkalian penuh 2W bit menjadi AW sebelum akumulasi. Pemeriksaan W=8,K=4 menggunakan AW=18 untuk 65536, −65024, dan 64516. Tag k berurutan menolak suku tidak cocok melalui protocol_error.
Prioritasnya reset, clear, lalu advance. Clear selesai sebelum tepi data pertama. Amati akumulator yang diperbarui setelah setiap tepi naik; tetangga mengonsumsi penerusan berregister pada tepi advance berikutnya. Jeda menahan setiap nilai, flag valid, tag, dan count. Satu pekerjaan berjalan di antara clear, tanpa kuantisasi keluaran atau integrasi DDS.
Dengan Icarus Verilog terpasang, jalankan:
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpHarapkan RTL PASS:; kegagalan berakhir dengan $fatal. Ubah addend agar menggunakan perluasan nol dan reproduksi kegagalan matriks negatif. Jelaskan akumulator PE pertama yang tidak cocok, pulihkan perluasan tanda, lalu jalankan ulang. Simpan log Node dan HDL terpisah.
Coba sendiri
Sisipkan pasangan valid (0,7) di antara (−2,3) dan (4,−5). Berapa jumlahnya, dan bagaimana nol yang valid berbeda dari token tidak valid?
Baca penjelasan
Jumlahnya −26. Nol yang valid tetap mengonsumsi suku k nyata dan memajukan hitungan suku serta tag. Token tidak valid tidak mengonsumsi suku. Untuk pekerjaan tiga suku, perbarui K, analisis lebar, dan kendali penyelesaian sesuai kebutuhan.