このページは、 Multi-Gigabit Transceiver (MGT) を紹介する一連のページの 3 番目です。
序章
application logicのデータ ストリームがそのまま物理チャネルで送信されることはほとんどありません。そうすると、前述の理由により、 MGT が誤動作する可能性が高くなります。ほとんどすべてのアプリケーションでは、 MGT または application logic は、物理チャネルが適切に動作できるように、データ ストリームにエンコーディングを適用します。このエンコーディングは、送信機と受信機間の同期にも役立ちます。
このページでは、最も一般的に使用されるエンコード手法の基本について説明します。前のページの protocolsのリストは、これらのエンコードと、 FPGAs間で使用される protocols を接続します。
8b/10b エンコーディング
8b/10b エンコーディングは、いくつかの protocols(たとえば、 PCIe、 Gigabit Ethernet、 SATA、 Displayport 、 SuperSpeed USBの一部のバージョン) で使用されます。すべての FPGA MGTs には 8b/10b エンコーダーとデコーダーが組み込まれていますが、このエンコーダーは logic fabric でも実装できます。
このエンコーディングは、各 byte (8 bits) を 10 bitsで構成されるワードに変換します。この変換の主な目的は、平均して同じ数の '0' と '1' を持つ bits のシーケンスを作成することです。言い換えると、エンコードされたデータ ストリーム内の bits は DC バランスが取れています。もう 1 つの利点は、エンコーディングによってデータ ストリーム内の '0' と '1' の間に十分な遷移があることが保証され、 CDR (Clock Data Recovery) メカニズムが適切に機能することです。
ただし、 8b/10b エンコーディングではデータ ストリームがランダム化されないことに注意してください。特に、 equalizer を使用する場合、 8b/10b エンコーディングだけでは不十分であり、この equalizer ではデータ ストリームが統計的にランダムである必要があります。
DC バランスの目標を達成するために、8 ビット ワードの一部を 2 つの候補にエンコードできます。たとえば、8 ビット ワード 0x20 (00100000、 D0.1と表記) は、 1001111001 または 0110001001のいずれかにエンコードできます。どちらの選択肢も 0x20にデコードされます。最初の選択肢には 4 つの '0' bits と 6 つの '1' bitsがあることに注意してください。2 番目の選択肢には 6 つの '0' bits と 4 つの '1' bitsがあります。これが 8b/10b エンコードの全体的な考え方です。 エンコーダーには 2 つの選択肢があり、1 つは '1'よりも '0' が多い選択肢で、もう 1 つはその逆です。
エンコーダーはこの機能を使用して、長期的に '0' と '1' のバランスを確保します。 これまでのデータ ストリームに '0' または '1' が多すぎるかどうかを記憶します。この不均衡は Running Disparityと呼ばれます。エンコーダーは、この不均衡を軽減するのに役立つ 10 ビット ワードを選択します。
すべての 8 ビット ワードに 2 つの 10 ビット候補があるわけではありません。たとえば、8 ビット ワード 0x23 (00100011、 D3.1と表記) は常に 1100011001にエンコードされます。このエンコードされたワードには、 '0' と '1'の数が同じであるため、 Running Disparityには影響しません。
このエンコーディングは 1983 年に初めて公開され、2010 年頃まで導入された protocols で非常に人気がありました。最近公開された protocolsではあまり人気がありません。主な理由は、 scrambler が protocol の一部であることが多いためです。データ ストリームの DC バランスは scramblerの使用によって保証されるため、この目的で 8b/10b エンコーディングは必要ありません。 scrambler は、 '0' と '1' 間の遷移が十分に頻繁に発生することも保証します。一方、 8b/10b エンコーディングでは、物理チャネルへの送信用に 25% 多い bits が追加されます。これらの追加の bits は、有用なデータの送信に使用できた可能性があります。
とはいえ、 scrambler を使用する成功した protocols の中には、 8b/10bも使用するものもあります。たとえば、 PCIe のすべてのバージョンでは scramblerを使用する必要がありますが、 3.0より下の PCIe バージョンでは 8b/10b エンコーディングも使用されます。したがって、 8b/10b エンコーディングには明らかに他の利点もあります。これが次のトピックにつながります。 K-symbols。
K-symbols
8b/10b エンコーダーがエンコードする各 8 bits から 10 bits を生成するということは、元の単語が持つ 256 の可能性と比較して、エンコードされた単語には 1024 の組み合わせがあることを意味します。元の単語ごとに 2 つのエンコードされた単語があると仮定しても、512 の可能性がカバーされます。前述のように、8 ビット ワードの中には、変換対象となる 10 ビット ワードの候補が 1 つしかないものもあるため、10 ビット ワードの可能性は 512 未満です。したがって、10 ビット ワードの少なくとも 512 の可能性には、対応する 8 ビット ワードがないという結論になります。
したがって、 8b/10b エンコーディングは、不正な 10 ビット ワードを検出することで、物理リンク上のビット エラーを検出できます。 FPGA MGTs には、不正な 10 ビット ワードが検出されたときに application logic に通知するために使用される output ports があります。ただし、このエラー検出メカニズムは、すべてのエラーを検出できるわけではないため、あまり役に立ちません。
8b/10b エンコーディングの本当に貴重な機能は K-symbolsです。8 ビット ワードの代わりに K-symbol がエンコードされて送信されます。デコーダーは通常のデータ ワードと K-symbolを区別することができ、 K-symbol が到着したときに application logic に通知する方法が常に存在します。
したがって、 8b/10b エンコーディングにより、送信機はデータ チャネルで通常のデータと混同されることなく追加情報を送信できます。この機能は、受信機が送信機のデータ ストリームと同期できるようにするために、 protocols でよく使用されます。
K-symbols の意味は protocolによって異なります。ただし、多くの protocols で同じ意味で使用される 2 つの K-symbols があります。
- K28.5 は Comma (COM) とも呼ばれ、データ ストリームを同期するために使用されます。
- K28.0 は skip symbol (SKP) と呼ばれることが多いです。
これら両方については、以下で詳しく説明します。
FPGA MGTsで 8b/10b が有効になっている場合、 application logic とのインターフェイスには、 byte のデータごとに個別の wire があります。この wire は、データが通常のデータ byte であるか、 K-symbolであるかを示します。言い換えると、データ送信用のインターフェイスでは、送信される各ワードが通常のデータであるか、 K-symbolであるかを選択できます。ただし、データ ワードが K-symbolとしてマークされている場合、8 ビット データ ワードは次のオプションのみに制限されます。
Byte 値(hex) | K-Symbol |
---|---|
1C | K28.0 |
3C | K28.1 |
5C | K28.2 |
7C | K28.3 |
9C | K28.4 |
BC | K28.5 |
DC | K28.6 |
FC | K28.7 |
F7 | K23.7 |
FB | K27.7 |
FD | K29.7 |
FE | K30.7 |
同様に、 MGT レシーバーの場合、 application logicとのインターフェイスで受信されたバイトごとに個別の wire があります。このような各 wireの値は、関連する byte をプレーン データとして解釈するか、 K-symbolとして解釈するかを示します。レシーバーには、 K28.5 (Comma Symbol、 COM) および K28.0 (Skip symbol、 SKP) を特別な方法で処理するための特別な機能もあります。次に、これら 2 つの K-symbols について説明します。
Comma symbol (K28.5)
K28.5 の 10 ビット表現は 0011111010 または 1100000101です。このワードは、 bits のシーケンスが K28.5の送信の結果としてのみ物理チャネル上に現れるため、特に便利です。 K28.5を検出するために、受信機は送信機と同期する必要はありません。 受信した最後の 10 bits がこれら 2 つの単語のいずれかと一致すれば十分です。
これにより、 K28.5 は受信機を同期するための優れたツールになります。この K-symbol が検出されると、他の 10 ビット ワードの境界がわかります。
FPGA MGTs には、 K28.5 symbolの到着に応じて到着データ ストリームを自動的に整列させる機能があります。通常、より大きな境界を考慮して整列を行うように要求することもできます。たとえば、 MGT は、到着した K28.5 を 32 ビット ワードの先頭に整列させるように構成できます。
K28.5 symbol は、受信機の調整以外にも、同期を必要とする他の機能ユニットの調整にも使用できます。たとえば、 protocol は、この K-symbolの到着に応じて scrambler をリセットするように要求する場合があります。
これらの可能性のため、 protocols では、受信機を同期させるために、 K28.5 を定期的に送信することが必要な場合があります。ハンドシェイクで接続を確立する Protocols では、リンク確立の一部として K28.5 を使用することがよくあります。いずれにしても、 K28.5 シンボルは、物理チャネルで送信される 25% の余分な bits を正当化する程度に、 protocol の設計を簡素化することがよくあります。
Skip symbol (K28.0)
実際のほとんどの状況では、送信機と受信機の clock frequencies に差があります。これにより、次のような問題が発生する可能性があります。 多くの場合、 MGT と application logic 間のインターフェイスは、受信側のローカル clockと同期しています。そのため、データは送信側の clockに従って到着しますが、受信側の clockに従って application logic に配信されます。
つまり、 MGT が受信するデータは、相手側によって指定されたペースで到着します。ただし、データが消費される速度はローカル clock によって決まります。
送信機の clock frequency の方が高い場合、結果として application logic が MGT からデータを取得するのが遅くなります。余分なデータは最終的に蓄積され、 MGT内のどこかで overflow が発生します。一方、送信機の clock frequency の方が低い場合、 application logic は到着するよりも速くデータを取得しようとします。これも問題です。
この問題の簡単な解決策は、「skip symbols」を追加することです。たとえば、 SuperSpeed USB protocol は、「SKP Ordered Set」を 2 つの連続した K28.0 symbolsとして定義します。 protocol では、これら 2 つの K28.0 が 354 の通常データ ワードごとに 1 回送信される必要があります。受信側 MGT は、これらの K28.0 シンボルを application logicに提示する代わりに破棄できます。これにより、送信側の clock が受信側の clockよりも高速である場合に発生する余剰データの問題が解決されます。 受信機 MGT が clock frequency の差異のためにデータを蓄積し始めると、到着する K28.0 シンボルをスキップします。
このメカニズムにより、送信側は、受信側の application logic が 354 ワードしかフェッチしないのと同じ期間に 356 ワードを送信できます。計算 356 / 354 ≈ 1.00565により、このメカニズムは、2 つの clocks間の frequency 差を最大 ~0.565% までカバーできることになります。これは、もちろん、 protocolの仕様で許可されている範囲を超えています。
受信側の MGT は、既存の「SKP Ordered Set」に K28.0 symbols を追加することもできます。これは、送信側の clock が遅い場合に役立ちます。つまり、受信側の application logic は、データが到着するよりも速くデータを取得しようとします。したがって、 MGT は、不足しているデータ スロットを K28.0 symbolsで埋めることができます。 いずれにしても、 application logic はすべての K28.0 symbols を無視すると予想されます。
PCIe protocol は Skip Symbol と同様の方法で使用されます。 PCIeの SKP Ordered Set の形式は異なり、4 つの K-symbolsで構成されます。 最初に K28.5 (Comma)、次に 3 つの K28.0 symbols。 skip symbol の使用原理は同じです。
64b/66b エンコーディング
すでに述べたように、 8b/10b エンコーディングは物理チャネルを非効率的に使用し、このエンコーディングの主な目的 (DC バランスと '0' と '1'間の遷移の保証) は、 scrambler が使用されるときには必要ありません。これが、最近の protocol が 64b/66b エンコーディングや同様の方法に依存している理由です。ただし、 64b/66b は実際にはエンコーディング方法ではないことに注意することが重要です。むしろ、データ ストリームと制御ワードを編成する方法です。データは異なる表現にエンコードされません。発生するのは、データがセグメントに編成され、同期を可能にし、チャネルを介して制御情報を送信するために追加の bits が挿入されるだけです。
K-symbols は 8b/10b エンコーディングのみの一部であり、他のコーディング形式では使用できないことに注意してください。
64b/66b エンコーディングは、 10G/100G Ethernetなど、いくつかの protocolsで使用されています。以下で説明するように、 PCIe と USB の高度なバージョンは他の方法に基づいていることは注目に値します。
64b/66b エンコーディングは、データ ストリームを 64 ビットのセグメントに分割し、各セグメントの先頭に 2 つの bits を追加します。したがって、各セグメントは物理チャネル上で 66 bits の長さになります。これらの 2 つの bits の追加値は、次の 2 つの値のいずれかになります。 「01」または「10」。これら 2 つの bits が「01」の場合、後続の 64 ビット ワードには 8 つの bytes のデータが含まれます。これらの bits が「10」の場合、次の byte には、 56 bits の残りの部分に含まれる内容を定義するコードが含まれます。 データワードの数と制御ワードの数。
制御ワードは、特にフレーム (パケット) の開始と終了を示すために使用されますが、 clock frequency の違いを補正する目的でアイドル ワードを挿入するためにも使用されます ( 8b/10bの skip symbolsと同様)。 protocol に固有の制御ワードも定義できます。
すでに述べたように、最初の 2 つの bits が「10」である場合、残りの 64 bits は次の 2 つの部分に分かれます。 8 ビットのコード ワードと、データと制御ワードの組み合わせで構成される 56 bits 。56 ビット セグメント内のデータと制御ワードの構成は、主に各制御ワードの長さが 7 ビットであるため、非常に複雑です。この特殊性は、残りの 56 ビットに 8 つの制御ワードを挿入できるようにするために必要です。
さらに、このエンコーディングを使用する protocols は、データの DC バランスとランダム性を保証するために、データに scrambler も使用します。このランダム性は、 equalizerのためだけに必要というわけではありません。 受信側は、到着したデータ ストリーム内の 66 ビット セグメントの先頭を見つけるためにもこれが必要です。これは、 66 bitsの各セグメントの最初の 2 つの bits を調べることによって行われます。この 2 つの bits のペアに「01」または「10」の値のみが繰り返し含まれている場合、受信側は同期しています。それ以外の場合は、別の位置を試す必要があります。 scrambler は、他の bits がランダムであることを保証するため、受信側がずれている場合は、すぐに正当な組み合わせではなく「00」または「11」が表示されます。
つまり、全体的に見て、 64b/66b は基盤となる物理チャネルをより有効に活用しますが、この方法を使用する protocol は実装がより困難です。特に、各セグメントを別々に処理する必要がある (最初の 2 つの bits と、それに続く 8 つの bits にも依存) ため、実装が複雑になります。 FPGA MGTs によって、この問題に対するサポートのレベルが異なります。特に、一部の MGTs には、受信側を到着データの 66 ビット セグメントに自動的に合わせる組み込みメカニズムがあります。それでも、 application logic は、データと制御ワードの組み合わせを含む 66 ビット セグメントをアンパックするという、より困難なタスクを担当します。
FPGA MGT には、66 ビット セグメントのストリームから 64 ビット ワードを抽出するための gearbox が組み込まれている可能性があります。 Gearboxes については、このシリーズの次のページでさらに詳しく説明します。
64b/67b、 128b/130b 、 128b/132b
64b/66b は物理チャネルをより有効に活用しますが、この方法は実装が複雑です。これが、 8b/10bから移行したときに、 PCIe と SuperSpeed USB の両方の protocols が別の道をたどった理由であると考えられます。
これら 2 つの protocols は、データ ストリームをセグメントに分割するという考え方を維持しています。64 ビット セグメントの代わりに、これらのプロトコルは 128 bitsに基づいています。
PCIe 3.0 以降は 128b/130bに基づいています。 64b/66b エンコーディングと同様に、この protocol の各 128 ビット セグメントは、データ コードと制御コードを区別するために、「01」または「10」で始まります。 SuperSpeed USB Gen 2 は 128b/132bに基づいています。同じ目的で、各 128 ビット セグメントは、「0011」または「1100」で始まります。唯一の違いは、ビット エラーに対する保護を強化するために、 USB protocol では 2 つではなく 4 つの bits が割り当てられていることです。
64b/66b エンコーディングと同様に、データ ストリームの DC バランスとランダム化を保証するために、各セグメントの 128 ビット部分に scrambler が使用されます。ただし、 64b/66b との類似点はここで終わります。 両方の protocols は、 protocol独自の構造に従って 128 ビット部分の内容の意味を定義します。したがって、 128b/130b と 128b/132b は、データ ストリームをセグメントに分割し、データを含む部分に bits がいくつ追加されるかのみを表します。残りは各 protocolに固有です。
64b/67b エンコーディングも同様に機能します。違いは、同じ目的で、 64 bitsの各セグメントに 3 つの bits が追加されることです。このエンコーディングは主に Interlaken protocolで使用されます。
エンコードなし
上記のエンコード方式を使わずに通信リンクを実装することも可能です。そのような protocol の例は xillyp2pです。 xillyp2pは、受信機と送信機を整合および同期させるために、 223 bits ごとに同期ワードを使用します。この protocolにとって、 MGT は単なる SERDESです。この戦略の主な利点は、 protocol が MGTの他の機能にまったく依存しないことです。これにより、 protocol をさまざまな MGTsに実装することが簡単になります。
欠点は、 MGT内で実行できた可能性のある作業に FPGA logic resources が使用されていることです。
このアプローチは、 protocol がエンコーディングが役立つ可能性のあるすべてのニーズを満たしている場合に適しています。 DC バランス調整、ランダム化 (必要な場合)、同期、ワード アライメント、およびデータと制御情報の区別。
概要
上で示したように、 application logicのデータ ストリームをエンコードするにはさまざまな方法があり、エンコードをまったく使用しないことも可能です。ほとんどのアプリケーションでは、 8b/10b エンコードが最も簡単に使用できますが、このエンコードは物理チャネルのデータ ストリームに対して無駄が多くなります。このため、最近の protocols では、より効率的であるものの、使用がかなり難しい他のエンコード方法を採用しています。
これで、 MGTsに関するこのシリーズの 3 ページ目は終了です。次のページでは、ここで説明したエンコーディングを実装する部分など、 PCSの一部のパーツを紹介します。