01signal.com

clock period constraint및 clock objects

이 페이지는 timing에 대한 일련의 페이지 에 속합니다. 이전 페이지에서는 timing 계산에 대한 이론을 설명하고 clock period constraint에 대해 논의했으며 timing closure의 원리를 보여주었습니다. 이제 timing constraints의 기술적 세부 사항부터 시작할 때입니다.

Tcl 명령어로서의 create_clock 의 의미

이전 페이지는 모두 이 timing constraint를 중심으로 진행되었습니다.

create_clock -period 4 -name clk [get_ports clk]

나는 지금까지 이 행의 구문에 대해 일부러 논의하지 않았습니다. 이제 이것이 실제로 무엇을 의미하는지 설명할 시간입니다.

이 timing constraint는 timing constraints의 가장 일반적인 형식인 SDC (Synopsys Design Constraints) 형식으로 작성되었습니다. Vivado 및 Quartus는 이 형식과 기타 여러 FPGA 도구를 사용합니다.

SDC 파일은 본질적으로 Tcl로 작성된 script 입니다. 따라서 SDC 파일의 내용은 단순한 정보 모음이 아니라 짧은 컴퓨터 프로그램입니다. 그러나 script 로서 SDC 파일의 기능은 constraints를 작성하기 위한 명령의 작은 하위 집합으로 제한됩니다. Tcl script 에서 허용되는 모든 것을 SDC 파일에서 수행할 수 있는 것은 아닙니다.

create_clock 명령은 timing constraint를 정의하는 데 사용됩니다. 그러나 실제로 이 명령은 FPGA 소프트웨어에 새 clock object를 생성하도록 지시합니다. 그리고 "object"라는 단어는 소프트웨어 엔지니어링 측면에서 일반적으로 의미하는 것을 의미합니다. 따라서 새로운 clock object는 자체 properties가 있는 object 로 Tcl interpreter의 메모리에 저장되는 것입니다.

예를 들어 create_clock 명령에서 "-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 명령이 있습니다. 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 및 이와 유사한 명령은 다음 페이지 에서 자세히 설명합니다.

이러한 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를 생성한다는 것입니다. 이 명령의 parameters는 이 object의 properties를 설정하는 방법만 결정합니다. 예를 들어 "-period 4"라고 적힌 부분(반복적으로 보여드린 timing constraint 에서)은 "PERIOD"라는 특정 property가 4라는 값을 가져야 한다는 의미일 뿐입니다.

이러한 Tcl 명령을 직접 시도하려는 경우 FPGA 도구 간에 차이점이 있다는 점에 유의하십시오.

Vivado에서 이러한 명령은 Implemented Design을 연 후에만 수행할 수 있습니다.

Quartus에서 먼저 TimeQuest Timing Analyzer를 연 다음 Create Timing Netlist, Read SDC File 및 Update Timing Netlist를 클릭합니다. 그런 다음 Tcl console에서 몇 가지 명령을 시도합니다. 예를 들면 다음과 같습니다.

> join [ query_collection -all [ get_clocks ] ] "\n"
> get_clock_info -waveform [get_clocks clk]

"clock"라는 단어의 의미

FPGA 도구에서 "clock"라는 단어를 사용할 때 이는 일반적으로 FPGA내부의 물리적 signal이 아니라 clock object를 의미합니다. 이것은 특히 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 명령으로 "clk"라는 이름이 지정된 clock object 입니다. 관련 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 도구는 SDC 파일에 명령을 추가하여 clock objects 의 이름을 바꿀 수 있지만 대부분의 프로젝트에서는 그렇지 않습니다. 그리고 황금률 #4 는 프로젝트에 특별한 것을 삼가는 것입니다.

clock 의 소스가 IP block (예: Gigabit transceiver, PCIe block 또는 on-chip processor core)인 경우 이름 문제는 더욱 어려워집니다. 이 경우 clock 의 이름은 어디에서 왔는지, 무엇과 관련이 있는지에 대해 거의 말하지 않습니다.

이 문제는 어떻게 해결됩니까? clock의 이름이 자체 SDC 파일의 create_clock 명령에서 오는 가장 간단한 상황부터 시작하겠습니다. 이것은 다시 한 번 동일한 timing constraint 입니다.

create_clock -period 4 -name clk [get_ports clk]

이 명령의 마지막 부분은 "[get_ports clk]"입니다. Tcl 언어에서 대괄호는 Tcl 명령으로 대괄호의 내용을 실행한 다음 이 대괄호 대신 이 명령의 결과를 사용하는 것을 의미합니다.

get_ports 명령은 이름이 "clk"인 I/O port를 찾습니다. 이 명령의 결과는 이 port를 나타내는 object 입니다. 따라서 위의 create_clock 명령에서 이 object는 이 명령에 대한 argument 입니다. 이것은 create_clock이 clock object 와 실제 signal을 연결하는 방법입니다.

port 의 이름과 object 의 이름은 모두 "clk"입니다. 반드시 동일할 필요는 없지만 다음과 같이 하는 것이 좋습니다. object의 이름은 timing reports에 나타납니다. 따라서 일반적으로 port 의 이름이 최선의 선택입니다.

net objects 및 pin objects를 signal의 식별자로 사용할 수도 있습니다. 이것은 IP blocks를 대신하여 자동으로 생성되는 timing constraints 에서 일반적입니다. 그러나 자신의 constraints에서 이 작업을 수행해야 할 필요성을 느낀다면 뭔가 잘못하고 있을 가능성이 높습니다.

따라서 create_clock 명령이 SDC 파일에서 사용된 경우 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 명령으로 정보를 얻는 것입니다. 이를 수행하는 방법은 FPGA 도구마다 다릅니다. Vivado에서는 Implemented Design을 연 후 다음과 같은 명령을 사용할 수 있습니다.

> get_clocks -of_objects [ get_nets pll_clk_8 ]
clk_out1_clk_wiz_1

이 방법을 사용하려면 net의 이름을 알아야 합니다. 때로는 이 예와 같이 간단하며 때로는 이 net의 이름을 찾아야 합니다. FPGA 도구는 일반적으로 GUI로 이를 수행하는 방법을 제공합니다. 이를 위해 Tcl 명령을 사용할 수도 있습니다.

사실, Tcl 의 몇 가지 예를 통해 Tcl을 올바르게 사용하는 방법을 아는 것이 중요하다는 점을 확신하셨기를 바랍니다. 이것이 다음 페이지 의 내용입니다.

get_port사용의 의미

위의 예에서 create_clock 명령은 get_port를 사용하여 clock object 와 물리적 input pin을 연결합니다. 위에서 언급한 것처럼 이 연결은 어떤 logic elements가 이 clock (또는 여기에서 생성된 clocks )에 연결되어 있는지 알기 위해 필요합니다.

그러나 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가 지만 두 가지 중요한 단점이 있습니다.

따라서 가능하면 항상 get_port를 사용해야 합니다. 그렇지 않으면 clock의 timing은 그 자체 외에는 알려지지 않은 것으로 간주되어야 합니다.


이 페이지에는 많은 Tcl 명령이 제시되었지만 적절하게 설명하지 않았습니다. 다음 페이지가 그 공백을 채웁니다.

이 페이지는 영어에서 자동으로 번역됩니다. 불분명한 사항이 있으면 원본 페이지를 참조하십시오.
Copyright © 2021-2024. All rights reserved. (6f913017)