Chuyển clock không glitch giữa hai clock không liên quan
Module cần viết: clk_mux_gf · 6 case (2 mẫu) · giới hạn 4 s/case · ~40 phút
Chip thường chạy bằng PLL, nhưng lúc khởi động hay khi tiết kiệm điện thì phải chuyển sang một clock khác. Đổi clock bằng một bộ mux thường là lỗi kinh điển trong phỏng vấn thiết kế: tại thời điểm đổi, clock ra có thể có một xung cụt (runt pulse) ngắn hơn nửa chu kỳ của cả hai clock. Flop nào nhận xung đó cũng có thể vi phạm thời gian xung tối thiểu và rơi vào trạng thái sai.
module clk_mux_gf (
input logic clk0, // 100 MHz
input logic clk1, // ~71 MHz, KHÔNG liên quan về pha và tần số với clk0
input logic rst_n, // reset bất đồng bộ, tích cực mức thấp; trong reset sel = 0
input logic sel, // 0: chọn clk0, 1: chọn clk1; đổi ở thời điểm BẤT KỲ (không đồng bộ với clock nào)
output logic clk_out
);
Yêu cầu:
- Sau reset,
clk_outchạy theoclk0. - Không glitch: mọi mức 0 và mức 1 của
clk_outkéo dài ít nhất 5 ns (nửa chu kỳ ngắn nhất của hai clock). Giữclk_outở mức 0 lâu hơn trong lúc chuyển là được phép. - Khi
selđứng yên 100 ns thìclk_outphải trùng với clock được chọn.
Testbench đo độ dài từng mức của clk_out trong suốt mô phỏng, kể cả khi sel bập bênh nhanh hơn thời gian chuyển, và so clk_out với clock được chọn mỗi nanô giây khi sel đã ổn định.
Lưu ý: mô phỏng không có metastability. Bài này chỉ kiểm được tính chất logic (glitch, thứ tự tắt/bật); số tầng đồng bộ đúng phải lý luận, không đo được ở đây (xem lời giải).
Các case
- Không đổi sel: clk_out = clk0mẫu
- Đổi từ clk0 sang clk1 một lầnmẫ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.