01signal.com

클록 도메인, 관련 클록과 비관련 클록

이 페이지는 클록 도메인에 관한 연재 중 첫 번째 글입니다.

소개

아주 단순한 FPGA 설계가 아니라면, 하나 이상의 클록이 플립플롭, 블록 RAM, 시프트 레지스터 등의 동기식 요소와 함께 사용됩니다. 그렇지만 논리 설계 내부의 대부분의 기능 블록은 하나의 클록을 기준으로 동작하므로, 여러 클록이 있다는 사실 자체가 특별한 주의를 요구하는 경우는 많지 않습니다. 문제는 어느 한 클록을 기준으로 동작하는 로직이 다른 클록을 기준으로 동작하는 로직과 연결될 때 발생합니다. 이 연재에서는 설계에서 여러 클록을 다루는 방법을 설명합니다.

서로 다른 클록에 의존하는 로직을 연결할 때 가장 먼저, 그리고 가장 중요하게 판단할 것은 재동기화 로직이 필요한지 여부입니다. 이는 곧 두 클록이 서로 관련 클록(related clocks)인지, 아니면 비관련 클록(unrelated clocks)인지를 묻는 것과 같습니다. 이 페이지에서는 이 질문의 의미와 답을 찾는 방법, 그리고 그와 관련된 주제들을 다룹니다. 아래 논의의 상당 부분은 타이밍 제약 조건(timing constraints)과 그러한 제약을 특정 로직 요소에 적용할 수 있는지 여부와 관련됩니다. 그래서 먼저 타이밍의 기초를 간단히 복습하겠습니다.

이 연재에서의 논의는 이해를 돕기 위해 상승 에지(positive edge) 트리거 플립플롭, 즉 클록 입력의 상승 에지(rising edge)에 반응하는 플립플롭만을 대상으로 합니다. 물론 클록에 맞춰 신호를 샘플링하고 출력하는 동기식 요소는 더 많습니다. 시프트 레지스터, 블록 RAM, 그 밖의 수많은 기능 요소들이 그렇습니다. 어떤 요소는 클록의 하강 에지(falling edge)나 심지어 양쪽 에지에 반응할 수도 있습니다. 이 연재에서는 단순함을 위해 이런 경우는 고려하지 않겠습니다.

또한 "X는 Y에 동기화되어 있다(X is synchronous with Y)"라는 표현은, 동기식 요소 X의 클록 입력이 클록 Y에 연결되어 있음을 뜻하는 말로 사용하겠습니다. 즉 그 동기식 요소는 이 클록으로 입력을 샘플링하고 출력도 이 클록으로 갱신합니다.

타이밍의 기초를 간단히

타이밍 이론에 대한 짧은 요약입니다. 더 자세한 설명은 별도 페이지에서 볼 수 있습니다.

다음 그림은 LUT를 거쳐 한 플립플롭에서 다른 플립플롭으로 이어지는 신호 경로(path)를 보여줍니다.

Crossing clock domains: Two flip-flops and a LUT between them

이 그림에서 LUT(룩업 테이블, Look-Up Table)는 임의의 조합 논리(combinatorial logic) 묶음을 나타냅니다. I1, I2, I3 또는 I4 중 어느 하나라도 변하면 일정한 전파 지연(propagation delay)을 거쳐 출력 O도 곧바로 변합니다.

신호 경로는 다음과 같이 동작합니다. 왼쪽 플립플롭의 Q 출력인 @foo는 입력 클록 @clk1의 상승 에지가 지난 뒤에 변합니다. 이 출력이 I1에 연결되어 있으므로 LUT의 출력 O는 약간의 지연 후에 변할 수 있습니다. 이 신호는 오른쪽 플립플롭의 데이터 입력 D로 들어갑니다. 오른쪽 플립플롭은 @clk2의 상승 에지 후에 D를 Q(@bar)로 복사합니다.

하지만 실제로는 그렇게 단순하지 않습니다. 모든 플립플롭에는 타이밍 요구 조건이 있습니다. 데이터 입력 D는 @clk2의 상승 에지가 오기 전에 tsu(셋업 시간, setup time)만큼 안정적이어야 하고, 그 에지가 지난 뒤에도 thold(홀드 시간, hold time) 동안 안정적으로 유지되어야 합니다.

