Phát hiện sườn không báo giả sau reset
Module cần viết: edge_arm · 6 case (2 mẫu) · giới hạn 4 s/case · ~15 phút
Bài edge-detect reset d_q về 0. Hệ quả: nếu d đang ở mức 1 khi thoát reset, mạch báo một sườn lên ở nhịp đầu tiên, dù thực ra d chưa hề thay đổi. Với một bộ đếm sự kiện hay một yêu cầu ngắt, sườn giả này là một sự kiện thừa sau mỗi lần reset.
Viết lại bộ phát hiện sườn sao cho không bao giờ báo sườn giả sau reset:
module edge_arm (
input logic clk,
input logic rst_n, // reset bất đồng bộ, tích cực mức thấp
input logic d,
output logic rise,
output logic fall
);
Gọi s₁, s₂, s₃… là các mẫu của d lấy ở các cạnh lên sau khi nhả reset. Ngay sau cạnh lấy mẫu sₖ (k ≥ 2): rise = 1 khi sₖ₋₁ = 0, sₖ = 1; fall = 1 khi sₖ₋₁ = 1, sₖ = 0. Ngay sau cạnh lấy s₁ (chỉ có một mẫu, chưa so sánh được): rise = fall = 0.
Khi rst_n = 0: rise = fall = 0 ngay lập tức. Mỗi lần reset, việc đếm mẫu bắt đầu lại từ s₁.
Testbench đổi d ở cạnh xuống và kiểm ngõ ra trước khi đổi.
Các case
- d = 0 lúc thoát reset, rồi có sườnmẫu
- d = 1 suốt, kể cả lúc thoát resetmẫ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.