FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Common CellsのECCエンコーダーの実装詳細解析:SECDEDハミング符号による誤り訂正

SystemVerilogで実装されたECCエンコーダー(ecc_encode.sv)の実装詳細について解析する。 この実装は、SECDED(Single Error Correction, Double Error Detection)ハミング符号を使用しており、1ビットのエラーを自動的に訂正し、2ビットのエラーを検出する能力を持つ。

ECC (Error Correction Code) とは

ECC(Error Correction Code、誤り訂正符号)は、データの送信や保存中に発生する誤りを検出し、修正するための符号である。単に誤りを検出するだけでなく、自動的に修正することで、通信やデータの信頼性と整合性を高める技術である。

この実装では、SECDED (Single Error Correction, Double Error Detection) ハミング符号を使用している。SECDEDとはつまり以下のような意味である。

  • 単一エラー訂正:1ビットの誤りを自動的に検出・修正できる
  • 二重エラー検出:2ビットの誤りを検出できる(ただし修正はできない)
  • 拡張パリティビット:全体のパリティを追加することで二重エラー検出能力を実現

ECCのエラー訂正の仕組み

ECCの基本的な考え方は元のコードに対してパリティビットを付加するというものだが、コード内のビットの一部に対してパリティを適用し、さらにそれを複数適用することで、エラーの位置を特定できるようにしているというのが大きな特徴だ。

例えば、以下の16ビットのコードを考える。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
bit[15] bit[14] bit[13] bit[12] bit[11] bit[10] bit[9] bit[8] bit[7] bit[6] bit[5] bit[4] bit[3] bit[2] bit[1] bit[0]

例えば、「偶数ビット位置」「奇数ビットの位置」のデータを抽出してパリティを作ると、以下の式でパリティを生成できる。

p[0] = bit[ 0] ^ bit[ 2] ^ bit[ 4] ^ bit[ 6] ^ bit[ 8] ^ bit[10] ^ bit[12] ^ bit[14]
q[0] = bit[ 1] ^ bit[ 3] ^ bit[ 5] ^ bit[ 7] ^ bit[ 9] ^ bit[11] ^ bit[13] ^ bit[15]

このパリティが誤っていた場合 偶数ビットのどれかが誤っている あるいは 奇数ビットのどれかが誤っていることが特定できる。

さらに、連続する複数ビットでパリティビットを作成すると、以下のようになるだろう。

p[1] = bit[ 0] ^ bit[ 1] ^ bit[ 4] ^ bit[ 5] ^ bit[ 8] ^ bit[ 9] ^ bit[12] ^ bit[13]
q[1] = bit[ 2] ^ bit[ 3] ^ bit[ 6] ^ bit[ 7] ^ bit[10] ^ bit[11] ^ bit[14] ^ bit[15]
p[2] = bit[ 0] ^ bit[ 1] ^ bit[ 2] ^ bit[ 3] ^ bit[ 8] ^ bit[ 9] ^ bit[10] ^ bit[11]
q[2] = bit[ 4] ^ bit[ 5] ^ bit[ 6] ^ bit[ 7] ^ bit[12] ^ bit[13] ^ bit[14] ^ bit[15]
p[3] = bit[ 0] ^ bit[ 1] ^ bit[ 2] ^ bit[ 3] ^ bit[ 4] ^ bit[ 5] ^ bit[ 6] ^ bit[ 7]
q[3] = bit[ 8] ^ bit[ 9] ^ bit[10] ^ bit[11] ^ bit[12] ^ bit[13] ^ bit[14] ^ bit[15]
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
p[0]
q[0]
p[1]
q[1]
p[2]
q[2]
p[3]
q[3]

例えば、このコードの中で bit[7] が反転した場合、 q[0] / q[1] / q[2] / p[3] のパリティエラーが検出されることになる。

  • p[3] がエラー : bit[7-0] にエラーが存在している
  • q[2] がエラー : p[3] と合わせて bit[7-4] にエラーが存在している
  • q[1] がエラー : p[3]q[2] と合わせて bit[7-6] にエラーが存在している
  • q[0] がエラー : p[3]q[2]q[1] と合わせて bit[7] がエラーと分かる

もし複数の位置でビットエラーが発生した場合、例えば bit[7] と bit[3] がエラーとなった場合、

  • p[2]q[2] の両方でエラーが検出される

ということになり、 p[i]q[i] (i は同一である必要がある) の両方でエラーが検出されるはずである。この場合は複数ビットのエラーが検出され、これは訂正不可である。