3 / 24 · Thực hành
Thực hành: mô hình tham chiếu ALU tám bit
Kiểm tra ADD, SUB, AND, XOR, bit nhớ và bit mượn bằng chương trình độc lập.
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Biến quy ước số thành chương trình có thể chạy
Bài thực hành này mô hình hóa ALU tổ hợp bằng số nguyên JavaScript. Toán hạng từ 0 đến 255, với phép toán từ 0 đến 3. Đầu ra y luôn vừa tám bit. Cờ biểu thị bit nhớ ADD hoặc bit mượn SUB, và bằng 0 với các phép logic. Trong giao diện này, bit mượn bằng 1 khi a nhỏ hơn b. Kiến trúc khác có thể định nghĩa cờ trừ khác đi; quy ước của chúng ta được nêu rõ.
Tạo thư mục cục bộ, hoặc tạo thủ công một dự án trống rồi thêm alu-model.mjs trong Digital Design Studio. Lưu tệp sau. Trong terminal đã cài Node.js, vào thư mục rồi chạy node alu-model.mjs. Chỉnh sửa tệp trong DDS và thực thi JavaScript là hai thao tác riêng. Không cần cài gói hay tính năng nhập tự động.
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`);Với 250+10, y=4 và carry=1 khôi phục 260. Với 3-5, y=254 và borrow=1 khôi phục -2. Biểu diễn nhị phân của 170 là 10101010 và của 204 là 11001100: AND cho 136, XOR cho 102. Vòng lặp duyệt toàn bộ 65536 cặp toán hạng và kiểm tra ba đẳng thức mỗi cặp. Lần chạy thành công báo 196608 phép kiểm tra.
Dùng một phương pháp trong mô hình tham chiếu khác với phương pháp trong RTL. Nếu phần cứng lấy bit nhớ từ bộ cộng chín bit, mô hình này kiểm tra phạm vi toán học. Điều đó giảm lỗi triển khai chung. Các phép kiểm tra này không đánh giá giá trị X/Z của HDL, thời gian lan truyền hay hành vi xung nhịp. Tái sử dụng các vector trong trình mô phỏng khi triển khai RTL. Luôn so sánh cờ cùng dữ liệu; các bit quay vòng đúng có thể che giấu cờ giới hạn sai.
Tự thử
Nếu SUB luôn trả về flag=0, đẳng thức số nào sẽ sai? Kiểm tra a=0, b=1 bằng tay và khôi phục triển khai.
Đọc giải thích
y bằng 255. Với flag=0, y-256×flag bằng 255 thay vì -1, nên phép khôi phục phép trừ sai. Với borrow=1, 255-256=-1. Chỉ kiểm tra y sẽ bỏ sót lỗi này.