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 は同一である必要がある) の両方でエラーが検出されるはずである。この場合は複数ビットのエラーが検出され、これは訂正不可である。