以下に添付図面を参照して、この発明にかかる半導体記憶装置の実施の形態を詳細に説明する。まず、本実施の形態にかかる半導体記憶装置の備える基本的な構成について説明し、その後、各半導体記憶チップにおける使用可能な記憶領域の容量のばらつきに対応するための構成について説明する。
本実施の形態にかかる半導体記憶装置のハードウェア構成について図1を用いて説明する。半導体記憶装置50は、プロセッサ51と、BootROM(Reed Only Memory)52と、SATA/SASインタフェース55と、メモリコントローラ53と、DRAM(Dynamic Random Access Memory)54と、NANDコントローラ57A〜57Fと、複数の半導体記憶素子(NAND)58A〜58Fと、これらを接続するバス56とを備える。尚、NANDコントローラ57A〜57Fを各々区別する必要がない場合、単に、NANDコントローラ57と記載する場合がある。また、半導体記憶素子58A〜58Fを各々区別する必要がない場合、単に、半導体記憶素子58と記載する場合がある。
SATA/SASインタフェース55は、プロセッサ51の制御の下、半導体記憶装置50の上位装置であるホストとの通信を制御する。BootROM52は、電源の投入時に実行されるプログラムを記憶する。各種システムプログラムは、半導体記憶素子58に記憶されている。プロセッサ51は、電源の投入時にBootROM52からプログラムを読み出してこれを実行し、当該プログラムに従って、半導体記憶素子58に記憶された各種システムプログラムをDRAM54に転送し、DRAM54上のシステムプログラムを実行することにより、半導体記憶装置50全体を制御して、各種機能を実現させる。具体的には、プロセッサ51は、SATA/SASインタフェース55を介して、ホストから送信されたコマンドを解釈し、当該コマンドに応じて、半導体記憶素子58へのデータの書き込みや半導体記憶素子58からのデータの読み出しを制御する。
メモリコントローラ53は、DRAM54の制御を行う。DRAM54は、各種データや各種プログラムを記憶する。本実施の形態においては、DRAM54は、後述する正引きテーブルと、ビットベクタテーブルとを記憶する。NANDコントローラ57は、半導体記憶素子58の制御を行うものであり、誤り訂正回路を含む。
半導体記憶素子58は、半導体チップに相当する。例えば、NAND型のフラッシュメモリで用いられる記憶素子である。このような半導体記憶素子58は、ランダムな読み書きができず、ページと呼ばれる単位で読み書きが可能で、複数ページがまとまってブロックと呼ばれる単位の記憶領域を構成する。ここでは、1ページ4KB、64ページで1ブロックとする。1つの半導体記憶素子58はこのブロックが複数集まって構成される。尚、本実施の形態においては、図1に示されるように、半導体記憶素子58の数を6つとしている。これらの各半導体記憶素子58A〜58Fに対して各々1つのチャネル(CH0〜CH5)を割り当て、このうち1つのチャネル(CH5とする)を、冗長情報を書き込むためのチャネルとして割り当てて、残りのチャネル(CH0〜CH4)を、ホストから書き込みが要求されたデータを書き込むためのチャネルとして割り当てて、チャネルCH0〜CH5の各ページを1つの組として誤り訂正符号を構成する。チャネルCH0〜CH4は、半導体記憶素子58A〜58Eに各々対応し、チャネルCH5は、半導体記憶素子58Fに対応する。尚、後述するように、半導体記憶装置50は、ホストから書き込みが要求されたデータがページのサイズより大きい場合にはこれを複数に分割し、分割したページ単位のデータ(分割データという)を各チャネルCH0〜CH4に割り当てて、書き込みを行う。即ち、本実施の形態の基本構成においては、半導体記憶装置50は、書き込みが要求されたデータについて、所定の単位毎のデータと、当該所定の数のデータを用いて計算され当該所定の数のデータの誤りを訂正するために用いられる冗長情報とを異なる半導体記憶素子58に各々書き込むことによって、所定の数のデータ及び冗長情報により誤り訂正符号を構成する。誤り訂正符号としては、例えば、パリティ符号を用いる。このような基本構成において、半導体記憶装置50の備える各半導体記憶素子58A〜58Fにおける使用可能な記憶領域の容量のばらつきに対応するための構成については後述する。
ここで、半導体記憶素子58への書き込み方式について説明する。従来より、NAND型の半導体記憶素子では、追記方式が採用されている。この追記方式では、書き込みの前に、ブロックを消去する必要がある。ブロックの消去とは、ブロックを構成する全てのビットの値を「1」にすることである。半導体記憶装置50では、このような消去をブロック単位で行ない、消去済みのブロックに対してページ単位で書き込みを行う。即ち、NAND型の半導体記憶素子58においては、消去済みのブロックのうち書き込みがまだ行われていないページに対して順次書き込みが可能であり、既に書き込みが行なわれたページに対する上書きが不可能である。また、ホストからの要求に応じたデータの書き込みは、ホストで用いられる論理アドレス(Logical Block Address:LBA)で指定される。一方、半導体記憶素子58へのデータや冗長情報の書き込みは、半導体記憶素子58の物理的な記憶位置(物理アドレス(Physical Block Address:PBA)という)により、論理アドレスとは無関係に、ページの昇順に書き込みが行なわれる。この論理アドレスと物理アドレスとの対応関係は、後述する正引きテーブルに記録される。そして、データの書き込み要求において指定された論理アドレスが再度指定されて新たなデータの書き込みがホストから要求されると、半導体記憶装置50は、消去済みのブロックの書き込みがまだ行なわれていないページに対して新たなデータの書き込みを行う。このとき、当該論理アドレスに対応して前回書き込みが行われたページを無効にして、新たなデータの書き込みが行われたページを有効にする。またこのとき、半導体記憶装置50は、上述した誤り訂正符号を構成しながら新たなデータ及び冗長情報の書き込みを行なう。
この追記方式において、書き込みを続けることにより、無効にされたページが増えてくると、半導体記憶素子58において書き込みを実現可能な容量(実現容量という)が少なくなってくる。そして、書き込みが可能な新規の消去済みのブロック、即ち、消去後に書き込みがまだ行なわれていないブロック(フリーブロックという)が少なくなり、誤り訂正符号を構成するブロックの組(論理ブロックという)の確保が不可能になった時点で書き込み不能となってしまう。これを防ぐために、半導体記憶装置50は、適当なタイミングでガベージコレクションを行なう。半導体記憶素子58において行なうガベージコレクションは、特にコンパクションという。図2は、コンパクションを説明するための概念図である。半導体記憶装置50は、無効にされたページを含むブロックのうち、無効にされていない物理アドレスに書き込まれたデータ(有効データという)を集めて新たにフリーブロックに書き直すことにより、有効データを移動させる。その後、半導体記憶装置50は、当該ブロックに対して消去を行うことにより、新たなフリーブロックを生成する。半導体記憶装置50は、このようなコンパクションを行なうことにより、書き込みが不能になったブロックが新たに書き込み可能になって、フリーブロックを確保することが可能になる。また、移動により有効データが書き込まれたブロックにおいても、書き込みがまだ行なわれていないページがあればそのページに新たに書き込みが可能である。
尚、コンパクションを行うためには少なくとも一つのフリーブロックが必要になるが、これは、NAND型の半導体記憶素子58において実装された容量(実装容量という)より、書き込みを実際に実現可能な容量(実現容量)が少ないことを意味している。本実施の形態においては、実装容量と実現容量との差を余裕容量と呼んでいる。余裕容量が小さい時は、半導体記憶装置50は、コンパクションを頻繁に行わなければならず、その性能に与えるインパクトが大きい。ところで、図2ではブロック単位のコンパクションの説明を行った。本実施の形態においては、論理ブロックを基本単位としているため、フリーブロックをチャネル毎に確保してこれらにより論理ブロックが構成されるようにし、コンパクションを論理ブロック毎に行うものとする。
次に、半導体記憶装置50において実現される機能について図3を用いて説明する。半導体記憶装置50は、ホストインタフェース部60と、バッファ制御部61と、アドレス変換部62と、CH振り分け部63と、コンパクション候補検出部64と、管理テーブル更新部65と、NAND制御部66A〜66Fと、データバッファ67と、コンパクションreadキュー68と、管理テーブル69とを有する。ホストインタフェース部60の機能は、プロセッサ51がプログラムを実行することと、SATA/SASインタフェース55の機能とにより実現される。アドレス変換部62と、CH振り分け部63と、管理テーブル更新部65と、コンパクション候補検出部64と、バッファ制御部61との各機能は、プロセッサ51がプログラムを実行することにより実現される。NAND制御部66A〜66Fの各機能は、NANDコントローラ57A〜57Fに各々対応しており、プロセッサ51がプログラムを実行することと、NAND制御部66A〜66Fに各々対応するNANDコントローラ57A〜57Fの機能とにより実現される。これらのNAND制御部66A〜66Fは、上述したチャネルCH0〜CH5が各々割り当てられた半導体記憶素子58A〜58Fに1対1対応しているが、これらを各々区別する必要がない場合には、単にNAND制御部66と記載する場合がある。データバッファ67と、コンパクションreadキュー68と、管理テーブル69とは、例えば、DRAM54上に記憶される情報である。
ホストインタフェース部60は、ホストと半導体記憶装置50との通信を制御するインタフェースである。ホストインタフェース部60は、ホストから送信されたコマンドを受信し、当該コマンドによって論理アドレスが指定されたデータの書き込みが要求されている場合、当該コマンド(writeコマンドという)を後述のアドレス変換部62に送る。その際、書き込みが要求されたデータのサイズがページのサイズ以下であれば、当該データを後述のバッファ制御部61に送り、当該データのサイズがページのサイズより大きい場合、当該データをページ単位に分割し、分割したデータ(分割データという)をバッファ制御部61に送る。これは論理アドレスと物理アドレスとの変換をページ単位で行っているためである。例えば、128KBのデータを4KBのデータ32個にホストインタフェース部60は分割する。尚、writeコマンドに応じてバッファ制御部61に送られるデータ又は分割データを、説明の便宜上、書き込み対象データと記載する。
また、ホストインタフェース部60は、ホストから送信されたコマンドによって論理アドレスが指定されたデータの読み出しが要求されている場合、読み出しが要求されたデータがページのサイズ以下であれば、当該コマンド(readコマンドという)をアドレス変換部62に送る。読み出しが要求されたデータがページのサイズより大きい場合、ホストインタフェース部60は、読み出す対象のデータがページ単位になるように読み出しを分解したコマンド(readコマンド)をアドレス変換部62に送る。このとき、ホストインタフェース部60は、ホストから送信されたコマンドにより指定された論理アドレスを用いて、読み出し対象の各データの論理アドレスを各々計算し、計算した各論理アドレスのデータの読み出しを要求するreadコマンドをアドレス変換部62に送る。そして、ホストインタフェース部60は、後述するバッファ制御部61によってデータバッファ67の指定の領域に記憶された読み出し対象のデータを読み出し、ホストに送信する。
管理テーブル69は、正引きテーブルと、ビットベクタテーブルとを含む。正引きテーブルとは、書き込み対象データの論理アドレスと、半導体記憶素子58において当該書き込み対象データの書き込まれる物理的な記憶位置を示す物理アドレスとの対応関係を示す情報であり、書き込み対象データ及び冗長情報を関連付ける情報と、書き込み対象データ及び冗長情報が書き込まれる半導体記憶素子58内の複数の記憶領域を各々特定する情報とを含む。このような正引きテーブルは、ホストから指定された論理アドレスに対応するデータが記憶されている半導体記憶装置58上の位置を示す物理アドレスを特定する際に用いられる。図4は、正引きテーブルのデータ構成を例示する図である。同図に示されるように、正引きテーブルは、LBAテーブルと、論物変換テーブルとを有する。LBAテーブルのエントリは、論理アドレスをインデックスとして、チャネルの番号と、ページに付与されたページ番号と、当該データが記憶されている論理ブロックに付与された論理ブロック番号とから構成される。各書き込み対象データの論理アドレスは、ホストからのデータの書き込みの要求において指定される論理アドレスに基づいて各々計算される。
論理ブロック番号は、書き込み対象データ及び冗長情報を対応付ける識別情報であり、例えば、論理ブロックの生成順に付与される番号である。チャネルの番号は、ここでは、CH0〜CH4とし、当該論理アドレスに対応するデータが記憶されている物理ブロックのある半導体記憶素子58がいずれのチャネルに接続されているかを示す。そしてページ番号は、当該論理アドレスに対応するデータが、論理ブロック番号とチャネル番号で特定される物理ブロックの中のどのページに記憶されているかを示す。尚、ページ番号としては、例えば、物理アドレスの順に付与されるものであっても良いし、ページの物理アドレス自体が付与されても良い。
論物変換テーブルは、書き込み対象データ及び冗長情報が書き込まれる半導体記憶素子58内の複数の記憶領域を各々特定する領域特定情報であり、論理ブロック番号と、その論理ブロックに関連付けられた各チャネルの各物理ブロックとを対応付けて記憶する。論物変換テーブルには、論理ブロック番号をインデックスとして、当該論理ブロックに関連付けられた各チャネルの物理ブロックのアドレス(物理ブロックアドレス)が記憶される。このような構成において、ある論理アドレスに対応するLBAテーブルのエントリに記憶されていた論理ブロック番号をインデックスとし、そのインデックスで、当該論理ブロックに関する論物変換テーブルのエントリを特定する。次に、当該論物変換テーブルのエントリに記憶されている物理ブロックの中から、当該LBAテーブルのエントリに記録されていたチャネル番号のチャネルに接続されている半導体記憶素子58の物理ブロックを特定する。そして、当該LBAテーブルのエントリに含まれるページ番号によって、当該論理アドレスに対応するデータが書き込まれているページを特定する。
尚、上述したように、チャネルCH0〜CH4の各ページには、ホストから書き込みが要求されたデータについて、ページ単位で書き込みが行なわれ、チャネルCH5には、誤り訂正符号を構成するために付加される冗長情報が書き込まれる。このため、論物変換テーブルの各エントリに記録されるチャネルCH5の物理アドレスの記憶領域には、冗長情報が各々書き込まれている。この冗長情報に対応する論理アドレスは存在しないため、冗長情報に関するエントリはLBAテーブルには記録されない。冗長情報に関する情報は、論物変換テーブルのエントリに記録される。正引きテーブルは、書き込み対象データや冗長情報が半導体記憶素子58に書き込まれる度に、更新される。どのように更新されるかは後述する。
次に、ビットベクタテーブルについて図5を用いて説明する。ビットベクタテーブルは、論理ブロックに関連付けられた物理ブロックのうち、書き込み対象データが書き込まれるチャネルCH0〜CH4の各物理ブロックについて、当該物理ブロックに含まれるページのうち有効なデータが書き込まれているページ(有効ページという)がどのページかを、物理ブロック順に2値で示すテーブルである。ページ毎に2値を示すものをビットベクタという。ビットベクタの値が「1」であれば、そのページが有効ページであることを示し、「0」であれば、そのページが有効ページではない(無効である)ことを示す。初期状態においては、ビットベクタの値は全て「0」である。
本実施の形態においては、論理ブロックに関連付けられた物理ブロックのうち、書き込
み対象データが書き込まれるチャネルはチャネルCH0〜CH4の5つであり、1物理ブロック当たり64ページとすると1論理ブロック当たりでは320ページとなるので、対応するビットベクタは、1論理ブロック当たり320個となる。同図に示されるように、このようなビットベクタテーブルは、上述した論理ブロック番号をインデックスとして、これと、当該論理ブロック番号が付与された論理ブロックに関連付けられたチャネルCH0〜CH4の各物理ブロックに各々含まれる各ページに対するビットベクタと、カウンタとを、論理ブロック毎に含む。尚、ここでは、論物変換テーブルのインデックスと、ビットベクタテーブルのインデックスとが一致するように、論物変換テーブル内のエントリとビットベクタテーブル内のビットベクタが予め配置されるものとする。同図においては、左から、チャネルCH0の1番目のページ、2番目のページ、…、チャネルCH0の最後のページ、チャネルCH1の1番目のページ、2番目のページ…、チャネルCH1の最後のページ、…、というように、チャネルCH0〜CH4の各物理ブロックの各ページの順にビットベクタが配置される。カウンタは、値が「1」であるビットベクタの総数を示す。ビットベクタの値が「1」であるページは有効ページであるから、このカウンタは、論理ブロック内の有効ページの数を示す(以降、有効ページ数カウンタと呼ぶ)。このような構成において、ビットベクタテーブルは、ホストからのデータの書き込みの要求がある度に、更新される。どのように更新されるかは後述する。
図3の説明に戻る。アドレス変換部62は、ホストインタフェース部60からコマンドを受け取り、当該コマンドがreadコマンドである場合、当該readコマンドで指定された論理アドレスを用いて管理テーブル69のうち正引きテーブルを参照し、当該readコマンドで読み出しが要求されたデータが書き込まれているチャネル及びページの物理アドレスを特定する。アドレス変換部62は、当該チャネル及び物理アドレスを指定してデータの読み出しを要求するコマンドを、CH振り分け部63を介してNAND制御部66に送る。
一方、ホストインタフェース部60から受け取ったコマンドがwriteコマンドである場合、アドレス変換部62は、当該writeコマンドを後述のCH振り分け部63に送る。
また、アドレス変換部62は、後述のコンパクションreadキュー68に記憶されたコンパクションreadコマンドに応じて、当該コンパクションreadコマンドによって物理アドレスで指定された有効ページのデータ(有効データ)の読み出しを要求するコマンドを、当該有効ページのある物理ブロックを含む半導体記憶素子58が接続されたチャネルに対応するNAND制御部66に送る。当該有効データは、NAND制御部66を介して半導体記憶素子58から読み出され、バッファ制御部61を介してデータバッファ67に記憶される。アドレス変換部62は、この有効データの書き込みを要求するコマンド(コンパクションwriteコマンドという)をCH振り分け部63に送る。
CH振り分け部63は、アドレス変換部62からコマンドを受け取り、当該コマンドがwriteコマンドである場合、書き込み対象データを書き込む対象のチャネルを決定する。例えば、CH振り分け部63は、冗長情報を書き込むチャネル(ここではチャネルCH5)以外のチャネルで、4KB毎にラウンドロビンにより書き込みを行うようにし、ラウンドロビンの順番に応じて、書き込む対象のチャネルを決定する。そして、CH振り分け部63は、書き込み対象データの書き込みを要求するコマンドを、決定したチャネルに対応するNAND制御部66に送る。
一方、アドレス変換部62からのコマンドによって、チャネル及び物理アドレスが指定されたデータの読み出しが要求されている場合、指定されたチャネルに対応するNAND制御部66に対して物理アドレスを指定してデータの読み出しを要求するコマンドを送る。また、アドレス変換部62から受け取ったコマンドがコンパクションwriteコマンドである場合、CH振り分け部63は、ラウンドロビンの順番に応じて、書き込み先のチャネルを決定し、有効データの書き込みを要求するコマンドを、決定したチャネルに対応するNAND制御部66に送る。
NAND制御部66は、CH振り分け部63からコマンドを受け取り、当該コマンドに従って、対応する半導体記憶素子58にアクセスする。具体的には、当該コマンドによって、データの書き込みが要求されている場合、NAND制御部66は、バッファ制御部61を介して書き込み対象データを取得して、当該書き込み対象データを半導体記憶素子58に書き込む。この書き込みにおいて、NAND制御部66は、対応する半導体記憶素子58の消去済みのブロックの中の書き込みがまだ行なわれていないページに追記ポインタを設定し、その追記ポインタで示される位置のページに書き込み対象データを書き込み、その後、書き込みを行なったページに続く次のページであって書き込みがまだ行われていないページの位置を示すよう追記ポインタを更新する。従って、追記ポインタは順次次の書き込み位置を示すようにその値が変化する。例えば、追記ポインタは、各チャネルにおいて15ビットの物理アドレスによりブロックが識別され、ブロック内に64ページある場合、合計15+6=21ビットで構成される。
ここで、書き込み対象データ及び冗長情報のデータ構成について説明する。NAND制御部66は、書き込み対象データ自体の誤りを検出して訂正するための誤り訂正符号(ページECCという)及びwriteコマンドによって指定された論理アドレスを当該書き込み対象データに付加する。尚、ページECCには、データの誤りを検出するCRC符号等の符号と、データの誤りを訂正するECC符号等の符号とが含まれるものとする。ページECCにCRC符号も含む理由は、ECC符号によりデータの誤りを訂正できない場合は誤訂正の可能性もあるからである。図6は、冗長情報が付加された書き込み対象データを例示する図である。NAND制御部66は、このようなページECC及び論理アドレスを付加した書き込み対象データを、上述のように決定された各チャネルの半導体記憶素子58内の追記ポインタにより示されるページに書き込む。尚、書き込み対象データはページ単位の大きさであるが、半導体記憶素子58のページサイズは、書き込み対象データにページECC及び論理アドレスが付加された全体の大きさに相当するものとする。また、各分割データの論理アドレスは、writeコマンドによって指定された論理アドレスに基づいてNAND制御部66が各々計算する。一方、誤り訂正符号を構成するために計算された冗長情報が書き込まれるチャネルCH5に対応するNAND制御部66Fは、当該冗長情報自体の誤りを検出して訂正するためのページECCを当該冗長情報に付加する。そして、NAND制御部66Fは、ページECCを付加した当該冗長情報を、追記ポインタにより示される半導体記憶素子58F内のページに書き込む。
次に、複数の分割データが書き込み対象データとしてラウンドロビンによりチャネルCH0〜CH5で書き込みが行われる様子について説明する。図7は、ラウンドロビンにより行う書き込みを説明するための図である。尚、図の簡略化のため、分割データに対して付加された論理アドレスの図示を省略している。同図に示されるように、時刻T1でチャネルCH0に対して最初の分割データD1の書き込みが行われ、時刻T2でチャネルCH1に対して次の分割データD2の書き込みが行われるというように、チャネルCH0〜CH4まではラウンドロビンで順に分割データの書き込みが行われる。尚、時刻T5で、チャネルCH4への分割データD5の書き込みが行われる際には、時刻T1でチャネルCH0に書き込まれた分割データD1、時刻T2でチャネルCH1に書き込まれた分割データD2、時刻T3でチャネルCH2に書き込まれた分割データD3、時刻T4でチャネルCH3に書き込まれた分割データD4及び時刻T5でチャネルCH4に書き込まれた分割データD5のパリティPが冗長情報として計算され、当該冗長情報Pの書き込みがチャネルCH5に対して行われる。更なる分割データの書き込みの際には、チャネルCH0から順にラウンドロビンで書き込みが行われる。このように、ラウンドロビンにより分割データの書き込みが行われることにより、書き込みがチャネル間で均等になる。尚、同図の例では、時刻の経過と共に各チャネルに順に書き込みを行う様子が図示されているが、これに限らず、2つ以上のチャネルに同時に書き込みを行うようにしても良い。
次に、誤り訂正符号の構成について図8を用いて説明する。尚、説明の便宜上、同図においては、チャネルCH0〜CH4に各々書き込まれる分割データに付加される論理アドレスの図示を省略している。同図に示されるように、チャネルCH0〜CH4の各書き込み対象データに対して、チャネルCH5に対応するNAND制御部66Fは、オフセットが等しい位置のバイト同士で排他的論理和を計算し、この値を冗長情報として、チャネルCH5の半導体記憶素子58Fにおいて上述のオフセットが等しい位置に書き込む。即ち、チャネルCH0〜CH5においてオフセットが等しい位置のバイト同士によって誤り訂正符号が構成される。
図3の説明に戻る。また、NAND制御部66は、CH振り分け部63から受け取ったコマンドによって、物理アドレスが指定されたデータの読み出しが要求されている場合、当該物理アドレスを用いて半導体記憶素子58内の当該物理アドレスに対応する位置からデータを読み出してこれをバッファ制御部61に送る。尚、NAND制御部66は、半導体記憶素子58から読み出した当該データに誤りがある場合、これを検出して訂正する。データの誤りを検出して訂正する方法については後述する。また、NAND制御部66は、アドレス変換部62から受け取ったコマンドによって、物理アドレスが指定された有効ページのデータ(有効データ)の読み出しが要求されている場合、当該物理アドレスを用いて半導体記憶素子58内の当該物理アドレスに対応するページに書き込まれたデータを読み出して、これをデータバッファ67に記憶させる。また、CH振り分け部63から受け取ったコマンドによって、有効データの書き込みが要求されている場合、NAND制御部66は、バッファ制御部61を介して書き込み対象の有効データを取得して、当該有効データを半導体記憶素子58に書き込む。
コンパクション候補検出部64は、管理テーブル69に含まれるビットベクタテーブルを参照して、コンパクションの候補とする論理ブロックを決定し、当該論理ブロックのうち有効ページの物理アドレスを指定して当該有効ページの読み出しを要求するコマンド(コンパクションreadコマンドという)をコンパクションreadキュー68に送る。
データバッファ67は、書き込み対象データを記憶するバッファである。コンパクションreadキュー68は、コンパクションの際に有効ページの読み出しを要求するコマンドを記憶する先入れ先出し型のバッファである。
バッファ制御部61は、データバッファ67を複数の領域として管理し、コマンドに対応したデータを記憶させる領域を管理する。具体的には、バッファ制御部61は、writeコマンドに応じてホストインタフェース部60から送られた書き込み対象データをデータバッファ67に記憶させ、CH振り分け部63により書き込み対象として決定されたチャネルに対応するNAND制御部66に、該当の書き込み対象データを送る。当該書き込み対象データは、NAND制御部66を介して半導体記憶素子58に書き込まれる。また、バッファ制御部61は、readコマンドに応じて、NAND制御部66から送られたデータをデータバッファ67の指定の領域に記憶させ、その後ホストインタフェース部60に送る。当該データはホストインタフェース部60を介してホストに送信される。また、バッファ制御部61は、コンパクションreadコマンドに応じて、NAND制御部66を介して半導体記憶素子58から読み出されたデータをデータバッファ67に記憶させる。
管理テーブル更新部65は、論理アドレスが指定されたデータの書き込みを要求するコマンド(writeコマンド)がホストから受信された場合、正引きテーブルを参照すると共に、ビットベクタテーブルを更新し、更に、正引きテーブルを更新する。具体的には、管理テーブル更新部65は、まず、正引きテーブルを参照して、当該論理アドレスに対応する物理アドレス、即ち、当該論理アドレスに対応するデータがどの物理ブロックのページに書き込まれているかを検索する。当該論理アドレスに対応する物理アドレスが正引きテーブルに記憶されていない場合は、当該論理アドレスに対応するデータの書き込みが今回まで行なわれていないことになる。この場合、管理テーブル更新部65は、ビットベクタテーブル内の、書き込み対象データを書き込むページに対応するビットベクタの値を「1」にする。書き込み対象データを書き込むページは、追記ポインタにより示される。また、管理テーブル更新部65は、当該ページの存在する物理ブロックが関連付けられた論理ブロックの有効ページ数カウンタの値を1インクリメントする。
一方、管理テーブル更新部65が正引きテーブルを参照したときに当該論理アドレスに対応する物理アドレスが正引きテーブルに存在する場合、当該論理アドレスに対応するデータの書き込みが以前に行なわれていることになる。この場合、今回のwriteコマンドにより、以前に書き込みが行なわれたデータを無効にする必要がある。このため、管理テーブル更新部65は、writeコマンドで指定された論理アドレスで参照した正引きテーブルのエントリに記憶されている物理アドレスのページに対応するビットベクタの値を「0」にする。あわせて管理テーブル更新部65は、当該ページの存在する物理ブロックが関連付けられたる論理ブロックの有効ページ数カウンタの値を1デクリメントする。また、管理テーブル更新部65は、書き込み対象データを書き込むページに対応するビットベクタの値を「1」にし、当該ページの存在する物理ブロックが関連付けられた論理ブロックの有効ページ数カウンタの値を1インクリメントする。このようにデータの書き込みが行なわれる度に更新することで、ビットベクタテーブルと有効ページ数カウンタとは有効ページの位置及びその数を常に示している。最後に管理テーブル更新部65は、当該論理アドレスに対応する正引きテーブルのエントリに、書き込み対象データを書き込む先の物理アドレスを記録する。
次に、本実施の形態にかかる半導体記憶装置50の行う処理の手順について説明する。まず、ホストからのwriteコマンドに応じて半導体記憶装置50が半導体記憶素子58に書き込み対象データの書き込みを行う処理の手順について図9を用いて説明する。尚、半導体記憶装置50は、書き込みを始める前には、各チャネルにおいてフリーブロックを各々予め確保しておく。そして、半導体記憶装置50は、論理アドレスが指定されたデータの書き込みを要求するwriteコマンドをホストから受信すると(ステップS1)、各チャネルにおいて各々1つのフリーブロックを選択して、チャネルCH0〜CH5の各フリーブロックを関連付けた論理ブロックを構成する。そして、半導体記憶装置50は、当該論理ブロックに対して論理ブロック番号を付与して、当該論理ブロック番号をインデックスとして、その論理ブロックと関連付けられたチャネル毎の各物理ブロックの物理アドレスを論物変換テーブルに記録する。このとき、半導体記憶装置50は、論物変換テーブルのインデックスで当該論理ブロックに関連付けられた各物理ブロックのビットベクタが参照できるように、論物変換テーブルエントリやの並び順や、論物変換テーブルエントリ内での各チャネルの物理ブロックの物理アドレスの並び順、そしてビットベクタテーブル内のビットベクタを配置する。そして、半導体記憶装置50は、論理ブロックに関連付けられた各物理ブロックの物理アドレスと共に、各物理ブロックの書き込み先のページを示す追記ポインタをチャネル毎に設定する。書き込みを始める前には、半導体記憶装置50は、各チャネルの先頭の物理ブロックの1番目のページを示すように各チャネルの追記ポインタを設定する。
そして、半導体記憶装置50は、writeコマンドにより書き込みが要求されたデータのサイズがページのサイズ以下であるか否かを判断する(ステップS2)。当該データのサイズがページのサイズ以下である場合(ステップS2:YES)、半導体記憶装置50は、当該データ(書き込み対象データ)をデータバッファ67に記憶させる(ステップS4)。一方、writeコマンドにより書き込みが要求されたデータのサイズがページのサイズより大きい場合(ステップS2:NO)、半導体記憶装置50は、当該データをページ単位で分割し(ステップS3)、分割したデータ(分割データ:書き込み対象データ)をデータバッファ67に記録する(ステップS4)。
そして、半導体記憶装置50は、writeコマンドにより指定された論理アドレスに基づいて正引きテーブルを参照して、書き込み対象データの論理アドレスに対応する物理アドレスが既に記録されている場合、当該物理アドレスを古い物理アドレスとして例えばDRAM54に記憶させる(ステップS5)。また、半導体記憶装置50は、書き込み対象データを書き込むチャネルをラウンドロビンにより決定し(ステップS6)、決定した各チャネルの、半導体記憶素子58において追記ポインタで示されるページに、ページECC及び論理アドレスを各々付加した各書き込み対象データを書き込む(ステップS7)。そして、半導体記憶装置50は、各チャネルに関して、書き込み対象データを書き込んだページに続く次のページであって書き込みがまだ行われていないページを示すよう、追記ポインタを更新する(ステップS8)。
図10は、チャネルCH0について、分割データが書き込み対象データとして書き込まれていく様子を時刻毎に示した図である。まず、時刻t0では、フリーブロックが確保されている状態が示されている。時刻t1では、最初の分割データD1が、時刻t0で確保されたフリーブロックの最初(先頭又は最後尾)のページに書き込まれ、時刻t2では、ラウンドロビンによりチャネルCH0に新たに決定された分割データD6が2番目のページに書き込まれる。同様に、時刻t3では、3番目のページに分割データD11が書き込まれ、時刻t4では、4番目のページに分割データD16が書き込まれる。このように、分割データを書き込むページは、論理アドレスとは無関係に、物理ブロック内の昇順に決定される。そして追記ポインタは、この順に書き込むページを示すように、書き込みが行われる度に設定される。本実施の形態においては、ラウンドロビンで各チャネルへの書き込みが均等に行われるため、図7で示されるように、各チャネルにおいて追記ポインタが示すページの番号は、最大で1の差である。そして、論理ブロックの最後のページに書き込みが終了したときには、各チャネルの追記ポインタの示すページの番号は、同じになる。
以上のように、ホストからのwriteコマンドにより指定された論理アドレスがどのような値であっても、書き込み対象データを書き込むページの物理アドレスが一定の順序で割り当てられ、当該ページにデータの書き込みが行なわれる。
図9の説明に戻る。書き込み対象データの書き込みに伴って、半導体記憶装置50は、書き込み対象データの論理アドレスと、書き込み対象データを書き込んだページの物理アドレスとの対応関係を、図4に例示した正引きテーブルに記録する(ステップS9)。書き込み対象データが分割データである場合、半導体記憶装置50は、各分割データの物理アドレスを、writeコマンドにより指定された論理アドレスに基づいて各々計算する。分割データは、ページ単位であるから、指定された論理アドレスに対してページのサイズを順次加算した値を各分割データの論理アドレスとして半導体記憶装置50は計算する。そして、半導体記憶装置50は、論理アドレスと、書き込み対象データを各々書き込んだ各チャネルの物理ブロックが関連付けられた論理ブロックの論理ブロック番号と、書き込み対象データを今回書き込んだチャネルの番号及びページ番号とを、LBAテーブルに記録する。上述の例では、ページ番号は、更新する前の追記ポインタの下位6ビットにより示されるから、ページ番号にはこの値を用いれば良い。半導体記憶装置50は、書き込み対象データの書き込みを行う度、このように正引きテーブルを更新する。
更に、半導体記憶装置50は、ビットベクタテーブルを参照して、ステップS5でDRAM54に記憶させた古い物理アドレスのページに対応するビットベクタの値を「0」にし、当該ページの存在する物理ブロックが関連付けられた論理ブロックの有効ページ数カウンタの値を1デクリメントする(ステップS10)。古い物理アドレスとは、即ち、ステップS10で受信されたwriteコマンドが指定する論理アドレスで、以前にデータが書き込まれたページを示している。このため、当該ページに書き込まれたデータを無効にするため、ビットベクタの値を「0」にして、当該ページの存在する物理ブロックが関連付けられた論理ブロックの有効ページの数カウンタの値を1つ減らしている。また、半導体記憶装置50は、ビットベクタテーブルにおいて、ステップS7で書き込み対象データを書き込んだページに対応するビットベクタの値を「1」にし、当該ページの属する論理ブロックの有効ページ数カウンタの値を1インクリメントする(ステップS11)。以上のようにして、半導体記憶装置50は、書き込み対象データの書き込みに伴って、ビットベクタテーブルを更新する。
尚、ステップS7において、半導体記憶装置50は、チャネルCH0〜CH4への書き込み対象データの書き込みが一巡すると、チャネルCH0〜CH4の各書き込み対象データにおいて、オフセットが等しい位置のバイト同士で排他的論理和を計算し、この値を、チャネルCH5において上述のオフセットが等しい位置に書き込むことにより冗長情報を書き込む。
そして、追記ポインタが全てのチャネル(CH0〜CH5)でブロックの最後に達して、論理ブロックに新たな書き込みを行うことができなくなった場合、半導体記憶装置50は、新たな論理ブロックを構成する。論理ブロックを構成する方法は、上述の通りである。新たな論理ブロックへの分割データ及び冗長情報の書き込みについても上述の通りである。
次に、ホストからのreadコマンドに応じて半導体記憶装置50が半導体記憶素子58からデータの読み出しを行う処理の手順について図11を用いて説明する。半導体記憶装置50は、論理アドレスが指定されたデータの読み出しを要求するreadコマンドをホストから受信すると(ステップS20)、readコマンドにより読み出しが要求されたデータのサイズがページのサイズ以下であるか否かを判断する(ステップS21)。当該データのサイズがページのサイズ以下である場合(ステップS21:YES)、半導体記憶装置50は、readコマンドにより指定された論理アドレスを使って正引きテーブルのLBAテーブルを参照し、論理ブロック番号を特定する。次に、半導体記憶装置50は、特定した論理ブロック番号を使って論物変換テーブルを参照して、読み出しの対象のチャネル、物理ブロック及びページを特定する(ステップS23)。そして、半導体記憶装置50は、特定したチャネルに対応する半導体記憶素子58から該当のデータを読み出す(ステップS24)。
一方、readコマンドにより読み出しが要求されたデータのサイズがページのサイズより大きい場合(ステップS21:NO)、半導体記憶装置50は、読み出す対象のデータがページ単位になるように読み出しを分解する。即ち、半導体記憶装置50は、readコマンドにより指定された論理アドレスを用いて、読み出し対象の各データの論理アドレスを各々計算する(ステップS22)。そして、半導体記憶装置50は、計算した各論理アドレスを使って正引きテーブルのLBAテーブルを参照して、論理ブロック番号を各々特定する。次に、半導体記憶装置50は、特定した論理ブロック番号を使って論物変換テーブルを参照し、読み出しの対象のチャネル、物理ブロック及びページを各々特定する(ステップS23)。そして、半導体記憶装置50は、特定したチャネルに対応する半導体記憶素子58から該当のデータを各々読み出す(ステップS24)。
ステップS24で読み出したデータの正当性は、データに付加されたページECCで担保される。即ち、半導体記憶装置50は、読み出したデータに付加されたページECCを使って、当該データの誤りを検出してこれを訂正することが可能である。しかし、ページECCで訂正できない誤りがある場合、半導体記憶素子58に故障が生じて、データに異常が発生している可能性がある。このような場合には(ステップS25:NO)、半導体記憶装置50は、データの読み出し時に使った論理アドレスで正引きテーブルを参照して、当該データを読み出したチャネルの物理ブロックが関連付けられた論理ブロックを特定し(ステップS27)、当該論理ブロックに関連付けられた他のチャネルの物理ブロックに書き込まれた他のデータ及び冗長情報を読み出し、当該他のデータ及び冗長情報を用いて、訂正できない誤りがあったデータの復元を行う。
図12は、例としてチャネルCH3の半導体記憶素子58に発生した故障により異常の発生したデータを復元する様子を示す図である。具体的には、半導体記憶装置50は、ステップS27で特定した論理ブロックに関連付けられた物理ブロックであって訂正できない誤りの生じたデータを読み出した物理ブロック以外の他のチャネルの物理ブロックに書き込まれた他のデータ及び冗長情報(ここでは、チャネルCH0、CH1、CH2、CH4に書き込まれた各データ及びチャネルCH5に書き込まれた冗長情報)を読み出す。そして、半導体記憶装置50は、当該各データ及び冗長情報において同じオフセットにおける排他的論理和、即ち、これらのバイト毎の排他的論理和を求めることにより、チャネルCH3におけるデータを復元する。そして、半導体記憶装置50は、復元したデータをデータバッファ67に記憶させ(ステップS28)、ステップS29に進む。
尚、誤りがあったデータが読み出されたページには異常が発生している可能性が高いため、半導体記憶装置50は、復元したデータを当該ページとは異なるページに新たに書き込む。このとき、半導体記憶装置50は、データの読み出し時に用いた論理アドレスを用いて、ビットベクタテーブル及び正引きテーブルを更新する。これらのテーブルを更新する方法は、上述の通りである。この更新の結果、誤ったデータが読み出されたページのビットベクタが「0」に更新され、復元したデータが書き込まれたページのビットベクタが「1」に更新され、readコマンドにより指定された論理アドレスに対する正引きテーブルエントリには、復元したデータが書き込まれたページの物理アドレスが記録される。
ステップS24で読み出したデータに誤りがない場合には、半導体記憶装置50は、当該データをデータバッファ67の指定の領域に記憶させ、ステップS29に進む。また、ステップS24で読み出したデータに誤りがあっても、半導体記憶装置50は、ページECCを用いて当該データを訂正した後(ステップS26)、訂正したデータをデータバッファ67の指定の領域に記憶させ、ステップS29に進む。ステップS29では、半導体記憶装置50は、データバッファ67の指定の領域に記憶されたデータをホストに送信する。
尚、ステップS20で受信されたreadコマンドにより複数のデータの読み出しが要求された場合、各々指定された論理アドレスに応じて、半導体記憶装置50は、異なった論理ブロックに関連付けられた各チャネルの物理ブロックからデータを読み出す場合も有り得る。このように、データの読み出し時には各チャネルで独立なアクセスが可能であるので、ホストからの要求に応じてデータを読み出してこれを応答性良くホストに送信することができる。
次に、コンパクションの対象の論理ブロックに書き込まれている有効データをフリーブロックに移動する処理の手順について図13を用いて説明する。半導体記憶装置50は、有効ページの数の値の最大値として「M=4096」を設定し、ビットベクタテーブルにおける論理ブロック毎のエントリのインデックスとして「K=0」を設定する(ステップS40)。そして、半導体記憶装置50は、ビットベクタテーブルを参照して、論理ブロック毎の有効ページ数カウンタの値を順番に1つ読み出し(ステップS41)、当該カウンタの値がMより小さいか否かを判断する(ステップS42)。当該有効ページ数カウンタの値がM以上である場合(ステップS42:NO)、ステップS44に進む。当該有効ページ数カウンタの値がMより小さい場合(ステップS42:YES)、半導体記憶装置50は、Mの値を当該カウンタの値に置き換え、ステップS41で当該有効ページ数カウンタの値を読み出したエントリのインデックスの値をKとして(ステップS43)、ステップS44に進む。
ステップS44では、半導体記憶装置50は、ビットベクタテーブルの全ての論理ブロックについて有効ページ数カウンタの値を読み出したか否かを判断し、全ての論理ブロックについて有効ページ数カウンタの値を読み出していない場合(ステップS44:NO)、Kの値を1インクリメントして(ステップS45)、ステップS41に戻る。ステップS41では、半導体記憶装置50は、ビットベクタテーブルで、Kの順番であってまだ読み出していない論理ブロックの有効ページ数カウンタの値を読み出すことになる。一方、全ての論理ブロックについて有効ページ数カウンタの値を読み出した場合(ステップS44:YES)、半導体記憶装置50は、論物変換テーブルにおいて、Kの値を、コンパクションの候補の論理ブロックのインデックスとして設定する(ステップS46)。上述したように、論物変換テーブルのインデックスを用いてビットベクタテーブルを参照できるように各エントリを配置しているため、ビットベクタテーブルにおけるエントリのインデックスKを、論物変換テーブルのエントリのインデックスとして使えるのである。そして、半導体記憶装置50は、論物変換テーブルにおいてインデックスKで示されるエントリの論理ブロックに関連付けられたチャネルCH0〜CH4の各物理ブロックについて、ビットベクタテーブルのビットベクタが「1」を示すページ(有効ページ)に記憶されているデータ(有効データ)を特定し、当該有効データをデータバッファ67に全て読み出す。また、半導体記憶装置50は、当該有効データに付加されている論理アドレスを抽出する(ステップS47)。
そして、半導体記憶装置50は、ステップS47で読み出した各有効データの書き込みを、上述のwirteコマンドに応じて行うデータの書き込みと同様にして行う。即ち、半導体記憶装置50は、当該有効データを書き込むチャネルをチャネルCH0〜CH4からラウンドロビンで決定し、各チャネルの半導体記憶素子58の消去済みのブロックのうち追記ポインタで示されるページに、当該有効データを書き込む。その後、半導体記憶装置50は、有効データを書き込んだページに続く次のページであって書き込みがまだ行われていないページを示すよう追記ポインタを更新する。この際、冗長情報はチャネルCH0〜CH4からに書き込まれるデータを元に計算され、チャネルCH5に書き込まれる。また、半導体記憶装置50は、書き込んだ有効データに付加されている論理アドレスと、当該有効データを書き込んだページの物理アドレスとの対応関係を正引きテーブルに記録して更新する(ステップS48)。正引きテーブルを更新する方法は上述の通りである。このように、コンパクションにおいても正引きテーブルを更新することで、データの論理アドレスと物理アドレスとの対応関係を常に正しく保持することができる。また、データに論理アドレスが付加されていることで、コンパクションの際に、当該論理アドレスと当該データが書き込まれる物理アドレスとの対応関係を容易に更新することが可能になる。
そして、データバッファ67に読み出した全ての有効ページのデータについてデータバッファ67からの読み出しが終了して(ステップS49:YES)、半導体記憶素子58に書き込みが終了すると、半導体記憶装置50は、ステップS46でコンパクションの候補とした論理ブロックに関連付けられたチャネルCH0〜CH5の各物理ブロックに対して消去を行い、コンパクションの処理を終了する。
尚、コンパクションの処理を行うタイミングは、例えば、論理ブロックを構成するときにフリーブロックの数をチェックし、その数が所定数以下となったときなどであれば良い。
以上のように、半導体記憶素子を複数用いて、いずれかの半導体記憶素子の故障時にもデータにアクセス可能にする構成において、データの書き込みをページ単位で行い、ページのサイズより大きいデータはページ単位に分割した後、各半導体記憶素子58への書き込みが均等になるように、分割した各データを各半導体記憶素子58に割り当てて、各半導体記憶素子58の各ページに書き込みを行う。また、複数の半導体記憶素子の各ページに書き込む各データに対する冗長情報を1つの半導体記憶素子のページに書き込んで、複数の半導体記憶素子の各ページにより誤り訂正符号を構成する。また、データの読み出しをページ単位で行い、データの異常が発生した場合には、当該データが書き込まれた半導体記憶素子58のページに異常が発生したとして、他の半導体記憶素子との間で構成された誤り訂正符号を用いてデータの復元を行う。
このような構成によれば、複数ページ(上述の例では5ページ)のデータの書き込みに対して、当該データに対する冗長情報の書き込みを1ページに抑えることができる。一方、HDDのRAIDでは、1ページのデータの書き込みに対し、当該データに対応する冗長情報の書き込みは1ページである。これに比べて、本実施の形態においては、冗長情報の書き込みをN分の1(上述の例では5分の1)に抑えることができる。上述したように、NAND型の半導体記憶素子には書き込み回数に制限があるので、冗長情報の書き込みの回数を抑えながら、半導体記憶装置50の信頼性を向上させることができる。
また、HDDのRAIDでは、データの異常が発生すると、当該データが記憶されたHDD全体が故障したとして当該HDDを切り離して、他のHDDとの間で構成された誤り訂正符号を用いてデータの復元を行うが、本実施の形態においては、データの異常が発生したとしても、半導体記憶素子全体の故障としてではなく、当該半導体記憶素子の一部であるブロックやページの故障として扱うことができる。このため、より小さい単位での誤りにも対応することができる。また、半導体記憶素子全体が故障したとしても、当該半導体記憶素子に書き込まれたデータを、他の半導体記憶素子との間で構成された誤り訂正符号を用いて復元することができる。このため、極めて高い信頼性を実現することができる。
即ち、以上のような構成によれば、半導体記憶素子などの故障によりデータに異常が発生したとしても、誤り訂正符号によってデータを復元可能にすることで、半導体記憶装置50の信頼性を向上させることができると共に、書き込み回数に制限のある半導体記憶素子の書き込み回数が増大するのを抑制することができる。
また、本実施の形態においては、ビットベクタテーブルを有することにより、コンパクションを効率良く高速で行うことが可能になる。コンパクションを行うためには、半導体記憶装置50は、ブロック中有効データが書き込まれている有効ページがどのページであるかを識別し、当該有効ページに対応する論理アドレスを求めて、当該有効データを移動し、当該論理アドレスと移動先のページの物理アドレスとを対応付ける更新処理が必要となる。有効ページの識別及び物理アドレスの更新は、正引きテーブルを介して行うことは可能である。しかし、正引きテーブルは、論理アドレスをインデックスとした検索に最適化されて構成されている。このため、コンパクションを行う際に正引きテ―ブルを介して有効ページの識別及び物理アドレスの更新を行うことは、検索の時間的ペナルティーが大きくかかってしまう。
また、コンパクションの対象となる論理ブロックは、有効ページ数が少ないものが望ましい。その理由は、コンパクションによって有効ページを移動することで、多くのフリーブロックができるからである。有効ページ数が少ない論理ブロックを選択するためには、値が「1」であるビットベクタの数が少ないエントリを選択すれば良い。値が「1」であるビットベクタの数を数えるためには、例えば、Population演算(ワード中の「1」が立っているビット数を数える)を実装すれば良いが、エントリのビット幅が大きいと(例では320ビット)1サイクルで計算を行うのが困難になる。そのため、本実施の形態においては、半導体記憶装置50は、ビットベクタの値の変化に応じて、図5に示される有効ページ数カウンタの値を更新し、コンパクションの対象となる論理ブロックを検索する際には、ビットベクタテーブルの有効ページ数カウンタの値が最小であるエントリを検索することにより、該当の論理ブロックを求める。有効ページ数カウンタの値が最小であるエントリの検索は、全ての論理ブロックに関するエントリの有効ページ数カウンタの値を各々1回読み出すことにより可能である。従って、本実施の形態における半導体記憶装置50では、ビットベクタテーブルを参照することで、有効ページ数の少ない論理ブロックを容易に検索することができ、コンパクションを効率良く高速で行うことが可能になる。
以上が半導体記憶装置50の備える基本的な構成である。次に、半導体記憶装置50の備える各半導体記憶素子58A〜58Fにおける使用可能な記憶領域の容量のばらつきに対応するための構成について説明する。上述した基本的な構成においては、半導体記憶装置50はデータの書き込みを要求するwriteコマンドをホストから受信すると、各チャネルにおいて各々1つのフリーブロックを選択して、チャネルCH0〜CH5の消去済みの各ブロックを関連付けた論理ブロックを構成した。ところが、論理ブロックが必要になった時に毎回書き込み可能なフリーブロック(物理ブロック)を選択して論理ブロックを構成していると、NAND型の半導体記憶素子の性質により物理ブロックを効率よく使用できず、性能の悪化や信頼性の低下に繋がってしまうことがある。図14は、チャネルCH0〜CH5において使用可能な物理ブロックの数にばらつきがある状態を概念的に示す図である。同図においては、物理的に使用できない物理ブロックを黒塗りで示し、使用可能なブロックを白塗りで示している。NAND型の半導体記憶素子では1つのメモリチップに規定の数(例えば4096個)の物理ブロックを実装していても、製造プロセスなどの影響により、実際には、実装されている物理ブロック全てが使用可能とは限らず、使用できない物理ブロックが存在する。そしてその使用できないブロックの数は、半導体記憶素子それぞれによって異なる。このため、図14に示されるように、各チャネルCH0〜CH5では、白塗りで示されている使用可能なブロックの数がばらつく可能性がある。この状態で、論理ブロックを構成するために各チャネルから毎回使用可能な物理ブロックを選択して関連付けると、構成可能な論理ブロックの数は、使用可能な物理ブロックの数が最も少ないチャネルにおける使用可能な物理ブロックの数で制限されてしまう。図14の例では、使用可能な物理ブロックが最も少ないのはチャネルCH3であるから、半導体記憶装置50において構成可能な論理ブロックの数は、チャネルCH3の使用可能な物理ブロック数と同じになってしまう。この場合、チャネルCH3以外のチャネルにおいては、使用可能なのに使われない物理ブロックが存在することになる。これは半導体記憶装置50において記憶可能な容量が実質的に減少していることを意味し、余裕容量の減少に繋がる。そして上述したように、余裕容量が低下するとコンパクションを頻繁に行わなければならず、性能に悪影響を及ぼす。したがって、チャネルCH3以外のチャネルにおける使用可能な物理ブロックをできる限り使用できるようにすれば、この性能への悪影響を抑えることができる。
そこで、本構成においては、半導体記憶装置50は、チャネルCH0〜CH5に各々対応する半導体記憶素子58A〜58Fのそれぞれについて各物理ブロックが使用可能か否かを示す使用状態情報を記憶する。データの書き込みが要求された場合、使用状態情報を参照して、所定の数(第1の所定の数)以下の半導体記憶素子58を決定する。決定した半導体記憶素子58から物理ブロックを選択して論理ブロックを構成し、決定した半導体記憶素子58に所定の単位毎のデータと、当該所定の数(第2の所定の数)のデータを用いて計算され当該所定の数のデータの誤りを訂正するために用いられる冗長情報とを各々書き込むことによって、所定の数以下のデータ及び冗長情報により誤り訂正符号を構成する。第2の所定の数は、1以上の数であって、決定された半導体記憶素子58の個数から冗長情報を書き込む半導体記憶素子58の個数を減じた値以下の数である。
このような本構成について具体的に説明する。図15は、半導体記憶装置50の機能的構成を例示する図である。同図に示されるように、本構成において、半導体記憶装置50は、上述したホストインタフェース部60と、バッファ制御部61と、アドレス変換部62と、CH振り分け部63と、コンパクション候補検出部64と、管理テーブル更新部65と、NAND制御部66A〜66Fと、データバッファ67と、コンパクションreadキュー68と、管理テーブル69とに加え、NAND状態管理部70と、論理ブロック管理部71とを有する。NAND状態管理部70の機能は、プロセッサ51がプログラムを実行することと、NAND制御部66A〜66Fに各々対応するNANDコントローラ57A〜57Fの機能とにより実現される。論理ブロック管理部71の機能は、プロセッサ51がプログラムを実行することにより実現される。また、管理テーブル69は、正引きテーブルと、ビットベクタテーブルとに加え、物理ブロックテーブルを有する。
尚、本構成においては、CH振り分け部63及び管理テーブル更新部65の機能が以下の点で上述の基本的な構成と異なる。CH振り分け部63は、アドレス変換部62からコマンドを受け取り、当該コマンドがwriteコマンドである場合、論理ブロックを構成することを後述の論理ブロック管理部71に要求し、当該writeコマンドに応じて論理ブロック管理部71が決定したチャネルに対する書き込み対象データの書き込みを要求するコマンドを、当該チャネルに対応するNAND制御部66に送る。また、CH振り分け部63は、各チャネルにおいて追記ポインタを更新するときに、少なくとも1つのチャネルについて書き込み対象データを書き込んだページが物理ブロックの最後尾のページであった場合、新たな論理ブロックを構成することを論理ブロック管理部71に要求する。
管理テーブル更新部65は、上述の基本的な構成と同様に、論理アドレスが指定されたデータの書き込みを要求するコマンド(writeコマンド)がホストから受信された場合、正引きテーブルを参照すると共に、ビットベクタテーブルを更新し、正引きテーブルを更新するが、本構成においては、正引きテーブルのうち論物変換テーブルの更新を、論理ブロック管理部71からの要求に応じて行う。また、管理テーブル更新部65は、後述のNAND状態管理部70からの要求に応じて、物理ブロックテーブルへの状態情報の記憶や更新を行う。
NAND状態管理部70は、各NAND制御部66A〜66Fと管理テーブル更新部65とに接続され、各NAND制御部66A〜66Fから各々半導体記憶素子58A〜58Fの状態を取得し、各々半導体記憶素子58A〜58Fの状態を物理ブロックテーブルに記憶させることを管理テーブル更新部65に要求する。半導体記憶素子58の状態とは、半導体記憶素子58における全ての物理ブロックのそれぞれの使用状態を示すものである。物理ブロックの使用状態とは、書き込みが可能であり使用可能である(フリーブロック)、書き込みが既になされており消去が行われるまで書き込みが不能である(使用中)及び書き込みが不能であり使用不可能である、のいずれかである。半導体記憶素子58の状態の取得は、NAND状態管理部70からNAND制御部66へ要求して行うようにしても良いし、NAND制御部66からの通知により行うようにしても良いが、半導体記憶装置50が記憶装置として実際に使用される前に準備として行うことが望ましい。
物理ブロックテーブルは、各半導体記憶素子58A〜58Fのそれぞれについて各物理ブロックの使用状態を示す使用状態情報を記憶する。図16は、物理ブロックテーブルのデータ構成を例示する図である。同図に示されるように、物理ブロックテーブルは、チャネルCH0〜CH5毎に、チャネル番号と、半導体記憶素子58において使用可能な物理ブロックの最大数と、半導体記憶素子58において使用可能であり且つフリーブロックである物理ブロックの数と、半導体記憶素子58における全ての物理ブロックのそれぞれについて使用状態とを示す使用状態情報を記憶する。物理ブロックが使用不可能であるか使用可能であるかは、NAND状態管理部70によって判断され、使用状態情報においてそのいずれかを示すようにNAND状態管理部70及び管理テーブル更新部65を介して記憶される。また、物理ブロックが使用可能な状態から書き込まれた場合、使用状態情報においてその状態を示すように管理テーブル更新部65によって更新される。
論理ブロック管理部71は、論理ブロックを構成することをCH振り分け部63から要求されると、物理ブロックテーブルを参照して、論理ブロックの構成に用いる物理ブロックのチャネルを決定する。具体的には、論理ブロック管理部71は、物理ブロックテーブルを参照して、全てのチャネルCH0〜CH5のそれぞれについて使用可能な物理ブロックの数が「0」以上である場合、上述の基本的な構成と同様に、チャネルCH0〜CH5の各物理ブロックを関連付けて論理ブロックを構成することを決定する。そして、論理ブロック管理部71は、チャネル番号が最も大きいチャネルCH5に冗長情報を書き込むことを決定する。そして、論理ブロック管理部71は、冗長情報を書き込むチャネルCH5以外のチャネルCH0〜CH4で、4KB毎にラウンドロビンにより書き込みを行うようにし、ラウンドロビンの順番に応じて、書き込み先のチャネルを決定する。一方、チャネルCH0〜CH5のうち少なくとも1つについて使用可能な物理ブロックの数が「0」である場合、論理ブロック管理部71は、使用可能な物理ブロックの数が「0」であるチャネルを除いたチャネルの各物理ブロックを関連付けて論理ブロックを構成することを決定する。例えば、使用可能な物理ブロックの数が「0」であるチャネルがチャネルCH3である場合、チャネルCH0〜CH5の各物理ブロックを関連付けて論理ブロックを構成することを決定する。そして、論理ブロック管理部71は、論理ブロック構成時に除外されなかったチャネルの中で最もチャネル番号の大きいチャネルであるチャネルCH5を、冗長情報を書き込むチャネルとして決定した上で、冗長情報を書き込むチャネルCH5以外のチャネルCH0〜CH2,CH4で、4KB毎にラウンドロビンにより書き込みを行うようにし、ラウンドロビンの順番に応じて、書き込み先のチャネルを決定する。その後、いずれの場合であっても、論理ブロック管理部71は、決定した各チャネルに対する各書き込み対象データの書き込みを要求するコマンドを、CH振り分け部63に送る。また、論理ブロック管理部71は、論理ブロックに関連付けられた各チャネルの各物理ブロックを特定する情報と、冗長情報を書き込むチャネルを特定する情報とを論物変換テーブルへ記録する処理を、管理テーブル更新部65に要求する。
ここで、本構成における正引きテーブルのデータ構成について図17を用いて説明する。本構成における正引きテーブルに含まれる論物変換テーブルには、論理ブロック番号をインデックスとして、当該論理ブロックに関連付けられた各チャネルの物理ブロックのアドレス(物理ブロックアドレス)と、更に、冗長情報を書き込むチャンネルのチャンネル番号とが記録されている。
論理ブロック構成時にチャネルCH5が除外されてチャネルCH0〜CH4の各物理ブロックを関連付けて論理ブロックを構成した場合、チャネルCH0〜CH4の中でチャネル番号が最も大きいチャネルはCH4になる。従って、チャネル番号が最も大きいチャネルに冗長情報を書き込む本構成において、論理ブロックにおける冗長情報を書き込むチャネルはチャネルCH4となる。この場合、論理ブロック管理部71は、管理テーブル更新部65を介して、図17の論物変換テーブルに、冗長情報を書き込むチャネルを特定するチャンネル番号CH4を記録する。
次に、本構成において、半導体記憶装置50の行う処理の手順について説明する。まず、物理ブロックテーブルを構築する処理の手順について図18を用いて説明する。半導体記憶装置50は、NAND状態管理部70の機能により、各チャネルのそれぞれについて、ステップS60〜S67の処理を行う。まず、半導体記憶装置50は、処理対象の物理ブロック番号iを「0」に設定する(ステップS60)。そして、半導体記憶装置50は、処理対象のチャネルに対応する半導体記憶素子58の有する物理ブロックのうち、物理ブロック番号iの物理ブロックが使用可能か否かを、処理対象のチャネルに対応するNAND制御部66を介して検査する(ステップS61)。物理ブロックが使用可能か否かを検査する方法は、NAND型の半導体記憶素子に定められた方法を用いれば良い。当該物理ブロックが使用可能である場合(ステップS62:YES)、半導体記憶装置50は、管理テーブル更新部65の機能により、物理ブロックテーブルにアクセスして、処理対象のチャネルに対応する半導体記憶素子58の使用状態情報において物理ブロック番号iの物理ブロックの使用状態を「使用可能」として記録する(ステップS63)。そして、半導体記憶装置50は、当該使用状態情報において、使用可能な物理ブロックの最大数と、使用可能であり且つフリーブロックである物理ブロックの数とを各々1インクリメントする(ステップS64)。
一方、処理対象の物理ブロックが使用可能でない場合(ステップS62:NO)、半導体記憶装置50は、管理テーブル更新部65の機能により、物理ブロックテーブルにアクセスして、処理対象のチャネルに対応する半導体記憶素子58の使用状態情報において物理ブロック番号iの物理ブロックの使用状態を「使用不可能」として記録する(ステップS66)。その後、半導体記憶装置50は、NAND状態管理部70の機能により、処理対象のチャネルに対応する半導体記憶素子58の有する物理ブロックの全てについて使用可能か否かを検査したかを判断する、即ち、物理ブロック番号iが、「当該半導体記憶素子58の有する物理ブロックの総数−1」に達したか否かを判断する(ステップS65)。当該判断結果が否定的である場合(ステップS65:NO)、半導体記憶装置50は、物理ブロック番号iを1インクリメントして(ステップS67)、ステップS61に戻り、新たな処理対象の物理ブロックについて使用可能か否かを検査したかを判断する。処理対象のチャネルに対応する半導体記憶素子58の有する物理ブロックの全てについて使用可能か否かを検査し終わった場合(ステップS65:YES)、半導体記憶装置50は、新たな処理対象のチャネルについて、ステップS60〜S67の処理を行う。そして、全てのチャネルについて、ステップS60〜S67の処理を行い終わった場合、半導体記憶装置50は、処理を終了する。この結果、物理ブロックテーブルにおいて、各チャネルに対応する半導体記憶素子58の有する全ての物理ブロックについて、その使用状態として使用可能か使用不可能かが記憶される。その後、以下に説明するように、使用可能な物理ブロックにデータが書き込まれた場合には、管理テーブル更新部65の機能により、当該物理ブロックの使用状態が「使用中」に更新される。
次に、以上のように構成された物理ブロックテーブルを参照して、ホストからのwriteコマンドに応じて半導体記憶装置50が半導体記憶素子58に書き込み対象データの書き込みを行う処理の手順について図9を用いて説明する。半導体記憶装置50は、ステップS1で、ホストからのwriteコマンドを受信すると、論理ブロック管理部71の機能により、物理ブロックテーブルを参照して、論理ブロックの構成に用いる物理ブロックのチャネルを決定する。このとき、各チャネルの使用状態情報において、使用可能であり且つフリーブロックである物理ブロックの数が全て「0」より大きい場合には、上述の基本的な構成と同様に、半導体記憶装置50は、チャネルCH0〜CH5の各物理ブロックを関連付けて論理ブロックを構成することと、チャネル番号のもっとも大きいチャネルCH5に冗長情報を書き込むこととを決定する。そして、半導体記憶装置50は、各半導体記憶装置50は、各チャネルにおいてフリーブロックを各々確保する。そして、半導体記憶装置50は、論理ブロックに対して論理ブロック番号を付与して、当該論理ブロック番号をインデックスとして、チャネル毎に確保した各フリーブロックである物理ブロックの物理アドレスと冗長情報を書き込むチャネルのチャネル番号とを論物変換テーブルに記録すると共に、物理ブロックテーブルの各チャネルの使用状態情報において、当該各物理ブロックの使用状態を「使用中」に更新し、使用可能であり且つフリーブロックである物理ブロックの数を1デクリメントして更新する。そして、半導体記憶装置50は、ステップS2〜S11の処理を行う。尚、ステップS8で、半導体記憶装置50は、各チャネルにおいて追記ポインタを更新するときに、書き込み対象データを書き込んだページが物理ブロックの最後尾のページである場合、物理ブロックテーブルを参照して、新たな論理ブロックを構成する。
このような書き込みの処理が何度も行われて、他のチャネルより先に、使用可能であり且つフリーブロックである物理ブロックの数が「0」になるチャネルが現れる。即ち、チャネルCH0〜CH5の各物理ブロックを関連付けて論理ブロックを構成するときに、使用可能なフリーブロックがないチャネルが現れる。半導体記憶装置50は、論理ブロックを構成する際に、物理ブロックテーブルを参照して、このように使用可能であり且つフリーブロックである物理ブロックの数が「0」になったチャネルがあった場合、当該チャネルを除くチャネルの各物理ブロックを関連付けて論理ブロックを構成することを決定する。例えば、図14の例で、使用可能な物理ブロックが最も少ないチャネルCH3に対応する半導体記憶素子58Dの有する使用可能なフリーブロックが「0」になった場合、当該チャネルCH3においてフリーブロックを確保することができなくなる。このため、ステップS1では、半導体記憶装置50は、チャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けて論理ブロックを構成することを決定することになる。チャネルCH3は除かれたが、除外されなかったチャネルのうちチャネル番号が最も大きいのはチャネルCH5であるので、チャネルCH5に冗長情報を書き込むことに決定する。また、このように論理ブロックを構成した場合、半導体記憶装置50は、図18に例示されるように、論理ブロック番号をインデックスとして、チャネルCH0〜CH2、CH4〜CH5毎に確保した各フリーブロックである物理ブロックの物理アドレスを論物変換テーブルに記録する。尚、同図に示されるように、半導体記憶装置50は、論理ブロックを構成する際に関連付けられなかったチャネルCH3の物理ブロックの物理アドレスを「−1」として論物変換テーブルに記録する。「−1」であることは、論理ブロックとして物理ブロックが用いられていないチャネルであることを示している。半導体記憶装置50は、データの復元を行う場合には、上述の基本的な構成と同様に、論物変換テーブルを参照して、論理ブロックに関連付けられた各チャネルの各物理ブロックからデータを読み出すが、図18に例示される物理アドレスが「−1」である物理ブロックからはデータを読み出す必要がないことを判断することができる。
そして、このように書き込みにより使用可能なフリーブロックがなくなったチャネルを除いて論理ブロックを構成する場合も、半導体記憶装置50は、ステップS1の後、ステップS2〜S11の処理を行う。但し、ステップS6では、図18の例においては、半導体記憶装置50は、チャネルCH3を除くチャネルCH0〜CH2,CH4のうち書き込み対象データを書き込むチャネルをラウンドロビンにより決定する。また、ステップS8では、半導体記憶装置50は、論理ブロックに関連付けられた各物理ブロックの物理アドレスと共に、各物理ブロックにおいて次に書き込み対象データを書き込むページを示す追記ポインタを、チャネルCH0〜CH2,CH4〜CH5について各々設定する。ステップS10では、半導体記憶装置50は、ビットベクタテーブルを参照して、チャネルCH0〜CH2,CH4〜CH5について、ステップS5でDRAM54に記憶させた古い物理アドレスのページに対応するビットベクタの値を「0」にし、当該ページの存在する物理ブロックが関連付けられた論理ブロックの有効ページ数カウンタの値を1デクリメントする。
ここで、チャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けて論理ブロックを構成した場合、複数の分割データがラウンドロビンによりCH0〜CH2,CH4の各物理ブロックに書き込まれる様子について図19を用いて説明する。尚、図19では、図7と同様に図の簡略化のため、分割データに対して付加された論理アドレスの図示を省略している。また、この論理ブロックでは、誤り訂正符号をCH5に書き込むこととする。図19に示されるように、時刻t1でチャネルCH0に対して分割データD1の書き込みが行われ、時刻t2でチャネルCH1に対して次の分割データD2の書き込みが行われる。そして、時刻t3でチャネルCH2に次の分割データD3が書き込まれると、次の時刻t4ではチャネルCH4に分割データD4が書き込まれる。そして、時刻t4でCH4に分割データD4が書き込まれるときに、分割データD1〜D4に対するパリティPが冗長情報として計算され、当該冗長情報Pの書き込みがチャネルCH5に対して行われる。更なる分割データの書き込みの際には、この論理ブロックに書き込んでいる限り、チャネルCH0から順に、チャネルCH3を除外しながらラウンドロビンで書き込みが行われる。尚、図19の例では、時刻の経過と共に各チャネルに順に書き込みを行う様子が図示されているが、これに限らず、2つ以上のチャネルに同時に書き込みを行うようにしても良い。
次に、チャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けて論理ブロックを構成した場合の誤り訂正符号の構成について図20を用いて説明する。なお図20では、図8と同様に図の簡略化のため、分割データに対して付加された論理アドレスの図示を省略している。また、この論理ブロックでは誤り訂正符号をCH5に書き込むこととする。図20に示されるように、チャネルCH0〜CH2,CH4の各書き込み対象データに対して、チャネルCH5に対応するNAND制御部66Fは、オフセットが等しい位置のバイト同士で排他的論理和を計算し、この値を冗長情報として、チャネルCH5の半導体記憶素子58Fにおいて上述のオフセットが等しい位置に書き込む。即ち、チャネルCH0〜CH2,CH4においてオフセットが等しい位置のバイト同士によって誤り訂正符号が構成される。
次に、ホストからのreadコマンドに応じて半導体記憶装置50が半導体記憶素子58からデータの読み出しを行う処理の手順について図11を用いて説明する。ここでは、図18に例示されるように、チャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けた論理ブロックに書き込まれたデータを読み出す場合を例に説明する。半導体記憶装置50は、上述の基本的な構成と同様に、ステップS20〜S23の処理を行うが、ステップS23では、論物変換テーブルを参照して、読み出しの対象のチャネルの物理ブロックとしてチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを特定する。図18に例示される論物変換テーブルでは、チャネルCH3の物理ブロックの物理アドレスに「−1」が記憶されているため、半導体記憶装置50は、チャネルCH3の物理ブロックが当該論理ブロックに関連付けられておらず、従って、当該チャネルCH3からの読み出しが必要ないことを判断することができる。その後、半導体記憶装置50は、ステップS24〜S28の処理を行うが、ステップS28では、特定した論理ブロックに関連付けられた他のチャネルの物理ブロックに書き込まれた他のデータ及び冗長情報を読み出すときに、チャネルCH3以外のチャネルから他のデータ及び冗長情報を読み出すことになる。なお、チャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けた論理ブロックにおいては、チャネルCH3の物理ブロックにはそもそも書き込みが行われていないので、ホストから受信されたreadコマンドによってチャネルCH3にデータの読み出しが要求されることはない。ステップS28では、当該他のデータ及び冗長情報を読み出した後、半導体記憶装置50は、これらを用いて、誤りがあったデータの復元を行う。
図21は、例として、図20に例示したチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けた論理ブロックにおいて、チャネルCH2の半導体記憶素子58に発生した故障により異常の発生したデータを復元する様子を示す図である。具体的には、半導体記憶装置50は、ステップS27で特定した論理ブロックに関連付けられた物理ブロックであって訂正できない誤りの生じたデータを読み出した物理ブロック以外の他のチャネルの物理ブロックに書き込まれた他のデータ及び冗長情報(ここでは、チャネルCH0,CH1,CH4に書き込まれた各データ及びチャネルCH5に書き込まれた冗長情報)を読み出す。そして、半導体記憶装置50は、当該各データ及び冗長情報において同じオフセットにおける排他的論理和、即ち、これらのバイト毎の排他的論理和を求めることにより、チャネルCH2におけるデータを復元する。そして、半導体記憶装置50は、復元したデータをデータバッファ67に記憶させ、ステップS29に進む。
尚、コンパクションの対象の論理ブロックに書き込まれている有効データをフリーブロックに移動する処理の手順について図13を用いて説明する。半導体記憶装置50は、上述の基本的な構成と同様に、ステップS40〜S49の処理を行うが、ステップS46で、コンパクションの候補を、図18に例示したチャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けた論理ブロックとした場合、ステップS47では、論物変換テーブルにおいて、当該論理ブロックに関連付けられたチャネルCH0〜CH2,CH4〜CH5の各物理ブロックについて、ビットベクタテーブルのビットベクタが「1」を示すページ(有効ページ)に記憶されているデータ(有効データ)を特定し、当該有効データをデータバッファ67に全て読み出す。即ち、図18に例示したチャネルCH3を除くチャネルCH0〜CH2,CH4〜CH5の各物理ブロックを関連付けた論理ブロックについては、論物変換テーブルにおいて、チャネルCH3の物理ブロックの物理アドレスに「−1」が記憶されているため、半導体記憶装置50は、半導体記憶装置50は、チャネルCH3の物理ブロックが当該論理ブロックに関連付けられておらず、従って、当該チャネルCH3からの読み出しが必要ないことを判断することができる。
以上の構成によれば、所定の数より小さい数のチャネルの各物理ブロックを関連付けて論理ブロックを構成することが可能になる。従って、図14のように半導体記憶装置50において各チャネルの使用可能な物理ブロック数にばらつきがあっても、構成できる論理ブロックの数を増やすことができる。このため、余裕容量の減少を抑えることができる。この結果、コンパクションを行う頻度を下げることができ、半導体記憶装置50の性能の低下を抑えることができる。
[変形例]
なお、本発明は前記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、前記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。また、以下に例示するような種々の変形が可能である。
上述した実施の形態において、半導体記憶装置50で実行される各種プログラムを、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また当該各種プログラムを、インストール可能な形式又は実行可能な形式のファイルでCD−ROM、フレキシブルディスク(FD)、CD−R、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録してコンピュータプログラムプロダクトとして提供するように構成しても良い。
上述した実施の形態において、プロセッサ51の機能の一部をハードウェアによって実現させるようにしても良い。また、半導体記憶装置50は、プロセッサ51を複数備え、複数のプロセッサ51により上述の機能が実現されるように構成しても良い。このような構成によれば、処理の高速化が図れる。
上述した実施の形態において、正引きテーブル及びビットベクタテーブルは、DRAM54に記憶されるようにしたが、これに限らず、例えば、半導体記憶素子58に記憶され、プロセッサ51がこれらのテーブルを使用する際にDRAM54にキャッシュするようにしても良い。
上述した実施の形態において、ページECCとしてはページ単位のデータ毎にECC符号を付加しているが、ページより小さな単位(例として512バイトのセクター単位)でECC符号を付加することも可能である。このような構成において、ページより小さな単位でデータの誤りが訂正できなかった場合は、当該データに異常が発生したとして、複数のチャネルにより構成された誤り訂正符号を用いて、当該データを復元すれば良い。
上述した実施の形態において、複数のチャネルで誤り訂正符号を構成する単位を、バイトとしたが、これに限らず、バイトよりも大きいサイズや小さいサイズを単位としても良い。また、誤り訂正符号として、パリティ符号を用いたが、これに限らず、冗長情報の数を複数とし、Reed Solomon符号を用いるようにしても良い。これにより、複数の半導体記憶素子58の故障などによって異常の発生したデータを復元することが可能になる。
上述した実施の形態において、データを書き込むチャネル数を4つとし、これらのデータに対する冗長情報を書き込むチャネル数を1つとして、誤り訂正符号を構成するチャネル数を5つとしたが、これに限らない。また、誤り訂正符号を構成する冗長情報を書き込むためのチャネルを、論理ブロックに関連付けられた物理ブロックの存在する半導体記憶素子58が接続されたチャネルの中で最もチャネル番号が大きいチャネルとしたが、これに限らず、誤り訂正符号を構成する単位毎にチャネルを変更するようにしても良い。
上述した実施の形態において、チャネルと半導体記憶素子58とは1対1対応させるようにしたが、これに限らず、チャネルと半導体記憶素子58とが1対多対応させる、即ち、1つのチャネルに対して複数の半導体記憶素子58が割り当てられるようにしても良い。この場合、各半導体記憶素子58にはこれらを識別するための識別番号を付与するようにする。論物変換テーブルには、チャネル毎の各ブロックについて、この識別番号及び物理アドレスを記録するようにする。例えば、各チャネルに8個の半導体記憶素子に割り当てられる場合、各半導体記憶素子を識別するのに3ビット、各半導体記憶素子に含まれる4096個のブロックを識別するのに12ビットで合計15ビットを、チャネル毎の各ブロックの識別番号及び物理アドレスとして論物変換テーブルに記録するようにする。
また、この場合、物理ブロックテーブルは、図22に例示されるように、チャネル毎に、チャネル番号と、チャネルに割り当てられた複数の各半導体記憶素子58を識別する識別番号(チップ番号)と、半導体記憶素子58において使用可能な物理ブロックの数と、半導体記憶素子58において使用可能であり且つフリーブロックである物理ブロックの数と、半導体記憶素子58における全ての物理ブロックのそれぞれについて使用状態とを示すように物理ブロックテーブルを構築すれば良い。尚、同図においては、チップ番号とチャネル番号とを別々のフィールドに分けて記録することが示されているが、当該各半導体記憶素子58を特定できるのであれば、半導体記憶素子58の通し番号などを使用することで一つのフィールドに記録するようにしても良い。また、物理ブロックテーブルを構築する処理では、図23に例示されるように、NAND状態管理部70は、各チャネルの複数の各半導体記憶素子58のそれぞれについて、ステップS60〜S67の処理を行うようにすれば良い。
上述した実施の形態において、論物変換テーブルの実装を簡単にするため、論物変換テーブルのエントリの数と、各チャネルにおける、当該チャネルに接続されている半導体記憶素子を構成する物理ブロックの総数を等しくすることが望ましい。論物変換テーブルのエントリ数と、チャネルCH0の物理ブロックの数が等しいので、ある論理ブロックのエントリが論物変換テーブルで記録される位置は、その論理ブロックに関連付けられたチャネルCH0の物理ブロックの物理ブロック番号で決定しておくようにすれば良い。物理ブロック番号とは、例えば、チャネルに接続された半導体記憶素子58を構成する各物理ブロックに対して昇順に付与されるものとする。この場合、論物変換テーブルのインデックスとなる論理ブロック番号は、当該論理ブロックに関連付けられたチャネルCH0の物理ブロックの物理ブロック番号にすれば良い。この他、論理物理変換テーブルのエントリをリスト構造で記録するようにしても良い。
また、論物変換テーブルにおいて論理ブロックに関連付けられた各チャネルの物理ブロックについて、物理アドレスを記録するようにしたが、これに限らず、物理ブロック番号を記録するようにしても良い。また、論物変換テーブルにおいては、チャネルCH0〜CH5のうち、論理ブロックに物理ブロックが関連付けられていないチャネルがあった場合、当該チャネルの物理ブロックの物理アドレスに「−1」を記録するようにしたが、これに限らない。
上述した実施の形態においては、物理ブロックテーブルの構成は、上述の例に限らない。
上述した実施の形態において、半導体記憶装置50は、半導体記憶素子58に書き込むデータに論理アドレスが付加するようにしたが、これを付加するのではなく、半導体記憶素子58に書き込まれたデータの物理アドレスをインデックスとして当該物理アドレスと、当該データの論理アドレスとの対応関係を示す物論変換テーブル(論物変換テーブルとは異なる)を更に備えるようにしても良い。そして、コンパクションの際に、半導体記憶装置50は、半導体記憶素子58から読み出した有効データの物理アドレスを用いて、物論変換テーブルを参照して、当該物理アドレスに対応する論理アドレスを取得し、これを用いて、コンパクションに伴う正引きテーブルの更新を行うようにすれば良い。
上述した実施の形態において、書き込み対象データに対してチャネルを割り当てる際、チャネルCH0〜CH3のうち少なくとも1つへの割り当て後、書き込み対象データがない状態が一定時間以上継続した場合、チャネルCH1〜CH4のうち書き込み対象データが割り当てられていないチャネルにおいて、該当のページにダミーデータ(例えば全てのビットが「0」のデータ)を書き込むことにして、チャネルCH1〜CH4において対応する各ページのデータを用いて計算した冗長情報を、チャネルCH5の対応するページを書き込むようにする。このような構成によれば、チャネルCH0〜CH4の各々対応するページのうち書き込みの既に済んでいるチャネルのデータについて、誤り訂正符号が構成されず、当該データに誤りがあった場合に復元できない恐れを回避することが可能になる。
上述した実施の形態において、NAND状態管理部70が半導体記憶素子58の状態を取得することは、半導体記憶装置50が記憶装置として実際に使用される前に行うのではなく、例えば、半導体記憶装置50の稼働中に定期的に行っても良いし、何かの出来事に連動して行っても良い。例えば、図1に例示されるプロセッサ1がタイマを内蔵し、そのタイマに適切な値をセットしておいて、半導体記憶素子58の状態を定期的に検査することが考えられる。この場合、NAND状態管理部70は、物理ブロックテーブルの使用状態情報において、使用状態として「使用可能」又は「使用中」と記憶されている物理ブロックについて、実際には使用不可能ではないかを検査すれば良い。物理ブロックの使用状態を検査する方法は上述と同様にNANDチップに定められた方法を用いれば良い。その結果、実際には使用不可能であることが判明した物理ブロックについては、NAND状態管理部70は、管理テーブル更新部65を介して、物理ブロックテーブルにおいて当該物理ブロックの使用状態が「使用不可能」であることを示すよう使用状態情報を更新すれば良い。
また例えば、NAND制御部66が、半導体記憶素子58の物理ブロックへの書き込みや消去に失敗した場合、さらには読み出し時のページECCによる訂正に失敗した場合に、その旨をNAND制御部66からNAND状態管理部70に通知することで、NAND状態管理部70は、半導体記憶素子58もしくは物理ブロックの状態変化に応じて半導体記憶素子58の状態を取得することが考えられる。この場合、NAND状態管理部70は、書き込みや消去やページECCによる訂正に失敗した物理ブロックが実際に使用不可能ではないかを検査する。その結果、当該物理ブロックについて実際には使用不可能であることが判明した場合、NAND状態管理部70は、管理テーブル更新部65を介して、物理ブロックテーブルにおいて当該物理ブロックの使用状態が「使用不可能」であることを示すよう使用状態情報を更新すれば良い。
なおいずれの検査においても、検査の結果物理ブロックが使用不可能であると判明した時点では、当該物理ブロックに有効なデータが記憶されている可能性がある。その場合、半導体記憶装置50は、当該物理ブロックが関連付けられた論理ブロックに対してコンパクションを行うようにすれば良い。これにより、当該物理ブロックに記憶されている有効データが他の論理ブロックに移動されるからである。
上述した実施の形態において、半導体記憶装置50は、ホストからwriteコマンドが受信されて、データの書き込みを行う場合に、論理ブロックを構成するようにした。しかし、これに限らず、論理ブロックの構成を、例えば、半導体記憶装置50が記憶装置として実際に使用される前に準備として行うようにしても良い。この場合、物理ブロックテールが構築された後に、論理ブロック管理部71が、物理ブロックテーブルを参照して、論理ブロックを構成し、管理テーブル更新部65を介して、当該論理ブロックに関連付けられた各チャネルの各物理ブロックを示す情報を論物変換テーブルに記録する。
上述した実施の形態において、所定の数のチャネルから使用可能な物理ブロックを取得して関連付けて論理ブロックを構成し、あるチャネルに対応する半導体記憶素子58の有する物理ブロックのうち使用可能であり且つ書き込みが行われていない物理ブロックの数が「0」になって初めて、所定の数より小さい数のチャネルの各物理ブロックを関連づけて論理ブロックを構成するようにした。しかし、これに限らず、例えば、使用可能な物理ブロックの数に応じて、間欠的に、所定の数より小さい数のチャネルの各物理ブロックを関連付けて論理ブロックを構成するようにしても良い。即ち、半導体記憶装置50は、使用可能な物理ブロックの数に応じて、所定の数のチャネルの各物理ブロックを関連付けて論理ブロックを構成することと、所定の数より小さい数のチャネルの各物理ブロックを関連付けて論理ブロックを構成することとを選択的に行うようにしても良い。具体的には例えば、半導体記憶装置50が記憶装置として実際に使用される前に物理ブロックテーブルを構築した際に、あるチャネルに対応する半導体記憶素子58の使用可能な物理ブロックの最大数が、当該半導体記憶素子58の有する物理ブロックの総数の3分の1以上2分の1未満だった場合には、論理ブロックを構成する際に3回に1回は当該チャネルの物理ブロックを関連付けず、最大数が総数の3分の2以上である場合、論理ブロックを構成する際に当該チャネルの物理ブロックを常に関連付け、最大数が総数の5分の1以上3分の1未満である場合は、論理ブロックを構成する際に2回に1回は当該チャネルの物理ブロックを関連付けないようにする。このように、物理ブロックを関連付けチャネルを選択する頻度は、使用可能な物理ブロックの数の増減に合わせて増減させるべきである。なぜなら半導体記憶装置50が使用されていくうちに半導体記憶素子58の疲弊によって使用可能な物理ブロックの数が減っていくからである。例えば、半導体記憶装置50の各チャネルの使用可能な物理ブロックの数のバランスを見て、使用可能な物理ブロックの数が最も少ないチャネルからは2回に1回物理ブロックを関連付けずに論理ブロックを構成するといった方法を併用して、論理ブロックを可能な限り多く構成できるようにすべきである。
上述した実施の形態において、論理ブロックを構成する際に、物理ブロックを関連付けないチャネルの数を調整するようにしても良い。例えば、上述したようにチャネルが6つある半導体記憶装置50において、全チャネルにおいて各々物理ブロックを関連付ける場合、冗長情報のために1チャネル使用しても冗長情報の割合は、書き込み対象データの5チャネルに対して1チャネルで済む。しかし、物理ブロックを関連付けないチャネルが3つ存在する論理ブロックで冗長情報のために1チャネル使用してしまうと、書き込み対象データを書き込むチャネルは2チャネルのみとなり、冗長情報を書き込むためのチャネルの相対的な割合が増えてしまう。これは、冗長情報の書き込みが半導体記憶装置50に与える影響が大きいことを示している。
従って、論理ブロック管理部71は、論理ブロックに関連付ける物理ブロックのチャネル数を決定する際に、半導体記憶装置50の性能や、半導体記憶装置50において割り当てられたチャネルの総数や、半導体記憶装置50において割り当てられた各チャネルに対応する半導体記憶素子58の使用可能な物理ブロックの数のばらつきなどを用いて、物理ブロックを関連付けないチャネルの数を調整する。例えば、論理ブロック管理部71が、物理ブロックテーブルを参照して、半導体記憶装置50において割り当てられた各チャネルに対応する半導体記憶素子58の使用可能な物理ブロックの数を検査した結果、ある2つのチャネルの使用可能な物理ブロックの数が他のチャネルに比べて大きく減少していた場合には、物理ブロックを関連付けないチャネルを2つまで許す、といった形で、物理ブロックを用いないチャネルの数を調整する。この場合、論理ブロック管理部71は、論理ブロックに関連付ける物理ブロックのチャネルの数の下限を4つに調整する。そして、論理ブロック管理部71は、4つ以上6つ以下のチャネルに接続された半導体記憶素子58を構成する各物理ブロックを関連付けて論理ブロックを構成する。即ち、この場合、冗長情報の計算に使う書込み対象データの数の下限を3つとして、論理ブロック管理部71は、3つ以上5つ以下の書込み対象データを書き込む対象のチャネルを各々決定し、決定した各チャネルの各物理ブロック及び冗長情報を書き込むためのチャネルの物理ブロックを関連付けて論理ブロックを構成する。
このような構成によれば、物理ブロックを論理ブロックに関連付けないことによりチャネルの使用効率が下がって、冗長情報の相対的な割合が増えてしまい、半導体記憶素子58の使用効率が下がる、ということを防ぐことができる。
上述した実施の形態においては、半導体記憶装置50は、論理ブロックを構成する際に、物理ブロックを関連付けないチャネルを論理ブロック毎に分散させるようにしても良い。特定のチャネルばかり物理ブロックを関連付けずに論理ブロックを構成していると、当該チャネルの使用効率が落ちるだけでなく、他のチャネルの負荷が増え、半導体記憶装置50としての信頼性が落ちてしまう恐れがある。このような事態を避けるために、論理ブロック管理部71は、例えば、あるチャネルの物理ブロックを関連付けずに論理ブロックを構成した後、次に新たな論理ブロックを構成する際、当該チャネル以外のチャネルで物理ブロックを関連付けずに新たな論理ブロックを構成するようにする。このように、半導体記憶装置50において割り当てられた全チャネルのうち、物理ブロックを関連付けないチャネルを論理ブロック毎に分散させることによって、半導体記憶装置50において割り当てられた全チャネルの使用効率が同程度となり、信頼性も維持することができる。
上述した実施の形態において、論理ブロック管理部71が論理ブロックを構成する際に、物理ブロックテーブルの使用可能な物理ブロックの数を参照して、物理ブロックを関連付けるチャネルを決定したが、物理ブロックを関連付けることが可能なチャネルが1つ以下になってしまうことも考えられる。さらに、半導体記憶装置50として満足な性能を提供するために、論理ブロックの他に、最低限必要な使用可能な物理ブロックの数という閾値が存在すると考えられる。このような場合、論理ブロック管理部71は、新しい論理ブロックを構成できなくなる。この場合、論理ブロック管理部71は、半導体記憶装置50の動作を停止させれば良い。半導体記憶装置50の動作を止めるには、例えば、図1に示されるプロセッサ51が半導体記憶装置50全体の制御のために実行しているプログラムに対して論理ブロックが構成できなかったことを論理ブロック管理部71から通知して、動作の停止を要求すれば良い。尚、上述の変形例で説明したように、半導体記憶装置50が記憶装置として実際に使用される前に論理ブロックを構成する場合には、論理ブロック管理部71は、新しい論理ブロックを構成できなくなった時点で、論理ブロックを構成する処理を終了すれば良い。