이 페이지는 타이밍(timing)에 관한 연재 글 모음의 일부입니다. 지금까지의 페이지에서는 타이밍 계산의 이론을 설명하고, 몇 가지 타이밍 제약 조건(timing constraints)을 작성하는 방법을 보여 주었으며, 타이밍 클로저(Timing Closure)의 원리도 논의했습니다. 이전 페이지에서는 I/O 타이밍 제약 조건에 관한 몇 가지 기본 원리를 설명했습니다. 이 페이지에서는 이 주제의 실용적인 측면을 계속 다룹니다.
서론
I/O 타이밍 제약 조건의 목적은 외부 세계와의 신뢰할 수 있는 인터페이스를 보장하는 것입니다. 외부 세계에서 들어오는 각 신호가 FPGA의 관련 플립플롭에 안정적으로 도달함을 보장합니다. 마찬가지로 FPGA에서 외부 세계로 나가는 각 신호가 외부 부품의 플립플롭에 안정적으로 도달함도 보장합니다.
I/O 타이밍 제약 조건은 가장 어려운 종류의 타이밍 제약 조건입니다. 일부 타이밍 파라미터는 보드 위의 외부 전자 부품에 의존합니다. 올바른 타이밍 요구사항을 결정하려면 대개 이러한 외부 부품들의 데이터시트를 읽어야 합니다. 올바른 타이밍 제약 조건을 얻으려면 종종 직접 계산(pen-and-paper calculation)이 필요합니다.
이 복잡한 작업을 건너뛰고 더 단순한 대안을 선호하고 싶은 유혹이 있습니다. 바로 시행착오입니다. 이 지름길은 툴이 하고 싶은 대로 하게 두고, 그것이 동작하는지 보는 것입니다. 입력 포트에 문제가 있으면 입력 신호를 받는 플립플롭에서 반대 클록 엣지를 사용합니다. 마찬가지로 출력이 제대로 동작하지 않으면 출력 플립플롭에서 반대 클록 엣지를 사용합니다. 이 방법은 대개 전자 회로를 빠르고 단순하게 동작하게 만듭니다.
이 접근법의 문제는 타이밍 동작이 온도에 따라 변한다는 것입니다. 또한 반도체 부품의 제조 공정 때문에 발생하는 불확실성도 있습니다. 이것은 FPGA뿐만 아니라 외부 전자 회로에도 해당하는 말입니다. 따라서 부적절한 타이밍 제약 조건은 "블랙 매직 모드(Black Magic Mode)"로 이어질 수 있습니다. 이것은 모든 타이밍 제약 조건에 해당하는 말이지만, I/O 타이밍 제약 조건에서 더 자주 일어납니다.
직접 계산을 건너뛰었을 때의 가장 나쁜 점은, 보드 설계 때문에 타이밍 요구사항을 보장하는 것이 불가능한 경우가 있다는 것입니다. 이런 상황이 보드 설계 과정에서 발견되면 대개 간단한 해결책이 있습니다(FPGA로 가는 배선을 바꾸거나 클록 분배를 다시 설계). 그러나 이런 결함이 PCB가 생산된 뒤에 발견되면 고칠 방법이 없을 수도 있습니다. 다시 말해 전자 회로가 안정적으로 동작함을 보장하는 것이 불가능해집니다.
이 페이지의 내용
이 페이지에서는 I/O 포트를 위한 기본적인 타이밍 제약 조건을 간략히 다룹니다. 여기서 보여 주는 문법은 Vivado와 Quartus뿐만 아니라 다른 FPGA 툴들도 사용하는 SDC입니다.
이 페이지는 I/O 전용 타이밍 제약 조건, 즉 set_input_delay와 set_output_delay부터 시작합니다. 이 제약 조건들의 의미를 설명합니다. 이어서 Vivado와 Quartus의 타이밍 리포트 예를 보여 주는 별도 페이지 두 개를 안내합니다.
set_max_delay와 set_min_delay로 타이밍 제약 조건을 정의하는 것도 가능합니다. 이 명령들은 일부 시나리오에서 더 적합합니다. 우리는 FPGA 내부의 경로(path)와 관련하여 이미 이 명령들을 만나 보았습니다. I/O 타이밍 제약 조건으로서의 그것들의 의미도 아래에서 설명합니다.
이 페이지는 이러한 I/O 타이밍 제약 조건에 관한 기술적인 측면만 다룹니다. 이론적인 부분은 이전 페이지를 참조하세요. 그 페이지에는 I/O 포트에 대한 false path(false path)를 정의하는 방법도 나와 있습니다.
set_input_delay와 set_output_delay의 의미
이 두 명령은 외부 부품과의 인터페이스가 시스템 동기(system synchronous) 방식일 때 적합합니다. 간단히 말하면,
- set_input_delay -clock … -max … : 입력 포트에 연결된 외부 부품의 최대 clock-to-output 지연 + 보드의 배선 지연.
- set_input_delay -clock … -min … : 입력 포트에 연결된 외부 부품의 최소 clock-to-output 지연. 데이터시트에 이 정보가 없다면 0을 선택하세요(혹시라도 미래 개정판 부품이 정말 빠른 공정으로 제조될 경우를 대비).
- set_output_delay -clock … -max … : 출력 신호를 받는 외부 부품의 tsu + 보드의 배선 지연.
- set_output_delay -clock … -min … : 출력 신호를 받는 외부 부품의 -thold. 음수 부호에 유의하세요. 예를 들어 홀드 시간이 1ns이면 이 제약 조건을 -1로 설정합니다.
이 정의들은 다음 두 조건이 충족될 때만 올바르다는 점을 유의하는 것이 중요합니다.
- 인터페이스가 시스템 동기(system synchronous) 방식이다.
- 클록을 정의하는 create_clock 명령이 (FPGA 내부의 다른 신호를 예를 들어 get_pins로 참조하는 대신) get_ports 명령으로 클록 신호를 참조한다.
이 두 조건은 클록 지연이 올바르게 계산되도록 보장하는 데 필요합니다.
또한 -min이나 -max 중 어느 것도 사용하지 않으면, 명령은 두 개의 명령이 있는 것처럼 해석된다는 점에 유의하세요. 하나는 -min 속성이 있는 명령이고, 다른 하나는 -max 속성이 있는 명령입니다. 이것은 아마 원하는 바가 아닐 것입니다.
이 명령들의 정의는 조금 혼란스럽습니다. set_input_delay는 데이터 신호가 클록 엣지 이후에 값을 바꾸는 것이 언제 허용되는지를 정의합니다. 그러나 set_output_delay는 데이터 신호가 값을 바꾼 이후에 클록 엣지가 언제 허용되는지를 정의합니다. 아마 이러한 정의의 근거는 데이터시트의 숫자를 타이밍 제약 조건에 직접 사용할 수 있게 하기 위한 것일 것입니다.
set_input_delay와 set_output_delay 명령에는 여기서 다루지 않는 몇 가지 옵션이 있습니다. 특히 하강 클록 엣지를 시간 기준으로 선택할 수 있습니다. 자세한 내용은 툴 문서를 참조하세요.
항상 min과 max를 모두 사용하라
모든 타이밍 제약 조건에 -min과 -max를 모두 사용하라고 고집하는 것이 무의미해 보일 수 있습니다. 예를 들어 외부 부품의 tsetup이 8ns라면, 다음 명령에 무엇이 문제일까요?
set_output_delay -clock theclk 8 [get_ports test_out]
이것은 셋업 시간을 올바르게 정의합니다. 홀드 시간에 관해서는, 의도치 않게 -8ns로 정의됩니다. 이것은 출력 포트가 클록보다 8ns 전에 값을 바꾸는 것을 허용합니다. 하지만 그게 무슨 상관일까요? 그런 일은 일어날 수 없지 않을까요?
글쎄요, 실제로 일어날 수 있습니다. 저는 이미 논의한 바와 같이, 입력 핀에서 들어오는 클록(즉 보드에서 보이는 클록)을 기반으로 내부 클록을 생성하기 위해 PLL을 사용하는 방법을 설명한 적이 있습니다. 이것은 PLL이 FPGA 내부 클록을 입력 클록에 정렬할 수 있게 해 줍니다. PLL은 클록 분배 네트워크의 지연을 보상하기 위해 클록을 약간 이동(시프트)시킴으로써 이를 수행합니다.
실제로 FPGA 툴은 타이밍 제약 조건을 달성하기 위해 클록을 보드의 클록보다 약간 일찍 이동시켜도 된다고 생각할 수 있습니다. FPGA 내부의 클록이 외부 클록보다 앞으로 이동하면, 외부 부품이 인식하는 clock-to-output 지연이 더 작아집니다. FPGA 내부의 플립플롭은 내부 클록에 동기되지만, 보이는 타이밍은 외부 클록을 기준으로 하기 때문입니다.
그런데 FPGA 내부 클록이 보드의 클록보다 이르면, FPGA의 출력이 외부 클록의 엣지 이전에 바뀔 수 있습니다. 이것은 이 출력을 받는 부품에서 홀드 시간 위반으로 이어질 수 있습니다.
set_output_delay 명령이 홀드 시간을 -8ns로 정의한다고 해서 출력이 클록보다 8ns 전에 값을 바꾸리라는 뜻은 아닙니다. 그러나 이것은 툴이 thold 요구사항을 위반하는 방식으로 내부 클록을 이동시키는 것을 허용합니다. -min과 함께 set_output_delay를 올바르게 사용하면 이것이 일어나지 않습니다.
배선 지연으로 인한 보정
툴은 PCB의 배선 지연을 고려하지 않는다는 점을 기억하는 것이 중요합니다. 툴은 이 정보를 가지고 있지 않습니다. 따라서 set_input_delay와 set_output_delay에 대한 타이밍 계산을 할 때 이 지연이 0이라고 가정합니다. 보정 방법은 데이터시트의 clock-to-output 지연과 tsu 값에 배선 지연을 더하는 것입니다.
클록 스큐(clock skew)를 고려하는 것도 필요할 수 있습니다. 완벽한 PCB에서는 클록이 모든 부품에 같은 지연으로 도착합니다. 실제로는 FPGA와 외부 부품 사이에 클록 스큐가 존재할 수 있습니다. 이러한 클록 스큐는 툴의 타이밍 계산에 고려되지 않습니다.
따라서 클록이 (외부 부품에 비해) FPGA에 더 일찍 도착한다면, 다음 보정이 필요합니다.
- set_input_delay -clock … -max … : 클록 스큐를 명령의 지연 값에 더합니다(외부 부품의 clock-to-output 지연이 더 큰 것과 비슷).
- set_output_delay -clock … -min … : 명령의 지연 값에서 클록 스큐를 뺍니다. 즉 더 음수로 만듭니다(외부 부품의 thold가 더 큰 것과 비슷).
마찬가지로 클록이 FPGA에 더 늦게 도착한다면, 다음 보정이 필요합니다.
- set_input_delay -clock … -min … : 명령의 지연 값에서 클록 스큐를 뺍니다(외부 부품의 clock-to-output 지연이 더 작은 것과 비슷). 외부 부품의 데이터시트에 최소 clock-to-output 값이 없다면, 이 명령의 값으로 클록 스큐의 음수 값을 사용하세요.
- set_output_delay -clock … -max … : 클록 스큐를 명령의 지연 값에 더합니다(PCB 배선 지연이 더 큰 것과 비슷).
여기서 설명한 보정과 무관하게, 타이밍 리포트에는 0이 아닌 클록 스큐가 표시될 수 있다는 점에 유의하세요. 그러나 타이밍 리포트에 나타나는 클록 스큐는 PCB가 아니라 FPGA 내부의 클록 지연과 관련된 것입니다.
타이밍 리포트 예제
예제는 다음 Verilog 코드를 기반으로 합니다.
module top(
input test_clk,
input test_in,
output reg test_out
);
reg test_samp;
always @(posedge test_clk)
begin
test_samp <= test_in;
test_out <= test_samp;
end
endmodule
@test_clk은 입력 클록이고, @test_in은 입력 핀이며, @test_out은 출력 핀입니다. 내부 클록을 보드의 클록에 정렬하기 위해 PLL을 사용하지 않으므로 클록 지연이 상당하다는 점에 유의하세요.
타이밍 제약 조건은 다음과 같습니다.
create_clock -name theclk -period 20 [get_ports test_clk] set_output_delay -clock theclk -max 8 [get_ports test_out] set_output_delay -clock theclk -min -3 [get_ports test_out] set_input_delay -clock theclk -max 4 [get_ports test_in] set_input_delay -clock theclk -min 2 [get_ports test_in]
타이밍 리포트가 상당히 길기 때문에 별도의 페이지에 실었습니다.
set_max_delay와 set_min_delay 사용하기
외부 부품과의 인터페이스가 소스 동기(source synchronous) 방식일 때는 set_input_delay와 set_output_delay를 사용하는 것이 덜 자연스럽습니다. 이런 상황에서는 set_max_delay와 set_min_delay가 더 적합합니다. 이전 페이지에서 이 두 명령은 클록 주기 제약 조건에 대한 보조 수단이나 보정(타이밍 예외(timing exception))으로만 언급했습니다. 모든 경로가 내부에 있었습니다. 즉 순차 요소에서 시작하여 순차 요소에서 끝났습니다. 이 명령들을 I/O 타이밍 제약 조건으로 사용하면, 경로의 시작이나 끝 중 하나가 I/O 포트입니다. 이런 상황에서 타이밍 분석은 어떻게 이루어질까요?
사실, 이 명령들의 타이밍 분석을 깊이 파고드는 것은 대개 무의미합니다. 이 명령들의 목적은 대개 툴이 간신히 충족할 수 있는 타이밍 제약 조건을 작성하여 툴의 동작을 제한하는 것입니다. 따라서 이 타이밍 제약 조건의 숫자는 제약 조건을 점점 더 엄격하게 만들려는 반복적인 시도를 통해 찾아집니다. 이런 방법론에서는 타이밍 분석 자체가 중요하지 않습니다.
그렇긴 해도, set_max_delay와 set_min_delay 뒤에 있는 계산을 이해하는 것은 여전히 좋은 생각입니다.
앞서 기억하시겠지만, 타이밍 분석에는 두 부분이 있습니다. 첫 번째 부분은 소스 경로(source path)입니다. 클록 엣지(외부 클록 핀에서)부터 두 번째 플립플롭의 데이터 입력에 갱신되고 유효한 값이 나타날 때까지의 시간을 계산합니다. 이 부분은 세 요소의 합입니다.
- 클록 엣지가 첫 번째 플립플롭에 도달하는 데 걸리는 시간(클록 경로)
- 이 플립플롭이 값을 갱신하는 데 걸리는 시간
- 이 새 값이 두 번째 플립플롭에 도달하는 데 걸리는 시간
두 번째 부분은 목적지 경로(destination path)이며, 클록 엣지가 두 번째 플립플롭에 도달하는 데 걸리는 시간만으로 이루어집니다. 우리는 이 플립플롭의 입력이 언제 갱신되는지(소스 경로에서) 이미 알고 있으므로, 시간 차이를 요구되는 tsu 또는 thold와 비교할 수 있습니다.
그런데 그것은 순차 요소 두 개일 때의 이야기입니다. 한쪽이 I/O 포트이면 어떻게 될까요? 타이밍 분석을 위해 포트는 마치 가상의 플립플롭인 것처럼 취급됩니다. 이 플립플롭까지의 클록 경로 지연은 0입니다.
대부분의 예에서 보았듯이, 클록이 get_ports에 의존하는 create_clock 명령으로 정의되는 일반적인 상황을 생각해 보겠습니다. 클록 경로 지연이 0이라는 것은 이 가상의 플립플롭 클록 입력이 클록 핀에 직접 연결되어 있다는 뜻입니다. 따라서 클록 핀과 이 가상의 플립플롭 사이에는 지연이 없습니다.
이 플립플롭의 모든 타이밍 파라미터는 0입니다. tsu, thold, clock-to-output 모두 0입니다. 이것은 현실적인 전자 부품을 반영하지는 않지만, set_max_delay와 set_min_delay를 출력 포트와 함께 사용할 때 의미를 부여해 줍니다. 바로 포트의 clock-to-output 지연입니다. 예를 들어:
set_max_delay -to [get_ports test_out] 7 set_min_delay -to [get_ports test_out] 0
이 두 타이밍 제약 조건은 @test_out의 clock-to-output 지연이 0ns와 7ns 사이여야 한다고 요구합니다.
그 이유를 설명하겠습니다. 기억하시겠지만 일반적으로 set_max_delay 명령은 특정 플립플롭 사이의 경로에 대한 주기 제약 조건과 비슷합니다. 그렇다면 목적지 클록 경로(Destination Clock Path)는 어떻게 될까요? 계산은 두 번째 클록 엣지의 시각, 즉 7ns에서 시작합니다. 그런데 두 번째 플립플롭까지의 클록 경로 지연은 0이고, 이 플립플롭의 tsu도 0입니다. 따라서 목적지 클록 경로 계산의 결과는 그냥 7ns입니다. 이것이 소스 경로(Source Path)에 허용된 최대치이며, 소스 경로는 평소처럼 계산됩니다. 즉 소스 클록 경로에 데이터 경로를 더한 것입니다. 요약하면, 요구사항은 데이터 출력이 첫 번째 클록 엣지 후 7ns 시점에 유효하다는 것입니다. 이것은 정확히 출력 포트의 clock-to-output 지연 정의입니다. 관련 클록에 대한 create_clock 명령이 get_ports를 기반으로 했다면, 이 clock-to-output 지연은 PCB의 클록을 기준으로 한 것입니다.
Vivado를 사용한 타이밍 리포트 예제를 참조하세요.
set_output_delay는 외부 부품의 tsu나 thold와 관련이 있다는 점에 유의하세요. set_max_delay는 FPGA 출력 포트의 clock-to-output 지연을 정의합니다. 따라서 이 두 옵션의 주요 차이는 초점이 어디에 있느냐입니다.
입력 포트에 관해서는, set_max_delay와 set_min_delay가 무엇을 의미하는지에 대한 직관적인 설명이 없습니다. 소스 경로(Source Path)는 입력 핀과 입력 신호를 받는 플립플롭의 데이터 입력 사이의 지연으로 이루어집니다. 목적지 클록 경로는 타이밍 제약 조건 명령에 지정된 시각에서 시작합니다. 이 시각에 클록 경로 지연이 더해집니다. 이것들은 의미 없는 계산입니다(타이밍 리포트 참조). 외부 부품의 clock-to-output 지연과 관련된 set_input_delay를 사용하는 편이 더 자연스럽습니다.
set_max_delay와 set_min_delay를 위해 수행되는 타이밍 분석은 클록 주기에 의존하지 않는다는 점에 유의하세요. 따라서 클록 주파수가 바뀌어도 툴이 이 제약 조건을 적용할 때 같은 숫자가 사용됩니다. 반면 set_input_delay와 set_output_delay에 대한 계산은 클록 주파수에 의존합니다.
I/O 타이밍 제약 조건이 클록 주파수에 의존하는 것은 상황에 따라 장점일 수도 있고 단점일 수도 있습니다. 타이밍 제약 조건이 외부 부품의 타이밍 파라미터를 기준으로 작성되었다면(그리고 인터페이스가 시스템 동기(system synchronous) 방식이라면), set_input_delay와 set_output_delay에 의존하는 편이 아마 더 나을 것입니다. 클록 주파수가 바뀌어도 이 제약 조건들은 올바르게 유지되기 때문입니다. 그러나 타이밍 제약 조건의 의도가 툴로 하여금 특정 선택을 하도록 강제하는 것(예: IOB 레지스터를 사용하게 하는 것)이라면, set_max_delay와 set_min_delay가 더 적합할 가능성이 높습니다.
-datapath_only 사용하기
타이밍 제약 조건의 가능한 동기 중 하나는 I/O 포트로 들어오거나 나가는 지연을 가능한 최소로 만들기 위해 FPGA 툴이 필요한 모든 조치를 취하도록 보장하는 것입니다. 이것은 대개 IOB 레지스터를 사용한다는 뜻입니다. 또한 입력 포트와 플립플롭 사이에 여분의 지연을 삽입하지 않는다는 뜻일 수도 있습니다(툴은 thold 요구사항을 더 나은 여유로 충족시키기 위해 그렇게 할 수도 있습니다).
타이밍 제약 조건이 이런 목적으로 사용될 때는 목표가 되는 특정 지연 값이 없습니다. 핵심은 툴이 최상의 결과를 얻는 것 외에 다른 어떤 일도 하지 못하게 막는 것입니다. FPGA 툴이 -datapath_only를 지원한다면 set_max_delay와 함께 이 옵션을 사용하는 것이 더 좋습니다. 그러면 계산에서 클록 지연 경로가 완전히 제거되므로 I/O 포트와 플립플롭 사이의 지연만 고려됩니다. 이렇게 하면 타이밍 제약 조건의 요구사항이 그 목적, 즉 플립플롭과 I/O 핀 사이의 지연을 제어하는 것과 정확히 일치합니다.
Vivado의 간단한 예는 다음과 같습니다.
set_max_delay -datapath_only -from [get_ports test_in] 2 set_max_delay -datapath_only -from [all_registers] \ -to [get_ports test_out] 3
그런데 "-from [all_registers]"라고 쓴 부분의 목적은 무엇일까요? 왜 "-from"이 필요할까요? 짧게 답하면, Vivado가 "-from" 부분 없이는 이 명령을 받아들이지 않았기 때문입니다. 입력 포트에 대한 명령에는 그런 요구사항이 없었습니다.
datapath_only를 사용한 타이밍 리포트는 예제가 있는 페이지의 아래쪽에 있습니다.
요약
set_input_delay와 set_output_delay는 I/O 타이밍 제약 조건을 위한 선호 명령으로 여겨지는 경우가 많습니다. 실제로 인터페이스가 시스템 동기(system synchronous) 방식일 때는 대개 이것이 올바른 선택입니다. 다른 시나리오에서는 set_max_delay와 set_min_delay를 대신 사용하는 것을 고려해 볼 가치가 있습니다. I/O 포트 타이밍에 대한 요구 제한을 더 잘 반영할 수 있기 때문입니다.
이 페이지로 타이밍에 관한 연재 글 모음이 끝납니다. 그런데 마지막 페이지가 하나 더 있습니다. 거기서는 기존 설계를 점검할 때 편리한 방식으로 많은 주제를 요약합니다.