지난 Post에서 Metastability를 극복하기 위한 방법으로 Register Chain을 소개하였다. 아래 그림과 같이 Register를 직렬로 연결하면 마지막 Register에서 Metastability에 빠질 확률이 극도록 낮아진다.
이 2-stage Synchronizer를 사용하려면 주의할 사항이 있다.
첫 번째로는 위 그림에서 Clock1 Domain에서 Clock2 Domain으로 전달되는 신호는 중간에 Combination Logic 없이 Register의 출력 값이어야 한다.
그 이유는 Clock 1와 Clock 2의 주파수가 서로 다르기 때문에 Clock1 Domain에서 Clock2 Domain으로 전달되는 신호를 Capture하는 시간이 계속 변할 수 있다. 다시 말하면 Clock1 Domain에서 출력되는 신호가 stable 할수록 metastability에 빠질 확률이 줄어든다. 아래 그림을 참조하여 자세히 설명하겠다.
위 Block diagram을 살펴보면, 우선 2가지 Clock domain이 존재한다. 하나는 aclk domain이고 또 다른 하나는 bclk domain이다.
그리고 aclk domain에는 3개의 Register(asig1, abus2, abus3)가 존재하며, 이 Register들의 출력을 Logic으로 조합하여 adat를 생성한다. 생성된 adat는 bclk domain으로 전달된다. bclk domain에는 2-stage synchronizer가 존재하며, 최종 register의 출력을 bdat로 표현하였다.
아래 Timing diagram을 살펴보면 aclk, adat, bclk, bq1, bdat 다섯가지 신호가 표현되어있다. bq1은 block diagram에는 표현되어 있지 않지만, 1-stage의 Register의 출력으로 보인다. aclk domain에서의 register timing은 clock edge에서의 setup/hold를 맞춰주면 되므로 destination register의 clock edge까지 여유가 있다. adat는 3개의 Register의 출력을 특정 Logic으로 연산하는 과정을 거치므로 일정 시간 동안 unstable 하다. ("Combinational setting..."으로 표현된 부분)
신호가 unstable할 때 capture 동작이 발생하면, setup/hold timing을 맞추지 못할 확률이 크므로 metastability에 빠질 확률 높아진다. 그러므로 아래 그림과 같이 logic에 출력된 신호 a를 register로 capture 한 다음 전달하는 것을 권장한다. register의 출력은 logic 출력을 그대로 전달하던 것에 비해 stable 한 구간이 많다.
두 번째로는 Clock1 Domain과 Clock2 Domain 간의 Frequency와 CDC boundary를 고려해야 한다.
Metastability 방지를 위한 2-stage synchronizer가 존재한다고 하더라도 Clock1 Domain에서 전달된 신호가 Clock2 Domain의 Clock Period보다 작으면 Capture를 못할 가능성이 있다. 아래 그림을 보면 aclk domain에서 생성된 신호가 bclk domain에서 capture 할 수 없을 정도로 작게 유지될 경우, bclk domian에서 어떠한 데이터도 capture 하지 못하는 것을 보여준다.
그렇다면 CDC boundary를 지나가는 신호는 어느 정도의 width을 가져야 할까? 일반적으로 Receiving clock frequency를 기준으로 1.5배의 pulse width를 가지면 적어도 한번은 stable 한 값을 capture 할 수 있다. 아래 그림은 1.5 배의 pulse width를 가질 때 bclk domain에서 첫 번째 edge에서는 metastability에 빠질 수 있지만 두 번째 edge에서는 stable 한 신호를 capture 하여 metastability에 빠지지 않음을 알 수 있다.
위 방식은 가장 간단하게 metastability를 방지하는 방법이나 1.5배의 pulse width를 정확하게 지켜줘야 하므로 design 변경이 많거나, 설계자가 변경될 경우 해당 사항이 지켜지지 않을 가능성이 있다고 한다. 이런 점을 회피할 수 있는 방법은 아래와 같다. 컨셉은 CDC boundary를 지나간 신호가 제대로 capture 되었는지 feedback을 받는 방법이다. 신호가 제대로 전달되는 feedback을 받고 신호를 변경한다. 이렇게 되면 1.5배의 pulse width를 지키는 것이 아니라 feedback만 보면 되므로 receiving clock의 frequency를 크게 고려하지 않고 설계를 진행할 수 있다. 그런데 단점은 feedback을 전달받는 시간이 오래 걸린다는 점이다. clock domain을 한번 더 넘어야 하기 때문에 latency가 더 발생하므로 latency에 따라 방법을 정해야 한다.
이 2-stage Synchronizer를 사용할 때의 주의사항을 요약하는 아래와 같다.
첫번 째로는 Clock1 Domain에서 Clock2 Domain으로 전달되는 신호는 중간에 Combination Logic 없이 Register의 출력 값이어야 한다.
두 번째로는 Clock1 Domain과 Clock2 Domain 간의 Frequency와 CDC boundary를 고려해야 한다.
1-bit 신호의 경우, 위와 같은 방식으로 CDC를 수행한다. 일정 시간 이상 값이 변하지 않는 신호를 전달할 때 많이 사용된다.
그런데, 1-bit이 아닌 여러 신호를 전달할 경우, 각 bit 마다 위와 같은 방식을 사용하면 큰 문제가 발생할 수 있다. 각 bit마다 신호가 전달되는 시점이 달라질 수 있기 때문이다. 다음 포스트에서는 multi-bit CDC를 처리하는 여러 가지 방법에 대해서 알아보도록 하겠다.
Reference
*[1]: Understanding Metastability in FPGAs, Altera Corporation
*[2]: Cummings, Clifford E. "Clock domain crossing (CDC) design & verification techniques using SystemVerilog." SNUG-2008, Boston (2008).
*[3]: S. Beer, J. Cox, T. Chaney and D. M. Zar, "MTBF Bounds for Multistage Synchronizers", 2013 IEEE 19th International Symposium on Asynchronous Circuits and Systems, 2013, pp. 158-165, doi: 10.1109/ASYNC.2013.18.
'IT_Study > ASIC_Study' 카테고리의 다른 글
[CDC] 05. Gray Code vs. Binary Code(1) (4) | 2022.03.26 |
---|---|
[CDC] 04. Multi-bit Clock Domain Crossing(2) (8) | 2022.03.21 |
[CDC] 03. Multi-bit Clock Domain Crossing(1) (4) | 2022.03.19 |
[CDC] 01. Metastability란 무엇인가? (0) | 2022.02.21 |
[CDC] 00_CDC(Clock Domain Crossing) 이란 무엇인가? (2) | 2021.12.28 |
댓글