CDC는 두 블록이 각각 다른 클럭 도메인(즉, 서로 다른 주파수 또는 위상의 클럭 신호)을 사용할 때, 두 블록 간 데이터 전송 상황에서 발생합니다. 이 경우 데이터 전송 중 타이밍 불일치나 메타스테이블 상태가 발생할 가능성이 있습니다. 이를 방지하기 위해 CDC를 적절히 설계하고 관리해야 합니다.
어떤 문제가 발생하는지, 해결책은 무엇이 있는지 자세히 알아보도록 하겠습니다😁.
CDC(Clock Domain Crossing)는 서로 다른 클럭 도메인 간에 데이터를 전송하는 것을 의미합니다. 클럭 도메인이 다르면 신호 전송 시 타이밍 문제(metastable 상태)가 발생할 수 있습니다.
Metastable : 신호가 플립플롭의 setup time이나 hold time을 만족하지 못할 경우 출력이 불안정해지는 상태. 1이 될 수도, 0이 될 수도 있음. 메타스테이블 상태가 다음 플립플롭으로 전달되면 신호가 왜곡되거나 잘못된 데이터가 전달됨.

위 그림은 aclk을 사용하는 왼쪽 block과 bclk을 사용하는 오른쪽 block이 있습니다. 이 때, aclk동기화된 신호인 adat이 bclk의 상승엣지에서 setup time을 만족하지 못해서 metastable상태가 되었습니다. 다음 bclk에서 다시 stable해지지만, metastable한 신호는 0이 될수도, 1이 될수도 있기 때문에(어떤 상태인지 정확히 모르는 상태) 원하는 신호를 제대로 전달하지 못할 수 있습니다. 또한 인버터의 입력으로 받게 되면 pmos와 nmos가 둘 다 켜져 dynamic leakage가 발생할 수도 있습니다.
이를 해결하기 위해 여러가지 방법이 존재하는데, 먼저 소개해드릴 방법은 2-Flip-Flop Synchronizer입니다.

위 그림처럼 Flip-Flop으로 synchronizer를 삽입하여 Dout을 stable하게 만드는 해결책을 사용할 수 있습니다. 추가적인 FF를 사용하기 때문에 Area와 Power 측면에서는 손해를 보게 됩니다.
😒Synchronizer를 사용해도 문제가 생길 수 있습니다.
주의사항 1. combi logic 연산 과정 중에는 값이 stable한 상태, 확정된 상태가 아니므로 아래 그림처럼
combinational logic 다음에 레지스터를 삽입하여 안정된 출력을 domain B로 전달해 주어야 합니다. 그만큼 더 area, power 손해가 생기죠.

주의사항 2. 빠른 클럭 도메인에서 느린 클럭 도메인으로 이동할 때 주의해야 할 추가 사항이 있습니다. 아래 그림에서 bclk이 capture하기도 전에 adat이 왔다 갔다 했기 때문에 제대로 capture하지 못했습니다.
CDC boundary를 지나가는 신호는 일반적으로 Receiving clock frequency를 기준으로 1.5배의 pulse width를 가지면 적어도 한번은 stable 한 값을 capture 할 수 있습니다.
adat의 pulse를 늘려서 bq2_dat이 잘 capture해서 stable한 신호를 만들어냈습니다. 하지만 함부로 신호의 pulse를 늘리거나 clk 주파수를 변경하는 건 IP의 주어진 spec을 만족시키기에 어려운 일이겠죠?
따라서 아래와 같은 closed-loop 2FF synchronizer를 사용할수도 있습니다.
느린 클럭 도메인(bclk)에서 동작하는 synchronizer로부터 빠른 클럭 도메인(aclk)으로 피드백을 제공하여 데이터가 전송되었고 stable이라는 것을 체크합니다. 이 방법은 데이터를 받는 쪽의 클락 주파수를 고려하지 않아도 되지만 feedback을 전달받는데 시간이 오래 걸린다는 단점이 있습니다(clock domain을 한번 더 넘어야 하기 때문에 latency가 추가로 발생하므로).
이렇게 알아본 synchronizer를 활용해서 CDC를 수행하게 됩니다만 중요한 조건이 있습니다.
바로 1-bit 신호에서만 사용한다는 점이죠. 다중 비트 신호에서 발생할 수 있는 비트 간의 스큐(skew)와 비트 개별적인 메타스테이블 상태 때문에 다중 비트 신호에서는 다른 방법으로 CDC를 수행합니다. 그 다른 방법은 Asynchronous FIFO입니다. 다음 글에서 Asynchronous FIFO를 알아보도록 하겠습니다.
봐주셔서 감사합니다. 😘