이 페이지는 이 페이지보다 먼저 읽어야 하는 다른 페이지 의 추가 기능입니다 . 두 페이지 모두 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가 있습니다.
- 임의 개수의 characters를 대체하는 별표("*").
- 하나의 character를 대체하는 물음표("?").
하지만 이 두 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는 다음 가능성으로 제한됩니다.
- hierarchy 의 특정 위치에서 cells를 검색합니다( -hierarchical을 사용하지 않는 경우).
- -hierarchical을 사용하여 전체 FPGA design에서 cells를 검색합니다.
- 지원되는 경우 -filter 또는 -regexp을 대신 사용하십시오. 이러한 옵션은 이러한 방식으로 제한되지 않습니다.
이 예는 특정 이름 형식을 사용하여 모든 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의 의미에 대해 특별히 주의를 기울이는 것이 중요합니다.