01signal.com

clock period constraint및 clock objects

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

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


이 페이지에서는 많은 Tcl commands가 소개되었지만, 적절하게 설명하지 않았습니다. 다음 페이지에서 그 틈을 메웁니다.

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