FPGA 내부 신호 경로의 대부분은 하나의 클록과 관련되어 있으므로, @clk1과 @clk2는 사실상 같은 클록 신호입니다(클록 스큐(clock skew)는 무시하겠습니다). 이런 경로에 대해서는 두 타이밍 요구 조건을 보장할 수 있는지 계산할 수 있습니다.

예를 들어 위 그림의 tsu 요구 조건을 살펴보겠습니다. 핵심은 @clk1의 상승 에지부터 오른쪽 플립플롭의 D 입력이 갱신되어 안정될 때까지 걸리는 시간을 구하는 것입니다. 이 시간은 경로상의 모든 지연을 합한 값입니다. @clk1의 상승 에지 후 @foo가 갱신될 때까지의 지연("클록-출력(clock-to-output) 지연")에서 시작해 오른쪽 플립플롭 D 입력까지의 모든 지연을 더합니다. 여기에는 LUT의 지연뿐 아니라 논리 요소 사이 배선의 지연(라우팅 지연, routing delay)도 포함됩니다.

@clk1과 @clk2가 같은 클록이라면 두 플립플롭에 다음 상승 에지가 언제 도달하는지 알 수 있습니다. 한 클록 주기 뒤입니다(예: 100MHz 클록이면 10ns). 따라서 이 경로의 전체 지연은 tsu의 여유분만큼을 뺀 클록 주기보다 작아야 합니다. 이 조건이 보장되면 tsu가 요구하는 것, 즉 @clk2의 상승 에지 전에 오른쪽 플립플롭의 D 입력이 tsu의 시간 여유를 두고 안정적으로 유지된다는 것이 보장됩니다. 숫자가 포함된 예는 타이밍 이론 페이지를 참고하세요.

thold에 대해서도 비슷한 계산을 할 수 있습니다. tsu와 달리 thold의 요구 조건은 @clk2의 상승 에지 이후에도 오른쪽 플립플롭의 D 입력이 일정 시간 thold 동안 안정적으로 유지되어야 한다는 것입니다. 따라서 @clk1과 @clk2가 같을 때는 클록 주기가 관련이 없으며 계산에 고려하지 않습니다. 중요한 것은 다음 클록 사이클이 아니라 같은 클록 사이클에서 일어나는 일입니다.

이런 계산이 가능한 이유는 @clk1의 상승 에지와 @clk2의 상승 에지 사이의 시간 차이를 알기 때문입니다. 특히 @clk1과 @clk2가 같은 클록이라면 tsu 계산에 쓰이는 시간 차이는 바로 그 클록의 주기입니다. 그러나 두 클록 사이의 시간 차이를 모르면 tsu도 thold도 보장할 수 없습니다.

tsu와 thold는 모든 플립플롭에 적용됩니다. 당연히 FPGA 내부의 모든 플립플롭뿐 아니라 외부 장치의 플립플롭에도 적용됩니다. 예를 들어 FPGA 출력 핀에서 나온 신호를 어떤 외부 장치가 자기 클록으로 샘플링하는 경우도 포함됩니다. 따라서 시스템의 모든 플립플롭에 대해 이 두 조건이 충족됨을 보장했는지 스스로 확인해야 합니다. 보장할 수 없는 플립플롭이 있다면, 그런 상황에서도 안정적으로 동작하게 하는 메커니즘(즉, 재동기화 로직)을 마련해야 합니다. 이것이 바로 클록 도메인 교차(clock domain crossing) 문제의 핵심입니다.

그렇다면 다시: 타이밍은 언제 보장될까?

앞 절에서 헷갈릴 수 있으니, 핵심을 다시 정리하면 다음과 같습니다.

FPGA 설계에는 항상 타이밍 제약 조건이 포함되며, 이를 통해 설계 도구에 각 클록의 주파수를 알려줍니다. 설계 도구는 이 정보를 바탕으로 두 타이밍 요구 조건(tsu와 thold)이 충족되도록 합니다. 만약 요구 조건을 달성하지 못하면 그 실패를 보고합니다.

앞서 언급했듯이 tsu와 thold를 보장할 수 있는 경우는 경로 시작점의 클록 상승 에지와 경로 끝점의 클록 상승 에지 사이의 시간 차이를 알 때뿐입니다. 실제로 대부분의 경우가 그렇습니다. 논리 설계의 상당 부분은 같은 클록에 동기화된 다른 레지스터에 의존하는 레지스터들로 구성되기 때문입니다.

