이 페이지는 타이밍에 관한 일련의 페이지 중 하나입니다.
이 페이지에 대해
타이밍을 제대로 맞추려면 논리 설계의 기본적인 주제 몇 가지를 알고 있어야 합니다. 이 페이지에서는 이 시리즈의 나머지 글을 이해하는 바탕이 되는 몇 가지 기본 개념을 설명합니다.
아래에 쓰인 내용은 모두 논리 설계 관련 학술 강의에서 다루는 내용입니다. 하지만 FPGA 로 작업하는 사람이라면 누구나 이런 강의를 들었던 것은 아니고, 들었더라도 모든 것을 기억하지는 못합니다. 이 페이지는 그런 부족한 부분이 있다면 이를 채워 주기 위한 글입니다.
이미 아는 부분은 건너뛰어도 좋습니다. 하지만 전체를 가볍게 훑어보는 것도 권합니다. 이 페이지의 마지막 절들은 이 시리즈의 다음 글들을 이해하는 데 특히 중요합니다.
간단한 복습
타이밍과 관련된 개념으로 들어가기 전에, 논리 설계에서 쓰이는 몇 가지 용어를 빠르게 복습하겠습니다. 만약 모르는 용어가 있다면 이 페이지를 계속 읽기 전에 그 용어를 먼저 익혀 두는 것이 좋습니다.
첫째, 조합 논리(combinatorial logic)가 있습니다. 이 용어는 AND 게이트, OR 게이트, NOT 게이트 등과 같은 논리소자를 가리킬 때 씁니다. 이런 논리소자들은 메모리가 없기 때문에 조합 논리로 분류됩니다. 다시 말해, 이들의 동작은 과거에 무슨 일이 있었는지에 의존하지 않습니다. 논리소자의 출력 값은 입력 값에만 의존합니다.
조합 논리의 중요한 형태로 룩업 테이블(look-up table, LUT)이 있습니다. LUT 는 여러 입력에 대한 임의의 논리 함수를 구현하는 다목적 논리소자입니다. FPGA 내부의 거의 모든 조합 논리는 LUT 를 사용하기 때문에 LUT 는 매우 중요합니다. FPGA 내부의 LUT 는 비동기 ROM, 즉 클록이 없는 ROM 으로 구현됩니다. 입력은 LUT 내부 데이터의 주소로 취급됩니다. 출력은 보통 1비트 또는 2비트입니다.
시중에 판매되는 거의 모든 FPGA 에서 LUT 의 입력 수는 4개 또는 6개이므로, 각 LUT 의 메모리 셀 수는 16개 또는 64개입니다.
다음 중요한 용어는 순차 논리(sequential logic)입니다. 순차 논리에는 플립플롭, 동기식 RAM, 그리고 동작에 클록이 필요한 여러 다른 기본 구성 요소들이 포함됩니다. 이런 논리소자들은 클록의 특정 변화에 반응하여 동작합니다. 동작하는 순간 사이에는 입력을 무시하고 내부 상태를 유지하며 출력도 바꾸지 않습니다.
예를 들어, 상승 에지(positive edge)에서 동작하는 논리소자는 클록이 low 에서 high 로 바뀔 때, 즉 상승 클록 에지에서 동작합니다. 마찬가지로 하강 에지에서 동작하는 논리소자는 클록이 high 에서 low 로 바뀔 때, 즉 하강 클록 에지에서 동작합니다. 두 클록 에지 모두에서 동작하는 논리소자도 있지만, 그런 논리소자는 거의 I/O 신호를 샘플링하거나 만들 때만 사용됩니다.
모든 순차 논리소자는 어떤 형태로든 메모리를 갖습니다. 클록 에지가 오기 전까지 출력을 바꾸지 않는다는 사실에서 바로 알 수 있습니다. 어떤 순차 논리소자는 출력마다 정확히 1비트라는 최소한의 메모리만 갖고, 어떤 소자는 시프트 레지스터나 RAM 처럼 더 많은 메모리를 갖습니다.
타이밍을 논할 때 중요한 사실은 딱 두 가지뿐입니다. 입력은 클록 에지와 함께일 때만 샘플링되고, 출력은 거의 클록 에지의 결과로만 바뀐다는 것입니다. 예외가 하나 있습니다. 일부 순차 논리소자에는 비동기 리셋(asynchronous reset) 입력이 있다는 것입니다. 이 입력이 활성화되면(논리소자에 따라 high 또는 low), 클록과 무관하게 내부 상태가 즉시 미리 정의된 값으로 바뀝니다. 그 결과 그 소자의 일부 또는 전체 출력도 즉시 알려진 값으로 바뀝니다.
FPGA 에서 일부 순차 논리소자는 비동기 리셋을 갖고 있고, 다른 소자는 갖고 있지 않습니다. FPGA 의 거의 모든 순차 논리소자에서 가능한 유일한 비동기 입력은 바로 이 비동기 리셋입니다. 논리 설계 이론에는 여러 비동기 입력을 가진 소자, 예를 들어 S-R 플립플롭이 있음에도 불구하고 그렇습니다.
지금부터는 플립플롭을 기준으로 설명합니다
설명을 단순하게 하기 위해, 모든 순차 논리소자가 상승 에지에서 동작하는 플립플롭, 즉 클록의 상승 에지에 반응하여 동작하는 플립플롭이라고 가정하겠습니다. 다시 말해, 여기서 모든 순차 논리소자는 플립플롭으로 표현됩니다. 이 플립플롭들은 클록이 low 에서 high 로 바뀔 때만 입력에 반응하여 출력을 갱신합니다.
이렇게 보면 타이밍을 이해하기가 더 쉽고, 플립플롭에 대한 논의는 다른 어떤 순차 논리소자로도 쉽게 확장할 수 있습니다.
셋업과 홀드
플립플롭이 정확하고 안정적으로 동작하게 하려면 입력이 다음 두 가지 타이밍 요구사항에 따라 안정적이어야 합니다. 즉, 입력 값이 바뀌지 않고 유지되어야 합니다.
- 입력은 클록 에지 이전의 일정 시간 동안 안정적이어야 합니다. 이 시간을 셋업 시간(setup time)이라고 하며, tsu 로 표기합니다.
- 입력은 클록 에지 이후의 일정 시간 동안도 안정적이어야 합니다. 이 시간을 홀드 시간(hold time)이라고 하며, thold 로 표기합니다.
위 그림은 tsu 와 thold 의 의미를 보여 줍니다. D 입력은 노란색으로 표시된 시간 구간 안에서는 값을 바꿀 수 없습니다. 이 예에서 D 는 high 에서 low 로 바뀌지만, 그 시점이 노란색 구간 밖이므로 타이밍이 적법합니다.
이 두 타이밍 파라미터를 이해하는 한 가지 방법은 다음과 같습니다. 플립플롭의 입력이 클록 에지와 정확히 같은 시점에 바뀐다면, 플립플롭이 그 입력을 high 로 볼지 low 로 볼지가 분명하지 않습니다. 무엇을 선택해야 할까요? 클록 에지 직전의 상태를 택해야 할까요, 직후의 상태를 택해야 할까요?
그렇다면 입력이 클록 에지와 "정확히 같은 시점"에 바뀌었다는 것은 어느 정도나 정확해야 한다는 뜻일까요? tsu 와 thold 는 클록 에지에서 얼마나 떨어진 시점까지 입력 값을 바꿔도 안전한지를 정의합니다. 이 두 파라미터는 모든 순차 논리소자에 같은 의미로 정의됩니다.
중요한 점은, 이 타이밍 요구사항이 위반되면 그 결과가 단순히 "클록 에지 후 플립플롭 출력이 랜덤해진다"는 정도보다 훨씬 나쁠 수 있다는 것입니다. 이유는 크게 두 가지입니다.
- 경우에 따라 FPGA 툴은 프로젝트를 구현하는 동안 논리 설계의 플립플롭을 자동으로 복제하기도 합니다. 특히 팬아웃(fan-out)을 줄이기 위해서입니다. 이렇게 하면 이 플립플롭 값을 사용하는 로직 중 일부는 한쪽 플립플롭에 연결되고, 나머지 일부는 다른 쪽 플립플롭에 연결됩니다. 두 플립플롭의 출력이 항상 같다면 문제가 없습니다. 하지만 타이밍 요구사항(tsu 와 thold)을 위반하면 두 플립플롭의 출력이 서로 달라질 수 있습니다.
- 타이밍 요구사항을 위반하면 플립플롭이 준안정 상태(metastability)에 빠질 수도 있습니다. 이 상태에서 플립플롭의 출력은 잠시 동안 high 도 low 도 아닌 값을 갖습니다. 준안정 상태와 그 부작용에 대한 자세한 내용은 이 페이지에서 확인할 수 있습니다.
클록-출력 시간
모든 순차 논리소자에 정의되는 세 번째 타이밍 파라미터는 클록-출력 시간(clock-to-output time)입니다. 이 값은 tcko, tco, tC_Q 등 여러 가지 기호로 쓰입니다. 이 파라미터는 타이밍 요구사항이 아니라, 순차 논리소자의 출력(Q)이 언제 유효해지는지를 나타냅니다. 더 정확히는 클록 에지가 지난 뒤 출력이 유효할 때까지 걸리는 시간입니다(위 타이밍 그림 참조).
사실 이와 관련해서는 두 가지 파라미터가 있습니다.
- 최대 클록-출력 시간: 클록 에지가 발생한 뒤 출력이 유효해질 때까지 걸리는 시간입니다.
- 최소 클록-출력 시간: 클록 에지가 발생한 뒤에도 출력이 변하지 않고 유지되는 것이 보장되는 시간입니다.
대부분의 경우 최대 클록-출력 시간만 관심 대상입니다. 따라서 데이터시트에 이 파라미터가 주어져 있다면 거의 확실히 최댓값입니다.
타이밍 요구사항(tsu 와 thold)을 위반하면 출력이 언제 안정될지 보장할 수 없습니다. 이런 경우 플립플롭이 잠시 동안 정의되지 않은 상태, 즉 준안정 상태에 머무를 수 있기 때문에 최대 클록-출력 시간도 의미가 없습니다.
셋업과 홀드는 음수일 수 있다
위 그림에서는 tsu 와 thold 가 양수로 그려져 있지만, 이 중 하나가 음수일 수도 있습니다. 실제로 FPGA 내부의 플립플롭에서는 이런 일이 자주 일어납니다.
예를 들어 tsu 가 음수라면, 클록 에지가 도착하는 시점에 데이터가 안정적일 필요가 없습니다. 대신 데이터는 클록 에지가 지난 약간 뒤에 안정된 값에 도달하면 됩니다. 그래도 tsu 는 클록 에지 이후 얼마나 지난 시점까지 허용되는지에 제한을 둡니다.
마찬가지로 thold 가 음수면 데이터가 클록 에지 이전에 바뀌어도 됩니다. 역시 클록 에지 이전 얼마나 일찍 바뀌어도 되는지에는 여전히 제한이 있으며, 그 제한이 thold 에 반영됩니다.
그런데 tsu 와 thold 가 음수가 될 수 있기 때문에, 이론상으로는 말이 안 되는 타이밍 요구사항을 정의하는 것도 가능합니다.
이를 설명하기 위해, 플립플롭이 실제로 입력을 샘플링하는 시점을 tsamp 로 표기하겠습니다. tsamp 는 사전에 알 수 없지만, tsu 의 정의에서 –tsu < tsamp 임을 알 수 있습니다. 다시 말해, 플립플롭은 데이터가 바뀐 뒤 안정된 상태에 도달한 다음에 입력을 샘플링하며, 이를 보장하는 것이 tsu 입니다. 같은 원리로 tsamp < thold 입니다. 샘플링은 데이터가 클록 에지에 반응하여 바뀌기 전에 일어나야 하기 때문입니다. 이 두 관계를 합치면 –tsu < tsamp < thold 가 되고, 간단히 쓰면 –tsu < thold 입니다. 이 조건은 모든 tsu 와 thold 의 쌍에 대해 성립해야 합니다.
따라서 tsu 나 thold 는 위 조건을 만족하는 한 음수일 수 있습니다. 하지만 둘 다 동시에 음수일 수는 없습니다.
클록-출력 시간은 항상 양수입니다. 플립플롭이 아직 도착하지 않은 클록 에지에 반응할 수는 없기 때문입니다. 한편, tsamp 가 음수일 수 있다는 사실이 샘플링이 클록 에지보다 먼저 일어났다는 뜻은 아닙니다. 이는 데이터 신호의 지연 때문에 발생할 수 있는 현상입니다.
전파 지연
위 그림은 가운데 LUT 를 사이에 두고 두 플립플롭이 연결된 간단한 예를 보여 줍니다. 설명을 단순하게 하기 위해 LUT 의 출력이 I1 에만 의존한다고 가정하겠습니다. 예를 들어, 아래 Verilog 코드를 합성한 결과가 이와 같은 구조일 수 있습니다. 이 경우 LUT 는 NOT 게이트를 구현합니다.
always @(posedge clk)
begin
foo_reg <= foo; // FF1 = foo_reg
bar <= !foo_reg; // FF2 = bar
end
두 플립플롭 모두 같은 클록에 연결되어 있습니다. 그렇다면 이 클록의 최대 주파수는 얼마일까요?
이 질문에 답하려면 빠진 정보가 하나 있습니다. FF1 의 출력 값이 안정된 순간부터 FF2 의 입력 값이 안정될 때까지 시간이 얼마나 걸리는지입니다. 이 시간을 tpd 로 표기하고, 전파 지연(propagation delay)이라고 합니다.
여기서 주의할 점은, 전파 지연이라는 용어는 항상 특정 조합 논리 구간에 대해 정의된다는 것입니다. 어떤 구간을 말하는지 명시하는 것이 중요합니다. 예를 들어, LUT 의 I1 입력에서 같은 LUT 의 O 출력까지 걸리는 시간도 전파 지연으로 정의할 수 있습니다. 이 값은 앞서 정의한 tpd 와는 다를 가능성이 높습니다.
특히 FPGA 에서는 FF1 의 출력과 LUT 의 입력 사이에 배선 지연(routing delay)이 있습니다. 따라서 실제로 FF1 의 Q 와 LUT 의 I1 은 같은 지점이 아니며, 신호가 이 두 지점 사이를 전파하는 데 시간이 걸립니다.
이런 모호함 때문에 FPGA 데이터시트에서는 tpd 기호가 잘 등장하지 않습니다. 그리고 데이터시트에 전파 지연이 주어져 있다면, 그 파라미터의 정확한 의미가 보통 명시되어 있습니다.
클록의 최대 주파수에 대해서는 나중에 다시 다루겠습니다.
경로
경로(path)를 한 문장으로 간결하게 정의하기는 어렵지만, 우리는 이미 그 예를 보았습니다. 위에서 tpd 는 FF1 의 Q 와 FF2 의 D 사이의 전파 지연으로 정의했습니다. 이 tpd 는 특정 시나리오에 관한 것입니다. FF1 의 값이 바뀌고, 그 갱신된 값이 LUT 에 도달하며, 그 결과 LUT 의 출력이 바뀌고, 마지막으로 갱신된 값이 FF2 에 도달하는 시나리오입니다. 이 일련의 과정은 단 하나의 신호(FF1 의 출력)가 바뀌는 것으로 시작해서, 다른 지점(FF2 의 입력)의 신호가 안정되면 끝납니다.
따라서 tpd 는 FF1 의 Q 에서 FF2 의 D 로 가는 경로의 전파 지연으로 정의됩니다. 줄여서 "FF1 에서 FF2 로 가는 경로"라고도 합니다.
경로는 이 과정의 시작부터 끝까지 지연을 일으키는 모든 요소로 구성됩니다. 경로에는 두 종류의 요소가 있습니다.
- 첫째, 조합 논리소자입니다. 전자 회로가 출력 신호를 갱신하는 데 시간이 걸리기 때문에 지연에 기여합니다. 이 지연을 흔히 논리 지연(logic delay)이라고 합니다. 위 예에서는 LUT 가 이에 해당합니다.
- 둘째, 배선(routing)입니다. 배선은 논리소자 사이를 연결하는 전선입니다. 이 구간도 지연에 기여합니다. 신호가 공간을 이동하는 데 시간이 걸리고, 전압이 변하려면 이동 경로에 있는 커패시터를 충전해야 하기 때문입니다.
경로의 목적은 전파 지연을 계산하는 것입니다. 이 계산 결과가 어떻게 사용되는지는 바로 다음에서 보여 줍니다.
경로는 흔히 하나의 이론적 실험으로 볼 수 있습니다. 한 플립플롭의 출력이 바뀌고, 그 신호가 다른 플립플롭의 입력에 도달하기까지의 특정 경로를 따라간다고 상상합니다. 이 상상 속 실험에서는 첫 번째 플립플롭의 출력이 바뀌는 순간 가상의 스톱워치를 시작하고, 두 번째 플립플롭의 입력이 바뀌는 순간 스톱워치를 멈춥니다.
이 실험은 스톱워치로 측정한 시간이 너무 길어서 tsu 요구사항을 위반했는지, 아니면 너무 짧아서 thold 요구사항을 위반했는지를 판단하는 데 도움을 줍니다.
경로의 이동 경로에는 배선과 조합 논리만 포함된다는 점에 유의하세요. 따라서 신호가 목적지에서 안정될 때까지 걸리는 시간은 경로상의 조합 논리소자와 배선에만 의존합니다. 이 실험을 언제 하든 결과는 항상 같습니다.
실제 FPGA 설계에서는 각 플립플롭의 입력에 도달하는 경로가 여럿이고, 각 플립플롭의 출력에서 시작하는 경로도 여럿입니다. 사실 두 플립플롭 사이에도 경로가 여러 개일 수 있습니다. 그런데도 타이밍 계산은 항상 단 하나의 플립플롭 출력만 바뀌었고, FPGA 로직에서 일어나는 모든 변화는 그 결과로 생긴다고 가정합니다. FPGA 설계에서 계산해야 할 경로 수는 엄청나게 많지만, 물론 소프트웨어가 자동으로 처리합니다.
간단한 정적 타이밍 분석
예시를 위해, 위의 두 플립플롭 예제에 대해 간단한 타이밍 분석을 해 보겠습니다. 타이밍 제약(timing constraints)에 대한 자세한 내용은 나중에 다루겠지만, 일단 클록(clk)의 주파수가 250MHz(4 ns)이고 로직에 직접 연결되어 있다고 가정하겠습니다. PLL 없이 직접 연결하는 것은 실제 설계에서 권장되지 않지만, 타이밍 분석을 단순하게 만들어 줍니다. 이때 타이밍 제약(SDC 스타일)은 대략 다음과 같습니다.
create_clock -period 4.000 -name clk [get_ports clk]
실제 타이밍 분석의 예는 이 시리즈의 다음 페이지에 있습니다. 그 분석은 정확하기 때문에 이해하기 어려운 세부 사항이 많습니다. 그래서 여기서는 원리를 보여 주는 간단한 분석만 하겠습니다.
이 분석은 위에서 말한 이론적 실험을 수행합니다. 클록(clk)의 상승 에지와 함께 가상의 스톱워치가 시작됩니다. 아래는 일어나는 일련의 과정과 각 과정이 기여하는(가상의) 지연입니다.
- FF1 의 클록-출력(0.2 ns): FF1 의 입력(D)에 있는 값으로 출력(Q)이 갱신되는 데 걸리는 시간입니다.
- I1 까지의 배선 지연(0.3 ns): 신호가 FF1 의 출력에서 LUT 의 입력(I1)까지 이동하는 데 걸리는 시간입니다.
- LUT 전파 지연(0.3 ns): LUT 는 입력(I1)이 바뀐 뒤 출력(O)을 갱신하는 데 이 시간이 필요합니다.
- FF2 입력까지의 배선 지연(0.4 ns): 신호가 LUT 의 출력에서 FF2 의 입력(D)까지 이동하는 데 걸리는 시간입니다.
이 경로의 전파 지연 tpd 는 위 지연들의 합, 즉 0.2 + 0.3 + 0.3 + 0.4 = 1.2 ns 입니다. 예를 들어 FF2 의 tsu 가 0.1 ns 라고 가정해 보겠습니다. 그러면 FF2 의 입력(D)은 다음 클록 상승 에지 0.1 ns 전에 안정되어야 합니다. 다시 말해 허용되는 최대 tpd 는 4 - 0.1 = 3.9 ns 입니다.
하지만 tpd 는 1.2 ns 에 불과하므로, 이 계산에 따르면 경로는 타이밍 제약을 큰 여유를 두고 만족합니다. 이 여유를 슬랙(slack)이라고 하며, 이 경우 슬랙은 3.9 - 1.2 = 2.7 ns 입니다. 이 값이 소프트웨어의 타이밍 계산 결과에 나타나면, 툴이 타이밍 제약을 맞추는 데 어려움을 겪었는지 알 수 있습니다. 슬랙이 0에 가까우면 소프트웨어가 경로가 타이밍 요구사항을 충족하도록 애써야 했다는 뜻인 경우가 많습니다.
전파 지연을 알면 이 경로가 타이밍을 맞출 수 있는 클록(clk)의 최대 주파수도 계산할 수 있습니다. tpd 는 1.2 ns 이고, tsu 요구사항은 다음 상승 에지가 0.1 ns 늦게 도착할 수 있다는 뜻입니다. 다시 말해 두 상승 에지 사이에는 최소 1.3 ns 의 간격이 있어야 합니다. 이는 약 769 MHz 에 해당합니다. 매우 높은 주파수이지만, 경로에 LUT 하나만 들어 있으므로 현실적인 결과입니다. 실제 로직은 보통 이 예보다 훨씬 복잡하고, 그래서 실제 동작 주파수도 훨씬 낮은 경우가 많습니다.
실제 정적 타이밍 분석(static timing analysis)도 정확히 이렇게 계산하지만, 이것은 이야기의 일부일 뿐입니다. 여기서 계산한 경로를 실제 계산에서는 데이터 경로(data path)라고 합니다. 그런데 실제 정적 타이밍 분석에서는 클록 에지가 두 플립플롭에 정확히 같은 시각에 도달하지 않는다는 사실도 고려합니다. 클록 버퍼에서 각 플립플롭까지의 지연이 조금씩 다르기 때문입니다. 이 지연 차이를 클록 스큐(clock skew)라고 합니다. 또한 클록 지터(jitter) 때문에 클록 에지 사이의 시간도 정확히 같지 않습니다. 이러한 클록 문제들 때문에 정확한 계산은 더 복잡해지며, 이에 대해서는 다음 페이지에서 설명합니다.
리커버리와 리무벌
플립플롭에 비동기 리셋(asynchronous reset) 입력이 있다면(정말 그렇게 하고 싶나요?), 이 입력이 비활성화되는 시점에 대한 요구사항이 있습니다. 리셋이 활성화되는 시점은 언제든 상관없습니다. 어차피 플립플롭이 알려진 상태로 바뀌기 때문입니다.
하지만 리셋이 비활성화되면 플립플롭은 다시 클록에 민감해지기 시작합니다. 이 리셋 해제가 클록 에지 가까이에서 일어나면, 플립플롭이 그 시점에 반응해야 하는지가 불분명합니다. 셋업 시간 및 홀드 시간과 마찬가지로, 리셋도 클록 에지 주변의 일정 시간 동안 안정적이어야 합니다. 구체적으로는 다음과 같습니다.
- 리셋은 클록 에지 이전의 일정 시간 동안 활성 상태에서 비활성 상태로 바뀌면 안 됩니다. 이 시간을 리커버리 시간(recovery time)이라고 합니다. 리셋 상태에서 회복되어 다음 클록 에지를 받을 준비를 하는 데 걸리는 시간입니다.
- 리셋은 클록 에지 이후의 일정 시간 동안에도 활성 상태에서 비활성 상태로 바뀌면 안 됩니다. 이 시간을 리무벌 시간(removal time)이라고 합니다.
이 정의들은 셋업 시간과 홀드 시간의 정의와 비슷합니다. 우연이 아닙니다. 리커버리 시간은 셋업 시간의 특별한 형태입니다. 타이밍 분석도 같은 방식으로 이루어집니다. 차이점은, 셋업 시간은 데이터 신호의 값과 무관하게 항상 적용되는 데 비해, 리커버리 시간은 비동기 리셋 신호가 활성 상태로 바뀔 때는 적용되지 않는다는 것입니다. 리무벌 시간과 홀드 시간의 관계도 마찬가지입니다.
이처럼 셋업/홀드와 유사하기 때문에, 리커버리와 리무벌은 여기서 언급하는 정도로 마무리하겠습니다. 또한 위 내용은 비동기 리셋뿐 아니라 모든 비동기 입력에 동일하게 적용된다는 점도 참고하세요.
RTL 패러다임과 타이밍
위에서 본 두 플립플롭 예제는 단순하지만, RTL 패러다임으로 만들어진 모든 로직을 대표합니다. RTL 패러다임에서는 모든 경로가 어떤 플립플롭에서 시작해서 같은 클록(또는 서로 관련된 클록(related clock))을 사용하는 다른 플립플롭에서 끝납니다. 경로 자체는 조합 논리와 배선으로 구성됩니다. 이 예에서 조합 논리는 LUT 하나일 뿐이지만, 경로에 논리소자가 여러 개 있는 경우와 본질적으로 다르지 않습니다. 구조는 동일합니다.
RTL 패러다임이 중요한 이유는, 이 방법을 사용하면 거의 모든 데이터 경로가 이렇게 동일한 단순한 구조를 갖기 때문입니다. 그리고 논리 설계에 포함된 경로 수는 보통 엄청나게 많으므로, 타이밍 분석의 단순함은 실수를 막는 데 도움이 됩니다. 무엇보다 타이밍 분석이 일정한 패턴을 가지기 때문에, 타이밍 리포트를 읽고 "이 결과가 말이 되나?"라고 의문을 제기할 수 있습니다.
따라서 가능한 한 모든 것은 순차 논리소자에서 시작해 순차 논리소자에서 끝나야 합니다. 이는 Verilog 코드를 작성할 때나 전반적인 로직 구조를 계획할 때 유용한 지침입니다.
이것으로 타이밍 제약의 배경이 되는 이론에 대한 짧은 소개를 마칩니다. 클록 주기 제약과 관련 타이밍 리포트에 대한 설명은 다음 페이지에서 이어집니다.


