Altifigence Academy

6 / 20 · Praktikum

Praktikum: elemen pemrosesan MAC bertanda

Gunakan model mandiri untuk memeriksa operand valid, penundaan, dan clear.

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.

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

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

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

Lesson files

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