이 페이지는 timing에 대한 일련의 페이지 에 속합니다. 이전 페이지에서는 timing 계산에 대한 이론을 설명하고 여러 timing constraints를 작성하는 방법을 보여주고 timing closure의 원리에 대해 논의했습니다. 이전 페이지에서는 I/O timing constraints에 관한 몇 가지 기본 원칙을 설명했습니다. 이 페이지에서는 이 항목의 실용적인 측면을 계속 설명합니다.
소개
I/O timing constraints 의 목적은 외부 세계와의 안정적인 인터페이스를 보장하는 것입니다. 외부 세계의 각 signal이 FPGA의 관련 flip-flop 에 안정적으로 도착하도록 보장합니다. 마찬가지로 FPGA 에서 외부 세계로의 각 signal이 외부 구성 요소의 flip-flop 에 안정적으로 도착하는지 확인합니다.
I/O timing constraints는 가장 어려운 종류의 timing constraints입니다. 일부 timing parameters는 board의 외부 전자 구성 요소에 따라 달라집니다. 일반적으로 이러한 외부 구성 요소의 datasheets을 읽어서 올바른 timing requirements를 결정해야 합니다. 종종 올바른 timing constraint를 얻으려면 펜과 종이 계산이 필요합니다.
이 복잡한 작업을 건너뛰고 간단한 대안을 선호하는 유혹이 있습니다. 시행 착오. 이 바로 가기는 도구가 원하는 작업을 수행하고 작동하는지 확인하는 것으로 구성됩니다. input port에 문제가 있으면 input signal을 받는 flip-flop 에서 반대쪽 clock edge를 사용하십시오. 마찬가지로 output이 잘 작동하지 않으면 output flip-flop에서 반대쪽 clock edge를 사용하십시오. 이 방법은 일반적으로 전자 장치를 빠르고 간단하게 작동시킵니다.
이 접근 방식의 문제점은 온도에 따라 timing 동작이 변경된다는 것입니다. 반도체 부품 제조 공정 때문에 불확실성도 있다. 이는 FPGA 와 외부 전자 장치에 해당됩니다. 따라서 부적절한 timing constraints는 " Black Magic 모드 "로 이어질 수 있습니다. 이것은 모든 timing constraints에 해당되지만 I/O timing constraints에서 더 많이 발생합니다.
펜과 종이 계산을 건너뛰는 것의 최악의 점은 board design때문에 timing requirements를 보장하는 것이 때때로 불가능하다는 것입니다. board design공정 중에 이와 같은 상황이 발견되면 종종 간단한 해결책이 있습니다( FPGA 의 배선을 변경하거나 clocks의 배포를 재고하는 것). 하지만 PCB가 생산된 후에 이와 같은 결함이 발견되면 이를 수정할 방법이 없을 수 있습니다. 즉, 전자 장치가 안정적으로 작동한다는 것을 보장하는 것이 불가능해집니다.
이 페이지의 내용
이 페이지에서는 I/O ports를 위한 기본 timing constraints를 설명합니다. 여기에 표시된 구문은 Vivado 와 Quartus, 그리고 다른 FPGA tools에서 사용되는 SDC입니다.
이 페이지는 I/O전용 timing constraints 로 시작합니다. set_input_delay 및 set_output_delay. 이러한 constraints 의 의미가 설명됩니다. 그 다음에는 Vivado 및 Quartus에 의한 timing reports 의 예를 보여주는 두 개의 별도 페이지에 대한 참조가 이어집니다.
timing constraints를 set_max_delay 및 set_min_delay로 정의하는 것도 가능합니다. 이러한 commands는 일부 시나리오에서 더 적합합니다. 우리는 이미 FPGA내부의 paths 에 관해 만났습니다 . I/O timing constraints 로서의 의미도 아래에서 설명합니다.
이 페이지에서는 이러한 I/O timing constraints에 대한 기술적인 측면만 설명합니다. 이론적인 부분은 I/O ports에 대해 false paths를 정의하는 방법도 나와 있는 이전 페이지를 참조하십시오.
set_input_delay 및 set_output_delay의 의미
이 두 개의 commands는 외부 구성 요소와의 인터페이스가 system synchronous 일 때 적합합니다. 간단히 말해서,
- set_input_delay -clock … -max … : input port + board의 trace delay에 연결되는 외부 부품의 최대 clock-to-output .
- set_input_delay -clock … -min … : input port에 연결되는 외부 구성 요소의 최소형 clock-to-output . datasheet이 이 정보를 제공하지 않으면 0을 선택하십시오(이 구성 요소의 향후 개정판이 매우 빠른 process로 제조될 경우를 대비하여).
- set_output_delay -clock … -max … : output signal +를 받는 외부 부품의 tsu는 board의 trace delay입니다.
- set_output_delay -clock … -min … : output signal을 수신하는 외부 구성 요소의 –thold . 빼기 기호에 유의하십시오. 예를 들어 hold time이 1 ns인 경우 이 constraint를 -1 로 설정합니다.
이러한 정의는 다음 두 조건이 충족되는 경우에만 정확하다는 점에 유의해야 합니다.
- 인터페이스는 system synchronous 입니다.
- clock을 정의하는 create_clock command는 FPGA 내부에 또 다른 signal이 있는 get_pins와 달리 get_ports command가 있는 clock signal을 의미합니다.
이 두 가지 조건은 clock delays가 올바르게 계산되도록 하는 데 필요합니다.
또한 -min 나 -max가 사용되지 않으면 command는 두 개의 commands가 있는 것처럼 해석됩니다. -min attribute이 있는 command 하나, 그리고 -max attribute이 있는 두 번째 command . 이것은 아마 당신이 원하는 것이 아닐 것입니다.
이 commands 의 정의는 약간 혼란스럽습니다. set_input_delay은 clock edge이후 data signal이 해당 값을 변경할 수 있는 시기를 정의합니다. 그러나 set_output_delay은 data signal이 값을 변경한 후 clock edge가 허용되는 시기를 정의합니다. 아마도 이러한 정의의 근거는 datasheet 의 숫자를 timing constraints에서 직접 사용할 수 있다는 것입니다.
set_input_delay 와 set_output_delay commands 에는 여기서 다루지 않은 몇 가지 옵션이 있습니다. 특히 falling clock edge는 시간 참조로 선택할 수 있습니다. 자세한 내용은 도구 설명서를 참조하십시오.
항상 min 와 max를 모두 사용하십시오.
모든 timing constraint에 대해 -min 와 -max를 모두 사용해야 한다고 주장하는 것은 무의미해 보일 수 있습니다. 예를 들어, 외부 컴포넌트의 tsetup이 8 ns라면, 이게 뭐가 잘못된 건가요?
set_output_delay -clock theclk 8 [get_ports test_out]
이것은 setup time을 올바르게 정의합니다. hold time의 경우 의도치 않게 –8 ns로 정의됩니다. 이를 통해 output port는 clock보다 먼저 8 ns 값을 변경할 수 있습니다. 하지만 누가 신경 쓰나요? 그럴 리가 없겠죠?
음, 실제로 가능합니다. input pin (예: board에서 볼 수 있는 clock )의 clock을 기반으로 내부 clock을 생성하기 위해 PLL을 사용하는 방법에 대해 이미 논의했습니다 . 이를 통해 PLL은 FPGA의 내부 clock을 input clock와 정렬할 수 있습니다. PLL은 clock distribution network의 delay을 보상하기 위해 clock을 약간 이동(shifting)하여 이를 수행합니다.
실제로 FPGA tools는 timing constraint를 달성하기 위해 board의 clock보다 약간 더 일찍 clock을 옮길 수도 있습니다. FPGA 내부의 clock을 외부 clock앞으로 이동하면 외부 부품에서 인식하는 clock-to-output이 작아집니다. 이는 FPGA 내부의 flip-flop이 내부 clock와 동기화되지만 보이는 timing은 외부 clock에 상대적이기 때문입니다.
그러나 FPGA의 내부 clock이 board의 clock 보다 이전인 경우 FPGA의 output이 외부 clock의 clock edge 보다 먼저 변경될 수 있습니다. 이로 인해 이러한 outputs를 수신하는 구성 요소에서 hold time 위반이 발생할 수 있습니다.
set_output_delay command가 hold time을 –8 ns로 정의한다고 해서 output이 clock보다 먼저 8 ns 값을 변경한다는 의미는 아닙니다. 하지만 이를 통해 도구는 thold 요구 사항을 위반하는 방식으로 내부 clock을 이동할 수 있습니다. set_output_delay을 -min 와 함께 올바르게 사용하면 이런 일이 발생하지 않습니다.
trace delay로 인한 조정
이 도구는 PCB의 trace delay을 고려하지 않는다는 점을 기억하는 것이 중요합니다. 도구에는 이 정보가 없습니다. 따라서 그들은 set_input_delay 및 set_output_delay에 대한 timing 계산을 할 때 이 delay이 0이라고 가정합니다. 수정은 trace delay을 datasheet의 clock-to-output 및 tsu값에 추가하는 것입니다.
clock skew를 고려해야 할 수도 있습니다. 완벽한 PCB에서 clock은 동일한 delay로 모든 구성 요소에 도착합니다. 실생활에서는 FPGA 와 외부 구성 요소 사이에 가능한 clock skew가 있습니다. 이러한 clock skew는 도구의 timing 계산에서 고려되지 않습니다.
따라서 clock이 FPGA 보다 일찍 도착하는 경우(외부 구성 요소에 비해) 다음 수정이 필요합니다.
- set_input_delay -clock … -max … 의 경우: clock skew를 command의 delay 값에 더합니다(이는 외부 구성 요소의 더 큰 clock-to-output 와 유사합니다).
- set_output_delay -clock … -min … 의 경우: command의 delay 값에서 clock skew를 줄입니다. 즉, 더 음수로 만듭니다(이는 외부 구성 요소의 더 큰 thold 와 유사합니다).
마찬가지로 clock이 FPGA에 늦게 도착하면 다음과 같은 수정이 필요합니다.
- set_input_delay -clock … -min … 의 경우: command의 delay 값에서 clock skew를 줄입니다(이것은 외부 구성 요소의 더 작은 clock-to-output 와 유사합니다). 외부 구성 요소의 datasheet에 최소 clock-to-output 값이 제공되지 않으면 이 command의 값으로 clock skew 의 마이너스를 사용합니다.
- set_output_delay -clock … -max … : clock skew를 command의 delay 값에 더합니다(이는 더 큰 PCB trace delay와 유사합니다).
timing report는 여기에 설명된 조정과 관계없이 0이 아닌 clock skew를 표시할 수 있습니다. 그러나 timing report 에 나타나는 clock skew는 PCB가 아닌 FPGA내부의 clock delays 와 관련이 있습니다.
timing reports의 예
이 예는 다음 Verilog code를 기반으로 합니다.
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은 input clock, @test_in은 input pin, @test_out는 output pin입니다. PLL은 내부 clock을 board의 clock와 정렬하는 데 사용되지 않으므로 중요한 clock delay이 있습니다.
timing constraints는 다음과 같습니다.
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]
timing reports는 다소 길기 때문에 별도의 페이지에 표시됩니다.
set_max_delay 및 set_min_delay사용
외부 구성 요소와의 인터페이스가 source synchronous 일 때 set_input_delay 와 set_output_delay을 사용하는 것은 덜 자연스럽습니다. set_max_delay 와 set_min_delay이 이 상황에 더 적합합니다. 이전 페이지에서 이 두 commands는 clock period constraints에 대한 보완 또는 조정(timing exceptions)으로만 언급되었습니다. 모든 paths는 내부적이었습니다. 그들은 sequential element에서 시작해서 끝났습니다. 이 commands를 I/O timing constraints로 사용하면 path 의 시작 또는 끝은 I/O port가 됩니다. 이 상황에서 timing analysis는 어떻게 됩니까?
사실, 이러한 commands중 timing analysis를 파헤치는 것은 종종 무의미합니다. 그들의 목적은 일반적으로 도구가 간신히 충족할 수 있는 timing constraints를 작성하여 도구의 동작을 제한하는 것입니다. 따라서 이러한 timing constraints 의 숫자는 이러한 constraints를 더 엄격하게 만들기 위한 반복적인 시도를 통해 발견됩니다. 이 방법론을 사용하면 timing analysis 자체는 중요하지 않습니다.
즉, set_max_delay 및 set_min_delay의 계산을 이해하는 것이 좋습니다.
timing analysis 에는 두 부분이 있습니다. 첫 번째 부분은 source path입니다. clock edge (외부 clock pin)에서 두 번째 flip-flop의 data input 에 있는 업데이트되고 유효한 값까지의 시간을 계산합니다. 이 부분은 세 가지 요소의 합입니다.
- clock edge가 첫 번째 flip-flop ( clock path)에 도달하는 데 걸리는 시간
- 이 flip-flop이 값을 업데이트하는 데 걸리는 시간
- 이 새로운 값이 두 번째 flip-flop에 도달하는 데 걸리는 시간
두 번째 부분은 destination path로, clock edge가 두 번째 flip-flop에 도달하는 데 걸리는 시간으로만 구성됩니다. 우리는 이미 이 flip-flop의 input이 업데이트되는 시기( source path에서)를 알고 있으므로 필요에 따라 시차를 필요한 tsu 또는 thold와 비교할 수 있습니다.
그러나 그것은 두 개의 sequential elements에서 사실이었습니다. 측면 중 하나가 I/O port가 면 어떻게 됩니까? timing analysis의 경우 port는 가상의 flip-flop인 것처럼 취급됩니다. 이 flip-flop 에 대한 clock path delay은 0입니다.
clock이 get_ports 에 의존하는 create_clock command 로 정의된 일반적인 상황을 고려해 보겠습니다(거의 모든 예에서 보여짐). 0인 clock path delay은 이 가상의 flip-flop의 clock input이 clock pin에 직접 연결됨을 의미합니다. 따라서 clock pin 와 이 가상의 flip-flop사이에 delay이 없습니다.
이 flip-flop 의 모든 timing parameters는 0입니다: tsu, thold 및 clock-to-output. 이것은 실제 전자 부품을 반영하지 않지만 set_max_delay 및 set_min_delay이 output port와 함께 사용될 때 의미를 부여합니다. port의 clock-to-output. 예를 들어:
set_max_delay -to [get_ports test_out] 7 set_min_delay -to [get_ports test_out] 0
이 두 timing constraints는 @test_out의 clock-to-output이 0 ns 와 7 ns사이에 있어야 합니다.
이유를 설명하겠습니다. 일반적으로 set_max_delay command는 특정 flip-flops사이의 paths 에 대해 period constraint 와 유사하다는 점을 기억하세요 . 그렇다면 Destination Clock Path 는 어떻게 될까요? 계산은 두 번째 clock edge, 즉 7 ns에서 시작됩니다. 하지만 두 번째 flip-flop 에 대한 clock path delay은 0이고, 이 flip-flop 의 tsu 도 0입니다. 따라서 Destination Clock Path 의 계산 결과는 바로 7 ns입니다. 이는 Source Path에 허용되는 최대값이며, 평소와 같이 계산됩니다. Source Clock Path 와 Data Path. 요약하자면, 요구 사항은 data output이 첫 번째 clock edge이후에 유효한 7 ns 라는 것입니다. 이는 output port의 clock-to-output 에 대한 정의와 정확히 같습니다. 관련 clock 의 create_clock command가 get_ports를 기반으로 했다면, 이 clock-to-output은 PCB의 clock 에 상대적입니다.
Vivado가 있는 timing reports의 예를 참조하십시오.
set_output_delay은 외부 구성 요소의 tsu 또는 thold 와 관련이 있습니다. set_max_delay은 FPGA의 output port의 clock-to-output을 정의합니다. 따라서 이 두 옵션의 주요 차이점은 초점이 어디에 있느냐입니다.
input port와 관련하여 set_max_delay 및 set_min_delay 의 의미에 대한 직관적인 설명이 없습니다. Source Path는 input signal을 수신하는 flip-flop 의 input pin 와 data input 사이의 delay 로 구성됩니다. Destination Clock Path는 timing constraint command에 지정된 시간에 시작합니다. clock path delay은 이 시간에 추가됩니다. 이는 무의미한 계산입니다( timing reports 참조). 외부 구성 요소의 clock-to-output 와 관련된 set_input_delay을 사용하는 것이 더 자연스럽습니다.
set_max_delay 및 set_min_delay을 대신하여 만들어진 timing analysis는 clock period에 의존하지 않는다는 점에 유의하세요. 따라서 clock의 frequency가 변경되면 도구가 이러한 constraints를 적용하는 동안 동일한 숫자가 사용됩니다. 반면 set_input_delay 및 set_output_delay 에 대한 계산은 clock의 frequency에 의존합니다.
I/O timing constraints가 clock의 frequency 에 종속되는 것은 상황에 따라 장점이 될 수도 있고 단점이 될 수도 있습니다. timing constraints가 외부 구성 요소의 timing parameters를 기반으로 작성되었고(인터페이스가 system synchronous 인 경우) set_input_delay 와 set_output_delay에 의존하는 것이 더 나을 것입니다. 이러한 constraints는 clock의 frequency가 변경되더라도 올바르게 유지됩니다. 그러나 timing constraints 의 의도가 도구가 특정 선택을 하도록 강제하는 것(예: IOB registers 사용)인 경우 set_max_delay 및 set_min_delay이 적합할 가능성이 더 큽니다.
-datapath_only사용
timing constraint 에 대한 한 가지 가능한 동기는 FPGA tools가 I/O port에서 또는 I/O port로 가능한 최소한의 delay을 달성하기 위해 필요한 모든 것을 수행하도록 하는 것입니다. 이는 일반적으로 IOB register를 사용하는 것을 의미합니다. 이는 또한 input port 와 flip-flop 사이에 여분의 delay을 삽입하지 않는 것을 의미할 수도 있습니다(도구는 더 나은 마진으로 thold 요구 사항을 충족하기 위해 할 수 있음).
timing constraint를 이 목적으로 사용할 때는 목표가 되는 특정 delay이 없습니다. 아이디어는 도구가 최상의 결과를 얻는 것 외에는 아무것도 하지 못하도록 하는 것입니다. FPGA tools가 -datapath_only를 지원하는 경우 이 옵션과 함께 set_max_delay을 사용하는 것이 좋습니다. 이렇게 하면 계산에서 clock delay path가 완전히 제거되므로 I/O port 와 flip-flop 사이의 delay 만 고려됩니다. 이런 식으로 timing constraint의 요구 사항은 목적과 정확하게 일치합니다. flip-flop 와 I/O pin사이에서 delay을 제어합니다.
다음은 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" 부분이 없는 이 command를 받아들이기를 거부했습니다. command 에는 input port와 관련된 유사한 요구 사항이 없었습니다.
timing reports 와 datapath_only는 예제가 있는 페이지 하단에 있습니다.
요약
set_input_delay 와 set_output_delay은 종종 I/O timing constraints에 대한 선호되는 commands 로 간주됩니다. 실제로 이는 인터페이스가 system synchronous 일 때 일반적으로 올바른 선택입니다. 다른 시나리오에서는 I/O port의 timing에 필요한 제한 사항을 더 잘 반영할 수 있으므로 대신 set_max_delay 와 set_min_delay을 사용하는 것을 고려할 가치가 있을 수 있습니다.
이 페이지는 timing에 대한 일련의 페이지를 마무리합니다. 그러나 기존 design을 검사하는 데 편리한 방식으로 많은 주제를 요약한 마지막 페이지가 있습니다.