Nhân Q0.8: khi hằng có kích thước làm mất cả tích
Module cần viết: qmul8 · 6 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
Số Q0.8 không dấu dùng 8 bit để biểu diễn giá trị trong [0, 1): giá trị thật bằng a / 256. Đây là dạng phổ biến cho hệ số bộ lọc, độ sáng, hệ số trộn alpha. Nhân hai số Q0.8 cho tích Q0.16 (16 bit), và ta thường làm tròn tích về lại Q0.8.
module qmul8 (
input logic [7:0] a,
input logic [7:0] b,
output logic [15:0] p, // tích chính xác a * b (Q0.16)
output logic [7:0] y // tích làm tròn về Q0.8: phần lẻ ≥ 0.5 LSB thì làm tròn lên
);
Nói bằng số nguyên: p = a × b, và y = ⌊(a × b + 128) / 256⌋.
Ví dụ: a = 128 (0.5), b = 128 (0.5) → p = 16384, y = 64 (0.25); a = 255, b = 255 → p = 65025, y = 254; a = 3, b = 85 → p = 255, y = 1.
Mạch tổ hợp; testbench đọc ngõ ra 1 ns sau khi đổi đầu vào.
Các case
- Vài tích đơn giảnmẫu
- Làm tròn lên và xuốngmẫ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.