PCIe 6.0 の誤り訂正

注意

本noteはPCI SIGのブログを元に筆者の推測をnoteにしたものになります。どういう誤り訂正をしているか正しく知りたい場合は以下のサイトなどからSpecificationをご購入ください。

本題

Forward Error Correction: FECとは、通信プロトコル等で送信側が誤り訂正符号技術を用いて符号語を送信し、受信側が誤り訂正を行う方式で、通信路誤りがあっても再送なしにデータ転送を行える確率を増やすものである。

https://pcisig.com/blog/pcie%C2%AE-60-specification-webinar-qa-error-detection-and-correction-fec

上記サイトによれば、PCIe 6.0にはFECが導入されている。そして次の構成となっている。
256ByteのFLITと呼ばれる単位は、(符号語シンボル数n,情報シンボル数k) = (256, 250)の構成。
そのうち250Byteは、CRCでも誤り検出可能なように符号語になっており、(250, 242)の構成。

さて、何の符号を使用しているのだろうか? どうやら公開情報ではない。

気になるのは、256Byteというきりの悪さである。$${GF(2^8)}$$上の生成多項式を用いて作られるRS符号は最大フレームサイズは255であり足りない。$${GF(2^9)}$$上の生成多項式を使うとなると1シンボル9ビットになってしまうし、最大フレームサイズが512なのでパリティを多さに対して情報シンボルが少なくなってしまう。

上記サイトによれば、3-way interleaved FECが使われている。これは何か良く分からない。FLITを3分割して、各々を符号語として扱うのだろうか? ググるとSynopsysのサイトが出てきて、そこでいろいろなことが分かる。

https://blogs.synopsys.com/vip-central/2022/08/23/verification-of-light-weight-forward-error-correction-fec-and-strong-cyclic-redundancy-checks-crc-feature-in-pcie-6-0/

下記図が示すように、1バイトごと、3つの符号語をストライピングして構成しているようだ。

そして以下の説明からこれは$${GF(256)}$$のRS符号が使われていることが推測できる。

The FEC code is 3-way interleaved as shown in the table below. Each color represents an ECC group with the bytes marked in the same color. Thus, three consecutive bytes in a lane belong to three different ECC groups. Hence, a burst error of length <=16 in a lane will not impact more than one byte in each group and each ECC can correct a single byte error.

訳:FEC コードは、次の表に示すように 3 ウェイ インターリーブです。 各色は、同じ色でマークされたバイトを持つ ECC グループを表します。 したがって、レーン内の 3 つの連続したバイトは 3 つの異なる ECC グループに属します。 したがって、レーン内の長さが 16 以下のバースト エラーは、各グループ内の 1 バイトを超える影響を与えることはなく、各 ECC は単一バイト エラーを訂正できます。

つまり、各符号語は1バイトの訂正能力がある。$${GF(256)}$$のRSはECCとして2シンボルあれば1誤り訂正が可能だから、これはとてもRS符号に思える。

FLITでは、ストライピングで符号語を組むことで、16ビット以下のバーストエラーが発生しても、各符号語ごとに見れば1シンボル以上はエラーにならない。こうしてFLITでは16ビット以下のバーストエラーも誤り訂正することが可能となっているようだ。

さて、この説明からだいぶRS符号だと思われるが、BCH符号かもしれない。ただしBCH符号でもこのECCサイズで8bit訂正の能力が持てたとしたらである。なんとなくそのようなものはない気がする。考えてみよう。

まず256Byte/3をカバーするBCH符号は、符号語サイズが256x8 =2048/3 ~= 600ビット程度である。このサイズのためには$${GF(2^{10} > 600)}$$のガロア拡大体の原始元の原始多項式から作ったBCH符号が必要になる。また、ECCサイズは16ビット、つまり生成多項式の次数が16である必要がある。BCH符号では根がすべて連続根となるとは限らないのであった。となると次数16で連続根も16というのはとても難しい気がしてくる。

果たしてこんなBCH符号はあるのか、それは次回書こう。

この記事が気に入ったらサポートをしてみませんか?