Bộ đếm có nạp, cho phép và cờ tràn
Module cần viết: counter_ld · 8 case (2 mẫu) · giới hạn 4 s/case · ~20 phút
Viết bộ đếm lên W bit:
module counter_ld #(parameter int W = 4) (
input logic clk,
input logic rst, // reset ĐỒNG BỘ, tích cực mức cao
input logic en,
input logic ld,
input logic [W-1:0] din,
output logic [W-1:0] q,
output logic wrap
);
Tại mỗi sườn lên clk, xét theo thứ tự ưu tiên giảm dần:
| điều kiện | q sau sườn clock |
|---|---|
rst = 1 |
0 |
ld = 1 |
din |
en = 1 |
q + 1 (quay về 0 sau giá trị lớn nhất) |
| còn lại | giữ nguyên |
wrap là tín hiệu tổ hợp:
wrap = en & ~ld & ~rst & (q == giá trị lớn nhất 2^W − 1)
nghĩa là "sườn clock kế tiếp sẽ đếm từ giá trị lớn nhất về 0".
Testbench đổi đầu vào ở sườn xuống, chờ 1 ns rồi đọc wrap; q được đọc ở sườn xuống, trước khi đổi đầu vào. Testbench gắn hai bản W=4 và W=8.
Các case
- Reset rồi đếm 0 → 5mẫu
- en = 0 giữ nguyên giá trịmẫu
Cùng 6 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à 3 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.