그런데 두 개의 서로 다른 클록을 사용한다면 어떨까요? 경로 시작점의 플립플롭에는 어떤 클록이, 경로 끝점의 플립플롭에는 또 다른 클록이 연결되어 있다면요? 즉 @clk1과 @clk2가 다른 경우입니다. 그런 경우에도 타이밍 계산을 해서 요구 조건을 보장할 수 있을까요? 결론부터 말하면 경우에 따라 다릅니다. 이 페이지의 나머지 내용이 바로 이 주제입니다.

클록 도메인과 클록 도메인 교차

클록 도메인(clock domain)은 특정 클록 신호에 동기화되는 모든 동기식 요소(플립플롭 등)로 구성됩니다.

간단한 Verilog 코드 조각을 보겠습니다.

reg foo, bar;

always @(posedge clk1)
  foo <= !foo;

always @(posedge clk2)
  bar <= foo;

이 예에서 @foo는 @clk1에 동기화되어 있고, @bar는 @clk2에 동기화되어 있습니다. 따라서 @foo와 @bar는 서로 다른 클록 도메인(각각 @clk1과 @clk2의 도메인)에 속하는 것이 분명합니다.

@foo는 자기 자신에만 의존하므로 걱정할 것이 없습니다. 하지만 @bar는 @clk2에 동기화되어 있고, @clk1에 동기화된 @foo에 의존합니다. 과연 @bar를 다른 레지스터처럼 사용해도 될까요? @bar가 항상 타이밍이 보장된 상태에서 @foo의 값을 받아서 그 동작을 알 수 있고 재현할 수 있다고 가정할 수 있을까요?

이 질문에 답하기 전에, 방금 일어난 일에 이름을 붙여 보겠습니다. 이것이 바로 클록 도메인 교차(clock domain crossing)입니다. @foo와 @bar는 서로 다른 클록에 동기화된 두 플립플롭으로 구현되어 있습니다. 따라서 @foo에서 @bar로 가는 경로는 한 클록 도메인에서 다른 클록 도메인으로 건너갑니다.

더 일반적으로 말하면, 클록 도메인 교차는 어떤 클록 도메인에 속한 동기식 요소의 출력이 다른 클록 도메인에 속한 동기식 요소의 입력으로 들어가는 상황을 가리킵니다. 두 동기식 요소 사이에는 흔히 조합 논리가 있습니다.

따라서 @bar를 다음과 같이 정의했다고 해도

always @(posedge clk2)
  bar <= !foo || !bar;

여전히 클록 도메인 교차가 존재합니다. 이 경우 신호는 @foo에서 시작해 그 논리 함수를 구현하는 LUT를 거쳐 @bar까지 도달하며, 바로 위 그림과 같은 형태가 됩니다.

관련 클록과 비관련 클록

관련 클록(related clocks)이란 같은 기준 클록에서 파생되었고, 알려진 오차와 지터(jitter)를 제외하면 상승 에지와 하강 에지 사이의 시간 차이를 예측할 수 있는 클록들을 말합니다.

관련 클록 대신 "동기 클록(synchronous clocks)"이라는 용어를 쓰기도 합니다. 마찬가지로 비관련 클록 대신 "비동기 클록(asynchronous clocks)"이라는 용어도 흔히 사용됩니다.

관련 클록의 대표적인 예로, FPGA PLL 하나로 여러 클록을 만들되 각 클록 주파수 사이에 알려진 관계가 있는 경우를 들 수 있습니다. 이런 경우 FPGA 설계 도구는 보통 클록 버퍼들을 배치하여 클록 에지를 가능한 한 정렬합니다.

예를 들어 기준 클록을 2배와 3배로 체배하는 경우를 보겠습니다.

Simple clock diagram with clock multiplication

이 예에서 x1 clk, x2 clk, x3 clk는 서로 간의 타이밍을 예측할 수 있으므로 관련 클록입니다.

일반적으로 기준 클록은 나머지 클록들과의 관계에서 비관련 클록입니다. 기준 클록의 에지와 다른 클록의 에지 사이의 타이밍은 온도 등 여러 요인에 따라 달라질 수 있기 때문입니다. 다만 PLL이 기준 클록과 출력 클록 사이의 정렬을 예측 가능하게 유지하도록 구성되어 있다면, 기준 클록도 관련 클록이 됩니다.

