이 페이지는 타이밍(timing)에 관한 연재 글 모음의 일부입니다. 지금까지의 페이지에서는 타이밍 계산의 이론을 설명하고, 몇 가지 타이밍 제약 조건(timing constraints)을 작성하는 방법을 보여 주었으며, 타이밍 클로저(Timing Closure)의 원리도 논의했습니다. 이 페이지에서는 I/O 타이밍 제약 조건에 대한 논의를 시작합니다.
서론
지금까지 타이밍 제약 조건에 대한 논의는 전부 FPGA 내부에 있는 경로(path)에 관한 것이었습니다. 드디어 FPGA의 I/O 포트 타이밍을 제어하는 제약 조건에 대해 이야기할 때가 되었습니다.
그러나 타이밍 제약 조건을 이야기하기 전에, FPGA와 외부 부품 사이를 동기화하는 여러 가지 방법을 인식하고 있어야 합니다. 이 주제를 고려하지 않고 작성한 타이밍 제약 조건은 무가치할 수 있습니다. 게다가 I/O 인터페이스를 담당하는 로직도 부적절하게 작성될 수 있습니다. 극단적인 경우에는 동작이 보장되는 I/O를 가능하게 하는 데 필요한 배선이 PCB에 없을 수도 있습니다.
외부 부품과의 동기화에 대한 필요한 인식을 갖추면, 타이밍 제약 조건을 위한 올바른 명령을 선택할 수 있습니다. 그것의 실용적인 측면은 다음 페이지에서 설명합니다.
이 페이지에서는 IOB 레지스터에 대해 잘 알고 있다고 가정합니다.
클록 분배
경로가 FPGA 내부에만 있는 한, 경로 양쪽 사이의 클록 스큐(clock skew)를 의식할 필요가 없었습니다. 클록 분배는 툴이 책임지고, 타이밍 계산이 클록 스큐를 고려해 주었기 때문입니다.
I/O 타이밍 제약 조건에서는 다릅니다. 경로의 한쪽은 FPGA 외부에 있는 외부 부품입니다. 이 부품은 데이터 신호와 동기화하기 위해 자기 핀 중 하나로 받는 클록에 의존합니다. 그런데 이 클록은 무엇과 동기화되는 것일까요?
전략은 대개 다음 두 가지 중 하나입니다.
- 시스템 동기 클록(system synchronous clock): 외부 부품이 FPGA의 클록 입력 핀과 같은 클록 신호에 연결됩니다. 이 전략은 공통 클록(common clock)이라고도 불립니다.
- 소스 동기 클록(source synchronous clock): 데이터 신호와 함께 전용 클록 신호가 공급됩니다. 보통 데이터 신호는 클록과 동시에 값이 바뀝니다. 상승 엣지와 함께 바뀌거나 하강 엣지와 함께 바뀝니다.
이 두 전략은 다음에서 더 자세히 논의합니다. 소스 동기 클록 옵션에 관해서는, 데이터 신호가 입력이냐 출력이냐에 따라 상당한 차이가 있습니다. 따라서 이 시나리오들은 따로따로 논의합니다.
시스템 동기 클록
PCB의 여러 부품을 동기화하는 가장 단순한 방법은 모든 부품을 하나의 클록에 연결하는 것입니다. 이것을 시스템 동기 클록(시스템 동기 클록, system synchronous clock)이라고 합니다(또는 공통 클록(common clock)).
이 방법의 장점은 모든 부품의 타이밍 파라미터가 하나의 클록 신호를 기준으로 한다는 것입니다. 따라서 타이밍 계산을 할 때 양쪽 모두 같은 클록입니다. PCB에서 두 부품 사이를 전파하는 데이터 신호의 경우, 계산은 FPGA 내부의 경로와 비슷합니다. 경로는 첫 번째 클록 엣지를 기준으로 하는 clock-to-output 지연으로 시작합니다. 경로의 끝에서는 tsu가 두 번째 클록 엣지를 기준으로 합니다. 시스템 동기 방식은 이 두 클록 엣지가 같은 클록에 속한다는 뜻입니다.
그래서 시스템 동기 클록으로 작업하는 것은 단순하지만, 이 방법은 비교적 낮은 주파수에만 적합합니다. 타이밍 계산 입문에서 최소 클록 주기는 여러 타이밍 파라미터의 합이라는 점을 기억하세요. 첫 번째 플립플롭의 clock-to-output 지연, 전파 지연(propagation delay), 두 번째 플립플롭의 tsu가 그것입니다. 출력 포트의 경우 clock-to-output 지연이 비교적 큽니다. PCB의 배선이 필요한 전압에 도달하는 데 걸리는 시간이기 때문입니다. 그러나 그것으로 끝나지 않습니다. 클록 스큐와 클록에 관련된 기타 불확실성도 더해야 합니다. 모든 숫자를 합치면 최소 클록 주기는 그다지 인상적이지 않을 수 있습니다.
경험 법칙으로, 시스템 동기 클록은 데이터 전송률이 100MHz보다 높은 I/O에는 적합하지 않습니다. 그러나 이것은 어떤 부품들이 관련되어 있는지에 따라 크게 달라집니다. 사실 일부 전자 부품은 훨씬 낮은 주파수에서도 시스템 동기 클록으로 만족시키기 매우 어려운 타이밍 요구사항을 가집니다. 그러한 부품들은 PCB를 제조하기 전에 I/O 타이밍을 계획하는 것이 왜 중요한지 보여 주는 이유 중 하나입니다.
set_input_delay와 set_output_delay(다음 페이지에서 설명)는 시스템 동기 클록과 함께 사용하기에 가장 적합한 타이밍 제약 조건입니다.
소스 동기 클록
PCB에서 두 부품 사이의 인터페이스는 이 두 부품 중 하나가 공급하는 클록을 기반으로 하는 경우가 꽤 많습니다. 당연히 클록을 FPGA가 생성하느냐, 외부 부품이 생성하느냐에 따라 차이가 있습니다.
따라서 관련된 시나리오는 네 가지입니다.
- 데이터와 클록이 모두 FPGA가 생성하는 출력인 경우. 이 비교적 쉬운 시나리오는 소스 동기 출력(source-synchronous outputs) 페이지에서 별도로 다룹니다.

