11 / 24 · Praktikum
Praktikum: telusuri dua tahap dan gelembung
Hitung keadaan berikutnya dari keadaan lama dan bandingkan tag, nilai, serta tepi keluaran.
Pelajaran dapat dibaca gratis. Daftar untuk menyimpan progres.
Modelkan register yang diperbarui bersama
Bangun model siklus fungsi dua tahap f(a,b)=3(a+b). Setiap iterasi mewakili satu tepi naik. Pertama terima s2 lama. Selanjutnya hitung tahap kedua yang baru dari s1 lama, lalu perbarui kedua tahap. Memperbarui s1 sebelum menghitung s2 secara keliru mengizinkan masukan melintasi dua register pada satu tepi.
Tambahkan pipeline-model.mjs secara manual ke proyek, simpan, lalu jalankan node pipeline-model.mjs di terminal Node.js. Terima empat masukan pada tepi 0 hingga 3, lalu kuras pada tepi 4 dan 5. Semua masukan diterima berdasarkan kontrak selalu siap ini. Null berarti tahap kosong; nilainya bukan nol numerik. Hasil nol yang valid tetap mewakili transaksi.
import assert from 'node:assert/strict';
const inputs = [[1,2], [250,10], [100,0], [255,255]];
let s1 = null, s2 = null;
const seen = [];
for (let edge = 0; edge < 6; edge++) {
if (s2 !== null) seen.push({ edge, ...s2 });
const next2 = s1 === null ? null : {
tag: s1.tag, y: (s1.sum * 3) % 256
};
const next1 = edge < inputs.length ? {
tag: edge, sum: inputs[edge][0] + inputs[edge][1]
} : null;
s1 = next1;
s2 = next2;
}
assert.deepEqual(seen, [
{ edge: 2, tag: 0, y: 9 },
{ edge: 3, tag: 1, y: 12 },
{ edge: 4, tag: 2, y: 44 },
{ edge: 5, tag: 3, y: 250 }
]);
assert.equal(s1, null);
assert.equal(s2, null);
console.log('PIPELINE PASS: 4 ordered results, latency=2');| Tepi | Masukan yang diterima | Keluaran yang dikirim |
|---|---|---|
| 0 | tag0:1+2 | Tidak ada |
| 1 | tag1:250+10 | Tidak ada |
| 2 | tag2:100+0 | tag0:y9 |
| 3 | tag3:255+255 | tag1:y12 |
| 4 | Gelembung | tag2:y44 |
| 5 | Gelembung | tag3:y250 |
Transaksi kedua mempertahankan jumlah 260 dan mempersempit 780 menjadi 12. Transaksi terakhir mempersempit 1530 menjadi 250. Membandingkan tepi, tag, dan nilai secara eksplisit mendeteksi kesalahan pewaktuan serta aritmetika. Gelembung pengurasan mengosongkan kedua tahap agar keluaran lama tidak berulang.
Untuk mempelajari masukan yang tidak hadir, sisipkan null pada tepi penerimaan tertentu dan naikkan tag hanya untuk transaksi yang diterima. Celah keluaran mengikuti gelembung, sementara transaksi valid tetap memiliki latensi dua tepi. Model ini tidak memiliki tekanan balik keluaran. Bab berikutnya menambahkan perilaku elastis. Kelulusan pemeriksaan Node memvalidasi model keadaan ini, bukan kompilasi HDL atau eksekusi simulasi DDS.
Coba sendiri
Jika tepi 1 tidak memiliki masukan, dan B,C,D diterima pada tepi 2,3,4, berapa tepi pengiriman untuk tag 0 hingga 3?
Baca penjelasan
A ditransfer pada tepi 2. B,C,D ditransfer pada tepi 4,5,6. Tepi 3 merupakan gelembung keluaran. Tetapkan tag berdasarkan urutan penerimaan, 0,1,2,3, bukan berdasarkan nomor tepi fisik.