Tuesday, October 15, 2019

[Design][Bài 1] Tìm hiểu về clock domain crossing (CDC)

Tác giả: TrongTran
Ngày: 15/10/2019
Tài liệu tham khảo: https://tel.archives-ouvertes.fr/tel-01053729/file/Distributed_clock_generator_for_synchronous_SoC_using_ADPLL_network.pdf
và các nguồn tư liệu từ internet.


1. Tổng quan. 

Hiện nay , Để giảm thiểu thời gian design thì các nhà sản xuất chip trên thế giới thường sử dụng các IP sẵn có. Các IP này là những IP common. Nghĩa là chúng thực hiện một chức năng riêng biệt nào đó mà hầu hết mọi chip đều sử dụng với mục đích giống nhau. 

Ví dụ: IP chuyển đổi chuẩn PCIe và chuẩn AMBA của ARM, ipmmu …. 

Với việc sử dụng các IP có sẵn người design có thể tập trung vào những phần khác của design quan trọng hơn. Đó là các phần tạo nên sự khác biệt giữa chip của họ so với những chip khác trên thị trường. 

Với việc sử dụng các IP có sẵn, Một vấn đề khác đặt ra đó là các IP có sẳn chỉ chạy với một số tần số nhất định. Trong trường hợp chip của bạn hoạt động với tần số trùng với tần số của các IP này, điều đó khá là tốt. Tuy nhiên, Nếu IP của bạn hoạt động khác tần số với các IP này thì vô tình thiết kế của bạn sẽ có nhiều vùng clock trong một chip. Điều này dẫn đến việc design cho mạch đồng bộ giữa các miền clock async trở nên phức tạp. Bên cạnh đó nhằm tăng performance của chip, chúng ta cũng cần thiết kế các IP chạy với clock khác nhau.




Hình trên miêu tả tổng quan về các khối IP sử dụng các clock khác nhau. Đồng bộ trong từng khối nhỏ và bất đồng bộ giữa các khối với nhau.

Mạch đồng bộ các tín hiệu clock sẽ có thể được đặt tại 3 vị trí:

Trong IP nhận hoặc gửi: Thường được sử dùng nhiều trong các design trước đây.Điều này đòi hỏi IP nhận/gửi cần input clock của IP gửi/nhận để cung cấp clock cho các mạch 2 FF đồng bộ. Lưu ý ở đây là trong 1 chuẩn giao tiếp sẽ luôn có việc trao đổi tín hiệu hai chiều (Ví dụ chuẩn AMBA thì kênh AR/AW/W từ master qua slave, kênh R/B từ slave đến master) do đó dù đặt mạch async trong IP gửi hoặc nhận thì cũng phải cần input clock của khối còn lại. Mình ví dụ hình bên dưới block A là khối gửi (được thiết kế đồng bộ) nhưng phải input clock clk2 để cấp clock cho mạch đồng bộ trước khi out data ra ngoài. Đồng thời sử dụng clock clk1 để đồng bộ các tín hiệu feedback. Việc này khá rườm rà và khó quản lí. 




Trong cả IP gửi và nhận: Như mình nói bên trên, trong 1 chuẩn giao tiếp sẽ luôn có việc trao đổi tín hiệu hai chiều. Giả sử ta có 2 khối A và B. Một số tín hiệu từ A gửi sang B sẽ có mạch đồng bộ các tín hiệu này tại B (Khối nhận). Một số tín hiệu từ B gửi sang A sẽ có mạch đồng bộ các tín hiệu trong A (Khối nhận). Việc này thật sự rất khó control. Tốn nhiều tài nguyên và design sẽ trở nên phức tạp.

Trong Top module: Tức là người design sẽ thiết kế một cầu chỉ có chức năng đồng bộ 2 clock. Cầu này sẽ chứa các mạch 2FF để đồng bộ các tín hiệu async. Clock vào là 2 clock gồm clock IP nhận và clock IP gửi. 


Cách này đang là xu hướng design trên thế giới. Nó giúp việc verify trở nên dễ dàng, Người build top dễ xác định và chạy kiểm tra timing cho design cũng như các lỗi khác.

Ngoài ra, với cách design bên trên thì ta có thể merge các cầu async lại thành 1 cầu async duy nhất để dễ quản lí và làm giảm area cũng như sự phức tạp của chip. Lưu ý nếu chip quá to thì chúng ta không nên gộp lại vì chúng ta sẽ không thể met timing.
Điều này còn giúp ta quản lí skew của clock theo một khối riêng biệt như hình dưới:





2. Phân loại.

Dựa vào kiểu tín hiệu async, Ta có thể chia thành 2 loại:

  • Mạch đồng bộ cho tín hiệu control.

  • Mạch đồng bộ cho tín hiệu data.

Dựa vào cách xác định 2 tín hiệu async, Ta có thể chia thành 3 loại tín hiệu cơ bản đó là:

  • Tín hiệu data truyền từ bên ngoài vào mà không rõ timing. Thường đây là các tín hiệu bên ngoài chip chẳng hạn data truyền từ router, từ PCIe…

  • Tín hiệu truyền giữa hai miền clock khác nhau bao gồm: Khác về tần số, Khác pha, Tín hiệu chạy với clock nguồn và tín hiệu chạy với clock output của bộ PLL.

  • Tín hiệu reset bên ngoài vào mà không rõ timing.
Ngoài ra nếu hai tín hiệu chạy với clock cùng tần số, cùng pha nhưng khác clock source, thì chúng vẫn được xem là async với nhau.

Hình bên dưới cho thấy clock source và clock đi qua khối PLL là khác nhau:


3. Giải pháp.

Để đồng bộ các tín hiệu async, trong thiết kế ngày nay ta hay dùng mạch 2 FF. Dĩ nhiên có nhiều mạch sync mà không dùng 2FF nhưng ở đây mình chỉ biết mạch này (Mình sẽ bổ sung sau).Với mạch này ta có một thông số gọi là MTBF (mean time between failure) để đặc trưng cho thời gian giữa hai lần fail liên tiếp.

Failure rate = 1/MTBF (cho một mạch async) và Failure rate của toàn bộ design sẽ bằng tổng của tất cả các Failure rate trong thiết kế. Đơn vị đo lường của MTBF là đơn vị thời gian. Thường thì thời gian giữa hai lần fail rất lớn (MTBF từ 100 – 1000 năm).

Trong bài tiếp theo mình sẽ phân tích về một số mạch async có thể gây ra lỗi trong quá trình design.

Nếu bài của mình có sai sót gì mong nhận được sự góp ý nhiệt tình từ mọi người. Vì bản thân không phải là chuyên gia, cũng mài mò học hỏi nên không tránh khỏi sự sai sót.

No comments:

Post a Comment

Cách tính BW và latency trong 1 hệ thống SoC sử dụng chuẩn giao tiếp AXI protocol

Tác giả:  TrongTran Ngày:  31/12/2019 Nếu bạn nào đang làm về verification cho system performance (ST) thì bài này sẽ bổ ích cho bạn. Ngày ...