클록 사이의 시간 관계를 알면 서로 다른 클록 도메인 사이를 지나는 경로에 대해서도 타이밍 계산을 할 수 있습니다. 예를 들어 x1 clk 도메인과 x2 clk 도메인 사이의 경로 타이밍은 x2 clk 도메인 내부의 경로와 같은 요구 조건으로 계산됩니다. 두 클록 사이에서 발생할 수 있는 최단 시간 차이가 x2 clk의 두 상승 에지 사이의 시간과 같기 때문입니다.

마찬가지로 x2 clk와 x3 clk 사이의 경로도 계산할 수 있습니다. 하지만 최단 시간 차이는 x1 clk 주기의 6분의 1에 불과합니다. 따라서 최악의 타이밍 요구 조건은 가상의 x6 clk에 대한 요구 조건과 같습니다. 그 이유는 x2 clk의 두 번째 상승 에지와 x3 clk의 세 번째 상승 에지 사이의 시간 차이 때문입니다.

타이밍이 어떻게 계산되는지에 대한 더 자세한 논의는 이 페이지를 참조하세요.

이 예에서 강조하고 싶은 점은 일반적으로도 성립하는 사실입니다. 관련 클록이면 같은 클록 도메인 내부의 경로처럼 두 클록 사이의 경로에 타이밍 제약 조건을 부과하여 타이밍을 보장할 수 있습니다. FPGA 설계 도구가 클록 에지를 의도적으로 정렬해 주기 때문에 가능한 일입니다. 예에서 보았듯이 이때의 타이밍 요구 조건은 각 클록을 개별적으로 볼 때보다 흔히 더 엄격하며, 때로는 훨씬 더 엄격해집니다.

단, 두 클록이 같은 기준 클록에서 파생되었다 해서 반드시 관련 클록이 되는 것은 아닙니다. 특히 두 클록 사이의 스큐(skew)가 제어되지 않거나 알 수 없다면 비관련 클록으로 취급해야 합니다. 설계 도구가 지연이 동일한 클록 분배 리소스를 명시적으로 사용하지 않는 한 그런 상태입니다.

또한 x1 클록도 기준 클록과 주파수가 정확히 같더라도 반드시 관련 클록인 것은 아닙니다. 두 클록이 의도적으로 서로 정렬되어 있지 않다면 위상 관계를 알 수 없습니다.

위상 문제 때문에 앞에서 클록 도메인을 정의할 때 "특정 클록"이 아니라 "특정 클록 신호"라고 썼습니다. "특정 클록"은 예를 들어 보드에서 같은 클록이 FPGA의 서로 다른 두 입력 핀에 연결된 경우를 가리킬 수 있습니다. 반면 "특정 클록 신호"는 위 예의 @clk1이나 @clk2처럼 클록 신호를 나타내는 Verilog 내부의 와이어 또는 설계 네트리스트의 와이어를 가리킵니다. 이 신호는 Verilog 설계에서 인스턴스화(instantiation)의 포트 연결이나 일반적인 "assign" 문을 통해 전달됩니다.

Verilog에서 클록이 정확히 같은 신호라는 것은, 설계 도구가 하드웨어에서 클록 스큐를 낮게 유지하는 리소스를 반드시 사용하도록 한다는 뜻입니다. 또한 설계 도구가 그 클록들을 관련 클록으로 간주할지 여부에도 영향을 줍니다(자세한 내용은 아래에서 다룹니다).

관련 클록, 타이밍 제약 조건, 재동기화 로직

원래 질문으로 돌아가겠습니다. 위 예의 @bar를 다른 레지스터처럼 사용할 수 있을까요? 더 일반적으로 말하면, 한 클록 도메인에서 다른 클록 도메인으로 들어가는 경로의 끝에 있는 플립플롭의 출력을 다른 플립플롭 출력처럼 신뢰하고 사용할 수 있을까요? 이는 곧 데이터 입력에 도달하는 경로 중 적어도 하나가 다른 클록에 동기화되어 있을 때 그 플립플롭의 셋업 시간과 홀드 시간을 보장할 수 있는지를 묻는 것과 같습니다.

