最新のデジタルロジックデバイスは、通常(*)「同期設計手法」で設計されています。グローバル同期エッジトリガーレジスタ転送デザインスタイル(RTL):すべてのシーケンシャル回路は、グローバルクロック信号CLKに接続されたエッジトリガーレジスタに分割されます。純粋な組み合わせ論理。
その設計スタイルにより、タイミングに関係なくデジタルロジックシステムをすばやく設計できます。それらのシステムは、内部状態が安定するのに十分な時間がクロックエッジから次のエッジまである限り、「正しく動作」します。
このデザインスタイルでは、「このシステムの最大クロックレートはいくつですか」を理解することを除いて、クロックスキューやその他のタイミング関連の問題は関係ありません。
正確にはクロックスキューとは何ですか?
例えば:
...
R1 - register 1 R3
+-+
->| |------>( combinational ) +-+
...->| |------>( logic )->| |--...
->|^|------>( )->|^|
+-+ ( ) +-+
| +--->( ) |
CLK | +->( ) CLK
| |
R2: | |
+-+ | |
...->| |->+ |
->|^|->--+
+-+
|
CLK
実際のハードウェアでは、「CLK」信号はすべてのレジスタで正確に同時に切り替わることはありません。スキュークロック Tskewだけ上流クロック(下流クロックの相対的な遅延です)。
Tskew(ソース、宛先)= destination_time-source_time
ここで、source_timeはアップストリームソースレジスタ(この場合はR1またはR2)でのアクティブクロックエッジの時間であり、destination_timeはいくつかのダウンストリームデスティネーションレジスタ(この場合はR3)での「同じ」アクティブクロックエッジの時間です。 。
- 負のクロックスキュー:R1のクロックの前にR3のCLKが切り替わります。
- 正のクロックスキュー:R3のCLK はR1のクロックの後に切り替わります。
クロックスキューの影響は何ですか?
(おそらく、ここのタイミング図はこれをより明確にするでしょう)
物事が適切に機能するためには、最悪の場合でも、R3のセットアップ時間またはホールド時間中にR3の入力が変化してはなりません。さらに悪いことに、物事が適切に機能するためには、次のように物事を設計する必要があります。
Tskew(R1、R3)<Tco-Th。
Tclk_min = Tco + Tcalc + Tsu-Tskew(R1、R3)。
どこ:
- Tcalcは、システム内の任意の場所にある組み合わせロジックのブロックの最悪の場合の最大整定時間です。(クリティカルパス上にある組み合わせロジックのブロックを再設計したり、部品を上流または下流に押し込んだり、パイプライン処理の別の段階を挿入したりできるため、新しい設計のTcalcが小さくなり、クロックレートを上げることができます) 。
- Tclk_minは、1つのアクティブクロックエッジから次のアクティブクロックエッジまでの最小時間です。上式から計算します。
- 津はレジスタのセットアップ時間です。レジスタの製造元は、この要件を常に満たすのに十分遅いクロックを使用することを期待しています。
- Thはレジスタホールドタイムです。レジスタの製造元は、常にこの要件を満たすのに十分なクロックスキューを制御することを期待しています。
- Tcoは、クロックから出力への遅延(伝播時間)です。各アクティブクロックエッジの後、R1とR2は、新しい値に切り替える前に、短時間Tcoの間、古い値を組み合わせロジックに駆動し続けます。これはハードウェアによって設定され、製造元によって保証されますが、TsとTh、および製造元が通常の操作に対して指定するその他の要件を満たしている場合に限ります。
正のスキューが多すぎると、軽減できない災害になります。正のスキューが多すぎると(一部のデータの組み合わせにより)、「スニークパス」が発生し、R3がクロックN + 1で「正しいデータ」をラッチするのではなく(クロックNで以前にR1およびR2にラッチされたデータの確定関数) 、クロックN + 1でR1とR2にラッチされた新しいデータはリークし、組み合わせロジックを混乱させ、誤ったデータが「同じ」クロックエッジN + 1でR3にラッチされる可能性があります。
負のスキューは、クロックレートを遅くすることで「修正」できます。R1とR2がクロックエッジNで新しいデータをラッチし、その後にR3をラッチした後、R3の入力に安定する時間を与えるために、システムをより遅いクロックレートで強制的に実行するという意味で「悪い」だけです。 「次の」クロックエッジN + 1で結果をラッチします。
多くのシステムは、スキューをゼロにしようとするクロック分配ネットワークを使用しています。直感に反して、クロックパス(クロックジェネレーターから各レジスターのCLK入力までのパス)に沿って遅延を注意深く追加することにより、クロックエッジの波面が1つのレジスターのCLK入力から物理的に移動する見かけの速度を上げることが可能です。次のレジスタのCLK入力を光速よりも速くします。
アルテラのドキュメントには言及します
「クロックパスで組み合わせロジックを使用することは、クロックスキューの原因となるため避けてください。」
これは、グローバルCLK信号以外の何かが何らかのレジスタのローカルCLK入力を駆動するような方法でFPGAにコンパイルされるHDLを書き込む人が多いことを示しています。(これは、特定の条件が満たされた場合にのみ新しい値がレジスターにロードされる「クロックゲーティング」ロジック、またはNクロックのうち1つだけを通過させる「クロックディバイダー」ロジックなどです)。そのローカルCLKは通常、なんらかの方法でグローバルCLKから派生します-グローバルCLKは刻み、ローカルCLKは変化しないか、または(信号がその「何か他のもの」を介して伝播するためのグローバルCLK後の短い遅延)ローカルCLKは一度変更されます。
その「他の何か」がダウンストリームレジスタ(R3)のCLKを駆動すると、スキューがより正になります。その「何か他のもの」がアップストリームレジスタ(R1またはR2)のCLKを駆動すると、スキューがより負になります。時々、アップストリームレジスタのCLKを駆動するものとダウンストリームレジスタのCLKを駆動するものは、実質的に同じ遅延を持ち、それらの間のスキューを実質的にゼロにします。
一部のASIC内のクロック分配ネットワークは、一部のレジスタで少量の正のクロックスキューを使用して意図的に設計されています。これにより、組み合わせロジックのアップストリームが安定するまでの時間がわずかに増えるため、システム全体をより高速なクロックレートで実行できます。これは「クロックスキュー最適化」または「クロックスキュースケジューリング」と呼ばれ、「リタイミング」に関連しています。
私はまだset_clock_uncertainty
コマンドに戸惑っています-なぜ手動でスキューを「手動で指定」したいのですか?
(*)1つの例外:
非同期システム。