インテル® Quartus® Primeプロ・エディションのユーザーガイド: タイミング・アナライザー

ID 683243
日付 1/31/2023
Public
ドキュメント目次

2.6.1.4. クロックグループの設定 (set_clock_groups)

Set Clock Groups (set_clock_groups) 制約を使用すると、デザイン内の無関係のクロックを指定することができます。デフォルトでは、タイミング・アナライザーは、共通のベースまたは親クロックをもつクロックはすべて関連しており、それらのクロックドメイン間の転送はすべてタイミング解析に有効であると想定します。クロックグループを切断することにより、特定のクロックドメイン間の転送をタイミング解析から除外することができます。

逆に、共通の親クロックまたはベースクロックをもたないクロックに関連はありませんが、タイミング解析にはそのようなクロック間の転送が含まれます。ただし、クロックが異なるクロックグループにある場合 (またはクロックのパスがすべてフォルスパス制約で切断されている場合) を除きます。

各グループに含めるクロック信号を定義し (-group)、異なるグループ間の関係を指定します。その後、グループが相互に Logically exclusive (-logically_exclusive)、Physically exclusive (-physically_exclusive)、または Asynchronous (-asynchronous) かを指定します。

set_clock_groups -asynchronous -group {<clock1>...<clockn>} ... \
    -group {<clocka>...<clockn>}
  • -logically_exclusive - 論理的に排他的で、同時にアクティブにならないクロックを定義します (多重化されているクロックなど)
  • -physically_exclusive - 物理的にデバイスに同時に存在できないクロックを定義します
  • -asynchronous - 理想的なクロックソースが異なる完全に無関係なクロックを定義します。このフラグは、クロックがどちらも切り替わっていることを意味しますが、同期してデータを渡すことができるものではありません。

例えば、8ns クロックと 10ns クロックの間にパスがある場合、クロックが完全に非同期であっても、それらに関連がないことを指定しない限り、タイミング・アナライザーはこれらのクロックの間で 2ns のセットアップ関係を満たそうとします。

次の例は、クロック・マルチプレクサーに向けた制約です。2 つの入力、マルチレート・クロックがあり、適切な論理および物理的排他性の組み合わせを備えています。

# First profile
create_clock -name clk_a1 -period 10 [get_ports clk_a]
create_clock -name clk_b1 -period 20 [get_ports clk_b]

# Second profile
create_clock -name clk_a2 -period 100 [get_ports clk_a] -add
create_clock -name clk_b2 -period 200 [get_ports clk_b] -add

# Mark base clocks as asynchronous to each other
set_clock_groups -asynchronous -group {clk_a?} -group {clk_b?}

# Define muxed clocks for each profile
set muxout [get_pins -compatibility_mode {mux*|combout}]
foreach profile {1 2} {
     set mux_clk_a "mux_clk_a${profile}"
     set mux_clk_b "mux_clk_b${profile}"
     
     create_generated_clock -name $mux_clk_a -source [get_ports clk_a] \
          -master_clock "clk_a${profile}" $muxout -add
     create_generated_clock -name $mux_clk_b -source [get_ports clk_b] \
          -master_clock "clk_b${profile}" $muxout -add
     
     # Mark each muxed clock as logically exclusive to each other
     set_clock_groups -logically_exclusive -group $mux_clk_a \
          -group $mux_clk_b
}

# Mark profile clocks as physically exclusive to each other
# (Do this after defining the derived clocks so they get cut too)
set_clock_groups -physically_exclusive -group {*clk_?1} \
     -group {*clk_?2}
図 92. 制約例のデザイントポロジー

Set Clock Groups ダイアログボックスでは 2 つのクロックグループのみが許可されますが、.sdc ファイルでは、-group {<group of clocks>} オプションを無制限に指定することができます。関係のないクロックを割り当てから除外すると、タイミング・アナライザーは保守的に動作し、クロックが接続する他のすべてのドメインとのコンテキストでそのクロックを解析します。

タイミング・アナライザーは現在、クロストークを明示的に解析しません。代わりに、タイミングモデルで追加のガードバンドを使用し、クロストークを原因とする潜在的な遅延を考慮します。タイミング・アナライザーは、クロストーク関連の解析では、-asynchronous オプションと -exclusive オプションを同じように扱います。最大スキューレポートやシンクロナイザー検出などでは、非同期クロックグループと排他的クロックグループは個別に扱われます。

単一の割り当てでクロックを複数のグループ (-group) に含めることはできません。ただし、複数の set_clock_groups 割り当てを使用することができます。

クロック間のタイミングを切断する別の方法は、set_false_path を使用することです。sys_clkdsp_clk の間のタイミングを切断する場合は、次のようになります。

set_false_path -from [get_clocks sys_clk] -to [get_clocks dsp_clk]
set_false_path -from [get_clocks dsp_clk] -to [sys_clk]

この手法はクロックの数が少ない場合には効果的ですが、多数の制約がある場合は管理が難しくなる可能性があります。3 つの PLL を備え、複数の出力があるシンプルなデザインの場合、set_clock_groups コマンドではクロック間のタイミングの切断を 10 行未満で行うことができます。一方、set_false_path コマンドでは、50 行以上が必要になる場合があります。