Clock domain crossing (CDC)¶
Clock domain crossing (CDC) là việc truyền tín hiệu từ logic chạy theo một clock sang logic chạy theo clock khác, khi hai clock không có quan hệ pha cố định. Thiết kế thực tế gần như luôn có nhiều miền clock: clock lõi, clock giao diện ngoài (PCIe, Ethernet, DDR), clock ngoại vi chậm. Trang này trình bày theo thứ tự: hiện tượng metastability làm CDC khó, bộ đồng bộ một bit, cách đồng bộ nhiều bit (handshake, mã Gray, FIFO bất đồng bộ), reset giữa các miền clock, rồi kiểm tra CDC. Nền tảng RTL ở RTL / HDL.
Metastability¶
Mỗi flip-flop cần dữ liệu ổn định trong một khoảng quanh cạnh clock: setup time trước cạnh và hold time sau cạnh, xem Static Timing Analysis. Khi tín hiệu từ miền khác đổi giá trị đúng trong khoảng này, flip-flop có thể rơi vào trạng thái metastable: đầu ra nằm ở mức điện áp trung gian, không phải 0 hay 1, và mất một thời gian không xác định mới ổn định về một trong hai mức, thành 0 hay 1 là ngẫu nhiên.
Không thể loại bỏ hoàn toàn metastability với tín hiệu bất đồng bộ, chỉ giảm xác suất nó ảnh hưởng tới logic phía sau. Xác suất flip-flop vẫn chưa ổn định sau thời gian chờ t giảm theo hàm mũ khi t tăng. Chỉ số MTBF (mean time between failures) của bộ đồng bộ tăng theo thời gian chờ này, và giảm khi tần số clock và tần suất đổi dữ liệu tăng.
Hậu quả khi không xử lý: logic phía sau đọc giá trị trung gian có thể hiểu thành 0 ở một nơi và 1 ở nơi khác, dẫn tới trạng thái sai, FSM nhảy sai trạng thái, hoặc lỗi chỉ thỉnh thoảng xuất hiện và rất khó tái hiện.
Đồng bộ một bit¶
Bộ đồng bộ chuẩn là hai flip-flop nối tiếp, cùng clock của miền nhận.
logic sync_ff1, sync_ff2;
always_ff @(posedge clk_b) begin
sync_ff1 <= async_in;
sync_ff2 <= sync_ff1;
end
// Dùng sync_ff2 trong logic clk_b
Flip-flop đầu có thể metastable, nhưng được một chu kỳ clock để ổn định trước khi flip-flop thứ hai lấy mẫu. Các nguyên tắc:
- Không đặt logic tổ hợp giữa tín hiệu nguồn và flip-flop đầu, và giữa hai flip-flop, vì logic làm giảm thời gian ổn định và có thể tạo glitch.
- Tín hiệu từ miền nguồn nên đi ra từ một flip-flop (không phải đầu ra logic tổ hợp), để giá trị đổi sạch tại một cạnh clock.
- Tín hiệu phải giữ đủ lâu để miền nhận lấy mẫu được. Đồng bộ một tín hiệu từ clock nhanh sang clock chậm có thể bỏ sót xung ngắn. Khi cần, kéo dài xung hoặc dùng handshake.
- Với tần số clock cao, một số thiết kế dùng ba flip-flop để tăng MTBF.
- Trên FPGA, các flip-flop đồng bộ cần được gắn thuộc tính để công cụ đặt chúng sát nhau và không tối ưu bỏ (ví dụ
ASYNC_REGcủa Vivado), xem FPGA.
Đồng bộ nhiều bit¶
Không thể đồng bộ từng bit của một bus bằng các bộ đồng bộ một bit riêng. Các bit có độ trễ đi dây khác nhau, nên miền nhận có thể lấy mẫu một số bit giá trị mới và một số bit giá trị cũ cùng lúc, tạo ra giá trị không từng tồn tại ở miền nguồn. Ba cách thường dùng:
| Cách | Nguyên lý | Phù hợp |
|---|---|---|
| Handshake (req/ack) | Giữ dữ liệu ổn định ở miền nguồn, báo bằng một tín hiệu req đã đồng bộ, miền nhận lấy dữ liệu rồi trả ack đã đồng bộ ngược lại |
Dữ liệu thưa, không cần thông lượng cao |
| Mã Gray cho bộ đếm | Giá trị liên tiếp chỉ khác nhau một bit, nên lấy mẫu giữa chừng chỉ cho giá trị cũ hoặc mới | Con trỏ, bộ đếm tăng từng bước |
| FIFO bất đồng bộ | Hai bên ghi và đọc theo clock riêng, con trỏ mã Gray được đồng bộ sang miền kia để so sánh đầy hoặc rỗng | Luồng dữ liệu liên tục |
FIFO bất đồng bộ¶
FIFO bất đồng bộ là cấu trúc chuẩn để chuyển luồng dữ liệu giữa hai clock. Bộ nhớ dual-port được ghi theo clock ghi và đọc theo clock đọc. Con trỏ ghi và con trỏ đọc được mã hóa Gray rồi đồng bộ sang miền đối diện bằng bộ đồng bộ hai flip-flop. Miền ghi so sánh con trỏ ghi với con trỏ đọc đã đồng bộ để tạo cờ đầy, miền đọc làm tương tự để tạo cờ rỗng. Vì con trỏ đã đồng bộ chậm hơn thực tế, cờ đầy và rỗng mang tính bảo thủ: FIFO có thể báo đầy hoặc rỗng muộn hơn trạng thái thật một vài chu kỳ nhưng không báo sai theo hướng nguy hiểm (tràn hoặc đọc khi rỗng). Các hãng FPGA cung cấp sẵn FIFO bất đồng bộ dưới dạng IP, nên thường dùng IP thay vì tự viết, xem Xilinx IPCore.
Reset giữa nhiều miền clock¶
Mỗi miền clock cần một reset riêng, nhả đồng bộ với clock của miền đó. Nếu dùng chung một nút reset bất đồng bộ, tín hiệu nhả reset có thể đến các miền ở các cạnh clock khác nhau và gây metastability trong chính các thanh ghi có reset. Cách thực hiện thường dùng là bộ đồng bộ reset: assert bất đồng bộ, deassert đồng bộ, đặt ở mỗi miền.
logic rst_ff1, rst_ff2;
always_ff @(posedge clk or negedge arst_n) begin
if (!arst_n) begin
rst_ff1 <= 1'b0;
rst_ff2 <= 1'b0;
end else begin
rst_ff1 <= 1'b1;
rst_ff2 <= rst_ff1;
end
end
// rst_ff2 là reset (mức thấp tích cực) cho miền clk
Thứ tự nhả reset giữa các miền cũng quan trọng: phần nhận dữ liệu nên được nhả trước hoặc cùng lúc với phần gửi, để không mất dữ liệu đầu tiên.
Kiểm tra CDC¶
Lỗi CDC thường không lộ ra trong simulation RTL, vì simulation không mô hình hóa metastability, và chỉ xuất hiện ở phần cứng thật. Việc kiểm tra gồm:
- Phân tích CDC tĩnh: công cụ chuyên dụng duyệt thiết kế, tìm mọi đường đi giữa các miền clock và báo đường nào thiếu bộ đồng bộ hợp lệ, đồng bộ nhiều bit sai cách, hoặc có logic tổ hợp trước bộ đồng bộ. Các công cụ thương mại cho flow ASIC và FPGA đều có tính năng này, và Vivado có báo cáo CDC riêng.
- Ràng buộc timing: khai báo đúng quan hệ giữa các clock trong constraint, ví dụ clock bất đồng bộ (
set_clock_groups) hoặcset_false_path,set_max_delay -datapath_onlycho các đường CDC, để STA không báo vi phạm giả và không bỏ qua đường cần giới hạn độ trễ. Xem Static Timing Analysis. - Review thiết kế: liệt kê các điểm CDC, nêu cách đồng bộ của từng điểm.
Liên quan¶
- RTL / HDL: nền tảng viết RTL, reset đồng bộ và bất đồng bộ.
- Static Timing Analysis: setup, hold, constraint cho đường CDC.
- FPGA: thuộc tính và báo cáo CDC trên Vivado.
- Clock synthesizer và jitter cleaner (Embedded): nguồn tạo ra nhiều clock cho hệ thống.
Tài liệu tham khảo¶
- Clifford E. Cummings, "Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog", SNUG Boston 2008. sunburst-design.com
- Clifford E. Cummings, "Simulation and Synthesis Techniques for Asynchronous FIFO Design", SNUG San Jose 2002. sunburst-design.com
- Clifford E. Cummings, Peter Alfke, "Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons", SNUG San Jose 2002.
- AMD (Xilinx), UltraFast Design Methodology Guide (UG949) và Vivado Design Suite User Guide: Using Constraints (UG903), mục về CDC. AMD Documentation