このページは、マルチギガビット・トランシーバ(MGT)を紹介する一連のページの 7 ページ目です。
はじめに
FPGA の MGT を設定する作業の大半は、データの処理や正しいプロトコルの選択に関するものだと考えるのが自然です。そのため、クロッキングを正しく行うためにどれだけの時間と労力が必要かに驚かれるかもしれません。その労力のほとんどは、通常、MGT が提供するクロックリソース関連のさまざまなオプションと、それらが課す制約を整理することに費やされます。
MGT のクロックに関連する設計規則は FPGA ごとに異なるため、このトピックに関する正確かつ包括的な情報を得るための信頼できる唯一の情報源は、MGT 自身のドキュメントです。そうしたドキュメントは通常、メカニズムとその詳細に焦点を当てており、なぜこれらのメカニズムが必要なのかを説明していないことがあります。このページでは、MGT が使うクロックに関連する概念と課題を考察することで、その隙間を埋めようとしています。
PLL と VCO
一般的に、PLL は基準クロック(reference clock)の周波数をある定数倍します。その定数は整数の場合もありますが、小数の場合もあり、1 より小さい場合もあります。つまり、PLL の出力周波数は基準クロックの周波数より低くなることがあります。ただし、MGT で使う PLL でこのような状況はまれであり、ロジックファブリック(logic fabric)用の PLL では役に立つことがあります。
FPGA には、MGT が必要とするクロックを生成するための専用の PLL があります。ロジックファブリックに属する PLL やその他のクロックリソースでは、MGT に必要な周波数をサポートできません。特に、MGT にはデータレートの少なくとも半分の周波数のクロックが必要です。データレートが低い場合には、必要な周波数はそれよりも高くなることがあります。
例えば、データレートが 5 Gb/s の場合、ビットクロックは通常 2.5 GHz で動作します。これは、MGT の SERDES がクロックの両エッジ(DDR)で駆動されるためです。ただし、データレートが比較的低い場合は、MGT の PLL の出力を分周して低い周波数にすることもできます。
ほとんどすべての PLL は同じ原理で動作します。中心となる部分は VCO(Voltage Controlled Oscillator、電圧制御発振器)で、ある範囲の周波数のクロックを生成できます。VCO の出力は、周波数を一定数で割るクロック分周器に入力されます。クロック分周器の出力は、PLL の基準クロックと比較されます。制御メカニズムは、基準クロックとクロック分周器の出力が一致するように VCO の周波数を調整します。言い換えると、これら 2 つの信号は同じ周波数と同じ位相になります。
5 Gb/s の例に戻ると、基準クロックの周波数が 125 MHz だと仮定します。PLL の実装として可能なのは、VCO の出力を 20 で分周することです。分周された信号は基準クロックと比較され、一致するように調整されます。したがって、VCO の周波数は 2500 MHz でなければなりません。2500 MHz / 20 = 125 MHz だからです。
この方法でクロックを生成することは、ビットの送信に適しています。送信側の MGT が、各ビットの時間的開始点と終了点を単独で決めるからです。しかし、MGT がビットを受信するときは、相手側が各ビットのタイミングを決めます。したがって、受信側は到着するデータストリームに適応する必要があります。前のページの 1 つで述べたように、この適応メカニズムはクロックデータリカバリ(CDR)と呼ばれます。CDR の実装は、到着するデータストリームに受信側クロックを同期させるために VCO の周波数を調整する制御ループで構成されます。基準クロックは、VCO を期待される周波数に十分近い初期周波数にするために、時々使用されます。基準クロックは、同期が達成された後は無視されます。
PLL の利用
FPGA 内部の MGT 用 PLL は複雑なテーマです。各 MGT は、複数の PLL のいずれからでもクロックを受け取れます。FPGA プロジェクトの中で、MGT を使うアプリケーションが 1 つだけなら、ツールが通常最適な PLL を自動的に選択します。しかし、プロジェクト内で MGT をさまざまな目的に使う場合は、各 MGT が最も適切な PLL に接続されていることを確認することが重要です。
FPGA には通常、複数の MGT 間で共有される PLL があります。AMD(Xilinx)はこれを QPLL と呼び、Altera には fPLL と ATX PLL があります。一方、特定の MGT にローカルな PLL もあります。これらは CPLL(AMD / Xilinx)または CMU PLL(Altera)と呼ばれます。ローカルな PLL は通常、共有 PLL と比べて品質が低く、機能も少ないものです。その違いは、周波数の範囲、ジッタ(jitter)、基準クロックに対して選択できる逓倍比などに現れます。
FPGA ごとに、PLL と MGT の相互接続方法を定義する複雑な規則のセットがあります。これらの規則は、PLL を FPGA の基準クロック入力に接続する方法も定義します。したがって、すべての MGT が必要なクロックに接続できるとは当然には言えません。これは、ほとんど制約のないロジックファブリック用クロックとは大きく異なります。
したがって、各 MGT にどの PLL を選ぶかを決める前に、データシートを注意深く読むことをお勧めします。特に、PCB を設計する際には、すべての MGT にクロックを供給できることを確認することが重要です。これは、必要な MGT をすべて含む FPGA プロジェクトを作成し、そのインプリメンテーションが成功し、すべてのピンが正しい位置に配置されていることを確認することで行えます。
基準クロック
FPGA には、MGT の PLL を意図した基準クロック(reference clock)用の専用ピンがあります。PCB 設計では、基準クロック入力が、そのクロックを意図した MGT で使えることを確認することが重要です。基準クロック入力、PLL、MGT の間の相互接続は、すべての組み合わせを許すわけではありません。許容される組み合わせは FPGA のドキュメントに記載されていますが、規則が複雑な場合があり、明確な結論に到達するのは難しいことがあります。多くの場合、FPGA プロジェクトを利用して必要な接続がカバーされていることを確認するのが良い方法です。
この目的に使うクロックは、精度が高く、ジッタ(jitter)が低い高品質なものでなければなりません。汎用のクロックチップが生成するクロックを接続してしまうのはよくある誤りです。そうすると、おそらく MGT の性能が低下し、データ配線上のシグナルインテグリティ(signal integrity)の問題やノイズの増加のように見える障害が発生します。
MGT を特定のプロトコル(PCIe、SuperSpeed USB、SATA など)での使用を意図している場合は、基準クロックの要件について FPGA メーカーのドキュメントを読むことをお勧めします。「低ジッタクロックソース」と表示されている電子部品でも、十分でない場合があります。
ジッタはランダムな過程です。ジッタの大きさは重要なパラメータですが、必ずしも十分なパラメータとは限りません。クロックのジッタのランダム性は、クロック周期の速い変動を引き起こすこともあれば、遅い変動を引き起こすこともあります。この点でのジッタの挙動は、ジッタのノイズスペクトルから推定できます。
クロックを生成する部品のデータシートには、ジッタの大きさの数値(通常ピコ秒単位で測定)だけが記載されていることがあります。ジッタのノイズスペクトルに関する情報は、得られないことがよくあります。情報がないにもかかわらず、そのような部品で十分な場合もあります。特に、ジッタの大きさがとにかく極めて低い場合です。この問いに対する単純な答えがないことも多いです。
それでも、基準クロックの品質は MGT をどのように使う場合でも重要です。よく知られたプロトコルの要件は、どのプロジェクトでも使える良い基準となります。また、開発ボード上で基準クロックとして使われている部品と比較することも有用です。
ロジックファブリック用のクロック
MGT とロジックファブリックとのインターフェースに使われるクロックは、MGT 自身の PLL に由来します。これは、PMA 内部ではSERDES が 2 つのクロックに依存しているために必要です。すなわち、物理チャネル上のビットに対応するクロックと、パラレルワードに付随して使われるクロックです。SERDES が正しく動作するには、これら 2 つのクロックが PMA 内部でアライメントされていなければなりません。
一方、ロジックファブリックで使われるクロックは、クロックスキュー(clock skew)が小さくなるように分配しなければなりません。この目的のために、ツールはグローバルクロックバッファを選ぶことがよくあります。クロックバッファからすべての論理要素への伝搬遅延(propagation delay)はほぼ等しいため、クロックのエッジはすべての宛先に同時に到着します。これは、ツールがロジックファブリックに関する正しいタイミング計算を行えるための必要条件です。
この伝搬遅延はすべての配線で一様ですが、必ずしも小さいとは限りません。それどころか、FPGA 内部でクロックバッファと宛先を接続する配線は、かなりの遅延を追加します。これは、これらの接続間の差が小さいため、通常は問題になりません。
しかし、この遅延により、PMA が使う 2 つのクロックは、ロジックファブリックのクロックとアライメントされません。これらの 3 つのクロックのうち 1 つは周波数が高すぎるため、ロジックファブリックのリソースを使ってこれらをアライメントすることは不可能です。それでも、MGT とロジックファブリックは、両側が同期できるクロックを共有しなければなりません。唯一の解決策は、もう 1 つのクロック信号を追加することです。
つまり、各方向につき少なくとも 3 つのクロック信号が関与することになります。
- 物理チャネル上のビットに同期するクロック。このクロックの周波数は、多くの場合データレートの半分です(上の例では 2.5 GHz)。
- PMA 内部のパラレルワードに同期するクロック。このクロックは XCLK と呼ばれることがあります。例えば、PMA が PCS と 32 ビット幅のパラレルワードでやり取りする場合、このクロックは 156.25 MHz です(5000 / 32 = 156.25 だからです)。
- ロジックファブリック用クロック:MGT とロジックファブリックとのインターフェースに付随して使われるクロックです。このクロックは通常、TXUSRCLK2、RXUSRCLK2、tx_coreclkin、rx_coreclkin などの名前を持ちます(下の図では "Tx user clock" と "Rx user clock")。このクロックの周波数は、ロジックファブリックとのインターフェースに使われるパラレルワードの幅に依存します。
一般的に送信と受信ではクロックが別々であることに注意してください。次のブロック図は、MGT 内部のクロックの典型的な分配を示しています。
このブロック図では、各方向につき 3 つではなく 4 つのクロックがあります。これについては次に説明します。
ロジックファブリック用クロックの生成
上で説明したように、ロジックファブリックと MGT に共通のクロックは、ロジックファブリックのクロックバッファで分配しなければなりません。その一方で、このクロックは MGT の内部から生成されなければなりません。
これら 2 つの相反する要件に対する最も単純な解決策から始めましょう。MGT は確かにクロックを生成し、出力ポートで利用できるようにします。この出力ポートは通常、TXOUTCLK、RXOUTCLK、tx_clkout、rx_clkout などと呼ばれます(上図では 4 つ目のクロックで、"Tx out clock" と "Rx out clock" と名付けられています)。この信号は、ロジックファブリックのクロックバッファの入力に入ります。このクロックバッファの出力が、MGT とロジックファブリックのインターフェースに使われるクロック信号です。
この構成の結果、ロジックファブリック用クロックと MGT が生成するクロックとの唯一の違いは、クロックバッファの伝搬遅延です。言い換えると、MGT は位相を除いて、ロジックファブリック用クロックを完全に制御できます。これは、特に、CDR のクロックをロジックファブリックとのインターフェースの基準として使う場合(この選択肢については後述します)に、データ受信にとって重要です。CDR は、到着するデータストリームとの同期を維持するために、このクロックの周波数を継続的に調整するからです。
前のページで説明したように、PCS はロジックファブリック用クロックと PMA のクロックの位相差を克服するメカニズムを提供します。Tx バッファまたは Rx バッファを使うのが最も簡単な選択ですが、PCS にはこの差を直接調整する機能がある場合もあります。
では、MGT のクロック出力ポートにはどのクロックが出力されるのでしょうか。自然な答えは XCLK です。このクロックが、ロジックファブリック用クロックの要件に最も近い候補だからです。しかし、ロジックファブリック用クロックを生成する方法は他にもいくつかあります。例えば、MGT のクロック出力を通常のロジックファブリック用 PLL に入力して、異なる周波数のクロックを生成できます。この PLL はクロックバッファと一緒に使われるため、そのクロック信号は目的に適したものになります。PLL をこのように使うと、新しい可能性が広がります。例えば、MGT が自身の基準クロックをクロック出力ポートからそのまま出すこともできます。このクロックの周波数は MGT とのインターフェースに使うには正しくないかもしれませんが、PLL が必要な比率で逓倍できます。
また、ロジックファブリック用クロックの周波数が XCLK の周波数と異なることもあることに注意してください。これは、PCS 内部で非同期ギアボックス(asynchronous gearbox)が有効になっている場合に必要になることがあります。このシナリオでは、PMA 内のパラレルワードと、ロジックファブリックとのインターフェースのパラレルワードの幅の違いを補償するために、周波数差が必要です。
このトピックに関する規則は複雑で、FPGA ごとに異なります。MGT のドキュメントの大部分は、さまざまな可能性の詳細に費やされていることがよくあります。残念ながら、クロッキングに関する正しい判断には、特定の FPGA に適用される規則を学ぶことに時間を費やす必要があります。
データ受信用のロジックファブリック用クロックの選択
データ受信用のロジックファブリック用クロックの生成方法を選ぶときには、基本的な決定が必要です。このクロックを CDR のクロックから派生させるか、それとも固定の基準クロックから派生させるかです。言い換えると、ロジックファブリック用クロックを、到着するデータストリームの正確なデータレートに適応させるかどうかです。
ほとんどのアプリケーションでは、MGT は双方向のデータ通信に使われます。到着するデータと送信されるデータの間には、密接な関係があることがよくあります。例えば、送信データストリームには、到着するデータストリームに応答して送信される確認応答や再送要求が含まれることがあります。この種のアプリケーションでは、すべてのロジックが同じクロックに同期している(つまり、すべてのロジックが同じクロックドメイン(clock domain)にある)と便利です。特に、PIPE インターフェースは、MGT とのすべてのインターフェースが単一のクロック(標準文書では PCLK と呼ばれる)に同期していることを要求します。先ほど述べたように、PIPE は MGT といくつかのプロトコル(PCIe、SuperSpeed USB、SATA)の間の標準インターフェースです。
しかし、この利便性には代償が伴います。ロジックファブリック用クロックの周波数が、PMA のパラレルワードに使われる周波数(つまり XCLK の周波数)とわずかに異なる可能性があります。ロジックファブリックがパラレルワードを、PMA に到着する速度より遅く、または速く受け取るため、この差によって PCS 内部でデータの余剰または不足が生じます。この解決策は、PCS のページで説明したように、Rx バッファとスキップシンボルを使うことであることがよくあります。
あるいは、ロジックファブリック用クロックを PMA のクロックから派生させることもできます。この方法では、ロジックファブリックはデータを到着する速度と同じ速度で消費します。これは、MGT がデータ受信のみに使われる場合の自然な解決策です。また、アプリケーションロジックがクロックドメイン交差(clock domain crossing)を処理する場合には、双方向リンクでも選択肢となり得ます。Xillyp2p はこの手法を採用したプロトコルの一例であり、その完全なサンプルデザインに示されています。
AMD FPGA:ロジックファブリックからの 2 つのクロック
AMD FPGA(旧 Xilinx)の MGT には、ロジックファブリックからのクロック入力ポートが 2 つあります。すなわち、各方向につき 2 つのポートがあります。送信用の TXUSRCLK と TXUSRCLK2、受信用の RXUSRCLK と RXUSRCLK2 です。MGT のインスタンシエーション(instantiation)の例は、このサンプルデザインに示されています。
ロジックファブリックとのインターフェースのほぼすべてが、TXUSRCLK2 または RXUSRCLK2(方向に依存)に同期しています。他の 2 つの入力、TXUSRCLK と RXUSRCLK は、PCS の一部内部でのみ使用されます。
TXUSRCLK は、多くの場合 TXUSRCLK2 と同じクロック信号です。しかし、AMD FPGA の MGT には、ロジックファブリックとのインターフェースで使うパラレルワードを、PCS 内部の 2 倍の幅にできる機能があります。この機能を使うと、TXUSRCLK の周波数は TXUSRCLK2 の周波数の 2 倍になります。これも、ロジックファブリック用 PLL を使うもう 1 つの理由です。
同じ原理が RXUSRCLK と RXUSRCLK2 にも当てはまります。
まとめ
このページでは、MGT のクロックに関連するいくつかのトピックを簡単に取り上げました。とはいえ、MGT のクロッキングリソースの活用について賢明な判断を下すには、MGT 固有の機能と制限を学ぶことが依然として必要です。このページの説明が、MGT のクロックがどのように動作し、相互に作用するのかを理解する助けになれば幸いです。
以上で、MGT に関するこの一連のページの 7 ページ目を終わります。次のページでは、フロー制御(flow control)の議論でこのシリーズを締めくくります。
