Đồng bộ xung qua hai miền clock (toggle synchronizer)
Module cần viết: psync · 6 case (2 mẫu) · giới hạn 4 s/case · ~30 phút
Một xung rộng một chu kỳ ở miền clock A (ví dụ "có lệnh mới") cần được báo sang miền clock B, chạy clock khác, không cùng pha, có thể nhanh hơn hoặc chậm hơn. Đồng bộ thẳng xung qua 2 flip-flop sẽ mất xung khi clk_b chậm hơn clk_a. Đây là câu phỏng vấn CDC (clock domain crossing) kinh điển.
module psync (
input logic clk_a, rst_a_n, // miền A; reset bất đồng bộ tích cực mức thấp
input logic pulse_a, // xung 1 chu kỳ clk_a
input logic clk_b, rst_b_n, // miền B; reset bất đồng bộ tích cực mức thấp
output logic pulse_b // xung 1 chu kỳ clk_b cho MỖI xung pulse_a
);
Yêu cầu (testbench kiểm):
- Mỗi
pulse_a(lấy mẫu ở sườn lênclk_a) sinh đúng một xungpulse_brộng đúng 1 chu kỳclk_b. pulse_bxuất hiện sau ít nhất 2 và không quá 4 sườn lênclk_bkể từ sườnclk_ađã lấy mẫupulse_a. Ít nhất 2 sườn là vì tín hiệu phải qua 2 tầng flip-flop đồng bộ.- Không có
pulse_bthừa. - Hai xung
pulse_aliên tiếp cách nhau ít nhất 6 chu kỳ của clock chậm hơn (testbench bảo đảm). - Reset: sau khi thả reset hai miền, không có
pulse_bnào cho tới khi cópulse_amới.
Testbench đọc pulse_b ở sườn xuống clk_b.
Các case
- clk_a 10 ns → clk_b 14 ns, 5 xungmẫu
- clk_a chậm (30 ns) → clk_b nhanh (8 ns)mẫ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à 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.