답은 간단하고 짧습니다. 예에서 양쪽 클록(@clk1과 @clk2)이 관련 클록이고, 그 경로에 적절한 타이밍 제약 조건이 적용되어 달성된다면 도착점의 플립플롭 출력은 문제없이 다른 레지스터처럼 사용할 수 있습니다. 그렇지 않으면 도착점의 타이밍을 보장할 수 없으므로, 이 문제를 해결하기 위해 재동기화 로직을 추가해야 합니다.

이 페이지에서는 관련 클록 사이의 경로에 대한 완전한 타이밍 분석을 보여 줍니다.

위에서 길게 논의했으니, 이제 몇 가지 간단한 규칙으로 정리하겠습니다.

  1. 비관련 클록에 속하는 클록 도메인 사이의 경로에는 타이밍 제약 조건을 부과할 수 없습니다.
  2. 두 클록 도메인 사이의 모든 경로에 재동기화 로직이 있다면, 그 경로들에 타이밍 제약 조건을 부과할 필요가 없습니다.
  3. 두 클록 도메인 사이의 어떤 경로에 재동기화 로직이 없다면, 그 경로에는 타이밍 제약 조건을 반드시 부과해야 합니다.

첫 번째 규칙이 가장 단순합니다. 두 클록이 관련 클록인지 확신할 수 없다면, 클록 도메인 사이의 모든 경로에 재동기화 로직이 있도록 하십시오(방법은 다음 페이지에서 설명합니다). 그리고 그 경로들에는 타이밍 제약 조건이 부과되지 않도록 하십시오. 두 번째 규칙에 따르면 그렇게 해도 되기 때문입니다. 불필요한 타이밍 제약 조건은 FPGA 설계 도구의 작업만 더 어렵게 만듭니다.

이 규칙들에서 나오는 또 하나의 결과는, 클록들이 서로 관련 클록이더라도 비관련 클록처럼 취급해도 된다는 것입니다. 방금 언급한 대로 모든 경로에 재동기화 로직을 두고 타이밍 제약 조건의 적용을 끄면 됩니다(자세한 내용은 아래 참조).

마지막으로, 클록들이 관련 클록임을 확신한다면 재동기화 로직은 필요 없지만, 클록 도메인 사이의 모든 경로에 타이밍 제약 조건이 올바르게 부과되어야 합니다.

이 절의 내용을 표로 정리하면 다음과 같습니다. 표의 행은 경로 끝에 재동기화 로직이 있는지 여부이고, 열은 클록들이 관련 클록인지 아닌지입니다. 표의 가운데에는 그 경로에 타이밍 제약 조건이 필요한지 여부를 나타냈습니다.

클록이
관련 클록 비관련 클록

재동기화
로직:

미적용 경로에 타이밍 제약 조건이 필요함 실수에 해당함
적용함 경로에 타이밍 제약 조건이 필요하지 않음

흔한 실수들

복잡한 설계에서는 신호가 여러 모듈에 걸쳐 연결되다 보니 어떤 신호가 어떤 클록에 동기화되어 있는지 놓치기 쉽고, 그 결과 의식하지 못한 채 한 클록 도메인에서 다른 클록 도메인으로 넘어가게 됩니다.

문제가 되는 실수는 두 가지 유형입니다. 첫 번째는 비관련 클록 도메인 사이의 경로에 재동기화 로직 없이 신호를 연결하는 것입니다. 이런 경로의 도착점에서는 타이밍이 때때로 위반될 수 있습니다. 타이밍 관련 실수가 늘 그렇듯이 표면에 드러나는 증상은 매우 오해하기 쉽습니다. 설계 도구는 타이밍 제약 조건만 보고 두 클록이 관련 클록이라고 추정해, 그 경로에 불필요하게 타이밍 제약 조건을 적용할 수도 있으며 이는 혼란을 키웁니다. 비관련 클록 사이의 경로에는 이런 타이밍 제약이 아무 의미도 없지만, 리포트에는 마치 제대로 처리된 것처럼 나타납니다. 그 결과 타이밍 리포트를 읽는 사람이 모든 것이 정상이거나, 어쩌면 두 클록이 정말 관련 클록이라고 오해할 수 있습니다.

