이 페이지는 timing에 대한 일련의 페이지 에 속합니다. 이전 페이지에서는 timing 계산에 대한 이론을 설명하고 clock period constraint에 대해 논의했으며 timing closure의 원리를 보여주었습니다. 이제 timing constraints의 기술적 세부 사항부터 시작할 때입니다.
create_clock 의 의미는 Tcl command가 다
이전 페이지는 모두 이 timing constraint를 중심으로 진행되었습니다.
create_clock -period 4 -name clk [get_ports clk]
나는 지금까지 이 행의 구문에 대해 일부러 논의하지 않았습니다. 이제 이것이 실제로 무엇을 의미하는지 설명할 시간입니다.
이 timing constraint는 timing constraints의 가장 일반적인 형식인 SDC (Synopsys Design Constraints) 형식으로 작성되었습니다. Vivado 와 Quartus는 이 형식을 사용하며, 여러 다른 FPGA tools도 이 형식을 사용합니다.
SDC 파일은 본질적으로 Tcl로 작성된 script 입니다. 따라서 SDC 파일의 내용은 단순한 정보 모음이 아니라 짧은 컴퓨터 프로그램입니다. 그러나 script 로서의 SDC 파일의 기능은 constraints를 작성하기 위한 commands의 작은 하위 집합으로 제한됩니다. Tcl script 에서 허용되는 모든 것을 SDC 파일에서 수행할 수 있는 것은 아닙니다.
create_clock command는 timing constraint를 정의하는 데 사용됩니다. 하지만 사실 이 command는 FPGA tools 에 새로운 clock object를 만들라고 말합니다. 그리고 "object"라는 단어는 소프트웨어 엔지니어링 측면에서 일반적으로 의미하는 바를 의미합니다. 따라서 새로운 clock object는 자체 properties가 있는 object 로 Tcl interpreter의 메모리에 저장된 것입니다.
예를 들어, create_clock command 에서 "-name clk"라고 적힌 부분은 "name"라고 불리는 property 에 "clk"라는 값을 부여합니다. 이전 페이지 중 하나 에서 이 이름이 timing reports에서 사용되었다는 것을 기억하세요. 이 constraint 때문에(더 정확하게는 이 clock object때문에) 계산된 timing paths 와 함께 "clk"라는 이름이 등장했습니다.
나중에 clk_out1_clk_wiz_1 및 clk_out2_clk_wiz_1와 같이 clocks의 다른 이름이 있음을 확인했습니다. 이들은 실제로 도구에 의해 자동으로 생성된 다른 clock objects의 이름이었습니다.
모든 clocks를 나열하는 Tcl command가 있습니다: get_clocks. 따라서 이전 페이지 의 두 clocks가 있는 예에서 이것은 Vivado의 Tcl console에 대한 세션입니다.
> get_clocks clk clkfbout_clk_wiz_1 clk_out1_clk_wiz_1 clk_out2_clk_wiz_1
get_clocks 및 유사한 commands 에 대해서는 다음 페이지 에서 더 자세히 설명합니다.
이러한 objects의 properties 도 볼 수 있습니다. 이러한 properties를 모두 이해할 필요는 없습니다. 나는 clock이 object라는 점을 강조하기 위해 이것을 보여주고 있습니다. 개인적으로 object의 property를 직접 조작할 필요가 전혀 없었습니다.
> report_property [get_clocks clk] Property Type Read-only Value CLASS string true clock INPUT_JITTER double true 0.040 IS_GENERATED bool true 0 IS_PROPAGATED bool true 1 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 NAME string true clk PERIOD double true 4.000 SOURCE_PINS string* true clk SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 2.000 > report_property [get_clocks clk_out1_clk_wiz_1] Property Type Read-only Value CLASS string true clock EDGES int* true 1 2 3 EDGE_SHIFT double* true 0.000 2.000 4.000 INPUT_JITTER double true 0.000 IS_GENERATED bool true 1 IS_INVERTED bool true 0 IS_PROPAGATED bool true 1 IS_RENAMED bool true 0 IS_USER_GENERATED bool true 0 IS_VIRTUAL bool true 0 MASTER_CLOCK clock true clk NAME string true clk_out1_clk_wiz_1 PERIOD double true 8.000 SOURCE pin true pll_i/inst/mmcme3_adv_inst/CLKIN1 SOURCE_PINS string* true pll_i/inst/mmcme3_adv_inst/CLKOUT0 SYSTEM_JITTER double true 0.050 WAVEFORM double* true 0.000 4.000
깨달아야 할 중요한 점은 create_clock이 단지 object를 만든다는 것입니다. 이 command 의 parameters는 단지 이 object의 properties를 설정하는 방법을 결정합니다. 예를 들어, "-period 4"라고 쓰여진 부분(제가 반복해서 보여드린 timing constraint 에서)은 "PERIOD"라고 불리는 특정 property가 4값을 가져야 한다는 것을 의미합니다.
만약 Tcl commands를 직접 사용해보고 싶다면, FPGA tools와 Tcl commands 사이에 차이점이 있다는 점을 알아두세요.
Vivado에서는 Implemented Design을 연 후에만 commands를 사용할 수 있습니다.
Quartus에서 먼저 TimeQuest Timing Analyzer를 열고, Create Timing Netlist, Read SDC File , Update Timing Netlist를 클릭합니다. 그런 다음 Tcl console에서 commands를 시도해 보세요. 예를 들어:
> join [ query_collection -all [ get_clocks ] ] "\n" > get_clock_info -waveform [get_clocks clk]
"clock"라는 단어의 의미
FPGA tools가 "clock"라는 단어를 사용할 때, 그것은 일반적으로 clock object를 의미하며, FPGA내부의 물리적인 signal을 의미하지 않습니다. 이는 특히 timing reports에서 그렇습니다.
이전 페이지 에서 "이론적 clocks"라는 용어를 몇 번 사용한 것을 기억하십시오. 이들은 사실 clock objects입니다. timing report에서는 "clocks"라고 하지만 timing analysis 에서 사용하면 정보를 담는 컨테이너일 뿐이라는 것을 알 수 있습니다.
그럼 이 clock objects 와 실제 signals의 연결은 무엇일까요? 우리는 이미 timing analysis에서 clock objects 의 이름을 보았습니다. 이 모든 것이 어떻게 함께 작동할까요?
도구가 design의 static timing analysis를 수행할 때 모든 paths가 검사됩니다. path가 flip-flop로 시작하는 경우 도구는 flip-flop의 clock input에 연결된 signal (예: net)를 검사합니다. 이 signal와 관련된 clock object가 있습니까? 예를 들어, signal이 @clk일 때, 관련된 clock object는 create_clock command와 함께 "clk"라는 이름을 가진 것입니다. 관련 clock object를 찾은 후, 도구는 이 object의 properties에서 필요한 정보를 가져올 수 있습니다.
path끝에 있는 flip-flop 에서도 같은 일이 발생합니다. 이제 도구에는 path에 해당하는 두 개의 clock objects가 있습니다. 이러한 objects의 정보를 사용하여 도구는 timing analysis를 수행합니다.
물론 flip-flops뿐만 아니라 모든 sequential element에도 동일한 절차가 적용됩니다.
이것을 이해하는 것이 왜 중요합니까? 무엇보다도 timing report 에 때때로 clock이 없는 registers가 있다고 말하는 error message가 있기 때문입니다. 일반적으로 clock input에 연결된 것이 없는 flip-flop이 있다는 의미는 아닙니다. 오히려 이것은 도구가 이 clock input와 관련된 clock object를 찾지 못했다는 것을 의미합니다. 즉, 이 도구는 이 flip-flop의 clock input에 대한 정보를 찾지 못했습니다. 따라서 문제는 일반적으로 logic design에 있지 않지만 timing constraint가 없거나 잘못 작성되었습니다.
다시 한 번 말할 가치가 있습니다. timing report에 "clock"라고 표시된 것은 logic design에 해당 이름의 signal이 있다는 의미가 아니라 clock object가 해당 이름으로 생성되었다는 의미입니다. 어떤 signal인지 어떻게 알 수 있습니까? 다음 주제입니다.
이것은 누구의 clock 입니까?
timing report를 읽기 어렵게 만드는 것 중 하나는 clocks의 이름입니다. logic design 의 대부분의 clock signals는 PLL에서 생성되며, timing report 에 나타나는 이름이 도움이 되지 않을 수 있다는 것을 이미 보았습니다. 대부분의 FPGA tools는 SDC 파일에 명령을 추가하여 clock objects 의 이름을 바꿀 수 있지만, 대부분의 프로젝트에서는 이렇게 하지 않습니다. 그리고 황금률 #4 는 프로젝트에 특별한 것은 삼가하는 것입니다.
clock 의 소스가 IP block (예: Gigabit transceiver, PCIe block 또는 on-chip processor core)인 경우 이름 문제는 더욱 어려워집니다. 이 경우 clock 의 이름은 어디에서 왔는지, 무엇과 관련이 있는지에 대해 거의 말하지 않습니다.
그렇다면 이 문제는 어떻게 해결될까요? 가장 간단한 상황부터 시작해 봅시다. clock의 이름이 우리 SDC 파일에 있는 create_clock command 에서 유래한 경우입니다. 이것은 다시 한번 동일한 timing constraint 입니다.
create_clock -period 4 -name clk [get_ports clk]
이 command 의 마지막 부분은 "[get_ports clk]"입니다. Tcl 언어에서 대괄호는 대괄호의 내용을 Tcl command로 실행한 다음 이 command 의 결과를 이러한 대괄호 대신 사용하는 것을 의미합니다.
get_ports command는 "clk"라는 이름의 I/O port를 찾습니다. 이 command 의 결과는 이 port를 나타내는 object 입니다. 따라서 위의 create_clock command 에서 이 object는 이 command에 대한 argument 입니다. 이것이 create_clock이 clock object 와 실제 signal을 연결하는 방식입니다.
port 의 이름과 object 의 이름은 모두 "clk"입니다. 반드시 동일할 필요는 없지만 다음과 같이 하는 것이 좋습니다. object의 이름은 timing reports에 나타납니다. 따라서 일반적으로 port 의 이름이 최선의 선택입니다.
net objects 및 pin objects를 signal의 식별자로 사용할 수도 있습니다. 이것은 IP blocks를 대신하여 자동으로 생성되는 timing constraints 에서 일반적입니다. 그러나 자신의 constraints에서 이 작업을 수행해야 할 필요성을 느낀다면 뭔가 잘못하고 있을 가능성이 높습니다.
따라서 SDC 파일에서 create_clock command가 사용되었다면 clock object가 어떤 signal 와 관련이 있는지 쉽게 알 수 있습니다. 하지만 도구에서 자동으로 생성된 clock objects는 어떨까요?
이 경우 clock을 인식하는 가장 좋은 방법은 timing report를 들여다보는 것입니다. 예를 들어 이전 페이지 의 예에서 어떤 clock object가 @pll_clk_8 와 관련이 있습니까? 쉽게 알아낼 수 있는 방법은 timing report에서 text search를 수행하는 것입니다. 따라서 "pll_clk_8"를 검색하면 다음 부분이 발견됩니다.
Location Delay type Incr(ns) Path(ns) Netlist Resource(s) -------------------------------------------------------------- ------------------- (clock clk_out1_clk_wiz_1 rise edge) 16.000 16.000 AG12 0.000 16.000 clk (IN) net (fo=0) 0.000 16.000 pll_i/inst/clkin1_ibuf/I AG12 INBUF (Prop_INBUF_HRIO_PAD_O) 0.738 16.738 pll_i/inst/clkin1_ibuf/INBUF_INST/O net (fo=1, routed) 0.105 16.843 pll_i/inst/clkin1_ibuf/OUT AG12 IBUFCTRL (Prop_IBUFCTRL_HRIO_I_O) 0.049 16.892 pll_i/inst/clkin1_ibuf/IBUFCTRL_INST/O net (fo=1, routed) 0.975 17.867 pll_i/inst/clk_in1_clk_wiz_1 MMCME3_ADV_X1Y0 MMCME3_ADV (Prop_MMCME3_ADV_CLKIN1_CLKOUT0) -4.438 13.429 pll_i/inst/mmcme3_adv_inst/CLKOUT0 net (fo=1, routed) 0.501 13.930 pll_i/inst/clk_out1_clk_wiz_1 BUFGCE_X1Y1 BUFGCE (Prop_BUFCE_BUFGCE_I_O) 0.101 14.031 pll_i/inst/clkout1_buf/O X2Y0 (CLOCK_ROOT) net (fo=1, routed) 1.369 15.400 pll_clk_8 SLICE_X49Y58 FDRE foo_reg_reg/C
이것은 clk_out1_clk_wiz_1용 Source Clock Path가 며 질문에 대한 답이 있습니다.
또 다른 방법은 Tcl command로 정보를 얻는 것입니다. 이를 수행하는 방법은 FPGA tool 마다 다릅니다. Vivado에서는 Implemented Design을 연 후 다음과 같은 command를 사용할 수 있습니다.
> get_clocks -of_objects [ get_nets pll_clk_8 ] clk_out1_clk_wiz_1
이 방법은 net의 이름을 알아야 합니다. 때로는 이 예처럼 간단할 때도 있고, 때로는 이 net의 이름을 찾아야 할 때도 있습니다. FPGA tools는 보통 GUI로 이 작업을 할 수 있는 방법을 제공합니다. 이 목적으로 Tcl commands를 사용할 수도 있습니다.
사실, Tcl 의 몇 가지 예를 통해 Tcl을 올바르게 사용하는 방법을 아는 것이 중요하다는 점을 확신하셨기를 바랍니다. 이것이 다음 페이지 의 내용입니다.
get_port사용의 의미
위의 예에서 create_clock command는 get_port 에 의존하여 clock object 와 물리적인 input pin간의 연결을 만듭니다. 위에서 언급했듯이, 이 연결은 이 clock (또는 여기에서 생성된 clocks )에 연결된 logic elements를 아는 데 필요합니다.
그러나 get_port를 사용하는 것이 유일한 가능성은 아닙니다. 예를 들어 global clock buffer의 output pin을 참조하는 것도 가능합니다. 이 같은:
create_clock -name clk -period 4 [get_pins my_BUFG_inst/O]
차이점은 도구가 global clock buffer의 output pin을 clock의 원점으로 간주한다는 것입니다. 즉, clock paths의 계산은 이 위치에서 시작됩니다. 이 원점의 첫 번째 clock edge는 0 ns에서 발생하므로 이 output pin이 시간 기준이 됩니다.
이것은 합법적인 timing constraint가 지만 두 가지 중요한 단점이 있습니다.
- 이 clock을 다른 모든 clocks와 관련하여 unrelated clock 로 간주하려면 도구를 요청해야 합니다 . 동일한 PLL로 생성된 clocks 의 경우에도 마찬가지입니다. 그 이유는 도구가 output pin을 시간 기준으로 간주하기 때문입니다. 따라서 clock path delays 와 관련하여 clocks 간의 차이점에 대한 보상은 없습니다(즉, clock skews는 고려되지 않음).
- FPGA외부에서 볼 수 있는 clock 와 관련된 I/O timing constraints를 정의하는 것은 불가능하거나 매우 어렵습니다. 이러한 constraints는 clock object를 시간 참조로 사용하기 때문입니다. 그러나 다시 한 번 시간 기준은 global clock buffer의 output pin입니다. 외부 clock 에서 global clock buffer 로의 clock skew는 알 수 없습니다(예: 온도에 따라 변경됨).
따라서 가능하면 항상 get_port를 사용해야 합니다. 그렇지 않으면 clock의 timing은 그 자체 외에는 알려지지 않은 것으로 간주되어야 합니다.
이 페이지에서는 많은 Tcl commands가 소개되었지만, 적절하게 설명하지 않았습니다. 다음 페이지에서 그 틈을 메웁니다.