01signal.com

SDC timing constraints에서 wildcards 및 -hierarchical 사용

이 페이지는 이 페이지보다 먼저 읽어야 하는 다른 페이지 의 추가 기능입니다 . 두 페이지 모두 timing 계산의 이론을 설명하고 여러 timing constraints를 작성하는 방법을 보여주고 timing closure의 원리를 논의하는 일련의 페이지 중 일부입니다 .

반드시 필요한 경우가 아니면 단순 search patterns를 사용하지 마십시오.

이 페이지에서는 timing constraints를 SDC 형식으로 작성하는 데 wildcards를 사용하는 방법을 설명합니다. wildcards는 여러 Tcl commands와 함께 사용할 수 있지만, 이 페이지에서는 일반적으로 "-hierarchical" 옵션을 지원하는 commands 에 초점을 맞춥니다. get_cells, get_pins 및 get_nets. 이 Tcl commands 는 다른 페이지에서 설명합니다 . 그러나 일부 FPGA tools는 이 세 가지 commands모두와 함께 "-hierarchical"를 지원하지 않는다는 점에 유의하세요.

불행히도, 이 세 가지 commands 의 검색 기능은 매우 제한적이고 혼란스러울 수 있습니다. wildcard가 어떻게 작동하는지 정확히 이해하지 못하면 검색 결과가 예상과 다를 수 있습니다. 특히 "-hierarchical"를 사용하면 아래와 같은 놀라운 결과를 얻을 수 있습니다.

이런 이유로, 특정 FPGA tool이 관련 command에 대해 "-filter" 옵션을 지원하는 경우 항상 "-filter" 옵션을 사용하는 것이 더 좋습니다. 이러한 지원이 없는 경우 간단한 wildcards를 사용하는 것 외에는 선택의 여지가 없습니다.

이 페이지의 모든 예제는 다른 관련 페이지 와 동일한 Verilog code를 기반으로 합니다.

간단한 search patterns

logic elements 와 다른 objects를 찾는 commands는 search pattern이 있든 없든 사용할 수 있습니다. search pattern이 없으면 모든 관련 objects가 발견됩니다. 예를 들어, top-level hierarchy에서 모든 pins를 찾으려면:

get_pins

그리고 전체 FPGA design 에서 모든 pins를 찾는 command는 다음과 같습니다.

get_pins -hierarchical

search pattern을 사용하는 경우 결과는 이 pattern로 제한됩니다. 예를 들어, 알려진 이름과 hierarchy에서 알려진 위치를 가진 하나의 특정 pin을 찾으려면:

> get_pins foo_reg_reg/Q
foo_reg_reg/Q
> get_pins pll_i/clk_in1
pll_i/clk_in1
> get_pins pll_i/inst/clk_in1
pll_i/inst/clk_in1

pattern 에는 다음과 같은 wildcards도 포함될 수 있습니다.

> get_pins foo_reg_reg/*
foo_reg_reg/Q foo_reg_reg/C foo_reg_reg/CE foo_reg_reg/D foo_reg_reg/R

> get_pins pll_i/*
pll_i/clk_in1 pll_i/clk_out1 pll_i/clk_out2
> get_pins pll_i/inst/*
pll_i/inst/clk_in1 pll_i/inst/clk_out1 pll_i/inst/clk_out2
> get_pins pll_i/*/*
pll_i/inst/clk_in1 pll_i/inst/clk_out1 pll_i/inst/clk_out2
> get_pins pll_i/*/clk*
pll_i/inst/clk_in1 pll_i/inst/clk_out1 pll_i/inst/clk_out2

wildcard의 동작

두 가지 일반적인 wildcards가 있습니다.

하지만 이 두 wildcards는 hierarchy separator에는 절대 적용되지 않습니다. 즉, "*" 및 "?"는 "/"(또는 "|"를 Quartus로 대체)를 대체하지 않습니다. 이것은 "-hierarchical" 옵션이 사용되는지 여부에 관계없이 wildcards에서 항상 사실입니다(그러나 "-filter" 또는 "-regexp"가 사용되는 경우 에는 다른 이야기 입니다).

결과적으로 hierarchy 에서 object의 정확한 위치를 명시적으로 작성해야 합니다.

> get_pins */clk_*
pll_i/clk_in1 pll_i/clk_out1 pll_i/clk_out2
> get_pins */*/clk_*
pll_i/inst/clk_in1 pll_i/inst/clk_out1 pll_i/inst/clk_out2

다른 도구는 hierarchy separator에 다른 characters를 사용할 수 있습니다. 방금 언급했듯이 Quartus는 이러한 목적으로 "/"가 아닌 pipe character ("|")를 사용합니다.

"-hierarchical" 옵션을 사용하면 design의 hierarchy에서 logic elements를 어디에서나 찾을 수 있습니다. 이렇게 하면 hierarchy에서 정확한 위치를 지정할 필요가 없으며, 단일 command로 전체 FPGA design 에서 logic elements를 찾을 수도 있습니다.

따라서 "-hierarchical"를 사용하여 동일한 표현을 반복해 보겠습니다.

> get_pins -hierarchical */clk_*
pll_i/clk_in1 pll_i/clk_out1 pll_i/clk_out2 pll_i/inst/clk_in1 pll_i/inst/clk_out1 pll_i/inst/clk_out2
> get_pins -hierarchical */*/clk_*
WARNING: [Vivado 12-508] No pins matched '*/*/clk_*'.

