以下、実施の形態について図面を参照して詳細に説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る半導体装置の構成例を示す図である。図1に示す半導体装置1は、メモリ110、エンコーダ120およびデコーダ200を備える。
メモリ110は、データを記憶する記憶回路であり、例えば、DRAM(Dynamic Random Access Memory)、SRAM(Static RAM)といった揮発性メモリ、フラッシュメモリといった不揮発性メモリなどである。
エンコーダ120は、入力データDinを符号化データIに変換してメモリ110に出力する。エンコーダ120は、入力データDinにおける1ビットの値を冗長化することで、nビットの符号化データI[(n−1):0]を生成する。ただし、nは4以上の整数である。ここで、符号化データIの各ビットの値は、あらかじめ決められた値ではなく、入力データDinの値に応じて決定される。例えば、エンコーダ120は、nビットのそれぞれに入力データDinと同じ値を格納した符号化データIを出力する。
デコーダ200は、メモリ110から出力された符号化データIに対するエラー検出を行い、エラー検出結果に基づいて出力データDoutを出力する。デコーダ200は、符号化データIに対する2ビットのエラー検出能力と1ビットのエラー訂正能力とを備える。デコーダ200は、少なくとも、符号化データIの全ビットにエラーが生じていない場合、および、符号化データIのビットのうち1ビットにエラーが生じている場合に、元の入力データDinに一致する出力データDoutを出力する。
このように、デコーダ200が1ビットのエラー訂正能力を備えることで、メモリ110内のメモリセルの異常などに起因してメモリから間違った値が読み出される、いわゆる「ビット化け」が、nビットのうちの1ビットにおいて発生した場合でも、出力データDoutとして入力データDinと同じ値を確実に出力できる。従って、エンコーダ120が、入力データDinを符号化データIに変換した状態でメモリ110に記録し、デコーダ200が、メモリ110から読み出した符号化データIを基に出力データDoutを出力することにより、メモリ110に読み書きするデータの信頼性を高めることができる。
なお、デコーダ200は、メモリ110とは別の半導体装置に設けられてもよい。エンコーダ120も同様に、メモリ110とは別の半導体装置に設けられてもよい。
図2は、デコーダの内部構成例を示す図である。デコーダ200は、(n−1)個の2ビット検査部210_0〜210_(n−2)、全ビット検査部220およびエラー検出部230を備える。
2ビット検査部210_0〜210_(n−2)のそれぞれは、入力された符号化データIのビットのうち、それぞれ異なる組合せの2つのビットの値の入力を受ける。2ビット検査部210_0〜210_(n−2)のそれぞれは、入力された2ビットの値同士の比較結果に基づく2ビット検査データを出力する。
2ビット検査部210_0〜210_(n−2)のそれぞれは、例えば、入力された2ビットの値の排他的論理和に基づく値を、2ビット検査データとして出力する。あるいは、2ビット検査部210_0〜210_(n−2)の少なくとも一部は、入力された2ビットのうち一方の値と、他方の値の反転値との排他的論理和を基に、2ビット検査データを出力してもよい。さらに、2ビット検査部210_0〜210_(n−2)の少なくとも一部は、排他的論理和の演算結果を反転した値を、2ビット検査データとして出力してもよい。
全ビット検査部220は、入力された符号化データIの全ビットの排他的論理和に基づく全ビット検査データを出力する。ここで言う「全ビットの排他的論理和をとる演算」とは、例えば、1ビット目と2ビット目との排他的論理和をとり、その結果と3ビット目との排他的論理和をとるといったように、2つの値の排他的論理和を順にとっていく演算を指す。全ビット検査部220は、例えば、符号化データIの全ビットについての排他的論理和の演算結果をそのまま、あるいはその演算結果の反転値を、全ビット検査データとして出力する。
エラー検出部230は、2ビット検査部210_0〜210_(n−2)から出力された(n−1)個の2ビット検査データと、全ビット検査部220から出力された全ビット検査データとに基づいて、符号化データIに対するエラー検出を行う。例えば、エラー検出部230は、(n−1)個の2ビット検査データの値の組み合わせから、符号化データIにおける2ビットまでのエラービットの有無を判定できる。さらに、エラー検出部230は、(n−1)個の2ビット検査データの値と全ビット検査データの値との組合せから、1ビットエラーの発生と、そのエラービットの位置とを判定できる。エラー検出部230は、例えば、1ビットエラーの検出時において、符号化データIにおけるエラービット以外のビットの値を基に、出力データDoutとして元の入力データDinと同じ値を出力できる。
また、エラー検出部230は、例えば、(n−1)個の2ビット検査データの値の組み合わせからエラービットが存在することを検出した場合に、全ビット検査部220からの全ビット検査データの値に基づいて、エラービットの数が1ビットであるかを判定してもよい。この場合、1ビットエラーか否かを、(n−1)個の2ビット検査データおよび全ビット検査データからなるnビットのデータではなく、1ビットの全ビット検査データから判定できるので、判定のための回路構成を簡易化でき、その回路規模を縮小できる。
ここで、本実施の形態では、図2に示すように、2ビット検査部210_0〜210_(n−2)のそれぞれからの2ビット検査データと、全ビット検査部220からの全ビット検査データとを下位ビットから順に格納した、nビットのチェックコードCが、エラー検出部230に対して入力されるものとする。
また、エラー検出部230は、出力データDoutの他、エラーが発生したか否かを示すエラー通知信号ERRと、訂正不可能なエラーか否かを示すエラー通知信号UEとを出力する。デコーダ200からの出力データDoutの入力を受けた信号処理部(図示せず)は、エラー通知信号ERRが、エラーが発生していないことを示す「0」である場合、または、エラー通知信号ERRが、エラーが発生したことを示す「1」であり、かつ、エラー通知信号UEが、訂正可能なエラー(すなわち1ビットエラー)であることを示す「0」である場合に、出力データDoutが正しい値であることを認識できる。
次に、エンコーダ120およびデコーダ200での処理例および各部の内部構成例について説明する。なお、以下の説明では、例としてn=4とする。
<エンコード処理例1>
図3は、エンコード処理例1での入力データと符号化データとの関係を示す図である。
エンコード処理例1では、4ビットの符号化データIの各ビットには、入力データDinと同じ値が格納される。例えば、入力データDinが「0」の場合、符号化データIは「0000」となり、入力データDinが「1」の場合、符号化データIは「1111」となる。ここで、符号化データIがとり得る2つの値「0000」と「1111」とのハミング距離は「4」である。ハミング距離が「4」のとき、エラー検出可能な最大ビット数は4/2=2、エラー訂正可能な最大ビット数は4/2−1=1となる。すなわち、1ビットエラーの訂正能力を持つためには、符号化データのビット数nは、ハミング距離が4以上となる、4以上であることは必須となる。
図4は、エンコード処理例1を実現するエンコーダの回路構成例を示す図である。
図4に示すエンコーダ120は、例えば、入力データDinを4分岐する分岐回路121を備える。これにより、エンコーダ120は、図3に示すようなデータ変換を実行可能になる。
<エンコード処理例2>
図5は、エンコード処理例2での入力データと符号化データとの関係を示す図である。
エンコード処理例2では、4ビットの符号化データIのビットのうち、下位の2ビットには、入力データDinと同じ値が格納され、上位の2ビットには、入力データDinの反転値が格納される。例えば、入力データDinが「0」の場合、符号化データIは「1100」となり、入力データDinが「1」の場合、符号化データIは「0011」となる。ここで、符号化データIがとり得る2つの値「1100」と「0011」とのハミング距離は、エンコーダ構成例1の場合と同様に「4」である。
符号化データIを図5のように生成することにより、例えば、異常発生などによってメモリ110における全メモリセルが「0」または「1」になってしまった場合でも、デコーダ200においてエラーを正確に検出できるようになる。例えば、図3のように符号化データIが生成された場合、メモリ110から符号化データIとして「0000」が読み出されたときに、その符号化データIが正しい値なのか否かを見分けることができない。これに対して、図5のように符号化データIが生成された場合には、メモリから符号化データIとして「0000」が読み出されたとき、その符号化データIが誤っていると判定できる。なお、このような効果は、符号化データIのうち少なくとも1ビットずつに、入力データDinと同じ値と、入力データDinの反転値とを格納することで得られる。
図6は、エンコード処理例2を実現するエンコーダの回路構成例を示す図である。なお、図6では、図4に対応する構成要素には同じ符号を付して示している。
図6に示すエンコーダ120は、例えば、入力データDinを4分岐する分岐回路121と、分岐回路121からの分岐出力のうち2つの値をそれぞれ反転させる反転器122,123とを備える。これにより、エンコーダ120は、図5に示すようなデータ変換を実行可能になる。
<デコード処理例1>
図7,図8は、デコード処理例1での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
デコード処理例1では、符号化データIが図3のエンコード処理例1のように生成されることを前提とする。図7は、元の入力データDinが「0」であり、エンコーダ120によって生成された符号化データIが「0000」の場合の計算例を示す。一方、図8は、元の入力データDinが「1」であり、エンコーダ120によって生成された符号化データIが「1111」の場合の計算例を示す。なお、以下の説明において、「^」は排他的論理和演算を示し、「0x」は16進数表記を示す。
デコード処理例1において、4ビットのチェックコードCの各ビットは、デコーダ200に入力される4ビットの符号化データIを基に次のように演算される。なお、C[0]〜C[2]は、前述の2ビット検査データに対応し、C[3]は、前述の全ビット検査データに対応する。
C[0]=I[0]^I[1] ・・・(1)
C[1]=I[1]^I[2] ・・・(2)
C[2]=I[2]^I[3] ・・・(3)
C[3]=I[0]^I[1]^I[2]^I[3] ・・・(4)
図7,図8に示すように、符号化データIにおいてビット化けが発生していない場合には、チェックコードCは「0x0」となる。これに対し、符号化データIにおいて1ビットまたは2ビットのビット化けが発生している場合のチェックコードCは、「0x0」以外の値となる。このため、デコーダ200は、チェックコードCから1ビットまたは2ビットのエラー発生の有無を判定できる。デコーダ200のエラー検出部230(図2参照)は、チェックコードCが「0x0」の場合にエラー通知信号ERRを「0」とし、チェックコードCが「0x0」以外の場合にエラー通知信号ERRを「1」とする。
また、上記の式(4)の演算により、チェックコードCのビットのうちC[3]は、デコーダ200に入力される符号化データIにおける「1」の数の偶奇を示す。このため、C[3]の値は、1ビットエラー発生時と2ビットエラー発生時とで異なる値になる。従って、デコーダ200は、エラー通知信号ERRが「1」の場合に、C[3]の値から、検出したエラーが1ビットエラーか2ビットエラーかを判定できる。デコーダ200のエラー検出部230は、エラー通知信号ERRが「1」のとき、C[3]が「1」である場合には、エラー通知信号UEを訂正可能なエラーを示す「0」とし、C[3]が「0」である場合には、エラー通知信号UEを訂正不可能なエラーを示す「1」とする。
さらに、図7,図8に示すように、符号化データIにおいて1ビットエラーが発生している場合、チェックコードCは、ビット化けの発生位置ごとに異なる値となる。このため、デコーダ200は、1ビットエラーの発生時には、チェックコードCの値から符号化データIにおけるエラー発生位置を判別できる。
デコーダ200は、エラー発生位置の判別結果に基づき、符号化データIのビットのうちエラーが発生していないビットの値を、出力データDoutとする。図7,図8の例では、デコーダ200のエラー検出部230は、チェックコードが「0x9」の場合、符号化データIのビットのうちI[1]の値を出力データDoutとし、チェックコードが「0x9」以外の場合、符号化データIのビットのうちI[0]の値を出力データDoutとする。
なお、図7,図8に示すように、エンコーダ120によって生成された符号化データIが「0000」,「1111」のいずれの場合でも、上記のような符号化データIとチェックコードCとの関係は成立する。このため、デコード処理例1では、メモリセルの出力が「0」から「1」に化ける場合と、「1」から「0」に化ける場合の両方において、2ビットまでのエラー検出と1ビットエラーの訂正とを正確に行うことが可能である。
図9は、デコード処理例1を実現するデコーダの回路構成例を示す図である。図9に示すデコーダ200は、XOR(排他的論理和)ゲート241〜244、比較器245,246、反転器247,248およびセレクタ249,250を備える。
XORゲート241〜243は、図2に示した2ビット検査部のうちの、例えば2ビット検査部210_0〜210_2に対応する。XORゲート241〜243は、それぞれ上記の式(1)〜(3)の演算を行う。XORゲート244は、図2に示した全ビット検査部220に対応する。XORゲート244は、上記の式(4)の演算を行う。
比較器245および反転器247は、符号化データIにおけるエラー発生の有無を判定するための回路である。比較器245は、XORゲート241〜244から出力されるチェックコードCが「0x0」の場合に「1」を出力し、チェックコードCが「0x0」以外の場合に「0」を出力する。反転器247は、比較器245からの出力値を反転し、エラー通知信号ERRとして出力する。
比較器246およびセレクタ250は、チェックコードCに基づいて出力データDoutを出力するための回路である。比較器246は、チェックコードCが「0x9」の場合に「1」を出力し、チェックコードCが「0x9」以外の場合に「0」を出力する。セレクタ250は、比較器246からの出力値に応じて、符号化データIのビットのうちI[0]の値またはI[1]の値を選択し、出力データDoutとして出力する。セレクタ250は、比較器246からの出力値が「1」の場合にI[1]の値を出力し、比較器246からの出力値が「0」の場合にI[0]の値を出力する。
反転器248およびセレクタ249は、比較器245とともに、エラー通知信号UEを生成するための回路を構成する。反転器248は、XORゲート244からのC[3]の値を反転する。セレクタ249は、比較器245の出力値に応じて、XORゲート244からのC[3]の値または反転器248からの出力値を選択し、エラー通知信号UEとして出力する。セレクタ249は、比較器245からの出力値が「1」の場合、すなわち、チェックコードCが「0x0」の場合に、XORゲート244からのC[3]の値を出力する。一方、セレクタ249は、比較器245からの出力値が「0」の場合、すなわち、チェックコードCが「0x0」以外の場合に、反転器248からの出力値を出力する。
以上の図9のような回路構成により、図7,図8に示したような、入力される符号化データIとデコーダ200からの出力値との関係が得られる。
ここで、比較のために、n=3の場合のエンコード・デコード処理例について説明する。ここでは、エンコーダ120に入力される入力データDinが「0」の場合、符号化データIは「000」とされ、入力データDinが「1」の場合、符号化データIは「111」とされるものとする。この場合、「000」と「111」との間のハミング距離は「3」であり、エラー訂正可能な最大ビット数は3/2−1=0.5となる。従って、n=3の場合、1ビットエラーを訂正できない。このことは、次の図10,図11における計算例からも明らかである。
図10,図11は、n=3の場合のデコーダの計算例を示す図である。
図10,図11に示すデコーダ200の計算例では、3ビットのチェックコードCのうち、C[0],C[1]は上記の式(1),式(2)を用いて計算され、C[2]が次の式(5)を用いて計算されるものとする。
C[2]=I[0]^I[1]^I[2] ・・・(5)
図10,図11に示す計算例では、例えば、I[2]にビット化けが発生した場合と、I[0],I[1]にビット化けが発生した場合のように、1ビットエラーの発生時と2ビットエラーの発生時とで、チェックコードCの値が同じ値になることがある。また、C[3]は、1ビットエラーの発生時と2ビットエラーの発生時とで同じ値になる。これらより、図10,図11の計算例では、1ビットエラーと2ビットエラーとの判別が不可能であり、さらに、エラービットの発生位置も特定できない。従って、図10,図11の計算例では、1ビットエラーの訂正が不可能である。
<デコード処理例2>
図12,図13は、デコード処理例2での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
デコード処理例2では、符号化データIが図5のエンコード処理例2のように生成されることを前提とする。図12は、元の入力データDinが「0」であり、エンコーダ120によって生成された符号化データIが「1100」の場合の計算例を示す。一方、図13は、元の入力データDinが「1」であり、エンコーダ120によって生成された符号化データIが「0011」の場合の計算例を示す。また、デコード処理例2では、図12,図13に示すように、デコード処理例1と同様の演算式(上記の式(1)〜(4))を用いてチェックコードCが演算される。
デコード処理例1と同様に、デコード処理例2でも、符号化データIにおいてビット化けが生じていない場合と、符号化データIにおいて1ビットまたは2ビットのビット化けが生じている場合とで、チェックコードCの値が異なる。このため、デコーダ200は、チェックコードCから1ビットまたは2ビットのエラー発生の有無を判定できる。デコーダ200のエラー検出部230(図2参照)は、チェックコードCが「0x2」の場合にエラー通知信号ERRを「0」とし、チェックコードCが「0x2」以外の場合にエラー通知信号ERRを「1」とする。
また、デコード処理例1と同様に、デコード処理例2でも、C[3]の値は、1ビットエラー発生時と2ビットエラー発生時とで異なる値になる。このため、デコーダ200は、エラー通知信号ERRが「1」の場合に、C[3]の値から、検出したエラーが1ビットエラーか2ビットエラーかを判定できる。デコード処理例2において、エラー通知信号UEは、デコード処理例1と同様に、C[3]の値を基に出力される。
さらに、デコード処理例1と同様に、デコード処理例2でも、符号化データIにおいて1ビットエラーが発生している場合には、チェックコードCがビット化けの発生位置ごとに異なる値となる。このため、デコーダ200は、1ビットエラーの発生時には、チェックコードCの値から符号化データIにおけるエラー発生位置を判別できる。
デコーダ200は、エラー発生位置の判別結果に基づき、符号化データIのビットのうちエラーが発生していないビットの値を、出力データDoutとする。図12,図13の例では、デコーダ200のエラー検出部230は、チェックコードが「0xB」の場合、符号化データIのビットのうちI[1]の値を出力データDoutとし、チェックコードが「0xB」以外の場合、符号化データIのビットのうちI[0]の値を出力データDoutとする。
以上のデコード処理例2では、エンコード処理例2の手順で生成された符号化データIに基づいてエラー検出・訂正を行うので、例えば、異常発生などによってメモリ110における全メモリセルが「0」または「1」になってしまった場合でも、デコーダ200においてエラーを正確に検出できるようになる。すなわち、デコード処理例2では、エラービットが存在しない状態では、入力される符号化データIは「1100」または「0011」になる。これに対して、メモリ110の全メモリセルが「0」,「1」になってしまった場合、入力される符号化データIはそれぞれ「0000」,「1111」となり、デコーダ200は、エラーが発生したことを検出できる。
なお、図12,図13に示すように、エンコーダ120によって生成された符号化データIが「1100」,「1100」のいずれの場合でも、上記のような符号化データIとチェックコードCとの関係は成立する。このため、デコード処理例2でも、メモリセルの出力が「0」から「1」に化ける場合と、「1」から「0」に化ける場合の両方において、2ビットまでのエラー検出と1ビットエラーの訂正とを正確に行うことが可能である。
図14は、デコード処理例2を実現するデコーダの回路構成例を示す図である。なお、図14では、図9に対応する構成要素には同じ符号を付して示す。図14に示すデコーダ200は、図9に示したデコーダ200において、比較器245,246の代わりに比較器251,252を設けたものである。
比較器251は、XORゲート241〜244から出力されるチェックコードCが「0x2」の場合に「1」を出力し、チェックコードCが「0x2」以外の場合に「0」を出力する。従って、エラー通知信号ERRは、チェックコードCが「0x2」の場合に「0」、チェックコードCが「0x2」以外の場合に「1」となる。また、セレクタ249は、比較器251からの出力値が「1」の場合、すなわち、チェックコードCが「0x2」の場合に、XORゲート244からのC[3]の値を出力する。一方、セレクタ249は、比較器251からの出力値が「0」の場合、すなわち、チェックコードCが「0x2」以外の場合に、反転器248からの出力値を出力する。
比較器252は、チェックコードCが「0xB」の場合に「1」を出力し、チェックコードCが「0xB」以外の場合に「0」を出力する。従って、セレクタ250は、比較器252からの出力値が「1」の場合、すなわち、チェックコードCが「0xB」の場合に、I[1]の値を出力する。一方、セレクタ250は、比較器252からの出力値が「0」の場合、すなわち、チェックコードCが「0xB」以外の場合に、I[0]の値を出力する。
以上の図14のような回路構成により、図12,図13に示したような、入力される符号化データIとデコーダ200からの出力値との関係が得られる。
<デコード処理例3>
図15,図16は、デコード処理例3での入力データとチェックコードおよびデコーダ出力との関係を示す図である。
デコード処理例3では、符号化データIが図3のエンコード処理例1のように生成されることを前提とする。図15は、元の入力データDinが「0」であり、エンコーダ120によって生成された符号化データIが「0000」の場合の計算例を示す。一方、図16は、元の入力データDinが「1」であり、エンコーダ120によって生成された符号化データIが「1111」の場合の計算例を示す。
前述のデコード処理例1,2では、デコーダ200からの出力信号を生成するために、4ビットのチェックコードCを所定の値と比較する処理が必要とされていた。これに対して、デコード処理例3では、4ビットの値の比較処理が1回で済むように、チェックコード生成のための計算式を選択する。これにより、デコーダ200での処理負荷を軽減し、その回路規模を縮小する。
デコード処理例3において、4ビットのチェックコードCの各ビットは、デコーダ200に入力される符号化データIを基に次のように演算される。ただし、「〜」は反転(否定)演算を示す。
C[0]=〜(I[0]^I[1]) ・・・(6)
C[1]=〜(I[0]^I[2]) ・・・(7)
C[2]=〜(I[1]^I[2]) ・・・(8)
C[3]=〜(I[0]^I[1]^I[2]^I[3]) ・・・(9)
デコード処理例1,2と同様に、デコード処理例3でも、符号化データIにおいてビット化けが生じていない場合と、符号化データIにおいて1ビットまたは2ビットのビット化けが生じている場合とで、チェックコードCの値が異なる。このため、デコーダ200は、チェックコードCから1ビットまたは2ビットのエラー発生の有無を判定できる。デコーダ200のエラー検出部230(図2参照)は、チェックコードCが「0xF」の場合にエラー通知信号ERRを「0」とし、チェックコードCが「0xF」以外の場合にエラー通知信号ERRを「1」とする。
また、デコード処理例1,2と同様に、デコード処理例3でも、C[3]の値は、1ビットエラー発生時と2ビットエラー発生時とで異なる値になる。このため、デコーダ200は、エラー通知信号ERRが「1」の場合に、C[3]の値から、検出したエラーが1ビットエラーか2ビットエラーかを判定できる。デコード処理例3において、エラー通知信号UEは、デコード処理例1,2と同様に、C[3]の値を基に出力される。
さらに、デコード処理例1,2と同様に、デコード処理例3でも、符号化データIにおいて1ビットエラーが発生している場合には、チェックコードCがビット化けの発生位置ごとに異なる値となる。このため、デコーダ200は、1ビットエラーの発生時には、チェックコードCの値から符号化データIにおけるエラー発生位置を判別できる。
デコーダ200は、エラー発生位置の判別結果に基づき、符号化データIのビットのうちエラーが発生していないビットの値を、出力データDoutとする。ここで、デコード処理例3では、デコード処理例1,2と異なり、C[0]〜C[2]のうちの1ビットの値を基に、出力データDoutの送信元を選択する。図15,図16の例では、デコーダ200のエラー検出部230は、C[2]が「1」の場合にI[1]の値を出力データDoutとし、C[2]が「0」の場合にI[0]の値を出力データDoutとする。
なお、図15,図16に示すように、エンコーダ120によって生成された符号化データIが「0000」,「1111」のいずれの場合でも、上記のような符号化データIとチェックコードCとの関係は成立する。このため、デコード処理例3でも、メモリセルの出力が「0」から「1」に化ける場合と、「1」から「0」に化ける場合の両方において、2ビットまでのエラー検出と1ビットエラーの訂正とを正確に行うことが可能である。
図17は、デコード処理例3を実現するデコーダの回路構成例を示す図である。なお、図17では、図9に対応する構成要素には同じ符号を付して示す。図17に示すデコーダ200では、図9に示したデコーダ200から比較器246が除去されているとともに、図9に示したデコーダ200に反転器261〜264が追加されている。また、図9に示した比較器245の代わりに比較器265が設けられている。さらに、XORゲート242,243に入力される信号の組み合わせと、セレクタ250に対する選択制御信号の出力元も異なっている。
XORゲート242には、符号化データIのビットのうちI[0]とI[2]の各値が入力される。XORゲート243には、符号化データIのビットのうちI[1]とI[2]各値が入力される。反転器261〜264は、それぞれXORゲート241〜244の出力値を反転する。反転器261〜264からの出力値が、それぞれC[0]〜C[3]となる。
比較器265は、反転器261〜264から出力されるチェックコードCが「0xF」の場合に「1」を出力し、チェックコードCが「0xF」以外の場合に「0」を出力する。反転器247は、比較器265からの出力値を反転し、エラー通知信号ERRとして出力する。
セレクタ249には、選択制御信号として、比較器265からの出力信号が入力される。セレクタ249は、エラー通知信号UEとして、比較器265からの出力値が「0」の場合に反転器264からのC[3]を出力する一方、「1」の場合に反転器248からの出力値を出力する。
セレクタ250には、選択制御信号として、反転器263からのC[2]が入力される。セレクタ250は、出力データDoutとして、C[2]が「1」の場合にI[1]の値を出力し、C[2]が「0」の場合にI[0]の値を出力する。
以上の図17のような回路構成により、図15,図16に示したような、入力される符号化データIとデコーダ200からの出力値との関係が得られる。図17の回路構成によれば、例えば図9や図14に示した回路構成と比較して、反転器261〜264が追加されるものの、4ビットの値を比較する比較器246または比較器252が不要になる。このため、全体として、回路規模を縮小できる。
なお、このような回路規模の縮小効果は、上記デコード処理例3で用いたようなチェックコードCの演算方法に限らず、他の演算方法を用いた場合でも得ることが可能である。すなわち、C[0]〜C[2]のいずれかの値に応じて、符号化データIのビットのうちエラービットが発生していないビットが選択できるようにC[0]〜C[2]の演算方法を採用することで、回路規模を縮小できる。C[0]〜C[2]の演算方法の変え方としては、例えば、排他的論理和の演算対象とする符号化データIのビットの組み合わせを変える、排他的論理和の演算結果を反転するか否かをC[0]〜C[2]のそれぞれで変える、符号化データIのうちの2ビットについて排他的論理和をとる際に、その2ビットのうち一方または両方を反転した後に排他的論理和をとる、などの方法がある。
<シンボル単位のエンコード・デコード処理例>
上記のエンコード処理例・デコード処理例では、入力データDinにおける1ビット単位でのエラー検出・訂正について説明したが、複数ビットを単位としたエラー検出・訂正を行うことも可能である。ここでは一例として、8ビットのシンボルを単位としたエラー検出・訂正処理について説明する。
図18は、シンボル単位のエンコード処理例を示す図である。
図18では、入力データDinの1シンボル(8ビット)を、エンコーダ120によって32ビットの符号化データIに変換する例を示す。符号化データIは、下位から順に、それぞれ8ビットのI0〜I3によって構成される。また、図18の例では、入力データDinにおける1シンボル内の各ビットの値を、I0,I1に対してそのまま格納するとともに、I2,I3に対してそれぞれ反転させて格納する。このようなエンコード処理は、例えば、図6に示した構成のエンコーダ120によって実現可能である。この場合、図6のエンコーダ120から出力されるI[0]〜I[3]の代わりに、I0〜I3が出力される。
このような処理によって生成された符号化データIにおけるI0〜I3は、上記のデコーダ200によってデコードされる。デコード処理は、1ビット単位のデコード処理と同様に実行可能である。例えば、チェックコードCにおけるC[0]〜C[3]は、それぞれ、上記の式(1)〜(4)、あるいは式(1),(2),(5),(4)、あるいは式(6)〜(9)におけるI[0]〜I[3]に対して、I0〜I3を代入することで計算される。C[0]〜C[3]のそれぞれが式(1)〜(4)に従って計算される場合、デコーダ200を、例えば図9のように構成することができる。この場合、図9のデコーダ200には、I[0]〜I[3]の代わりにI0〜I3が入力される。
図19は、シンボル単位でエンコードされた符号化データにおけるビット化けパターンの例を示す図である。なお、図19に示す各ビット化けパターンは、入力データDinとして「0x00」がエンコードされた場合の例を示す。また、それぞれ8ビットを有するI0〜I3の各ビットを、下位側から「第0ビット」、「第1ビット」、・・・、「第7ビット」と呼んで説明する。
ビット化けパターン1は、I0〜I3のうちの1つにおいて全ビットでビット化けが生じた場合を示す。図19の例では、I3の全ビットでビット化けが生じている。デコーダ200では、I0〜I3のそれぞれの第0ビット同士、第1ビット同士、・・・、第7ビット同士の各組み合わせについて、エラーの検出および訂正が行われる。このため、ビット化けパターン1のようにI3の全ビットでビット化けが生じた場合、デコーダ200はI0〜I3のそれぞれを構成する8ビットすべてにおいて1ビットエラーが発生したと判定する。デコーダ200は、1ビットエラーの訂正が可能であるので、ビット化けパターン1のようなビット化けが生じた場合には、デコーダ200は、出力データDoutとして「0x00」を正しく出力する。
図19に示すビット化けパターン2は、符号化データIにおける複数のビットでビット化けが生じているものの、I0〜I3のそれぞれにおける同じビットの組み合わせの中では1組のみでビット化けが生じている場合を示す。図19の例では、I0の第3ビットおよび第7ビット、I1の第2ビットおよび第6ビット、I2の第1ビットおよび第5ビット、I3の第0ビットおよび第4ビットにおいて、それぞれビット化けが生じている。この場合、デコーダ200は、I0〜I3のそれぞれを構成する8ビットすべてにおいて1ビットエラーが発生したと判定するとともに、出力データDoutとして「0x00」を正しく出力する。
図19に示すビット化けパターン3は、I0〜I3のうちの2つにおいて全ビットでビット化けが生じた場合を示す。図19の例では、I2およびI3のそれぞれにおいて全ビットでビット化けが生じている。この場合、デコーダ200は、I0〜I3のそれぞれを構成する8ビットすべてにおいて2ビットエラーが発生したことを検出する。しかし、出力データDoutが元の入力データDinと一致するかは保証されない。
図19に示すビット化けパターン4は、符号化データIにおける複数のビットでビット化けが生じており、なおかつ、I0〜I3のそれぞれにおける同じビットの組み合わせの中の2組でビット化けが生じている場合を示す。図19の例では、I0,I1の第3ビット、I0,I1の第7ビット、I2,I3の第0ビット、I2,I3の第4ビットにおいて、ビット化けが生じている。この場合、デコーダ200は、I0〜I3のそれぞれを構成する8ビットのうち、第0ビット、第3ビット、第4ビットおよび第7ビットにおいて、それぞれ2ビットエラーが発生したことを検出する。しかし、出力データDoutが元の入力データDinと一致するかは保証されない。
以上説明した第1の実施の形態によれば、デコーダ200において符号化データIのうち2ビットまでのエラーを検出できるとともに、符号化データIのうち1ビットのエラーを訂正できる。このため、例えば、メモリ110においてnビット当たり1ビットのビット化けが生じた場合でも、元のデータを正確に読み出すことが可能になる。
また、デコーダ200は、上記のようなエラー検出・訂正処理を、ECCを用いたエラー検出・訂正処理と比較して、はるかに簡易な回路構成で実現できる。ECCを用いたエラー検出・訂正処理では、畳み込み演算などの複雑な演算が必要になるのに対し、上記のデコーダ200は、XORゲートや比較器、セレクタなどを用いた簡単な演算のみで、デコード処理を実現可能である。
例えば、LUT(Look Up Table)を用いたFPGA(Field-Programmable Gate Array)においてエラー検出・訂正処理を実現するものとすると、12ビット分のデータを18ビットのECC付きデータに変換して得た符号化データを用いてエラー検出・訂正処理を行う場合、エンコード処理に9LUT程度の回路が、デコード処理に53LUT程度の回路が、それぞれ必要になる。これに対して、上記の第1の実施の形態においては、n=4として、エンコーダ120、デコーダ200をそれぞれ12個実装した場合、エンコード処理を1LUT未満の回路で、デコード処理を2LUT程度の回路で、それぞれ実行可能である。
このように、第1の実施の形態のエンコーダ120およびデコーダ200によれば、ECCを用いた場合と同様に2ビットエラー検出および1ビットエラー訂正が可能でありながらも、このようなエラー検出・訂正処理を簡単な処理で実行可能であり、より小さい規模の回路を用いて実現可能である。従って、ECCを用いたエラー検出・訂正処理と比較して処理速度を高速化することができる。
〔第2の実施の形態〕
図20は、第2の実施の形態に係るデータ送受信システムの構成例を示す図である。なお、図20では、図1に対応する構成要素には同じ符号を付して示す。
第1の実施の形態で示したエンコーダ120およびデコーダ200は、メモリに対する読み書きの他、バスを通じてデータを送受信する際にも使用できる。図20において、通信装置10は、エンコーダ120が搭載された半導体装置11を備える。一方、通信装置20は、デコーダ200が搭載された半導体装置21を備える。通信装置10と通信装置20との間は、バス30を通じて接続されている。
通信装置10から通信装置20に送信される入力データDinは、エンコーダ120によってnビットの符号化データIに変換される。エンコーダ120によって生成された符号化データIは、バス30を通じて通信装置20に送信される。なお、バス30は、シリアルバス、パラレルバスのどちらでもよい。
通信装置20が受信した符号化データIは、デコーダ200に入力される。デコーダ200は、デコーダ200は、符号化データIのビットのうち2ビットまでのエラー検出と1ビットまでのエラー訂正とが可能である。従って、デコーダ200は、符号化データIのビットのうちエラーが発生したビットが1ビットまでであれば、出力データDoutとして入力データDinと同じ値を確実に出力する。
以上の構成によれば、異常発生によりバス30に伝送される信号の値が変化してしまった場合でも、正しい値を伝送できる可能性が高くなり、バス30での信号伝送の信頼性が向上する。
なお、エンコーダ120およびデコーダ200は、例えば、同一の通信装置内に設けられていてもよい。この場合、バス30は通信装置の内部バスであり、内部バスでの信号伝送の信頼性が向上する。さらに、エンコーダ120およびデコーダ200が同一の半導体装置内に設けられていてもよい。
〔第3の実施の形態〕
次に、第3の実施の形態として、上記のエンコーダ120およびデコーダ200を搭載したストレージシステムについて説明する。図21は、第3の実施の形態に係るストレージシステムのシステム構成例を示す図である。
図21に示すストレージシステムは、ストレージ装置301とホスト装置302とを備える。ストレージ装置301とホスト装置302とは、例えば、FC(Fibre Channel)ケーブルを介して接続されている。
ストレージ装置301は、DE(Drive Enclosure)310とCM(Controller Module)400a,400bとを備える。DE310は、CM400a,400bからのアクセス制御対象となる複数の記憶装置を備える。DE310が備える記憶装置は、例えば、HDD(Hard Disk Drive)、SSD(Solid State Drive)などの不揮発性記憶装置である。なお、DE310は、ストレージ装置301内に複数設けられていてもよい。また、DE310は、CM400a,400bとは別の筐体内に設けられていてもよい。
CM400a,400bは、DE310内の複数の記憶装置によって実現される物理記憶領域をRAID(Redundant Arrays of Inexpensive Disks)によって管理し、この物理記憶領域に対するアクセスを制御する。また、CM400a,400bは、DE310内の複数の記憶装置によって実現される物理記憶領域に論理ボリュームを設定し、ホスト装置302から論理ボリュームに対するアクセス要求を受け付けて、そのアクセス要求に応じてDE310内の記憶装置にアクセスする。
なお、CMは、ストレージ装置301内に3つ以上設けられていてもよい。CMが複数設けられることで、DE310に対するアクセス制御系統が冗長化され、アクセス制御処理の信頼性が向上する。
ホスト装置302は、ユーザの操作に応じて、CM400a,400bに対して、CM400a,400bが提供する論理ボリュームへのアクセスを要求する。なお、ホスト装置302は、例えば、CPU(Central Processing Unit)、RAMなどを備えたコンピュータとして実現される。
図22は、CMのハードウェア構成例を示す図である。なお、CM400a,400bは同様のハードウェア構成を有するので、以下の説明では、主にCM400aの構成についてのみ説明する。また、CM400aとCM400bとの間で共通の構成要素には、同じ符号を付して示す。
CM400aは、CPU401によって装置全体が制御されている。CPU401には、RAM402および複数の周辺機器が接続されている。RAM402は、CM400aの主記憶装置として使用され、CPU401に実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。
CPU401には、周辺機器の例として、フラッシュメモリ403、CA(Channel Adapter)404、IOC(In/Out Controller)405および監視FPGA406が接続されている。フラッシュメモリ403は、コントローラ407を介してCPU401と接続されており、コントローラ407および監視FPGA406は、例えば、図示しないPCH(Platform Controller Hub)を介してCPU401と接続される。また、CA404およびIOC405は、例えば、図示しないPCI(Peripheral Component Interconnect)スイッチを通じてCPU401と接続される。
フラッシュメモリ403は、CM400aの二次記憶装置として使用され、CPU401によって実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、HDDなどの他の種類の不揮発性記憶装置が使用されてもよい。
コントローラ407は、フラッシュメモリ403に対する読み書きを制御する。また、コントローラ407は、フラッシュメモリ403の記憶領域における不良ブロックを検出し、不良ブロックの位置を示す不良ブロック情報を、監視FPGA406を通じてMRAM(Magnetoresistive RAM)409に格納する機能も備える。
CA404は、ホスト装置302とCM400aとの間でデータを送受信するインタフェース処理を実行する。
IOC405は、SAS(Serial Attached SCSI,SCSI:Small Computer System Interface)インタフェース処理を実行する回路である。CM400aのIOC405には、CM400aに設けられたSASエクスパンダ408と、CM400bに設けられたSASエクスパンダ408の両方に接続されている。CM400aのSASエクスパンダ408、およびCM400bのSASエクスパンダ408は、ともにDE310に接続されている。CM400aのIOC405は、CM400aのSASエクスパンダ408を通じてDE310にアクセスできるとともに、CM400bのSASエクスパンダ408を通じてDE310にアクセスすることもできる。このように、CM400aとDE310とを接続する伝送路が冗長化されることで、CM400aからDE310の各記憶装置へのアクセス処理の信頼性が向上する。
また、CM400bのIOC405も同様に、CM400aのSASエクスパンダ408を通じてDE310にアクセスできるとともに、CM400bのSASエクスパンダ408を通じてDE310にアクセスすることもできる。このように、CM400bとDE310とを接続する伝送路が冗長化されることで、CM400bからDE310の各記憶装置へのアクセス処理の信頼性が向上する。
監視FPGA406は、CM400a内のハードウェアの状態を監視する機能を備える。監視FPGA406は、例えば、CM400a内のハードウェアの異常を検出すると、検出した異常の内容を示す異常検出情報をCPU401に通知する。また、監視FPGA406にはMRAM409が接続されており、監視FPGA406は、CM400a内の状態を示す状態情報などを、MRAM409に保存する。状態情報には、例えば、各ハードウェアの電源状態、異常発生のログ情報などが記述される。監視FPGA406は、CPU401やSASエクスパンダ408からの要求に応じて、MRAM409に記憶された状態情報などを読み出して、その要求元に転送することもできる。
さらに、監視FPGA406は、他方のCM内の監視FPGA406との間でデータを送受信する機能も備える。例えば、CM400aの監視FPGA406は、CM400aのCPU401あるいはSASエクスパンダ408からの要求に応じて、他方のCM400b内のCPU401あるいはSASエクスパンダ408に対して情報を送信したり、他方の400b内のMRAM409から情報を読み出すことができる。このような動作が行われる際には、監視FPGA406は、他方のCM400b内のハードウェアと通信するための通信インタフェースとして機能する。
CM400aのCPU401は、例えば、異常検出情報や、自装置の状態を示す状態情報を、他方のCM400bのCPU401に対して、CM400a,400bの双方の監視FPGA406を介して送信する。CM400bのCPU401は、CM400aからの異常検出情報や状態情報を基に、CM400aの状態を認識することができる。また、CM400aのCPU401は、異常検出情報や状態情報を、他方のCM400bのMRAM409に対して、CM400a,400bの各監視FPGA406を通じて書き込むこともできる。
さらに、監視FPGA406には、CMの電源がオフの状態でも電源電圧が供給されている。このため、例えば、一方のCM400aが異常発生などによって電源オフになった場合、他方のCM400bは、CM400aのMRAM409に記憶された情報(状態情報、異常検出情報、不良ブロック情報など)を、CM400a,400bの各監視FPGA406を通じて取得することができる。
CM400bのCPU401は、例えば、CM400aの動作が異常停止したり、CM400aの電源が異常によってオフになった場合などに、CM400aのCPU401から受信していた情報や、CM400aのMRAM409に記憶されている情報を基に、CM400aの動作を復帰させるなど、異常発生に応じた適切な処理を実行できる。
このように、監視FPGA406を介して転送される情報は、異常発生時に利用されるなど、システム全体にとって重要な情報が多い。例えば、監視FPGA406を通じた情報の伝送時にビット化けが発生した場合、ストレージ装置301全体に重大な障害が発生する可能性がある。このため、監視FPGA406を通じたデータ転送動作には高い信頼性が求められる。そこで、監視FPGA406は、第1・第2の実施の形態で示したエンコーダ120およびデコーダ200を搭載し、エンコーダ120やデコーダ200を介してデータを転送することで、転送されるデータの信頼性を高める。
図23は、監視FPGAにおけるデータ転送経路の構成例を示す図である。なお、CM400aの監視FPGA406とCM400bの監視FPGA406は同様の構成を有するので、以下、主にCM400aの監視FPGA406について説明する。
CM400aの監視FPGA406は、その内部にRAM(例えばSRAM)を備える。監視FPGA406内のRAMの少なくとも一部の領域は、監視FPGA406を介してデータが転送される際に送受信バッファとして利用される。図23に示すように、CM400aの監視FPGA406は、このような送受信バッファとして、バッファBF00〜BF06を備えている。また、CM400aの監視FPGA406は、CM400aのMRAM409に対する読み書きを制御するメモリインタフェース(I/F)421を備えている。
さらに、CM400aの監視FPGA406は、エンコーダE00,E01,E03〜E05,E13と、デコーダD00〜D06,D13,D16,D31とを備える。なお、CM400aにおける監視FPGA406の外部にも、エンコーダE02,E15,E20,E21,E31と、デコーダD15とが設けられている。これらのエンコーダE00〜E05,E15,E20,E21,E31は、前述のエンコーダ120と同様の構成を有し、これらのデコーダD00〜D06,D13,D15,D16,D31は、前述のデコーダ200と同様の構成を有する。
CM400aのバッファBF00は、CM400aのCPU401と他方のCM400bのCPU401との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファBF00のCPU401側の入力段には、エンコーダE00が設けられており、バッファBF00のCPU401側の出力段には、デコーダD00が設けられている。
CM400aのCPU401から他方のCM400bのCPU401に送信されるデータは、CM400aのエンコーダE00によってnビットの符号化データに変換された後、CM400aのバッファBF00に格納され、符号化データの状態でCM400aのバッファBF00からCM400bのバッファBF00に転送される。CM400bのバッファBF00に格納された符号化データは、CM400bのCPU401に転送される際に、デコーダD00によってデコードされる。CM400aのバッファBF00からの読み出し、または、CM400bのバッファBF00からの読み出し、または各バッファBF00間の転送の際に、符号化データに1ビットエラーが発生した場合でも、データはCM400bのCPU401に正常に転送される。また、符号化データに2ビットエラーが発生した場合には、CM400bのデコーダD00によって2ビットエラーが検出され、例えば、送信元であるCM400aのCPU401に対してデータ転送エラーが通知される。
CM400bのCPU401からCM400aのCPU401に対してデータが送信される際にも、CM400bのエンコーダE00とCM400aのデコーダD00の動作によって、上記と同様に1ビットエラーが訂正されるとともに、2ビットエラーが検出される。従って、CM400aのCPU401とCM400bのCPU401との間でのデータ伝送の信頼性が向上する。
バッファBF01,BF02は、一方のCMのCPU401が他方のCMのMRAM409に対して、状態情報、異常検出情報、不良ブロック情報などのデータを読み書きする際の送受信バッファとして使用される。バッファBF01のCPU401側の入力段には、エンコーダE01が設けられており、バッファBF01のCPU401側の出力段には、デコーダD01が設けられている。さらに、バッファBF02のMRAM409側の出力段には、デコーダD02が設けられている。
CM400aのCPU401から他方のCM400bのMRAM409に書き込まれるデータは、CM400aのエンコーダE01によってnビットの符号化データに変換された後、CM400aのバッファBF01に格納され、符号化データの状態でCM400aのバッファBF01からCM400bのバッファBF02に転送される。CM400bのバッファBF02に格納された符号化データは、CM400bのデコーダD02によってデコードされた後、CM400bのメモリインタフェース421を介して、CM400bのMRAM409に書き込まれる。ここで、CM400aのバッファBF01からの読み出しの際、または、CM400bのバッファBF02からの読み出しの際、または、CM400aのバッファBF01からCM400bのバッファBF02への転送の途中において、符号化データに1ビットエラーが発生した場合でも、データはCM400bのMRAM409に正常に書き込まれる。また、符号化データに2ビットエラーが発生した場合には、CM400bのデコーダD02によって2ビットエラーが検出され、例えば、送信元であるCM400aのCPU401に対してデータ書き込みエラーが通知される。
CM400aのCPU401がCM400bのMRAM409からデータを読み出す際には、読み出し対象のデータは、CM400bのMRAM409の出力段に設けられたエンコーダE02によって符号化された状態で、CM400bのバッファBF02に格納される。CM400bのバッファBF02に格納された符号化データは、CM400aのバッファBF01に格納され、さらにCM400aのデコーダD01によってデコードされた後、CM400aのCPU401に転送される。ここで、CM400bのバッファBF02からの読み出しの際、または、CM400aのバッファBF01からの読み出しの際、または、CM400bのエンコーダE02からCM400bのバッファBF02への転送の途中、または、CM400bのバッファBF02からCM400aのバッファBF01への転送の途中において、符号化データに1ビットエラーが発生した場合でも、データはCM400aのCPU401に正常に転送される。また、符号化データに2ビットエラーが発生した場合には、CM400aのデコーダD01によって2ビットエラーが検出され、例えば、読み出し要求元であるCM400aのCPU401に対してデータ読み出しエラーが通知される。
このように、CM400aのエンコーダE01およびデコーダD01と、CM400bのエンコーダE02およびデコーダD02の動作により、CM400aのCPU401とCM400bのMRAM409との間でのデータ伝送の信頼性が向上する。
CM400aのバッファBF03は、CM400aのSASエクスパンダ408と他方のCM400bのSASエクスパンダ408との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファBF03のCPU401側の入力段には、エンコーダE03が設けられており、バッファBF03のSASエクスパンダ408側の出力段には、デコーダD13が設けられている。また、バッファBF03のSASエクスパンダ408側の入力段には、エンコーダE13が設けられており、バッファBF03のCPU401側の出力段には、デコーダD03が設けられている。エンコーダE03,E13およびデコーダD03,D13の動作により、CPU401とSASエクスパンダ408との間でのデータ伝送の信頼性が向上する。
CM400aのバッファBF04は、CM400aのSASエクスパンダ408と他方のCM400bのSASエクスパンダ408との間で、状態情報や異常検出情報などのデータを送受信する際の送受信バッファとして使用される。バッファBF04のSASエクスパンダ408側の入力段には、エンコーダE04が設けられており、バッファBF04のSASエクスパンダ408側の出力段には、デコーダD04が設けられている。CM400aのエンコーダE04およびデコーダD04と、CM400bのエンコーダE04およびデコーダD04の動作により、CM400aのSASエクスパンダ408とCM400bのSASエクスパンダ408との間でのデータ伝送の信頼性が向上する。
CM400aのバッファBF05は、CM400aのSASエクスパンダ408が、CM400aのMRAM409に対して、状態情報、異常検出情報などのデータを読み書きする際の送受信バッファとして使用される。SASエクスパンダ408からMRAM409へ書き込まれるデータは、バッファBF05の入力段に設けられたエンコーダE05によって符号化された状態で、バッファBF05に格納される。バッファBF05に格納された符号化データは、メモリインタフェース421を介して、MRAM409の入力段に設けられたデコーダD15に入力され、デコーダD15によってデコードされた後にMRAM409に書き込まれる。
一方、MRAM409からSASエクスパンダ408に読み出されるデータは、MRAM409の出力段に設けられたエンコーダE15によって符号化された状態で、メモリインタフェース421を介してバッファBF05に格納される。バッファBF05に格納された符号化データは、バッファBF05の出力段に設けられたデコーダD05によってデコードされた後に、SASエクスパンダ408に転送される。エンコーダE05,E15およびデコーダD05,D15の動作によって、SASエクスパンダ408とMRAM409との間でのデータ伝送の信頼性が向上する。
CM400aのバッファBF06は、CM400aのコントローラ407からCM400aのMRAM409に対して、不良ブロック情報などのデータを書き込む際のバッファとして利用される。コントローラ407から出力されたデータは、エンコーダE20またはエンコーダE21によって符号化された状態で、バッファBF06に格納される。エンコーダE20からバッファBF06に格納された符号化データは、バッファBF06の出力段に設けられたデコーダD06によってデコードされた後、メモリインタフェース421を介してMRAM409に書き込まれる。同様に、エンコーダE21からバッファBF06に格納された符号化データは、バッファBF06の出力段に設けられたデコーダD16によってデコードされた後、メモリインタフェース421を介してMRAM409に書き込まれる。エンコーダE20,E21およびデコーダD06,D16の動作により、コントローラ407からMRAM409へのデータ伝送の信頼性が向上する。
また、CM400aの監視FPGA406には、CM400aのCPU401がCM400aのMRAM409からデータを読み出す際に動作するデコーダD31が設けられている。MRAM409から読み出されたデータは、MRAM409の出力段に設けられたエンコーダE31によって符号化され、その符号化データがデコーダD31に入力される。デコーダD31は、入力された符号化データをデコードして、CPU401に出力する。エンコーダE31およびデコーダD31の動作により、MRAM409からCPU401へのデータ伝送の信頼性が向上する。
ところで、内部にRAMを備える近年のFPGAでは、内部のRAMの記憶容量が大きくなる傾向にある。一方、上記の監視FPGA406が転送するデータのデータ量は、例えば、ホスト装置302とCM400a,400bとの間で送受信される論理ボリュームのデータや、DE310とCM400a,400bとの間で送受信される論理ボリュームのデータと比較して、圧倒的に小さい。このため、監視FPGA406内のRAMをデータ伝送時のバッファとして使用した場合、RAMの容量には十分余裕があると言える。図23に示したバッファBF00〜BF06は、いずれも、元のデータを4倍以上のデータ量を持つ符号化データとして記憶するが、上記のようにRAMの容量には余裕があるため、これらの符号化データをRAMに十分記憶できる。
また、監視FPGA406に設けられるエンコーダE00,E01,E03〜E05,E13は、前述のエンコーダ120と同様に構成され、また、デコーダD00〜D06,D13,D16,D31は、前述のデコーダ200と同様に構成される。前述のように、エンコーダ120およびデコーダ200は、例えば、ECCを用いたエラー検出・訂正を行うエンコーダおよびデコーダと比較して、処理手順が簡単であり、回路規模を大幅に縮小できる。このため、図23のように多くのエンコーダおよびデコーダを設けた場合でも、これらのエンコーダおよびデコーダの処理を監視FPGA406が持つ限られた処理能力を用いて十分実現できる。
すなわち、RAMの容量に余裕があり、かつ、処理能力にある程度の限界がある監視FPGA406に対しては、データ量が増えるものの処理手順が簡単という特徴を有する上記のエンコーダ120およびデコーダ200は、非常に好適である。従って、このようなエンコーダ120およびデコーダ200を図23のように監視FPGA406内に多数設けることで、回路規模や製造コストを増大させることなく、監視FPGA406を介して転送されるデータの信頼性を向上させることができる。
次に、図23に示したデータ転送経路のうち、代表して、2つのCMのCPU401間でのデータ転送処理について説明する。
図24は、2つのCMのCPU間でのデータ転送を行うバッファの内部構成例を示すブロック図である。
CM400aにおいて、監視FPGA406内のバッファBF00は、上記のエンコーダE00およびデコーダD00に加えて、通信制御部431、送信バッファ432および受信バッファ433を備える。なお、CM400bのバッファBF00も、CM400aのバッファBF00と同様の構成を有する。
CM400aのBF00における通信制御部431は、CM400aのCPU401からの要求に応じて、他方のCM400bのBF00における通信制御部431に対してパケットを送信する。パケットには、処理を要求する制御パケットと、データを転送するデータパケットとがある。CM400aの通信制御部431は、CM400aのCPU401から送信すべきデータを受信すると、そのデータをエンコーダE00に符号化データに変換させて送信バッファ432に格納する。CM400aの通信制御部431は、符号化データを送信バッファ432から読み出してデータパケットに埋め込み、そのデータパケットを他方のCM400bのBF00における通信制御部431に送信する。また、CM400aの通信制御部431は、送信すべきデータをデータパケットを用いて送信した後、制御パケットを送信する。
また、CM400aの通信制御部431は、他方のCM400bの通信制御部431からデータバケットを受信すると、受信したデータパケットから符号化データを抽出して、受信バッファ433に格納する。CM400aの通信制御部431は、その後に他方のCM400bの通信制御部431から制御パケットを受信すると、受信バッファ433から符号化データを読み出してデコーダD00に供給してデコードさせ、デコードされたデータをCM400aのCPU401に送信する。
図25は、2つのCMのCPU間でデータ転送が正常に行われる際の処理シーケンスの例を示すシーケンス図である。
CM400aのCPU401は、CM400aの監視FPGA406内のバッファBF00に対して、他方のCM400bのCPU401に送信する送信データを格納する(ステップS11)。CM400aのバッファBF00内の通信制御部431(以下、単に「CM400aの通信制御部431」と呼ぶ)は、CM400aのCPU401から受信した送信データを、同じバッファBF00内のエンコーダE00に供給する。エンコーダE00は、送信データを符号化データに変換して、同じバッファBF00内の送信バッファ432に格納する。
CM400aのCPU401は、送信データの送信を完了すると、CM400aの通信制御部431に対して送信指示を送信する(ステップS12)。送信指示を受けたCM400aの通信制御部431は、ステップS11で送信バッファ432に格納された符号化データを読み出して(ステップS13)、データパケットに順に格納し、それらのデータパケットをCM400bの監視FPGA406内のバッファBF00に送信する(ステップS14)。CM400bのバッファBF00内の通信制御部431(以下、単に「CM400bの通信制御部431」と呼ぶ)は、CM400aの通信制御部431からのデータパケットを受信すると、データパケットから符号化データを抽出して、同じBF00内の受信バッファ433に格納する。
CM400aの通信制御部431は、データパケットの送信を完了すると、CM400bのCPU401へのデータ送信を要求する制御パケットを、CM400bの通信制御部431に送信する(ステップS15)。制御パケットを受信したCM400bの通信制御部431は、CM400bのCPU401に対して割り込みを発行する(ステップS16)。CM400bのCPU401は、割り込みを受けると、CM400bの通信制御部431に対して、割り込み要因の確認を行う(ステップS17)。例えば、CM400bの通信制御部431は、ステップS16で割り込みを発行した際に、自身が備えるレジスタに「データ受信中」を示すステータス情報を格納する。割り込みを受けたCM400bのCPU401は、ステップS17において、CM400bの通信制御部431のレジスタからステータス情報を読み出すことで、他方のCM400aのCPU401から受信したデータがあることを認識する。このとき、CM400bのCPU401は、CM400bの通信制御部431に対して、データの読み出し指示を発行する(ステップS18)。
CM400bの通信制御部431は、読み出し指示を受けると、ステップS14で受信バッファ433に格納した符号化データをデコーダD00を通じて読み出し(ステップS19)、CM400bのCPU401に送信する。このステップS19では、受信バッファ433から読み出された符号化データは、デコーダD00によってデコードされ、デコード後の出力データDoutが、CM400bの通信制御部431に供給される。このとき、CM400bの通信制御部431は、デコーダD00から、出力データDoutとともにエラー通知信号ERR,UEを受信する。
図25の例では、受信バッファ433から符号化データが読み出される間、エラー通知信号ERRが「0」である(すなわち、エラービットなし)か、または、エラー通知信号ERR,UEの組み合わせが「1」,「0」である(すなわち、1ビットエラー発生)ものとする。この場合、CM400bの通信制御部431は、デコーダD00から出力された出力データDoutが正しい値であると判定して、CM400bのCPU401に対するデータ送信を継続する(ステップS20)。
CM400bのCPU401に対するデータ転送が完了すると、CM400bのCPU401は、CM400bの通信制御部431に対して完了通知を出力する(ステップS21)。完了通知を受信したCM400bの通信制御部431は、CM400aの通信制御部431に対して、データ送信が完了したことを通知する制御パケットを送信する(ステップS22)。制御パケットを受信したCM400aの通信制御部431は、CM400aのCPU401に対して割り込みを発行する(ステップS23)。CM400aのCPU401は、割り込みを受けると、CM400aの通信制御部431に対して、割り込み要因の確認を行う(ステップS24)。例えば、CM400aの通信制御部431は、ステップS23で割り込みを発行した際に、自身が備えるレジスタに「データ送信完了」を示すステータス情報を格納する。割り込みを受けたCM400aのCPU401は、ステップS24において、CM400aの通信制御部431のレジスタからステータス情報を読み出すことで、他方のCM400bのCPU401に対するデータ送信が完了したことを認識する。
図26は、2つのCMのCPU間でのデータ転送に異常が生じた場合の処理シーケンスの例を示すシーケンス図である。なお、図26では、図25と同様の処理には同じステップ番号を付して示す。
図26において、ステップS11〜S19の処理は、図25と同様であるものとする。ただし、ステップS19において、CM400bの通信制御部431が、受信バッファ433からデコーダD00を通じて読み出したデータをCM400bのCPU401に送信する間に、デコーダD00からのエラー通知信号ERR,UEの組み合わせが「1」,「1」になった(すなわち、2ビットエラーが発生した)ものとする(ステップS31)。CM400bの通信制御部431は、エラー通知信号ERR,UEの組み合わせが「1」,「1」となったことを検知すると、CM400bのCPU401へのデータ送信を中止してこのCPU401に対してエラーを通知するとともに、CM400aの通信制御部431に対して、エラーを通知する制御パケットを送信する(ステップS32)。
制御パケットを受信したCM400aの通信制御部431は、CM400aのCPU401に対して割り込みを発行する(ステップS33)。このとき例えば、CM400aの通信制御部431は、自身のレジスタに送信エラー発生を示すステータス情報を格納する。CM400aのCPU401は、割り込みを受けると、CM400aの通信制御部431に対して、割り込み要因の確認を行う(ステップS34)。CM400aのCPU401は、CM400aの通信制御部431のレジスタからステータス情報を読み出すことで、他方のCM400bのCPU401に対するデータ送信においてエラーが発生したことを認識する。
以上の図25,図26に示した処理手順により、データ送信元のCM400aのCPU401は、CM400a,400bのそれぞれの監視FPGA406を介して、他方のCM400bのCPU401に対してデータが正しく送信されたかを認識することができる。従って、CM400aのCPU401からCM400bのCPU401へのデータ送信動作の信頼性が向上する。
監視FPGA406内の他のバッファBF01〜BF06も、上記のバッファBF00とほぼ同様の通信制御部を備えている。各バッファの通信制御部は、同じバッファ内の受信バッファからデコーダを介してデータを読み出す際に、デコーダからのエラー通知信号ERR,UEを基に、データの読み出し動作にエラーが発生したかを判定することができる。従って、各バッファを通じたデータの転送動作の信頼性が向上する。なお、監視FPGA406におけるデコーダD31は、同じCM内のCPU401に対して、出力データDoutとともにエラー通知信号ERR,UEを出力する。これにより、デコーダD31から送信されたデータを受信したCPU401は、受信したデータが正しいものであるかを判定できる。
なお、上記のエンコーダ120およびデコーダ200は、上記のストレージ装置301に限らず、様々な情報処理装置に設けることが可能である。また、エンコーダ120およびデコーダ200は、FPGAに限らず、様々な半導体装置に形成することが可能である。
以上の各実施の形態に関し、さらに以下の付記を開示する。
(付記1) 1ビットの入力データを冗長化して得られたnビット(ただし、nは4以上の整数)の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく(n−1)個の2ビット検査データを出力する(n―1)個の2ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする半導体装置。
(付記2) 前記エラー検出部は、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定する第1の判定部と、
前記第1の判定部がエラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が1ビットであるかを判定する第2の判定部と、
を有することを特徴とする付記1記載の半導体装置。
(付記3) 前記エラー検出部は、前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記1または2記載の半導体装置。
(付記4) 前記エラー検出部は、いずれかの前記2ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記1または2記載の半導体装置。
(付記5) 前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記1〜4のいずれか1つに記載の半導体装置。
(付記6) 前記半導体装置は、前記符号化データを記憶する記憶回路をさらに有し、
前記デコード回路は、前記記憶回路から前記符号化データを読み出す、
ことを特徴とする付記1〜5のいずれか1つに記載の半導体装置。
(付記7) 前記入力データを前記符号化データに変換して前記記憶回路に書き込むエンコード回路をさらに有することを特徴とする付記6記載の半導体装置。
(付記8) 1ビットの入力データを冗長化して得られたnビット(ただし、nは4以上の整数)の符号化データの入力を受け、前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく(n−1)個の2ビット検査データを出力する(n―1)個の2ビット検査部と、
前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力する全ビット検査部と、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力するエラー検出部と、
を有するデコード回路を備えたことを特徴とする情報処理装置。
(付記9) 前記エラー検出部は、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定する第1の判定部と、
前記第1の判定部がエラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が1ビットであるかを判定する第2の判定部と、
を有することを特徴とする付記8記載の情報処理装置。
(付記10) 前記エラー検出部は、前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記8または9記載の情報処理装置。
(付記11) 前記エラー検出部は、いずれかの前記2ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力するデータ出力部をさらに有することを特徴とする付記8または9記載の情報処理装置。
(付記12) 前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記8〜11のいずれか1つに記載の情報処理装置。
(付記13) 前記情報処理装置は、前記符号化データを記憶する記憶回路をさらに有し、
前記デコード回路は、前記記憶回路から前記符号化データを読み出す、
ことを特徴とする付記8〜12のいずれか1つに記載の情報処理装置。
(付記14) 前記入力データを前記符号化データに変換して前記記憶回路に書き込むエンコード回路をさらに有することを特徴とする付記13記載の情報処理装置。
(付記15) 情報処理装置が、
1ビットの入力データを冗長化して得られたnビット(ただし、nは4以上の整数)の符号化データの入力を受け、
前記符号化データにおけるそれぞれ異なるビット同士の比較結果に基づく(n−1)個の2ビット検査データを出力するとともに、前記符号化データの全ビットの排他的論理和に基づく全ビット検査データを出力し、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて前記符号化データに対するエラー検出を行い、エラー検出結果に基づいて前記入力データを出力する、
ことを特徴とするエラー検出方法。
(付記16) 前記符号化データに対するエラー検出を行う処理では、
前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データにおけるエラービットの有無を判定し、
エラービットありと判定した場合に、前記全ビット検査データに基づいて、検出されたエラービットの数が1ビットであるかを判定する、
ことを特徴とする付記15記載のエラー検出方法。
(付記17) 前記符号化データに対するエラー検出を行う処理では、前記(n−1)個の2ビット検査データと前記全ビット検査データとに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力することを特徴とする付記15または16記載のエラー検出方法。
(付記18) 前記符号化データに対するエラー検出を行う処理では、いずれかの前記2ビット検査データに基づいて、前記符号化データからエラービットでないビットを選択し、選択したビットの値を前記入力データとして出力することを特徴とする付記15または16記載のエラー検出方法。
(付記19) 前記符号化データは、その一部のビットに前記入力データと同じ値が格納され、残りのビットに前記入力データの反転値が格納されることで生成されることを特徴とする付記15〜18のいずれか1つに記載のエラー検出方法。