ではもう少し物理層の詳細を説明しておきたい。前回のPhoto05の順に沿って説明すると、まずはScrambleとなる。このScrambling/Descramblingの目的は、PCI Expressのそれと全く同じである。PCIeと異なり、x4/x8/x16といった構成はありえないから、複数レーンで同じタイミングで信号がOn/Offすることはあまり考える必要はないが、データが00HとかFFHとかはありえる訳で、こうしたデータをScramblingで適度に0/1が混じった形にするのはノイズ対策上重要な項目である。ちなみにScrambleの方法、以前説明したPCI Expressの例はx8のケースだったが、ではUSB 3.0では? というとこんな感じだ(Photo01)。LSFR(Linear Feedback Shift Register)を使って、やはり、

G(x)=x^16+x^5+x^4+x^3+1

となるようなG(x)を計算し、これとデータのXORを取る形になる。Descrambleは? というと、もう一回XORを取ればいいことになる。

Photo01: Universal Serial Bus 3.0 SpecificationのFigure 6-7からの抜粋。

ちなみにDebuggingを容易にするため、このScramble/Descrambleを無効にするオプションが用意されているのもPCI Expressに同じだ。

次が8b/10b Encode/Decodeである。この方式そのものはANSI INCITS 230-1994(旧称ANSI X3.230-2004)で定義されているもの(このINCITS 230-1994はFC-PH(Fiber Channel Physical and Signaling Interface)を定義したもの)に準拠している。これはPCI Expressも全く同じである。前回も触れたとおり、これは8bitのシンボルと10bitのシンボルの相互変換という形になる。PCI Expressとのここでの相違点は、制御コード扱いとされるK-Codeの割り当てが若干異なることだ。表1にこれをまとめてみたが、大きくは変わらないとはいえ、細かく割り当てが異なる部分は多い。基本的にPCI Expressは複数の速度(2.5GT/sと5GT/s。Gen3の8GT/sはまた話が異なる)をサポートするとか、パケットがTransactionとDataLinkの2階層の構造になっているといった相違点があり、このあたりはどうしても変わってくる事になる。ちなみにUSB3.0の場合、サポートしないK-Code(たとえばK28.0とかK28.7など)が渡された場合は、K28.4を代わりに送る事になっている。これは、表に載っていないその他のK-Codeの場合も同じである。

■表1

その次に来るのがSerial/Parallelの変換となるわけだが、その前に8b/10bの話をもう少し。基本的には8b/10b Encode/Decodeは単にデータの送受信にしか関係ないが、Link Trainingの時はもう少し特殊な動きをする。Link TrainingとはDeviceの初期化 or 省電力などでLink Downの状態から復帰する時などに行われるもので、要するにお互いが正しく通信できるかを確認すると共に、通信パラメータの設定や確認を行うフェーズである。PCI Expressの場合、Link Initializationという作業の中でこのLink Trainingが行われる。Link Initializationで行うべき作業はこちらにまとめた通りであるが、たとえばPolarity Inversionを行う場合、実際にはTrainingのフェーズで差分を取り、それが負の値だったら極性が逆なのでひっくり返す、といった作業を行う。

ただ、ひっくり返した後で「今度は正しく受信できているか」を確認してやらないと怖いわけで、そういう意味ではある一定期間の間、素性の判るデータが送受信されている期間があるのが望ましい。たとえばオーケストラで演奏が始まる前に、まずオーボエがA音を出し、コンサートマスターこれにピッチを合わせ、ついで全ての演奏者が(今度はコンサートマスターの音に)ピッチを合わせるという手順がある。Link Trainingもこれと一緒で、実際に通信が始まる前にある決まった手順のデータが送信され、受信側はこれを正しく受信できるように調整する、という作業が入る。PCI Expressではこの作業は8b/10b Encoder/Decoderに実装されており、USB 3.0もこの方式を引き継いでいる。

(続く)