01signal.com

SDC timing constraints에서 wildcards 및 -hierarchical 사용

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

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

이 페이지에서는 wildcards를 사용하여 timing constraints를 SDC 형식으로 작성하는 방법을 설명합니다. wildcards를 여러 Tcl 명령과 함께 사용할 수 있지만 이 페이지에서는 일반적으로 "-hierarchical" 옵션을 지원하는 명령에 중점을 둡니다. get_cells, get_pins 및 get_nets. 이러한 Tcl 명령 은 다른 페이지에서 설명합니다 . 그러나 일부 FPGA 도구는 이 세 가지 명령 모두에서 "-hierarchical"를 지원하지 않습니다.

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

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

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

간단한 search patterns

logic elements 및 기타 objects를 찾는 명령은 search pattern와 함께 또는 search pattern없이 사용할 수 있습니다. search pattern이 없으면 관련된 모든 objects가 검색됩니다. 예를 들어, top-level hierarchy에서 모든 pins를 찾으려면:

get_pins

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

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에서 정확한 위치를 지정할 필요가 없으며 단일 명령으로 전체 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이 사용될 때 도구는 오류로 응답하지 않습니다. 대신 응답은 아무것도 찾을 수 없다는 것입니다.

3개의 Tcl 명령(get_cells, get_pins 및 get_nets)에는 각각 search pattern을 제한하는 자체 규칙이 있습니다. 정확한 제한 사항을 알아보려면 FPGA 도구 설명서를 참조하십시오. 표준 해석( 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 에서는 아무 것도 찾을 수 없기 때문입니다. 그러나 도구는 오류로 응답하지 않고 대신 명령이 결과를 생성하지 않습니다.

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

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

set_false_path -to [get_cells -hierarchical *metaguard*]

이와 같은 timing constraint 의 경우 metastability guards로 사용되는 모든 registers 에 "metaguard"라는 단어가 포함된 이름을 사용하면 충분합니다. 그러나이 timing constraint 의 위험은 표현이 의도하지 않게 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를 선택하기 위해 다른 방법을 사용하는 것이 좋습니다. -filter, -regexp 또는 -of_objects가 FPGA 도구에서 지원되는 경우 이러한 옵션 중 하나가 더 나은 솔루션일 수 있습니다 . 간단한 wildcards를 사용하는 것은 이러한 다른 옵션을 사용할 수 없거나 특정 시나리오에서 유용하지 않은 경우에만 의미가 있습니다. 이 상황에서 search pattern의 의미에 대해 각별한 주의를 기울이는 것이 중요합니다.

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