01signal.com

SDC timing constraintsでの wildcards と -hierarchical の使用

このページは、このページの前に読む必要がある別のページへの追加です。どちらのページも一連のページの一部であり、 timing 計算の背後にある理論を説明し、いくつかの timing constraints の書き方を示し、 timing closureの原理について説明しています。

必要でない限り、単純な search patterns を使用しないでください。

このページでは、 timing constraints を SDC 形式で書き込むために wildcards を使用する方法について説明します。 wildcards は複数の Tcl コマンドで使用できますが、このページでは、通常 "-hierarchical" オプションをサポートするコマンドに焦点を当てています。 get_cells、 get_pins 、 get_nets。これらの Tcl コマンドは、別のページで説明されています。ただし、一部の FPGA ツールは、これら 3 つのコマンドすべてで「-hierarchical」をサポートしていないことに注意してください。

残念ながら、これら 3 つのコマンドの検索機能はかなり制限されており、混乱を招く可能性があります。 wildcard がどのように機能するかを正確に理解していないと、検索結果が予期しないものになる可能性があります。特に、「-hierarchical」を使用すると、以下に示すように驚くべき結果が得られます。

このため、特定の FPGA ツールが関連するコマンドでサポートしている場合は、常に"-filter" オプションを使用することをお勧めします。そのようなサポートがない場合は、単純な wildcardsを使用するしかありません。

このページのすべての例は、他の関連ページと同じ Verilog コードに基づいています。

シンプルな search patterns

logic elements およびその他の objects を検出するコマンドは、 search patternの有無にかかわらず使用できます。 search patternがなければ、関連するすべての objects が見つかります。たとえば、 top-level hierarchyですべての pins を検索するには、次のようにします。

get_pins

そして、 FPGA design 全体ですべての pins を見つけるコマンドは次のとおりです。

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があります。

ただし、これら 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内の正確な位置を指定する必要がなくなり、1 つのコマンドで 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 コマンド (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 は 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を選択するには、他の方法を使用することをお勧めします。 -filter、 -regexp 、または -of_objects が FPGA ツールでサポートされている場合、これらのオプションのいずれかがおそらくより適切なソリューションです。単純な wildcards の使用は、これらの他のオプションが使用できない場合、または特定のシナリオで有用なオプションがない場合にのみ意味があります。このような状況では、 search patternの意味について特に注意することが重要です。

このページは英語から自動翻訳されています。 不明な点は元のページを参照してください。
Copyright © 2021-2024. All rights reserved. (6f913017)