グリッチのないクロックスイッチングロジックの実装



Implementation Glitch Free Clock Switching Logic



グリッチを回避するためのクロックスイッチングロジックの原理

最初に現在のクロックをオフにしてから、ターゲットクロックをオンにします。オフかイネーブルかに関係なく、クロックグリッチの発生を防ぐために、現在のクロックまたはターゲットクロックのイネーブル信号の遷移がクロックがローの期間中に実行されることを確認する必要があります。



以下はその一例です。




左側の赤い点線のフレームで、段階的に分析してみましょう。

1)4 Dフリップフロップを取り外した後、それは本質的にRSフリップフロップです。以下に示すように:



図2RSトリガー図2RSトリガー

RSトリガーを選択する理由は2つあります。まず、それは防振である可能性があります。 part0_aを例にとると、Selが1から0にジャンプする場合、それが非常に短いグリッチである場合、sel +が1から0にジャンプするには遅すぎる可能性があるため、sel-も0のままであるため、グリッチによるジッター。次に、フィードバックを使用して、クロックを安全な順序で切り替えます。つまり、最初に現在のクロックをオフにしてから、ターゲットクロックをオンにします。オフかイネーブルかに関係なく、クロックグリッチの発生を防ぐために、現在のクロックまたはターゲットクロックのイネーブル信号の遷移がクロックがローの期間中に実行されることを確認する必要があります。

2)信号同期を選択します

clk0とclk1は通常非同期クロックであるため、同期後にsel +とsel-を使用する必要があります。これは、図1の2つのパス上の2つのDFFの最初のDFFの役割です。「」とマークされた図1は、「2ステージDFF同期回路として追加できます」


3)クロックゲーティング

クロック切り替え時にグリッチが発生しないようにするための最後のステップは、選択信号sel +またはsel-を同期させてから、クロックゲーティングを再度実行することです。図1の「クロックゲーティングラッチ」に示されているように。


上記の2)で述べたように、最良の実装回路は次のとおりです。



DFFは3レベルに増加し、最初の2レベルの同期出力は、clkゲーティングセル(ICG)のイネーブル端子入力として使用されます。同期+クロックゲーティング+ RSトリガー、グリッチのないクロックスイッチング回路を実現する3つの手段。

合成中の上記のクロックスイッチングロジックに対するSdcの制約:

1) clk0とclk1は非同期クロックと見なすことができ、タイミング分析中に次の設定を行うことができます。
set_clock_groups –asynchronous –name asyn_clk_group
-グループ[get_clocksclk0]
-グループ[get_clocksclk1]


2)クロックスイッチング分析
実際の設計では、上記の1)に示すように、clk0とclk1を非同期クロック関係として直接設定しない場合があります。たとえば、clk0とclk1は分周されたクロックの関係であり、非同期クロックではありません。このとき、以下の設定ができます。

Clk0パスの最初のdffとclk1の3番目のdffにはパスがあります。 Clk1のdff3の出力が変化すると、その変化はclk0の3つのdffによって同期されるため、パスをfalseパスに設定できます。
Clk1パスの最初のdffとclk0の3番目のdffにはパスがあります。
set_false_path -from [get_cells dff13 to [get_cells dff00]
set_false_path -from [get_cellsdff03から[get_cellsdff10]

一般に、チップ全体でこの種のグリッチのないclk muxが多くなります。次の方法を使用して、関連するすべてのパスをfalseパスに設定できます。グリッチのないclkmuxのモジュール名がmux_clk_gfreeであると想定します(一意化するため、合成後のネットリスト内の各muxのインスタンス化された名前は、chip_mux_clk_gfree_0_0、chip_mux_clk_gfree_1_0など、わずかに異なります。したがって、* mux_clk_gfree *がで使用されます。次の正規表現)。

foreach_in_collection a [get_cells –hier * -filter“ ref_name =〜* mux_clk_gfree *”] {
セット名[get_object_name $ a]
set_false_path –from [get_cells $ {name} / dff13]
-[get_cells $ {name} / dff00へ
set_false_path –from [get_cells $ {name} / dff03]
-[get_cells $ {name} / dff10へ
}