"-hierarchical"는 search pattern이 design의 hierarchy의 모든 위치에 적용된다는 의미입니다. 위의 예에서 "*/clk_*"는 top-level hierarchy에 모두 처음 적용되었으므로 예를 들어 "pll_i/clk_in1"가 발견되었습니다. 그런 다음 동일한 pattern이 "pll_i/" 내부에 적용되었으므로 "pll_i/inst/clk_in1"가 발견되었습니다.

그런데 왜 "-hierarchical"를 적용했을 때 "*/*/clk_*"에서 아무것도 발견되지 않았습니까? 동일한 pattern은 이 옵션 없이 일부 검색 결과를 생성했습니다. "-hierarchical"를 사용하면 항상 더 많은 검색 결과가 있어야 하지 않습니까?

-hierarchical을 사용하면 search pattern이 제한됩니다.

이상하게도 "-hierarchical" 옵션은 search pattern이 적용되는 위치만 변경하는 것이 아니라 허용되는 patterns 도 제한합니다. 안타깝게도 불법 pattern이 사용될 때 도구는 오류로 응답하지 않습니다. 대신 응답은 아무것도 찾을 수 없다는 것입니다.

세 가지 Tcl commands (get_cells, get_pins 및 get_nets) 각각에는 search pattern을 제한하는 자체 규칙이 있습니다. 정확한 제한 사항을 알아보려면 FPGA tool설명서를 참조하십시오. 표준 해석( Synopsys설명서에 자세히 설명됨)은 아래에 나와 있습니다.

"-hierarchical" 대신 약어 "-hier"가 자주 사용됩니다. 의미는 정확히 동일합니다.

get_cells -hierarchical

get_cells가 -hierarchical와 함께 사용되는 경우 pattern은 object의 이름과만 일치합니다. pattern에 hierarchy separator가 있으면 결과는 항상 비어 있습니다. 예를 들어:

