Làm tròn Q8.8 về số nguyên: half-to-even và số âm
Module cần viết: round_q88 · 6 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
Số Q8.8 là số có dấu 16 bit, 8 bit phần nguyên và 8 bit phần lẻ: giá trị thật bằng q / 256. Cuối một bộ lọc số, ta thường phải làm tròn về số nguyên. Kiểu làm tròn chuẩn của IEEE 754 và của nhiều DSP là half-to-even (còn gọi là banker's rounding): phần lẻ đúng 0.5 thì làm tròn về số chẵn gần nhất, để sai số không bị lệch về một phía khi cộng dồn.
module round_q88 (
input logic signed [15:0] q, // Q8.8, giá trị thật q / 256 trong [−128, 127.996]
output logic signed [8:0] y // số nguyên gần q / 256 nhất; phần lẻ đúng 0.5 → về số chẵn
);
| q / 256 | y |
|---|---|
| 2.25 | 2 |
| 2.75 | 3 |
| 2.5 | 2 |
| 3.5 | 4 |
| −1.25 | −1 |
| −2.5 | −2 |
| −0.5 | 0 |
| 127.5 | 128 |
Mạch tổ hợp; testbench đọc y 1 ns sau khi đổi q.
Các case
- Số dương, phần lẻ khác 0.5mẫu
- Số dương, phần lẻ đúng 0.5mẫ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.