두 번째로 나쁜 실수는 두 클록이 실제로는 관련 클록이고 로직도 그렇게 취급하는데, 설계 도구가 그렇게 보지 않는 경우입니다. 그러면 클록 도메인 사이의 경로에 타이밍 제약 조건이 부과되지 않습니다. 그 결과 도착점에서 타이밍 요구 조건이 충족된다는 보장이 없습니다. 이런 경우 역시 동작이 불안정해질 수 있습니다. 다만 이러한 종류의 실수는 설계의 타이밍 검증 점검(timing validation checkup)을 통해 발견할 수 있습니다.

클록 도메인 교차를 인지하지 못해도 정말로 무해한 유일한 상황은, 두 클록이 관련 클록이면서 FPGA 설계 도구도 그렇게 간주하는 경우입니다(따라서 관련 경로에 타이밍 제약 조건이 적용됩니다). 이 경우에도 클록 주파수가 다르고 로직이 그 사실을 반영하지 않으면 기능적 버그가 생길 수 있지만, 그것은 일반적인 로직 버그와 다를 바 없습니다.

불필요한 제약 조건 적용 피하기

하나의 PLL로 서로 다른 주파수의 클록을 만들어 각기 다른 기능 블록에서 사용하도록 하는 경우가 꽤 많습니다. 설계자 관점에서는 이 클록들이 비관련 클록이지만, 실제로는 관련 클록이며 설계 도구도 보통 관련 클록으로 간주합니다.

예를 들어 PLL이 10MHz 기준 클록에서 두 개의 클록을 만든다고 합시다. 하나는 90MHz이고 다른 하나는 100MHz입니다. 프로젝트의 서로 다른 부분에 사용하려는 의도라서 개념적으로는 비관련 클록입니다. 그런데 두 클록에 각각 동기화된 플립플롭 사이에 연결이 있다면 어떻게 될까요?

첫 번째 클록의 주기가 11.11ns이고 두 번째 클록의 주기가 10ns이므로, 모든 가능한 위상 조합을 고려하면 두 상승 에지 사이의 최악의 시간 차이는 1.11ns입니다. 이는 900MHz 클록의 주기와 같습니다. 따라서 두 플립플롭 사이 경로의 타이밍이 매우 빠듯하며, 요구 조건을 달성할 수 있다고 해도 설계 도구에는 큰 어려움을 줍니다. 특히 그런 경로가 많다면 더욱 그렇습니다.

이론적인 경우만은 아닙니다. 흔한 함정 중 하나는 듀얼 클록 FIFO(dual-clock FIFO)로 클록 도메인 사이를 인터페이스하면서 그 클록들이 관련 클록인지 아닌지 신경 쓰지 않는 것입니다. 이 실수 자체로 기능적 문제가 생기지는 않습니다. 듀얼 클록 FIFO에는 항상 재동기화 로직이 있기 때문에, 두 클록 도메인 사이의 경로에 설계 도구가 타이밍 제약 조건을 적용하도록 강제하는 것은 무의미합니다. 도구는 아무 이득도 없는 타이밍 제약 조건을 달성하느라 애를 먹을 수 있습니다.

따라서 관련 클록이지만 그렇게 취급되지 않는 경우, 특히 같은 PLL에서 나오는 클록들에 주의할 필요가 있습니다. 한 클록 도메인에서 다른 클록 도메인으로 가는 경로에 타이밍 제약 조건이 적용될 가능성이 높기 때문입니다. 재동기화 로직이 이미 타이밍 위반을 막아 주므로 이런 제약 적용은 아무 이득이 없습니다. 반면 도구가 그 경로들의 제약 조건을 달성하려고 애쓰는 바람에 전체 설계의 타이밍 제약 달성이 어려워질 수 있습니다.

이 문제를 해결하려면 두 클록을 비관련 클록으로 선언하는 타이밍 제약 조건을 추가하면 됩니다. 또는 그 경로들에 가짜 경로(false path)나 최대 지연(maximal delay)을 정의하는 방법도 있습니다. 다만 어떤 경우에는 이런 조치가 필요하지 않을 수도 있으니, 조치를 취하기 전에 해당 경로들의 타이밍 리포트를 확인해 볼 가치가 있습니다. 예를 들어 FPGA 설계 도구가 제공하는 듀얼 클록 FIFO를 사용할 때는 클록 도메인 사이를 연결하는 경로에 적절한 타이밍 제약 조건이 자동으로 추가되는 경우가 많습니다.

