Cộng BCD hai chữ số: 9 + 9 và chỉnh +6
Module cần viết: bcd_add2 · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
BCD (Binary-Coded Decimal) mã hoá mỗi chữ số thập phân bằng 4 bit: 8'h47 nghĩa là 47. Đồng hồ thời gian thực (RTC), máy tính bỏ túi, hiển thị LED 7 đoạn và các hệ thống tài chính đều dùng BCD. Bộ cộng BCD là câu phỏng vấn kinh điển vì cách sửa "cộng 6" trông đơn giản nhưng có hai chỗ dễ sai.
module bcd_add2 (
input logic [7:0] a, // 2 chữ số BCD, 00..99
input logic [7:0] b, // 2 chữ số BCD, 00..99
input logic cin,
output logic [7:0] s, // 2 chữ số BCD của (a + b + cin) mod 100
output logic cout // 1 khi a + b + cin ≥ 100
);
Ví dụ: 8'h38 + 8'h04 + 1 = 8'h43; 8'h99 + 8'h01 = 8'h00, cout = 1; 8'h09 + 8'h09 = 8'h18.
Đầu vào luôn là BCD hợp lệ. Mạch tổ hợp; testbench đọc ngõ ra 1 ns sau khi đổi đầu vào.
Các case
- Không có chữ số nào vượt 9mẫu
- Chữ số đơn vị vượt 9mẫu
Cùng 4 case ẩn kiểm các yêu cầu còn lại của đề. Case ẩn chỉ báo đúng/sai, không nói chi tiết: tự tìm chỗ sai từ đề, hoặc mở gợi ý.
Testbench có mô hình tham chiếu riêng, độc lập với lời giải mẫu. Lời giải mẫu đã chạy qua mọi case trên simulator thật, và 4 bản lỗi mẫu đều bị ít nhất một case bắt. Case mẫu sai sẽ cho biết chỗ sai đầu tiên (giá trị mong đợi so với giá trị nhận được); case ẩn chỉ báo đúng/sai.