"不揮発性記憶システム内の1組の記憶素子をプログラムするための方法であって、書き込みデータに基づいて、消去状態に保たれる組300の第1の部分集合内の記憶素子と関連付けられたデータラッチ194~197内、およびそれぞれの目標データ状態A、B、Cにプログラムされる組の第2の部分集合内の記憶素子と関連付けられたデータラッチ内のデータを構成するステップと、前記第2の部分集合内の前記記憶素子をプログラムしている間、前記第1の部分集合内の前記記憶素子を禁止し、前記プログラミング中、前記第2の部分集合内の前記記憶素子の進捗に基づいて前記第2の部分集合内の前記記憶素子の前記関連付けられたデータラッチを更新するステップと、それぞれの目標データ状態に達していない記憶素子数が前記第2の部分集合内の記憶素子の最大数THRESHOLDに満たず、その結果、前記第2の部分集合内の前記記憶素子の前記プログラミングが正常に完了したとみなされると判断するステップと、前記第2の部分集合内の前記記憶素子の前記プログラミングの前記正常な完了を受けて、前記消去状態と前記目標データ状態の隣接する状態とを区別する前記第1の部分集合内の前記記憶素子に対して読み出し動作を実行することにより、エラーを有する前記第1の部分集合内の記憶素子の数を判断するステップと、を備える方法。エラーを有する前記第1の部分集合内の前記記憶素子の数が十分に多い場合に、前記書き込みデータを復旧させるために復旧動作を実行するステップを備え、前記復旧動作が、各目標データ状態を区別する前記第2の部分集合内の前記記憶素子に対して追加読み出し動作を実行する、請求項1に記載の方法。前記第2の部分集合内の前記記憶素子が、前記隣接する状態である第1の目標データ状態Aと、前記第1の目標データ状態に隣接する第2の目標データ状態Bと、前記第2の目標データ状態に隣接する第3の目標データ状態Cとを含む、少なくとも3つの目標データ状態にプログラムされ、前記追加読み出し動作が、前記第2の目標データ状態と前記第3の目標データ状態とを区別し、その後前記第1の目標データ状態と前記第2の目標データ状態とを区別する、請求項2に記載の方法。プログラミングを正常に完了した前記第2の部分集合内の各記憶素子が、自身の関連付けられたデータラッチのうちの1つに第1の値を有しており、前記第1の部分集合内の各記憶素子が、自身の関連付けられたデータラッチのうちの1つにおける前記第1の値とは異なる値によって特定され、前記エラーを有する前記第1の部分集合内の前記記憶素子の数を判断する前記ステップが、前記第1の部分集合内の各記憶素子の前記関連付けられたデータラッチと前記読み出し動作の結果のうちの一方を使用して論理演算を実行することを含む、請求項1~3のいずれか一項に記載の方法。各記憶素子と関連付けられた前記データラッチが、第1のデータラッチQDLと、第2のデータラッチUDLと、第3のデータラッチLDLとを含み、前記プログラミングが、前記第2の部分集合内の前記記憶素子のうちの少なくとも一部をオフセット検証レベルおよび目標検証レベルと照合して、前記目標データ状態のうちの少なくとも1つが存在するかどうかを検証することを含み、前記オフセット検証レベルおよび前記目標検証レベルと照合して、前記目標データ状態のうちの前記少なくとも1つが存在するかどうかが検証される前記第2の部分集合内の前記記憶素子の各々について、前記第1のデータラッチQDLが、前記記憶素子が前記オフセット検証レベルに達したかどうかを示し、前記第2のデータラッチUDLが上位ページデータを提供し、前記第3のデータラッチLDLが下位ページデータを提供し、前記第1の部分集合内の前記記憶素子の各々について、前記第1のデータラッチが、プログラミングを正常に完了した前記第2の部分集合内の前記記憶素子の前記第1のデータラッチ内の値とは異なる値を有し、前記エラーを有する前記第1の部分集合内の前記記憶素子の数を判断する前記ステップが、前記第1の部分集合内の前記記憶素子の前記第1のデータラッチと前記読み出し動作の結果とを使用して論理演算を実行することを含む、請求項1~4のいずれか一項に記載の方法。自身のそれぞれの目標データ状態に達していない記憶素子数が前記第2の部分集合内の前記記憶素子の前記最大数に満たないと判断する前記ステップが、前記第2の部分集合内の前記記憶素子の各々に対し、前記データラッチを使用して論理演算を実行することを含む、請求項1~5のいずれか一項に記載の方法。前記エラーを有する前記第1の部分集合内の前記記憶素子の数を判断する前記ステップが、前記目標データ状態うちの少なくとも1つの中に存在するものとして読み出される前記第1の部分集合内の前記記憶素子の数を判断するステップを含む、請求項1~6のいずれか一項に記載の方法。前記エラーを有する前記第1の部分集合内の前記記憶素子の数を判断する前記ステップが、前記読み出し動作が前記第1の部分集合内の各記憶素子にコントロールゲート電圧を印加するときに非導電性である前記第1の部分集合内の前記記憶素子の数を判断するステップを含み、前記コントロールゲート電圧が、前記消去状態と前記目標データ状態の前記隣接する状態とを区別するレベルで印加される、請求項1~7のいずれか一項に記載の方法。前記第2の部分集合内の前記記憶素子が、少なくとも2ページのデータでプログラムされる、請求項1~8のいずれか一項に記載の方法。消去状態に保たれる組の第1の部分集合内の記憶素子と、それぞれの目標データ状態にプログラムされる前記組の第2の部分集合の記憶素子とを含む、1組の不揮発性記憶素子300と、各記憶素子と関連付けられたデータラッチ194~197と、a書き込みデータに基づいて、前記第1の部分集合内の前記記憶素子と関連付けられた前記データラッチ内、および前記第2の部分集合内の前記記憶素子と関連付けられた前記データラッチ内でデータを構成し、b前記第1の部分集合内の前記記憶素子を禁止し、前記第2の部分集合内の前記記憶素子をプログラムし、プログラムされたときに前記第2の部分集合内の前記記憶素子の進捗に基づいて、前記第2の部分集合内の前記記憶素子の前記関連付けられたデータラッチを更新し、c自身のそれぞれの目標データ状態に達していない記憶素子が前記第2の部分集合内の前記記憶素子の最大数に満たず、その結果、前記第2の部分集合内の前記記憶素子の前記プログラミングが正常に完了したとみなされると判断し、d前記第2の部分集合内の前記記憶素子の前記プログラミングの前記正常な完了を受けて、前記最初の消去状態と、前記目標データ状態の隣接する状態とを区別する前記第1の部分集合内の前記記憶素子に対して読み出し動作を実行することにより、エラーを有する前記第1の部分集合内の記憶素子の数を判断する、少なくとも1つの制御回路192と、を備える不揮発性記憶システム。エラーを有する前記第1の部分集合内の前記記憶素子の前記数が十分に高い場合に、前記少なくとも1つの制御回路が前記書き込みデータを復旧させるために復旧動作を実行し、前記復旧動作が、各目標データ状態を区別する前記第2の部分集合内の前記記憶素子に対して追加読み出し動作を実行する、請求項10に記載の不揮発性記憶システム。プログラミングを正常に完了した前記第2の部分集合内の各記憶素子が、自身の関連付けられたデータラッチのうちの1つに第1の値を有しており、前記第1の部分集合内の前記記憶素子の各々が、自身の関連付けられたデータラッチのうちの1つにおける前記第1の値とは異なる値によって特定され、前記少なくとも1つの制御回路が、前記第1の部分集合内の前記記憶素子を特定するために、前記第1の部分集合内の各記憶素子の前記関連付けられたデータラッチと前記読み出し動作の結果のうちの前記一方を使用して論理演算を実行する、請求項10または11に記載の不揮発性記憶システム。各記憶素子と関連付けられた前記データラッチが、第1のデータラッチQDLと、第2のデータラッチUDLと、第3のデータラッチLDLとを含み、前記第2の部分集合内の前記記憶素子をプログラムするために、前記少なくとも1つの制御回路が、前記第2の部分集合内の前記記憶素子のうちの少なくとも一部をオフセット検証レベルおよび目標検証レベルと照合して、前記目標データ状態のうちの少なくとも1つが存在するかどうかを検証し、前記オフセット検証レベルおよび前記目標検証レベルと照合して、前記目標データ状態のうちの前記少なくとも1つが存在するかどうかが検証される前記第2の部分集合内の前記記憶素子の各々について、前記第1のデータラッチが、前記記憶素子が前記オフセット検証レベルに達したかどうかを示し、前記第2のデータラッチが上位ページデータを提供し、前記第3のデータラッチが下位ページデータを提供し、前記第1の部分集合内の前記記憶素子の各々について、前記第1のデータラッチが、プログラミングを正常に完了した前記第2の部分集合内の前記記憶素子の前記第1のデータラッチ内の値とは異なる値を有し、かつ、前記少なくとも1つの制御回路が、前記第1の部分集合内の前記記憶素子を特定するために、第1のデータラッチを使用して論理演算を実行する、請求項10~12のいずれか一項に記載の不揮発性記憶システム。前記少なくとも1つの制御回路が、目標データ状態に達していない記憶素子数が前記第2の部分集合内の前記記憶素子の前記最大数に満たないことを検証するために、前記第2の部分集合内の前記記憶素子の各々に対し、前記データラッチを使用して論理演算を実行する、請求項10~13のいずれか一項に記載の不揮発性記憶システム。前記少なくとも1つの制御回路が、前記エラーを有する前記第1の部分集合内の前記記憶素子の前記数を判断するために、前記目標データ状態のうちの少なくとも1つの中に存在するものとして読み出される前記第1の部分集合内の前記記憶素子の数を判断する、請求項10~14のいずれか一項に記載の不揮発性記憶システム。最も重要なのは、データを正確にプログラムし、メモリから読み戻せることである。しかし、様々な失敗パターンがあり、データの破損を招くことがある。エラー検出およびデータ復旧を提供する方法および不揮発性記憶システムが提供される。プログラミング動作中に、いくつかの要因でデータが破損することがある。例えば、製造工程の違いにより、ワードラインまたはブロックに物理的欠陥が存在することがある。場合によっては、ワードラインが基板に短絡し、そのためにブーストが影響を受け、プログラム外乱が発生する。他の潜在的課題は、ワードライン間での短絡、様々なワードライン幅、ブロックの過剰循環、温度関連の影響などを含む。さらに、データの破損が検出されず、手遅れになってデータを復旧できなくなることもある。例えば、書き込みデータに基づき、一部の記憶素子が消去状態のままであるべきなのに対し、他の記憶素子は目標データ状態にプログラムされる。このような場合には、他の記憶素子のプログラミング時に、消去状態の記憶素子が妨害されることがある。同じページデータまたは別のページデータをプログラムするなどの目的で、同じまたは異なるワードライン上で他の記憶素子に対するプログラミングが続行する場合に、消去状態より上の、目標データ状態にプログラムされる記憶素子が妨害されることもある。データの破損を検出する1つの手法は、全てのデータがプログラムされた後にそれらのデータを読み戻し、元の書き込みデータと比較することである。しかしこの手法は、相当の時間損失を課すことに加え、予備データラッチなど追加記憶リソースを必要とする。1つの対応策として、既存のデータラッチを活用して、消去状態などのエラーが発生しやすい特定のデータ状態に対して破損データを検出する手法が考えられる。この手法では、1組の記憶素子のプログラミングが完了したときに、消去状態を他の状態と区別できるように、データラッチが構成される。プログラミング動作が正常に完了した後に1回の読み出し動作を実行し、データラッチにアクセスし、論理演算を実行することにより、破損した記憶素子を特定することができる。破損した記憶素子の数がECC回収可能エラーの数などの閾値を上回る場合には、復旧動作を実行することができる。読み出し結果とデータラッチとに基づき、復旧動作によって追加読み出し動作および論理演算が実行され、書き込みデータを完全に復旧させる。次に、より高速のプログラミングおよび電力消費の節減を可能にするために使用されうるメモリシステムの一例を説明する。図1は、1つの行/列デコーダと読み出し/書き込み回路とを利用する不揮発性記憶システムのブロック図である。図は、一実施例について、1ページの記憶素子を並列に読み出し又はプログラムするための読み出し/書き込み回路を有するメモリデバイス197を示す。メモリデバイス197は、1つ以上のメモリダイ198を含んでいてもよい。メモリダイ198は、記憶素子155の2次元メモリアレイと、制御回路110、及び、読み出し/書き込み回路165を含む。メモリアレイ155については図4と関連付けてさらに説明する。一実施形態では、記憶素子のアレイは、3次元であってもよい。メモリアレイ155は、行デコーダ130を介したワードラインと、列デコーダ160を介したビットラインによってアドレス指定可能である。読み出し/書き込み回路165は、複数のセンスブロック100を含んでおり、1ページの記憶素子を並列に読み出し又はプログラムすることを許容する。典型的には、コントローラ150は、1つ以上のメモリダイ198のような同じメモリデバイス197例えば、取り外し可能なストレージカード内に含まれる。命令及びデータは、ライン120を介して、ホストとコントローラ150の間で転送され、また、ライン118を介して、コントローラと1つ以上のメモリダイ198の間で転送される。制御回路110は、読み出し/書き込み回路165と協調して、メモリアレイ155に対してメモリ動作を実行する。制御回路110は、ステートマシン112、オンチップアドレスデコーダ114、及び電力制御モジュール116を含む。ステートマシン112は、メモリ動作のチップレベルの制御を提供する。オンチップアドレスデコーダ114は、ホスト又はメモリコントローラによって用いられるアドレスと、デコーダ130,160によって用いられるハードウェアアドレスとの間にアドレスインタフェースを提供する。電力制御モジュール116は、メモリ動作中のワードライン及びビットラインに供給される電力及び電圧を制御する。いくつかの実施態様では、図1の構成要素の一部が結合されうる。様々な設計で、メモリアレイ155以外の構成要素のうちの1つまたは複数単独あるいは組合せが、管理または制御回路として考えられうる。たとえば、1つまたは複数の制御回路は、制御回路110、ステートマシン112、デコーダ114/160、電力制御116、センスブロック100図2のプロセッサ192を含む、読み出し/書き込み回路165、コントローラ150などのいずれか1つまたは組合せを含みうる。センスブロック100は図2と関連付けてさらに説明する。別の実施形態において、不揮発性メモリシステムは、2つの行/列デコーダおよび読み出し/書き込み回路が使用される。様々な周辺回路によるメモリアレイ155へのアクセスは、アレイの反対側で対称的に実施され、したがって、アクセス線の密度および各辺の回路は半減される。そのため、行デコーダは2つの行デコーダに分割され、列デコーダは2つの列デコーダに分割される。同様に、読み出し/書き込み回路は、最下部からビットラインに接続する読み出し/書き込み回路と、アレイ155の最上部からビットラインに接続する読み出し/書き込み回路とに分割される。このようにして、読み出し/書き込みモジュールの密度は本質的に半分減少する。図2は、センスブロックの一実施形態を示すブロック図である。個々のセンスブロック100は、センスモジュール180またはセンスアンプと呼ばれる1つ以上のコア部分と、管理回路190と呼ばれる共通部分とに区分けされる。一実施形態では、ビットラインごとに別々のセンスモジュール180が備えられており、1組の複数の、例えば4つまたは8つの、センスモジュール180につき1つの共通管理回路190が備えられている。グループ内のセンスモジュールの各々は、データバス172を介して、関連付けられた管理回路と通信する。そのため、1組の記憶素子のセンスモジュールと通信する1つ以上の管理回路が存在する。センスモジュール180は、接続されたビットライン内の伝導電流が予め決められた閾値レベルより高いか低いかを判断することによって検知を実行するセンス回路170を備えている。センスモジュール180は、さらに、接続されたビットラインに電圧状態を設定するために用いられるビットラインラッチ182を含む。例えば、ビットラインラッチ182内で予め決められた状態がラッチされることによって、接続されたビットラインを、プログラム禁止を指定する状態例えば、1.5~3Vに引き上げるプルする。例えば、flag=0がプログラミングを禁止できるのに対し、flag=1はプログラミングを禁止しない。管理回路190は、プロセッサ192と、データラッチ194~197の4組の例と、データラッチの組194とデータバス120との間を連結するI/Oインタフェース196とを備えている。センスモジュールごとに1組のデータラッチを設けることができ、QDL、UDLおよびLDLによって特定される3つのデータラッチを組ごとに設けることができる。データラッチの使用については、特に図8a~図8f、図9、図10および図11a~図11cを参照しながら、以下でさらに詳述する。プロセッサ192は、検知された記憶素子に記憶されているデータを判断し、判断されたデータをデータラッチの組内に記憶するなどの目的で計算を実行する。データラッチ194~197の各組は、読み出し動作時にプロセッサ192によって判断されたデータビット群を記憶する目的、および、プログラム動作時にデータバス120から取り込んだデータビット群を記憶する目的で使用され、取り込まれるデータビット群は、メモリ内にプログラムされる予定の書き込みデータを表す。I/Oインタフェース196は、データラッチ194~197とデータバス120との間のインタフェースを提供する。読み出し中には、システムの動作は、ステートマシン112の制御下にあり、ステートマシン112は、アドレス指定された記憶素子への種々のコントロールゲート電圧の供給を制御する。メモリに用意された様々なメモリ状態に対応する様々な既定コントロールゲート電圧のステップを進む毎に、センスモジュール180は、これらの電圧の1つに遷移し、バス172を介して、センスモジュール180からプロセッサ192に対応する出力が提供される。その時点で、プロセッサ192は、センスモジュールの遷移イベントと、ステートマシンから入力ライン193を介して加えられたコントロールゲート電圧についての情報によって、結果としてのメモリ状態を特定する。それから、プロセッサは、メモリ状態に対するバイナリ符号化を計算し、得られたデータビット群をデータラッチ194~197に格納する。管理回路190の別の実施形態では、ビットラインラッチ182は、センスモジュール180の出力をラッチするラッチ、及び、上記のようなビットラインラッチの二つの役割を持つ。いくつかの実装形態では、複数のプロセッサ192を含むことができる。一実施形態では、各プロセッサ192は、出力ライン図示省略を含み、各出力ラインは、ワイヤードOR配線論理和接続される。いくつかの実施形態では、出力ラインは、ワイヤードORラインに接続される前段階で反転される。この構成は、ワイヤードORを受け取るステートマシンが、プログラムされる全てのビットがいつ所望のレベルに到達したかを判断できるので、プログラム処理の完了時点を判定するプログラム検証処理における素早い判定を可能にする。例えば、各ビットがその所望のレベルに到達すると、そのビット用の論理0がワイヤードORラインに送られる又はデータ1が反転される。全てのビットがデータ0を出力すると又はデータ1が反転されると、ステートマシンは、プログラミング処理の完了を知る。各プロセッサが8個のセンスモジュールと通信する実施形態では、ステートマシンは、ワイヤードORラインを8回読み出す必要があり、あるいは、協働するビットラインの結果を蓄積するための論理をプロセッサ192に追加し、ステートマシンがワイヤードORラインを一度だけ読み出せば良いようにする。同様に、論理レベルを正しく選択することによって、第1ビットの状態が変化し、それに従ってアルゴリズムが変化する際に、グローバルステートマシーンは、検出し得る。プログラム動作又は検証動作の間、プログラムされるべきデータ書き込みデータは、データバス120から複数のデータラッチ194~197内に記憶される。ステートマシン制御下のプログラム処理は、アドレス指定される記憶素子のコントロールゲートに加えられる、一連のプログラミング電圧パルスを伴う。各プログラミングパルスに続いて、復唱検証によって、記憶素子が所望の状態にプログラムされたかどうかを判定する。いくつかの場合では、プロセッサ192は、所望のメモリ状態に対する復唱メモリ状態を監視する。その2つが一致したとき、プロセッサ192は、プログラム禁止を指定する状態にビットラインを引き上げるように、ビットラインラッチ182を設定する。これにより、たとえプログラミングパルスがそのコントロールゲートに影響しても、ビットラインに接続した記憶素子がさらにプログラミングされないようにすることができる。他の実施形態では、プロセッサが最初にビットラインラッチ182をロードし、センス回路が検証処理中にそれに禁止値を設定する。データラッチ194~197の各組は、各センスモジュールのデータラッチのスタックとして実装されてもよい。一実施形態では、センスモジュール180毎に3個データラッチが存在する。いくつかの実装形態では、データラッチは、シフトレジスタとして実装され、内部に記憶されたパラレルデータをデータバス120用にシリアルデータに変換したり、その逆を行ったりする。m個の記憶素子の読み出し/書き込みブロックに対応する全てのデータラッチを相互にリンクしてブロックシフトレジスタを構成し、シリアル転送によって、データのブロックを入力または出力できるようにする。特に、読み出し/書き込みモジュールの一群のデータラッチのそれぞれが、データバスへ或いはデータバスからデータを順に転送するように読み出し/書き込みモジュールのバンクを構成し、一群のデータラッチがあたかも読み出し/書き込みブロック全体のシフトレジスタの一部であるかのようにしてもよい。データラッチは、関連付けられた記憶素子がプログラミング動作中に特定の管理点に達した時期を特定する。例えば、ラッチは、記憶素子のVthが、高速プログラミングモードで下位検証レベル例えば、図5におけるVvaLもしくはVvbL未満であるか、低速プログラミングモードで下位検証レベル例えば、VvaLもしくはVvbL超であるが上位検証レベルもしくは目標検証レベル例えば、Vva、VvbもしくはVvc未満であるか、または禁止モードで上位検証レベルもしくは目標検証レベル超であることを識別してもよい。データラッチは、記憶素子がページデータからの1つ以上のビットを現在記憶しているかどうかを示す。例えば、LDLラッチは、下位ページのデータを記憶する目的で使用することができる。LDLラッチは、関連付けられた記憶素子に下位ページビットが記憶されるときに、例えば0から1へと反転される。UDLラッチは、例えば、上位ページのデータを記憶する目的で使用することができる。UDLラッチは、関連付けられた記憶素子に上位ページビットが記憶されるときに反転される。反転は、関連付けられた記憶素子がプログラミングを完了するとき、例えば、記憶素子のVthがVva、VvbまたはVvcなどの目標検証レベルを超えるときに行われる。QDLラッチは、関連付けられた記憶素子が低速プログラミングモードにあるときに反転され得る。一部の検出方式では、記憶素子のいずれかが一旦ロックアウトされると、その記憶素子を対象とする全てのデータラッチQDL、LDL、UDLが1に設定される。ただし、これだと、様々なデータ状態でロックアウトされた記憶素子を区別することができない。例えば、E状態記憶素子を、A、BまたはC状態記憶素子と区別することができない。以下でさらに詳述するとおり、データラッチは、この課題を克服し、それによって効率的なエラー検出および復旧動作を実施するための最適な方法で使用することができる。図3は、図1のメモリアレイ155におけるNANDフラッシュメモリセルのブロックを示す。メモリアレイは多数のブロックを含むことができる。各ブロック例300、310は、多数のNANDストリングと、ブロックで共有されるBL0、BL1、...といったそれぞれのビットラインとを含む。各NANDストリングは、一端でドレイン選択ゲートSGDに接続されており、ドレイン選択ゲートのコントロールゲートは、共通のSGDラインを介して接続されている。NANDストリングは、他端でソース選択ゲートに接続されており、ひいては、共通ソースライン320に接続されている。ソース選択ゲートとドレイン選択ゲートとの間には、WL0~WL63など、64本のワードラインが延在している。NANDフラッシュメモリに加え、他のタイプの不揮発性メモリを使用することもできる。たとえば、フラッシュEEPROMシステムで有用な別のタイプのメモリセルは、導電性のフローティングゲートの代わりに非導電性の誘電素材を利用して不揮発的に電荷を蓄積する。導電性のコントロールゲートと、メモリセルチャネルの上方にある半導体基板の表面との間に、酸化ケイ素、窒化ケイ素および酸化ケイ素ONOで形成された3重の層誘電体が挟まれている。このセルは、セルチャネルから窒化物に電子を注入することによってプログラムされ、注入された電子は、限られた領域内で捕捉され、蓄積される。この蓄積された電荷はその後、検出可能な方法でセルのチャネルの一部分の閾値電圧を変える。このセルは、窒化物にホットホールを注入することによって消去される。ドープ処理したポリシリコンゲートが別々のセレクトトランジスタを形成するためにメモリセルチャネルの一部分を超えて延伸するスプリットゲート構成で同様のセルを設けることができる。別のアプローチでは、NROMセルが使用される。たとえば、各NROMセルに2ビットが蓄積され、そこでONO誘電体層がソース拡散領域とドレイン拡散領域との間のチャネル全体に延伸する。一方のデータビットの電荷は、ドレインに隣接する誘電体層に限局され、もう一方のデータビットの電荷はソースに隣接する誘電体層に限局される。誘電体内で空間的に分離された電荷蓄積領域のバイナリ状態を別々に読み込むことにより、マルチステートのデータ記憶が得られる。他のタイプの不揮発性メモリも公知である。図4は、閾値電圧区分と、ワンパスプログラミングの一例を示す。記憶素子アレイの例示の閾値電圧区分は、各記憶素子が2ビットのデータを記憶するケースに対して提供されている。第1の閾値電圧区分400は、消去されたE状態記憶素子に対して提供される。3つの閾値電圧区分402、404及び406は、プログラミングされた状態A,B及びCで、それぞれ示されている。一実施形態では、E状態区分の閾値電圧は負であり、A状態、B状態及びC状態区分の閾値電圧は正である。特定の状態にある記憶素子の個数は、閾値電圧が、対応する検証レベルを超えると判断される記憶素子の計数を維持することによって判断される。それぞれの閾値電圧範囲は、データビットのセットの所定値に対応する。記憶素子にプログラミングされたデータと記憶素子の閾値電圧レベルの特定の関係は、記憶素子のために採用されるデータ符号化方式に依存する。一実施形態では、フローティングゲートの閾値電圧が誤ってその近傍の物理状態にシフトした場合に1ビットだけが影響を受けるように、データ値がグレーコード割り当てを使用して閾値電圧範囲に割り当てられる。一例は、閾値電圧範囲E状態Eに11を、閾値電圧範囲A状態Aに10を、閾値電圧範囲B状態Bに00を、及び閾値電圧範囲C状態Cに01を割り当てる。しかしながら、他の実施形態では、グレーコードは使用されない。4つの状態が示されているが、4つの状態より多い又は少ない構造を含む他のマルチステート構造に使用することもできる。読み出し参照電圧Vra、Vrb、及び、Vrcは、記憶素子からデータを読み出すために提供される。既定の記憶素子の閾値電圧がVra、Vrb及びVrcを上回っているのか、あるいは下回っているのかをテストすることによって、システムは、記憶素子が存在する状態、即ち、プログラム状態を判断することができる。さらに、3つの検証参照電圧Vva、Vvb、及び、Vvcが提供される。記憶素子を状態Aにプログラミングするとき、システムは、それらの記憶素子がVva以上の閾値電圧を有するかどうかをテストする。記憶素子を状態Bにプログラミングするとき、システムは、記憶素子がVvb以上の閾値電圧を有するかどうかをテストする。記憶素子を状態Cにプログラミングするとき、システムは、記憶素子がVvc以上の閾値電圧を有するかどうかを判断する。フルシーケンスプログラミングとして知られている一実施形態においては、記憶素子は、E状態からプログラミングされた状態A、B又はCの何れかに直接的にプログラミングされる。例えば、まず、プログラミングされる記憶素子の集合中の全ての記憶素子が消去状態Eとなるように、集合が消去される場合がある。次に、図13で示されるような一連のプログラムパルスが、記憶素子を状態A、B又はCに直接的にプログラミングするために使用される。いくつかの記憶素子は状態Eから状態Aにプログラムされ、他の記憶素子は状態Eから状態Bに、及び/又は、状態Eから状態Cにプログラミングされる。さらに、1つ以上のデータ状態に対してオフセット検証レベルおよび目標検証レベルが使用される。例えば、VvaLおよびVvaは、それぞれ、A状態のオフセット検証レベルおよび目標検証レベルであり、VvbLおよびVvbは、それぞれ、B状態のオフセット検証レベルおよび目標検証レベルである。オフセット検証レベルは、最終検証レベルまたは目標検証レベルからオフセットされる。オフセット検証レベルは、プログラミング方式に依存する目標検証レベルよりも高い可能性がある。検証レベルは、電圧または電流を表すことができる。プログラミング中、目標状態としてA状態にプログラムされることになっているA状態記憶素子のVthがVvaL以下の場合には、記憶素子が高速プログラミングモードでプログラムされる。これは、ビットラインを接地することによって達成されてもよい。Vva≧Vth>VvaLの場合には、関連付けられたビットライン電圧を接地レベルと完全禁止レベルとの間のレベルに引き上げるなどの方法により、記憶素子が低速プログラミングモードでプログラムされる。これによって精度が向上するため、閾値電圧の大幅増を回避することによってVt分布が狭まる。Vth>Vvaの場合には、記憶素子がこれ以上プログラミングされないようにロックアウトされる。同様に、B状態にプログラムされることになっているB状態記憶素子が、高速および低速プログラミングモードを有することができる。なお、1つの手法では、C状態など最高状態の場合には、他の状態よりもメリットが少ないことから、低速プログラミングモードは使用されない。消去状態と7つのプログラム状態A~Gとを有する8状態プログラミングの一例では、例えば、中間状態A~Fに対して高速および低速プログラミングモードを使用できる可能性がある。図5は、2つの異なるページ下位ページと上位ページに対してデータを記憶するマルチステート記憶素子にプログラムする2パス技術の一例を示している。4つの状態は、図4から閾値電圧区分400,402,404及び406を繰り返すことによって示されている。これらの状態これらの状態が示すビットは、状態E11、状態A01、状態B00及び状態C10である。状態Eの場合、両方のページが1を記憶する。状態Aの場合、下位ページが1を記憶し、上位ページが0を記憶する。状態Bの場合、両方のページが0を記憶する。状態Cの場合、下位ページが0を記憶し、上位ページが1を記憶する。なお、各状態に対して特定のビットパターンが割り当てられているが、異なるビットパターンが割り当てられてもよい。第1プログラミングパスでは、記憶素子のVthは下位論理ページにプログラムされるビットに従って設定される。そのビットが論理1であれば、以前に消去された結果として適切な状態にあるのでVthは変更されない。しかし、プログラムされるビットが論理1であれば、矢印500で示したように、Vthは状態Aになるように増大される。これによって、第1プログラミングパスを終了する。第2プログラミングパスでは、記憶素子のVthが、上位論理ページ内にプログラミング中のビットに従って設定される。下位ページ、上位ページが1、1である場合には、記憶素子が状態Eにあることから、プログラミングは行われない。下位ページ、上位ページが0、1である場合には、記憶素子が状態Aにあることから、プログラミングは行われない。下位ページ、上位ページが0、0である場合には、矢印510によって表される状態Aから状態Bへの移行が行われる。下位ページ、上位ページが1、0である場合には、矢印520によって表される状態Eから状態Cへの移行が行われる。この例では、オフセット検証レベルVvaLおよびVvbLも、A状態およびB状態に対してそれぞれ使用することができる。一実施形態では、上位及び下位ページデータの両方が利用可能である場合に、十分なデータを書き込まれた場合、システムは全シーケンス書き込みを実行するように設定される。十分なデータが利用可能でない場合、プログラミング動作は受け取ったデータを用いて下位ページプログラミングを実行できる。次のデータを受け取ったときは、システムは上位ページをプログラミングする。さらに別の実施形態では、システムは下位ページをプログラムするモードで書き込みを開始し、ワードラインの記憶素子の全体又は大部分を充填するために次の十分なデータを受け取った場合、全シーケンスプログラミングモードに変換する。図6a~cは、閾値電圧分布の組と中間状態を使用する2パスプログラミングの一例を示す。このプログラミング技術は前のページの隣接記憶素子に書き込んだ後で、特定のページに対してその特定の記憶素子を書き込むことによって、その特定の記憶素子に対するフローティングゲート間結合の影響を低減する。実装形態の一例では、不揮発性記憶素子は、4つのデータ状態を用いて記憶素子毎に2ビットのデータを記憶する。例えば、E状態が消去状態であり、状態A、B及びCがプログラムされた状態である。前述したように、状態Eはデータ11を記憶し、状態Aはデータ01を記憶し、状態Bはデータ00を記憶し、状態Cはデータ10を記憶している。データの物理的データ状態への他の符号化を用いることもできる。各記憶素子は2ページ分のデータを記憶する。参照のために、これらのページのデータは上位ページ及び下位ページと呼ばれるが、他のラベルを与えることもできる。プログラミング動作は、2つのステップの処理である。第1ステップでは、下位ページをプログラムする。下位ページがデータ1のままである場合、記憶素子状態は状態Eに留まる。データが0にプログラムされる場合、記憶素子の閾値電圧は上昇し、記憶素子は状態B’にプログラムされる区分610。従って、図6aは、状態Eから状態B’への記憶素子のプログラミングを示している。状態B’は中間状態Bであり、従って、検証点はVvb’として示され、Vvbより低い。一実施形態では、状態Eから状態B’に記憶素子をプログラムした後、NANDストリング内の隣接記憶素子WLn1をその下位ページに対してプログラムする。これは、図6bの閾値電圧区分612に示したように状態B’の閾値電圧区分を拡大する影響を有する。閾値電圧区分のこの見かけの拡大は、上位ページをプログラムする際に修正される。E状態も、区分602によって示されるように拡大される。図6cは、上位ページをプログラムする工程を示している。記憶素子が消去状態Eであって上位ページが1である場合、記憶素子は状態Eに留まる区分602。記憶素子が状態Eであり、その上位ページデータが0である場合、記憶素子の閾値電圧は上昇し、記憶素子は状態Aになる区分604。記憶素子が中間の閾値電圧区分612であって、上位ページデータが0である場合、記憶素子は最終状態Bにプログラムされる区分606。記憶素子が中間の閾値電圧区分612であって、上位ページデータがデータ1になる場合、記憶素子の閾値電圧は上昇し、記憶素子は状態Cになる区分608。この例では、同様に、A及びBデータ状態のために、オフセット検証レベルが利用され得る。隣接記憶素子の上位ページプログラミングだけが所定の記憶素子の見かけの閾値電圧に影響を与えるので、図6a~cで示した工程は、フローティングゲート間結合影響を低減する。別の状態符号化の一例は、上位ページデータが0であるとき区分612から状態Cに移動することであり、上位ページデータが1であるとき状態Bに移動することである。図6a~cは4つのデータ状態と2つのページデータに対する一例を提供するが、開示された概念は4つの状態より多い、又は少ない状態、及び2つのページとは異なるページを備えた他の実装形態に適用することもできる。例えば、記憶素子毎に8つの状態または16個の状態を有するメモリデバイスが、現在計画され、製造されている。図7は、1組の記憶素子を、ワードラインを前後する順にプログラムするマルチパスプログラム動作を示す。描かれた構成要素は、はるかに大きい1組の記憶素子、ワードラインおよびビットラインの部分集合であってもよい。1つの可能なプログラム動作では、WLn-1たとえば、記憶素子702、704および706上の記憶素子が、第1のプログラミングパスでプログラムされる。このステップは、丸付き数字1で表される。次に2、WLn上の記憶素子たとえば、記憶素子712、714および716が、第1のプログラミングパスでプログラムされる。本実施例では、プログラミング対象のワードラインが選択された場合、各プログラムパルスの後に検証動作が行われる。WLnに対する検証動作のときに1つまたは複数の検証電圧がWLnに印加され、WLn-1およびWLn1を含む残りのワードラインにパス電圧が印加される。このパス電圧は、選択されたワードラインの検知動作が実行できるように、選択されていない記憶素子をオンにする導通する目的で使用される。次に3、WLn-1上の記憶素子が第2のプログラミングパスでプログラムされる。次に4、WLn1上の記憶素子が第1のプログラミングパスでプログラムされる。次に5、WLn上の記憶素子が、第2のプログラミングパスでそれぞれの最終状態にプログラムされる。WLn1でのプログラミングにより、WLn上の記憶素子は、状態ごとにそれらの閾値電圧分布を引き上げ、拡張する傾向のある連結による影響を受ける。この影響は、シングルパスプログラミングとマルチパスプログラミングとの両方で起こりうる。シングルパスプログラミングでは、各ワードラインが完全にプログラムされた後で、WLn-1、次にWLn、次にWLn1という具合に次のワードラインに移る。図8a~図8fは、図2のセンスブロックで使用するプログラミング動作の様々な箇所におけるデータラッチの値の例を示す。この例では、各ビットラインが3つのデータラッチ、すなわちQDL、UDLおよびLDL、と関連付けられている。データラッチは、それぞれ、第1、第2および第3のデータラッチとみなすことができる。各ビットラインおよび選択された記憶素子は、第1、第2および第3のデータラッチを有してもよい。あるビットラインの第1のデータラッチは、別のビットラインの第1のデータラッチに対応し、例えば、両方がQDLであり得る。あるビットラインの第2のデータラッチは、別のビットラインの第2のデータラッチに対応し、例えば、両方がUDLであり得る。あるビットラインの第3のデータラッチは、別のビットラインの第3のデータラッチに対応し、例えば、両方がLDLであり得る。UDLおよびLDLが、上位ページおよび下位ページのビット情報をそれぞれ記憶するのに対し、QDLは、記憶素子が下位検証レベルをパスしたかどうかに関する情報を記憶する。図8aは、関連付けられた記憶素子の目標データ状態に応じたプログラミングの開始時におけるデータラッチの各組のビット値を示す。E状態記憶素子の場合、全てのラッチが1に設定される。A状態記憶素子の場合、QDL、UDLおよびLDLラッチは、それぞれ0、0および1に設定される。B状態記憶素子の場合には、全てのラッチが0に設定される。C状態記憶素子の場合、QDL、UDLおよびLDLラッチは、それぞれ0、1および0に設定される。図8bは、関連付けられた記憶素子の目標データ状態に応じた各データラッチのビット値であって、A状態記憶素子のVthが下位検証レベルVvaLをパスした後の値を表す。破線のボックスによって示すとおり、QDLビットは1に反転される。データラッチの変更は、各プログラム検証反復処理の終了時であって、検証動作が実行された後に行われる。図8cは、接続された記憶素子の目標データ状態に応じた各ラッチのビット値であって、A状態記憶素子のVthが目標検証レベルVvaをパスした後のものを示す。UDLビットは、破線のボックスに示されるように、0に反転される。図8dは、接続された記憶素子の目標データ状態に応じた各ラッチのビット値であって、B状態記憶素子のVthが下位検証レベルVvbLをパスした後のものを示す。QDLビットは、破線のボックスに示されるように、1に反転される。図8eは、接続された記憶素子の目標データ状態に応じた各ラッチのビット値であって、B状態記憶素子のVthが目標検証レベルVvbをパスした後のものを示す。UDLビットおよびLDLビットは、破線のボックスに示されるように、1に反転される。図8fは、接続された記憶素子の目標データ状態に応じた各ラッチのビット値であって、C状態記憶素子のVthが目標検証レベルVvcをパスした後のものを示す。QDLビットおよびLDLビットは、破線のボックスに示されるように、1に反転される。図9は、使用していない2つのデータラッチの組み合わせに加え、様々なデータ状態に対する、記憶素子の高速、低速、または禁止モードに応じた図8a~図8fのデータラッチの値を示す。既述のとおり、記憶素子は、目標データ状態のオフセット検証レベルに達するまで、高速プログラミングモードでプログラムすることができ、その後は、目標データ状態の目標検証レベルに達するまで、低速プログラミングモードでプログラムされ、その後はそれ以上のプログラミングが禁止される。ここで設けられたデータラッチは、様々なプログラミングモードと様々なデータ状態とを対象とする様々な3ビットの組み合わせを含む。Eは、E状態のままであり、その結果失敗が起こらないE状態記憶素子を表す。Efailは、E状態を上回るように妨害され、その結果失敗が起こるE状態記憶素子を表す。これらの状況は共に、書き込みデータに応じてE状態記憶素子になる予定だったことから、同じデータラッチの値によって表される。Afast、AslowおよびAinhibitAinhは、それぞれ、A状態記憶素子の高速、低速、および禁止モードを表す。同様に、Bfast、BslowおよびBinhibitBinhは、それぞれ、B状態記憶素子の高速、低速および禁止モードを表す。CfastおよびCinhibitCinhは、それぞれ、C状態記憶素子の高速モードおよび禁止モードを表す。A、BおよびC状態記憶素子は、プログラミング動作終了時にQDL=UDL=LDL=1を有するため、それらのデータラッチによって互いを区別することができない。同様に、この実装形態では、E状態記憶素子が、プログラミング動作の終了時にA、BおよびC状態記憶素子と区別することができない。3つのデータラッチが存在することから、3要素QDL、UDL、LDLの可能な固有の組み合わせが23=8通り存在することを理解することにより、この課題への対応策を見出すことができる。ただし、この例では、記憶素子が、E状態、E状態超だがVvaL未満、VvaLとVvaとの間、Vva超だがVvbL未満、VvbLとVvbとの間、およびVvb超だがVvc未満、という6つのカテゴリによってのみ特徴付けることができる。そのため、これらの組み合わせのうち、10,1,1および21,1,0の2つは使用されない。これらの組み合わせは、エラー検出およびデータ復旧目的で使用することができる。組み合わせ1は、この組み合わせのUDLおよびLDLデータが通常のE状態記憶素子、すなわち、UDL=1およびLDL=1、の場合と同じである利点を有する、つまり、E状態記憶素子の上位ページおよび下位ページビット情報が変わらないままということである。この構成では、QDL=0が使用され、QDL=1は、禁止されたA、BおよびC状態記憶素子を表す目的で使用される。これにより、プログラミング動作の終了時にE状態記憶素子をA、BおよびC状態記憶素子と区別することができる。図10は、図9のデータラッチの値の変形例を表しており、消去状態は、禁止されたA、BおよびC状態とは異なる組み合わせを有する。ここで、EおよびEfail記憶素子に関して、QDL=0、UDL=1およびLDL=1である。図9に示すものと同じ組み合わせを、他のデータ状態でも維持することができ、同じ組み合わせが図10で繰り返される。プログラミング動作の終了時に、全てのE状態記憶素子がデータラッチ0,1,1を有するのに対し、禁止されたA、BおよびC状態記憶素子は、1,1,1というデータラッチを有する。そのため、プログラミング終了時に、QDLをスキャンすれば、E状態記憶素子と他の記憶素子とを区別することができる。E状態記憶素子は、ワードラインなど、より大きな組の記憶素子内の記憶素子の第1の部分集合内にあるとみなすことができ、A、BおよびC状態記憶素子は、その組の第2の部分集合内にあるとみなすことができる。異なる状態の各種記憶素子は、ランダムに分布および混在させることができる。第2の部分集合内の記憶素子は、E状態に隣接する第1の目標データ状態A状態、第1の目標データ状態に隣接する第2の目標データ状態B状態、および第2の目標データ状態に隣接する第3の目標データ状態C状態を含む、少なくとも3つの目標データ状態にプログラムされる。プログラミングを正常に完了した第2の部分集合内の各記憶素子は、関連付けられたデータラッチ例えばQDLのうちの1つに第1の値例えば1を有し、第1の部分集合内の各記憶素子は、関連付けられたデータラッチ例えばQDLのうちの1つにおける第1の値とは異なる値例えば0によって特定される。この改訂されたデータラッチ構成は、記憶素子が高い状態X、典型的にはA状態、に移行するために起きるE->X失敗と呼ばれるE状態の失敗の数を判断する目的で使用することができる。プログラミング動作の終了時に、VraまたはE状態区分とA状態区分との間の他の電圧を使用して読み出し動作を実行し、Vth>Vraである記憶素子を特定することができる。検知中は、これらの記憶素子は非導電性である。読み出し動作の結果とQDL値とに基づいて、E->X失敗の数を計数することができる。記憶素子のページにおける失敗の数が、ビット無視閾値例えば、メモリデバイスでROMヒューズパラメータによって設定されると呼ばれる閾値よりも高い場合には、そのページでプログラム状態=failを設定することができる。そのページ上のデータは、VrcまたはB状態区分とC状態区分との間の他の電圧でのC状態読み出しと、次に行われるVrbまたはA状態区分とB状態区分との間の他の電圧でのB状態読み出しとを含む完全読み出し動作を実行することを含む復旧動作によって、復旧させることができる。復旧動作は、次に述べるとおり、エラー検出プロセスからすでに利用可能であるA状態読み出し結果も使用し、データラッチの値にアクセスし、適切な論理演算を実行する。なお、図10のこのデータラッチ割り当ては、高速または低速プログラミングモードがアクティブであるかどうかを示すプログラムデータ転送に影響する。比較のために、図9の手法は、SA<=QDLを使用してQDLを参照することによってのみ、高速または低速プログラミングモードがアクティブであるかどうかを判断し、それに応じてビットラインバイアスを設定する低速プログラミングモードの場合にはVblが引き上げられ、高速プログラミングモードの場合には接地される。ここで、SA<=QDLは、データがQDLからSAにロードされることを示す。図10の手法により、バイアス0がプログラム禁止情報を上書きする場合がある。これを回避するために、新しいプログラムデータ転送を、SA<=QDL|UDLLDLに変更することができる。式中、|は論理OR演算を表す。図10の手法により、プログラミング動作の終了時に、プログラム中のA、BおよびC状態記憶素子を計数して、総数が閾値よりも少ないかどうかを確認することができる。これは、一時変数YBOXに値UDLLDLは論理ANDを表すをロードする論理演算YBOX<=UDLLDLを実行し、YBOXにおける0の数を計数することによって達成できる。論理演算は、センスモジュール用の管理回路、ステートマシンまたは他の箇所によって実行することができ、YBOXはこれらの箇所で維持することができる。図9の手法と図10の手法との1つの類似点は、UDL,LDL=1,1の場合に記憶素子が禁止されるということである。図11aは、図10のデータラッチの値とA状態読み出し動作の結果とに基づく論理演算の使用を示しており、失敗検出プロセスにおける消去状態エラーとプログラム中の高状態エラーを計数する。図11aは、図10の表のQDL行を繰り返している。図10の行が、参照用に図11bでも繰り返されている。QDLが、プログラミング動作の終了時に、残りのプログラム中の記憶素子を特定する。SA<=readAは、読み出し動作がVraで実行され、読み出し動作の結果がセンスモジュールなどのセンスアンプSAにロードされることを示す。この読み出し動作は、消去状態にある記憶素子と、目標データ状態の隣接する状態例えばA状態にある記憶素子とを区別する。読み出し動作は、妨害が原因でE状態記憶素子がVraを越えたかどうかを判断する。この読み出し下では、E失敗していないE状態記憶素子が導電性であるのに対し、Efail失敗したE状態記憶素子およびプログラムされた全状態例えば、A、B、C状態の記憶素子は非導電性である。この例では、検知中に記憶素子が導電性である場合にはSA=0、記憶素子が非導電性である場合にはSA=1である。図示するとおり、E記憶素子についてはSA=0であり、Efail記憶素子についてはSA=1である。同時に、全てのプログラム状態記憶素子でSA=1である。論理演算SA~QDLにおいて、は論理ANDを意味し、~は否定または裏を意味する。SA~QDLが、Efail、Afast、BfastおよびCfast状況にある記憶素子を特定する。プログラミングの終了時に、それぞれの記憶素子の目標状態にプログラムできない記憶素子のうちのいくつかは無視される。Afast、BfastおよびCfast状況にある記憶素子は、これらの無視された記憶素子から成る。全てのデータ状態におけるエラーの数は、論理演算YBOX<=~SA|QDL実行後のYBOXにおける1を計数することによって求めることができる。この計数は、Efail記憶素子と、まだプログラミングを終えておらず例えば、Afast、Aslow、Bfast、BslowおよびCfast状況下にある、プログラミング終了前に無視されたA、BおよびC状態記憶素子とを含む。これらの無視された記憶素子がエラーを招く可能性もある。誤り訂正コードECCがこれらのエラーに対応できるので、全ての状態のエラーを合計する方が大きな意味があり得る。図11bは、図10のデータラッチの値とA状態読み出し動作の結果とに基づく論理演算の使用を表しており、失敗検出プロセスにおける消去状態エラーEfailを計数する。この演算では、Efail記憶素子だけが計数され、他の終了していないA、BまたはC状態記憶素子の計数は回避することができる。図11bでは、図11aのSA行に加え、図10の表のQDL、UDLおよびLDL行も繰り返している。どちらの計数方法全ての状態の合計またはE状態のみを計数でも、3つのデータラッチQDL、UDLおよびLDL内のデータは、データ復旧用のデータを保存する。失敗カウントが閾値を超えると、データを復旧させて、メモリデバイス内の別の箇所へと移すために、完全ワードライン読み出し動作を実行することができる。Efail記憶素子だけを計数するには、論理演算YBOX<=SA~QDLUDLLDLを使用すればよい。これは、一時変数YBOXに値を割り当てる。破線のボックスは、EfailについてはYBOX=1であり、Eおよび他の全ての記憶素子状況についてはYBOX=0であることを示す。そのため、YBOXは、Efail記憶素子と他の全ての記憶素子とを区別する。Efail記憶素子の数は、1組の記憶素子全体にわたり、YBOX=1である記憶素子の数をプログラミング動作で計数することによって、計数することができる。図11cは、図10のデータラッチの値と、データ復旧プロセスにおけるCおよびB状態読み出し動作の結果とに基づいた論理演算の使用を示す。データ復旧のステップは以下のとおりである。1.QDL復旧-QDLデータは、3つのデータラッチ内の残りデータからQDL<=~~QDLUDLLDLによって取得することができる。2.C状態Vrcで読み出す。C状態記憶素子のうちの一部が自らの目標状態に達しておらず、プログラミング中に無視された可能性があることから、C状態データの一部が誤って読み出されるXでマークものと仮定する。C状態を復旧させるために、論理演算UDL<=SA|UDL~LDLによってUDLを更新することができる。3.UDL<=UDL|~QDLを使用して上位ページデータを完全に復旧させるために、UDLラッチがもう1度更新される。4.B状態Vrbで読み出す。ここでも、上記C状態の場合と同じ理由で、B状態データの一部が誤って読み出されるXでマークものと仮定する。残りデータを持っているため、LDLデータは、論理演算LDL<=LDL~SAによって最初のプログラムデータへと変換することができる。ここでは、上位ページデータの復旧がLDLおよびQDLにある残りデータに依存するため、C読み出しが最初である。破線のボックスは、UDLおよびLDLの最終復旧値を示す。これらの値が、書き込みデータに従ってデータラッチでもともと設定されていた値と同じであることが、図10または図11bから検証できる。そのため、このデータ復旧動作を実行することにより、各記憶素子の下位ページおよび上位ページのデータ情報を正しく復旧できる可能性がある。なお、論理演算は、センスブロックの管理回路で、またはステートマシンで実行することができ、どちらもメモリチップ上に存在する。これにより、外部のオフチップコントローラ例えば、図1における150にデータを転送し、そこで演算を実行する必要がなくなる。そのため、エラー検出およびデータ復旧動作を、チップ上で、オフチップコントローラまたはホストに対して実質的に透過的な方法で、実行することができる。図12aは、プログラミング中およびプログラミング後の失敗検出および復旧動作の例を表す。ステップ1200で、書き込みデータの上位ページに対してプログラミング動作が開始される。なお、下位ページを先にプログラミングしてもよい。ステップ1202で、それぞれの記憶素子のセンスモジュールと関連付けられたデータラッチを構成する。センスモジュールは、例えば、それぞれのビットラインおよびNANDストリング、または他の一続きの直列接続記憶素子と関連付けることができる。データラッチは、消去状態に保たれる記憶素子の第1の部分集合と、A、BおよびC状態など、それぞれの目標データ状態にプログラムされる記憶素子の第2の部分集合とを特定するように構成されている。プログラムループカウントが、ステップ1204で更新される。最初に、カウントが0に設定される。ステップ1206で、プログラム電圧Vpgmが、選択されたワードラインに印加される。このワードラインは、記憶素子の第1および第2の部分集合を含む。また、データラッチに基づき、センスモジュールによって禁止モードまたはプログラムモードが設定される。ステップ1208で、オフセット検証レベルおよび目標検証レベルを使用して、検証動作が実行される。この検証動作は、それぞれの記憶素子が導電状態にある場合に、センスモジュールを使用してそれぞれのビットラインに事前に充電することができ、センスノードがビットラインに放電できるようにするセンス動作である。非導電状態にある場合には、記憶素子は、認め得るほど放電しない。放電期間の経過後、生成されたデータは、各記憶素子のプログラミングを監視および制御するために、管理回路に転送することができる。特にステップ1210では、図10に関連して記載されたように、検証動作の結果に基づきデータラッチを管理回路が更新する。ステップ1212で、プログラミング中の記憶素子の数が判断される。例えば、図10に関連して記載しているように、論理演算YBOX<=UDLLDLを実行することにより、プログラミング中のA、BおよびC状態記憶素子を計数することができる。判断ステップ1214で、プログラミング中の記憶素子の数が閾値よりも少ないかどうかが判断される。判断ステップ1214が真であれば、プログラミング動作は成功でありステップ1216、図12bおよび図12cに関連してさらに記載しているように、プログラミング後のエラー検出および復旧動作が実行されるステップ1218。それぞれの目標データ状態に達しなかった記憶素子数が第2の部分集合内の記憶素子の最大数に満たなければ、判断ステップ1214は真である。判断ステップ1214が偽である場合には、判断ステップ1222で、ループカウントが最大値を超えたかどうかが判断される。判断ステップ1222が真であれば、プログラミング動作は不成功であるステップ1224。判断ステップ1222が偽であれば、Vpgmがステップアップされステップ1220、別のプログラム検証反復処理が実行されるように、ループカウントが更新されるステップ1204。図12bは、図12aのステップ1218のプログラミング後のエラー検出および復旧動作に関するさらなる詳細を示す。ステップ1230で、バイナリ読み出し動作がVraで実行される。図11aの動作SA<=readAを参照されたい。ステップ1232で、Vth>Vraである記憶素子が、例えばSA=1から特定される。ステップ1234で、Vth>Vraである記憶素子のデータラッチが評価され、書き込みデータに従ってE状態に保たれることになっていた記憶素子Efailが特定される。ステップ1234で、図11bに関連して記載された動作YBOX<=SA~QDLUDLLDLを実行することができる。ステップ1236で、例えば、YBOX=1である記憶素子からE状態記憶素子の失敗の数を計数する。判断ステップ1238で、カウントが閾値以下であれば、ステップ1240でstatus=passが設定される。これは、例えば、ECC訂正可能な少数のエラーが検出され、別の箇所にデータを書き直すことが保証されないことを示す。判断ステップ1238が偽であれば、status=failが設定される。エラーが検出されたブロックは、以後使用されないように、悪性ブロックとして記録されてもよい。さらに、図12cに関連して記載するとおり、ステップ1244で復旧動作が実行される。図12cは、図12bのステップ1244のデータ復旧動作に関するさらなる詳細を示す。ステップ1250で、Vrc図11cのSA<=readCでの読み出し動作が実行され、ステップ1252で、Vrb図11cのSA<=readBでの読み出し動作が実行され、図11cに関連しても記載するとおり、ステップ1254で、読み出し結果とデータラッチ内の値とに基づいて、論理演算が実行される。ステップ1256で、復旧されたデータが別のブロック内の別のワードラインに書き込まれる。図13は、プログラミング動作における選択されたワードラインの波形例と以降のデータ復旧プロセスとを示す。プログラミング動作は、選択されたワードラインにプログラムパルス例えば、1302、1304、1306、...、1308が印加され、その後VvaL、Vva、VvbL、VvbおよびVvcで検証電圧例えば1310が印加される一連のプログラム検証反復処理を含み得る。このプログラミング動作は、開始時期tsから最終終了時期tfまでの期間1312にわたって行われる。エラー検出プロセスにおけるtaで、Vraでの読み出し動作が行われる。エラー検出プロセスの結果に基づき、tcにおけるVrcでのC状態読み出しと、tbにおけるVrbでのB状態読み出しとを使用するデータ復旧動作が開始されてもよい。エラー検出および復旧プロセスの各種代替案を、以下のとおり提供することができる。1.記載の方式では、E状態記憶素子のデータラッチに対して0,1,1構成を使用して、1,1,1構成を使用する禁止されたA/B/C状態記憶素子と区別する。1つの代替案は、禁止されたA/B/C状態記憶素子に対して0,1,1を使用し、E状態記憶素子に対して1,1,1を使用するという逆の手法である。2.記載の方式では、プログラミング動作の終了時にその他任意の記憶素子と区別するために、E状態記憶素子に対して一意の0,1,1データラッチ構成が使用される。しかし一般的には、0,1,1構成が、禁止されたA/B/C状態記憶素子のいずれにも割り当て可能であることから、その状態の記憶素子は、プログラミング動作の終了時に区別可能である。例えば、プログラミングの終了時に、プログラムされたA状態記憶素子が他の記憶素子と区別できるように、禁止されたA状態記憶素子に0,1,1を割り当てることができる。どのオプションが選択されるかによって、その状態に対応する記憶素子について正しいデータが確実に復旧される。これは、その状態のデータのうちの1つだけが破損している状況で有用であり得る。例えば、いくつかの特定の状況で、記憶素子がなかなかC状態へとプログラミングされず、そのページのプログラム状態が失敗する一方で、他の全ての状態に関するデータは正常に見えるとする。かかる状況では、A読み出し、B読み出し、およびC読み出しを用いてQDLデータおよび他の状態からC状態記憶素子を確認することにより、データ一式を復旧させることができる。また、このデータ復旧方式と関連付けられる状態を選択するROMヒューズオプションを提供できる可能性もある。3.記載のとおり、使用されていない2つのデータラッチの組み合わせ0,1,1および1,1,0が存在する。両方の組み合わせを一緒に使用して、2つの異なる種類の記憶素子を表せる可能性がある。例えば、0,1,1構成を使用してE状態記憶素子を表すことができる一方で、禁止されたC状態記憶素子に対して1,1,0構成を使用することができる。この場合、少なくともこれらの2つのデータ状態について、完全なデータ復旧を保証することができる。なお、2つのQDL,UDL,LDLの組み合わせ、具体的には10,1,1および21,1,0が使用されないのが典型的であると、図9との関連ですでに述べた。記載された詳細な例では、組み合わせ1自体が使用された。ただし、1および2の両方の組み合わせを、例えば、2種類の失敗から復旧する目的で、使用することも可能である。例えば、組み合わせ1はE状態の失敗に割り当てることができ、組み合わせ2はA状態の失敗例えばAinhに割り当てることができる。この場合、E->Xの失敗だけでなく、A->Xの失敗も復旧させることができる。別の代替案として、他のラッチ割り当てに応じて、組み合わせ1ではなく組み合わせ2を使用できる可能性もある。一実施形態では、不揮発性記憶システム内の1組の記憶素子をプログラムするための方法が、書き込みデータに基づいて、消去状態に保たれる組の第1の部分集合内の記憶素子と関連付けられたデータラッチ内、および、それぞれの目標データ状態にプログラムされる組の第2の部分集合内の記憶素子と関連付けられたデータラッチ内のデータを構成することを含む。この方法は、第2の部分集合内の記憶素子をプログラムしている間、第1の部分集合内の記憶素子を禁止するステップと、プログラミング中、第2の部分集合内の記憶素子の進捗に基づいて第2の部分集合内の記憶素子の関連付けられたデータラッチを更新するステップと、をさらに含む。この方法は、自身のそれぞれの目標データ状態に達していない記憶素子数が、第2の部分集合内の記憶素子の最大数に満たずこの状況は、指定された数のビットエラーまたは記憶素子エラーに満たないことと相関関係がある、その結果、第2の部分集合内の記憶素子のプログラミングが正常に完了したとみなされると判断するステップをさらに含む。この方法は、第2の部分集合内の記憶素子のプログラミングが正常に完了したことを受けて、消去状態と目標データ状態の隣接する状態とを区別する第1の部分集合内の記憶素子に対して読み出し動作を実行することにより、エラーを有する第1の部分集合内の記憶素子の数を判断するステップをさらに含む。別の実施形態では、不揮発性記憶システムが、消去状態に保たれる組の第1の部分集合内の記憶素子と、それぞれの目標データ状態にプログラムされる組の第2の部分集合の記憶素子とを含む、1組の不揮発性記憶素子を備える。また、各記憶素子および少なくとも1つの制御回路と関連付けられたデータラッチも提供される。少なくとも1つの制御回路が、a書き込みデータに基づいて、第1の部分集合内の記憶素子と関連付けられたデータラッチ内、および第2の部分集合内の記憶素子と関連付けられたデータラッチ内でデータを構成し、b第1の部分集合内の記憶素子を禁止し、第2の部分集合内の記憶素子をプログラムし、プログラムされたときに第2の部分集合内の記憶素子の進捗に基づいて、第2の部分集合内の記憶素子の関連付けられたデータラッチを更新し、c自身のそれぞれの目標データ状態に達していない記憶素子数が第2の部分集合内の記憶素子の最大数に満たず、その結果、第2の部分集合内の記憶素子のプログラミングが正常に完了したとみなされると判断し、d第2の部分集合内の記憶素子のプログラミングが正常に完了したことを受けて、最初の消去状態と目標データ状態の隣接する状態とを区別する第1の部分集合内の記憶素子に対して読み出し動作を実行することにより、エラーを有する第1の部分集合内の記憶素子の数を判断する。別の実施形態では、不揮発性記憶システムが、書き込みデータに基づいて、消去状態に保たれる組の第1の部分集合内の記憶素子と関連付けられたデータラッチ内、およびそれぞれの目標データ状態にプログラムされる組の第2の部分集合内の記憶素子と関連付けられたデータラッチ内のデータを構成するための手段を備える。また、第2の部分集合内の記憶素子をプログラムしている間、第1の部分集合内の記憶素子を禁止し、プログラミング中、第2の部分集合内の記憶素子の進捗に基づいて第2の部分集合内の記憶素子の関連付けられたデータラッチを更新するための手段も提供される。また、自身のそれぞれの目標データ状態に達していない記憶素子数が第2の部分集合内の記憶素子の最大数に満たず、その結果、第2の部分集合内の記憶素子のプログラミングが正常に完了したとみなされると判断するための手段も提供される。また、第2の部分集合内の記憶素子のプログラミングが正常に完了したことを受けて、消去状態と目標データ状態の隣接する状態とを区別する第1の部分集合内の記憶素子に対して読み出し動作を実行することにより、エラーを有する第1の部分集合内の記憶素子の数を判断するための手段も提供される。別の実施形態では、不揮発性記憶システム内の組をプログラムするための方法が、記憶素子のうちの少なくとも一部がプログラムされる予定の様々な目標データ状態を特定する書き込みデータに基づいて、記憶素子と関連付けられたデータラッチ内でデータを構成することを含む。この方法は、記憶素子のうちの少なくとも一部を様々な目標データ状態にプログラムするためのプログラミング動作を実行するステップと、プログラミング動作中に、記憶素子のうちの少なくとも一部の進捗に基づいて、記憶素子のうちの少なくとも一部の関連付けられたデータラッチを更新するステップと、をさらに含む。この方法は、プログラミング動作が正常に完了したことを受けて、様々な目標データ状態のうちの1つの目標データ状態例えばE状態にある記憶素子と、様々な目標データ状態の他の目標データ状態例えばA、BおよびC状態にある記憶素子とを区別する読み出し動作を実行するステップをさらに含む。この方法は、他の目標データ状態にある記憶素子の中から、1つの目標データ状態にプログラムされる予定の記憶素子の数を判断することにより、エラーのある記憶素子の数を判断するステップをさらに含む。この方法は、エラーのある記憶素子の数が十分に高い場合に、書き込みデータを復旧させるために復旧動作を実行するステップをさらに含む。本明細書で提供される方法を実施するための対応する方法、システムおよびコンピュータまたはプロセッサ可読記憶デバイスを説明してきた。前述の詳細な説明は、例示および説明を目的として提示されている。これは、網羅的なものでなく、開示された通りの形態に限定されるものでもない。上記の教示に照らした多くの修正形態および変形形態が考えられる。記載した実施形態は、技術およびその実際的応用の原理を最もよく説明し、当業者が様々な実施形態で、検討される特定の使用に適するように様々に修正して技術を最もよく利用しうるように選定された。技術の範囲は、本明細書に添付される特許請求の範囲によって規定されるものとする。"