CRC-8 nối tiếp từng bit (đa thức 0x07)
Module cần viết: crc8 · 7 case (2 mẫu) · giới hạn 4 s/case · ~25 phút
CRC (cyclic redundancy check) phát hiện lỗi trong Ethernet, USB, SMBus, bộ nhớ flash… Phần cứng của nó rất gọn: một LFSR có đầu vào dữ liệu. Bài này dựng CRC-8 với đa thức x⁸ + x² + x + 1 (viết gọn 0x07, cấu hình CRC-8/SMBUS) và nạp dữ liệu nối tiếp từng bit, bit cao (MSB) trước.
module crc8 (
input logic clk,
input logic rst_n, // reset bất đồng bộ: crc = 0
input logic init, // đồng bộ: xoá crc = 0 ở sườn lên (ưu tiên hơn bit_valid)
input logic bit_valid, // 1: nạp bit_in ở sườn lên này
input logic bit_in,
output logic [7:0] crc
);
Ở mỗi sườn lên, nếu init = 0 và bit_valid = 1:
fb = crc[7] ^ bit_in
crc = (crc << 1) ^ (fb ? 8'h07 : 8'h00)
Giá trị khởi đầu 0, không đảo bit, không XOR ở cuối. Kiểm tra nhanh: byte 0x01 cho CRC 0x07; chuỗi ASCII "123456789" (9 byte, mỗi byte MSB trước) cho 0xF4.
Testbench đặt tín hiệu và đọc crc ở sườn xuống của clock.
Các case
- Một byte 0x01 → 0x07mẫu
- Chuỗi "123456789" → 0xF4mẫu
Cùng 5 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.