Altifigence Academy

3 / 24 · Praktikum

Praktikum: model acuan ALU delapan bit

Periksa ADD, SUB, AND, XOR, carry, dan borrow dalam program mandiri yang dapat dijalankan.

Jadikan kontrak numerik dapat dijalankan

Praktikum ini memodelkan ALU kombinasional menggunakan bilangan bulat JavaScript. Operand berkisar dari 0 hingga 255, dengan operasi 0 hingga 3. Keluaran y selalu muat dalam delapan bit. Flag berarti carry ADD atau borrow SUB dan bernilai nol untuk operasi logika. Pada antarmuka ini, borrow bernilai satu saat a lebih kecil daripada b. Arsitektur lain mungkin mendefinisikan flag pengurangan secara berbeda; kontrak kita dinyatakan secara eksplisit.

Buat folder lokal, atau buat proyek kosong secara manual dan tambahkan alu-model.mjs dalam Digital Design Studio. Simpan berkas berikut. Di terminal yang memiliki Node.js, masuk ke folder tersebut lalu jalankan node alu-model.mjs. Mengedit berkas di DDS dan menjalankan JavaScript merupakan tindakan terpisah. Tidak diperlukan pemasangan paket atau fitur impor otomatis.

javascript
import assert from 'node:assert/strict';
function alu(a, b, op) {
  if (op === 0) {
    const wide = a + b;
    return { y: wide & 255, flag: Number(wide > 255) };
  }
  if (op === 1) return { y: (a - b) & 255, flag: Number(a < b) };
  if (op === 2) return { y: a & b, flag: 0 };
  if (op === 3) return { y: a ^ b, flag: 0 };
  throw new RangeError('operation');
}
assert.deepEqual(alu(250, 10, 0), { y: 4, flag: 1 });
assert.deepEqual(alu(3, 5, 1), { y: 254, flag: 1 });
assert.deepEqual(alu(170, 204, 2), { y: 136, flag: 0 });
assert.deepEqual(alu(170, 204, 3), { y: 102, flag: 0 });
let checks = 0;
for (let a = 0; a < 256; a++) {
  for (let b = 0; b < 256; b++) {
    const add = alu(a, b, 0), sub = alu(a, b, 1);
    assert.equal(add.y + 256 * add.flag, a + b);
    assert.equal(sub.y - 256 * sub.flag, a - b);
    assert.equal(alu(a, b, 2).y | alu(a, b, 3).y, a | b);
    checks += 3;
  }
}
console.log(`ALU PASS: ${checks} identities`);

Untuk 250+10, y=4 dan carry=1 merekonstruksi 260. Untuk 3-5, y=254 dan borrow=1 merekonstruksi -2. Nilai biner 170 adalah 10101010 dan 204 adalah 11001100: AND menghasilkan 136 dan XOR menghasilkan 102. Perulangan mengunjungi seluruh 65536 pasangan operand dan memeriksa tiga identitas per pasangan. Eksekusi yang berhasil melaporkan 196608 pemeriksaan.

Gunakan metode berbeda dalam model acuan dan RTL. Jika perangkat keras mengekstrak carry dari penjumlah sembilan bit, model ini memeriksa rentang matematis. Cara itu mengurangi kesalahan implementasi yang sama pada keduanya. Pemeriksaan ini tidak mengevaluasi nilai X/Z HDL, pewaktuan propagasi, atau perilaku clock. Gunakan kembali vektor tersebut dalam simulator saat mengimplementasikan RTL. Selalu bandingkan flag serta data; bit hasil yang berputar dengan benar dapat menyembunyikan flag batas yang salah.

Coba sendiri

Jika SUB selalu mengembalikan flag=0, identitas numerik mana yang gagal? Periksa a=0, b=1 secara manual dan pulihkan implementasinya.

Baca penjelasan

y bernilai 255. Dengan flag=0, y-256×flag adalah 255, bukan -1, sehingga rekonstruksi pengurangan gagal. Dengan borrow=1, 255-256=-1. Memeriksa y saja akan melewatkan kesalahan ini.

Lesson files

alu-model.mjs ↓

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