クロックスキュー(タイミングスキューとも呼ばれる)は、同期デジタル回路システム(コンピュータシステムなど)において、ゲート遅延、あるいはより高度な半導体技術においては配線遅延によって、同一のクロック信号が異なるコンポーネントに異なるタイミングで到達する現象である。任意の2つのクロックの読み取り値の瞬間的な差をスキューと呼ぶ。
ほとんどのデジタル回路の動作は、「クロック」と呼ばれる周期的な信号によって同期されます。このクロックは、回路上のデバイスのシーケンスとペースを決定します。このクロックは、単一のソースから回路のすべてのメモリ要素(例えば、レジスタやフリップフロップ)に分配されます。エッジトリガ型レジスタを使用する回路では、クロックのエッジ(ティック)がレジスタに到達すると、レジスタはレジスタ入力をレジスタ出力に転送し、これらの新しい出力値は組み合わせ論理回路を通って次のクロックティックのレジスタ入力値となります。
理想的には、各メモリ要素への入力は次のクロックサイクルまでに最終値に達し、回路全体の動作を正確に予測できる。システムが動作できる最大速度は、物理的な構成、温度、経路長の違いによって回路のさまざまな要素間で生じるばらつきを考慮に入れなければならない。
同期回路では、2 つのレジスタまたはフリップフロップが論理パスで接続されている場合、それらは「順次隣接している」と言われます。ソースレジスタとデスティネーションレジスタのクロックピンへのクロック到着時間がそれぞれ T C iと T C jに等しい、順次隣接する 2 つのレジスタ R iと R jが与えられた場合、クロックスキューは次のように定義できます。T skew i, j = T C i − T C j。
クロックスキューは、配線の長さ、温度変化、中間デバイスのばらつき、容量結合、材料の不完全性、クロックを使用するデバイスのクロック入力の入力容量の違いなど、さまざまな要因によって引き起こされる可能性があります。回路のクロックレートが高くなるにつれて、タイミングはより重要になり、回路が正しく機能するためには、許容できる変動幅は小さくなります。
クロックスキューには、負のスキューと正のスキューの2種類があります。正のスキューは、受信レジスタが送信レジスタよりも遅れてクロックティックを受信する場合に発生します。負のスキューはその逆で、送信レジスタが受信レジスタよりも遅れてクロックティックを受信する場合に発生します。クロックスキューがゼロとは、送信レジスタと受信レジスタにクロックティックが同時に到着することを意味します。[ 1 ]
クロックスキューによって発生する違反には、2種類あります。1つ目は、クロックが最初のレジスタに到達し、2番目のレジスタへのクロック信号が最初のレジスタの出力から2番目のレジスタへの信号よりも遅く伝わる場合に発生する問題です。つまり、最初のレジスタの出力が2番目のレジスタの入力に早く到達するため、クロックが入り、2番目のレジスタの初期データが置き換えられたり、ラッチされたデータの整合性が損なわれたりする可能性があります。これは、以前のデータが宛先フリップフロップで十分に保持されず、適切にクロックが通らないため、ホールド違反と呼ばれます。もう1つの問題は、宛先フリップフロップがソースフリップフロップよりも早くクロックティックを受信する場合に発生します。この場合、データ信号は次のクロックティックが来る前に宛先フリップフロップに到達する時間が短くなります。到達できない場合、セットアップ違反が発生します。これは、次のクロックティックが来る前に新しいデータがセットアップされて安定していなかったためです。ホールド違反は、クロック周期を長くしても修正できないため、セットアップ違反よりも深刻です。正のスキューと負のスキューは、それぞれセットアップとホールドのタイミング制約に悪影響を与えることはありません(以下の不等式を参照)。
信号が回路を広くクロックする場合、その信号が開始する信号/状態遷移は、次の状態遷移を信号する前に安定化する必要があり、それがクロックの上限周波数を制限します。したがって、スキューは回路が正しく動作するクロック周波数を低下させます。パスで接続された各ソースレジスタとデスティネーションレジスタについて、次のセットアップとホールドの不等式を満たす必要があります。
どこ
正のクロックスキューはセットアップ違反の修正には有効ですが、ホールド違反を引き起こす可能性があります。負のクロックスキューはホールド違反を防ぐことができますが、セットアップ違反を引き起こす可能性があります。
上記の不等式では、ジッタを考慮するために単一のパラメータJが使用されます。このパラメータは、すべてのソースレジスタ/デスティネーションレジスタペアにおけるジッタの差の上限値でなければなりません。ただし、クロック分配ネットワークの構造が既知であれば、異なるソースレジスタ/デスティネーションレジスタペアは異なるジッタパラメータを持つ可能性があり、ホールド制約にはセットアップ制約の値とは異なるジッタ値を使用できます。たとえば、ソースレジスタとデスティネーションレジスタが共通の近くのクロックバッファからクロック信号を受信する場合、そのクロック信号の変動が両方のレジスタに等しく影響するため、そのホールド制約のジッタ上限値は非常に小さくすることができます。同じ例で、ジッタはクロックティックごとに変化する可能性があるため、セットアップ制約のジッタ上限値はホールド制約のジッタ上限値よりも大きくなければなりません。ソースレジスタが、デスティネーションレジスタに信号を供給するリーフバッファから遠く離れたクロック分配ネットワークのリーフバッファからクロック信号を受信する場合、2つのレジスタへのクロックパスが異なるため、ジッタの上限値はより大きくする必要があります。これらのレジスタには、異なるノイズ源が混入する可能性があるためです。