> get_cells -hierarchical *_buf
pll_i/inst/clkf_buf pll_i/inst/clkout1_buf pll_i/inst/clkout2_buf
> get_cells -hierarchical inst/*_buf
WARNING: [Vivado 12-180] No cells matched 'inst/*_buf'.

pattern에 "/"가 있으면 오류입니다. 이와 같은 pattern 에서는 아무것도 발견되지 않기 때문입니다. 그러나 도구는 오류로 응답하지 않고 대신 command는 결과를 생성하지 않습니다.

hierarchy separator는 pattern에서 허용되지 않으므로 get_cells는 다음 가능성으로 제한됩니다.

이 예는 특정 이름 형식을 사용하여 모든 cells 에 대해 false paths를 선언하는 방법을 보여줍니다.

set_false_path -to [get_cells -hierarchical *metaguard*]

이런 timing constraint 의 경우 metastability guards로 사용되는 모든 registers 에 "metaguard"라는 단어가 포함된 이름을 사용하면 충분합니다. 하지만 이 timing constraint 의 위험은 expression이 FPGA design의 어딘가에서 관련 없는 logic element 와 의도치 않게 일치할 수 있다는 것입니다. 따라서 "metaguard"보다 덜 일반적인 것을 선택하는 것이 좋습니다.

get_nets -hierarchical

get_nets는 get_cells와 동일한 규칙을 따릅니다. -hierarchical이 없으면 get_nets는 pattern와 일치하는 top-level hierarchy 에서 모든 nets를 찾습니다. -hierarchical에서 pattern은 object의 이름과만 일치합니다. pattern에 hierarchy separator가 있으면 결과는 항상 비어 있습니다.

> get_nets pll_i/clk_i*
pll_i/clk_in1
> get_nets clk_i*
WARNING: [Vivado 12-507] No nets matched 'clk_i*'.
> get_nets -hierarchical clk_i*
pll_i/clk_in1 pll_i/inst/clk_in1
> get_nets -hierarchical pll_i/clk_i*
WARNING: [Vivado 12-507] No nets matched 'pll_i/clk_i*'.

get_pins -hierarchical

get_pins가 -hierarchical와 함께 사용될 때 pattern은 baz_reg/Q, clkout1_buf/I 등과 같이 pin의 전체 이름과 일치합니다. "/"는 hierarchy separator가 아닌 이름의 일부로 간주됩니다. 즉, cell 의 이름과 pin의 식별자 사이에 있는 character는 wildcard로 대체될 수 있습니다. 이는 마지막 hierarchy separator 와 -hierarchical이 사용되는 경우에만 해당됩니다.

예를 들면 다음과 같습니다.

> get_pins -hierarchical clkout1_buf/*
pll_i/inst/clkout1_buf/O pll_i/inst/clkout1_buf/CE pll_i/inst/clkout1_buf/I
> get_pins -hierarchical clkout1_bu*
pll_i/inst/clkout1_buf/O pll_i/inst/clkout1_buf/CE pll_i/inst/clkout1_buf/I
> get_pins -hierarchical clkout1_buf
WARNING: [Vivado 12-508] No pins matched 'clkout1_buf'.

clkout1_bu*는 clkout1_buf/O 와 일치합니다. "*"는 -hierarchical때문에 "/O"로 대체될 수 있습니다.

get_cells와 마찬가지로 pattern에 hierarchy separator가 있으면 결과는 항상 비어 있습니다. 이것은 위의 예와 모순되지 않습니다. 언급했듯이 마지막 "/"는 pin이름의 일부로 간주됩니다.

> get_pins pll_i/inst/clkout1*/I
pll_i/inst/clkout1_buf/I
> get_pins -hierarchical pll_i/inst/clkout1*/I
WARNING: [Vivado 12-508] No pins matched 'pll_i/inst/clkout1*/I'.

> get_pins -hierarchical pll_i/inst/*/*
WARNING: [Vivado 12-508] No pins matched 'pll_i/inst/*/*'.
> get_pins -hierarchical pll_i/*/*/*
WARNING: [Vivado 12-508] No pins matched 'pll_i/*/*/*'.
> get_pins -hierarchical pll_i/*/*
WARNING: [Vivado 12-508] No pins matched 'pll_i/*/*'.

> get_pins -hierarchical pll_i/*
pll_i/clk_in1 pll_i/clk_out1 pll_i/clk_out2
> get_pins pll_i/*
pll_i/clk_in1 pll_i/clk_out1 pll_i/clk_out2

-hierarchical이 사용되지 않는 경우 wildcard는 마지막 hierarchy separator가 아니라도 hierarchy separator와 일치하지 않습니다.

> get_pins pll_i/inst/clkout1_buf/I
pll_i/inst/clkout1_buf/I
> get_pins pll_i/inst/clkout1_buf/*
pll_i/inst/clkout1_buf/O pll_i/inst/clkout1_buf/CE pll_i/inst/clkout1_buf/I
> get_pins pll_i/inst/clkout1_bu*
WARNING: [Vivado 12-508] No pins matched 'pll_i/inst/clkout1_bu*'.
> get_pins pll_i/inst/clkout1_bu*/*
pll_i/inst/clkout1_buf/O pll_i/inst/clkout1_buf/CE pll_i/inst/clkout1_buf/I

이러한 예에서 get_pins가 얼마나 혼란스러운지 분명합니다. 이전과 마찬가지로 지원되는 경우 -filter 또는 -regexp을 대신 사용하십시오.

요약

wildcards를 logic elements를 찾는 방법으로 사용할 수 있지만 검색 결과가 항상 예상되는 것은 아닙니다. 마찬가지로 -hierarchical 옵션은 일부 시나리오에서 유용할 수 있지만 이 가능성은 search pattern 에 대한 제한과 훨씬 더 혼란스러운 동작과 함께 제공됩니다.

따라서 logic elements를 선택하기 위해 다른 방법을 사용하는 것이 좋습니다. FPGA tools에서 -filter, -regexp 또는 -of_objects를 지원하는 경우 이러한 옵션 중 하나가 더 나은 솔루션일 수 있습니다. 간단한 wildcards를 사용하는 것은 이러한 다른 옵션을 사용할 수 없거나 특정 시나리오에서 아무것도 유용하지 않은 경우에만 의미가 있습니다. 이 상황에서는 search pattern의 의미에 대해 특별히 주의를 기울이는 것이 중요합니다.

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