このページは、このページの前に読む必要がある別のページへの追加です。どちらのページも一連のページの一部であり、 timing 計算の背後にある理論を説明し、いくつかの timing constraints の書き方を示し、 timing closureの原理について説明しています。
必要でない限り、単純な search patterns を使用しないでください。
このページでは、 wildcards を使用して timing constraints を SDC 形式で書き込む方法について説明します。 wildcards は複数の Tcl commandsで使用できますが、このページでは通常「-hierarchical」オプションをサポートする commands に焦点を当てています。 get_cells、 get_pins 、 get_nets。これらの Tcl commands については別のページで説明されています。ただし、一部の FPGA tools は、これら3つの commandsすべてで「-hierarchical」をサポートしていないことに注意してください。
残念ながら、これら 3 つの commands の検索機能は非常に限られており、混乱を招く可能性があります。 wildcard がどのように機能するかを正確に理解していないと、検索結果が予期しないものになる可能性があります。特に、「-hierarchical」を使用すると、以下に示すように驚くべき結果が得られます。
このため、特定の FPGA tool が関連する commandをサポートしている場合は、常に「-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内の既知の位置を持つ 1 つの特定の 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の挙動
2 つの一般的な wildcardsがあります。
- アスタリスク ("*") は、任意の数の charactersを置き換えます。
- 1 つの characterを置換する疑問符 ("?")。
ただし、これら 2 つの 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」は、 designの hierarchyのすべての位置に search pattern が適用されていることを意味します。上記の例では、「*/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 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 は pinの完全な名前 ( baz_reg/Q、 clkout1_buf/I など) と一致します。「/」は名前の一部と見なされ、 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 (とりわけ) と一致することに注意してください。 「*」を「/O」に置き換えることができるのは、 -hierarchicalがあるからです。
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と一致しないことに注意してください。
> 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 を使用してください。
概要
logic elementsを検索する方法として wildcards を使用できますが、検索結果が必ずしも期待どおりになるとは限りません。同様に、 -hierarchical オプションはいくつかのシナリオで役立ちますが、この可能性には search pattern の制限と、さらに複雑な動作が伴います。
したがって、 logic elementsを選択するには、他の方法を使用することをお勧めします。 FPGA toolsで -filter、 -regexp 、または -of_objects がサポートされている場合は、これらのオプションのいずれかがおそらくより適切なソリューションです。単純な wildcards の使用は、これらの他のオプションがいずれも利用できないか、特定のシナリオでいずれも役に立たない場合にのみ意味があります。この状況では、 search patternの意味について特に注意することが重要です。