(57)【特許請求の範囲】
【請求項１】
データを表す第１の部分と、誤りコードを表す第２の部分とを有するデータセットについて、前記データセット内の誤りを訂正するためのコンピュータにより実行される方法において、
（ａ）データセットの第１および第２の部分に基づいてシンドロームコードを生成する段階、
（ｂ）多重ビットテストコードを１という値にセットする段階、
（ｃ）前記シンドロームコードが前記テストコードと等価であるか否かを判定する段階、
（ｄ）前記シンドロームコードが前記テストコードと等価であるという判定に応答して、
ｉ．誤ったビットがあるデータセット内の位置を決定する段階、
ii．データセット内の誤りを訂正するため前記位置で前記誤ったビットを補完する段階、および
iii．前記誤ったビットが訂正された状態のデータセットを表す訂正済みデータセットを出力する段階、
（ｅ）前記シンドロームコードが前記テストコードと等価でないという判定に応答して、前記テストコードの最上位ビットが１であるか否かを判定する段階、
（ｆ）前記テストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記テストコード内の各ビットを１位置だけ左へシフトさせてシフト済みテストコードを導出する段階、
ii．多項式マスキング値と前記シフト済みテストコードとをXORして更新済みテストコードを導出する段階、および
iii．前記テストコードを前記更新済みテストコードと等価になるようにセットする段階、
（ｇ）前記テストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記テストコード内の各ビットを左へ１位置だけシフトさせてシフト済みテストコードを導出する段階、および
ii．前記テストコードを前記シフト済みテストコードと等価になるようセットする段階、
（ｈ）前記段階（ｃ）〜（ｇ）を、選択した数だけ、または前記シンドロームコードが前記テストコードと等価であると判定されるまで、繰り返し実行する段階、
を含んでなる方法。
【請求項２】
前記データセットの第２の部分が、生成多項式を用いて生成され、前記多項式マスキング値が前記生成多項式から導出される請求項１に記載の方法。
【請求項３】
データを表す第１の部分と誤りコードを表す第２の部分とをもつデータセットについて、このデータセット内の誤りを訂正するための、コンピュータにより実行される方法において、
（ａ）データセットの第１および第２の部分に基づいて生成されたシンドロームコードを受け取る段階、
（ｂ）多重ビットテストコードを１という値にセットする段階、
（ｃ）前記シンドロームコードが前記テストコードと等価であるか否かを判定する段階、
（ｄ）前記シンドロームコードが前記テストコードと等価であるという判定に応答して、
ｉ．誤ったビットがあるデータセット内の位置を判定する段階、
ii．データセット内の誤りを訂正するため前記位置で前記誤ったビットを補完する段階、および
iii．前記誤ったビットが訂正された状態のデータセットを表す訂正済みデータセットを出力する段階、
（ｅ）前記シンドロームコードが前記テストコードと等価でないという判定に応答して、前記テストコードの最上位ビットが１であるか否かを判定する段階、
（ｆ）前記テストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記テストコード内の各ビットを１位置だけ左へシフトさせてシフト済みテストコードを導出する段階、
ii．多項式マスキング値と前記シフト済みテストコードとをXORして更新済みテストコードを導出する段階、および
iii．前記テストコードを前記更新済みテストコードと等価になるようにセットする段階、
（ｇ）前記テストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記テストコード内の各ビットを左へ１位置だけシフトさせてシフト済みテストコードを導出する段階、および
ii．前記テストコードを前記シフト済みテストコードと等価になるようセットする段階、
（ｈ）前記段階（ｃ）〜（ｇ）を、選択した数だけ、または前記シンドロームコードが前記テストコードと等価であると判定されるまで、繰り返し実行する段階、
を含んでなる方法。
【請求項４】
前記データセットの第２の部分が生成多項式を用いて生成され、前記多項式マスキング値が前記生成多項式から導出される請求項３に記載の方法。
【請求項５】
データを表す第１の部分と誤りコードを表す第２の部分とをもつデータセットについて、前記データセット内の２重ビット誤りを訂正するための、コンピュータにより実行される方法において、
（ａ）データセットの第１および第２の部分に基づいてシンドロームコードを生成する段階、
（ｂ）第１のカウンタを０という値にセットする段階、
（ｃ）第１の多重ビットテストコードを１という値にセットする段階、
（ｄ）前記第１のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｅ）前記第１のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを１位置だけ左へシフトさせてシフト済みの第１のテストコードを導出する段階、
ii．多項式マスキング値と前記シフト済みの第１のテストコードとをXORして、更新済みの第１のテストコードを導出する段階、および
iii．第２のテストコードを前記更新済みの第１のテストコードと等価になるようにセットする段階、
（ｆ）前記第１のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第１のテストコードを導出する段階、および
ii．前記第２のテストコードを前記シフト済みの第１のテストコードと等価になるようセットする段階、
（ｇ）第２のカウンタを前記第１のカウンタの値に１を加えた値に等しくセットする段階、
（ｈ）前記シンドロームコードが、前記第２のテストコードと前記第１のテストコードとのXORと等価であるか否かを判定する段階、
（ｉ）前記第２のテストコードと前記第１のテストコードとXORと、前記シンドロームコードとが等価であるという判定に応答して、
ｉ．誤ったビットがあるデータセット内の２つの位置を判定する段階、
ii．データセット内の誤りを訂正するため前記位置で前記誤ったビットを補完する段階、および
iii．前記誤ったビットが訂正された状態のデータセットを表す訂正済みデータセットを出力する段階、
（ｊ）前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価でないという判定に応答して、前記第２のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｋ）前記第２のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第２のテストコード内の各ビットを１位置だけ左へシフトさせて、シフト済みの第２のテストコードを導出する段階、
ii．多項式マスキング値と前記シフト済みの第２のテストコードとをXORして、更新済みの第２のテストコードを導出する段階、および
iii．前記第２のテストコードを前記更新済みの第２のテストコードと等価になるようにセットする段階、
（ｌ）前記第２のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第２のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第２のテストコードを導出する段階、および
ii．前記第２のテストコードを前記シフト済みの第２のテストコードと等価になるようセットする段階、
（ｍ）前記第２のカウンタを増分する段階、
（ｎ）前記第２のカウンタが予め定められた値に達するまでかまたは、前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であると判定されるまで、上記段階（ｈ）〜（ｍ）を繰り返し実行する段階、
（ｏ）前記第１のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｐ）前記第１のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを１位置だけ左へシフトさせて、シフト済みの第１のテストコードを導出する段階、
ii．前記多項式マスキング値と前記シフト済みの第１のテストコードとをXORして、更新済みの第１のテストコードを導出する段階、および
iii．前記第１のテストコードを前記更新済みの第１のテストコードと等価になるようにセットする段階、
（ｑ）前記第１のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第１のテストコードを導出する段階、および
ii．前記第１のテストコードを前記シフト済みの第１のテストコードと等価になるようセットする段階、
（ｒ）前記第１のカウンタを増分する段階、および
（ｓ）前記第１のカウンタが第２の予め定められた値に達するまでかまたは、前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であると判定されるまで、上記段階（ｄ）〜（ｒ）を繰り返し実行する段階、
を含んでなる方法。
【請求項６】
前記データセットの第２の部分が生成多項式を用いて生成され、前記多項式マスキング値が前記生成多項式から導出される請求項５に記載の方法。
【請求項７】
データを表す第１の部分と誤りコードを表す第２の部分をもつデータセットについて、前記データセット内の２重ビット誤りを訂正するための、コンピュータにより実行される方法において、
（ａ）データセットの第１および第２の部分に基づいて生成されたシンドロームコードを受け取る段階、
（ｂ）第１のカウンタを０の値にセットする段階、
（ｃ）第１の多重ビットテストコードを１という値にセットする段階、
（ｄ）前記第１のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｅ）前記第１のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを１位置だけ左へシフトさせて、シフト済みの第１のテストコードを導出する段階、
ii．多項式マスキング値と前記シフト済みの第１のテストコードとをXORして、更新済みの第１のテストコードを導出する段階、および
iii．第２のテストコードを前記更新済みの第１のテストコードと等価になるようにセットする段階、
（ｆ）前記第１のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第１のテストコードを導出する段階、および
ii．前記第２のテストコードを前記シフト済みの第１のテストコードと等価になるようセットする段階、
（ｇ）第２のカウンタを、前記第１のカウンタの値に１を加えた値に等しくセットする段階、
（ｈ）前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であるか否かを判定する段階、
（ｉ）前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であるという判定に応答して、
ｉ．誤ったビットがあるデータセット内の２つの位置を判定する段階、
ii．データセット内の誤りを訂正するため前記位置で前記誤ったビットを補完する段階、および
iii．前記誤ったビットが訂正された状態のデータセットを表す訂正済みデータセットを出力する段階、
（ｊ）前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価でないという判定に応答して、前記第２のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｋ）前記第２のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第２のテストコード内の各ビットを１位置だけ左へシフトさせて、シフト済みの第２のテストコードを導出する段階、
ii．前記多項式マスキング値と前記シフト済みの第２のテストコードとをXORして、更新済みの第２のテストコードを導出する段階、および
iii．前記第２のテストコードを前記更新済みの第２のテストコードと等価になるようにセットする段階、
（ｌ）前記第２のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第２のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第２のテストコードを導出する段階、および
ii．前記第２のテストコードを前記シフト済みの第２のテストコードと等価になるようセットする段階、
（ｍ）前記第２のカウンタを増分する段階、
（ｎ）前記第２のカウンタが予め定められた値に達するまでかまたは、前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であると判定されるまで、上記段階（ｈ）〜（ｍ）を繰り返し実行する段階、
（ｏ）前記第１のテストコードの最上位ビットが１であるか否かを判定する段階、
（ｐ）前記第１のテストコードの最上位ビットが１であるという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを１位置だけ左へシフトさせて、シフト済みの第１のテストコードを導出する段階、
ii．前記多項式マスキング値と前記シフト済みの第１のテストコードとをXORして、更新済みの第１のテストコードを導出する段階、および
iii．前記第１のテストコードを前記更新済みの第１のテストコードと等価になるようにセットする段階、
（ｑ）前記第１のテストコードの最上位ビットが１でないという判定に応答して、
ｉ．前記第１のテストコード内の各ビットを左へ１位置だけシフトさせて、シフト済みの第１のテストコードを導出する段階、および
ii．前記第１のテストコードを前記シフト済みの第１のテストコードと等価になるようセットする段階、
（ｒ）前記第１のカウンタを増分する段階、および
（ｓ）前記第１のカウンタが第２の予め定められた値に達するまでかまたは、前記シンドロームコードが、前記第１のテストコードと前記第２のテストコードとのXORと等価であると判定されるまで、上記段階（ｄ）〜（ｒ）を繰り返し実行する段階、
を含んでなる方法。
【請求項８】
前記データセットの第２の部分が生成多項式を用いて生成され、前記多項式マスキング値が前記生成多項式から導出される請求項７に記載の方法。
【発明の詳細な説明】
関連出願
本出願は、1993年６月16日に提出された米国特許出願第08/078,012号の一部継続出願である。
発明の分野
本発明は、一般的にはメモリコヒーレンステーブル、特にキャッシュメモリコヒーレンステーブル内で発生する一時的な（transient）誤りを検出し訂正するための方法および装置に関する。
発明の背景
標準的な高性能コンピュータシステムは、中央処理ユニット（CPU）、主メモリ、キャッシュメモリ、およびメモリ自体の間およびメモリとCPUとの間のデータフローを管理するためのメモリ管理ユニット（MMU）を含んでなる。このようなシステムにおいては、仮想および物理アドレスを用いて、２段（two-tiered）アドレッシング法が一般に実施される。仮想アドレスは、プログラムを実行する際にCPUが生成しそして使用するアドレスに対応し、物理アドレスは、主メモリ内の実際の記憶位置を見付け出すことのできるアドレスに対応する。MMUの機能の１つは、CPUが物理的記憶位置にアクセスできるようにするための仮想アドレスを物理アドレスに変換することにある。
MMUのもう１つの機能は、主メモリ内のデータとキャッシュメモリ内のそのデータのコピーとの間の一貫性を維持することにある。この目的のために、MMUは、主メモリ内の対応する物理的位置に、キャッシュメモリ内の各エントリをマッピングするためのキャッシュ物理アドレステーブル（CPAT:Cache Physical Address Table）を維持する。キャッシュテーブル内の各々のエントリについて、そのキャッシュエントリに対応するデータがどこに見付け出せるかについての、主メモリ内の物理アドレスを有するCPAT内の対応するエントリが、存在する。この物理アドレスは、データの一貫性を維持するために必要なメモリ間のリンクとして機能する。厳密に言うと、データの一貫性を維持するために一般に利用される１つの方策は「コピーバック（copy back）」方策である。この方策によると、キャッシュ内でデータエントリが修正されたときに、ある点において修正されたエントリを主メモリ内にコピーバックすることが必要となる。データを主メモリにコピーバックするためには、修正されたデータが正しい位置にコピーされるように、適当な物理アドレスが与えられなければならない。修正されたキャッシュエントリに対応するCPAT内のエントリは、この物理アドレスを与える。かくして、CPATはデータコヒーレンスを維持する上できわめて重要な役割を果す。
このようなコンピュータシステムは、CPAT内に格納されたデータが正確である場合にはうまく機能するが、CPAT内の物理アドレスのいくつかがCPAT内に発生した一時的誤りに起因して変更された場合には、システムの無欠性が損なわれる可能性がある。例えば、キャッシュ内の修正されたエントリを主メモリにコピーバックする必要があるのに、対応するCPATエントリが破損され、そのためCPATエントリが誤った物理アドレスを含むことになったと仮定してみよう。誤りが検出および訂正されなかった場合には、修正されたデータは誤った位置にコピーバックされることになり、こうしてシステム内に２つの誤りがひき起こされる。まず第１に、このとき、修正されたデータが書き込まれるべきであった記憶位置は、古いデータを含んでいることになる。第２に、修正されたデータが現実に書き込まれている位置は、このとき正しくないデータを含むことになる。これらの誤りはシステムの無欠性を著しく損なう可能性がある。コンピュータシステムの信頼性を最適化するためには、メモリコヒーレンステーブル内に発生し得る一時的誤りを検出し訂正するための手段が必要とされる。
発明の要約
本発明は、コヒーレンステーブル内の誤りを検出し訂正するために、誤り訂正コードを使用する方法および装置を提供する。本発明の装置は、好ましくは、誤りコード発生器、誤り検出器および誤り訂正部を含んでなる。アドレスセットがコヒーレンステーブルのブロックライン（block line）にロードされる毎に、コード発生器はアドレスを受信し、そのアドレスを用いて対応する誤り訂正コードを生成する。好ましくは、生成された誤りコードは、３つの誤りビットを検出し、アドレス内の２つの誤りビットを訂正するのに使用できる、ハミング距離が６のハミング誤り訂正コードである。ひとたび誤りコードが生成されると、該誤りコードは対応するアドレスと共にコヒーレンステーブル内に格納される。
情報がテーブルから読み取られたとき、アドレスおよびその対応する誤りコードの双方は、誤り検出器に出力される。検出器は、出力されたアドレスが何らかの誤りを含むか否かを見極めるため、出力されたアドレスおよび誤りコードを処理する。好ましくは、誤り検出器は、シンドロームコード（syndrome code）を生成すべく出力されたアドレスおよび誤りコードを用いることによって、およびそのシンドロームコードが非ゼロ（non-zero）値を有するか否かを判定することによって、上記の見極めを達成する。シンドロームコードが非ゼロである場合、検出器は、出力されたアドレスが１または複数の誤りを含むことを示すために、誤り信号を生成する。
誤り信号が誤り検出器によって生成された場合、誤り信号は、誤り訂正部の動作を起動する。なお、好ましい実施例においてこの訂正部はコンピュータコードを用いて実現される。この訂正部は、出力されたアドレスおよびそれらに対応する誤りコードを読取ることによって、誤り信号に応答する。その後、訂正部は、修正済みアドレスセットを生成すべく、出力されたアドレスの中の選択されたビットを修正する。修正済みアドレスは、それが何らかの誤りを含んでいるか否かを判定すべく誤りコードを用いて、処理される。誤りが含まれている場合には、出力アドレスは再び修正され、新たに修正されたアドレスは、それが何らかの誤りを含んでいるか否かを判定すべく、誤りコードを用いて再び処理される。アドレスおよび誤りコードを修正し処理するこの手順は、誤りを全く含まない修正済みの正しいアドレスセットが見付け出されるまで続く。この正しいアドレスセットは、テーブル内に一時的誤りが全く無かったとした場合に出力アドレスがあるべき姿である。訂正部はこの正しいアドレスセットを取り出し、これらをコヒーレンステーブルの適当なブロックライン内に書き戻す。かくして破損したアドレスは検出され訂正される。
【図面の簡単な説明】
図１は、本発明による誤りコード発生器30、誤り検出器32および誤り訂正部34を含むコンピュータシステムのブロックダイヤグラムである。
図２は、誤り訂正コードビットECC0の１つを生成するのに使用される多層XORゲート回路の部分回路図である。
図３は、シンドロームコードビットSYN0の１つを生成するのに使用される多層XORゲート回路の部分回路図である。
図４は、シンドロームコードビットの全てがゼロであるか否かを判定するのに使用される判定回路の回路図である。
図５は、本発明の誤り訂正部34についての概括的流れ図である。
図６は、図５に示されたステップ66および68についての詳細な流れ図である。
図７ａ〜７ｃは、図５のステップ72および74についての詳細な流れ図である。
図８ａ〜８ｃは、本発明の誤り訂正部34を実現するのに利用できるコンピュータプログラムのＣプログラミング言語で書かれた原始コードを提供する。
好ましい実施例の詳細な説明
ここで開示されている情報に加えて、1993年６月16日に出願された米国特許出願第08/078,012号の中に含まれている資料は全て、本書に参考として含まれる。
図１を参照すると、本発明を実現するシステム10が示されており、このシステム10には、中央処理ユニット（CPU）12、不揮発性メモリ13、キャッシュメモリ14、メモリ管理部（MMU）16、および主メモリ18が含まれている。システム10の中で、CPU12（Mountain View,CaliforniaのSun Microsystems社が製造するSPARC V9マイクロプロセッサであってよい）は、主メモリ18内に格納されたプログラム命令20にアクセスしこれを実行することによって作動する。これらの命令20を実行する過程において、CPU12は、CPU12が使用し理解する複数の「仮想アドレス」を生成する。しかしながら、これらの仮想アドレスは、主メモリ18の中にある「物理アドレス」との直接的相関関係を全く有していない。したがって、CPU12によって使用される仮想アドレスおよび主メモリ18により使用される物理アドレスを含む２段のアドレッシング法が生み出される。物理アドレスに対し仮想アドレスをマッピングし、これによりCPU12が主メモリ18内で物理的位置をアクセスできるようにするために、仮想から物理へのアドレス変換の完全なセットを含む変換データ構造（TDS:Translation Data Structure）セット22が、主メモリ18の中に維持される。TDS22は、MMU16によって用いられ、CPU12が必要とするアドレス変換をCPU12に提供する。CPU12は、ひとたびMMU16からアドレス変換を受け取ると、変換されたアドレスを用いて主メモリ18内の物理的位置にアクセスする。
プログラムを実行するにあたり、CPU12は、データを検索し修正するためメモリを多数回アクセスすることが必要である。CPU12は、データが必要となる毎に主メモリ18をアクセスできるが、そのための履行は比較的緩慢である。システムの性能を改善するため、最近アクセスされたばかりのデータのいくつかを格納するため、CPU12と主メモリ18との間にはキャッシュメモリ14が置かれる。このデータをCPU12が再び必要とする場合、主メモリ18からではなく、より高速なキャッシュメモリ14からこれを検索することができる。キャッシュメモリ14の好ましい１つの特徴は、そのエントリが「仮想的にタグ付けされる」こと、すなわちキャッシュメモリ14内に格納されたデータエントリが好ましくは物理アドレスではなく仮想アドレスによってタグ付けされることにある。こうすることによってアドレス変換プロセスをバイパスすることが可能となる。一例を挙げると、CPU12は、メモリをアクセスすることを要求する場合、特定の仮想アドレスを出力する。キャッシュメモリ14内のエントリが仮想アドレスを用いてタグ付けされる場合、そしてキャッシュ14の中に特定の仮想アドレスが現在格納されている場合、所望のデータは、仮想アドレスを物理アドレスに変換する必要なくキャッシュ14から検索される。かくして、キャッシュエントリを仮想的にタグ付けすると変換時間が節約され、ひいてはシステムの効率が改善されることになる。
前述のとおり、MMU16の機能の１つは、主メモリ18の中のTDS22をアクセスし参照することにより、CPU12のためにアドレスを変換することにある。変換プロセスを加速するためには、MMU16は、最近要求されたばかりのアドレス変換を保持するため、キャッシュメモリとして作用するテーブルルックアサイドバッファ（TLB:Table Lookaside Buffer）24を保持する。要求された変換がTLB24内に格納されている場合には、その変換はTLB24からの直接検索となり、このためにより低速の主メモリをアクセスする必要性が軽減される。
MMU16のもう１つの機能は、主メモリ18とキャッシュ14との間にデータの一貫性を保つことにある。この目的のために、MMU16は、各々１つの物理アドレスを格納する複数のエントリ27を含むキャッシュ物理アドレステーブル（CPAT）26を保持する。キャッシュ14の中のエントリが仮想アドレスを用いてタグ付けされる、ということを思い出されたい。このことはすなわち、キャッシュエントリがもはや、同一データを見付け出すことのできる、主メモリ18内の物理アドレスへのリンクを全くもたない、ということを意味する。CPAT26は、キャッシュエントリの各々を見付け出すことのできる主メモリ内の物理アドレスをそのエントリ内に格納することによって、上記のリンクを与える。好ましくは、CPAT26内のエントリ27の数は、キャッシュ14内のキャッシュエントリの数と同じであり、これにより各エントリ間に一対一の対応がとれる。
この点を詳述すると、図１のシステムにおいて、キャッシュメモリ14は、各々４つのキャッシュラインエントリを含むＭ個のブロックライン（またはセット）を有するものとして示されている。１つのキャッシュエントリは、仮想アドレスタグとそれに付随するデータセットからなる。かくして、キャッシュ14内では、VA１tag0およびData１0が１つのキャッシュエントリを構成し、VA４tag0およびData４0がもう１つのキャッシュエントリを構成する。これらのエントリのラベル付けに関しては、VAおよびDataに続く数の表示はキャッシュエントリの順序づけを特定し、一方添字で、書かれた数の表示はブロックラインの番号を特定する。かくして、VA４tag0は、ブロックライン０内の４番目のキャッシュエントリについての仮想アドレスタグである。キャッシュ14はこの要領でセットアップされることから、CPAT26も好ましくは同様にして構成される。すなわち、CPAT26は好ましくは、各ブロックラインが４つのエントリ27をもつ状態でＭ個のブロックラインを含んでなる。エントリ27の各々は、対応するキャッシュエントリ内のデータを見付け出すことのできる、主メモリ内の物理アドレスを含む。したがって、CPAT26内のPA１0は好ましくは、キャッシュエントリVA１tag0，Data１0内のデータを見付け出すことのできる、主メモリ内の物理アドレスを含み、PA４0は、キャッシュエントリVA４tag0，Data４0内のデータを見付け出すことのできる、主メモリ内の物理アドレスを含む、といったことになる。この要領で、キャッシュ14内の各エントリは、主メモリ内のその対応する物理アドレスに直接リンクされる。
データの一貫性（またはコヒーレンス）を確保すべくいかにCPAT26を用いるかを例示するため、CPU12が、仮想アドレスＸでデータをアクセスすることを要求しているという仮定を行う。さらにまた、このデータが現在キャッシュ14内に格納されていないということも仮定する。その結果、仮想アドレスＸは、さらなる処理のためMMU16へと転送される。MMU16は仮想アドレスＸを受け取り、それをTLB24を用いて物理アドレスに変換する。図１に示されているように、TLB24のエントリライン９は、仮想アドレス（VA）Ｘとそれに対応する物理アドレス（PA）変換Ｙを含む。このエントリは、仮想アドレスＸを物理アドレスＹに変換するのに用いられる。その後、中に格納されたデータＺを検索するため、主メモリ内の位置Ｙをアクセスするのに物理アドレスＹが用いられる。データＺが主メモリ18から検索された後、CPAT26およびキャッシュ14内の適切なエントリに、該当する情報がロードされる。具体的に言うと、物理アドレスＹがCPAT26のエントリPA１0内にロードされ、仮想アドレスＸがキャッシュ14のVA１tag0内にロードされ、キャッシュ14のData１0にはデータＺがロードされる。
ここで、CPU12がＺからＺ’へと、キャッシュ14のData１0内のデータを修正するということを仮定しよう。こうすることにより、主メモリ18内のデータＺとキャッシュ14内のデータＺ’とは、ここで一貫性のないものとなる。CPU12は、それがキャッシュエントリを修正し従って結果としてのデータの非一貫性をひき起こしたことを認識しているため、CPAT26のブロックライン０の中の汚染（dirty）ビットDB0を「１」に、キャッシュ14のブロックライン０内の汚染ビットDB0を「１」にセットする。これらの汚染ビットのセッティングに応えて、MMU制御部28はデータ（DATA）１0のデータＺ’を取り出し、２つのメモリ14および18を一貫性あるものにするため主メモリ18の中の適切な位置にこのデータを書き戻す。この書き戻し（write-back）操作のために用いられる物理アドレスは、CPAT26のPA１0の中に格納されたアドレス、すなわち物理アドレスＹである。この例から、CPAT26がデータコヒーレンスを維持する上できわめて重要な役割を果していることは明白である。というのも、CPAT26無しでは、MMU制御部28には、どの物理アドレスに対し修正済みデータＺ’を書き込むべきかがわかっていなかったからである。CPAT26内に格納された情報は、データコヒーレンシーのために非常に重要であることから、システムの無欠性を保たなければならない場合には、CPAT26内に発生する全てのデータ破損を検出し訂正する必要がある。
この目的のために、システム10はさらにCPAT26内の誤りを検出し訂正するための装置を含んでなり、この装置には、誤りコード発生器30、誤り検出器32および不揮発性メモリ13内に設けられた誤り訂正部34が含まれている。各構成部分について以下で個別に説明する。
データが主メモリ18からアクセスされ、キャッシュメモリ14内にロードされたときに、そのデータに付随する物理アドレスはCPAT26の中にロードされる。CPAT26には一度に１本のブロックラインがロードされることからそしてCPAT26の各々のブロックラインが４つの物理アドレスを含んでいることから、情報がCPAT内にロードされる毎に４つのアドレスがロードされる。CPAT26内へのアドレスのローディングは、従来設計の構成部分であるMMU制御部28によって制御される。例えば、Motorola MC88200 MMUチップ（Illinois州のSchaumburgのMotorola,Inc.製）内には、類似のMMU制御部が内蔵されている。したがって、MMU制御部28については、ここでは詳述しない。
新しいアドレスがCPAT26にロードされる毎に、誤りコード発生器30はアドレスを受け取り、そのアドレスを用いて誤り訂正コード（ECC:Error Correction Code）を生成する。好ましくは、誤りコードは、アドレス内の誤りを検出し訂正するため後でアドレスと共に処理され得るアドレスを唯一代表するものである。好ましい実施例においては、発生器30により生成された誤り訂正コードは、ハミング誤り訂正コードである。ハミングコーディング理論は既知のものであり、本明細書に参考として組み入れられている、S.LinおよびD.J.Castelloによる「誤り制御コーディング：基礎と応用」、Prentice-Hall,1983,p51〜124の中で記述されている。好ましくは、ハミングコードは、以下の多項式を用いて生成される：
0003741318.tif 000002
この多項式を用いて生成された誤り訂正コードは、６というハミング距離を有する。このようなハミング距離を有するECCを使用して、CPAT26アドレス内で最高３つの誤りビットを検出し最高２つの誤りビットを訂正することができる。好ましい実施例においては、CPAT26の中に格納されている各々の物理アドレスは21のビットを含む。各々のブロックラインは４つのアドレスを含むことから、各々のブロックラインは84のアドレスビットを有することとなる。ハミングコード理論の下で、このビット数について６というハミング距離をもつ誤り訂正コードを生成するためには、15ビットのECCを使用することが必要となる。アドレスビットをＡ０−Ａ83を記すと、以下の論理式を用いて誤り訂正コードECCの15ビットECC0−ECC14が生成される：
0003741318.tif 000003
0003741318.tif 000004
0003741318.tif 000005
0003741318.tif 000006
なお式中、＾はXORを指す。
上述の等式を再検討すると、各誤りコードビットは、単に複数のアドレスビットを一緒にXORすることによって生成されるということがわかる。かくして各コードビットを生成するためには、単に適当な数の入力をもつXORゲートを使用することが可能である。例えば、コードビットECC0は、38入力のXORゲートを用いて生成することができる。しかしながら、このような多数の入力をもつXORゲートはあまりにも複雑でコストが高くつくことから、このような実現は実践不可能である。その代わり、各エラーコードビットは好ましくは、層状になったXORゲート構造を用いて生成される。
一例としては、誤りコードビットECC0は好ましくは、図２に示された層状化XOR回路40を用いて生成される。以上に示したECC0のための論理式から、ECC0を生成するのに38のアドレスビットを一緒にXORしなければならないことがわかっている。これらの入力すべてを収容するため、回路40の最下位レベルに、19の２入力XORゲート42Ａが具備されている。図２に示されているとおり、38のアドレスビットの各々が、XORゲート42Ａ群の１つに対し入力される。最下位層内の各ゲート42Ａは、その２つの入力ビットについてXORをとり、１つの出力を与える。次の層内のXORゲート42Ｂ群の各々は、これらの出力のうちの２つを取り、それらを一緒にXORして第２層出力を与える。次の層内のXORゲート42Ｃ群の各々は第２層出力のうちの２つを取り、それらを一緒にXORして第３層出力を与える。このプロセスは、最上位層に到達するまで続く。２−入力ゲートが使用されることから、連続層の各々は、先行する層の半分の数のゲートを有する。ゲートの数は、最上位層において、１つのゲート42Ｚだけになるまで、連続層の一層毎に減少する。このゲート42Ｚの出力は、誤りコードビットECC0である。かくして、ECC0が生成される。その他の誤りコードビットECC1−ECC14用の等式は、ECC0についてのものときわめて類似していることから、回路40に類似した回路を、残りの誤り訂正コードビットを生成するのに使用することが可能である。かくして、コード発生器30は15の多層XORゲート回路を含んでなり、その各回路は誤り訂正コードECCの15ビットのうちの１つを生成する。ECCが生成された後、そのECCは、コードを生成するのに用いられるアドレスと共にCPAT26のブロックライン内にロードされる。かくして、CPAT26の各ブロックラインは、４つの物理アドレスおよびこれらのアドレスとに付随する１つのECCを含んでなる。
CPAT26の中に格納された情報をアクセスし使用するときが来たとき、CPAT26のブロックラインが誤り検出器32に出力される。具体的に言うと、検出器32は、CPAT26から４つの物理アドレスと対応するECCを受け取り、アドレスが何らかの誤りを含んでいるか否かを判定するためこれらのアドレスおよびECCを処理する。換言すると、検出器32は、出力されたアドレスおよびECCに基づいて、出力されたアドレスがECCを生成するのに当初使用されたアドレスと同じであるか否かを判定する。同じでない場合には、アドレスは、CPAT26内に格納されていた間に破損されたという結論を下すことができる。好ましくは、検出器32は、２段階プロセスを用いることによりこの誤り判定を行う。まず第１に、検出器32は、15ビットシンドロームコード（syndrome code）SYN0−SYN14を生成すべく、出力されたアドレスおよびECCを使用する。その後、検出器32は、シンドロームコードSYNが非ゼロ（non-zero）値を有するか否かを判定する。シンドロームコードが非ゼロである場合、出力されたアドレスは誤りを含む。
出力されたアドレスをＡ０−Ａ83と記して、15のシンドロームコードビットSYN0−SYN14は、以下の論理式を用いて生成される。
0003741318.tif 000007
0003741318.tif 000008
0003741318.tif 000009
0003741318.tif 000010
なおここで、＾はXORを意味する。
これらの等式とECCコードビットを生成するための等式とを比較すると、等式が実質的に同じであるという興味深い点が明らかになる。例えば、SYN0用の等式は、SYN0が付加的入力としてECC0を必要とするという点を除いて、ECC0用の等式と同一である。その他の入力は全て同じである。同様にして、SYN1についての等式は、付加的入力としてSYN1がECC1を必要とするという点を除いて、ECC1についての等式と同一である。その他のシンドロームビットの全てについて同じことが言える。これがもつ実践的な意味は、誤り検出器32がシンドロームビットを生成すべくコード発生器30内の回路を再使用できるということにある。必要な唯一の修正は、１つのXORゲートの付加である。例として、シンドロームビットSYN0を生成するための回路が図３に示されている。図３の回路50と図２の回路40との間の唯一の差異は、入力の１つとしてECC0をもつXORゲート52が付加されることにある。その他の全ての構成部分は同一である。かくして、ECC0を生成するために用いられる回路を、シンドロームビットSYN0を生成するために再使用することができる。コード発生器30のその他の回路を再使用し、１つの付加的なXORゲートを含むべく回路を修正することにより、同様の要領でその他のシンドロームビットSYN1−SYN14を生成することができる。かくして、誤り検出器32は、好ましくは、各々15のシンドロームビットSYN1−SYN14の１つを生成する、回路50に類似した15の回路を含んでなる。コード発生器30および誤り検出器32の両方の中に同一の回路部品を使用した結果として、本発明を実現するのに必要とされるハードウェアについて大幅な節約を図ることができる。
シンドロームコードビットSYN0−SYN14が生成された後、全てのシンドロームビットがゼロであるか否かを判定する必要がある。これは、図４に示されたもののような判定回路にシンドロームビットを送ることによって実施できる。その決定回路は好ましくは、入力として15のシンドロームビットSYN0−SYN14を受け取る15の入力のORゲート54の形をとる。シンドロームビットSYN0−SYN14の全てがゼロである場合、ORゲート54の出力56はゼロとなり、かくして、これは、いかなる誤りも起こらなかったということを表す。いずれかのシンドロームビットが１である場合、ORゲート54は、アドレスが誤りを含むことを表すため１を出力することになる。かくして、ORゲート54の出力56は、出力されたアドレスが何らかの誤りを含むとき、誤り信号を出力すべく、誤り検出器32の出力として機能する。
ここで再び図１を参照すると、誤り検出器32がその出力56に誤り信号を生成した場合、この誤り信号は誤り訂正部34の動作を起動する。好ましい実施例においては、誤り訂正部34は、不揮発性メモリ13の中に格納されるアセンブリレベル命令コードにより実現されるが、その他のタイプのコンピュータコードを用いて訂正部34を実現することもでき、また主メモリ18といったような他のメモリにそれを設けることもできるという点に留意すべきである。訂正部34は、ハードウェア部品を用いても実現できるが、このような実現はかなり複雑でコストのかかるものとなる。特に本明細書に記述されたものでの実現は、それが本発明の装置の複雑性を大幅に減少させるという理由で選択されたものである。
図５を参照すると、訂正部34のための全体的な流れ図が提供されている、訂正部34がCPU12によって実行される場合、これは、訂正部34を呼出させたCPAT26内のエントリをCPU12がまず読取り受け取るようにする（60）。上述のとおり、このエントリは、アドレス（この例では84ビット）を含む第１の部分、および誤りコード（この例では15ビット）を含む第２の部分を含む。簡略化のために、CPATエントリを以下では「データ」と呼び、アドレスを「データ部分」、誤りコードを誤りコード部分と呼ぶことにする。本発明によると、CPATエントリをData〔Ｘ−１：０〕と記すことができる。なおここでＸ（この例では99である）はエントリ内のビット数である。
データがひとたび受信されると、そのデータのためのシンドロームコードが導出される（62）。シンドロームコードは、２つの方法のうちの１つから導出できる。まず第１に、誤り検出器32は、誤りについてデータを検査する上でシンドロームコードをすでに生成していることから、CPU12は誤り検出器32からシンドロームコードを受理することができる。代替的には、CPU12は、誤り訂正部34の制御下でシンドロームコードを生成することができる。いずれの方法を使用してもよい。シンドロームコードがひとたび導出されると（62）、CPU12は、データ内に実際に誤りが存在することを確認するため、シンドロームコードを検査する（64）。ステップ64は、好ましくは、シンドロームコードが非ゼロ値を有するか否かを判定することによって実行される。もしコードがゼロであると、データが全く誤りを含んでおらず、誤り検出器32が偽りの警報を生成したという結論を下すことができる。このような場合、CPU12は、誤り訂正ルーチン34を退出できる（65）。しかしながら、シンドロームコードが非ゼロである場合、データがまさに誤りを含んでいるという結論を下すことができる。その結果、CPU12はステップ66まで進み、誤りを訂正しようと試みる。
CPU12は好ましくは、単一ビット誤りについてまず検査することにより（66）、誤り訂正プロセスを開始する。単一ビット誤りが検出されると、CPU12は単一ビット誤りを訂正し（68）、訂正ルーチン34より退出する（70）。一方、単一ビット誤りが全く検出されない場合、CPU12は、２重ビット誤りについて検査するためステップ72まで進む。２重ビット誤りが検出されたならば、CPU12は２重ビット誤りを訂正し（74）、その後、訂正ルーチン34から退出する（76）。しかしながら、２重ビット誤りが全く検出されない場合、それはすなわち、データが訂正不能誤りを含んでいることを意味する。このような場合には、CPU12は、訂正不能誤りが発生したという表示（誤りメッセージまたは誤り信号等）を与える（78）。その後、CPU12は、誤り訂正ルーチン34から退出する（80）。
以上では、誤り訂正部34について一般的に記述してきた。訂正部34についてさらに詳しく記述するためにここで、それぞれ、図５のステップ66および68についてのより詳しい流れ図および図５のステップ72および74についてのより詳しい流れ図を示す図６および図７ａ〜図７ｃを参照することにする。
まず第１に図６を参照すると、本発明の単一ビット誤り検出／訂正方法のための詳細な流れ図が示されている。CPU12によって実行されるこの方法は、好ましくは、選択されたパラメータの初期化で始まる（90）。まず第１に、テストコード（test code）が１という値にセットされる。好ましくは、このテストコードは多重ビット変数（multiple bit variable）である。同様に、カウンタｎは０にセットされる。さらに、フラグ変数（flag variable）が０にセットされる。以下でさらに記述するとおり、このフラグは、訂正可能な誤りが検出されたか否かを表す。上述の変数がひとたびセットされたならば、CPU12はステップ92に進み、カウンタｎがＸの値より小さいか否かを判定する。好ましくは、値Ｘは、誤りコードを含めた、データ内のビットの数に等しい（この例では99ビット）。ｎがＸより小さい場合、それはすなわち、ステップ92〜104を含むループが予め定められた回数だけ実行され、それ以上実行されるべきでないことを意味する。このような場合、CPU12はループから退出し、ステップ106へ進む。ステップ106およびそれ以降のステップについては後の節で記述する。
一方、カウンタｎがＸより小さい場合、CPU12はステップ94へ進み、ステップ62で導出されたシンドロームコード（図５）がテストコードの現行値に等しいか否かを判定する。等しい場合、それはすなわち、単一ビットの訂正可能な誤りがデータ内に発見されたことを意味し、その場合、CPU12は、訂正可能な誤りが発見されたことを示すべくフラグ変数を１にセットし、ステップ106へ進む。
しかしながら、シンドロームコードが現行のテストコードの値に等しくない場合、CPU12は、現行のテストコードの最上位ビット（MSB）が１であるか否かを判定するステップ98まで進む。１である場合には、CPU12はステップ100へ進んで、テストコードの各ビットを１位置だけ左にシフトさせる。その後、CPU12はシフトされたテストコードおよび多項式マスキング値（ポリマスク）についてXOR動作を実行する。このポリマスク（polymask）は、好ましくは、データ内に含まれた誤りコードを生成するために用いられるものと同じ生成多項式から導出される。この例では、生成多項式は、この開示の８ページ、20行目に示されているものである。ポリマスク値は、好ましくは、（１）最高位成分（Ｘ15）を除去すること、（２）変数Ｘに値２を代入することそして（３）全ての成分を加算することによって導出される。示されている生成多項式について、ポリマスク値は20269である。テストコードがひとたびシフトされポリマスクでXORがとられたならば、CPU12は任意に、選択されたマスキング値でANDとすることができる。この付加的ステップは単にテストコードのフィールドを四捨五入するのに役立ち、要求される場合にはスキップすることもできる。CPU12がひとたびステップ100内に示された全ての関数を実行し、かくして更新済みテストコードを導出したならば、CPU12は現行のテストコードを、更新済みテストコードに等しくセットする。
ステップ98に戻ると、現行のテストコードのMSBが１に等しくないとCPU12が判定した場合、CPU12はステップ102に分岐してその中に示された関数を実行する。すなわち、CPU12は、テストコード内の各ビットを１位置だけ左へシフトさせ、次に（任意には）シフト済みテストコードを、選択されたマスキング値とANDをとって更新済みテストコードを導出する。それがひとたび行われた時点で、CPU12は現行のテストコードを更新済みテストコードに等しくなるようセットする。
ステップ100または102のいずれが実行されるかとは無関係に、CPU12により実現される次のステップは、カウンタｎを１だけ増分させることである（104）。それがひとたび行われた時点で、CPU12はステップ92までループバックして上述のステップを繰り返す。このプロセスは、ステップ92〜104を、選択された回数だけ実行し終わるまで、または単一の訂正可能なビットが発見されるまで続く。
ループ92〜104からいかに退出するかとは無関係に、ステップ106がループからの退出時に実行される。ステップ106では、CPU12は、フラグ変数が１にセットされたか否かを判定する。フラグが１にセットされなかった場合、それはすなわち、単一ビットの訂正可能な誤りが発見されなかったことを意味する。そのような場合、CPU12は、ステップ72（図５）へ進み（108）、２重ビットの訂正可能な誤りについて検査する。しかしながら、フラグ変数が１にセットされかくして単一ビットの訂正可能な誤りが発見されたことが表示された場合、CPU12は、データ内の誤ったビットの位置を決定するように進む（110）。この決定は、好ましくは、カウンタｎの現行値を用いることによって行われる。ループ92〜104からの退出の時に、カウンタｎは現行値を含むことになる。誤ったビットのデータ内の位置を決定すべく、カウンタの値ｎは、値１と共に、データ内のビット数Ｘから減算される。誤ったビットの位置がひとたび確認されたならば、CPU12はこの誤ったビットを、好ましくはそれをその補数に等しくセットすることによって訂正する（112）。ひとたびこれが行われると、CPAT26内に全く誤りが存在しなかった場合にデータがあるべきであった姿を表す訂正済みデータのセットが導出される。CPU12は、好ましくは、訂正済みデータのこのセットをCPAT26に出力し（114）、そのセットをCPAT26の適当なエントリ内に書込み（116）、その中に現在格納されている古い誤ったデータセットと置き換える。これがひとたび行われると、CPU12はステップ70（図５）へ進んで誤り訂正部34から退出する（118）。誤りは発見され訂正されたことになる。
ここで、データが複数の誤ったビットを含んでいると仮定する。このような場合、CPU12は、図７ａ〜７ｃに示されたステップを実行して２重ビット誤りの位置を見付け訂正するように試みる。CPU12は、選択された変数を初期化することによって（130）、プロセスを開始する。より具体的に言うと、CPU12は、第１の多重ビットテストコード（TEST１）を１の値にセットし、第１のカウンタｎを０にセットし、フラグ変数を０にセットする。その後、CPU12は、第１のカウンタｎの値がＸ−１よりも小さいか否かを決定すること（132）によって第１のループの中に入り、ここにＸは再びデータ内のビット数となる。ｎがＸ−１よりも小さくない場合、これはすなわち、ステップ132が既に予め定められた回数実行されたことを意味し、この場合、CPU12はループから退出し、図７ｃのステップ180へ進む。図７ｃについては、後の節でより詳細に説明する。
一方、ｎがＸ−１よりも小さい場合、CPU12は、ステップ134へ進み、第１のテストコード、TEST１のMSBが１であるか否かを判定する。１である場合、CPU12はステップ136へ分岐する。そうでない場合、CPU12はステップ138へと分岐する。ステップ136では、CPU12は、３つの主要な機能を実行する。まず第１に、CPU12は、第１のテストコード、TEST１中のビットの各々を１位置だけ左へシフトさせる。第２に、CPU12は、上述のポリマスク値でシフト済みの第１のテストコードをXORして、更新済みテストコードを導出する。CPU12はさらにマスキング値でANDオペレーションを実行してテストコードを四捨五入することも、随意に、できる。第３に、CPU12は、第２のテストコード、TEST２、を、前述の最初の２つの機能の結集として誘導された更新済みテストコードに等しくなるようセットする。ステップ136は、第２のテストコード、TEST２、の値を更新するよう作用する。
ステップ138は、同様に第２のテストコード、TEST２、の値を更新する。しかしながら、CPU12はステップ138においてXORを全く実行しない。むしろ、CPU12は第１のテストコード、TEST１、の中のビットの各々を１位置だけ左へシフトするだけである。CPU12は、マスキング値でANDをさらに実行して、テストコードを四捨五入することも、随意に、できる。ひとたびこれが行われると、CPU12は第２のテストコード、TEST２、を、シフト済みのテストコードに等しくなるようにセットする。
どのステップ(136または138)が実行されるかとは無関係に、CPU12は、第１のカウンタの現行値ｎに１を加えたものに等しい値に、第２のカウンタｐをセットするよう、ステップ140へ進む。ステップ140において第２のカウンタｐがひとたびセットされたならば、CPU12はステップ150（図７ｂ）へ進んで第２のかつ入れ子型のループに入る。この第２のループにおいて、CPU12は、第２のカウンタｐの現行値がＸ（すなわちデータ内のビットの数）よりも小さいか否かを判定すること（150）から開始する。小さくない場合、それはすなわち、第２のループがすでに予め定められた回数だけ実行されたことを意味する。このような場合、CPU12はループを退出してステップ164まで進む。しかしながら、ｐがＸよりも小さい場合、CPU12はステップ152へ行き、ステップ62で誘導されたシンドロームコード（syndrome code）（図５）が、第２のテストコード、TEST２、と第１のテストコードTEST１とのXORの結果に等しいか否かを判定する。シンドロームコードが、TEST２でXORされたTEST１に等しい場合、それはすなわち、データ内に２重ビットの訂正可能な誤りが発見されたことを意味する。このような場合、CPU12は、フラグ変数の値を１にセットし（154）、２重ビットの訂正可能な誤りが発見されたことを表示し、図７ｃのステップ180へ進む。
一方、ステップ152における答えがNOであった場合、そのときCPU12はステップ156へ進んで第２のテストコード、TEST２、のMSBが１であるか否かを判定する。YESである場合、CPU12はステップ158を実行する。そうでない場合、CPU12はステップ160を実行する。ステップ158では、CPU12は３つの主要な機能を実行する。まず第１に、CPU12は第２のテストコード、TEST２、の中のビットの各々を左へ１位置だけシフトする。第２に、CPU12は、更新済みテストコードを誘導するために、上述のポリマスク値とシフト済みの第２のテストコードとをXORする。CPU12は、テストコードを四捨五入するためマスキング値とのANDをさらに実行することも、随意に、できる。第３に、CPU12は、第２のテストコード、TEST２、を誘導されたばかりの更新済みテストコードに等しくなるようセットする。ステップ158は、第２のテストコード、TEST２、の値を更新するように作用する。
ステップ160も、ステップ158と同様に、第２のテストコードTEST２の値を更新する。しかしながらステップ160では、CPU12はいかなるXORも実行しない。その代わりに、CPUは第２のテストコードTEST２内の各ビットを左へ１位置だけシフトさせるだけである。CPUはさらに、テストコードを四捨五入するためマスキング値とANDを実行することも、随意に、できる。それがひとたび行われると、CPU12は第２のテストコード、TEST２、をシフト済みテストコードと等しくなるようにセットする。
ステップ158または160のいずれが実行されるかとは無関係に、CPU12はその後第２のカウンタｐを１だけ増分する（162）。その後、CPU12はステップ150までループバックして、上述のプロセスを繰り返す。CPU12は好ましくは、ループが予め定められた回数だけ実行されてしまうまで、または、シンドロームコードが、第２のテストコードと第１のテストコードとのXORに等しいと判定されるまで（ステップ152）、ループ150〜162を繰り返す。
CPU12がステップ150の結果、ループ150〜162を退出したならば、そのときCPU12は、第１のテストコード、TEST１、のMSBが１であるか否かを判定すべく、ステップ164へ進む。もし１である場合には、CPU12はステップ166を実行する。そうでなければ、CPU12はステップ168を実行する。ステップ166では、CPU12は３つの主要な機能を実行する。まず第１に、CPU12は、第１のテストコード、TEST１、内のビットの各々を左へ１位置だけシフトする。第２にCPU12は、更新済みテストコードを導出すべく、上述のポリマスク値と、シフト済みの第１のテストコードとをXORする。CPU12はさらにマスキング値とANDを実行してテストコードを四捨五入することも、随意に、できる。第３に、CPU12は第１のテストコード、TEST１、を、上述の最初の２つの機能の結果として誘導された更新済みテストコードに等しくなるようにセットする。ステップ166は、第１のテストコード、TEST１の値を更新するよう作用する。
ステップ168は同様にして、第１のテストコード、TEST１、の値を更新する。しかしながらCPU12は、ステップ168ではいかなるXORも実行しない。むしろ、CPU12は、第１のテストコード、TEST１内のビットの各々を左へ１位置だけシフトさせるだけである。CPU12はさらにマスキング値でANDを実行して、テストコードを四捨五入することも、随意に、できる。それがひとたび行われると、CPU12は、第１のテストコード、TEST１、をシフトされたテストコードに等しくなるようにセットする。
ステップ166または168のいずれが実行されるかに拘わらず、CPU12はその後第１のカウンタｎを１だけ増分（170）。その後、CPU12は、図７ａのステップ132までループバックして第１のループを繰り返す。好ましくは、CPU12は、ループが予め定められた回数だけ実行されてしまうまで、またはシンドロームコードが、第２のテストコードTEST２と第１のテストコードTEST１とのXORに等しいと判定されるまで、第１のループを繰り返す。
第１および第２のループから退出した時、CPU12は図７ｃのステップ180に進む。ステップ180では、CPU12は、フラグ（FLAG）変数が１にセットされたか否かを判定する。セットされていない場合、それは２重ビットの訂正可能な誤りが発見されなかったことを意味する。このような場合、CPU12は図５のステップ78へ進み（182）、データ内の誤りが訂正され得ないという表示を提供する。一方、フラグ変数が１にセットされ、かくして２重ビット訂正可能な誤りが発見されたことが表示された場合には、CPU12はステップ184へ進んで、誤ったビットの位置を決定する。CPU12が第１および第２のループを退出した時、第１および第２のカウンタｎおよびｐは現行の値を含むことになる。これらの現行値は、誤ったビットの位置を決定するのに用いられる。より具体的に言うと、第１の位置（LOCATION１）は、値Ｘから、１と共に第１のカウンタｎの現行値ｎ、を減算することによって導出される。第２の位置（LOCATION２）は、値Ｘから、１と共に第２のカウンタの現行値ｐ、を減算することによって確かめられる。かくしてデータ内の誤ったビットの位置が決定される。
誤ったビットの位置がひとたびわかると、CPU12は、図７ｃのステップ186に示されたとおり、好ましくは誤ったビットをその補数に等しくセットすることによって、このビットを訂正する（186）。誤ったビットがひとたび訂正されると、CPAT26内に全く誤りが無かった場合のデータのあるべき姿を表す１セットの訂正済みデータが誘導される。CPU12は、CPAT26に対してこの訂正済みデータのセットを出力し（188）、それをCPATの適当なエントリに書込んで（190）、現在その中に含まれている破損したエントリと置き換える。かくして、誤ったデータは検出され訂正される。その後、CPU12は誤り訂正部34から退出して（192）、通常のオペレーションに戻る。
付加的な開示として、図８ａ〜図８ｃには誤り訂正部34のための原始コードセットが示されている。原始コードは、例えばCPUとしてSPARC V9マイクロプロセッサをもつシステム内で使用するためのＣ言語の形で書き込まれる。混同を避けるため、原始コードにおいては、（１）シンドロームコードに可変的「チェック」が割当てられること、（２）第１のテストコードに可変的「シンドローム」が割当てられ、（３）第２のテストコードに可変的「シンドローム１」が割当てられることに留意されたい。
【図１】
0003741318.tif 000011
【図２】
0003741318.tif 000012
【図３】
0003741318.tif 000013
【図４】
0003741318.tif 000014
【図５】
0003741318.tif 000015
【図６】
0003741318.tif 000016
【図７ａ】
0003741318.tif 000017
【図７ｂ】
0003741318.tif 000018
【図７ｃ】
0003741318.tif 000019
【図８ａ】
0003741318.tif 000020
【図８ｂ】
0003741318.tif 000021
【図８ｃ】
0003741318.tif 000022