このページは、マルチギガビット・トランシーバ(MGT)を紹介する一連のページの最初のページで、このシリーズで扱う内容の概要を示します。
はじめに
マルチギガビット・トランシーバ(MGT)は、コンピュータや電子システムの内部で、異なる構成部分の間の通信に重要な役割を果たしています。コンピュータ内部のよく知られたインターフェースのいくつかは MGT に基づいています。例えば、PCIe や SATA です。また、コンピュータと周辺機器の間の通信に使われるよく知られたインターフェースとしては、Gigabit Ethernet、SuperSpeed USB、Thunderbolt、DisplayPort などがあります。
MGT は電子部品同士の接続にも使われます。例えば、2 つの FPGA 間です。この場合、通信は、あまり知られていないプロトコルや非標準のプロトコルに基づいていることがよくあります。また、FPGA と別の種類の部品を接続するため、あるいは他の部品同士を接続するために MGT を使うこともできます。例えば Xillyp2p を使う場合です。
例えば、光ファイバ用トランシーバは、多くの場合、MGT に直接接続するための標準モジュール(特に SFP+ フォームファクタ)です。このサンプルデザインにはその例が示されています。また、高速 ADC/DAC の中には、サンプルデータを転送するために MGT を使うものもあります(通常 JESD204 プロトコルを使用)。さらに、ビデオデータの転送を目的としたプロトコルもあります(例えば MIPI の物理層プロトコルの一部)。
MGT は双方向プロトコルで使われることがよくありますが、実際には各 MGT は 2 つの独立した部分、すなわち送信部と受信部から構成されています。したがって、どちらか一方をオフにすることで、MGT を一方向伝送に使うことも可能です。ほとんどの FPGA MGT では、送信部と受信部のパラメータを独立に設定することもできます。
まとめると、MGT はさまざまな用途に使われています。インターフェース名を見ただけでは MGT が使われているとわからないこともよくあります(例:Gigabit Ethernet、SATA、DisplayPort)。しかし、その物理層は MGT によって構成されています。
触れておく価値があるのは、Xilinx(そしてその後 AMD)が自社の MGT を RocketIO、GTX、GTH、GTY、GTP、GTM など、さまざまな名前で呼んでいることです。それぞれの名前はトランシーバの特定のハードウェア実装を表しており、そのトランシーバがサポートするデータレートやその他の性能特性を示しています。
この一連のページでは、MGT の基本と、それに関連してよく使われる技術用語をいくつか説明します。その目的は、技術文書を読みやすくすること、特に、皆さんのプロジェクトに関係するパラメータとそうでないパラメータを見分けられるようにすることです。
MGT とは何か?
重要なのは、MGT が数々の複雑な機能の背後で、結局のところ単なる SERDES にすぎないという点を認識することです。つまり MGT は、データの受信と送信を行う電子回路ブロックです。MGT と外部との電気的インターフェースは、差動ペア(differential pair)を構成する 2 本の配線からなります。最初の配線(「プラス」側)の電圧がもう一方の配線(「マイナス」側)の電圧よりも高い場合、物理状態は '1' に対応します。それ以外の場合は '0' です。これは LVDS などの差動インターフェースと同じ原理です。
SERDES とのもう 1 つの類似点は、MGT とアプリケーションロジック(application logic)とのインターフェースがパラレルワードで構成されていることです。アプリケーションロジックのクロックの 1 サイクルごとに、複数のビットがアプリケーションロジックと MGT の間で転送されます。この構成は、データレートが FPGA で可能な最大クロック周波数よりもはるかに高いために必要です。
しかし、通常の SERDES と MGT には、いくつかの重要な違いがあります。その一部を挙げます。
- MGT は、通常の SERDES よりもはるかに高いデータレートに対応できます。
- SERDES の受信部には、データストリームと一緒に送信側のクロックを与える必要があります。一方、MGT の受信部はデータストリームの信号だけに依存できます。MGT がデータストリームの信号に適合するクロックを生成し、そのクロックを代わりに使うからです。この機能は クロックデータリカバリ(Clock Data Recovery, CDR) と呼ばれます。MGT の受信部が送信側のクロックを利用できたとしても、それは基準クロック(reference clock)としてのみ使われ、データクロックそのものとしては使われません。
- MGT を使用するデータリンクでは、ビット誤りは許容され、通常あり得ることとみなされます。ビット誤り率(BER)は通常、10-12 または 10-15 未満であることが期待されます。通常の SERDES でビット誤りが発生すれば故障とみなされますが、MGT の場合はそうではありません。
- MGT を使う場合、2 本の電線上で伝送されるデータストリームの内容には制約があります。データストリームは常に DC バランスが取れている必要があります。言い換えると、データストリーム上の '0' と '1' の数は、平均的に等しくなければなりません。また、送信されるビット同士が統計的に独立であることが要求されることもよくあります。詳細は後述します。
- MGT は、帯域外信号(OOB)の生成と検出ができます。これらの信号は、省電力のために通常のデータフローを停止している間に送信されます。その主な目的は、相手側の受信部を起こして、データビットの送信を再開させることです。
では、なぜ MGT はそんなに複雑なのか?
FPGA プロジェクトのために MGT ブロックを設定しようとしたことのある人なら誰でも、そこには多数のパラメータと選択肢があることを知っています。なぜこのようになっているのでしょうか?
実は、複雑である必要はありません。このサンプルデザインに示すように、MGT を単なる SERDES として使うのであれば、複雑さの多くは解消されます。
しかし、MGT の使用は通常複雑です。その主な理由は 3 つあります。まず第 1 に、MGT ブロックは、ロジックファブリック(logic fabric)にも実装できる多くの機能ブロックを、効率化のために MGT の一部として実装しています。例えば、すべての MGT は 8b/10b のエンコードとデコード機能を持っています。この処理はアプリケーションロジックでも実行できます。しかし、この符号化方式は非常に広く使われているため、MGT が代わりに処理する機能を備えているのです。
第 2 の理由は、クロッキング(clocking)に関係しています。MGT を正しく動作させるには、複数のクロックが必要です。さらに複雑なことに、FPGA のロジックファブリック用のクロックと比較すると、クロックの品質(特にジッタ(jitter))に対する要求はより厳しくなります。また、SSC(Spread Spectrum Clocking、スペクトラム拡散クロック)が使われることもあり、さらに複雑になります。
そのため、クロッキングを正しく行うことは、MGT 全体のパラメータを正しく選ぶことと同じくらい難しい場合があります。
第 3 の理由は、MGT が複数の標準通信プロトコルをサポートするように設計されていることです。その結果、特定のプロトコルに必要な機能の名前は、そのプロトコルの仕様書から取られていることがよくあります。そうした専門用語は、関連するプロトコルを知らない人には意味がわかりません。このため、FPGA 用に MGT ブロックを設定する際、どの機能を有効にすればよいかの判断が難しくなります。
これらすべてのトピックについては、この一連のページの残りでさらに詳しく説明します。
注意すべき点
ほとんどの用途では、MGT は別の確立されたプロトコル、特に PCIe の物理層として使われます。このような場合、FPGA ツールが詳細を処理してくれるので、低レベルの動作について深く理解する必要はありません。
しかし、アプリケーションロジックを MGT に直接接続しようとしているなら、そのロジックが対処しなければならないいくつかの課題があることに注意が必要です。これらの課題の一部は、FPGA 間での使用を目的としたプロトコルによって処理されます。
以下に、考慮すべきトピックを簡単に挙げます。それぞれのトピックは、この一連のページの残りで詳しく説明します。
- ワードアライメント(word alignment):どの SERDES でも同じですが、MGT には、バイトやそれより大きなワードがどこから始まるのかがあらかじめ分かっているわけではありません。SERDES では、この問題は通常、パラレルワードを 1 ビットずつずらしてみる(ビットスリッピング、bit slipping)ことで解決します。到着したデータストリームが意味を持つようになるまでずらしていくのです。MGT ベースのプロトコルは、通常、この目的のために同期ワード(synchronization word)に依存します。
- 物理的な配線上のビットは DC バランスが取れていなければなりません。最も簡単な解決策は 8b/10b エンコーディングですが、場合によっては他の選択肢の方が適していることもあります。
- スクランブリング:受信側 MGT にイコライザ(equalizer)を使うことは、ほとんどの場合に良い考えです。イコライザは物理的な伝送路の不完全さを補償し、それによって BER を低減します。これは特に、データレートが高い場合、低コストのケーブルを使用する場合、または物理的な距離が長い場合に当てはまります。ただし、一部のイコライザは、送信データが統計的にランダムであることを要求します。つまり、送信データストリームのビット間に相関関係があってはなりません。一般的な解決策は、スクランブラ(scrambler)を使うことです。スクランブラは、ペイロードデータと擬似ランダムビット列との間で XOR を実行します。受信側は同じ擬似ランダムビット列との XOR を実行することで、元のデータストリームを得ます。
- ビット誤り:受信側の MGT には、誤りを含んだデータが到着することがあります。このデータを処理するロジックは、そのような誤りに対処できるように設計しなければなりません。用途によっては、誤りが十分まれであり無視できると見なされることもあります(例えば、生のビデオデータを送信しており、BER が 10-15 未満の場合)。他の用途では、データリンクの信頼性を確保するために、誤り検出および/または再送の仕組みが必要です。
- クロック周波数の差:MGT がデータストリームを受信するとき、その信号は相手側のクロック(すなわち送信側のクロック)に基づいています。このクロックの周波数は、受信側で利用できるクロックとわずかに異なる場合があります。しかし、MGT とアプリケーションロジックのインターフェースは、多くの場合ローカルクロックに基づいています。したがって、送信側のクロックが受信側のクロックよりも速い場合、MGT はデータをアプリケーションロジックへ渡せる速度よりも速くデータを受信することになります。この結果、余分なデータが MGT ブロック内にたまり、最終的に何らかのオーバーフロー(overflow)が発生します。逆に、到着するデータレートがローカルクロックよりも低い場合、MGT は毎クロックサイクルでデータを渡せません。これらの問題は、基準クロックがデータストリームと一緒に送信側から受信側へ渡される場合でも発生します。クロック周波数のわずかな変動だけで、この種の問題が起こるのです。プロトコルは通常、アイドルワード(idle words)を使ってこの問題を解決します。
- 消費電力:MGT は消費電力が大きい傾向があります。これはデータレートが高いことも一因ですが、高品質な PLL が多くの電力を浪費していることも少なくありません。そのため、MGT を使用していないときは、たとえごく短い時間であってもシャットダウンしておきたいことがよくあります。例えば、SuperSpeed USB リンクは、データが送信されない状態がわずか 50μs 続くと、データストリームをオフにすることがよくあります。必要になったときは、OOB ハンドシェイクを使って動作を再開します。
PMA、PCS、クロッキング
このブロック図は、MGT の各部分と、アプリケーションロジックとの相互作用を示しています。
MGT の機能は通常、次の 3 つの部分に分けられます。
- クロッキング:前述のように、MGT の動作には複数のクロックが必要です。FPGA ツールがこれらのクロックのパラメータを自動的に設定するとはいえ、クロックがどのように生成されているかを知っておくことは必要です。
- PMA(Physical Medium Attachment、物理媒体接続):この部分には、MGT の SERDES と、アナログ信号サブシステム(OOB 信号、レシーバ検出(receiver detection)、イコライザ(equalizer)、プリエンファシスなど)が含まれます。また、この部分は CDR も実装しています。
- PCS(Physical Coding Sublayer、物理符号化副層):この部分には、通信プロトコルの実装に役立つロジックが含まれます。エンコーダとデコーダ、ワードアライメント、ギアボックス(gearbox)、FIFO などです。PCS の機能のほとんどはロジックファブリックに実装することもできますが、簡素化と効率化のために MGT 内部に実装されています。
これらのトピックについては、この一連のページでさらに詳しく説明します。
PIPE インターフェース
PIPE 標準については触れておく価値があります。この標準は、MGT と、PCIe、SuperSpeed USB、または SATA を実装するロジックとの間の接続を定義します。これには、データ、制御信号、ステータス信号をやり取りするためのポート群が含まれます。
この標準では、MGT は PHY 層と呼ばれ、プロトコル側は MAC 層と呼ばれます。この用語は、Ethernet、USB 1.x、USB 2.0 を定義する標準でも使われています。これらの標準は通常、2 つの別々のチップで実装されます。例えば、プロセッサチップ上で Ethernet を実装する場合、MAC 層はそのチップに実装され、PHY 層は別のチップに実装されます。PIPE 標準も同じ考え方に沿って書かれています。ただし、PCIe、SuperSpeed USB、SATA は実質的に常に同じチップ上に完全に実装されます。PIPE 標準で定義されている MAC 層と PHY 層の接続はチップ内部で行われ、外部から見えることはほとんどありません。
PIPE 標準の重要な影響として、きちんとした FPGA MGT であれば、PCIe 用に要求される PIPE インターフェースを必ず実装していることが挙げられます。SATA 用の PIPE インターフェースも、しばしばサポートされます。これは、これら 2 つのプロトコルを実装する際に明らかに有用です。しかし、もう 1 つの重要な利点があります。それは、FPGA が異なっても MGT とのインターフェースは似通っていることです。特に、実質的にすべての MGT に見られる機能要素がいくつかあります。
まとめ
このページでは、MGT とその複雑さの概要を説明しました。この一連のページの残りでは、上で述べた概念の多くを解説します。その前に、2 つの FPGA MGT を接続するときによく使われるプロトコルについて、簡単な概要から始めます。
