(57)【特許請求の範囲】
【請求項１】
１ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく２ビット検査データをそれぞれ出力する（ｎ―１）個の２ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記２ビット検査データのそれぞれと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記符号化データから出力データとして出力するビットを選択し、選択したビットを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする半導体装置。
【請求項２】
前記デコード回路は、前記符号化データについての２ビットエラーの検出能力と１ビットのエラー訂正能力とを備え、
前記エラー検出部は、
前記２ビット検査データのそれぞれと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定する第１の判定部と、
前記第１の判定部がエラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が２ビットであるかを判定する第２の判定部と、
を有することを特徴とする請求項１記載の半導体装置。
【請求項３】
前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする請求項１または２記載の半導体装置。
【請求項４】
前記半導体装置は、前記符号化データを記憶する記憶回路をさらに有し、
前記デコード回路は、前記記憶回路から前記符号化データを読み出す、
ことを特徴とする請求項１〜３のいずれか１項に記載の半導体装置。
【請求項５】
前記入力データを前記符号化データに変換して前記記憶回路に書き込むエンコード回路をさらに有することを特徴とする請求項４記載の半導体装置。
【請求項６】
１ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく２ビット検査データをそれぞれ出力する（ｎ―１）個の２ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記２ビット検査データのそれぞれと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記符号化データから出力データとして出力するビットを選択し、選択したビットを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする情報処理装置。
【請求項７】
情報処理装置が、
１ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、
前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく２ビット検査データを（ｎ−１）個出力するとともに、前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力し、
（ｎ−１）個の前記２ビット検査データのそれぞれと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記符号化データから出力データとして出力するビットを選択し、選択したビットを出力する、
ことを特徴とするエラー検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体装置、情報処理装置およびエラー検出方法に関する。
【背景技術】
【０００２】
メモリに記憶されたデータを保護する方法として、ＥＣＣ（Error-Correcting Code）を用いたエラー検出・訂正方法が知られている。ＥＣＣを用いたエラー検出・訂正機能を備えたメモリでは、データの読み出し時において、１ビットのエラー検出および訂正と、２ビットのエラー検出とを行うことができる。ＥＣＣを用いたエラー検出・訂正機能は、例えば、ＤＩＭＭ（Dual Inline Memory Module）規格のＲＡＭ（Random Access Memory）で使用されている。また、ＥＣＣを用いたエラー検出・訂正機能は、バスに転送するデータを保護する目的で使用されることもある。
【０００３】
また、メモリにおけるエラー検出・訂正方法の他の例としては、２ビットのデータに２ビットの冗長ビットを付加したメモリセルに記録し、これらの４ビットデータのうち１ビットまたは２ビットが「０」から「１」に反転でも正しいデータが読み出される可能性が高くなるように読み出しデータを変換するものがある。さらに、１ビットの情報を３つ以上のメモリセルに記録し、各メモリセルの出力の多数決をとるものもある。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開昭６３−３０８８００号公報
【特許文献２】特開昭５８―１０５４９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＥＣＣを用いたエラー検出・訂正処理は、例えばパリティビットを用いたエラー検出方法と比較して、データ伝送の信頼性をより高めることができる。その反面、ＥＣＣを用いたエラー検出・訂正処理は、データの畳み込み演算を含むことから、処理が複雑であり、その処理を実現する回路規模が大きくなるという問題があった。
【０００６】
本発明はこのような課題に鑑みてなされたものであり、小規模な回路でデータ伝送動作の信頼性を高めることが可能な半導体装置、情報処理装置およびエラー検出方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するために、デコード回路を備えた半導体装置が提供される。この半導体装置において、デコード回路は、（ｎ−１）個（ただし、ｎは４以上の整数）の２ビット検査部と、全ビット検査部と、エラー検出部とを有する。２ビット検査部のそれぞれは、１ビットの入力データを冗長化して得られたｎビットの符号化データの入力を受け、この符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく２ビット検査データを出力する。全ビット検査部は、符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する。エラー検出部は、（ｎ−１）個の２ビット検査データと全ビット検査データとに基づいて符号化データに対するエラー検出を行い、エラー検出結果に基づいて入力データを出力する。
【０００８】
また、上記目的を達成するために、上記と同様のデコード回路を備える情報処理装置が提供される。さらに、上記目的を達成するために、上記のデコード回路と同様の処理を実行するエラー検出方法が提供される。
【発明の効果】
【０００９】
上記の半導体装置、情報処理装置およびエラー検出方法によれば、小規模な回路でデータ伝送動作の信頼性を高めることができる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態に係る半導体装置の構成例を示す図である。
【図２】デコーダの内部構成例を示す図である。
【図３】エンコード処理例１での入力データと符号化データとの関係を示す図である。
【図４】エンコード処理例１を実現するエンコーダの回路構成例を示す図である。
【図５】エンコード処理例２での入力データと符号化データとの関係を示す図である。
【図６】エンコード処理例２を実現するエンコーダの回路構成例を示す図である。
【図７】デコード処理例１での入力データとチェックコードおよびデコーダ出力との関係を示す図（その１）である。
【図８】デコード処理例１での入力データとチェックコードおよびデコーダ出力との関係を示す図（その２）である。
【図９】デコード処理例１を実現するデコーダの回路構成例を示す図である。
【図１０】ｎ＝３の場合のデコーダの計算例を示す図（その１）である。
【図１１】ｎ＝３の場合のデコーダの計算例を示す図（その２）である。
【図１２】デコード処理例２での入力データとチェックコードおよびデコーダ出力との関係を示す図（その１）である。
【図１３】デコード処理例２での入力データとチェックコードおよびデコーダ出力との関係を示す図（その２）である。
【図１４】デコード処理例２を実現するデコーダの回路構成例を示す図である。
【図１５】デコード処理例３での入力データとチェックコードおよびデコーダ出力との関係を示す図（その１）である。
【図１６】デコード処理例３での入力データとチェックコードおよびデコーダ出力との関係を示す図（その２）である。
【図１７】デコード処理例３を実現するデコーダの回路構成例を示す図である。
【図１８】シンボル単位のエンコード処理例を示す図である。
【図１９】シンボル単位でエンコードされた符号化データにおけるビット化けパターンの例を示す図である。
【図２０】第２の実施の形態に係るデータ送受信システムの構成例を示す図である。
【図２１】第３の実施の形態に係るストレージシステムのシステム構成例を示す図である。
【図２２】ＣＭのハードウェア構成例を示す図である。
【図２３】監視ＦＰＧＡにおけるデータ転送経路の構成例を示す図である。
【図２４】２つのＣＭのＣＰＵ間でのデータ転送を行うバッファの内部構成例を示すブロック図である。
【図２５】２つのＣＭのＣＰＵ間でデータ転送が正常に行われる際の処理シーケンスの例を示すシーケンス図である。
【図２６】２つのＣＭのＣＰＵ間でのデータ転送に異常が生じた場合の処理シーケンスの例を示すシーケンス図である。
【発明を実施するための形態】
【００１１】
以下、実施の形態について図面を参照して詳細に説明する。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る半導体装置の構成例を示す図である。図１に示す半導体装置１は、メモリ１１０、エンコーダ１２０およびデコーダ２００を備える。
【００１２】
メモリ１１０は、データを記憶する記憶回路であり、例えば、ＤＲＡＭ（Dynamic Random Access Memory）、ＳＲＡＭ（Static RAM）といった揮発性メモリ、フラッシュメモリといった不揮発性メモリなどである。
【００１３】
エンコーダ１２０は、入力データＤｉｎを符号化データＩに変換してメモリ１１０に出力する。エンコーダ１２０は、入力データＤｉｎにおける１ビットの値を冗長化することで、ｎビットの符号化データＩ［（ｎ−１）：０］を生成する。ただし、ｎは４以上の整数である。ここで、符号化データＩの各ビットの値は、あらかじめ決められた値ではなく、入力データＤｉｎの値に応じて決定される。例えば、エンコーダ１２０は、ｎビットのそれぞれに入力データＤｉｎと同じ値を格納した符号化データＩを出力する。
【００１４】
デコーダ２００は、メモリ１１０から出力された符号化データＩに対するエラー検出を行い、エラー検出結果に基づいて出力データＤｏｕｔを出力する。デコーダ２００は、符号化データＩに対する２ビットのエラー検出能力と１ビットのエラー訂正能力とを備える。デコーダ２００は、少なくとも、符号化データＩの全ビットにエラーが生じていない場合、および、符号化データＩのビットのうち１ビットにエラーが生じている場合に、元の入力データＤｉｎに一致する出力データＤｏｕｔを出力する。
【００１５】
このように、デコーダ２００が１ビットのエラー訂正能力を備えることで、メモリ１１０内のメモリセルの異常などに起因してメモリから間違った値が読み出される、いわゆる「ビット化け」が、ｎビットのうちの１ビットにおいて発生した場合でも、出力データＤｏｕｔとして入力データＤｉｎと同じ値を確実に出力できる。従って、エンコーダ１２０が、入力データＤｉｎを符号化データＩに変換した状態でメモリ１１０に記録し、デコーダ２００が、メモリ１１０から読み出した符号化データＩを基に出力データＤｏｕｔを出力することにより、メモリ１１０に読み書きするデータの信頼性を高めることができる。
【００１６】
なお、デコーダ２００は、メモリ１１０とは別の半導体装置に設けられてもよい。エンコーダ１２０も同様に、メモリ１１０とは別の半導体装置に設けられてもよい。
図２は、デコーダの内部構成例を示す図である。デコーダ２００は、（ｎ−１）個の２ビット検査部２１０＿０〜２１０＿（ｎ−２）、全ビット検査部２２０およびエラー検出部２３０を備える。
【００１７】
２ビット検査部２１０＿０〜２１０＿（ｎ−２）のそれぞれは、入力された符号化データＩのビットのうち、それぞれ異なる組合せの２つのビットの値の入力を受ける。２ビット検査部２１０＿０〜２１０＿（ｎ−２）のそれぞれは、入力された２ビットの値同士の比較結果に基づく２ビット検査データを出力する。
【００１８】
２ビット検査部２１０＿０〜２１０＿（ｎ−２）のそれぞれは、例えば、入力された２ビットの値の排他的論理和に基づく値を、２ビット検査データとして出力する。あるいは、２ビット検査部２１０＿０〜２１０＿（ｎ−２）の少なくとも一部は、入力された２ビットのうち一方の値と、他方の値の反転値との排他的論理和を基に、２ビット検査データを出力してもよい。さらに、２ビット検査部２１０＿０〜２１０＿（ｎ−２）の少なくとも一部は、排他的論理和の演算結果を反転した値を、２ビット検査データとして出力してもよい。
【００１９】
全ビット検査部２２０は、入力された符号化データＩの全ビットの排他的論理和に基づく全ビット検査データを出力する。ここで言う「全ビットの排他的論理和をとる演算」とは、例えば、１ビット目と２ビット目との排他的論理和をとり、その結果と３ビット目との排他的論理和をとるといったように、２つの値の排他的論理和を順にとっていく演算を指す。全ビット検査部２２０は、例えば、符号化データＩの全ビットについての排他的論理和の演算結果をそのまま、あるいはその演算結果の反転値を、全ビット検査データとして出力する。
【００２０】
エラー検出部２３０は、２ビット検査部２１０＿０〜２１０＿（ｎ−２）から出力された（ｎ−１）個の２ビット検査データと、全ビット検査部２２０から出力された全ビット検査データとに基づいて、符号化データＩに対するエラー検出を行う。例えば、エラー検出部２３０は、（ｎ−１）個の２ビット検査データの値の組み合わせから、符号化データＩにおける２ビットまでのエラービットの有無を判定できる。さらに、エラー検出部２３０は、（ｎ−１）個の２ビット検査データの値と全ビット検査データの値との組合せから、１ビットエラーの発生と、そのエラービットの位置とを判定できる。エラー検出部２３０は、例えば、１ビットエラーの検出時において、符号化データＩにおけるエラービット以外のビットの値を基に、出力データＤｏｕｔとして元の入力データＤｉｎと同じ値を出力できる。
【００２１】
また、エラー検出部２３０は、例えば、（ｎ−１）個の２ビット検査データの値の組み合わせからエラービットが存在することを検出した場合に、全ビット検査部２２０からの全ビット検査データの値に基づいて、エラービットの数が１ビットであるかを判定してもよい。この場合、１ビットエラーか否かを、（ｎ−１）個の２ビット検査データおよび全ビット検査データからなるｎビットのデータではなく、１ビットの全ビット検査データから判定できるので、判定のための回路構成を簡易化でき、その回路規模を縮小できる。
【００２２】
ここで、本実施の形態では、図２に示すように、２ビット検査部２１０＿０〜２１０＿（ｎ−２）のそれぞれからの２ビット検査データと、全ビット検査部２２０からの全ビット検査データとを下位ビットから順に格納した、ｎビットのチェックコードＣが、エラー検出部２３０に対して入力されるものとする。
【００２３】
また、エラー検出部２３０は、出力データＤｏｕｔの他、エラーが発生したか否かを示すエラー通知信号ＥＲＲと、訂正不可能なエラーか否かを示すエラー通知信号ＵＥとを出力する。デコーダ２００からの出力データＤｏｕｔの入力を受けた信号処理部（図示せず）は、エラー通知信号ＥＲＲが、エラーが発生していないことを示す「０」である場合、または、エラー通知信号ＥＲＲが、エラーが発生したことを示す「１」であり、かつ、エラー通知信号ＵＥが、訂正可能なエラー（すなわち１ビットエラー）であることを示す「０」である場合に、出力データＤｏｕｔが正しい値であることを認識できる。
【００２４】
次に、エンコーダ１２０およびデコーダ２００での処理例および各部の内部構成例について説明する。なお、以下の説明では、例としてｎ＝４とする。
＜エンコード処理例１＞
図３は、エンコード処理例１での入力データと符号化データとの関係を示す図である。
【００２５】
エンコード処理例１では、４ビットの符号化データＩの各ビットには、入力データＤｉｎと同じ値が格納される。例えば、入力データＤｉｎが「０」の場合、符号化データＩは「００００」となり、入力データＤｉｎが「１」の場合、符号化データＩは「１１１１」となる。ここで、符号化データＩがとり得る２つの値「００００」と「１１１１」とのハミング距離は「４」である。ハミング距離が「４」のとき、エラー検出可能な最大ビット数は４／２＝２、エラー訂正可能な最大ビット数は４／２−１＝１となる。すなわち、１ビットエラーの訂正能力を持つためには、符号化データのビット数ｎは、ハミング距離が４以上となる、４以上であることは必須となる。
【００２６】
図４は、エンコード処理例１を実現するエンコーダの回路構成例を示す図である。
図４に示すエンコーダ１２０は、例えば、入力データＤｉｎを４分岐する分岐回路１２１を備える。これにより、エンコーダ１２０は、図３に示すようなデータ変換を実行可能になる。
【００２７】
＜エンコード処理例２＞
図５は、エンコード処理例２での入力データと符号化データとの関係を示す図である。
エンコード処理例２では、４ビットの符号化データＩのビットのうち、下位の２ビットには、入力データＤｉｎと同じ値が格納され、上位の２ビットには、入力データＤｉｎの反転値が格納される。例えば、入力データＤｉｎが「０」の場合、符号化データＩは「１１００」となり、入力データＤｉｎが「１」の場合、符号化データＩは「００１１」となる。ここで、符号化データＩがとり得る２つの値「１１００」と「００１１」とのハミング距離は、エンコーダ構成例１の場合と同様に「４」である。
【００２８】
符号化データＩを図５のように生成することにより、例えば、異常発生などによってメモリ１１０における全メモリセルが「０」または「１」になってしまった場合でも、デコーダ２００においてエラーを正確に検出できるようになる。例えば、図３のように符号化データＩが生成された場合、メモリ１１０から符号化データＩとして「００００」が読み出されたときに、その符号化データＩが正しい値なのか否かを見分けることができない。これに対して、図５のように符号化データＩが生成された場合には、メモリから符号化データＩとして「００００」が読み出されたとき、その符号化データＩが誤っていると判定できる。なお、このような効果は、符号化データＩのうち少なくとも１ビットずつに、入力データＤｉｎと同じ値と、入力データＤｉｎの反転値とを格納することで得られる。
【００２９】
図６は、エンコード処理例２を実現するエンコーダの回路構成例を示す図である。なお、図６では、図４に対応する構成要素には同じ符号を付して示している。
図６に示すエンコーダ１２０は、例えば、入力データＤｉｎを４分岐する分岐回路１２１と、分岐回路１２１からの分岐出力のうち２つの値をそれぞれ反転させる反転器１２２，１２３とを備える。これにより、エンコーダ１２０は、図５に示すようなデータ変換を実行可能になる。
【００３０】
＜デコード処理例１＞
図７，図８は、デコード処理例１での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
【００３１】
デコード処理例１では、符号化データＩが図３のエンコード処理例１のように生成されることを前提とする。図７は、元の入力データＤｉｎが「０」であり、エンコーダ１２０によって生成された符号化データＩが「００００」の場合の計算例を示す。一方、図８は、元の入力データＤｉｎが「１」であり、エンコーダ１２０によって生成された符号化データＩが「１１１１」の場合の計算例を示す。なお、以下の説明において、「＾」は排他的論理和演算を示し、「０ｘ」は１６進数表記を示す。
【００３２】
デコード処理例１において、４ビットのチェックコードＣの各ビットは、デコーダ２００に入力される４ビットの符号化データＩを基に次のように演算される。なお、Ｃ［０］〜Ｃ［２］は、前述の２ビット検査データに対応し、Ｃ［３］は、前述の全ビット検査データに対応する。
Ｃ［０］＝Ｉ［０］＾Ｉ［１］      ・・・（１）
Ｃ［１］＝Ｉ［１］＾Ｉ［２］      ・・・（２）
Ｃ［２］＝Ｉ［２］＾Ｉ［３］      ・・・（３）
Ｃ［３］＝Ｉ［０］＾Ｉ［１］＾Ｉ［２］＾Ｉ［３］      ・・・（４）
図７，図８に示すように、符号化データＩにおいてビット化けが発生していない場合には、チェックコードＣは「０ｘ０」となる。これに対し、符号化データＩにおいて１ビットまたは２ビットのビット化けが発生している場合のチェックコードＣは、「０ｘ０」以外の値となる。このため、デコーダ２００は、チェックコードＣから１ビットまたは２ビットのエラー発生の有無を判定できる。デコーダ２００のエラー検出部２３０（図２参照）は、チェックコードＣが「０ｘ０」の場合にエラー通知信号ＥＲＲを「０」とし、チェックコードＣが「０ｘ０」以外の場合にエラー通知信号ＥＲＲを「１」とする。
【００３３】
また、上記の式（４）の演算により、チェックコードＣのビットのうちＣ［３］は、デコーダ２００に入力される符号化データＩにおける「１」の数の偶奇を示す。このため、Ｃ［３］の値は、１ビットエラー発生時と２ビットエラー発生時とで異なる値になる。従って、デコーダ２００は、エラー通知信号ＥＲＲが「１」の場合に、Ｃ［３］の値から、検出したエラーが１ビットエラーか２ビットエラーかを判定できる。デコーダ２００のエラー検出部２３０は、エラー通知信号ＥＲＲが「１」のとき、Ｃ［３］が「１」である場合には、エラー通知信号ＵＥを訂正可能なエラーを示す「０」とし、Ｃ［３］が「０」である場合には、エラー通知信号ＵＥを訂正不可能なエラーを示す「１」とする。
【００３４】
さらに、図７，図８に示すように、符号化データＩにおいて１ビットエラーが発生している場合、チェックコードＣは、ビット化けの発生位置ごとに異なる値となる。このため、デコーダ２００は、１ビットエラーの発生時には、チェックコードＣの値から符号化データＩにおけるエラー発生位置を判別できる。
【００３５】
デコーダ２００は、エラー発生位置の判別結果に基づき、符号化データＩのビットのうちエラーが発生していないビットの値を、出力データＤｏｕｔとする。図７，図８の例では、デコーダ２００のエラー検出部２３０は、チェックコードが「０ｘ９」の場合、符号化データＩのビットのうちＩ［１］の値を出力データＤｏｕｔとし、チェックコードが「０ｘ９」以外の場合、符号化データＩのビットのうちＩ［０］の値を出力データＤｏｕｔとする。
【００３６】
なお、図７，図８に示すように、エンコーダ１２０によって生成された符号化データＩが「００００」，「１１１１」のいずれの場合でも、上記のような符号化データＩとチェックコードＣとの関係は成立する。このため、デコード処理例１では、メモリセルの出力が「０」から「１」に化ける場合と、「１」から「０」に化ける場合の両方において、２ビットまでのエラー検出と１ビットエラーの訂正とを正確に行うことが可能である。
【００３７】
図９は、デコード処理例１を実現するデコーダの回路構成例を示す図である。図９に示すデコーダ２００は、ＸＯＲ（排他的論理和）ゲート２４１〜２４４、比較器２４５，２４６、反転器２４７，２４８およびセレクタ２４９，２５０を備える。
【００３８】
ＸＯＲゲート２４１〜２４３は、図２に示した２ビット検査部のうちの、例えば２ビット検査部２１０＿０〜２１０＿２に対応する。ＸＯＲゲート２４１〜２４３は、それぞれ上記の式（１）〜（３）の演算を行う。ＸＯＲゲート２４４は、図２に示した全ビット検査部２２０に対応する。ＸＯＲゲート２４４は、上記の式（４）の演算を行う。
【００３９】
比較器２４５および反転器２４７は、符号化データＩにおけるエラー発生の有無を判定するための回路である。比較器２４５は、ＸＯＲゲート２４１〜２４４から出力されるチェックコードＣが「０ｘ０」の場合に「１」を出力し、チェックコードＣが「０ｘ０」以外の場合に「０」を出力する。反転器２４７は、比較器２４５からの出力値を反転し、エラー通知信号ＥＲＲとして出力する。
【００４０】
比較器２４６およびセレクタ２５０は、チェックコードＣに基づいて出力データＤｏｕｔを出力するための回路である。比較器２４６は、チェックコードＣが「０ｘ９」の場合に「１」を出力し、チェックコードＣが「０ｘ９」以外の場合に「０」を出力する。セレクタ２５０は、比較器２４６からの出力値に応じて、符号化データＩのビットのうちＩ［０］の値またはＩ［１］の値を選択し、出力データＤｏｕｔとして出力する。セレクタ２５０は、比較器２４６からの出力値が「１」の場合にＩ［１］の値を出力し、比較器２４６からの出力値が「０」の場合にＩ［０］の値を出力する。
【００４１】
反転器２４８およびセレクタ２４９は、比較器２４５とともに、エラー通知信号ＵＥを生成するための回路を構成する。反転器２４８は、ＸＯＲゲート２４４からのＣ［３］の値を反転する。セレクタ２４９は、比較器２４５の出力値に応じて、ＸＯＲゲート２４４からのＣ［３］の値または反転器２４８からの出力値を選択し、エラー通知信号ＵＥとして出力する。セレクタ２４９は、比較器２４５からの出力値が「１」の場合、すなわち、チェックコードＣが「０ｘ０」の場合に、ＸＯＲゲート２４４からのＣ［３］の値を出力する。一方、セレクタ２４９は、比較器２４５からの出力値が「０」の場合、すなわち、チェックコードＣが「０ｘ０」以外の場合に、反転器２４８からの出力値を出力する。
【００４２】
以上の図９のような回路構成により、図７，図８に示したような、入力される符号化データＩとデコーダ２００からの出力値との関係が得られる。
ここで、比較のために、ｎ＝３の場合のエンコード・デコード処理例について説明する。ここでは、エンコーダ１２０に入力される入力データＤｉｎが「０」の場合、符号化データＩは「０００」とされ、入力データＤｉｎが「１」の場合、符号化データＩは「１１１」とされるものとする。この場合、「０００」と「１１１」との間のハミング距離は「３」であり、エラー訂正可能な最大ビット数は３／２−１＝０．５となる。従って、ｎ＝３の場合、１ビットエラーを訂正できない。このことは、次の図１０，図１１における計算例からも明らかである。
【００４３】
図１０，図１１は、ｎ＝３の場合のデコーダの計算例を示す図である。
図１０，図１１に示すデコーダ２００の計算例では、３ビットのチェックコードＣのうち、Ｃ［０］，Ｃ［１］は上記の式（１），式（２）を用いて計算され、Ｃ［２］が次の式（５）を用いて計算されるものとする。
Ｃ［２］＝Ｉ［０］＾Ｉ［１］＾Ｉ［２］      ・・・（５）
図１０，図１１に示す計算例では、例えば、Ｉ［２］にビット化けが発生した場合と、Ｉ［０］，Ｉ［１］にビット化けが発生した場合のように、１ビットエラーの発生時と２ビットエラーの発生時とで、チェックコードＣの値が同じ値になることがある。また、Ｃ［３］は、１ビットエラーの発生時と２ビットエラーの発生時とで同じ値になる。これらより、図１０，図１１の計算例では、１ビットエラーと２ビットエラーとの判別が不可能であり、さらに、エラービットの発生位置も特定できない。従って、図１０，図１１の計算例では、１ビットエラーの訂正が不可能である。
【００４４】
＜デコード処理例２＞
図１２，図１３は、デコード処理例２での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
【００４５】
デコード処理例２では、符号化データＩが図５のエンコード処理例２のように生成されることを前提とする。図１２は、元の入力データＤｉｎが「０」であり、エンコーダ１２０によって生成された符号化データＩが「１１００」の場合の計算例を示す。一方、図１３は、元の入力データＤｉｎが「１」であり、エンコーダ１２０によって生成された符号化データＩが「００１１」の場合の計算例を示す。また、デコード処理例２では、図１２，図１３に示すように、デコード処理例１と同様の演算式（上記の式（１）〜（４））を用いてチェックコードＣが演算される。
【００４６】
デコード処理例１と同様に、デコード処理例２でも、符号化データＩにおいてビット化けが生じていない場合と、符号化データＩにおいて１ビットまたは２ビットのビット化けが生じている場合とで、チェックコードＣの値が異なる。このため、デコーダ２００は、チェックコードＣから１ビットまたは２ビットのエラー発生の有無を判定できる。デコーダ２００のエラー検出部２３０（図２参照）は、チェックコードＣが「０ｘ２」の場合にエラー通知信号ＥＲＲを「０」とし、チェックコードＣが「０ｘ２」以外の場合にエラー通知信号ＥＲＲを「１」とする。
【００４７】
また、デコード処理例１と同様に、デコード処理例２でも、Ｃ［３］の値は、１ビットエラー発生時と２ビットエラー発生時とで異なる値になる。このため、デコーダ２００は、エラー通知信号ＥＲＲが「１」の場合に、Ｃ［３］の値から、検出したエラーが１ビットエラーか２ビットエラーかを判定できる。デコード処理例２において、エラー通知信号ＵＥは、デコード処理例１と同様に、Ｃ［３］の値を基に出力される。
【００４８】
さらに、デコード処理例１と同様に、デコード処理例２でも、符号化データＩにおいて１ビットエラーが発生している場合には、チェックコードＣがビット化けの発生位置ごとに異なる値となる。このため、デコーダ２００は、１ビットエラーの発生時には、チェックコードＣの値から符号化データＩにおけるエラー発生位置を判別できる。
【００４９】
デコーダ２００は、エラー発生位置の判別結果に基づき、符号化データＩのビットのうちエラーが発生していないビットの値を、出力データＤｏｕｔとする。図１２，図１３の例では、デコーダ２００のエラー検出部２３０は、チェックコードが「０ｘＢ」の場合、符号化データＩのビットのうちＩ［１］の値を出力データＤｏｕｔとし、チェックコードが「０ｘＢ」以外の場合、符号化データＩのビットのうちＩ［０］の値を出力データＤｏｕｔとする。
【００５０】
以上のデコード処理例２では、エンコード処理例２の手順で生成された符号化データＩに基づいてエラー検出・訂正を行うので、例えば、異常発生などによってメモリ１１０における全メモリセルが「０」または「１」になってしまった場合でも、デコーダ２００においてエラーを正確に検出できるようになる。すなわち、デコード処理例２では、エラービットが存在しない状態では、入力される符号化データＩは「１１００」または「００１１」になる。これに対して、メモリ１１０の全メモリセルが「０」，「１」になってしまった場合、入力される符号化データＩはそれぞれ「００００」，「１１１１」となり、デコーダ２００は、エラーが発生したことを検出できる。
【００５１】
なお、図１２，図１３に示すように、エンコーダ１２０によって生成された符号化データＩが「１１００」，「１１００」のいずれの場合でも、上記のような符号化データＩとチェックコードＣとの関係は成立する。このため、デコード処理例２でも、メモリセルの出力が「０」から「１」に化ける場合と、「１」から「０」に化ける場合の両方において、２ビットまでのエラー検出と１ビットエラーの訂正とを正確に行うことが可能である。
【００５２】
図１４は、デコード処理例２を実現するデコーダの回路構成例を示す図である。なお、図１４では、図９に対応する構成要素には同じ符号を付して示す。図１４に示すデコーダ２００は、図９に示したデコーダ２００において、比較器２４５，２４６の代わりに比較器２５１，２５２を設けたものである。
【００５３】
比較器２５１は、ＸＯＲゲート２４１〜２４４から出力されるチェックコードＣが「０ｘ２」の場合に「１」を出力し、チェックコードＣが「０ｘ２」以外の場合に「０」を出力する。従って、エラー通知信号ＥＲＲは、チェックコードＣが「０ｘ２」の場合に「０」、チェックコードＣが「０ｘ２」以外の場合に「１」となる。また、セレクタ２４９は、比較器２５１からの出力値が「１」の場合、すなわち、チェックコードＣが「０ｘ２」の場合に、ＸＯＲゲート２４４からのＣ［３］の値を出力する。一方、セレクタ２４９は、比較器２５１からの出力値が「０」の場合、すなわち、チェックコードＣが「０ｘ２」以外の場合に、反転器２４８からの出力値を出力する。
【００５４】
比較器２５２は、チェックコードＣが「０ｘＢ」の場合に「１」を出力し、チェックコードＣが「０ｘＢ」以外の場合に「０」を出力する。従って、セレクタ２５０は、比較器２５２からの出力値が「１」の場合、すなわち、チェックコードＣが「０ｘＢ」の場合に、Ｉ［１］の値を出力する。一方、セレクタ２５０は、比較器２５２からの出力値が「０」の場合、すなわち、チェックコードＣが「０ｘＢ」以外の場合に、Ｉ［０］の値を出力する。
【００５５】
以上の図１４のような回路構成により、図１２，図１３に示したような、入力される符号化データＩとデコーダ２００からの出力値との関係が得られる。
＜デコード処理例３＞
図１５，図１６は、デコード処理例３での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
【００５６】
デコード処理例３では、符号化データＩが図３のエンコード処理例１のように生成されることを前提とする。図１５は、元の入力データＤｉｎが「０」であり、エンコーダ１２０によって生成された符号化データＩが「００００」の場合の計算例を示す。一方、図１６は、元の入力データＤｉｎが「１」であり、エンコーダ１２０によって生成された符号化データＩが「１１１１」の場合の計算例を示す。
【００５７】
前述のデコード処理例１，２では、デコーダ２００からの出力信号を生成するために、４ビットのチェックコードＣを所定の値と比較する処理が必要とされていた。これに対して、デコード処理例３では、４ビットの値の比較処理が１回で済むように、チェックコード生成のための計算式を選択する。これにより、デコーダ２００での処理負荷を軽減し、その回路規模を縮小する。
【００５８】
デコード処理例３において、４ビットのチェックコードＣの各ビットは、デコーダ２００に入力される符号化データＩを基に次のように演算される。ただし、「〜」は反転（否定）演算を示す。
Ｃ［０］＝〜（Ｉ［０］＾Ｉ［１］）      ・・・（６）
Ｃ［１］＝〜（Ｉ［０］＾Ｉ［２］）      ・・・（７）
Ｃ［２］＝〜（Ｉ［１］＾Ｉ［２］）      ・・・（８）
Ｃ［３］＝〜（Ｉ［０］＾Ｉ［１］＾Ｉ［２］＾Ｉ［３］）      ・・・（９）
デコード処理例１，２と同様に、デコード処理例３でも、符号化データＩにおいてビット化けが生じていない場合と、符号化データＩにおいて１ビットまたは２ビットのビット化けが生じている場合とで、チェックコードＣの値が異なる。このため、デコーダ２００は、チェックコードＣから１ビットまたは２ビットのエラー発生の有無を判定できる。デコーダ２００のエラー検出部２３０（図２参照）は、チェックコードＣが「０ｘＦ」の場合にエラー通知信号ＥＲＲを「０」とし、チェックコードＣが「０ｘＦ」以外の場合にエラー通知信号ＥＲＲを「１」とする。
【００５９】
また、デコード処理例１，２と同様に、デコード処理例３でも、Ｃ［３］の値は、１ビットエラー発生時と２ビットエラー発生時とで異なる値になる。このため、デコーダ２００は、エラー通知信号ＥＲＲが「１」の場合に、Ｃ［３］の値から、検出したエラーが１ビットエラーか２ビットエラーかを判定できる。デコード処理例３において、エラー通知信号ＵＥは、デコード処理例１，２と同様に、Ｃ［３］の値を基に出力される。
【００６０】
さらに、デコード処理例１，２と同様に、デコード処理例３でも、符号化データＩにおいて１ビットエラーが発生している場合には、チェックコードＣがビット化けの発生位置ごとに異なる値となる。このため、デコーダ２００は、１ビットエラーの発生時には、チェックコードＣの値から符号化データＩにおけるエラー発生位置を判別できる。
【００６１】
デコーダ２００は、エラー発生位置の判別結果に基づき、符号化データＩのビットのうちエラーが発生していないビットの値を、出力データＤｏｕｔとする。ここで、デコード処理例３では、デコード処理例１，２と異なり、Ｃ［０］〜Ｃ［２］のうちの１ビットの値を基に、出力データＤｏｕｔの送信元を選択する。図１５，図１６の例では、デコーダ２００のエラー検出部２３０は、Ｃ［２］が「１」の場合にＩ［１］の値を出力データＤｏｕｔとし、Ｃ［２］が「０」の場合にＩ［０］の値を出力データＤｏｕｔとする。
【００６２】
なお、図１５，図１６に示すように、エンコーダ１２０によって生成された符号化データＩが「００００」，「１１１１」のいずれの場合でも、上記のような符号化データＩとチェックコードＣとの関係は成立する。このため、デコード処理例３でも、メモリセルの出力が「０」から「１」に化ける場合と、「１」から「０」に化ける場合の両方において、２ビットまでのエラー検出と１ビットエラーの訂正とを正確に行うことが可能である。
【００６３】
図１７は、デコード処理例３を実現するデコーダの回路構成例を示す図である。なお、図１７では、図９に対応する構成要素には同じ符号を付して示す。図１７に示すデコーダ２００では、図９に示したデコーダ２００から比較器２４６が除去されているとともに、図９に示したデコーダ２００に反転器２６１〜２６４が追加されている。また、図９に示した比較器２４５の代わりに比較器２６５が設けられている。さらに、ＸＯＲゲート２４２，２４３に入力される信号の組み合わせと、セレクタ２５０に対する選択制御信号の出力元も異なっている。
【００６４】
ＸＯＲゲート２４２には、符号化データＩのビットのうちＩ［０］とＩ［２］の各値が入力される。ＸＯＲゲート２４３には、符号化データＩのビットのうちＩ［１］とＩ［２］各値が入力される。反転器２６１〜２６４は、それぞれＸＯＲゲート２４１〜２４４の出力値を反転する。反転器２６１〜２６４からの出力値が、それぞれＣ［０］〜Ｃ［３］となる。
【００６５】
比較器２６５は、反転器２６１〜２６４から出力されるチェックコードＣが「０ｘＦ」の場合に「１」を出力し、チェックコードＣが「０ｘＦ」以外の場合に「０」を出力する。反転器２４７は、比較器２６５からの出力値を反転し、エラー通知信号ＥＲＲとして出力する。
【００６６】
セレクタ２４９には、選択制御信号として、比較器２６５からの出力信号が入力される。セレクタ２４９は、エラー通知信号ＵＥとして、比較器２６５からの出力値が「０」の場合に反転器２６４からのＣ［３］を出力する一方、「１」の場合に反転器２４８からの出力値を出力する。
【００６７】
セレクタ２５０には、選択制御信号として、反転器２６３からのＣ［２］が入力される。セレクタ２５０は、出力データＤｏｕｔとして、Ｃ［２］が「１」の場合にＩ［１］の値を出力し、Ｃ［２］が「０」の場合にＩ［０］の値を出力する。
【００６８】
以上の図１７のような回路構成により、図１５，図１６に示したような、入力される符号化データＩとデコーダ２００からの出力値との関係が得られる。図１７の回路構成によれば、例えば図９や図１４に示した回路構成と比較して、反転器２６１〜２６４が追加されるものの、４ビットの値を比較する比較器２４６または比較器２５２が不要になる。このため、全体として、回路規模を縮小できる。
【００６９】
なお、このような回路規模の縮小効果は、上記デコード処理例３で用いたようなチェックコードＣの演算方法に限らず、他の演算方法を用いた場合でも得ることが可能である。すなわち、Ｃ［０］〜Ｃ［２］のいずれかの値に応じて、符号化データＩのビットのうちエラービットが発生していないビットが選択できるようにＣ［０］〜Ｃ［２］の演算方法を採用することで、回路規模を縮小できる。Ｃ［０］〜Ｃ［２］の演算方法の変え方としては、例えば、排他的論理和の演算対象とする符号化データＩのビットの組み合わせを変える、排他的論理和の演算結果を反転するか否かをＣ［０］〜Ｃ［２］のそれぞれで変える、符号化データＩのうちの２ビットについて排他的論理和をとる際に、その２ビットのうち一方または両方を反転した後に排他的論理和をとる、などの方法がある。
【００７０】
＜シンボル単位のエンコード・デコード処理例＞
上記のエンコード処理例・デコード処理例では、入力データＤｉｎにおける１ビット単位でのエラー検出・訂正について説明したが、複数ビットを単位としたエラー検出・訂正を行うことも可能である。ここでは一例として、８ビットのシンボルを単位としたエラー検出・訂正処理について説明する。
【００７１】
図１８は、シンボル単位のエンコード処理例を示す図である。
図１８では、入力データＤｉｎの１シンボル（８ビット）を、エンコーダ１２０によって３２ビットの符号化データＩに変換する例を示す。符号化データＩは、下位から順に、それぞれ８ビットのＩ０〜Ｉ３によって構成される。また、図１８の例では、入力データＤｉｎにおける１シンボル内の各ビットの値を、Ｉ０，Ｉ１に対してそのまま格納するとともに、Ｉ２，Ｉ３に対してそれぞれ反転させて格納する。このようなエンコード処理は、例えば、図６に示した構成のエンコーダ１２０によって実現可能である。この場合、図６のエンコーダ１２０から出力されるＩ［０］〜Ｉ［３］の代わりに、Ｉ０〜Ｉ３が出力される。
【００７２】
このような処理によって生成された符号化データＩにおけるＩ０〜Ｉ３は、上記のデコーダ２００によってデコードされる。デコード処理は、１ビット単位のデコード処理と同様に実行可能である。例えば、チェックコードＣにおけるＣ［０］〜Ｃ［３］は、それぞれ、上記の式（１）〜（４）、あるいは式（１），（２），（５），（４）、あるいは式（６）〜（９）におけるＩ［０］〜Ｉ［３］に対して、Ｉ０〜Ｉ３を代入することで計算される。Ｃ［０］〜Ｃ［３］のそれぞれが式（１）〜（４）に従って計算される場合、デコーダ２００を、例えば図９のように構成することができる。この場合、図９のデコーダ２００には、Ｉ［０］〜Ｉ［３］の代わりにＩ０〜Ｉ３が入力される。
【００７３】
図１９は、シンボル単位でエンコードされた符号化データにおけるビット化けパターンの例を示す図である。なお、図１９に示す各ビット化けパターンは、入力データＤｉｎとして「０ｘ００」がエンコードされた場合の例を示す。また、それぞれ８ビットを有するＩ０〜Ｉ３の各ビットを、下位側から「第０ビット」、「第１ビット」、・・・、「第７ビット」と呼んで説明する。
【００７４】
ビット化けパターン１は、Ｉ０〜Ｉ３のうちの１つにおいて全ビットでビット化けが生じた場合を示す。図１９の例では、Ｉ３の全ビットでビット化けが生じている。デコーダ２００では、Ｉ０〜Ｉ３のそれぞれの第０ビット同士、第１ビット同士、・・・、第７ビット同士の各組み合わせについて、エラーの検出および訂正が行われる。このため、ビット化けパターン１のようにＩ３の全ビットでビット化けが生じた場合、デコーダ２００はＩ０〜Ｉ３のそれぞれを構成する８ビットすべてにおいて１ビットエラーが発生したと判定する。デコーダ２００は、１ビットエラーの訂正が可能であるので、ビット化けパターン１のようなビット化けが生じた場合には、デコーダ２００は、出力データＤｏｕｔとして「０ｘ００」を正しく出力する。
【００７５】
図１９に示すビット化けパターン２は、符号化データＩにおける複数のビットでビット化けが生じているものの、Ｉ０〜Ｉ３のそれぞれにおける同じビットの組み合わせの中では１組のみでビット化けが生じている場合を示す。図１９の例では、Ｉ０の第３ビットおよび第７ビット、Ｉ１の第２ビットおよび第６ビット、Ｉ２の第１ビットおよび第５ビット、Ｉ３の第０ビットおよび第４ビットにおいて、それぞれビット化けが生じている。この場合、デコーダ２００は、Ｉ０〜Ｉ３のそれぞれを構成する８ビットすべてにおいて１ビットエラーが発生したと判定するとともに、出力データＤｏｕｔとして「０ｘ００」を正しく出力する。
【００７６】
図１９に示すビット化けパターン３は、Ｉ０〜Ｉ３のうちの２つにおいて全ビットでビット化けが生じた場合を示す。図１９の例では、Ｉ２およびＩ３のそれぞれにおいて全ビットでビット化けが生じている。この場合、デコーダ２００は、Ｉ０〜Ｉ３のそれぞれを構成する８ビットすべてにおいて２ビットエラーが発生したことを検出する。しかし、出力データＤｏｕｔが元の入力データＤｉｎと一致するかは保証されない。
【００７７】
図１９に示すビット化けパターン４は、符号化データＩにおける複数のビットでビット化けが生じており、なおかつ、Ｉ０〜Ｉ３のそれぞれにおける同じビットの組み合わせの中の２組でビット化けが生じている場合を示す。図１９の例では、Ｉ０，Ｉ１の第３ビット、Ｉ０，Ｉ１の第７ビット、Ｉ２，Ｉ３の第０ビット、Ｉ２，Ｉ３の第４ビットにおいて、ビット化けが生じている。この場合、デコーダ２００は、Ｉ０〜Ｉ３のそれぞれを構成する８ビットのうち、第０ビット、第３ビット、第４ビットおよび第７ビットにおいて、それぞれ２ビットエラーが発生したことを検出する。しかし、出力データＤｏｕｔが元の入力データＤｉｎと一致するかは保証されない。
【００７８】
以上説明した第１の実施の形態によれば、デコーダ２００において符号化データＩのうち２ビットまでのエラーを検出できるとともに、符号化データＩのうち１ビットのエラーを訂正できる。このため、例えば、メモリ１１０においてｎビット当たり１ビットのビット化けが生じた場合でも、元のデータを正確に読み出すことが可能になる。
【００７９】
また、デコーダ２００は、上記のようなエラー検出・訂正処理を、ＥＣＣを用いたエラー検出・訂正処理と比較して、はるかに簡易な回路構成で実現できる。ＥＣＣを用いたエラー検出・訂正処理では、畳み込み演算などの複雑な演算が必要になるのに対し、上記のデコーダ２００は、ＸＯＲゲートや比較器、セレクタなどを用いた簡単な演算のみで、デコード処理を実現可能である。
【００８０】
例えば、ＬＵＴ（Look Up Table）を用いたＦＰＧＡ（Field-Programmable Gate Array）においてエラー検出・訂正処理を実現するものとすると、１２ビット分のデータを１８ビットのＥＣＣ付きデータに変換して得た符号化データを用いてエラー検出・訂正処理を行う場合、エンコード処理に９ＬＵＴ程度の回路が、デコード処理に５３ＬＵＴ程度の回路が、それぞれ必要になる。これに対して、上記の第１の実施の形態においては、ｎ＝４として、エンコーダ１２０、デコーダ２００をそれぞれ１２個実装した場合、エンコード処理を１ＬＵＴ未満の回路で、デコード処理を２ＬＵＴ程度の回路で、それぞれ実行可能である。
【００８１】
このように、第１の実施の形態のエンコーダ１２０およびデコーダ２００によれば、ＥＣＣを用いた場合と同様に２ビットエラー検出および１ビットエラー訂正が可能でありながらも、このようなエラー検出・訂正処理を簡単な処理で実行可能であり、より小さい規模の回路を用いて実現可能である。従って、ＥＣＣを用いたエラー検出・訂正処理と比較して処理速度を高速化することができる。
【００８２】
〔第２の実施の形態〕
図２０は、第２の実施の形態に係るデータ送受信システムの構成例を示す図である。なお、図２０では、図１に対応する構成要素には同じ符号を付して示す。
【００８３】
第１の実施の形態で示したエンコーダ１２０およびデコーダ２００は、メモリに対する読み書きの他、バスを通じてデータを送受信する際にも使用できる。図２０において、通信装置１０は、エンコーダ１２０が搭載された半導体装置１１を備える。一方、通信装置２０は、デコーダ２００が搭載された半導体装置２１を備える。通信装置１０と通信装置２０との間は、バス３０を通じて接続されている。
【００８４】
通信装置１０から通信装置２０に送信される入力データＤｉｎは、エンコーダ１２０によってｎビットの符号化データＩに変換される。エンコーダ１２０によって生成された符号化データＩは、バス３０を通じて通信装置２０に送信される。なお、バス３０は、シリアルバス、パラレルバスのどちらでもよい。
【００８５】
通信装置２０が受信した符号化データＩは、デコーダ２００に入力される。デコーダ２００は、デコーダ２００は、符号化データＩのビットのうち２ビットまでのエラー検出と１ビットまでのエラー訂正とが可能である。従って、デコーダ２００は、符号化データＩのビットのうちエラーが発生したビットが１ビットまでであれば、出力データＤｏｕｔとして入力データＤｉｎと同じ値を確実に出力する。
【００８６】
以上の構成によれば、異常発生によりバス３０に伝送される信号の値が変化してしまった場合でも、正しい値を伝送できる可能性が高くなり、バス３０での信号伝送の信頼性が向上する。
【００８７】
なお、エンコーダ１２０およびデコーダ２００は、例えば、同一の通信装置内に設けられていてもよい。この場合、バス３０は通信装置の内部バスであり、内部バスでの信号伝送の信頼性が向上する。さらに、エンコーダ１２０およびデコーダ２００が同一の半導体装置内に設けられていてもよい。
【００８８】
〔第３の実施の形態〕
次に、第３の実施の形態として、上記のエンコーダ１２０およびデコーダ２００を搭載したストレージシステムについて説明する。図２１は、第３の実施の形態に係るストレージシステムのシステム構成例を示す図である。
【００８９】
図２１に示すストレージシステムは、ストレージ装置３０１とホスト装置３０２とを備える。ストレージ装置３０１とホスト装置３０２とは、例えば、ＦＣ（Fibre Channel）ケーブルを介して接続されている。
【００９０】
ストレージ装置３０１は、ＤＥ（Drive Enclosure）３１０とＣＭ（Controller Module）４００ａ，４００ｂとを備える。ＤＥ３１０は、ＣＭ４００ａ，４００ｂからのアクセス制御対象となる複数の記憶装置を備える。ＤＥ３１０が備える記憶装置は、例えば、ＨＤＤ（Hard Disk Drive）、ＳＳＤ（Solid State Drive）などの不揮発性記憶装置である。なお、ＤＥ３１０は、ストレージ装置３０１内に複数設けられていてもよい。また、ＤＥ３１０は、ＣＭ４００ａ，４００ｂとは別の筐体内に設けられていてもよい。
【００９１】
ＣＭ４００ａ，４００ｂは、ＤＥ３１０内の複数の記憶装置によって実現される物理記憶領域をＲＡＩＤ（Redundant Arrays of Inexpensive Disks）によって管理し、この物理記憶領域に対するアクセスを制御する。また、ＣＭ４００ａ，４００ｂは、ＤＥ３１０内の複数の記憶装置によって実現される物理記憶領域に論理ボリュームを設定し、ホスト装置３０２から論理ボリュームに対するアクセス要求を受け付けて、そのアクセス要求に応じてＤＥ３１０内の記憶装置にアクセスする。
【００９２】
なお、ＣＭは、ストレージ装置３０１内に３つ以上設けられていてもよい。ＣＭが複数設けられることで、ＤＥ３１０に対するアクセス制御系統が冗長化され、アクセス制御処理の信頼性が向上する。
【００９３】
ホスト装置３０２は、ユーザの操作に応じて、ＣＭ４００ａ，４００ｂに対して、ＣＭ４００ａ，４００ｂが提供する論理ボリュームへのアクセスを要求する。なお、ホスト装置３０２は、例えば、ＣＰＵ（Central Processing Unit）、ＲＡＭなどを備えたコンピュータとして実現される。
【００９４】
図２２は、ＣＭのハードウェア構成例を示す図である。なお、ＣＭ４００ａ，４００ｂは同様のハードウェア構成を有するので、以下の説明では、主にＣＭ４００ａの構成についてのみ説明する。また、ＣＭ４００ａとＣＭ４００ｂとの間で共通の構成要素には、同じ符号を付して示す。
【００９５】
ＣＭ４００ａは、ＣＰＵ４０１によって装置全体が制御されている。ＣＰＵ４０１には、ＲＡＭ４０２および複数の周辺機器が接続されている。ＲＡＭ４０２は、ＣＭ４００ａの主記憶装置として使用され、ＣＰＵ４０１に実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。
【００９６】
ＣＰＵ４０１には、周辺機器の例として、フラッシュメモリ４０３、ＣＡ（Channel Adapter）４０４、ＩＯＣ（In/Out Controller）４０５および監視ＦＰＧＡ４０６が接続されている。フラッシュメモリ４０３は、コントローラ４０７を介してＣＰＵ４０１と接続されており、コントローラ４０７および監視ＦＰＧＡ４０６は、例えば、図示しないＰＣＨ（Platform Controller Hub）を介してＣＰＵ４０１と接続される。また、ＣＡ４０４およびＩＯＣ４０５は、例えば、図示しないＰＣＩ（Peripheral Component Interconnect）スイッチを通じてＣＰＵ４０１と接続される。
【００９７】
フラッシュメモリ４０３は、ＣＭ４００ａの二次記憶装置として使用され、ＣＰＵ４０１によって実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、ＨＤＤなどの他の種類の不揮発性記憶装置が使用されてもよい。
【００９８】
コントローラ４０７は、フラッシュメモリ４０３に対する読み書きを制御する。また、コントローラ４０７は、フラッシュメモリ４０３の記憶領域における不良ブロックを検出し、不良ブロックの位置を示す不良ブロック情報を、監視ＦＰＧＡ４０６を通じてＭＲＡＭ（Magnetoresistive RAM）４０９に格納する機能も備える。
【００９９】
ＣＡ４０４は、ホスト装置３０２とＣＭ４００ａとの間でデータを送受信するインタフェース処理を実行する。
ＩＯＣ４０５は、ＳＡＳ（Serial Attached SCSI，SCSI：Small Computer System Interface）インタフェース処理を実行する回路である。ＣＭ４００ａのＩＯＣ４０５には、ＣＭ４００ａに設けられたＳＡＳエクスパンダ４０８と、ＣＭ４００ｂに設けられたＳＡＳエクスパンダ４０８の両方に接続されている。ＣＭ４００ａのＳＡＳエクスパンダ４０８、およびＣＭ４００ｂのＳＡＳエクスパンダ４０８は、ともにＤＥ３１０に接続されている。ＣＭ４００ａのＩＯＣ４０５は、ＣＭ４００ａのＳＡＳエクスパンダ４０８を通じてＤＥ３１０にアクセスできるとともに、ＣＭ４００ｂのＳＡＳエクスパンダ４０８を通じてＤＥ３１０にアクセスすることもできる。このように、ＣＭ４００ａとＤＥ３１０とを接続する伝送路が冗長化されることで、ＣＭ４００ａからＤＥ３１０の各記憶装置へのアクセス処理の信頼性が向上する。
【０１００】
また、ＣＭ４００ｂのＩＯＣ４０５も同様に、ＣＭ４００ａのＳＡＳエクスパンダ４０８を通じてＤＥ３１０にアクセスできるとともに、ＣＭ４００ｂのＳＡＳエクスパンダ４０８を通じてＤＥ３１０にアクセスすることもできる。このように、ＣＭ４００ｂとＤＥ３１０とを接続する伝送路が冗長化されることで、ＣＭ４００ｂからＤＥ３１０の各記憶装置へのアクセス処理の信頼性が向上する。
【０１０１】
監視ＦＰＧＡ４０６は、ＣＭ４００ａ内のハードウェアの状態を監視する機能を備える。監視ＦＰＧＡ４０６は、例えば、ＣＭ４００ａ内のハードウェアの異常を検出すると、検出した異常の内容を示す異常検出情報をＣＰＵ４０１に通知する。また、監視ＦＰＧＡ４０６にはＭＲＡＭ４０９が接続されており、監視ＦＰＧＡ４０６は、ＣＭ４００ａ内の状態を示す状態情報などを、ＭＲＡＭ４０９に保存する。状態情報には、例えば、各ハードウェアの電源状態、異常発生のログ情報などが記述される。監視ＦＰＧＡ４０６は、ＣＰＵ４０１やＳＡＳエクスパンダ４０８からの要求に応じて、ＭＲＡＭ４０９に記憶された状態情報などを読み出して、その要求元に転送することもできる。
【０１０２】
さらに、監視ＦＰＧＡ４０６は、他方のＣＭ内の監視ＦＰＧＡ４０６との間でデータを送受信する機能も備える。例えば、ＣＭ４００ａの監視ＦＰＧＡ４０６は、ＣＭ４００ａのＣＰＵ４０１あるいはＳＡＳエクスパンダ４０８からの要求に応じて、他方のＣＭ４００ｂ内のＣＰＵ４０１あるいはＳＡＳエクスパンダ４０８に対して情報を送信したり、他方の４００ｂ内のＭＲＡＭ４０９から情報を読み出すことができる。このような動作が行われる際には、監視ＦＰＧＡ４０６は、他方のＣＭ４００ｂ内のハードウェアと通信するための通信インタフェースとして機能する。
【０１０３】
ＣＭ４００ａのＣＰＵ４０１は、例えば、異常検出情報や、自装置の状態を示す状態情報を、他方のＣＭ４００ｂのＣＰＵ４０１に対して、ＣＭ４００ａ，４００ｂの双方の監視ＦＰＧＡ４０６を介して送信する。ＣＭ４００ｂのＣＰＵ４０１は、ＣＭ４００ａからの異常検出情報や状態情報を基に、ＣＭ４００ａの状態を認識することができる。また、ＣＭ４００ａのＣＰＵ４０１は、異常検出情報や状態情報を、他方のＣＭ４００ｂのＭＲＡＭ４０９に対して、ＣＭ４００ａ，４００ｂの各監視ＦＰＧＡ４０６を通じて書き込むこともできる。
【０１０４】
さらに、監視ＦＰＧＡ４０６には、ＣＭの電源がオフの状態でも電源電圧が供給されている。このため、例えば、一方のＣＭ４００ａが異常発生などによって電源オフになった場合、他方のＣＭ４００ｂは、ＣＭ４００ａのＭＲＡＭ４０９に記憶された情報（状態情報、異常検出情報、不良ブロック情報など）を、ＣＭ４００ａ，４００ｂの各監視ＦＰＧＡ４０６を通じて取得することができる。
【０１０５】
ＣＭ４００ｂのＣＰＵ４０１は、例えば、ＣＭ４００ａの動作が異常停止したり、ＣＭ４００ａの電源が異常によってオフになった場合などに、ＣＭ４００ａのＣＰＵ４０１から受信していた情報や、ＣＭ４００ａのＭＲＡＭ４０９に記憶されている情報を基に、ＣＭ４００ａの動作を復帰させるなど、異常発生に応じた適切な処理を実行できる。
【０１０６】
このように、監視ＦＰＧＡ４０６を介して転送される情報は、異常発生時に利用されるなど、システム全体にとって重要な情報が多い。例えば、監視ＦＰＧＡ４０６を通じた情報の伝送時にビット化けが発生した場合、ストレージ装置３０１全体に重大な障害が発生する可能性がある。このため、監視ＦＰＧＡ４０６を通じたデータ転送動作には高い信頼性が求められる。そこで、監視ＦＰＧＡ４０６は、第１・第２の実施の形態で示したエンコーダ１２０およびデコーダ２００を搭載し、エンコーダ１２０やデコーダ２００を介してデータを転送することで、転送されるデータの信頼性を高める。
【０１０７】
図２３は、監視ＦＰＧＡにおけるデータ転送経路の構成例を示す図である。なお、ＣＭ４００ａの監視ＦＰＧＡ４０６とＣＭ４００ｂの監視ＦＰＧＡ４０６は同様の構成を有するので、以下、主にＣＭ４００ａの監視ＦＰＧＡ４０６について説明する。
【０１０８】
ＣＭ４００ａの監視ＦＰＧＡ４０６は、その内部にＲＡＭ（例えばＳＲＡＭ）を備える。監視ＦＰＧＡ４０６内のＲＡＭの少なくとも一部の領域は、監視ＦＰＧＡ４０６を介してデータが転送される際に送受信バッファとして利用される。図２３に示すように、ＣＭ４００ａの監視ＦＰＧＡ４０６は、このような送受信バッファとして、バッファＢＦ００〜ＢＦ０６を備えている。また、ＣＭ４００ａの監視ＦＰＧＡ４０６は、ＣＭ４００ａのＭＲＡＭ４０９に対する読み書きを制御するメモリインタフェース（Ｉ／Ｆ）４２１を備えている。
【０１０９】
さらに、ＣＭ４００ａの監視ＦＰＧＡ４０６は、エンコーダＥ００，Ｅ０１，Ｅ０３〜Ｅ０５，Ｅ１３と、デコーダＤ００〜Ｄ０６，Ｄ１３，Ｄ１６，Ｄ３１とを備える。なお、ＣＭ４００ａにおける監視ＦＰＧＡ４０６の外部にも、エンコーダＥ０２，Ｅ１５，Ｅ２０，Ｅ２１，Ｅ３１と、デコーダＤ１５とが設けられている。これらのエンコーダＥ００〜Ｅ０５，Ｅ１５，Ｅ２０，Ｅ２１，Ｅ３１は、前述のエンコーダ１２０と同様の構成を有し、これらのデコーダＤ００〜Ｄ０６，Ｄ１３，Ｄ１５，Ｄ１６，Ｄ３１は、前述のデコーダ２００と同様の構成を有する。
【０１１０】
ＣＭ４００ａのバッファＢＦ００は、ＣＭ４００ａのＣＰＵ４０１と他方のＣＭ４００ｂのＣＰＵ４０１との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファＢＦ００のＣＰＵ４０１側の入力段には、エンコーダＥ００が設けられており、バッファＢＦ００のＣＰＵ４０１側の出力段には、デコーダＤ００が設けられている。
【０１１１】
ＣＭ４００ａのＣＰＵ４０１から他方のＣＭ４００ｂのＣＰＵ４０１に送信されるデータは、ＣＭ４００ａのエンコーダＥ００によってｎビットの符号化データに変換された後、ＣＭ４００ａのバッファＢＦ００に格納され、符号化データの状態でＣＭ４００ａのバッファＢＦ００からＣＭ４００ｂのバッファＢＦ００に転送される。ＣＭ４００ｂのバッファＢＦ００に格納された符号化データは、ＣＭ４００ｂのＣＰＵ４０１に転送される際に、デコーダＤ００によってデコードされる。ＣＭ４００ａのバッファＢＦ００からの読み出し、または、ＣＭ４００ｂのバッファＢＦ００からの読み出し、または各バッファＢＦ００間の転送の際に、符号化データに１ビットエラーが発生した場合でも、データはＣＭ４００ｂのＣＰＵ４０１に正常に転送される。また、符号化データに２ビットエラーが発生した場合には、ＣＭ４００ｂのデコーダＤ００によって２ビットエラーが検出され、例えば、送信元であるＣＭ４００ａのＣＰＵ４０１に対してデータ転送エラーが通知される。
【０１１２】
ＣＭ４００ｂのＣＰＵ４０１からＣＭ４００ａのＣＰＵ４０１に対してデータが送信される際にも、ＣＭ４００ｂのエンコーダＥ００とＣＭ４００ａのデコーダＤ００の動作によって、上記と同様に１ビットエラーが訂正されるとともに、２ビットエラーが検出される。従って、ＣＭ４００ａのＣＰＵ４０１とＣＭ４００ｂのＣＰＵ４０１との間でのデータ伝送の信頼性が向上する。
【０１１３】
バッファＢＦ０１，ＢＦ０２は、一方のＣＭのＣＰＵ４０１が他方のＣＭのＭＲＡＭ４０９に対して、状態情報、異常検出情報、不良ブロック情報などのデータを読み書きする際の送受信バッファとして使用される。バッファＢＦ０１のＣＰＵ４０１側の入力段には、エンコーダＥ０１が設けられており、バッファＢＦ０１のＣＰＵ４０１側の出力段には、デコーダＤ０１が設けられている。さらに、バッファＢＦ０２のＭＲＡＭ４０９側の出力段には、デコーダＤ０２が設けられている。
【０１１４】
ＣＭ４００ａのＣＰＵ４０１から他方のＣＭ４００ｂのＭＲＡＭ４０９に書き込まれるデータは、ＣＭ４００ａのエンコーダＥ０１によってｎビットの符号化データに変換された後、ＣＭ４００ａのバッファＢＦ０１に格納され、符号化データの状態でＣＭ４００ａのバッファＢＦ０１からＣＭ４００ｂのバッファＢＦ０２に転送される。ＣＭ４００ｂのバッファＢＦ０２に格納された符号化データは、ＣＭ４００ｂのデコーダＤ０２によってデコードされた後、ＣＭ４００ｂのメモリインタフェース４２１を介して、ＣＭ４００ｂのＭＲＡＭ４０９に書き込まれる。ここで、ＣＭ４００ａのバッファＢＦ０１からの読み出しの際、または、ＣＭ４００ｂのバッファＢＦ０２からの読み出しの際、または、ＣＭ４００ａのバッファＢＦ０１からＣＭ４００ｂのバッファＢＦ０２への転送の途中において、符号化データに１ビットエラーが発生した場合でも、データはＣＭ４００ｂのＭＲＡＭ４０９に正常に書き込まれる。また、符号化データに２ビットエラーが発生した場合には、ＣＭ４００ｂのデコーダＤ０２によって２ビットエラーが検出され、例えば、送信元であるＣＭ４００ａのＣＰＵ４０１に対してデータ書き込みエラーが通知される。
【０１１５】
ＣＭ４００ａのＣＰＵ４０１がＣＭ４００ｂのＭＲＡＭ４０９からデータを読み出す際には、読み出し対象のデータは、ＣＭ４００ｂのＭＲＡＭ４０９の出力段に設けられたエンコーダＥ０２によって符号化された状態で、ＣＭ４００ｂのバッファＢＦ０２に格納される。ＣＭ４００ｂのバッファＢＦ０２に格納された符号化データは、ＣＭ４００ａのバッファＢＦ０１に格納され、さらにＣＭ４００ａのデコーダＤ０１によってデコードされた後、ＣＭ４００ａのＣＰＵ４０１に転送される。ここで、ＣＭ４００ｂのバッファＢＦ０２からの読み出しの際、または、ＣＭ４００ａのバッファＢＦ０１からの読み出しの際、または、ＣＭ４００ｂのエンコーダＥ０２からＣＭ４００ｂのバッファＢＦ０２への転送の途中、または、ＣＭ４００ｂのバッファＢＦ０２からＣＭ４００ａのバッファＢＦ０１への転送の途中において、符号化データに１ビットエラーが発生した場合でも、データはＣＭ４００ａのＣＰＵ４０１に正常に転送される。また、符号化データに２ビットエラーが発生した場合には、ＣＭ４００ａのデコーダＤ０１によって２ビットエラーが検出され、例えば、読み出し要求元であるＣＭ４００ａのＣＰＵ４０１に対してデータ読み出しエラーが通知される。
【０１１６】
このように、ＣＭ４００ａのエンコーダＥ０１およびデコーダＤ０１と、ＣＭ４００ｂのエンコーダＥ０２およびデコーダＤ０２の動作により、ＣＭ４００ａのＣＰＵ４０１とＣＭ４００ｂのＭＲＡＭ４０９との間でのデータ伝送の信頼性が向上する。
【０１１７】
ＣＭ４００ａのバッファＢＦ０３は、ＣＭ４００ａのＳＡＳエクスパンダ４０８と他方のＣＭ４００ｂのＳＡＳエクスパンダ４０８との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファＢＦ０３のＣＰＵ４０１側の入力段には、エンコーダＥ０３が設けられており、バッファＢＦ０３のＳＡＳエクスパンダ４０８側の出力段には、デコーダＤ１３が設けられている。また、バッファＢＦ０３のＳＡＳエクスパンダ４０８側の入力段には、エンコーダＥ１３が設けられており、バッファＢＦ０３のＣＰＵ４０１側の出力段には、デコーダＤ０３が設けられている。エンコーダＥ０３，Ｅ１３およびデコーダＤ０３，Ｄ１３の動作により、ＣＰＵ４０１とＳＡＳエクスパンダ４０８との間でのデータ伝送の信頼性が向上する。
【０１１８】
ＣＭ４００ａのバッファＢＦ０４は、ＣＭ４００ａのＳＡＳエクスパンダ４０８と他方のＣＭ４００ｂのＳＡＳエクスパンダ４０８との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファＢＦ０４のＳＡＳエクスパンダ４０８側の入力段には、エンコーダＥ０４が設けられており、バッファＢＦ０４のＳＡＳエクスパンダ４０８側の出力段には、デコーダＤ０４が設けられている。ＣＭ４００ａのエンコーダＥ０４およびデコーダＤ０４と、ＣＭ４００ｂのエンコーダＥ０４およびデコーダＤ０４の動作により、ＣＭ４００ａのＳＡＳエクスパンダ４０８とＣＭ４００ｂのＳＡＳエクスパンダ４０８との間でのデータ伝送の信頼性が向上する。
【０１１９】
ＣＭ４００ａのバッファＢＦ０５は、ＣＭ４００ａのＳＡＳエクスパンダ４０８が、ＣＭ４００ａのＭＲＡＭ４０９に対して、状態情報、異常検出情報などのデータを読み書きする際の送受信バッファとして使用される。ＳＡＳエクスパンダ４０８からＭＲＡＭ４０９へ書き込まれるデータは、バッファＢＦ０５の入力段に設けられたエンコーダＥ０５によって符号化された状態で、バッファＢＦ０５に格納される。バッファＢＦ０５に格納された符号化データは、メモリインタフェース４２１を介して、ＭＲＡＭ４０９の入力段に設けられたデコーダＤ１５に入力され、デコーダＤ１５によってデコードされた後にＭＲＡＭ４０９に書き込まれる。
【０１２０】
一方、ＭＲＡＭ４０９からＳＡＳエクスパンダ４０８に読み出されるデータは、ＭＲＡＭ４０９の出力段に設けられたエンコーダＥ１５によって符号化された状態で、メモリインタフェース４２１を介してバッファＢＦ０５に格納される。バッファＢＦ０５に格納された符号化データは、バッファＢＦ０５の出力段に設けられたデコーダＤ０５によってデコードされた後に、ＳＡＳエクスパンダ４０８に転送される。エンコーダＥ０５，Ｅ１５およびデコーダＤ０５，Ｄ１５の動作によって、ＳＡＳエクスパンダ４０８とＭＲＡＭ４０９との間でのデータ伝送の信頼性が向上する。
【０１２１】
ＣＭ４００ａのバッファＢＦ０６は、ＣＭ４００ａのコントローラ４０７からＣＭ４００ａのＭＲＡＭ４０９に対して、不良ブロック情報などのデータを書き込む際のバッファとして利用される。コントローラ４０７から出力されたデータは、エンコーダＥ２０またはエンコーダＥ２１によって符号化された状態で、バッファＢＦ０６に格納される。エンコーダＥ２０からバッファＢＦ０６に格納された符号化データは、バッファＢＦ０６の出力段に設けられたデコーダＤ０６によってデコードされた後、メモリインタフェース４２１を介してＭＲＡＭ４０９に書き込まれる。同様に、エンコーダＥ２１からバッファＢＦ０６に格納された符号化データは、バッファＢＦ０６の出力段に設けられたデコーダＤ１６によってデコードされた後、メモリインタフェース４２１を介してＭＲＡＭ４０９に書き込まれる。エンコーダＥ２０，Ｅ２１およびデコーダＤ０６，Ｄ１６の動作により、コントローラ４０７からＭＲＡＭ４０９へのデータ伝送の信頼性が向上する。
【０１２２】
また、ＣＭ４００ａの監視ＦＰＧＡ４０６には、ＣＭ４００ａのＣＰＵ４０１がＣＭ４００ａのＭＲＡＭ４０９からデータを読み出す際に動作するデコーダＤ３１が設けられている。ＭＲＡＭ４０９から読み出されたデータは、ＭＲＡＭ４０９の出力段に設けられたエンコーダＥ３１によって符号化され、その符号化データがデコーダＤ３１に入力される。デコーダＤ３１は、入力された符号化データをデコードして、ＣＰＵ４０１に出力する。エンコーダＥ３１およびデコーダＤ３１の動作により、ＭＲＡＭ４０９からＣＰＵ４０１へのデータ伝送の信頼性が向上する。
【０１２３】
ところで、内部にＲＡＭを備える近年のＦＰＧＡでは、内部のＲＡＭの記憶容量が大きくなる傾向にある。一方、上記の監視ＦＰＧＡ４０６が転送するデータのデータ量は、例えば、ホスト装置３０２とＣＭ４００ａ，４００ｂとの間で送受信される論理ボリュームのデータや、ＤＥ３１０とＣＭ４００ａ，４００ｂとの間で送受信される論理ボリュームのデータと比較して、圧倒的に小さい。このため、監視ＦＰＧＡ４０６内のＲＡＭをデータ伝送時のバッファとして使用した場合、ＲＡＭの容量には十分余裕があると言える。図２３に示したバッファＢＦ００〜ＢＦ０６は、いずれも、元のデータを４倍以上のデータ量を持つ符号化データとして記憶するが、上記のようにＲＡＭの容量には余裕があるため、これらの符号化データをＲＡＭに十分記憶できる。
【０１２４】
また、監視ＦＰＧＡ４０６に設けられるエンコーダＥ００，Ｅ０１，Ｅ０３〜Ｅ０５，Ｅ１３は、前述のエンコーダ１２０と同様に構成され、また、デコーダＤ００〜Ｄ０６，Ｄ１３，Ｄ１６，Ｄ３１は、前述のデコーダ２００と同様に構成される。前述のように、エンコーダ１２０およびデコーダ２００は、例えば、ＥＣＣを用いたエラー検出・訂正を行うエンコーダおよびデコーダと比較して、処理手順が簡単であり、回路規模を大幅に縮小できる。このため、図２３のように多くのエンコーダおよびデコーダを設けた場合でも、これらのエンコーダおよびデコーダの処理を監視ＦＰＧＡ４０６が持つ限られた処理能力を用いて十分実現できる。
【０１２５】
すなわち、ＲＡＭの容量に余裕があり、かつ、処理能力にある程度の限界がある監視ＦＰＧＡ４０６に対しては、データ量が増えるものの処理手順が簡単という特徴を有する上記のエンコーダ１２０およびデコーダ２００は、非常に好適である。従って、このようなエンコーダ１２０およびデコーダ２００を図２３のように監視ＦＰＧＡ４０６内に多数設けることで、回路規模や製造コストを増大させることなく、監視ＦＰＧＡ４０６を介して転送されるデータの信頼性を向上させることができる。
【０１２６】
次に、図２３に示したデータ転送経路のうち、代表して、２つのＣＭのＣＰＵ４０１間でのデータ転送処理について説明する。
図２４は、２つのＣＭのＣＰＵ間でのデータ転送を行うバッファの内部構成例を示すブロック図である。
【０１２７】
ＣＭ４００ａにおいて、監視ＦＰＧＡ４０６内のバッファＢＦ００は、上記のエンコーダＥ００およびデコーダＤ００に加えて、通信制御部４３１、送信バッファ４３２および受信バッファ４３３を備える。なお、ＣＭ４００ｂのバッファＢＦ００も、ＣＭ４００ａのバッファＢＦ００と同様の構成を有する。
【０１２８】
ＣＭ４００ａのＢＦ００における通信制御部４３１は、ＣＭ４００ａのＣＰＵ４０１からの要求に応じて、他方のＣＭ４００ｂのＢＦ００における通信制御部４３１に対してパケットを送信する。パケットには、処理を要求する制御パケットと、データを転送するデータパケットとがある。ＣＭ４００ａの通信制御部４３１は、ＣＭ４００ａのＣＰＵ４０１から送信すべきデータを受信すると、そのデータをエンコーダＥ００に符号化データに変換させて送信バッファ４３２に格納する。ＣＭ４００ａの通信制御部４３１は、符号化データを送信バッファ４３２から読み出してデータパケットに埋め込み、そのデータパケットを他方のＣＭ４００ｂのＢＦ００における通信制御部４３１に送信する。また、ＣＭ４００ａの通信制御部４３１は、送信すべきデータをデータパケットを用いて送信した後、制御パケットを送信する。
【０１２９】
また、ＣＭ４００ａの通信制御部４３１は、他方のＣＭ４００ｂの通信制御部４３１からデータバケットを受信すると、受信したデータパケットから符号化データを抽出して、受信バッファ４３３に格納する。ＣＭ４００ａの通信制御部４３１は、その後に他方のＣＭ４００ｂの通信制御部４３１から制御パケットを受信すると、受信バッファ４３３から符号化データを読み出してデコーダＤ００に供給してデコードさせ、デコードされたデータをＣＭ４００ａのＣＰＵ４０１に送信する。
【０１３０】
図２５は、２つのＣＭのＣＰＵ間でデータ転送が正常に行われる際の処理シーケンスの例を示すシーケンス図である。
ＣＭ４００ａのＣＰＵ４０１は、ＣＭ４００ａの監視ＦＰＧＡ４０６内のバッファＢＦ００に対して、他方のＣＭ４００ｂのＣＰＵ４０１に送信する送信データを格納する（ステップＳ１１）。ＣＭ４００ａのバッファＢＦ００内の通信制御部４３１（以下、単に「ＣＭ４００ａの通信制御部４３１」と呼ぶ）は、ＣＭ４００ａのＣＰＵ４０１から受信した送信データを、同じバッファＢＦ００内のエンコーダＥ００に供給する。エンコーダＥ００は、送信データを符号化データに変換して、同じバッファＢＦ００内の送信バッファ４３２に格納する。
【０１３１】
ＣＭ４００ａのＣＰＵ４０１は、送信データの送信を完了すると、ＣＭ４００ａの通信制御部４３１に対して送信指示を送信する（ステップＳ１２）。送信指示を受けたＣＭ４００ａの通信制御部４３１は、ステップＳ１１で送信バッファ４３２に格納された符号化データを読み出して（ステップＳ１３）、データパケットに順に格納し、それらのデータパケットをＣＭ４００ｂの監視ＦＰＧＡ４０６内のバッファＢＦ００に送信する（ステップＳ１４）。ＣＭ４００ｂのバッファＢＦ００内の通信制御部４３１（以下、単に「ＣＭ４００ｂの通信制御部４３１」と呼ぶ）は、ＣＭ４００ａの通信制御部４３１からのデータパケットを受信すると、データパケットから符号化データを抽出して、同じＢＦ００内の受信バッファ４３３に格納する。
【０１３２】
ＣＭ４００ａの通信制御部４３１は、データパケットの送信を完了すると、ＣＭ４００ｂのＣＰＵ４０１へのデータ送信を要求する制御パケットを、ＣＭ４００ｂの通信制御部４３１に送信する（ステップＳ１５）。制御パケットを受信したＣＭ４００ｂの通信制御部４３１は、ＣＭ４００ｂのＣＰＵ４０１に対して割り込みを発行する（ステップＳ１６）。ＣＭ４００ｂのＣＰＵ４０１は、割り込みを受けると、ＣＭ４００ｂの通信制御部４３１に対して、割り込み要因の確認を行う（ステップＳ１７）。例えば、ＣＭ４００ｂの通信制御部４３１は、ステップＳ１６で割り込みを発行した際に、自身が備えるレジスタに「データ受信中」を示すステータス情報を格納する。割り込みを受けたＣＭ４００ｂのＣＰＵ４０１は、ステップＳ１７において、ＣＭ４００ｂの通信制御部４３１のレジスタからステータス情報を読み出すことで、他方のＣＭ４００ａのＣＰＵ４０１から受信したデータがあることを認識する。このとき、ＣＭ４００ｂのＣＰＵ４０１は、ＣＭ４００ｂの通信制御部４３１に対して、データの読み出し指示を発行する（ステップＳ１８）。
【０１３３】
ＣＭ４００ｂの通信制御部４３１は、読み出し指示を受けると、ステップＳ１４で受信バッファ４３３に格納した符号化データをデコーダＤ００を通じて読み出し（ステップＳ１９）、ＣＭ４００ｂのＣＰＵ４０１に送信する。このステップＳ１９では、受信バッファ４３３から読み出された符号化データは、デコーダＤ００によってデコードされ、デコード後の出力データＤｏｕｔが、ＣＭ４００ｂの通信制御部４３１に供給される。このとき、ＣＭ４００ｂの通信制御部４３１は、デコーダＤ００から、出力データＤｏｕｔとともにエラー通知信号ＥＲＲ，ＵＥを受信する。
【０１３４】
図２５の例では、受信バッファ４３３から符号化データが読み出される間、エラー通知信号ＥＲＲが「０」である（すなわち、エラービットなし）か、または、エラー通知信号ＥＲＲ，ＵＥの組み合わせが「１」，「０」である（すなわち、１ビットエラー発生）ものとする。この場合、ＣＭ４００ｂの通信制御部４３１は、デコーダＤ００から出力された出力データＤｏｕｔが正しい値であると判定して、ＣＭ４００ｂのＣＰＵ４０１に対するデータ送信を継続する（ステップＳ２０）。
【０１３５】
ＣＭ４００ｂのＣＰＵ４０１に対するデータ転送が完了すると、ＣＭ４００ｂのＣＰＵ４０１は、ＣＭ４００ｂの通信制御部４３１に対して完了通知を出力する（ステップＳ２１）。完了通知を受信したＣＭ４００ｂの通信制御部４３１は、ＣＭ４００ａの通信制御部４３１に対して、データ送信が完了したことを通知する制御パケットを送信する（ステップＳ２２）。制御パケットを受信したＣＭ４００ａの通信制御部４３１は、ＣＭ４００ａのＣＰＵ４０１に対して割り込みを発行する（ステップＳ２３）。ＣＭ４００ａのＣＰＵ４０１は、割り込みを受けると、ＣＭ４００ａの通信制御部４３１に対して、割り込み要因の確認を行う（ステップＳ２４）。例えば、ＣＭ４００ａの通信制御部４３１は、ステップＳ２３で割り込みを発行した際に、自身が備えるレジスタに「データ送信完了」を示すステータス情報を格納する。割り込みを受けたＣＭ４００ａのＣＰＵ４０１は、ステップＳ２４において、ＣＭ４００ａの通信制御部４３１のレジスタからステータス情報を読み出すことで、他方のＣＭ４００ｂのＣＰＵ４０１に対するデータ送信が完了したことを認識する。
【０１３６】
図２６は、２つのＣＭのＣＰＵ間でのデータ転送に異常が生じた場合の処理シーケンスの例を示すシーケンス図である。なお、図２６では、図２５と同様の処理には同じステップ番号を付して示す。
【０１３７】
図２６において、ステップＳ１１〜Ｓ１９の処理は、図２５と同様であるものとする。ただし、ステップＳ１９において、ＣＭ４００ｂの通信制御部４３１が、受信バッファ４３３からデコーダＤ００を通じて読み出したデータをＣＭ４００ｂのＣＰＵ４０１に送信する間に、デコーダＤ００からのエラー通知信号ＥＲＲ，ＵＥの組み合わせが「１」，「１」になった（すなわち、２ビットエラーが発生した）ものとする（ステップＳ３１）。ＣＭ４００ｂの通信制御部４３１は、エラー通知信号ＥＲＲ，ＵＥの組み合わせが「１」，「１」となったことを検知すると、ＣＭ４００ｂのＣＰＵ４０１へのデータ送信を中止してこのＣＰＵ４０１に対してエラーを通知するとともに、ＣＭ４００ａの通信制御部４３１に対して、エラーを通知する制御パケットを送信する（ステップＳ３２）。
【０１３８】
制御パケットを受信したＣＭ４００ａの通信制御部４３１は、ＣＭ４００ａのＣＰＵ４０１に対して割り込みを発行する（ステップＳ３３）。このとき例えば、ＣＭ４００ａの通信制御部４３１は、自身のレジスタに送信エラー発生を示すステータス情報を格納する。ＣＭ４００ａのＣＰＵ４０１は、割り込みを受けると、ＣＭ４００ａの通信制御部４３１に対して、割り込み要因の確認を行う（ステップＳ３４）。ＣＭ４００ａのＣＰＵ４０１は、ＣＭ４００ａの通信制御部４３１のレジスタからステータス情報を読み出すことで、他方のＣＭ４００ｂのＣＰＵ４０１に対するデータ送信においてエラーが発生したことを認識する。
【０１３９】
以上の図２５，図２６に示した処理手順により、データ送信元のＣＭ４００ａのＣＰＵ４０１は、ＣＭ４００ａ，４００ｂのそれぞれの監視ＦＰＧＡ４０６を介して、他方のＣＭ４００ｂのＣＰＵ４０１に対してデータが正しく送信されたかを認識することができる。従って、ＣＭ４００ａのＣＰＵ４０１からＣＭ４００ｂのＣＰＵ４０１へのデータ送信動作の信頼性が向上する。
【０１４０】
監視ＦＰＧＡ４０６内の他のバッファＢＦ０１〜ＢＦ０６も、上記のバッファＢＦ００とほぼ同様の通信制御部を備えている。各バッファの通信制御部は、同じバッファ内の受信バッファからデコーダを介してデータを読み出す際に、デコーダからのエラー通知信号ＥＲＲ，ＵＥを基に、データの読み出し動作にエラーが発生したかを判定することができる。従って、各バッファを通じたデータの転送動作の信頼性が向上する。なお、監視ＦＰＧＡ４０６におけるデコーダＤ３１は、同じＣＭ内のＣＰＵ４０１に対して、出力データＤｏｕｔとともにエラー通知信号ＥＲＲ，ＵＥを出力する。これにより、デコーダＤ３１から送信されたデータを受信したＣＰＵ４０１は、受信したデータが正しいものであるかを判定できる。
【０１４１】
なお、上記のエンコーダ１２０およびデコーダ２００は、上記のストレージ装置３０１に限らず、様々な情報処理装置に設けることが可能である。また、エンコーダ１２０およびデコーダ２００は、ＦＰＧＡに限らず、様々な半導体装置に形成することが可能である。
【０１４２】
以上の各実施の形態に関し、さらに以下の付記を開示する。
（付記１）  １ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく（ｎ−１）個の２ビット検査データを出力する（ｎ―１）個の２ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする半導体装置。
【０１４３】
（付記２）  前記エラー検出部は、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定する第１の判定部と、
前記第１の判定部がエラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が１ビットであるかを判定する第２の判定部と、
を有することを特徴とする付記１記載の半導体装置。
【０１４４】
（付記３）  前記エラー検出部は、前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記１または２記載の半導体装置。
【０１４５】
（付記４）  前記エラー検出部は、いずれかの前記２ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記１または２記載の半導体装置。
【０１４６】
（付記５）  前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記１〜４のいずれか１つに記載の半導体装置。
【０１４７】
（付記６）  前記半導体装置は、前記符号化データを記憶する記憶回路をさらに有し、
前記デコード回路は、前記記憶回路から前記符号化データを読み出す、
ことを特徴とする付記１〜５のいずれか１つに記載の半導体装置。
【０１４８】
（付記７）  前記入力データを前記符号化データに変換して前記記憶回路に書き込むエンコード回路をさらに有することを特徴とする付記６記載の半導体装置。
（付記８）  １ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく（ｎ−１）個の２ビット検査データを出力する（ｎ―１）個の２ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする情報処理装置。
【０１４９】
（付記９）  前記エラー検出部は、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定する第１の判定部と、
前記第１の判定部がエラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が１ビットであるかを判定する第２の判定部と、
を有することを特徴とする付記８記載の情報処理装置。
【０１５０】
（付記１０）  前記エラー検出部は、前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記８または９記載の情報処理装置。
【０１５１】
（付記１１）  前記エラー検出部は、いずれかの前記２ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記８または９記載の情報処理装置。
【０１５２】
（付記１２）  前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記８〜１１のいずれか１つに記載の情報処理装置。
【０１５３】
（付記１３）  前記情報処理装置は、前記符号化データを記憶する記憶回路をさらに有し、
前記デコード回路は、前記記憶回路から前記符号化データを読み出す、
ことを特徴とする付記８〜１２のいずれか１つに記載の情報処理装置。
【０１５４】
（付記１４）  前記入力データを前記符号化データに変換して前記記憶回路に書き込むエンコード回路をさらに有することを特徴とする付記１３記載の情報処理装置。
（付記１５）  情報処理装置が、
１ビットの入力データを冗長化して得られたｎビット（ただし、ｎは４以上の整数）の符号化データの入力を受け、
前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく（ｎ−１）個の２ビット検査データを出力するとともに、前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力し、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力する、
ことを特徴とするエラー検出方法。
【０１５５】
（付記１６）  前記符号化データに対するエラー検出を行う処理では、
前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定し、
エラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が１ビットであるかを判定する、
ことを特徴とする付記１５記載のエラー検出方法。
【０１５６】
（付記１７）  前記符号化データに対するエラー検出を行う処理では、前記（ｎ−１）個の２ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力することを特徴とする付記１５または１６記載のエラー検出方法。
【０１５７】
（付記１８）  前記符号化データに対するエラー検出を行う処理では、いずれかの前記２ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力することを特徴とする付記１５または１６記載のエラー検出方法。
【０１５８】
（付記１９）  前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記１５〜１８のいずれか１つに記載のエラー検出方法。
【符号の説明】
【０１５９】
１  半導体装置
１１０  メモリ
１２０  エンコーダ
２００  デコーダ
２１０＿０〜２１０＿（ｎ−２）  ２ビット検査部
２２０  全ビット検査部
２３０  エラー検出部
【図１】
0005772192.tif 000002
【図２】
0005772192.tif 000003
【図３】
0005772192.tif 000004
【図４】
0005772192.tif 000005
【図５】
0005772192.tif 000006
【図６】
0005772192.tif 000007
【図７】
0005772192.tif 000008
【図８】
0005772192.tif 000009
【図９】
0005772192.tif 000010
【図１０】
0005772192.tif 000011
【図１１】
0005772192.tif 000012
【図１２】
0005772192.tif 000013
【図１３】
0005772192.tif 000014
【図１４】
0005772192.tif 000015
【図１５】
0005772192.tif 000016
【図１６】
0005772192.tif 000017
【図１７】
0005772192.tif 000018
【図１８】
0005772192.tif 000019
【図１９】
0005772192.tif 000020
【図２０】
0005772192.tif 000021
【図２１】
0005772192.tif 000022
【図２２】
0005772192.tif 000023
【図２３】
0005772192.tif 000024
【図２４】
0005772192.tif 000025
【図２５】
0005772192.tif 000026
【図２６】
0005772192.tif 000027