Chuyển dữ liệu qua hai miền clock bằng bắt tay req/ack 4 pha
Module cần viết: hs_cdc · 7 case (2 mẫu) · giới hạn 4 s/case · ~50 phút
FIFO bất đồng bộ thì mạnh nhưng tốn bộ nhớ. Khi chỉ thỉnh thoảng mới cần chuyển một giá trị cấu hình hay một sự kiện sang miền clock khác, cách chuẩn là bắt tay req/ack 4 pha. Chỉ hai tín hiệu một bit đi qua miền khác, còn dữ liệu nhiều bit được giữ yên để miền kia đọc an toàn.
module hs_cdc (
// miền nguồn
input logic sclk,
input logic srst_n, // reset bất đồng bộ miền nguồn
input logic send, // gửi sdata ở sườn lên sclk này (bị bỏ qua nếu busy = 1)
input logic [7:0] sdata,
output logic busy, // 1 từ sau sườn nhận send cho tới khi bắt tay xong
// miền đích
input logic dclk,
input logic drst_n,
output logic dvalid, // xung 1 nhịp dclk: ddata hợp lệ
output logic [7:0] ddata
);
Yêu cầu:
- Mỗi lần
sendđược nhận (send = 1khibusy = 0ở sườn lênsclk) tạo ra đúng một xungdvalidở miền đích, vớiddatabằngsdatacủa lúc gửi, đúng thứ tự gửi. sendkhibusy = 1bị bỏ qua hoàn toàn. Sau khi gửi,sdatacó thể đổi ở bất kỳ nhịp nào.busylên ngay sau sườn nhậnsend, và hạ xuống trong vòng8 × (Tsclk + Tdclk)kể từ lúc đó.- Chỉ
reqvàack(một bit) đi qua miền kia, mỗi tín hiệu qua bộ đồng bộ 2 flip-flop.busy,dvalid,ddatalà ngõ ra flip-flop.
Sau reset (cả hai miền cùng lúc): busy = 0, dvalid = 0.
Testbench đổi tín hiệu của mỗi miền ở sườn xuống clock miền đó, và đổi sdata ngẫu nhiên ở mọi nhịp không gửi.
Các case
- Một lần chuyển, hai clock cùng tần số lệch phamẫu
- Ba lần chuyển liên tiếpmẫ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.