15 / 20 · Praktikum
Praktikum: tekanan balik dan reset
Jalankan jeda global, penahanan hasil, dan reset pekerjaan yang terputus.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Jedakan waktu logis sebagai satu kesatuan
Larik pembelajaran kita menggunakan advance global. Penjadwal batas dan setiap PE hanya bergerak ketika bundel langkah logis berikutnya tersedia. Lajur yang dijadwalkan tidak valid tidak memerlukan operand nyata. Memajukan hanya satu aliran merusak penggeseran jadwal. Sambungan yang tertunda secara independen memerlukan penyangga dan aturan pencocokan tambahan di luar dasar ini.
Keluaran menggunakan kontrak valid/ready terpisah. Setelah hasil siap, tahan valid, data, dan job tetap stabil hingga tepi dengan valid&&ready mentransfernya tepat sekali. Pembungkus sederhana tidak memulai pekerjaan baru selama hasil lama masih menunggu. Kesiapan penerima tidak harus menghentikan komputasi jika tersedia penyimpanan hasil yang memadai.
Simpan ini sebagai stall-lab.mjs dan jalankan node stall-lab.mjs. Program memodelkan PE dua suku ditambah register hasil, tidak memerlukan paket, dan mencetak Stall/reset lab passed.
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
if(rst){reset();return null;}
if(s.valid){if(!ready)return null;
const out={data:s.data,job:s.job};s.valid=false;return out;}
if(advance&&s.step<pairs.length){
const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');Tafsirkan pemeriksaannya
Jeda menahan jumlah pertama −6 dan posisi jadwal. Suku kedua menghasilkan −26. Dua tepi keluaran yang terblokir mempertahankan hasil; tepi siap mentransfernya sekali. Reset selama pekerjaan belum selesai mengosongkan akumulator, posisi, dan status valid hasil, sehingga pemulihan memulai ulang pekerjaan.
Menambahkan dua jeda global ke jadwal 2×2 empat langkah menghasilkan empat tepi advance dan enam tepi fisik. Hasil dan daftar k yang dikonsumsi harus cocok dengan eksekusi tanpa penundaan. Rumus penyelesaian logis tetap sama.
Ini adalah acuan kendali sinkron. Sinkronisasi reset fisik dan perpindahan domain clock memerlukan desain terpisah. Pekerjaan yang dibatalkan oleh reset tidak boleh melaporkan penyelesaian berhasil; kosongkan penyangga di hulu sebelum memulai ulang. Keberhasilan model tidak membuktikan penerimaan RTL, aplikasi terpasang, atau perangkat keras.
Coba sendiri
Tahan valid=1 dan ready=0 selama tiga tepi, lalu aktifkan ready. Sinyal mana yang harus ditahan, berapa transfer terjadi, dan bagaimana jika reset tiba saat menunggu?
Baca penjelasan
Tahan data, job, dan valid. Selama menunggu tidak ada hasil ditransfer; tepi siap mentransfer satu. Reset membuang status valid yang menunggu dan tidak boleh mengirim pekerjaan itu sebagai berhasil. Pemberitahuan pembatalan apa pun memerlukan kontrak status terpisah.