오해를 부르는 타이밍 제약 조건

중요한 점은 FPGA 설계 도구가 비관련 클록 사이의 타이밍 제약 조건도 대개 수용하고 적용한다는 것입니다. 이런 제약은 무의미할 뿐 아니라 혼란을 줍니다. 특히 관련 경로가 타이밍 리포트에 마치 요구 조건이 보장된 것처럼 나타나기 때문입니다. 앞서 논의했듯이 비관련 클록에 속한 클록 도메인 사이의 경로 타이밍은 원리적으로 보장할 수 없습니다.

타이밍 제약 조건은 단지 FPGA 설계 도구에 설계 정보를 알려주는 수단임을 기억해야 합니다. 설계가 타이밍 제약 조건을 달성했다는 것은, 그 제약 조건이 올바를 때만 의미가 있습니다. 그러니 두 클록이 관련 클록인지 확신할 수 없다면, 타이밍 제약 조건을 추가하는 것만으로 클록 도메인 교차 문제를 해결하려고 하면 안 됩니다.

그리고 다시 강조하지만, 관련이 있는 경우에는 클록을 비관련 클록으로 정의하는 타이밍 제약 조건을 추가하거나 가짜 경로(false path)를 정의하는 것이 좋습니다. 이렇게 하면 FPGA 설계 도구의 작업이 수월해질 뿐 아니라 혼란도 피할 수 있습니다.

설계 도구가 올바른 정보를 알도록 하기

위에서 언급한 모든 이유로, FPGA 설계 도구가 어떤 클록이 관련 클록이고 어떤 클록이 아닌지에 대해 올바른 정보를 가지는 것이 매우 중요합니다. 더 정확히 말하면, FPGA 설계 도구가 재동기화 로직으로 보호되지 않는 모든 경로에 타이밍 제약 조건을 적용하도록 해야 합니다(클록 도메인 내부의 경로도 포함되지만, 여기서는 그다지 관련이 없습니다).

하지만 설계 도구가 논리 설계와 동일한 인식을 갖도록 하는 것은 어려울 수 있습니다. FPGA 설계 소프트웨어마다 클록 사이의 관계를 자동으로 추정하는 방식이 다르기 때문입니다. 모든 도구에서 공통적으로 보이는 유일한 점은, 해당 도구가 제공하는 전용 클록킹 IP를 사용해 같은 PLL로 두 개 이상의 클록을 만들면 그 클록들을 관련 클록으로 간주한다는 것입니다. 그에 따라 해당 클록 도메인 사이의 경로에 대해 타이밍이 계산되고 타이밍 제약 조건이 적용됩니다. 이 적용은 보통 기준 클록에 부여된 타이밍 제약 조건을 기준으로 이루어집니다. 하지만 그것조차 당연하게 여기지는 말아야 합니다.

그 외의 경우에는 각 도구가 클록 사이의 관계를 추론하는 방식이 제각각이며, 같은 FPGA 제조업체의 도구라도 특정 상황에서 서로 다른 판단을 내릴 수 있습니다. 가장 대표적인 예로, Xilinx의 Vivado는 이전 주력 도구였던 ISE보다 클록을 관련 클록으로 가정하는 경향이 강합니다.

따라서 모든 FPGA 설계 도구에 적용되는 일반적인 원칙은 없으며, 특정 도구라도 예상 밖의 판단을 내릴 수 있습니다. 이 문제를 제대로 다루는 유일한 방법은 타이밍 리포트를 확인하고, 특정 경로 그룹에 대해 타이밍 리포트를 만들어 필요한 곳에는 타이밍 요구 조건이 제대로 적용되고 필요 없는 곳에는 적용되지 않았는지 확인하는 것입니다. 만만치 않은 작업이지만 그만한 가치가 있습니다.

이상으로 이 연재의 첫 번째 페이지를 마칩니다. 다음 페이지에서는 클록 도메인 교차의 기초를 살펴봅니다.

이 페이지는 영어 원문을 기계 번역한 것입니다. 의문이 드는 부분이 있으면 원문을 참조하시기 바랍니다.
Copyright © 2021-2026. All rights reserved. (dcc38493)