図 1 と図 2 は、意図的なクロック スキューが同期回路にメリットをもたらす状況を示しています。[ 2 ] 図 1 のゼロ スキュー回路では、長いパスがフリップフロップ FF1 からフリップフロップ FF2 まで伸びており、FF2 から FF3 まではシフト レジスタ パスなどの短いパスが伸びています。FF2 -> FF3 パスは、ホールド違反が発生する危険なほど近くにあります。FF3 でわずかな余分なクロック遅延が発生すると、クロックが到着して FF3 の Q 出力にクロックが渡される前に、FF3 の D 入力のデータが破壊される可能性があります。これは、FF2 と FF3 が物理的に近接していても、クロック入力がクロック分配ネットワークの異なるリーフ バッファから来ている場合に発生する可能性があります。
図2は、意図的なクロックスキューによってこの問題を解決する方法を示しています。FF2のクロック入力の前にわずかな遅延を挿入することで、FF2→FF3パスがホールド違反から安全に回避されます。さらに、この追加のクロック遅延によって、FF1→FF2パスのセットアップ制約も緩和されます。FF1→FF2パスは、クロックスキューがゼロの場合に必要なクロック周期よりも短いクロック周期で正しく動作できます。この短いクロック周期は、追加されたクロック遅延バッファの遅延分に相当します。
意図的なクロックスキューに関するよくある誤解は、それがゼロクロックスキューよりも必ずしも危険である、あるいはクロック分配ネットワークの遅延をより精密に制御する必要があるというものです。しかし、誤動作に近いのは図1のゼロスキュー回路です。FF2→FF3ペアにわずかな正のクロックスキューがあるとホールド違反が発生しますが、図2の意図的なスキュー回路は、クロック分配における意図しない遅延変動に対してより寛容です。
個々のレジスタへのクロック到着時間を、回路を通るすべてのパスのセットアップとホールドの不等式を満たしながらクロック周期を最小化するために調整する変数とみなすと、結果として線形計画問題が得られます。[ 3 ] この線形計画では、クロックスキューがゼロであることは単なる実行可能な点であり、線形計画の解は一般的に、スキューがゼロの場合よりも短いクロック周期を与えます。さらに、セットアップ時間とホールド時間、およびジッタの上限を線形計画で適切に設定することにより、スキューがゼロの場合以上の安全マージンを保証できます。
この線形計画問題は単純な形式であるため、解を求めるためのアルゴリズムは簡単にプログラムできます。[ 2 ] VLSIおよびFPGA設計用のほとんどのCADシステムには、クロックスキューを最適化する機能が含まれています。
クロックソースから各クロックレジスタまでのクロック遅延の静的な差によるクロックスキューに加えて、クロック信号は完全に周期的ではないため、クロック周期またはクロックサイクル時間は単一のコンポーネントでも変動し、この変動はクロックジッタとして知られています。クロック分配ネットワークの特定のポイントでは、ジッタがクロックタイミングの不確実性に寄与する唯一の要因となります。
近似的に、2つのレジスタ間のクロックタイミングの不確実性の合計を、空間クロックスキュー(クロックソースからのクロック遅延の空間的な差)とクロックジッタ(ネットワーク内の特定のポイントにおけるクロックの非周期性)の合計として議論することがしばしば有効です。残念ながら、空間クロックスキューは、電源、局所的な温度、および他の信号とのノイズ結合における局所的な時間依存の変動により、サイクルごとに時間的に変化します。
したがって、送信レジスタと受信レジスタが異なる場所にある通常のケースでは、クロックタイミングの不確実性全体を空間スキューとジッタに明確に分離する方法はありません。そのため、一部の著者は、空間クロックスキューとクロックジッタの合計を表すためにクロックスキューという用語を使用しています。これはもちろん、2点間のクロックスキューがサイクルごとに変化することを意味しますが、これはめったに言及されない複雑さです。他の多くの著者は、クロック時間の空間的変動のみをクロックスキューという用語で表し、残りのクロックタイミングの不確実性全体をクロックジッタという用語で表しています。これはもちろん、クロックジッタが各コンポーネントで異なる必要があることを意味しますが、これもまためったに議論されません。
幸いなことに、多くの場合、空間クロックスキューはサイクルごとにほぼ一定であるため、残りのクロックタイミングの不確実性は、単一の共通クロックジッタ値で十分に近似できます。
インターネットなどのネットワークでは、クロックスキューは、ネットワーク内の異なるクロックの周波数の差(オフセットの時間微分)を表します。 [ 4 ]ホスト間で比較可能なタイムスタンプを必要とするネットワーク操作は、クロックスキューの影響を受ける可能性があります。クロックスキューを低減し、より安定した機能を実現するために、多くのプロトコル(Network Time Protocolなど)が設計されています。一部のアプリケーション(ゲームサーバーなど)は、クロックスキューによる信頼性の問題を回避するために、独自の同期メカニズムを使用する場合もあります。
クロックスキューは、高速または長距離の場合に、パラレルインターフェース(パラレルSCSIなど)よりもシリアルインターフェース(シリアルアタッチドSCSIやUSBなど)が好まれる理由です。