Clock domain crossing 란, 서로 다른 clock domain들 끼리 신호를 주고 받을 때 주는 쪽(TX)에서 주는 신호를 받는 쪽(RX)에서 사용하는 clock과 동기화를 해주는 작업을 의미합니다. 흔히 앞글자를 따와 "CDC 처리한다" 라고 얘기합니다.

어떤 시스템은 단일 clock, 즉 하나의 clock으로 전체 디자인을 동작시킬 수도 있고 목적에 따라서는 여러 clock을 사용해, 즉 Multi clock 으로 디자인을 돌릴 수도 있습니다.
만약 본인이 설계하고 있는 시스템이 단일 clock domain 경우에는 CDC 처리를 해줄 필요가 없습니다. 물론 약간의 clock net의 physical delay가 있어 edge가 정확히 맞지 않겠지만 FPGA back-end tool에서 알아서 모든 f/f의 sync를 잘 맞추어 줍니다.

그러나 시스템이 조금이라도 커지게 되거나 저전력 설계를 목표를 하게 된다면 clock domain이 두 개 이상으로 늘어나게 됩니다. 그렇게 되면 Clock sync를 맞추기 위한 추가 작업이 필요가 없게 됩니다. Clock sync를 맞춘다는 것은 root clock에서 모든 f/f의 clock pin에 도달하는 시간 차(=clock skew)를 최소한으로 줄이는 작업을 말하는데, 그렇게 되면 back-end 작업 시 clock net에 buffer가 들어가게 되어 resource, area, power consumption 면에서 손해일 수 밖에 없습니다. 따라서 clock domain을 여러개 두어 설계하게 되는 것이지요.

본론으로 돌아와 서로 다른 clock을 사용하는 블록끼리 clock edge의 sync가 같음을 보장할 수가 없음에도 불구하고 sync를 맞추어 자기 블록에서 사용하도록 하는 작업을 CDC 처리라고 합니다.

만약 서로 다른 clock domain인데도 불구하고 CDC 처리를 하지 않고 바로 사용하게 되면 어떻게 될까요? 결론부터 얘기하자면 출력 값을 보장할 수 없고 그로 인해 system failure 를 초래하게 됩니다.
위의 그림에서 Clock domain 1에서 사용하는 신호를 Clock domain 2에서 사용 해야하는 상황일 때를 가정해봅시다. Domain 1에서 2로 주는 신호가 0->1 혹은 1->0 으로 변하고 난 뒤에 domain 2의 clock edge 로 값을 채게 된다면 시스템에 문제가 없을 수 있습니다. 그러나 만약 신호가 변하는 시점에 clock edge 로 값을 채게 된다면 어떤 일이 발생할까요? 답은 "0"과 "1" 둘 중에서 확실하게 보장되지 않은 값을 출력하게 됩니다. 이러한 현상을 값이 "meta-stable" 한 상황이라고 하고 "meta-stability failure" 라고 합니다. Meta-stable 에 대한 개념은 추가적으로 자료를 올리도록 하겠습니다.

어쨌든 system failure 가 발생하지 않도록 clock이 다른 domain들끼리는 CDC 처리가 필수적으로 필요합니다.


설령 meta-stable 한 상황에서도 원하는 값을 출력하게 된다고 하더라도 그 상황을 빠져나올 때까지 얼마나 오랜 시간이 걸릴지 확률적으로 아무도 장담하지 못합니다. 이를 MTBF(Mean Time Between Failure) 라는 개념이라 하고, meta-stability failure 발생 후 값이 "0" 또는 "1"이 출력될 때까지 걸리는 평균 시간을 의미합니다.

'[1] RTL Design' 카테고리의 다른 글

Meta-stability의 개념  (0) 2021.02.15
Clock skew의 개념  (0) 2021.02.15