- 데이터와 클록이 모두 외부 부품에 의해 생성되는 경우. 따라서 FPGA는 이것들을 입력 신호로 받습니다. 소스 동기 입력(source-synchronous inputs) 페이지가 이 시나리오를 다룹니다.

- 클록은 FPGA가 생성하지만 데이터는 양방향(또는 입력)인 경우. 이것은 소스 동기 입력의 특수한 경우입니다. FPGA가 클록을 생성한다는 사실은 큰 차이를 만들지 않습니다. 데이터 입력은 PCB에서 클록과 동기화됩니다. 이 클록은 FPGA 내부의 클록에 비해 지연을 가집니다. 이 시나리오에 대해서는 소스 동기 출력 페이지를 참조하세요.

- 클록은 외부 부품이 생성하고 데이터는 양방향인 경우. FPGA로 들어가는 입력에 관해서는 데이터가 외부 부품에서 생성되는 시나리오(소스 동기 클록)와 비슷합니다. FPGA의 출력에 관해서는 외부 클록에 동기되는 여타 출력처럼 동작합니다. 따라서 이 출력들은 마치 시스템 동기 방식인 것처럼 다루어집니다.
비동기 입력
어떤 입력은 클록과 관련이 없습니다. 예를 들어 푸시버튼, I2C, RS232, 그리고 외부 부품의 각종 상태 신호들은 클록에 동기화되지 않습니다. 이러한 신호들은 대개 FPGA 내부의 클록보다 훨씬 느립니다. 따라서 일반적인 해결책은 이 신호들을 플립플롭(가급적이면 IOB 레지스터)으로 샘플링(sampling)한 다음, 평범한 로직 설계 기법으로 계속하는 것입니다.
이 입력들은 샘플링에 사용되는 클록과 동기화되지 않습니다. 따라서 IOB 레지스터(또는 포트에 연결된 플립플롭)는 메타스태빌리티(metastability) 보호용 레지스터의 역할을 합니다. 그러므로 각 포트마다 두 번째 레지스터를 사용해야 합니다. 이것은 무관한 클록(unrelated clocks) 사이의 클록 도메인 크로싱(clock domain crossing)과 비슷합니다. 그렇게 하지 않으면, 입력 신호가 느리고 지금 당장 설계가 제대로 동작하는 것처럼 보여도 예측할 수 없고 이상한 동작의 위험이 있습니다.
반복 가능한 동작을 보장하려면 타이밍 제약 조건을 작성해야 합니다. 플립플롭이 IOB 안에 배치되지 않더라도 IOB 레지스터와 같은 지침을 따라야 합니다. 추가 안전을 위해, 이 레지스터들이 메타스태빌리티 보호용 레지스터로서 갖는 역할과 관련된 전용 타이밍 제약 조건을 추가하는 것도 좋은 생각입니다(이것은 다른 페이지에서 설명합니다).
False path(가짜 경로)
I/O 포트에 대한 false path(false path)는 원칙적으로 FPGA 내부 경로의 false path와 같습니다. set_false_path 명령은 특정 포트에 타이밍 요구사항을 적용하지 말 것을 요청하는 데 사용됩니다.
false path는 FPGA 내부 경로와 관련하여 이미 논의했습니다. 같은 논리에 따라, I/O 포트에 대한 false path의 동기는 주로 제약 조건이 없는 경로(unconstrained path) 목록을 비워 두는 것입니다. 이 목록은 비어 있어야 실수로 포트에 타이밍 제약 조건이 빠졌을 때 알아차리기가 더 쉽습니다.
false path는 포트의 타이밍이 전적으로 의미 없을 때만 사용해야 합니다. 예를 들어 LED와 DIP 스위치가 그렇습니다.
SDC 제약 조건의 예:
set_false_path -to [get_ports led_0] set_false_path -from [get_ports dip_switch_0]
요약
이 페이지에서는 FPGA와 외부 부품 사이를 동기화하는 몇 가지 전략을 간략히 살펴보았습니다. 선택한 전략은 로직 설계뿐만 아니라 타이밍 제약 조건에도 영향을 줍니다.
이 지식을 바탕으로, 이제 I/O 타이밍 제약 조건을 작성하는 방법을 논의할 때입니다.
