(57)【要約】【課題】フラッシュメモリの様々な技術的問題を解決する。【解決手段】フラッシュメモリ・ストレージ・モジュールが用いるために作られたコントローラであって、複数の内部プロセッサと複数の内部メモリを含む様々な内部リソースとを接続するように設計されたクロスバー・スイッチを含む、該コントローラが提供される。メモリには、プロセッサのためのワークリストが含まれる。一実施形態では、複数のプロセッサは、クロスバー・スイッチを用いて別のプロセッサと通信し、別のプロセッサのワークリストにタスクを置く。【選択図】図２２
2011508349.tif 000002
【特許請求の範囲】
【請求項１】
フラッシュメモリ・コントローラであって、
各々がレジスタ、ＡＬＵ及び内部メモリを含む複数のプロセッサと、
少なくとも一部が、メモリコマンドに関連するメタデータを含むデータ構造を含み、かつ、少なくとも一部が、前記複数のプロセッサのためのワーク・キューを含む複数のメモリと、
前記複数のプロセッサを前記複数のメモリに接続するクロスバー・スイッチとを含み、該クロスバー・スイッチが、各プロセッサのための１つのポートを含む１組のプロセッサ・ポートと、各メモリのための１つのポートを含む１組のメモリ・ポートと、任意のプロセッサ・ポートを任意のメモリ・ポートに接続することはできるが、プロセッサ・ポート同士を接続したり、あるいはメモリ・ポート同士を接続したりすることはできない内部切替機構とを含み、
それによって、或るプロセッサが、別のプロセッサと関連付けられているワーク・キューにタスクを置くために、前記クロスバー・スイッチを用いて前記別のプロセッサと通信するようにしたことを特徴とするフラッシュメモリ・コントローラ。
【請求項２】
２つ以上のプロセッサがクロスバー・スイッチ・メモリ・ポートにアクセスしようとしている場合に、前記ポートへのアクセスを制御する調停手段をさらに含み、該調停手段が、アクセス権を得たプロセッサにアクセスを提供するように、前記クロスバー・スイッチの内部切替回路を制御することを特徴とする請求項１のフラッシュメモリ・コントローラ。
【請求項３】
前記複数のワーク・キューのうちの少なくとも１つのワーク・キューが、前記複数のデータ構造のうちの１つのデータ構造へのポインタを含むことを特徴とする請求項１のフラッシュメモリ・コントローラ。
【請求項４】
前記複数のメモリのうちの少なくとも１つのメモリが、メタデータをストアするようにフォーマットされているデータ構造へのポインタを含むが、有効なメタデータを現在ストアしていない１若しくは複数のフィールドを含むことを特徴とする請求項３のフラッシュメモリ・コントローラ。
【請求項５】
少なくとも１つのワーク・キューが、空のワーク・キューと少なくとも１つのタスクを含むワーク・キューとを区別することができる情報をストアする第１のレジスタを含む１組のレジスタによって制御され、
前記コントローラが、プロセッサに接続された信号をさらに含み、該信号が、前記第１のレジスタによって制御され、該信号が、空のワーク・キューとタスクを含むワーク・キュー間の移行によってトリガされ、該信号が、前記プロセッサのスリープ・モードを終了させることを特徴とする請求項１のフラッシュメモリ・コントローラ。
【請求項６】
フラッシュメモリ・コントローラを作動させる方法であって、
（ａ）読出しまたは書込み及びロジック・アドレスを指定するホストコマンドを受信するステップと、
（ｂ）前記ホストコマンド及び前記ロジック・アドレスまたは前記ロジック・アドレスに関連しているアドレスを指定するような、前記ホストコマンドに関連しているメタデータ構造を生成するステップと、
（ｃ）前記メタデータ構造を第１のメモリまたはメモリ領域にストアするステップと、
（ｄ）第１のプロセッサが、第２のプロセッサと関連付けられている順序付けられたワークリストを含む第２のメモリまたはメモリ領域にアクセスするステップと、
（ｅ）前記第１のプロセッサが、前記メタデータ構造へのポインタを前記ワークリストに書き込むステップと、
（ｆ）それに応じて、前記第２のプロセッサが、前記メタデータ構造に関連しているタスクを実行するステップとを含むことを特徴とする方法。
【請求項７】
前記ステップ（ｄ）が、
前記第１のプロセッサが、クロスバー・スイッチにアクセスし、前記第２のメモリと関連付けられているポートに接続するサブステップをさらに含むことを特徴とする請求項６の方法。
【請求項８】
前記ステップ（ｆ）の第２のプロセッサのタスクが、
（ｉ）前記第１のメモリまたはメモリ領域にアクセスし、前記メタデータ構造を前記第２のプロセッサ内にあるメモリにコピーするサブステップをさらに含むことを特徴とする請求項６の方法。
【請求項９】
前記ステップ（ｆ）の前記第１のメモリまたはメモリ領域にアクセスする動作が、
前記第２のプロセッサがクロスバー・スイッチにアクセスし、前記第１のメモリまたはメモリ領域と関連付けられているポートに接続する動作を含むことを特徴とする請求項８の方法。
【請求項１０】
前記ステップ（ｆ）の第２のプロセッサのタスクが、
（ｉｉ）前記メタデータ構造が前記第２のプロセッサの内部メモリにストアされている間に前記メタデータ構造の前記内容を変更するサブステップと、
（ｉｉｉ）前記変更されたメタデータ構造を前記第１のメモリにコピーするサブステップとをさらに含むことを特徴とする請求項８の方法。
【請求項１１】
フラッシュメモリ・コントローラであって、
複数のプロセッサを複数のメモリと接続するクロスバー・スイッチを含み、該クロスバー・スイッチが、調停の結果に基づいて該クロスバー・スイッチ上のメモリ・ポートの制御を割り当てる調停手段とを含み、
前記複数のメモリが、
ホストコマンドに関連している複数のデータ投入されたメタデータ構造と、
空きメタデータ構造へのポインタのリストと、
データ投入されたメタデータ構造へのポインタを各々が含む、それぞれ別々のプロセッサと関連付けられている第１及び第２のワークリストとをストアすることを特徴とするコントローラ。
【請求項１２】
第１のプロセッサ及び第２のプロセッサをさらに含み、各プロセッサが、ＡＬＵ、レジスタ及び内部プロセッサ・メモリを含み、前記第１のプロセッサの前記内部プロセッサ・メモリが、第１のホストコマンドに関連している第１のメタデータ構造をストアし、前記第２のプロセッサの前記内部プロセッサ・メモリが、第２のメタデータ構造をストアすることを特徴とする請求項１１のコントローラ。
【請求項１３】
前記第１のワークリストが前記第１のプロセッサと関連付けられ、かつ前記第２のワークリストが前記第２のプロセッサと関連付けられており、
前記第１のワークリスト上のポインタが第３のメタデータ構造を指し、該第３のメタデータ構造がコントローラ・メモリにストアされており、前記第３のメタデータ構造が前記第１のメタデータ構造に関連しており、
前記第２のワークリスト上のポインタが第４のメタデータ構造を指し、該第４のメタデータ構造がコントローラ・メモリにストアされており、前記第４のメタデータ構造が前記第２のメタデータ構造に関連していることを特徴とする請求項１２のコントローラ。
【請求項１４】
前記第１及び第２のメタデータ構造が、第１のタイプであり、
前記第３及び第４のメタデータ構造が、第２のタイプであり、
前記第１のメタデータ構造が、前記第３のメタデータ構造へのポインタを含み、
前記第２のメタデータ構造が、前記第４のメタデータ構造へのポインタを含むことを特徴とする請求項１３のコントローラ。
【請求項１５】
前記第３のメタデータ構造が、第１のロジック・アドレスを含み、
前記第４のメタデータ構造が、第２のロジック・アドレスを含み、
前記第１のメタデータ構造が、前記第１のロジック・アドレスに関連している第１の物理アドレスを含み、
前記第２のメタデータ構造が、前記第２のロジック・アドレスに関連している第２の物理アドレスを含むことを特徴とする請求項１４のコントローラ。
【請求項１６】
第１及び第２のプロセッサ、クロスバー・スイッチ、並びに第１及び第２のコントローラ・メモリを含むフラッシュストレージ・コントローラを作動させる方法であって、
（ａ）前記第１のプロセッサが、第１のメタデータ構造を、前記第１のプロセッサ内にあるプロセッサメモリにストアするステップと、
（ｂ）前記第１のプロセッサが、前記第１のコントローラ・メモリと関連付けられている第１のクロスバー・スイッチポートにアクセスするステップと、
（ｃ）前記第１のプロセッサが、前記第１のメタデータ構造を前記第１のコントローラ・メモリにコピーするステップと、
（ｄ）前記第１のプロセッサが、前記第２のコントローラ・メモリと関連付けられている第２のクロスバー・スイッチポートにアクセスするステップと、
（ｅ）前記第１のプロセッサが、前記第１のメタデータ構造へのポインタを、前記第２のコントローラ・メモリにストアされておりかつ前記第２のプロセッサと関連付けられているワークリストに置くステップと、
（ｆ）前記第２のプロセッサが、前記第１のクロスバー・スイッチポートにアクセスするステップと、
（ｇ）前記第２のプロセッサが、前記第１のメタデータ構造を前記第１のコントローラ・メモリから前記第２のプロセッサ内にあるプロセッサメモリにコピーするステップと、
（ｈ）前記第２のプロセッサが、前記第１のメタデータ構造を変更するステップとを含むことを特徴とする方法。
【請求項１７】
（ｉ）前記第２のプロセッサが、第２のメタデータ構造のフィールドにデータ投入するステップをさらに含み、前記第２のメタデータ構造が、前記第２のプロセッサ内にある前記プロセッサメモリ内に位置し、
前記変更するステップ（ｈ）が、前記第１のメタデータ構造に前記第２のメタデータ構造へのポインタの付加を含むことを特徴とする請求項１６の方法。
【請求項１８】
前記第１のメタデータ構造がロジック・アドレスを含み、
ステップ（ｉ）が、前記ロジック・アドレスに関連している第１の物理フラッシュ・アドレスを第２のメタデータ構造フィールドに置くサブステップを含むことを特徴とする請求項１７の方法。
【請求項１９】
（ｊ）前記第２のプロセッサが、第３のメタデータ構造のフィールドにデータ投入するステップをさらに含み、前記第３のメタデータ構造が、前記第２のプロセッサ内にある前記プロセッサメモリ内に位置し、
前記変更するステップ（ｈ）が、前記第１のメタデータ構造に前記第３のメタデータ構造へのポインタの付加を含むことを特徴とする請求項１８の方法。
【請求項２０】
前記ステップ（ｊ）が、第２の物理フラッシュ・アドレスを第３のメタデータ構造フィールドに置くステップを含み、前記第２の物理フラッシュ・アドレスが、前記ロジック・アドレスに関連していることを特徴とする請求項１９の方法。
【請求項２１】
フラッシュメモリ・コントローラであって、
各々がレジスタ、ＡＬＵ及び内部プロセッサ・メモリを含む第１のプロセッサ及び第２のプロセッサと、
前記第１のプロセッサと関連付けられている第１のワークリストを含む第１の揮発性メモリと、
前記第２のプロセッサと関連付けられている第２のワークリストを含む第２の揮発性メモリと、
第１のホストコマンドに関連している第１のメタデータ構造を含む第３の揮発性メモリと、
第２のホストコマンドに関連している第２のメタデータ構造を含む第４の揮発性メモリと、
クロスバー・スイッチとを含み、
前記クロスバー・スイッチが、
前記第１のプロセッサに接続されている第１のプロセッサ・ポート及び前記第２のプロセッサに接続されている第２のプロセッサ・ポートを含むような、各々がプロセッサに接続されている１組のプロセッサ・ポートと、
前記第１の揮発性メモリに接続されている第１のメモリ・ポート、前記第２の揮発性メモリに接続されている第２のメモリ・ポート、前記第３の揮発性メモリに接続されている第３のメモリ・ポート及び前記第４の揮発性メモリに接続されている第４のメモリ・ポートを含むような、各々が揮発性メモリに接続されている１組のメモリ・ポートとを含み、
前記クロスバー・スイッチが、前記プロセッサ・ポートのうちの１つを前記メモリ・ポートのうちの１つに選択的に接続する内部回路を含むことを特徴とするコントローラ。
【請求項２２】
前記第１のワークリストが、前記第１のホストコマンドに関連している第１の情報を含み、
前記第２のワークリストが、前記第２のホストコマンドに関連している第２の情報を含むことを特徴とする請求項２１のコントローラ。
【請求項２３】
前記第１の情報が、前記第１のメタデータ構造へのポインタを構成し、
前記第２の情報が、前記第２のメタデータ構造へのポインタを構成することを特徴とする請求項２２のコントローラ。
【請求項２４】
前記第１のワークリストが、第３のメタデータ構造へのポインタを含み、該第３のメタデータ構造が、前記第２のホストコマンドに関連していることを特徴とする請求項２３のコントローラ。
【請求項２５】
前記第１及び第２のメタデータ構造が、ロジック・アドレスを含むが物理アドレスを含まず、
前記第１のプロセッサの内部プロセッサ・メモリが第４のメタデータ構造を含み、該第４のメタデータ構造が物理アドレスを含むことを特徴とする請求項２３のコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
【０００２】
本願は、米国仮特許出願第６１／０１７，１２３号及び米国特許出願第１２／０８２，２０７号に基づく優先権を主張し、これらの開示は、引用を以て本明細書の一部となす。
【０００３】
本願はまた、米国特許出願第１２／０８２，２０２号、米国特許出願第１２／０８２，２０５号、米国特許出願第１２／０８２，２２１号、米国特許出願第１２／０８２，２２０号、米国特許出願第１２／０８２，２０６号、米国特許出願第１２／０８２，２０４号、米国特許出願第１２／０８２，２２３号、米国特許出願第１２／０８２，２２２号、米国特許出願第１２／０８２，２０３号にも関連し、これらの開示は、引用を以て本明細書の一部となす。
【０００４】
技術分野
【０００５】
本発明は、データストレージの分野に関し、より詳細には、ソリッドステート不揮発性メモリデバイスを用いたデータストレージ・アプリケーションに関する。この技術は、大規模データセンタに配備されるストレージ・プラットフォーム及びマルチユーザ・コンピューティングを伴う高性能エンタープライズシステムと特定の関係があるが、より小規模のエンタープライズ・アプリケーションにも、エンドユーザのマス・ストレージにも適用可能である。
【背景技術】
【０００６】
現在のエンタープライズレベルのマス・ストレージは、典型的には３．５インチ・フォーム・ファクタによって特徴付けられるハードドライブ、１５，０００ｒｐｍスピンドル・モータ及び７３ＧＢないし４５０ＧＢのストレージ容量に依存している。機械設計は、８つの表面を横切って移動する１つのアクチュエータ及び８つの読出し／書込みヘッドを備えた伝統的なハードドライブと同じである。ヘッド／メディア技術の制約は、読出し／書込み容量を一度に唯１つのアクティブ・ヘッドに制限する。ドライブに送信される全てのデータ要求は連続して処理されるが、各動作間には、アクチュエータが読出し／書込みヘッドを所要の位置に動かし、メディアが回転して読出し／書込みヘッドの下にデータを置くので、長い遅延時間がある。
【０００７】
アクチュエータの待ち要求のキューの結果として、システムは、ユーザが我慢できなくなる時点まで増加する応答時間を確かめる。マス・ストレージ・システムは、各ドライブへの未処理の要求の数を制限することによってこの問題に適合している。これは、各ドライブの有効かつ使用可能な容量を、最大４５０ＧＢ容量が利用可能であるとしても、１ドライブ当たり１２ＧＢにまで低下させる効果を有する。容量の低下は、今度は、所要床面積、冷却及び出力の問題を悪化させ、これらの問題は全て、エンタープライズレベルのマス・ストレージ・システムにとって極めて厄介なものになった。
【０００８】
これらの問題を取り除くために、業界は２．５インチのドライブへと向かっている。しかし、フォーム・ファクタが小さくなればなるほど同じ空間内により多くのドライブを収容できるとはいえ、ハードドライブ動作のシリアル特性は、より小さなフォーム・ファクタ・ドライブですら深刻な所要床面積、冷却及び出力の問題を呈することを意味する。
【０００９】
フラッシュメモリは、エンタープライズのマス・ストレージ環境で魅力的である。というのも、フラッシュメモリ・システムは、ハードドライブと関連付けられている機械的な遅延がなく、それによって、より高い性能及びそれ相応の低いコスト、出力、加熱及び所要床面積の使用を可能にするからである。それにも拘わらず、フラッシュメモリは、特定の技術的制約のせいで、昔からそのような環境において用いられてはいなかった。
【００１０】
第１の技術的問題は書込み速度であり、それはメカニカル・ハードドライブの書込み速度の１０分の１の遅さであり得る。これは、データは書込み前に長い消去サイクルなしにはＮＡＮＤフラッシュデバイス上で上書きされることができないという事実に起因する。消去サイクルは書込み性能に直接影響するので、大部分のフラッシュ構造は、書込みデータを新しい位置に移動させ、消去を後になるまで遅延させる。ビジー・システムでは、遅延された消去サイクルが蓄積し、ついには、プロセッサが空きフラッシュ・ページを使い果たして新しいフラッシュ・ページを生成するために停止しなければならなくなり、それによってシステム性能に大きな影響を及ぼすことがある。
【００１１】
第２の技術的問題は、シングル・レベル・セル（「ＳＬＣ」）デバイスには１００，０００消去サイクル、マルチ・レベル・セル（「ＭＬＣ」）デバイスには１０，０００サイクルの各フラッシュメモリ・ページの指定限界である。これらは、結果としてメモリの特定の非常によく使われる領域が大量に消去されることになるような「ホットスポット」を生じ得る予測不可能なデータ・ストリームで動作するデータセンタに関する特定の問題を課す。
【００１２】
第３の問題はデータ損失であり、これは、読出しディスターブまたはプログラム・ディスターブを含むフラッシュメモリに影響を及ぼす様々な要因によって起こり得ることであり、これらのディスターブは、ディスターブ・セルに隣接するメモリセルの読出しまたは書込みによって生じるデータビットの損失につながる。フラッシュメモリセルの状態はまた、時間の経過の結果として予測不可能に変化し得る。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】米国仮特許出願第６０／９９０，６０１号明細書
【特許文献２】米国非仮特許出願第１２／３２３，２１９号明細書（米国特許出願公開第２００９０１３５２４５号公報）
【特許文献３】米国特許出願第１１／６２４，２０９号明細書
【特許文献４】米国仮特許出願第６１／０５２，１８０号明細書
【特許文献５】米国特許出願第１１／５３３，３０４号明細書
【特許文献６】米国特許第５，６０４，５３１号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１４】
これらの技術的問題は、高容量高性能ストレージ・アプリケーションにおけるフラッシュメモリの使用に深刻な問題を生じさせる。いずれの場合にも、技術的解決策が存在するが、そのような解決策は、一般的には１つのプロセッサを含む標準フラッシュメモリ・コントローラにおいて利用可能な処理能力にかなりの負担をかける。そのような負担は、これらの環境においてこれらの技術的問題を克服することを困難にする。
【課題を解決するための手段】
【００１５】
一実施形態では、記載されているフラッシュメモリの性能制限に対する解決策には、コントローラ・デザインにおいて複数のマイクロプロセッサを用い、それによって、各パイプラインが１つのトランザクションの一部を処理することができるような複数のパラレルな独立したパイプラインを生成することが含まれる。このデザインは、ホスト及びフラッシュ・インタフェースの使用を最大にし、個々のトランザクションが多数の小部分に分割されることを可能にし、小部分は、性能を向上させるために並べ替えられてパラレル処理されることができる。アーキテクチャは、複数のプロセッサが、高コストで非効率的なインタラプトを用いることなく機能を実行することができるように設計される。
【００１６】
パラレル・パイプラインを用いることで、コントローラは、フラッシュメモリの使用につきものの書込みレイテンシーを効率的に隠すことができる。加えて、複数の独立したプロセッサを用いることで、上記した耐久性及びエラーの問題に対する解決策がもたらすオーバーヘッドを処理するための十分な処理能力が提供される。ホストが開始するトランザクションを多数の独立したフラッシュ読出し及び書込みに分けることによって、本明細書に記載のコントローラ・アーキテクチャは、従来のコントローラ・デザインでは不可能であった高水準の性能を可能にする。
【図面の簡単な説明】
【００１７】
【図１】ＳＳＤ（「ソリッドステート・ドライブ」）コントローラ及びフラッシュメモリを含むシステムを示す。
【図２】ホストコマンドをフラッシュ読出し及び書込みに翻訳するために用いられるデータ構造の階層を示す。
【図３】図１のシステムをより詳細に示す。
【図４】ホスト読出し動作を概略的に示す。
【図５】ホスト書込み動作を概略的に示す。
【図６】フラッシュメモリの構成を示す。
【図７】フラッシュメモリ・グループとフラッシュ・ポートの関係を示す。
【図８】フラッシュメモリデバイスへの入出力信号を示す。
【図９】フラッシュＨＥＭｉブロックへの入出力信号を示す。
【図１０】フラッシュ・ポートとフラッシュメモリ・バンク間の接続を示す。
【図１１】１本のピン上へのＣＳ及びＲＢ信号の多重化を示す。
【図１２】フラッシュメモリ階層を示す。
【図１３】ＳＰａｇｅセクタの構成を示す。
【図１４】フラッシュ・ページの構成を示す。
【図１５】スーパーブロック内のデータの構成を示す。
【図１６】データのストライプ構成を示す。
【図１７】ホスト・ポートを通るデータフロー及び制御フローを示す。
【図１８】ホスト・ポートを示す。
【図１９】プリミティブ・マッチ・ロジックを示す。
【図２０】コマンドパーサ・ブロックを示す。
【図２１】コマンド配布ブロックを示す。
【図２２】クロスバー・スイッチを介しての複数のＨＥＭｉと共有ＲＡＭデータ構造間の接続を示す。
【図２３】ＲＡＭコントローラを示す。
【図２４】共有ＲＡＭコントローラと共有ＲＡＭバンクの関係を示す。
【図２５】ＤＲＡＭチャネルを示す。
【図２６】ＨＥＭｉステージを示す。
【図２７】フラッシュＨＥＭｉ及びその密結合ロジック・ブロックを示す。
【図２８】受信ＨＥＭｉ及び送信ＨＥＭｉ固有レジスタを示す。
【図２９】フラッシュＨＥＭｉ ｍＲＡＭの内容を示す。
【図３０】共有ＲＡＭからのデータブロックの転送を示す。
【図３１】ＥＣＣロジックを示す。
【図３２】データパスＤＲＡＭの内容を示す。
【図３３】フォワード・テーブルを示す。
【図３４】リバース・テーブルを示す。
【図３５】スーパーブロック・メタデータ・テーブルを示す。
【図３６】ＩＯＰデータバッファを示す。
【図３７】ＣＤＢ情報を示す。
【図３８】ＩＯＰを示す。
【図３９】転送要求を示す。
【図４０】ページ要求を示す。
【図４１】共有ＲＡＭブロックの内容を示す。
【図４２】イニシエータ情報を示す。
【図４３】ＳＬＣフラッシュ書込みタイミングを示す。
【図４４】ＭＬＣフラッシュ書込みタイミングを示す。
【図４５Ａ】ホストコマンドが受信されたときにホスト・ポートがたどるステップを示す。
【図４５Ｂ】ホストコマンドが受信されたときにホスト・ポートがたどるステップを示す。
【図４６Ａ】ＣＤＢの処理の初期段階を示す。
【図４６Ｂ】ＣＤＢの処理の初期段階を示す。
【図４７】特別な場合のＣＤＢ処理を示す。
【図４８Ａ】ＣＤＢ情報に基づいてＩＯＰ及び転送要求が作成される方法を示す。
【図４８Ｂ】ＣＤＢ情報に基づいてＩＯＰ及び転送要求が作成される方法を示す。
【図４８Ｃ】ＣＤＢ情報に基づいてＩＯＰ及び転送要求が作成される方法を示す。
【図４８Ｄ】ＣＤＢ情報に基づいてＩＯＰ及び転送要求が作成される方法を示す。
【図４９Ａ】フラッシュＨＥＭｉがページ要求を作成する方法を示す。
【図４９Ｂ】フラッシュＨＥＭｉがページ要求を作成する方法を示す。
【図５０Ａ】フラッシュＨＥＭｉ実行ループを示す。
【図５０Ｂ】フラッシュＨＥＭｉ実行ループを示す。
【図５１Ａ】ページ要求の読出しハンドラを示す。
【図５１Ｂ】ページ要求の読出しハンドラを示す。
【図５２Ａ】フラッシュ読出し動作を詳細に示す。
【図５２Ｂ】フラッシュ読出し動作を詳細に示す。
【図５３Ａ】ページ要求の書込みハンドラの実行を示す。
【図５３Ｂ】ページ要求の書込みハンドラの実行を示す。
【図５４】ページ要求へのスーパーページの割り当てを示す。
【図５５】完了したトランザクションのクリーンアップを示す。
【図５６】ガベージ・コレクション・プロセスを示す。
【図５７】パトロール機能プロセスを示す。
【図５８Ａ】復元プロセスを示す。
【図５８Ｂ】復元プロセスを示す。
【図５８Ｃ】復元プロセスを示す。
【図５８Ｄ】復元プロセスを示す。
【発明を実施するための形態】
【００１８】
Ｉ．概要
【００１９】
Ａ．システムの概要
【００２０】
好適実施形態では、本明細書に記載のシステムは、ＳＡＳ（「シリアル・アッタチドＳＣＳＩ」）、ＦＣ（「ファイバーチャネル」）及びＦＣ−ＡＬ（これらは全て小型コンピュータシステム・インタフェース（「ＳＣＳＩ」）に基づく）、並びにシリアルＡＴＡ（「ＳＡＴＡ」）プロトコルを含む様々なエンタープライズレベルのマス・ストレージ・プロトコルで動作するように設計されている。これらのプロトコルは、当業者によく知られており、本明細書では詳しく説明しない。特定のプロトコルが呼び出される場合を除いて、本明細書に開示されているシステム及び方法は、用いられる特定のプロトコルに依存せず、それら全てを正確に作動させるように設計されている。さらに、これらのシステム及び方法は、エンタープライズレベルのアプリケーションのために設計されたプロトコル及びエンドユーザなどの他のアプリケーションのために設計されたプロトコルを含む、他の同様な、現在使用中であるかまたは未だ開発されていないプロトコルとの併用に適していることがある。
【００２１】
便宜上、本明細書において関連するプロトコルは、しばしば集合的に「ＳＣＳＩプロトコル」と呼ばれるが、これは非ＳＣＳＩプロトコルを含み、関連性のないＳＣＳＩプロトコルを含まないことを理解されたい。
【００２２】
本明細書に記載のシステムは、複数のフラッシュメモリチップからなるマス・ストレージ・モジュールを制御するための新規なアーキテクチャを含む。図１に、大まかな概要としてシステム全体が示されている。本明細書の他のブロック図と同様に、図１に示す構成要素は実際には概念的なものであり、機能ブロック間の相互関係の特性を示し、実際の物理回路レベルの実装を表すことを意図するものではない。
【００２３】
ホスト１０１及び１０２は、従来のホスト・デバイスであり、例えば、マス・ストレージ・リソースを用いる２つのサーバ、または１つのそのようなサーバのために働く２つのホスト・バス・アダプタである。特定のプロトコルでは、各ホストは複数のイニシエータをサポートし得る。ＳＣＳＩベースのシステムでは、イニシエータは、データ転送のためのホスト側エンドポイントであり、別々の物理的デバイスまたはプロセスを構成し得る。
【００２４】
基板１０３（破線で表す）は、１若しくは複数のＰＣＢを表す。基板１０３は、例えば、１つのＰＣＢ基板、またはマザー−ドーター形態で互いに接続された複数の基板で構成されることができる。好適実施形態では、基板１０３は、ホスト１０１及び１０２側から見て基板１０３が従来の回転ディスク・マス・ストレージ・デバイスを構成するように見えるように、設計される。これは、ホスト・ポート１０４及び１０５が、ホスト１０１及び１０２のために設計された従来のマス・ストレージ・インタフェースと物理的かつ論理的に区別できないように設計されることを必要とする。それゆえ、好適実施形態では、基板１０３の使用は、ホスト１０１または１０２の再設計を必要としない。
【００２５】
好適実施形態では、ＳＳＤコントローラ１０６は、基板１０３に取り付けられかつ２００ＭＨｚで作動する１つの集積回路デバイスを表す。代替実施形態では、ＳＳＤコントローラ１０６は、本明細書に記載の発明の原理から逸脱することなく、２つ以上の集積回路デバイスで構成されることができる。クロック速度は、当然のことながら、インプリメント選択を代表するものであり、インプリメントによって異なる。
【００２６】
好適実施形態では、データパスＤＲＡＭ１０７は、アイダホ州ボイジーのマイクロン・テクノロジー社（Micron Technology, Inc.）がＭＴ４７Ｈ１６Ｍ１６ＢＣ−５Ｅという商品名で販売しているクロック速度２００ＭＨｚの６４ビット幅の２５６ＭｂｙｔｅのＤＤＲ ＳＤＲＡＭである。これは、２つの６４ビット転送（１サイクル当たり）からなる、１サイクル当たり１２８ビットの実効データ転送速度を提供する。簡単にするために、本明細書ではこれを１２８ビットのインタフェースとして説明する。このデバイスは、全ての転送に関してＥＣＣを自動的にチェックする。より大きな総ストレージ容量を含む代替実施形態では、５１２ＭｂｙｔｅＤＤＲ ＳＤＲＡＭであるマイクロンＭＴ４７Ｈ３２Ｍ１６ＣＣ−５Ｅに置き換えることができる。ＤＲＡＭ以外のメモリのタイプの使用を含めてデータパスＤＲＡＭに対する多くの異なる選択肢が利用可能であり、本明細書で特定されている特定の製品は、本明細書で開示されている発明に不可欠なものではないことを理解されたい。図１に示すように、データパスＤＲＡＭ１０７は、ＳＳＤコントローラ１０６と通信するが、システム内の任意の他の構成要素とは直結していない。
【００２７】
フラッシュメモリ・モジュール１０８は、フラッシュメモリチップの数を表す。好適実施形態では、フラッシュメモリ・モジュール１０８は、１９２個の２ギガバイトのＮＡＮＤフラッシュチップからなり、各フラッシュチップは４０ＭＨｚで作動する。後述するように、この構造は、３００ギガバイトのユーザ・データ容量を提供する。上記のシステムは、より大きいかまたはより小さい総容量で、２ギガバイトより多いかまたは少ない容量を有するフラッシュメモリチップ及び好適実施形態よりも高速または低速で作動するフラッシュメモリチップとともに作動することができることを理解されたい。さらには、フラッシュメモリ・モジュール１０８を、スタックされた複数の「ドーターボード」で構成することもできる。
【００２８】
フラッシュメモリ・モジュール１０８は、ＳＳＤコントローラ１０６と通信するが、システム内の他の構成要素とは関わりがない。
【００２９】
図１に示すように、ＳＳＤコントローラ１０６は中心の位置を占める。というのも、その理由は、ＳＳＤコントローラ１０６はシステム内の全ての他の構成要素と通信し、他の構成要素同士は通信しないからである。基板１０３の一部として示されている各構成要素の構造及び動作については後述する。
【００３０】
Ｂ．データ構造の概要
【００３１】
ＳＳＤコントローラ１０６は、ホストからのコマンドを受け取り、それらのコマンドをより小さなタスクに分けて使用する。より小さなタスクは、最終的にはフラッシュメモリ・モジュール１０８内の一連の読出し及び書込みとなる。図２は、このプロセスを概略的に示す。
【００３２】
ＳＳＤコントローラ１０６は、ホストが開始する読出しまたは書込みコマンドを受信するとき、「ＣＤＢ情報」（例えばＣＤＢ情報２０１）として知られているデータ構造を生成し、ＣＤＢ情報には、ホストからのコマンド・ディスクリプタ・ブロック（「ＣＤＢ」）または他の対応するコマンド関連情報が含まれている。いくつかある情報の中で特に、ＣＤＢ情報は、ロジック・ブロック・アドレス（「ＬＢＡ」）において読み出されるかまたは書き込まれるアドレス範囲を指定する。
【００３３】
ＣＤＢ情報に基づき、ＳＳＤコントローラ１０６は「入出力処理（Input-Output Process）」（「ＩＯＰ」）（例えばＩＯＰ２０２）として知られているデータ構造を生成する。ほとんどの状況下で、１つのＩＯＰが、ホストによって要求される全トランザクションを制御する。
【００３４】
各ＩＯＰは、「転送要求」として知られている最大７つのデータ構造（例えば転送要求２０３〜２０９）を呼び出すことができる。各転送要求は、ＩＯＰによって指定されるＬＢＡ範囲の一部を処理するように設計されている。
【００３５】
各転送要求は、「ページ要求」として知られている最大３つのデータ構造を呼び出すことができる（例えば、転送要求２０６によって呼び出されるページ要求２１０、２１１及び２１２。他の転送要求によって呼び出されるページ要求は図２には図示せず）。各ページ要求は、転送要求によって指定されるＬＢＡ範囲の一部に対応するフラッシュメモリ・モジュール１０８のセグメントから読み出すかまたは書き込むように設計されている。
【００３６】
図２に示すように、例としての３つのページ要求は各々、「スーパーページ（SuperPage）」として知られているフラッシュメモリ・モジュール１０８の領域（例えばスーパーページ２１３、２１４及び２１５）にアクセスする。さらに後述するように、各スーパーページは４つのフラッシュ・ページから構成され、その各々は互いに異なるフラッシュ・ダイにストアされている。
【００３７】
これらのデータ構造については、以下に詳細に説明する。
【００３８】
Ｃ．詳細なシステムの概要
【００３９】
図３は、図１に示したシステム全体のデザインのさらなる詳細を提供するが、前述同様に、明瞭になるように、多くの構成要素及び詳細が省略されている。図３は、基板１０３に接続されたホスト１０１及び１０２を示し、基板１０３には、ＳＳＤコントローラ１０６、データパスＤＲＡＭ１０７及びフラッシュメモリ・モジュール１０８が含まれている。
【００４０】
フラッシュメモリ・モジュール１０８は、８つのフラッシュ・グループに分けられ、フラッシュ・グループ０〜７で表されている。そのうちの３つ、すなわちフラッシュ・グループ０、１及び７が図に示されており、３０１、３０２及び３０３で表されている。好適実施形態では、フラッシュメモリ・モジュール１０８は、８ないし１２のフラッシュ・グループを保持することができる。
【００４１】
ＳＳＤコントローラ１０６には、メモリ・モジュール１０８に含まれるフラッシュ・グループの数に等しい数のフラッシュ・ポート、例えばフラッシュ・ポート３０４、３０５及び３０６も含まれている。各フラッシュ・ポートは、１つのフラッシュ・グループと通信する（例えば、フラッシュ・ポート０ ３０４は、フラッシュ・グループ０ ３０１と通信する）。フラッシュ・グループと同様に、好適実施形態では、ＳＳＤコントローラ１０６は、最小で８、最大で１２のフラッシュ・ポートを有することができ、図の実施形態には８つのフラッシュ・ポートが含まれ、そのうちの３つが示されている。後述するように、各フラッシュ・ポートは、独立して作動し、それによって、フラッシュ・グループにおけるパラレル動作をサポートする。
【００４２】
各フラッシュ・ポートは、フラッシュＨＥＭｉ及びステージバッファ（Stage Buffer）を含む（例えば、フラッシュ・ポート０ ３０４は、フラッシュＨＥＭｉ０ ３０７及びフラッシュ・ステージバッファ０ ３０８を含む）。「ＨＥＭｉ」は、ハードウェア実行マシン（Hardware Execution Machine）の略である。ＨＥＭｉ群は、複数の専用（特殊目的）マイクロプロセッサとして作動する複数のロジック・ブロックである。ＨＥＭｉ群の構造及び機能については、以下に詳細に説明する。各フラッシュＨＥＭｉは、１つのフラッシュ・グループに対する転送動作を制御する（例えば、フラッシュＨＥＭｉ０ ３０７はフラッシュ・グループ０ ３０１を制御し、フラッシュＨＥＭｉ１ ３０９はフラッシュ・グループ１ ３０２を制御する）。
【００４３】
データパスＤＲＡＭ１０７とフラッシュ・グループ間のデータ転送をバッファリングするために、フラッシュ・ステージバッファ（例えばフラッシュ・ステージバッファ０ ３０８）が用いられる。好適実施形態では、各フラッシュ・ステージバッファは、同時に１つの読出し及び１つの書込みを処理することができるデュアルポートＳＲＡＭであり、４つのフラッシュ・ページを表す１６Ｋｂｙｔｅのデータを保持することができる。後述するように、これはデータの「スーパーページ」を構成する。
【００４４】
後述するように、好適実施形態では、各フラッシュ・グループからのデータ・インタフェースは、１回に３２ビット（１ダブルワード）送信することができるが、データパスＤＲＡＭ１０７は、１回に１２８ビットのデータを送受信することができる（上記したように、この実施形態では、データパスＤＲＡＭはデータを６４ビットのチャンクで送受信するが、各クロックでそうすることによって、１２８ビットの有効データ・レートを提供する）。
【００４５】
フラッシュ・ステージバッファは、フラッシュ・グループとデータパスＤＲＡＭ間の通信をバッファリングし、その結果、ＤＲＡＭの一部に関して待ち状態を要求することなく転送を行わせることができる。好適実施形態では、フラッシュ・グループからＤＲＡＭへの送信の場合、フラッシュ・ステージバッファは、ダブルワード・チャンクでデータを受け取る。十分な量のデータ（好適にはスーパーページ全体）が受信されたら、フラッシュ・ステージバッファは、データパスＤＲＡＭデータバス全体を用いるＤＭＡ転送でデータパスＤＲＡＭにデータをバースト転送する。フラッシュ・ステージバッファは、ＤＲＡＭとのＤＭＡ伝送を処理するＤＭＡロジックによって制御される（後述する図１０の説明を参照）。
【００４６】
図３に示すように、ホスト１０１及び１０２は、ホスト・インタフェース３１０と通信し、ホスト・インタフェース３１０は、ホスト・ポート１０４及び１０５（図示せず）を含むことを理解されたい。一般に、ホストは、コマンドを発行し、マス・ストレージに書き込まれるデータを供給し、マス・ストレージからデータを要求する。当業者には明らかなように、ホストがマス・ストレージと通信する方法の詳細は、プロトコル依存である。しかし、典型的には（かつ制限なく）、ホストは、コマンド及び／またはデータを含む「フレーム」を用いてマス・ストレージと通信する。典型的には、コマンドは、コマンド・ディスクリプタ・ブロック（「ＣＤＢ」）に含まれ、それについては当業者によく知られている。
【００４７】
ホスト・インタフェース３１０は、ホストに見えるようにしてＣＤＢに応答するように設計されるが、これは、ホスト１０１側から見てホスト・インタフェース３１０は従来のマス・ストレージ・デバイスへのインタフェースを構成するように見えることを意味する。
【００４８】
制御フローは、次のように進む（言及されている各ロジック・ブロック及びメタデータ構造については詳細に後述する）：読出しまたは書込みを要求するＣＤＢを受信すると、ホスト・インタフェース３１０は、動作を処理するＣＤＢ情報（例えばＣＤＢ情報２０１）を生成する。当該ＣＤＢ情報は、その後、コマンドパーサ・ブロック３１１に伝えられる。
【００４９】
ＣＤＢ情報を受信すると、コマンドパーサ・ブロック３１１は、後述するコヒーレンシ及び他の種類のチェックを行い、その後、ＣＤＢ情報をコマンド配布ブロック３１２に伝える。
【００５０】
コマンド配布ブロック３１２は、ＣＤＢ情報を評価し、ＩＯＰ（例えばＩＯＰ２０２）を生成して、要求された転送を実行する。コマンド配布ブロック３１２は、その後、１若しくは複数の転送要求（例えば転送要求２０３〜２０９）を生成し、各転送要求は、ＩＯＰによって求められる転送の一部を実行する。各転送要求に対して、コマンド配布ブロック３１２は、その後、どのフラッシュ・グループが読み出されるデータまたは書き込まれるアドレス位置を含むかを判定する。
【００５１】
コマンド配布ブロック３１２は、その後、関連フラッシュメモリ・アドレスを含むフラッシュ・グループに対応するフラッシュ・ポート、例えば、フラッシュ・ポート０ ３０４、フラッシュ・ポート１ ３０５及びフラッシュ・ポート７ ３０６に転送要求を伝える。
【００５２】
フラッシュ・ポートがコマンド配布ブロック３１２から転送要求を受信するとき、当該フラッシュ・ポートのためのフラッシュＨＥＭｉは、転送要求をページ要求（例えば、ページ要求２１０、２１１及び２１２）に分け、ページ要求を用いて関連付けられたフラッシュ・グループにおける実際の読出し及び書込み動作を制御し、各ページ要求は、最大でデータのスーパーページまでアクセスする。
【００５３】
図３のフラッシュ・グループ０内の読出しまたは書込み動作の制御フローは、それゆえ、次のように進む。ホスト１０１→ホスト・インタフェース３１０→コマンドパーサ・ブロック３１１→コマンド配布ブロック３１２→フラッシュＨＥＭｉ０ ３０７→フラッシュ・グループ０ ３０１。
【００５４】
データフローは、それとは異なって進む。読出しの場合、データは、フラッシュ・グループによって、接続されたフラッシュ・ポート内に含まれるフラッシュ・ステージバッファに戻される。例えば、フラッシュ・ステージバッファ０ ３０８はフラッシュ・グループ０ ３０１に接続され、フラッシュ・ステージバッファ１ ３１４はフラッシュ・グループ１ ３０２に接続され、フラッシュ・ステージバッファ７ ３１５はフラッシュ・グループ７ ３０３に接続されている。
【００５５】
フラッシュ・ステージバッファからは、フラッシュ・グループから得られたデータが、バス３１６を介してデータパスＤＲＡＭ１０７に書き込まれる。データパスＤＲＡＭ１０７からデータはホスト・インタフェース３１０を通過してホスト１０１に移動する。書込み動作は、逆方向に進む。ホスト１０１→ホスト・インタフェース３１０→データパスＤＲＡＭ１０７→フラッシュ・ステージバッファ０ ３０８→フラッシュ・グループ０ ３０１。制御フローとデータフローが異なる経路を辿るという事実は、図３の様々な構成要素を結び付けるラインによって説明される。それゆえ、フラッシュＨＥＭｉ群をフラッシュ・グループと結び付ける矢印は、これらの構成要素間の制御フローを象徴的に示すが、フラッシュ・グループをステージバッファと結び付ける矢印は、データフローを示す。
【００５６】
図３はまた、ＳＲＡＭコントローラ３１７及び共有ＲＡＭブロック３１８を示し、これらについてはそれぞれより詳細に後述する。一般に、共有ＲＡＭブロック３１８は、ＨＥＭｉ群によって用いられるメモリを含み、ＤＲＡＭコントローラ３１７は、データパスＤＲＡＭ１０７及び共有ＲＡＭブロック３１８を制御しかつそれら両リソースへのアクセスを調停するロジックを含む。
【００５７】
Ｄ．読出し及び書込みの概要
【００５８】
図４は、ＳＳＤコントローラ１０６によって処理される読出し動作の大まかなデータフローを示す。
【００５９】
ステップ４０１では、ホスト（例えばホスト１０１）が、データのＬＢＡを含む読出しコマンドを発行する。
【００６０】
ステップ４０２で、ＳＳＤコントローラ１０６が、フラッシュメモリ・モジュール１０８内の要求されたＬＢＡの位置を識別し、１若しくは複数の読出しコマンドをフラッシュメモリ・モジュールに発行する。
【００６１】
ステップ４０３で、フラッシュメモリ・モジュール１０８は、読出し動作を行い、データをＳＳＤコントローラ１０６に戻す。
【００６２】
ステップ４０４で、戻されたデータは、ＳＳＤコントローラ１０６を通ってデータパスＤＲＡＭ１０７にストアされる。
【００６３】
ステップ４０５で、ホスト１０１によって要求されたデータが全て得られたか否かを判定するためのチェックが行われる。否であれば（ステップ４０５の結果が「ｎｏ」）、追加のデータがフラッシュメモリモジュールから得られ、データパスＤＲＡＭにストアされるようにステップ４０３に制御を返す。
【００６４】
ホストによって要求された全てのデータがフラッシュメモリ・モジュールから得られ、データパスＤＲＡＭにストアされたら（ステップ４０５の結果が「ｙｅｓ」）、ステップ４０６で、データはデータパスＤＲＡＭ１０７から読み出され、ＳＳＤコントローラ１０６に送られる。
【００６５】
ステップ４０７で、データはＳＳＤコントローラ１０６からホスト１０１へ送信され、ホスト１０１による読出し動作が終了する。
【００６６】
図４は、大まかな概念的ステップを用いて読出し動作について説明していることを理解されたい。その詳細は、以下で説明する。
【００６７】
図５は、同様の大まかな概念的ステップを用いて書込み動作を説明しており、ここで、ホスト１０１は、メモリにデータをストアしようとしている。
【００６８】
ステップ５０１では、ホスト１０１が、ＬＢＡを有する書込みコマンドを発行し、ＳＳＤコントローラ１０６にデータを提供する。
【００６９】
ステップ５０２で、ＳＳＤコントローラ１０６が、データパスＤＲＡＭ１０７に書き込まれるデータをストアする。
【００７０】
ステップ５０３で、ＳＳＤコントローラ１０６は、フラッシュメモリ・モジュール１０８内のＬＢＡの位置を識別する。
【００７１】
ステップ５０４で、ＳＳＤコントローラ１０６は、ＬＢＡを含むスーパーページを読み出すのに十分なフラッシュメモリ・モジュール１０８への読出しコマンドを発行する。この読出しコマンドは、データをＤＲＡＭにストアせず、従って図４のステップ４０３から開始してステップ４０５まで、ステップ４０４をスキップして、全てのデータが受信されるまでこれら２つのステップをループする。
【００７２】
ステップ５０５で、データパスＤＲＡＭ１０７からのデータは、コントローラに転送され、フラッシュメモリ・モジュールから読み出されたデータと統合される。この統合の結果、コントローラが現在保持するスーパーページにおいて、当該ＬＢＡにストアされた古いデータが新しいデータによって上書きされたが、スーパーページ内の他の全てのＬＢＡは不変である。
【００７３】
ステップ５０６で、ＳＳＤコントローラ１０６はフラッシュメモリ・モジュール１０８へ書込みコマンドを発行する。
【００７４】
ステップ５０７で、フラッシュメモリ・モジュール１０８は、書込み動作を行う。
【００７５】
ステップ５０８で、全ての情報がフラッシュメモリ・モジュール１０８に書き込まれたか否かを判定するためのチェックが行われる。
【００７６】
追加の書込み動作が必要であれば（ステップ５０８の結果が「ｎｏ」）、ステップ５０７に制御を返す。
【００７７】
全てのデータがフラッシュメモリ・モジュール１０８に書き込まれたら（ステップ５０８の結果が「ｙｅｓ」）、ステップ５０９で、ＳＳＤコントローラ１０６は、書き込まれたＬＢＡのための位置情報を更新する。詳細に後述するように、フラッシュメモリの性質のため、書込み動作は、既存のスーパーページを物理的に上書きしないが、その代わりに更新されたスーパーページをフラッシュメモリ・モジュール１０８内の新しい位置に書込み、それによって、当該スーパーページ内にストアされているＬＢＡに関連付けられたアドレス翻訳情報の更新を要求する。
【００７８】
ここで、書込み動作は完了する。
【００７９】
ＩＩ．フラッシュメモリ・アーキテクチャ
【００８０】
Ａ．物理メモリ・アーキテクチャ
【００８１】
図６は、１つのフラッシュ・グループ（例えばフラッシュ・グループ０ ３０１）の構成及び、該グループとそれに関連するフラッシュ・ポート（例えばフラッシュ・ポート０ ３０４）との関係を示す。この構成の細部は、異なる各実施形態において異なり得ることを理解すべきである。
【００８２】
フラッシュ・グループ３０１は、６０１〜６０８で示される８つのフラッシュチップからなる。各フラッシュチップは２つのダイを含み、例えばフラッシュチップ６０１はダイ６０９及び６１０を含む。
【００８３】
一実施形態では、各ダイ（例えばダイ６０９）は、８２２４個のブロックからなる約１．１１ギガバイトの使用可能な容量を有する。各ブロックは６４ページから構成され、各ページは２２１２バイトからなる。システム及びスペアメモリスペースが減算された場合、１つのダイあたり約１ギガバイトまたは１つのＮＡＮＤフラッシュチップあたり２ギガバイトのユーザデータ容量が残される。１２のフラッシュ・グループを含み、１つのフラッシュ・グループあたり８つのバンクをを含んでいるシステムでは、約３８４ギガバイトの使用可能なユーザ・メモリスペースが提供されるが、幾つかのスペースは予備に当てられ、ＬＢＡアドレス・スペースに含まれないシステム機能がユーザに利用可能になるので、ユーザ・データのために使用可能なスペースの合計は約３００ギガバイトである。システムスペースは、ＳＣＳＩモードぺージなどの様々なタイプのシステム・メタデータをストアし、空きスペースも含む。
【００８４】
各々２つの１ギガバイトのダイを含んでいる２ギガバイトのＮＡＮＤフラッシュチップの使用は、最新の利用可能なフラッシュメモリ技術を反映するものである。このシステムは、１つのフラッシュメモリチップに４つのダイが含まれるかまたは１つのチップあたり１つのダイが含まれるような他のフラッシュメモリ・サイズ及び構成においても同様に良好に動作することができる。次世代型のＮＡＮＤフラッシュチップは１つのチップあたり４つのダイが組み込まれることとなるので、フラッシュ・グループ３０１はそのように構成することとする。本明細書で説明する原理は、４つのダイを含むチップに容易に適用可能である。例えば、４つのダイを含むチップにおける各ダイがそれ自体のＣＥ及びＲＢピンを有する場合、４つのダイ全ては共通のアドレス／コマンド／データピンを共有するが、各ダイは別個のバンクに組み込まれる。他方では、４つのダイを含むチップの各々が２つのＣＥ及びＲＢピンを有し、２つのダイが各ピンを共有する場合、ＳＳＤコントローラ１０６からは、共通のＣＳ及びＲＢピンを共有する２つのダイを、上述した単一のダイ（例えばダイ６０９）と区別することができないであろう。
【００８５】
現在の好適な実施形態はまた、各々２つの０．５ギガバイトのダイを含んでいる１ギガバイトのＮＡＮＤフラッシュチップにおいても同様に良好に動作することができる。この構成では、１つのダイあたり４１１２個のブロックしか含んでいない。この構成は、容量以外は、上述した構成と同様に動作する。
【００８６】
フラッシュメモリチップそれ自体は従来のデザインであり、図６に示した構成は、フラッシュメモリチップの内部設計の細部の説明は意図しておらず、チップの構成及びダイとシステムの残りの部分とのインタフェースの様態の理解を可能にするためのものであることに留意されたい。
【００８７】
フラッシュ・グループ３０１は、各バンクが４つのダイから構成される４つのバンク（６１１、６１２、６１３及び６１４）に分割される。従って、バンク６１１は、フラッシュメモリ６０１のダイ６０９と、フラッシュメモリ６０２のダイ６１５と、フラッシュメモリ６０３のダイ６１６と、フラッシュメモリ６０４のダイ６１７とから構成される。
また、バンク６１２は、フラッシュメモリ６０１のダイ６１０と、フラッシュメモリ６０２のダイ６１８と、フラッシュメモリ６０３のダイ６１９と、フラッシュメモリ６０４のダイ６２０とから構成される。バンク６１３及び６１４も、他のフラッシュメモリ及びダイの間で同様に構成される。
【００８８】
図６は４つのバンクを示す。現在の好適な実施形態では、ユーザが所望する容量に応じて、各フラッシュ・グループは４ないし８つのバンクを含んでいる。
【００８９】
図７は、フラッシュメモリ・モジュール１０８、ＳＳＤコントローラ１０６及びデータパスＤＲＡＭ１０７の間の相互接続に関するさらなる詳細を提供する。図７はフラッシュ・グループ０ ３０１及びフラッシュ・ポート０ ３０４を示すが、同様の相互接続が、全てのフラッシュ・グループとそれらに関連するフラッシュ・ポート及びデータパスＤＲＡＭ１０７との間で存在する。
【００９０】
図７に示すように、フラッシュ・グループ０ ３０１は、２つのバス、フラッシュバス７０１及びＣＳ／ＲＢバス７０２によって、フラッシュ・ポート０ ３０４に接続されている。
【００９１】
ＣＳ／ＲＢバス７０２は、フラッシュＨＥＭｉ３０７をフラッシュ・グループ３０１の各バンクに接続する別個の複数のラインからなる。４つのバンクを有する図示した実施形態では、ＣＳ／ＲＢバス７０２は、フラッシュＨＥＭｉ３０７をバンク６１４に接続するライン７０３と、フラッシュＨＥＭｉ３０７をバンク６１３に接続するライン７０４と、フラッシュＨＥＭｉ３０７をバンク６１２に接続するライン７０５と、フラッシュＨＥＭｉ３０７をバンク６１１に接続するライン７０６との４つのラインからなる。多数（例えば８つ）のバンクを含む実施形態では、ＣＳ／ＲＢバス７０２は、バンクの数に応じた多数の信号から構成されることとなる。フラッシュＨＥＭｉ３０７からの信号がＳＳＤコントローラ１０６上のピンを介して送信されることも理解すべきである。図７は、送信経路の物理的な詳細を示すことは意図しておらず、データ及び制御信号の流れを示すことを意図している。
【００９２】
ＣＳ／ＲＢバス７０２の各ラインは、レディ・ビジー（「ＲＢ」）信号をフラッシュ・グループ３０１からフラッシュＨＥＭｉ３０７へ送信するとともに、チップセレクト（「ＣＳ」）信号をフラッシュＨＥＭｉ３０７からフラッシュ・グループ３０１へ送信する。
【００９３】
ＣＳ／ＲＢバス７０２へ送信された複数のＣＳ信号のうちの１つの信号だけが、所定の時間でアクティブとなる。現在アクティブなＣＳ信号に接続されているバンクがフラッシュバス７０１に接続され、他の全てのバンクはそのバスからは切断される（繰り返すが、これは、物理的概念ではなく論理的概念である。実施に応じて、「接続された」バンクはフラッシュ・バスと通信するが、フラッシュ・バスと全てのバンクとの間に物理的な接続が存在する場合でも、他の全てのバンクがそのフラッシュ・バスを無視するように構成される）。
【００９４】
フラッシュＨＥＭｉ３０７からのアドレス及び制御情報は、フラッシュバス７０１を介して各バンクへ送信される。アドレス及び制御情報には、制御信号７０８（図８を参照して後述する）と、アドレス／コマンド信号７０９（図９を参照して後述する）とが含まれる。同様に、バス７０７は、フラッシュ・ステージバッファ３０８をフラッシュバス７０１へ接続する。データは、ステージバッファ３０８から、バス７０７及びフラッシュバス７０１を介してバンクへ送信される。また、データは、バンクからステージバッファ３０８への逆方向にも送信される。
【００９５】
図７にさらに示すように、データパスＤＲＡＭ１０７が、ステージバッファ３０８に接続されている。従って、データパスＤＲＡＭ１０７からステージバッファ３０８へデータが送信され、その後、現在アクティブなＣＳ信号を有するバンクへバス７０１を介して送信される。フラッシュ・グループ３０１からのデータは、逆方向の経路を通ってデータパスＤＲＡＭ１０７へ送信される。
【００９６】
図８は、単一のフラッシュメモリチップ（例えば、ダイ６０９及び６１０を有するフラッシュチップ６０１）のピン配列の一部を示す。好適実施形態では、フラッシュチップは、標準的なＮＡＮＤフラッシュ・インタフェースを使用する。標準的なＮＡＮＤフラッシュ・インタフェースの要部は、典型的には、８ビットのアドレス／データ（８０１）と、４ビットの制御信号７０８（アドレス・ラッチ・イネーブル（「ＡＬＥ」）信号８０２、コマンド・ラッチ・イネーブル（「ＣＬＥ」）信号８０３、ライト・イネーブル（「ＷＥ」）信号８０４及びリード・イネーブル（「ＲＥ」）信号８０５）と、ダイ１つあたり１本のチップ・イネーブル・ピン（コントローラからのＣＳ信号に接続され、チップ・イネーブル及びチップセレクトの指定が時々相互互換的に使用されることとなる）と、ダイ１つあたり１つのレディ・ビジー・ラインとから構成される。図示のように、Ａ／Ｄ信号８０１及び制御信号７０８（ＡＬＥ、ＣＬＥ、ＷＥ及びＲＥ信号）は全て、フラッシュバス７０１に接続されているが、これらの信号だけがフラッシュバス７０１に接続されてるわけではない。
【００９７】
図８に示すように、ＡＬＥ、ＣＬＥ、ＷＥ、ＲＥ信号及び両ＣＥ（チップ・イネーブル）信号は、フラッシュメモリ６０１に入力される。Ａ／Ｄバス８０１は、８つの双方向信号で構成されている。両ＲＢ信号は、出力信号である。
【００９８】
図８に示した全ての信号は、２つのＣＥ信号及び２つのＲＢ信号以外は、両ダイによって共有される。従って、８本のＡ／Ｄピン８０１が、ダイ６０９及び６１０によって共有される。図６の説明から理解することができるように、両ダイ（ダイ６０９及び６１０）は互いに異なるバンクに含まれている。このため、いかなる場合でも前記信号が１つ以上のバンクで同時にアクティブになることはないので、ピンを共有しても混乱は生じない。
【００９９】
典型的なフラッシュメモリでは、各ダイは、対応するダイに書き込まれるまたは対応するダイから読み出された１ぺージのデータを保持することができる、関連付けられたフラッシュページ・バッファを有する。図８では、フラッシュページ・バッファとして、ページ・バッファ８０６及び８０７が示されている。
【０１００】
図９は、フラッシュメモリ・ポート（例えばフラッシュメモリ・ポート０ ３０４）に用いられるフラッシュＨＥＭｉ（例えばフラッシュＨＥＭｉ３０７）の出力信号の一部を示している。フラッシュＨＥＭｉ３０７はまた、他の機能に用いられるさらなる入力及び出力も有することを理解されたい。上述したように、フラッシュＨＥＭｉ３０７をフラッシュ・グループに接続する信号は、ＳＳＤコントローラ１０６のピンを介して送信される。それらのピンも、ルーティングを処理するロジックも図示しない。信号のルーティングを示す他の図においてもそうだが、図９は、概念を示すことを意図しており、実際の物理的なレイアウトの詳細を示すことは意図していない。
【０１０１】
フラッシュＨＥＭｉ３０７のインタフェースのこの部分は、以下の機能に用いられる信号から構成される。
【０１０２】
１．ＡＬＥ信号８０２、ＣＬＥ信号８０３、ＷＥ信号８０４及びＲＥ信号８０５の４つの制御ラインから構成される制御信号７０８。これらの信号は、フラッシュＨＥＭｉ３０７からの出力である。
【０１０３】
２．ＣＳ／ＲＢライン７０３〜７０６から構成されるＣＳ／ＲＢバス７０２。上述したように、各フラッシュＨＥＭｉは、接続された１つのＣＳ／ＲＢラインあたり、１つのフラッシュメモリ・バンクを制御することができる。従って、図９に示した実施形態では、フラッシュＨＥＭｉ３０７は４つのフラッシュメモリ・バンク（例えば、図６に示したバンク６１１、６１２、６１３、６１４）を制御することができる。１つのフラッシュ・グループあたり８つのバンクを含むシステムでは、各フラッシュＨＥＭｉは、この目的に用いられる８つの信号を有することとなる（追加の４つの信号が実際に使用されなくても、ロジックは追加の４つの信号をサポートする必要があることに留意されたい）。
【０１０４】
ＣＳ／ＲＢバス７０２は、ＣＳ信号をＨＥＭｉ３０７からフラッシュバンクへ送信するとともに、ＲＢ信号をフラッシュバンクからＨＥＭｉ３０７へ送信する。信号はこのようにして多重化されるので、各ラインは、一度に一種類の信号のみを送信し得る。ＣＳ／ＲＢ信号は「ワン・ホット」信号であるので、それらの信号のうちの１つだけを所定の時間にアクティブにすることができる。
【０１０５】
同一の信号をＣＳ及びＲＢの両方の目的に使用すると、ＳＳＤコントローラ１０６のピンが節約されるので、ＳＳＤコントローラのコスト及び複雑さを減少させることができる。しかし、この場合、各バンクに１つのＲＢ信号つまり１本のピンが必要となるので、フラッシュＨＥＭｉ３０７で制御することができるバンクの数が制限される。現在の実施形態では、ＳＳＤコントローラ１０６は各フラッシュ・ポートあたり８本のＣＳ／ＲＢピンを有するので、各フラッシュＨＥＭｉは最大で８つのバンクを制御することができる。
【０１０６】
３．アドレス／コマンド信号７０９を構成する３１個の信号。このバスは、フラッシュバス７０１に接続され、フラッシュメモリチップと同一の４０ＭＨｚの速度で実行され、アドレス及びコマンドをフラッシュＨＥＭｉ０ ３０７からフラッシュ・グループ０ ３０１へ送信する。アドレス／コマンド信号７０９は、各々が８ビットのペイロードをフラッシュメモリ・バンクの個別のダイへ送達する４つの個別の８ビットのバス（ライン０〜７、８〜１５、１６〜２３及び２４〜３１からなる）と考えることができる。従って、アドレス／コマンドバス７０９からの８つのラインは、図８に示すＡ／Ｄ信号８０１に接続する。
【０１０７】
以上の説明から明らかなように、ＳＳＤコントローラ１０６の４４本のピンは、各フラッシュ・ポートに用いられる（図９では４つの信号のみが示されているが、各フラッシュ・ポートは最大で８つのバンクをサポートすることができ、それ故に８本のＣＳ／ＲＢピンが必要であることに留意されたい）。ＳＳＤコントローラ１０６は最大で１２のフラッシュ・ポートをサポートすることができるので、ＳＳＤコントローラ１０６の５２８本のピンがフラッシュ・インタフェースに用いられるが、１２よりも少ない数のフラッシュ・ポートが使用される場合は前記ピンのうちの幾つかは接続されない。別個のＣＳ及びＲＢピンが必要とされる場合、フラッシュ・インタフェースはさらなる９６本のピンを必要とすることに留意されたい（１バンク当たり１本のピン×８個のバンク×１２個のフラッシュ・ポート）。ＣＳ及びＲＢ信号を単一のピン上に多重化すると、必要とされるピンの数を大幅に節約することができる。
【０１０８】
図９に示す実施形態が現在は好ましいが、様々な別の実施形態も可能である。別の実施形態では、特定のフラッシュ・グループに現在用いられている８本のＣＳ／ＲＢピンが、フラッシュ・グループ内に設けられたＭＵＸ（多重化装置）または他の同様のロジック装置に接続される。ＭＵＸは、或るバンクの全てのフラッシュ・ダイのＣＥ入力に接続される１組の出力信号を有し、各信号は、選択すべき特定のバンクのＣＥ入力を発生させる。ＳＳＤコントローラの８本のＣＳ／ＲＢピンは２５６の個別の状態を送信可能なので、理論的には、２５６の可能性のある入力状態のそれぞれについて互いに異なる出力ラインに沿って信号を生成するようにＭＵＸまたは他のロジック回路を設計することにより、それらのピンを使用して２５６の別個のバンクのうちから選択するようにすることが可能であり得る。しかし、現在の実施形態では、全てのバンクが同一のＡ／Ｄバスを共有しているので、そのような多数のバンクを追加する利益はほとんどないであろう。代わりに、より望ましい実施形態では、そのようなＭＵＸまたは他の同様のロジック回路は、適切な数（例えば８）のバンクを追加するためか、または、１バンクあたりのＣＳ／ＲＢピンの数を減らす（例えば８から４へ減らす）ために使用される。
【０１０９】
この代替実施形態では、ＣＳ／ＲＢピンの数はバンクの数よりも少ないので、ＣＳ／ＲＢピンはもはや各バンクについてＲＢ信号を処理することができないことに留意されたい。そのため、この実施形態では、ＳＳＤコントローラのＣＳ／ＲＢピンはもはやＲＢ入力を処理できない。しかし、標準的なフラッシュチップはソフトウエアのみによるＲＢ状態の状態チェックをサポートするので、各フレッシュＨＥＭｉはＡ／Ｄバスを使用してバンクのＲＢ状態をチェックすることができる。
【０１１０】
従って、この代替実施形態では、ＳＳＤコントローラ１０６は、フラッシュメモリ・インタフェースのために少数のピンを用いるか、または、幾つかのロジック回路を追加する必要があるためシステムが複雑化するが多数のバンクをそれと同一数のピンを用いてサポートする。
【０１１１】
図１０は、ある単一のバンクに含まれる複数のダイ（例えばバンク６１１に含まれるダイ６０９、６１５、６１６及び６１７）の互いの接続、及び前記ダイのそれに関連するフラッシュ・ポート（例えば、フラッシュＨＥＭｉ３０７及びステージバッファ３０８を含むフラッシュ・ポート０ ３０４）への接続の様態を示す。
【０１１２】
図６に示すように、ダイ６０９はフラッシュチップ６０１の２つのダイのうちの１つであり、ダイ６１５はフラッシュチップ６０２の２つのダイのうちの１つであり、ダイ６１６はフラッシュチップ６０３の２つのダイのうちの１つであり、ダイ６１７はフラッシュチップ６０４の２つのダイのうちの１つである。図示を簡単にするために、図１０では、各フラッシュチップの２つのダイのうちの１つだけの図示する（上述したように、メモリ・モジュール１０８には、各々４つ（またはそれ以上）のダイを有するフラッシュチップが組み込まれ得るが、本明細書において開示した設計の原理は同じままである）。
【０１１３】
図示のように、ライン７０６は、フラッシュＨＥＭｉ３０７とバンク６１１との間のＣＳ／ＲＢ信号インタフェースを構成する。ライン７０６は、ＣＳ信号をフラッシュＨＥＭｉ３０７からバンク６１１へ送信し、ＲＢ信号をバンク６１１からフラッシュＨＥＭｉ３０７へ送信する。図１０では、このことを、フラッシュＨＥＭｉ３０７とライン７０６上のポイント１００１との間を結ぶ両方向を指す矢印により示している。ポイント１００１からは、信号経路は分岐し、入力としてのＣＳ信号をダイへ送信し（各ダイに入る「ＣＳ」と表示された矢印により示される）、出力としてのＲＢ信号を各ダイから送信する（各ダイから出る「ＲＢ」と表示された矢印により示される）ことを理解されたい。ポイント１００１は例示的なものであり、ポイント１００１も図１０の残りの部分も、物理的実施の忠実な図示は意図していないことを理解されたい。
【０１１４】
図示のように、バンク６１１に含まれる４つのダイのうちのいずれか１つが「ビジー」と出力した場合にバンク６１１からＨＥＭｉ３０７へライン７０６を介してビジー信号が送信されるように、バンク６１１の各ダイからのＲＢ出力信号は論理的には一緒に実行される（あるいは、同様に組み合わせられる）。ライン７０６はまた、ＣＳ信号をフラッシュＨＥＭｉ３０７からバンク６１１の各ダイへ送信することもできる。バンクに用いられるＣＳ信号がフラッシュＨＥＭｉ３０７により設定された場合、その信号はバンクの各ダイのＣＥピンへ同時へ送信され、それにより、各ダイが同時に選択される。
【０１１５】
図１０はまた、フラッシュチップ６０１〜６０４のＡ／Ｄピンと、ＨＥＭｉ３０７のアドレス／コマンド信号との間の接続を表すアドレス／コマンドバス７０９も示す。図示のように、３２ビットのバス７０９は、フラッシュＨＥＭｉ３０７からバススイッチ１００２へ信号を送信する。バススイッチ１００２は、上述したようにして信号の多重化、分割及び送信を行うロジック回路を表し、必ずしも単一の物理的スイッチを構成する必要はない。
【０１１６】
バススイッチ１００２は、バス７０９からサブバスへ信号を分割する。信号０〜７は、８ビットのバス８０１（図８にも示されている）を使用してフラッシュチップ６０１のＡ／Ｄピンへ送信され、信号８〜１５は８ビットのバス１００３を使用してフラッシュチップ６０２のＡ／Ｄピンへ送信され、信号１６〜２３は８ビットのバス１００４を使用してフラッシュチップ６０３のＡ／Ｄピンへ送信され、信号２４〜３１は８ビットのバス１００５を使用してフラッシュチップ６０４のＡ／Ｄピンへ送信される。Ａ／Ｄピンは、フラッシュチップ・ピンへ送信された信号がフラッシュチップの内部デザインに特異的な方法によって適切なダイに受け取られるように、フラッシュチップの両方のダイによって共有されることに留意されたい。
【０１１７】
図１０はまた、フラッシュＨＥＭｉ３０７の制御信号７０８と各ダイとの間の接続を示す。上述したように、これらの制御信号はＡＬＥ、ＣＬＥ、ＲＥ及びＷＥからなり、フラッシュＨＥＭｉ３０７からフラッシュ・ダイへ送信される。制御信号７０８は、フラッシュＨＥＭｉ３０７からバススイッチ１００２へ送信される。バススイッチ１００２からは、制御信号の同一の組み合わせ（いずれの場合も７０８で示される）が、各フラッシュメモリ・チップへ送信される。Ａ／Ｄピンと同様に、ＡＬＥ、ＣＬＥ、ＲＥ及びＷＥの各ピンは、各フラッシュメモリ・チップにおける両ダイに共有される。
【０１１８】
図１０はまた、３２ビットのバス７０７によってバススイッチ１００２に接続されているフラッシュ・ステージバッファ３０８を示す。バス７０９とは異なり、バス７０７は双方向性なので、データを両方の方向へ送信する。
【０１１９】
ステージバッファ３０８とダイとの間の送信は、ステージバッファＤＭＡコントローラ１００６の制御下で行われる。
【０１２０】
フラッシュ・ステージバッファ３０８はまた、フラッシュチップのＲＥ及びＷＥ入力に接続されていることに留意されたい。そのような接続は、明瞭さのために図示しないが、ＤＭＡの動作を制御するために用いられる。
【０１２１】
バススイッチ１００２は、バス７０７からの信号を４組の８ビット信号に分割し、分割された信号を８ビットのバス８０１、１００３、１００４及び１００５を使用してダイ６０９、６１５、６１６及び６１７へ送信する。同様に、バススイッチ１００２は、８ビットのバス８０１、１００３、１００４及び１００５を介してダイ６０９、６１５、６１６及び６１７からデータを受信し、その後、完全な３２ビット値の信号をバス７０７を介してステージバッファ３０８へ送信する。
【０１２２】
このように、スイッチ１００２は、フラッシュＨＥＭｉ３０７からの信号及び、同一の８ビットのバスを介してステージバッファ３０８との間で送受信される信号を多重化する。スイッチ１００２は、読出しまたは書込みサイクルの特定の段階に応じて、どの信号の組を８ビットのバスを介して送信するか決定する。前記サイクルの或る段階の間は、フラッシュＨＥＭｉ３０７からのアドレス情報はダイに接続されるが、前記サイクルの別の段階の間は、ステージバッファ３０８からのまたはステージバッファ３０８へのデータは８ビットのバスに接続される（繰り返すが、スイッチ１００２は、概念的なものであり、単一の専用スイッチを構成する必要はない。加えて、スイッチ１００２に関連して説明した機能的な側面は、その他の論理ブロックに見ることもできる）。
【０１２３】
図１０では、１つのフラッシュメモリ・バンク６１１のみを示している。実際の実施形態では、バススイッチ１００２は、フラッシュ・グループの各フラッシュメモリ・バンクとインタフェースすることとなる。各インタフェースでは、上述したようにバンク６１１に特異的な信号７０６以外は、図１０に示すようにバススイッチ１００２からバンク６１１へ出力される信号は全て複製されることとなる。また、上述したように、フラッシュメモリ・スイッチ１００２は、バス７０７、７０８及び７０９を各フラッシュバンクへ接続するが、フラッシュＨＥＭｉ３０７からの現在アクティブなＣＳ信号に関連するバンクのみが応答性を有する。
【０１２４】
フラッシュバス７０１は、バス７０８、８０１、１００３、１００４及び１００５を含むことに留意されたい。
【０１２５】
図１１は、ライン７０６に関連するＣＳ及びＲＢロジックの詳細を示す。図示のように、ＳＳＤコントローラ ＣＳ／ＲＢピン１１０１は、フラッシュ・ダイ６０９及び６１５に関連するＲＢ及びＣＥピンに接続される。図６に関連して上述したように、ダイ６０９及び６１５は、バンク６１１に含まれる４つのダイのうちの２つである。例示の目的で、バンク６１１の他の２つのダイは図示しないが、それらはダイ６０９及び６１５と同様の様態で接続されている。
【０１２６】
ＳＳＤコントローラ１０６は、バンク６１１を選択すべくＣＳ／ＲＢピン１１０１をハイで駆動する。この信号は、インバータ１１０２によって反転され、バンク６１１のダイのＣＥピンによりローで受信される。こららのピンは、アクティブ・ローである。
【０１２７】
コントローラが、同じフラッシュ・グループハイにおける別の１つのＣＳピンを駆動したした場合に、ＣＳ／ＲＢピン１１０１はＳＳＤコントローラ１０６によりローで駆動される（このことにより、フラッシュ・グループにおける別のバンクが選択される）。
【０１２８】
フラッシュＨＥＭｉ３０７がバンク６１１のレディ・ビジー状態を読み出したい場合、ＳＳＤコントローラ１０６はＣＳ／ＲＢピン１１０１をフロートさせる。フラッシュ・ダイＲＢピンのいずれかがバンクがビジーであることを示すロー信号を駆動した場合、ダイＲＢピンのいずれかのロー出力はプルアップ１１０３をオーバーライドすることとなるので、ＳＳＤコントローラによりＣＳ／ＲＢピンがフロートさせられるとＣＳ／ＲＢピンはロー入力を受け取ることとなる。他方では、バンクがレディ状態の場合、フラッシュ・ダイはＲＢピンをフロートさせる。プルアップ１１０３はＲＢピンに接続されているので、ＲＢピンの全てをフロートさせた場合及び、ＣＳ／ＲＢピン１１０１がフロートされた場合、前記ピンはバンクがレディであることを示すハイ入力信号を受信する。
【０１２９】
従って、レディ信号がＣＳ／ＲＢピン１１０１により受信されるようにするために全てのピンをレディ状態（フロート状態）にする必要があるので、この回路がピンのビジー状態を効果的にＯＲ接続されるようにこの回路はバンクのＲ／ＢピンをＯＲ構成で互いに接続する。インバータ１１０２の使用することにより、バンクのＣＥピンがアクティブ・ローの場合であっても、バンクを選択するためにＳＳＤコントローラ１０６をＣＳ信号ハイで駆動することが可能となる。入力されるＲＢ信号をオーバーライドするためにはＣＳ信号がハイで駆動されなければならないので、このことは必要である。このようにして、ＳＳＤコントローラ１０６へのＲＢ入力をアクティブ・ハイにすることができる。また、ハイＣＳ出力はプルアップ１１０３で生成されたハイＲＢ出力をオーバーライドするので、ＣＳ／ＲＢピン１１０１においてハイ出力で依然としてオーバータイドされることができる。
【０１３０】
Ｂ．ロジカル・メモリ・アーキテクチャ
【０１３１】
１０１及び１０２などのホストは、典型的には、ロジック・ブロック・アドレスすなわち「ＬＢＡ」を単位としてメモリを編成する。ホストがデータをマス・ストレージに書き込んだとき、ホストは典型的には書込みコマンド及びＬＢＡを含むＣＤＢを送信する。なお、ホスト通信の詳細は、ホストに使用される特定のプロトコルに応じて変更される。ホストがその後にデータの読出しを望む場合、同じＬＢＡを用いて読出しコマンドを発する。
【０１３２】
典型的には、ホストのメモリ・アーキテクチャは、データを何百万ものＬＢＡに分割する。各ＬＢＡには、ＬＢＡ０から始まる連番が付けられる。当業者にはよく知られているように、ホストは多数のマス・ストレージ コントローラと頻繁に通信し、ホストの全ＬＢＡ範囲のサブセットを各コントローラに割り当てる。現在の実施形態では、ＳＳＤコントローラ１０６は、ＬＢＡ０から始まりコントローラによりアドレス可能な最大連番数のＬＢＡで終わるＬＢＡ範囲に応答する。そのＬＢＡシーケンスをより大きいホストＬＢＡアドレス・スペースへマッピングすることにはホストまたはホスト・バス・アダプタが関与し、ＳＳＤコントローラ１０６には透明である。
【０１３３】
図１２は、好適実施形態におけるフラッシュメモリ・モジュール１０８で用いられるメモリ階層を示す。
【０１３４】
各フラッシュ・グループは多数のバンク（例えばバンク６１１）から構成されている。各バンクは、ブロック０〜ブロックｎ（例えばブロック０ １２０１）と表される多数のブロックから成る。フラッシュメモリシステムでは一般的なように、ブロックは、１回の動作で消去可能なフラッシュメモリのセグメントを表す。
【０１３５】
バンクに含まれるブロックの正確な数は、実施依存的である。一例を挙げれば、３００ギガバイトの利用可能なユーザデータを提供するシステムでは、１バンクあたりのブロックの数は、通常は７，０００〜９，０００個の範囲であり、欠陥マネジメントや空きスペースとして確保されるメモリ量などの様々な要素に左右される。
【０１３６】
図１２に示すように、各ブロックは、スーパーページ０〜６３と表される６４個のスーパーページからなる。前述したように、各スーパーページは、４つのフラッシュページからなる（例えば、スーパーページ３０は、ページ３０ １２０２、ページ３０ １２０３、ページ３０ １２０４及びページ３０ １２０５からなる）。ページ１２０２、１２０３、１２０４及び１２０５は、同じフラッシュバンクの４つの互いに異なるフラッシュメモリ・ダイの同じアドレス位置にストアされている。従って、スーパーページ３０は、４つの別個のダイに散在している。フラッシュメモリシステムでは標準的なように、各ページは、読出しまたは書込み可能なフラッシュメモリの最小インクリメントを表す。
【０１３７】
図１２に示すように、各スーパーページは、ページセクタ（Ｐセクタ）として知られている１５個のメモリ・セグメント（ページセクタ０〜１４と表される）をストアする。
【０１３８】
図１２はまた、さらなるメモリ構造：Ｓペーシセクタ０ １２０６を示す。図示のように、Ｓページセクタ０は４つのＰセクタ０からなる。各スーパーページは１つのＳページセクタを有する。
【０１３９】
Ｓページセクタ０は一般的にクラッシク・マス・ストレージ・セクタに相当するが、同一バンクの互いに異なるダイの同一アドレスに各々ストアされている４つのＰセクタに物理的に散在している。
【０１４０】
好適実施形態はまた、図１２には図示しない追加的なメモリ構造であるフラッシュ・グループの各バンクの同一ブロック（例えばフラッシュ・グループのスーパーブロック０のブロック０ １２０１）から構成されるスーパーブロックも使用する。
【０１４１】
望ましい実施形態では、特定のＬＢＡに関連するデータ及びメタデータは、単一のＳページセクタ（例えばＳページセクタ１２０６）にストアされ、本明細書においては、セクタ・データ及びセクタ・メタデータから構成されるセクタ・コンテンツと呼ばれる。
【０１４２】
図１３は、スーパーページ・セクタ（例えば、Ｓページセクタ１２０６）の構成を示す。Ｓページセクタ全体は、フラッシュメモリ内の５５６バイトからなる。各Ｓページセクタは、４つのＰセクタに分けられ、各Ｐセクタは１３９バイトからなり、互いに異なるフラッシュ・ダイ上にある。
【０１４３】
図示したこの例では、５２８バイトのＳページセクタ１２０６は、セクタ・データ・フィールド１３０１として示されるデータに割り当てられる。使用するプロトコルに応じて、互いに異なるホスト・プロトコルは互いに異なる量のデータを１つのアドレスに関連付ける。セクタ・データ・フィールド１３０１は５１２バイトであり得る。
【０１４４】
図１３に示すように、好適実施形態では、各Ｓページセクタはまた８バイトのエンド・ツー・エンド（「Ｅ２Ｅ」）情報（フィールド１３０２）及び２０バイトのＥＣＣ情報（フィールド１３０３）を含む。これらのフィールドは、セクタ・メタデータを集合的に構成する。
【０１４５】
Ｅ２Ｅ情報は、より新しいバージョンのＳＣＳＩプロトコルによって指定される。この情報は、データを追跡し、マス・ストレージ・デバイスから戻ったデータが要求されたデータと一致（マッチ）することを確実にするために、イニシエータにより使用することができる。ＥＣＣ情報は、誤り訂正の目的のために使用される。
【０１４６】
Ｅ２Ｅフィールド１３０２は、Ｒｅｆタグ・フィールド１３０４、Ａｐｐタグ・フィールド１３０５及びＣＲＣフィールド１３０６にさらに分割される。
【０１４７】
Ｒｅｆタグ・フィールド１３０４は４バイトからなり、イニシエータによりセクタ・データに関連付けられたアドレスを含む。Ｒｅｆタグのサポートは、ＳＣＳＩプロトコルからは要求されないので（そして、プロトコルの旧バーションの一部でないので）、イニシエータはＲｅｆタグを使用しても使用しなくてもよい。イニシエータがＲｅｆタグを使用しない場合、Ｒｅｆタグ・フィールド１３０４に関連する値は、セクタコンテンツの最初の書込みをトリガーしたＣＤＢから取得される。典型的には、この値はＬＢＡと同一であるが、イニシエータが別のＲｅｆタグを割り当ててもよい。同一の書込みにおけるそれに続く各セクタのＲｅｆタグ値がインクリメントするように、または、単一の書込みに関連する全てのセクタに対して単一のＲｅｆタグ値が割り当てられるように、イニシエータにより選択される。インクリメントさせる方法が選択された場合、ＳＳＤコントローラ１０６はその作業を初期Ｒｅｆタグ値及び受け取ったセクターの番号に基づいて行う。
【０１４８】
イニシエータがＲｅｆタグの使用をサポートしない場合、ＳＳＤコントローラ１０６はＲｅｆタグ・フィールド１３０４をＬＢＡアドレスで満たす。このフィールドは、イニシエータがＲｅｆタグの使用を要求するか否かに関わらず、内部エラーチェックの目的でＳＳＤコントローラ１０６に使用される。
【０１４９】
Ｒｅｆタグ・フィールド１３０４にストアされた値は、このＳページセクタに割り当てられた任意のＬＢＡへのその後の読出しまたは書込みを引き起こす任意のＣＤＢのＲｅｆタグ値に一致すべきである（イニシエータによりＲｅｆタグが割り当てられなかった場合は、Ｒｅｆタグ値はＣＤＢに基づいてＬＢＡに一致すべきである）。２つの値が一致しない場合は、受け取ったＲｅｆタグにおける誤り、Ｒｅｆタグ・フィールド１３０４におけるデータ破損、または、Ｓページセクタ１２０６を読出しまたは書込みのための適切なターゲットとして選択するためにＳＳＤコントローラ１０６によって使用されるアドレス翻訳テーブルにおける問題によって生じた何らかのエラーを示す。そのような状態が検出された場合、ホストに対して、トランザクション失敗を示す適切なＳＣＳＩ検知コードの発行（または、使用されるプロトコルに応じたその他の同様の通信）がなされる。
【０１５０】
Ａｐｐタグ・フィールド１３０５は２バイトからなり、関連するセクタ・データにより作られた特定の用途に関するイニシエータ特異的情報のために使用される。Ａｐｐタグ情報はＳＣＳＩプロトコルによってサポートされるが、このことは必須ではない。この情報がイニシエータによって供給されない場合、Ａｐｐタグ・フィールド１３０５には、Ａｐｐタグの使用をサポートするイニシエータにより割り当てられた任意の有効なＡｐｐタグ値をオーバーラップしないように選択されたデフォルト値が満たされる。
【０１５１】
Ｒｅｆタグ値と同様に、フラッシュメモリから受信したデータについてのＡｐｐタグ情報は、エラーを示す不一致によって、読出しコマンドの一部としてイニシエータによって供給されたＡｐｐタグに対してチェックすることができる。
【０１５２】
ＣＲＣフィールド１３０６は２バイトからなり、前記データとＳページセクタ１２０６にストアされているメタデータとの整合性をチェックするのに使用される巡回冗長検査（「ＣＲＣ」）データを含む。Ｒｅｆタグ及びＡｐｐタグ情報と同様に、ＣＲＣタグは、前記データ及びメタデータが正しいか否かを判断するために、イニシエータから受け取った値に対してチェックすることができる。
【０１５３】
ＳＣＳＩプロトコルは、イニシエータが３つのＥ２Ｅ値のいずれかまたは全てのチェックを要求することを可能とする。
【０１５４】
ＥＣＣフィールド１３０３は、ＬＢＡデータ及びセクタ・メタデータのエラーを訂正するために使用することができる誤り訂正符号（「ＥＣＣ」）情報を含む。好適実施形態に使用されるＥＣＣのチェックは、図３１に関連して後述する。
【０１５５】
図１２に戻り、好適実施形態では、各ページ（例えばページ１２０２）は２２１２バイトのフラッシュメモリスペースからなり、１５個のＰセクタ（いずれの場合もＰセクタ０〜１４と表される）と、それに加えてメタデータ（図示せず）を含む。
【０１５６】
好適実施形態では、Ｓページセクタを構成する４つのＰセクタの各々は、そのＳページセクタにストアされるセクタコンテンツの４分の１をストアする。そのデータは、バイトインタリーブに基づいて、Ｐセクタに割り当てられる。従って、セクタコンテンツの第１のダブルワードの最初のバイトはページ１２０２のＰセクタ０の最初のバイトに書き込まれ、第１のダブルワードの２番目のバイトはページ１２０３のＰセクタ０の最初のバイトに書き込まれ、第１のダブルワードの３番目のバイトはページ１２０４のＰセクタ０の最初のバイトに書き込まれ、第１のダブルワードの４番目のバイトはページ１２０５のＰセクタ０の最初のバイトに書き込まれ、第２のダブルワードの最初のバイトはページ１２０２のＰセクタ０の２番目のバイトに書き込まれる。
【０１５７】
この説明から理解できるように、Ｓページセクタ０にストアされたセクタコンテンツは、４つのＰセクタ０の間に散在する。従って、４つのページの各ページは、セクタコンテンツの４分の１、すなわち１３９バイト（５５６／４）をストアする。
【０１５８】
図１４は、フラッシュページ１２０２をさらに詳細に示し、図１２に図示しなかった要素を図示する。典型的なフラッシュ・アーキテクチャでは、フラッシュページは、２０４８バイトのデータ及び／またはメタデータと、他の目的に使用されるさらなる６４バイトの「スペア」バイトとからなり、合計で最大２１１２バイトとなる。他方では、好適実施形態では、各ページは２１１２バイトからなるが、そのうちの２０８５バイトはセクタコンテンツ（１５×１３９）のために使用され、残りの２７バイトがスーパーページに関連するメタデータをストアする。図１４は、２０８５バイトからなるＰセクタ０〜１４と、１フラッシュページ当たり２７バイトからなるスーパーページ・メタデータ１４０１とを示す。Ｐセクタの場合と同様に、スーパーページ・メタデータ・フィールド１４０１がスーパーページに関連するメタデータの４分の１をストアするように、スーパーページ・メタデータはスーパーページを構成する４つのフラッシュページの全てに渡って散在する。
【０１５９】
スーパーページ・メタデータ１４０１は、Ｓページインデックス１４０２とタイムスタンプ１４０３からなる。Ｓページインデックス１４０２は、「フォワード・テーブル（Forward Table）」として知られているテーブル（ＬＢＡについての物理位置情報を含んでいる）にインデックスをストアする。フォワード・テーブルは、図３３に関連して後述する。
【０１６０】
タイムスタンプ１４０３は、スーパーページが書き込まれた時間を表すタイムスタンプを含む。
【０１６１】
Ｓページインデックス及びタイムスタンプは、スーパーページを構成する４つのフラッシュページの各々に冗長的に書き込まれる。このメタデータは、他の情報を保護するＥＣＣ機構により保護されていないので、冗長性は必要である。
【０１６２】
スーパーページが書き込まれた場合、スーパーページ・メタデータ１４０１はフラッシュＨＥＭｉによって満たされる。フラッシュＨＥＭｉは、書込みを開始するページ要求部からＳページインデックスを所得するとともに、内部クロックからタイムスタンプ情報を取得する。スーパーページ・メタデータは、不測のパワーロスの後に、オープンスーパーブロックを再構築するために使用される。パワーロス後の再構築については、図５８に関連して後述する。
【０１６３】
図１５は、セクタコンテンツが、バンクのブロック０及び１から構成される様態を示す。バンクにストアされた残りのブロックの全てに対し、同一の構成が行うことができることを理解されたい。
【０１６４】
各Ｓページセクタは、単一のＬＢＡに関連するセクタコンテンツをストアし、スーパーページのＳページセクタは、１５個の連続的なＬＢＡに関連するセクタコンテンツをストアする。後述するように、或るスーパーページに関連する１５個の連続的なＬＢＡは、次のスーパーページに関連する１５個の連続的なＬＢＡとは関係を持たない。
【０１６５】
この構成は、ＬＢＡを文字（letter）で識別することにより示される。従って、ＬＢＡ（Ａ）は特定のアドレスを示し、ＬＢＡ（Ａ＋１４）は、ＬＢＡ（Ａ）よりも１４高いＬＢＡアドレスを示す（例えば、ＬＢＡ（Ａ）がＬＢＡ（Ｏ）である場合、ＬＢＡ（Ａ＋１４）はＬＢＡ（１４）となる）。また一方、ＬＢＡ（Ａ）とＬＢＡ（Ｂ）との間は、例えば両方とも１５で等しく割り切れること以外は関係がない。従って、ＬＢＡ（Ａ）がＬＢＡ（９，０００）を表す場合に、ＬＢＡ（Ｂ）がＬＢＡ（６０）を表し得る。
【０１６６】
各スーパーページにストアされたＬＢＡは、オペレーション中に変化し得ることに留意されたい。例えば、ブロック０のスーパーページ１のＳページセクタ０は、ある時点では、ＬＢＡ（Ｏ）（Ｂ＝０）に関連するセクタコンテンツをストアすることができるが、他の時点では、ＬＢＡ（９００）（Ｂ＝９００）に関連するセクタコンテンツをストアすることができる。使用中におけるＬＢＡ、スーパーページ及びブロックの変化の関係の様態は後述する。
【０１６７】
図１６は、初期化中に、フラッシュメモリ・モジュール１０８にホストアドレス・スペースをマップする様態を示す。上述したように、ホストは典型的には、ホストを物理メモリの構成の詳細から分離するＬＢＡを使用して読出し及び書込みを引き起こす。
【０１６８】
好適実施形態では、各フラッシュ・グループは同じサイズであり、ＬＢＡに対応するデータを各々同数ストアする（または他のホスト・アドレス方式が用いられる）。現在の実施形態では、後述するように、４５個のＬＢＡが１回の転送要求で処理することができる最大数なので、ＬＢＡは４５の倍数のセットでフラッシュ・グループの間に分配される。好適実施形態は、ＬＢＡ０〜８９がフラッシュ・グループ０に割り当てられ、ＬＢＡ９０〜１７９がフラッシュ・グループ１に割り当てられ、ＬＢＡ１８０〜２６９がフラッシュ・グループ２に割り当てられ、以下同様にして最後のフラッシュ・グループに達してＬＢＡ割り当てがフラッシュ・グループ０にループバックするまで、９０個のＬＢＡのストライプ・サイズを用いる。他の様々なストライピング・アルゴリズムを用いることが可能である。代替実施形態では、ユーザはストライプ・サイズを特定することが可能であるが、転送要求で処理することができるＬＢＡの数の倍数単位で行うことが好ましい。
【０１６９】
図１６は、フラッシュメモリスペースの簡略化されたバージョンを示す。この簡略化されたバージョンは、３つのフラッシュ・グループ（フラッシュ・グループ０〜２）から構成される。この簡略化された例では、２つのスーパーページからなるブロックは、ＳＰ０及びＳＰ１と表される。従って、フラッシュ・グループ０のバンク０のブロック０は、スロットに書き込まれた、１６０１で表されるデータからなる。図示のように、この簡略化された例では、各バンクは１つのブロックのみを含む。
【０１７０】
上述したように、スーパーブロックは、各バンクの同じブロックからなる。そのため、図１６に示す簡略化されたアーキテクチャでは、フラッシュ・グループ０のスーパーブロック０は、各バンクのブロック０から成り、図１６では１６０２で表される（すなわち、簡略化された例におけるフラッシュ・グループ全体）。
【０１７１】
後述するように、各スーパーブロックのブロック０のスーパーページ０は、スーパーブロック・メタデータ・テーブルとして知られているデータ構造を含む。このことは、各フラッシュ・グループのバンク０のＳＰ０において、「ＳＭＴ」として示されている。
【０１７２】
前記テーブルの他の欄の全てには、特定のスーパーページにストアされたＬＢＡ範囲が記載されている。従って、フラッシュ・グループ０のバンク１のスーパーページ０はＬＢＡ０〜１４を含み、フラッシュ・グループ０のバンク１のスーパーページ１はＬＢＡ３００〜３１４を含む。
【０１７３】
図示のように、ＬＢＡは、それぞれ９０個のＬＢＡの「ストライプ」で割り当てられる。最初のストライプ（ＬＢＡ０〜８９）は、フラッシュ・グループ０のスーパーページ０のバンク１〜６に割り当てられる。次のストライプ（ＬＢＡ９０〜１７９）は、フラッシュ・グループ１のスーパーページ０のバンク１〜６に割り当てられる。次のストライプ（ＬＢＡ１８０〜２６９）は、フラッシュ・グループ２のスーパーページ０のバンク１〜６に割り当てられる。
【０１７４】
この時点で、最後のフラッシュ・グループに達したので（この単純化された例では）、次のストライプはフラッシュ・グループ０に書き込まれ、前のストライプが中断したところからまた始める。このようにして、フラッシュ・グループ０のスーパーページ０のバンク７に、ＬＢＡ２７０〜２８４が書き込まれる。フラッシュ・グループ０において利用可能なスーパーページ０はもう存在しないので、ストライプの割り当ては、スーパーページ１のバンク０へと続けられ、スーパーページ１のバンク４まで続けられる。
【０１７５】
この時点からのこの割り当ては、スーパーブロックの終わりに達して限界となる場合を除き、そのまま続けられる。例えば、新しいストライプは、フラッシュ・グループ０のスーパーページ１のバンク５から始められる。スーパーブロックには３つのスーパーページしか残っていないので、ストライプは、フラッシュ・グループ１のスーパーページ１のバンク５へと続けられる。このようにして、スーパーブロックが偶数のストライプを保持しないという事実にも関わらず、ＬＢＡは各スーパーブロックの全てのスーパーページに割り当てられる。
【０１７６】
このＬＢＡ割り当て方法は、フラッシュメモリのパラレル処理を最大にする傾向がある。各フラッシュ・グループは互いに独立的に動作するので、フラッシュ・グループの全体に渡ってＬＢＡをストライプすることは都合がよい。このことにより、１回のトランザクションで１つ以上のフラッシュ・グループに保持されたデータにアドレスする可能性を最大化することができ、それにより、前記トランザクションに関する複数のフラッシュ読出しまたは書込みを同時に行うことが可能となる。転送要求は、１つのフラッシュ・グループのＬＢＡだけにしかアドレスすることができないので、トランザクションに要する転送要求の回数を最小限にするために、ストライプサイズを４５のインクリメント（転送要求によってアドレすることができるＬＢＡの最大数）に特定することが賢明である。現在の実施形態では、ストライプは、４５ずつインクリメントされる２つのＬＢＡから構成される（６つのスーパーページを表す）。後述するように、フラッシュ・グループは、５つの別個のバンクへの５つの書込み動作を同時に処理することができる。大量の転送は、各フラッシュ・ポートへの５つの書込みを同時に実行することができ、かつ複数のフラッシュ・ポートをパラレルに実行することができるので、９０個のＬＢＡのストライプサイズを使用すると、フラッシュ・インタフェースの並行使用を最大にする傾向がある。そのため、この構成は、高度の並行処理を行うことにより、ホストが開始する大量の読出しまたは書込みをＳＳＤコントローラ１０６が素早く処理することを可能とする。
【０１７７】
このようにして、図１６に示すようなＬＢＡ０〜１９０を含む仮説的な転送を、１つのＩＯＰ及び５つの転送要求を用いて行うことができる。第１の転送要求はＬＢＡ０〜４４を処理することができ、第２の転送要求はＬＢＡ４５〜８９を処理することができ、第３の転送要求はＬＢＡ９０〜１３４を処理することができ、第４の転送要求はＬＢＡ１３５〜１７９を処理することができ、第５の転送要求はＬＢＡ１８０〜１９０を処理することができる。この転送には、３つの互いに異なるフラッシュ・グループが使用され、それにより高度な並行処理を可能となることに留意されたい。加えて、（後述するように）互いに異なるバンクを対象とするページ要求は、同じフラッシュ・グループにおいてでさえも、並行して行うことができる。従って、各転送要求から発されるページ要求は互いに異なるバンクを対象とすることができるので、この例では前記ページ要求をパラレルに行うことができる。
【０１７８】
フラッシュ・グループへのＬＢＡの割り当ては恒久的なものである。あるいは、フラッシュ・グループ内のバンクへの割り当ては、毎回変更することもできる。後述するように、ホスト書込み部がＬＢＡを受け取った場合、そのＬＢＡを含むスーパーページを無効にすることを要求し、新しいデータ（及びそのスーパーページからの任意の上書きされていない古いデータ）が新しいスーパーページに書き込まれ、フラッシュＨＥＭｉは、同じバンクからの新しいスーパーページを古いスーパーページとして使用しようとする。しかし、このことは不可能な場合もあり、その場合は、フラッシュＨＥＭｉはＬＢＡを別のバンクのスーパーページへ移動させる。このことは、フラッシュメモリシステムの性能に影響を与える傾向がある。そのような変更が十分に行われた場合は、データのストライプが１つまたは比較的少数のバンクに集中するため、並行処理の機会が失われるからである。しかし、実際には、バンクからバンクへのシフトは、非パターン的に行われる傾向があるので、所定のストライプにおけるＬＢＡ群の大幅なオペレーションの後でさえも、バンクの全体に散在する傾向があるため、高度な並行処理は維持され得る。
【０１７９】
ＩＩＩ．ハードウェアの詳細
【０１８０】
Ａ．ホストインタフェース
【０１８１】
図１７は、図３に示したホストインタフェース３１０をさらに詳細に示す。ホストインタフェース３１０は、物理インタフェース１７０１と、ホスト・ポート０ １０４及びホスト・ポート１ １０５として示される２つのホスト・ポートとからなる。物理インタフェース１７０１の詳細については後述するが、ここでの説明では、物理インタフェース１７０１は、ホスト１０１及び１０２とホスト・ポート１０４及び１０５との間で信号をルーティングするためのものであると理解すれば十分である。各ホスト・ポートは、別個のホストとインタフェースすることが可能である。
【０１８２】
一般に、ホストインタフェース３１０は、受信側で次の機能を実施する。
・フレームを受信する
・フレームを構成要素に分解する
・コマンド情報を次のページに渡す
・データをデータパスＤＲＡＭに渡す
【０１８３】
一般に、ホストインタフェース３１０は、送信側で次の機能を実施する。
・データパスＤＲＡＭ１０７からデータを受信し、ホストへの送信用のデータを編成する
・ホストへの送信用のフレームを生成する
・フレーム（データフレームを含む）をホストへ送信する
【０１８４】
各ホスト・ポートは、受信ＨＥＭｉ（１７０２及び１７０３）、送信ＨＥＭｉ（１７０４、１７０５）、受信ステージバッファ（１７０６、１７０７）及び送信ステージバッファ（１７０８、１７０９）を含む。
【０１８５】
図示のように、各受信ＨＥＭｉは、複数のホストのうちの１つから物理インタフェース１７０１を介して制御情報を受信し、その制御情報をＳＳＤコントローラ１０６の他の構成要素へ送信する。「制御」情報は、この文脈においては、コマンド、制御信号及びアドレスを意味するが、データは含まない。各受信ＨＥＭｉがホストから受信した制御情報は受信ＨＥＭｉから送信される制御情報とは互いに異なり得ることに留意されたい。
【０１８６】
各送信ＨＥＭｉは、ＳＳＤコントローラの他の構成要素から制御情報を受信し、その制御情報を物理インタフェース１７０１を介して複数のホストのうちの１つへ送信する。繰り返すが、ＨＥＭｉからホストへ送信される制御情報は、送信ＨＥＭｉが受信した制御情報とは互いに異なり得る。
【０１８７】
各受信ステージバッファは、物理インタフェース１７０１を介して複数のホストのうちの１つからデータを受信し、そのデータをデータパスＤＲＡＭ１０７へ送信する。受信ステージバッファは１６キロバイトであり、最大で４つのＦＣ＿ＡＬ（「ファイバーチャネル・アービトレイテッド・ループ」）データフレームを受け取ることができる。
【０１８８】
各送信ステージバッファは、データパスＤＲＡＭ１０７からデータを受信し、そのデータを物理インタフェース１７０１を介して複数のホストのうちの１つへ送信する。送信バッファは４キロバイトであり、データパスＤＲＡＭ１０７からの１つの出力フレーム及び１つの入力フレームをストアすることができる。
【０１８９】
図１８は、ホスト・ポート０ １０４に関する幾つかのさらなる詳細を示す。当業者には理解できるように、ＳＤコントローラ１０６とホスト１０１との間の通信は、ホストが使用する特定のプロトコルの命令に従って編成される。一般に、従来のプロトコル（例えば、ＳＡＳ、ＳＡＴＡ、ファイバーチャネル）は、ホストとの間の通信がコマンド及びデータの規定群からなるフレームを用いて行うと規定している。
【０１９０】
使用される的確なフレームフォーマットは、様々な従来のプロトコルによって異なるので、ＳＳＤコントローラ１０６は、各プロトコルに応じて改変する必要がある。しかし、ＳＳＤコントローラ１０６は、受信ＨＥＭｉ及び送信ＨＥＭｉ用の別のファームウェア及び別の物理的コネクタとするための改変が最小限で済むように設計されている。ＳＳＤコントローラ１０６の他の全ての側面は、様々なプロトコルに応じて変更されない。このことは、ＳＳＤコントローラ１０６のパイプライン型及びモジュール型のデザイン、そしてまたホストインタフェース３１０の前記デザインの重要な利点である。
【０１９１】
フレーム編成の具体的詳細は、プロトコル・トゥ・プロトコルとは互いに異なるが、ＳＡＴＡプロトコルのいくかの側面はホスト・ポート０ １０４の設計及び動作を説明するために使用され得る。このプロトコルでは、フレームは、スタート・オブ・フレーム（「ＳＯＦ」）プリミティブ、フレーム・ヘッダ（プロトコルにより指定されたメタデータであるが、一般的に、ペイロード及び場合によってはイニシエータを識別するために必要な情報を含む）、ペイロード（例えば、データ、コマンドなど）、フレーム全体の妥当性検査のためにＣＲＣ値、及びエンド・オブ・フレーム（「ＥＯＦ」）プリミティブから構成される。ホスト・ポート０ １０４の受信側はフレームの受信に関与し、受信したフレームをその構成要素に分割し、データをその意図する目的地へルーティングする及び／またはトランザクションを設定するために必要とされる何らかの措置を講じる。ホスト・ポートの送信側は、ＳＳＤコントローラ１０６の他の構成要素から関連データ及びコマンド情報を受信することに関与し、その情報をホスト１０１への送信用のフレームにパッケージ化する。
【０１９２】
ホストとの直接的通信には、米国カリフォルニア州ミルピタスに本拠地を置いているＬＳＩ社（LSI Corporation）から０．１１ミクロンGigaBlaze（商標）Gflx(tm) xl Coreの名称で市販されている、トランシーバコアであるＧｉｇａＢｌａｚｅ１８０１が用いられる。このトランシーバコアは、８ｂ／１０ｂエンコーダ、シリアライザ／デシリアライザ及び、受信したビットと電圧レベルとの間の物理的転換を実施する物理｛ぶつり｝レイヤーを含む。ＧｉｇａＢｌａｚｅ１８０１は、３Ｇ ＳＡＴＡ、３Ｇ ＳＡＳ、４ｇ ＦＣ＿ＡＬ及び４Ｇ ＦＣバスへの取り付けが可能な２つのシリアルポートを有する。ＧｉｇａＢｌａｚｅ１８０１の内部動作の詳細は、それがホストへの物理インタフェースを行うこと以外は、本明細書では関係ない。図示する例では、ＧｉｇａＢｌａｚｅ１８０１はホスト１０１に接続されている。図１８ではＳＳＤコントローラ１０６の２つのホスト・ポートのうちの１つのみを示しているが、他方のホスト・ポートも全く同じでありＧｉｇａＢｌａｚｅを有することに留意されたい。
【０１９３】
図１８に示すように、ＧｉｇａＢｌａｚｅ１８０１はプリミティブ・マッチ・ロジック１８０２に接続されている。プリミティブ・マッチ・ロジックは、同一物理レベルのプロトコルが、フレーム及びプリミティブを別々に処理する様々な別のロジック・レベルのプロトコルとインタフェースすることを可能にするように設計されている。ＧｉｇａＢｌａｚｅ１８０１がホスト１０１からプリミティブを受信すると、ＧｉｇａＢｌａｚｅ１８０１は、そのプリミティブをプリミティブ・マッチ・ロジックへ送信する。プリミティブ・マッチ・ロジックの詳細は、図１９に関連して後述する。
【０１９４】
プリミティブ・マッチ・ロジックは、フレーム・ルータ１８０３を制御する。フレーム・ルータ１８０３は、ＧｉｇａＢｌａｚｅ１８０１からフレームを受信し、プリミティブ・マッチ・ロジックの制御下で、そのフレームの一部を送信する。データは受信ステージバッファ０ １７０６へ送信され、ヘッダは非データ・ペイロードＦＩＦＯ １８０４へ送信され、プリミティブはインバウンド・プリミティブＦＩＦＯ １８０８へ送信される。
【０１９５】
受信ＨＥＭｉ０ １７０２は、ヘッダ及びプリミティブＦＩＦＯの情報を使用し、取られるアクションを特定する。受信ステージバッファにルーティングされたデータは、ＤＭＡ転送によってデータパスＤＲＡＭ１０７へ送信される。
【０１９６】
受信ＨＥＭｉ１７０２は、プリミティブを生成し、それをアウトバウンド・プリミティブＦＩＦＯ１８０５へ送信する。これらの生成されたプリミティブには、ＡＣＫ（フレームが正しく受け取られたことを知らせる）、ＮＡＫ（フレームが正しく受け取られなかったことを示す）及びＲＲＤＹ（フレームクレジットをイニシエータへ報告する）が含まれる。送信プリミティブＦＩＦＯ１８０５のプリミティブは、直ちに、ホスト１０１への送信信号に挿入され、複数の他のトランザクション（例えば外部送信データフレーム）の中間に挿入され得る。
【０１９７】
図１８に示したホスト・ポートの送信側は、送信ＨＥＭｉ１７０４、送信ステージバッファ０ １７０８及び送信フレーム・バッファ１８０６から構成される。送信ステージバッファ０ １７０８は、データパスＤＲＡＭ１０７から受信したデータを含む。前記データは、読出しコマンドに応答して、フレームの一部としてホスト１０１へ送信される。送信フレーム・バッファ１８０６は、フレームを構成するのに使用されるメタデータを保持する１若しくは複数のバッファからなる。送信フレーム・バッファは受信側バッファと同様に動作するが、送信フレーム・バッファはフレームを分解するのではなくフレームを構成するために使用されることを理解されたい。
【０１９８】
カットスルー・ロジック１８０７は、ＳＳＤコントローラ１０６のファイバーチャネルネットワークへのインタフェースを助ける。ＳＳＤコントローラ１０６がファイバーチャネルネットワークに接続された場合、プリミティブ・マッチ・ロジック１８０２は、受信したプリミティブがＳＳＤコントローラ１０６を対象としているか否かについて評価する。ＳＳＤコントローラ１０６を対象としていないと判断されたプリミティブは、カットスルー・ロジック１８０７へ送信される。カットスルー・ロジックはその後、ネットワークの次のノードへ送信するために、ファイバーチャネルネットワークへ戻るべくプリミティブをＧｉｇａＢｌａｚｅへ送信する。
【０１９９】
様々な互いに異なるプロトコル（ＳＡＳ、ＳＡＴＡ及びファイバーチャネル）に必要とされる複数の物理的コネクタは、互いに互換性がない。好適実施形態では、各プロトコルに対して互いに異なるバージョンのＳＳＤコントローラ１０６が設けられることとなる。しかし、プリミティブ・マッチ・ロジックは各プロトコルについて正確に動作するので（下記参照）、互いに異なるファームウェアも受信ＨＥＭｉ及び送信ＨＥＭｉのために必要であり得るが、各プロトコルに必要とされる唯一の違いは、互いに異なる物理的コネクタを使用することである。別の実施形態では、ＳＳＤコントローラ１０６には、各プロトコルに１つずつ対応する３つの互いに異なる物理的コネクタが含まれ、このことにより、任意のプロトコルに対して同一の物理的コントローラを使用することが可能となる。
【０２００】
プリミティブ・マッチ・ロジック１８０２の詳細が図１９に示されている。このロジックは、一致したプリミティブ及び現在状態に基づいて、受信したプリミティブと特定された取られるアクションとを一致させる状態マシンを含む。
【０２０１】
ホストから受信したプリミティブは、ＧｉｇａＢｌａｚｅ１８０１からプリミティブ・ラッチ１９０１へ送信される。プリミティブはその後、１６個のレジスタからなるプリミティブ・マッチ・レジスタ１９０２に含まれているビットパターンと一致させる。一致しなかった場合、プリミティブ・ラッチ１９０１からの値は、インバウンド・プリミティブＦＩＦＯ１８０８へ直接的へ送信される。
【０２０２】
プリミティブ・マッチ・コントロール・レジスタ１９０３は、１６個のレジスタからなる（各プリミティブ・マッチ・レジスタに１つずつ）。プリミティブ・マッチ・コントロール・レジスタは、全体を一致させるために、関連するプリミティブ・マッチ・レジスタのどのビットがプリミティブ・ラッチ１９０１の値と一致するべきかを示すビットを含む。例えば、これらのビットは、任意の他のビットと一致することを必要としないが、最初のバイトと一致することを必要とする。プリミティブ・マッチ・コントロール・レジスタからのこれらのビットは、それ故にマスクとしての機能を果たし、複数の受信したプリミティブを単一のプリミティブ・マッチ・レジスタに一致させることを可能にする。このことは、受信したプリミティブのクラスに対して同じアクションが取られる場合は有用であり、また、プリミティブにおけるコマンドではなくデータを示す部分をスクリーンアウトする場合にも有用である。
【０２０３】
プリミティブ・マッチ・コントロール・レジスタ１９０３における他のビットは、プリミティブ・マッチ・レジスタ１９０２における対応するレジスタの値がプリミティブ・ラッチ・レジスタ１９０１と一致した場合に取られるアクションを示す。例えば、これらのビットは、プリミティブに続くデータの幾つかが非データ・ペイロードＦＩＦＯ１８０４に移動し、それに続くデータが受信ステージバッファ１７０６に移動するように、フレーム・ルータ１８０３を制御することができる。このことは、一般的に、データフレームに関連してＳＯＦプリミティブを受信した場合に生じる。
【０２０４】
プリミティブ・マッチ・コントロール・レジスタは、状態マシンとして動作する。例えば、幾つかのビットは、プリミティブ・マッチ・レジスタにより選択されたコントロール・レジスタではなくて現在のコントロール・レジスタによりその後の幾つかのプリミティブを引き起こすことができるカウンタ（図示せず）を設定することができる。加えて、プリミティブ・マッチ・コントロール・レジスタは、図示しない様々な他のレジスタに含まれる値を変更することができる。
【０２０５】
プリミティブ・マッチ・ロジック１８０２は、プリミティブ・ラッチ１９０１とプリミティブ・マッチ・レジスタ１９０２との間で値を比較し、プリミティブ・マッチ・コントロール・レジスタ１９０３により要求される制御機能を実施するロジックを含むことを理解されたい。
【０２０６】
図２８に関連して後述するように、プリミティブ・マッチ・レジスタ１９０２及びプリミティブ・マッチ・コントロール・レジスタ１９０３は、データ・オーバレイを使用して、関連する受信ＨＥＭｉによりロードされる。各プロトコルはそれ自身のプリミティブのセットを有するため、これらのオーバレイは、プリミティブ・マッチ・ロジック１８０２を互いに異なるプロトコル（例えば、ＳＡＳ、ＳＡＴＡ）に対してカスタマイズするために用いられる。加えて、オーバレイは、単一のプロトコル内で、互いに異なるプリミティブのセットまたは互いに異なる状態を処理するために使用することもできる。プリミティブ・マッチ・レジスタ及びプリミティブ・マッチ・コントロール・レジスタをロードするために受信ＨＥＭｉにより使用される値は、初期ファームウェアコードをロードすることにより得られる。従って、多くの場合、ハードウェアを改変することなく、プリミティブ・マッチ・ロジック１８０２を新しいプロトコルのためにアップデートすること、または、受信ＨＥＭｉファームウェアの改変により既存のプロトコルへ改変することが可能である。
【０２０７】
プリミティブ・マッチ・ロジック内の互いに異なるオーバレイの使用は、各プロトコルのための個々のロジックを必要とすることなく、ＳＳＤコントローラ１０６が別のプロトコルに応答することを可能にする。
【０２０８】
プリミティブ・マッチ・ロジック１８０２はまた、フレーム解読ロジック１９０４を含む。ロジック・ブロックは、フレーム内の初期のダブルワードを受信し、そのフレームの性質（例えば、データ、コマンド）を判断するために、そのダブルワードを評価する。フレームの種類に基づいて、フレーム解読ロジックはフレームを適切へ送信する。例えば、フレームがコマンド・フレームの場合、フレーム解読ロジックはフレーム全体を非データ・ペイロードＦＩＦＯ１８０４へ送信し、フレームがデータフレームの場合、フレーム解読ロジックはヘッダ部分を非データ・ペイロードＦＩＦＯへ送信し、かつデータ部分を適切な受信ステージバッファへ送信する。
【０２０９】
上述したように、プリミティブ・マッチ・ロジックは、ソフトウェアの変更またはハードウェアの大幅な変更を必要とせずに、ＳＳＤコントローラ１０６が互いに異なるフレームエンコードを含む互いに異なるプロトコルを処理できるという点で有益である。加えて、データＦＩＦＯはデータのみを含みコマンドまたはメタデータを含まないので、メタデータ及びコマンド情報が別のＦＩＦＯ（例えば、非データ・ペイロードＦＩＦＯ１８０４及びインバウンド・プリミティブＦＩＦＯ１８０８）へ送信される間に、データを受信ステージバッファに含まれる特殊化されたデータＦＩＦＯにデータを送信することにより、受信ホスト・ポートの設計はデータのより効率的な転送を可能にすると共に、ヘッダ及びプリミティブメタデータに関しての受信ＨＥＭｉの動作と並行して、ＤＭＡ転送によってデータパスＤＲＡＭへデータを転送することを可能にする。これにより、システム性能全体を向上させることができる。
【０２１０】
上述するように、ＳＳＤコントローラ１０６は、様々な互いに異なるプロトコルのために使用することができ、ＨＥＭｉファームウェアの改変及び別の物理的コネクタのみを必要とする。上述したプロトコルは全て、互いに比較的類似している。ＳＳＤコントローラ１０６はまた、上述した大幅な差異を有するプロトコルに対して容易に適用することができる。一実施形態では、例えば、ＳＳＤコントローラ１０６は、ＰＣＩエクスプレスなどのレーンオリエンテッド型プロトコル用に構成することができる。当業者には理解できるように、ＰＣＩエクスプレス・システムでは、外部デバイスは、「複数のレーン」を使用してデータ及びメタデータを送受信する。複数のレーンの各々は、レーンを横切ってストライプされるデータのダブルワードにより、送信信号の一部を伝送する。レーンの数は実施依存的であるが、ＳＳＤコントローラは、２つのさらなるＧｉｇａＢｌａｚｅ（各ＧｉｇａＢｌａｚｅは、ＰＣＩエクスプレス・インタフェースのために設計されたバージョンであり得ることを理解されたい）、２つの追加の受信ＨＥＭｉ及び２つの追加の送信ＨＥＭｉを追加することにより、４つのレーンＰＣＩエクスプレス・システムにおいて使用できるように構成することができる。１つのＧｉｇａＢｌａｚｅ、１つの受信ＨＥＭｉ及び１つの送信ＨＥＭｉが、各レーンに用いられる。この実施形態では、ＳＣＳＩ ＨＥＭｉ２００１（下記参照）は使用されない。そのＨＥＭｉは、代わりに、追加のＲｄＷｒ ＨＥＭｉとして使用され得る。
【０２１１】
この実施形態では、外部ホストで駆動するデバイス・ドライバは、ＰＣＩエクスプレス送信をＩＯＰフォーマットにすることに関与する。ホスト・ポート・ロジックの大部分は、それ故に不要である（例えば、プリミティブ・マッチ、様々なＦＩＦＯなど）。受信ＨＥＭｉ及び送信ＨＥＭｉは、データのデストライプまたはリストライプにそれぞれ関与する。受信ＩＯＰがデストライプされると、それは、ＲｄＷｒ ＨＥＭｉ（下記参照）へ直接的に渡される。その後、上述した他のプロトコルのように処理される。
【０２１２】
ＰＣＩエクスプレスなどのレーン・オリエンテッド型プロトコルと共にＳＳＤコントローラ１０６を使用する場合は何らかの追加的な改変を必要とするが、これらの改変は比較的小さいものであり、コントローラのモジュールのデザインの結果として容易に適用することができる。ＨＥＭｉ群の追加及び除去は比較的単純である、コントローラ・パイプラインの互いに異なる段階は互いに独立的に動作するため、ある段階（例えばホスト・ポート）の変更は、他の段階（例えばフラッシュ・ポート）の変更を必要としない。
【０２１３】
ＳＳＤコントローラ１０６は、同様に、ｉＳＣＳＩプロトコルと共に使用するために設計することができるが、その場合は、ホスト・ポートに１若しくは複数のＴＣＰ／ＩＰスタックと共に、そのスタックの抽出に関与する受信ＨＥＭｉ及びＴＣＰ／ＩＰプロトコルに必要とされるフレーム情報のエンコードに関与する送信ＨＥＭｉを追加することが必要である。
【０２１４】
Ｂ．コマンドパーサ
【０２１５】
図２０は、図３に示したコマンドパーサ・ブロック３１１についてのさらなる詳細を示す。図３に関連して説明したように、コマンドパーサ・ブロック３１１は、ホスト・インタフェース３１０及びコマンド分配ブロック３１２に接続している。
【０２１６】
コマンドパーサ・ブロック３１１は、ＳＣＳＩ ＨＥＭｉ２００１を含む。ＳＣＳＩ ＨＥＭｉ２００１は、受信ＨＥＭｉ１７０２及び１７０３からホスト・コマンドを受信する。ＳＣＳＩ ＨＥＭｉ２００１は、ホスト・コマンドが読出し／書込みコマンドであるか、または他の種類のコマンドであるかを判定する。コマンドが読出し／書込みコマンド以外のコマンドであれば、ＳＣＳＩ ＨＥＭｉ２００１は、非読出し／書込みコマンドを処理するＡＲＭプロセッサ２００２にコマンド・オフを伝達する。ＡＲＭプロセッサ２００２の詳細については後述する。
【０２１７】
ＳＣＳＩ ＨＥＭｉ２００１は、コマンドが読出し／書込みコマンドであると判定すれば、コヒーレンシを確実にするためにコマンドを有効にする。これは、読出しまたは書込みコマンドが、コマンド分配ブロック３１２が現在処理している読出しまたは書込みコマンドと同じデータに関連している場合に、第１のコマンドの特定の処理が完了するまで第２のコマンドが保留されることを意味する。
【０２１８】
読出し／書込みコヒーレンシは、再オーダーされる読出し及び書込みを可能にするＳＣＳＩプロトコルには必要とされない。しかし、後述するように、ＳＳＤコントローラ１０６は、ホストにより開始されるコマンドを複数のサブオペレーションに分割し、これらのサブオペレーションはアウト・オブ・オーダー（順不同）で処理される。
【０２１９】
ＳＳＤコントローラ１０６が同じデータに対して１つ以上のコマンドを実行することを許可する場合は、第１のコマンドが完了する前に、第２のコマンドの一部を実行させることが可能である。例えば、ＳＳＤコントローラ１０６が、ＬＢＡの特定のブロックに対しての書込みコマンドを受信した後にＬＢＡの重複ブロックについての読出しコマンドを受信した場合、及び、書込みコマンドの終了前に読出しコマンドのオペレーションの開始が許可された場合、読出しコマンドは、書込みコマンドによって既にアップデートされた或るデータ及びアップデートされなかった或るデータをリターンさせることが可能である。
【０２２０】
このため、ＳＳＤコントローラ１０６は、ＳＣＳＩ ＨＥＭｉ２００１及びフラッシュＨＥＭｉ群（後述）の２つの位置において、現在アクティブなコマンドを追跡する。
【０２２１】
ｍＲＡＭとして知られるＨＥＭｉの内部メモリ（図２６に関連して後述する）にストアされたＳＣＳＩ ＨＥＭｉコマンド・テーブル２００３は、ＳＣＳＩ ＨＥＭｉ２００１からコマンド分配ブロック３１２へ送信されたがフラッシュＨＥＭｉ群にはまだ送信されていないすべてのホスト読出し及び書込みコマンドのＬＢＡ及び転送長を含む。
【０２２２】
後述するように、コマンド分配ブロックは、ＲｄＷｒ ＨＥＭｉとして知られる幾つかのＨＥＭｉを含む。コマンド・テーブル２００３は、各コマンドにより動作するＲｄＷｒ ＨＥＭｉの識別子を含む。ＳＣＳＩ ＨＥＭｉ２００１は、この情報を用いて、ＲｄＷｒ ＨＥＭｉの作業負荷のバランスを取り、比較的少数の現在アクティブなコマンドと共に新しいコマンドをＲｄＷｒ ＨＥＭｉへ送信する。
【０２２３】
新しいコマンドを受信した場合、ＳＣＳＩ ＨＥＭｉ２００１はコマンド・テーブル２００３をチェックして、ＬＢＡアドレスのいずれか１つが既存のコマンドの影響を受けるか否かを判定する。一致が見つかった場合、ＳＣＳＩ ＨＥＭｉ２００１は、前回のコマンドがテーブルから除去されるまで新しいコマンドの実行をストールする。コマンドを送り出すＲｄＷｒ ＨＥＭｉが、前記コマンドに対応する全ての必要な転送要求を生成し送り出しを報告すると（ＲｄＷｒ ＨＥＭｉが後述する転送要求を送信する過程）、コマンドがコマンド・テーブル２００３から除去される。この時点で、新しいコマンドは、もはやストールされない。この時点では初期コマンドは依然として実行されているが、そのコマンドはフラッシュＨＥＭｉレベル（後述する）でコヒーレンシチェックを受けることを理解されたい。
【０２２４】
このように、ＳＳＤコントローラ１０６は、ホストコマンドのパイプライン型実行における２つの点で読出し／書込みコヒーレンシを実行する。ＳＣＳＩ ＨＥＭｉ２００１は、既存のコマンドのＬＢＡ範囲と対立する新しいコマンドを、既存のコマンドがフラッシュＨＥＭｉへ送信されるまでストールする。そして、既存のコマンドが完了するまで既存のコマンドと同じ範囲をカバーする新しいコマンドの実行をストールするように、各フラッシュＨＥＭｉは、それ自身のオペレーションにおいてコヒーレンシを実行する。
【０２２５】
相反するコマンドが前記パイプラインの別の段階で処理されている限りは相反するコマンドの処理を継続することができるので、コヒーレンシを二段階で実施するこのシステムは有利である。従って、ＲｄＷｒ ＨＥＭｉ群は、フラッシュメモリで作動される第１の相反するコマンドと同じ時点で、第２の相反するコマンドを設定することができ、このことにより全てのシステム性能を向上させることができる。
【０２２６】
上述したように、コマンドパーサ・ブロック３１１はまた、特定の内部管理オペレーションを制御し、読出しまたは書込み以外のホスト開始コマンドの処理に関与するＡＲＭプロセッサ２００２を含む。好適実施形態では、ＡＲＭプロセッサ２００２は、英国ケンブリッジ所在のＡＲＭホールディングス社（ARM Holdings pic）から入手可能なARM7TDMiである。ＡＲＭプロセッサ２００２の機能は、様々なロジック・デバイスによって処理されることができることを理解されたい。
【０２２７】
ＡＲＭプロセッサ２００２により処理されるホストコマンドの正確な性質はプロトコル依存性であるが、一実施形態では、これらのコマンドには、次のものが含まれる。
・テストユニット実行可能
・容量の読み取り
・モード選択
・モード検出
・ログ選択
・ログ検出
・報告ラン
・診断結果送信
・リクエスト検出
・バッファ書込み
・バッファ読出し
【０２２８】
Ｃ．コマンド配布
【０２２９】
図２１は、コマンド分配ブロック３１２をより詳細に示している。図示のように,、コマンド分配ブロック３１２は、一群のＲｄＷｒ ＨＥＭｉ（２１０１〜２１０６）から構成される。好適実施形態では、コマンド分配ブロック３１２は、６個のＲｄＷｒ ＨＥＭｉから構成される。しかし、ＳＳＤコントローラ１０６はモジュール型に設計されているので、ＲｄＷｒ ＨＥＭｉの数はコントローラの残りの部分の大幅な再設計を必要とせずに増加または減少させることが可能である。ＲｄＷｒ ＨＥＭｉの個数を増やすと性能を高めることができるが、コストが非常に高くなると共にシステムが複雑なものとなる。
【０２３０】
図２１に示すように、ＳＣＳＩ ＨＥＭｉ２００１は、各ＲｄＷｒ ＨＥＭｉ群に情報を送信する。一般的に、これは、ＳＣＳＩ ＨＥＭｉ２００１が、ＨＥＭｉの他のＲｄＷｒ ＨＥＭｉに対する相対的な作業負荷に基づいて特定の特定のＲｄＷｒ ＨＥＭｉ群に割り当てるＣＤＢ情報からなる。
【０２３１】
ＲｄＷｒ ＨＥＭｉ群は、ＣＤＢ情報に基づいてＩＯＰを生成し、その後、ＩＯＰにより要求される転送要求を生成する。そして、それらの転送要求を、転送データのフラッシュ・アドレスに基づいて特定のフラッシュ・ポートへ送信する。ＲｄＷｒ ＨＥＭｉ群はまた送信ＨＥＭｉ群とも通信し、ホストが書き込んだ場合、関与するＲｄＷｒ ＨＥＭｉは、コントローラが前記書込みに関連するデータに対して準備ができていることを送信ＨＥＭｉがホストに知らせるべきであるということを示す情報を送信ＨＥＭｉへ送信する。
【０２３２】
Ｄ．クロスバー；共有ＲＡＭ；ＤＲＡＭ
【０２３３】
これまでの図面は、データ及び制御フローの観点からの各機能ブロック間の相互接続を示しており、物理的な接続を示すことは試みていなかった。図２２は、現在の実施形態において、ＳＳＤコントローラ１０６の機能ブロックの多くが物理的に接続されている様態を示す。
【０２３４】
図２２は、クロスバー・スイッチ２２０１を示す。当業者には一般的に理解できるように、クロスバー・スイッチは、スイッチの一方の側の任意の構成要素を、スイッチの他方の任意の要素に接続させるように動作する。クロスバー・スイッチは、後述するような様態で、ＨＥＭｉ側の構成要素を共有ＲＡＭ側の構成要素と接続させる。
【０２３５】
クロスバー・スイッチ２２０１のＨＥＭｉ側は、ＳＳＤコントローラ１０６に含まれる各ＨＥＭｉの２方向接続を有する（図２２に示すＨＥＭｉ群は、ＨＥＭｉと各ＨＥＭｉに関連する密結合ロジックとの組み合わせの実際である。ロジックの詳細は、本明細書の他の部分でさらに説明されている）。
【０２３６】
本明細書の他の部分に説明されているように、ＨＥＭｉの数は、実施決定に応じて異なり得る（例えば、コントローラは８ないし１２のフラッシュＨＥＭｉを含み得る）。
【０２３７】
現在の実施形態では、クロスバー・スイッチ２２０１の共有ＲＡＭ側は、共有ＲＡＭバンク０（２２０２）〜共有ＲＡＭバンク７、グローバル・レジスタ２２０３及びＰＩＯバッファ２２０４として示され集合的に共有ＲＡＭブロック３１８として示される、１０個のＲＡＭバンクに接続される。好適実施形態では、各共有ＲＡＭバンクは４キロバイトのＲＡＭストレージ・スペースからなる。クロスバー・スイッチ２２０１は、多数の共有ＲＡＭバンクに接続されるように設計されており、それ故に、後述するように、モジュールの拡張性をサポートする。
【０２３８】
上述したように、１０個の共有ＲＡＭバンクの全てがアドレス・スペースを共有するが、それらのバンクの幾つかは特殊化された機能を有する。
【０２３９】
図２２に示したように、クロスバー・スイッチ２２０１は、各共有ＲＡＭバンクのためのポートを有する。各共有ＲＡＭバンクは４つのＦＩＦＯ及び１つのデータ構造セクションを含み、各ＦＩＦＯは、それに関連するＦＩＦＯレジスタ・ブロック（例えば、レジスタ・ブロック２２０５はＦＩＦＯ０を制御し、ブロック２２０６はＦＩＦＯ１を制御する。以下同様）によって制御される。
【０２４０】
共有ＲＡＭポート０を共有ＲＡＭバンク０と接続する矢印により示されるように、共有ＲＡＭポート０は、共有ＲＡＭバンク０のＦＩＦＯ０〜３またはデータ構造セクションへの単なる入力または出力経路である。前記経路は、関連するレジスタを介して、ＦＩＦＯと接続される。後述するように、ＦＩＦＯからの読出しまたはＦＩＦＯへの書込みは、関連するレジスタ・ブロックを介して実施される。一方、データ構造セクションからのみ出しまたはデータ構造セクションへの書込みは、関連するレジスタを介さずに行われる。
【０２４１】
好適実施形態では、ＦＩＦＯのうちの２７個だけが実際に使用される（２３個がＨＥＭｉワークリストに使用され、４個がフリーリストに使用される）。残りの５個は、本システムによりサポートされるＨＥＭｉの数を拡張するために利用可能である。
【０２４２】
クロスバー・スイッチ２２０１のグローバル・レジスタ・ポート２２０７は、ＧｉｇａＢｌａｚｅ１８０１の制御やＤＲＡＭコントローラ２３０５（図２３と関連して後述する）のセットアップなどの様々な機能を実施する複数のレジスタから構成されるＲＡＭバンクからなるグローバル・レジスタ２２０３に接続されている。
【０２４３】
クロスバー・スイッチＤＲＡＭポート２２０８は、データパスＤＲＡＭ１０７に接続されたＰＩＯ（「プログラムされた入出力（ＩＯ）」ＤＲＡＭバッファ２２０４に接続されている。ＰＩＯ ＤＲＡＭバッファ２２０４は、共有ＲＡＭのバンクに含まれている６４個のダブルワード ＦＩＦＯであり、ＨＥＭｉ群とデータパスＤＲＡＭとの間の情報をバッファするのに使用される。データパスＤＲＡＭは、より速いクロック速度で実行され、一度に４つのダブルワードの読出し及び書込みができるが、ＨＥＭｉ群は一度に１つのダブルワードの読出し及び書込みしかできないので、このようなバッファは必要である。データパスＤＲＡＭ動作が遅くなるのを防ぐために、ＰＩＯ ＤＲＡＭバッファ２２０４はＤＲＡＭとの間で転送されたデータをバッファする。ＨＥＭｉ群がデータパスＤＲＡＭにデータを書き込んだ場合、ＰＩＯ ＤＲＡＭバッファ２２０４は、書込みが完了するかまたはバッファが満杯になるまで（そうなった場合は、データをデータパスＤＲＡＭへバーストする）、データ、ダブルワードを一度にストアする。ＨＥＭｉ群がデータパスＤＲＡＭからデータを読出した場合、ＰＩＯ ＤＲＡＭバッファ２２０４は、データパスＤＲＡＭからのデータの４つのダブルワードを一度にストアし、必要なデータの全てが利用可能になると（または、ＰＩＯバッファが満杯になると）、ＨＥＭｉ群はバースト内のダブルワードのそのデータを一度に読み出す。繰り返すが、実際には、データはＤＲＡＭと複数のバッファのうちの１つとの間で転送されることを理解されたい。
【０２４４】
クロスバー・スイッチ２２０１からＰＩＯバッファ２２０４への接続は、データパスＤＲＡＭとフラッシュ・ポートのステージバッファとの間またはホストインタフェースと受信ステージバッファとの間のデータ転送のためには使用されず、その代わりに、ＨＥＭｉとの通信のためにだけ使用されることに留意されたい。様々なステージバッファへのまたは様々なステージバッファからの転送は、クロスバー・スイッチ２２０１を介さずに行われる。
【０２４５】
クロスバー・スイッチ・デバッグ・ポート２２０９は、デバッグＦＩＦＯ２２１０に接続されている。デバッグＦＩＦＯ２２１０は、ＨＥＭｉ群からのデバッグ情報のためのＦＩＦＯとしての役割を果たす大型のＳＲＡＭバンクである。デバッグＦＩＦＯ２２１０は、ＨＥＭｉ群からダブルワードの情報を一度に受け取り、その情報を４ダブルワードの幅のＦＩＦＯ構造にストアする。デバッグＦＩＦＯ２２１０が或る設定された容量閾値に到達すると、ＤＲＡＭポートへのアクセスを調停する。そして、アクセス権を取得すると、ＤＲＡＭ１０７へのデバック情報の書込み（４ダブルワード）を一度にバーストする。
【０２４６】
クロスバー・スイッチでは一般的であるが、クロスバー・スイッチ２２０１は、ＨＥＭｉ側の複数の構成要素を共有ＲＡＭ側の複数の構成要素に対して同時に接続することができる。接続は、各側のポート数によってのみ制限される。
【０２４７】
クロスバー・スイッチ２２０１は、各ＨＥＭｉを、各共有ＲＡＭバンクのみならずスイッチの共有ＲＡＭ側の他のリソースに対しても接続することが可能である。しかし、スイッチは、ＨＥＭｉ群を互いに直接的に接続しないし、共有ＲＡＭバンクも互いに直接的に接続しないことを理解されたい。複数のＨＥＭｉ間の通信は、共有ＲＡＭバンクに情報を残すために、クロスバー・スイッチ２２０１を使用して直接的に実施される。
【０２４８】
従って（後述するように）、ＳＣＳＩ ＨＥＭｉ２００１は受信したＣＤＢの結果としてＩＯＰを生成し、そのＩＯＰをＲｄＷｒ ＨＥＭｉへ送信する。このことは、ＲｄＷｒ ＨＥＭｉ用のワークリストのＩＯＰ位置へポインタをストアしているＳＣＳＩ ＨＥＭｉ２００１により処理される。前記ワークリストはまた、共有ＲＡＭバンクＦＩＦＯのうちの１つにもストアされている。ＲｄＷｒ ＨＥＭｉはその後、ワークリストをチェックすることによりＩＯＰを受け取り、ＩＯＰに含まれている位置を特定し、そして、その位置からのＩＯＰを自身の内部メモリにコピーする。他のＨＥＭｉ群との間の通信は、同様にして行われる。共有ＲＡＭバンクに含まれるデータ構造の詳細及び、ＨＥＭｉ群がそのデータ構造を使用して情報を転送する様態は後述する。
【０２４９】
ＤＲＡＭアクセス・レジスタ・ブロック２２１１は、データパスＤＲＡＭ１０７へのアクセスを制御する。上述したように、ＨＥＭｉ群はデータパスＤＲＡＭ１０７には直接的にアクセスしないが、その代わりにこの目的のためにＰＩＯバッファ２２０４を使用する。これらは、ＤＭＡ転送であり、ＨＥＭｉがアドレスの開始及び転送サイズのみを提供することを必要とする。
【０２５０】
アドレス・レジスタ２２１２は、転送のために、データパスＤＲＡＭ内の開始位置をストアする。転送カウント・レジスタ２２１３は、必要な転送カウント（回数）をストアする。データ・レジスタ２２１４は、ＰＩＯバッファ２２０４へ送信するデータまたはＰＩＯバッファから受信したデータをストアする。
【０２５１】
データパスＤＲＡＭ１０７からの読出しは、ＨＥＭｉがレジスタ２２１２内にＤＲＡＭアドレスを入力し、転送カウント・レジスタ２２１３に転送サイズ（クワッドワード〜ダブルワード）を入力することにより開始される。これらのアクションは、ＤＲＡＭ ＤＭＡエンジン２３０２（下記参照）がデータを４つのダブルワード・チャンクでＰＩＯバッファ２２０４へ転送することを引き起こす。各転送が行われるとＤＲＡＭ ＤＭＡエンジンは転送カウント・レジスタ２２１３をデクリメントし、転送カウント・レジスタ２２１３がゼロに到達したときにＤＭＡ転送は終了する。
【０２５２】
ＤＭＡ転送の完了後、データはダブルワード・インクリメントでＰＩＯバッファからデータ・レジスタ２２１４へ自動的に読み出される。
【０２５３】
ＨＥＭｉからデータパスＤＲＡＭ１０７への書込みも同様にして行われる。
【０２５４】
アドレス・レジスタ２２１２のインクリメントは毎回転送カウント・レジスタ２２１３をデクリメントすることに留意されたい。ＤＲＡＭ ＤＭＡエンジンは初期アドレス及び転送カウントのみを必要とするので、このことは現在行われる転送に不要である。アドレス・レジスタ２２１２のインクリメントは、転送が完了すると、レジスタに保持されている転送用のアドレスを終了させる。このことは、今後の転送のセットアップに有用であり得る。
【０２５５】
図２３は、ＲＡＭコントローラ３１７を示す。一般に、ＲＡＭコントローラは、共有ＲＡＭブロック３１８及びデータパスＤＲＡＭ１０７へのアクセスを制御及び調停する。
【０２５６】
ＲＡＭコントローラ３１７は、次のロジック・ブロックを含む（他のハードウエア略図にも当てはまることだが、図２３は概念的に説明するためのものであって、実際の物理的なレイアウトの詳細を説明するためのものではないことを理解されたい）。
・共有ＲＡＭコントローラ２３０１
・クロスバー・スイッチ２２０１
・ＤＲＡＭコントローラ２３０５。米国カリフォルニア州パロ・アルト所在のデナリソフトウエア社（Denali Software, Inc）から購入した、データパスＤＲＡＭ１０７への物理的インタフェースを管理するロジックから構成される。
【０２５７】
ＤＲＡＭコントローラ２３０５は、ＤＲＡＭ ＤＭＡエンジン２３０２を含む。ＤＭＡエンジン２３０２は、データパスＤＲＡＭ１０７と、ＤＲＡＭと通信する様々なバッファ（例えば、受信バッファ部１７０６、送信バッファ１７０８、フラッシュ・ステージバッファ３０８、ＰＩＯバッファ２２０４、デバッグＦＩＦＯ２２１０）との間のＤＭＡ転送を処理する。ＤＭＡエンジン２３０２は、ＨＥＭｉからＤＭＡ転送の開始アドレス及び転送カウントを受信し、ＨＥＭｉから追加的な情報を必要とすることなく、そこからのＤＭＡ転送を制御する。
【０２５８】
Ｅ２Ｅロジック２３０３は、図１３に関連して上述したＥ２Ｅタグに関する３種類のタスクを実行する。
（ａ）フラッシュへ送信されるデータの各セクタにＥ２Ｅタグを取り付ける。
（ｂ）タグ値を期待値に対してチェックし、両者の値が一致しなかった場合はエラー状態を生成する。
（ｃ）イニシエータがそれらの値を使用しない（つまり、それらに期待しない）場合、ホストへ送信され戻されるデータからＥ２Ｅタグを取り外す。
【０２５９】
データの各セクタに取り付けられるＥ２Ｅタグは、Ｒｅｆタグ１３０４、Ａｐｐタグ１３０５及びＣＲＣ１３０６である。上述したように、Ｅ２Ｅをサポートするイニシエータからデータを受信した場合は、これらの値はイニシエータから受信した情報から取得または前記情報に基づいて計算され、Ｅ２Ｅをサポートしないイニシエータからデータを受信した場合は、これらの値は内部で生成される。
【０２６０】
Ｅ２Ｅロジック２３０３は、Ｒｅｆタグ、ＡｐｐタグまたはＣＲＣの値をチェックすることができる。これらのチェックは、図１３に関連して上述した。Ｅ２Ｅロジック２３０３は、これらのチェックを、データパスＤＲＡＭ１０７とフラッシュ・ステージバッファとの間でデータが転送されたときか、あるいはデータパスＤＲＡＭ１０７と受信バッファまたは送信バッファとの間でデータが転送されたときに実行する。イニシエータがＥ２Ｅをサポートしない場合を除いて、イニシエータはこれらのフィールドのどれがチェックされたかを特定する。イニシエータがＥ２Ｅをサポートしない場合、チェックは、ユーザが初期設定したパラメータに基づいて行われる。イニシエータがＥ２Ｅをサポートしない、かつユーザがチェックの実行を要求しない場合でも、Ｒｅｆタグ値は、内部エラーをチェックする目的で常にチェックされることに留意されたい。
【０２６１】
Ｅ２Ｅロジック２３０３は、データパスＤＲＡＭ１０７からフラッシュ・ステージバッファへ送信されるデータの各セクタにＥ２Ｅタグを取り付ける。図１３に関連して上述したように、イニシエータがＥ２Ｅをサポートする場合は、Ｒｅｆタグ情報はイニシエータから供給された情報から取得される。イニシエータは、Ｒｅｆタグがデータの各セクタについてイクリメントされるように要求することができる。その場合、Ｒｅｆタグを取り付ける前に、Ｅ２Ｅロジック２３０３がインクリメントオペレーションを実行する。イニシエータがＥ２Ｅをサポートしていない場合、Ｅ２Ｅロジック２３０３は、ＬＢＡをＲｅｆタグ・フィールド１３０４に挿入する。イニシエータがＥ２Ｅをサポートしている場合、Ａｐｐタグ及びＣＲＣフィールドには、イニシエータから供給された情報が記入される。イニシエータがＥ２Ｅをサポートしていない場合、Ａｐｐタグにはデフォルト値が記入され、初期設定時にユーザにより選択されたオプションに基づいて、ＣＲＣフィールドにはデフォルト値または内部計算されたＣＲＣ値のいずれかが記入される。
【０２６２】
ＤＲＡＭスケジューラ２３０４は、データパスＤＲＡＭ１０７へアクセス可能な全てのチャネルの順序付けられたリストから構成される。これらのチャネルについては、図２５に関連して後述する。ＤＲＡＭは入／出力ポートを１つしか有していないので、一度に１つのチャネルにしかアクセスできない。ＤＲＡＭスケジューラ２３０４は各チャネルを順に回り、そのチャネルがＤＲＡＭへのアクセスを要求しているか否かをチェックし、要求されている場合は、そのチャネルのＤＲＡＭポートへの接続を可能にする。そのアクセスが完了すると、ＤＲＡＭスケジューラ２３０４は、前記リストに載っている次のチャネルへ移動する。このようにして、ＤＲＡＭスケジューラ２３０４は、ＤＲＡＭポートへのアクセスをラウンドロビン方式で調停する。
【０２６３】
図２４は、共有ＲＡＭコントローラ２３０１及び、共有ＲＡＭコントローラ２３０１に含まれるレジスタ・ブロックと共有ＲＡＭに含まれるＦＩＦＯとの間の関係の特定の態様を示す。具体的には、図２４は、共有ＲＡＭバンク０ ２２０２に含まれるＦＩＦＯ０〜３と相互に関連する、ＦＩＦＯポインタ・レジスタ２２０５、２２０６、２４０１及び２４０２を示す。共有ＲＡＭコントローラ２３０１は、１共有ＲＡＭバンクあたり４つのポインタ レジスタ・ブロックを含むので（合計で３２個含む）、それらの幾つかは未使用でもよい。明瞭化を目的として、共有ＲＡＭコントローラ２３０１における、バンク０以外の共有ＲＡＭバンクを制御する部分は図示していないことに留意されたい。
【０２６４】
図２３に図示したように、ＦＩＦＯ０ポインタ・レジスタ２２０５は、共有ＲＡＭバンク０ ２２０２に含まれているＦＩＦＯ０（２４０３）に関連付けられている。ポインタ・レジスタ２２０５は、次のレジスタ２４０４〜２４０８から構成される。
【０２６５】
ベース・レジスタ２４０４は、ＦＩＦＯ２４０３のために設けられた共有ＲＡＭバンク２２０２の一部の一方の境界を構成する共有ＲＡＭバンク２２０２内のアドレス位置へのポインタを含む。シーリング・レジスタ２４０５は、ＦＩＦＯ２４０３のために設けられた共有ＲＡＭバンク２２０２の一部の他方の境界を構成する共有ＲＡＭバンク０内のアドレス位置へのポインタを含む。これらのレジスタは、ＦＩＦＯ０の位置及びサイズを規定する。好適実施形態では、初期設定時に設定され、オペレーション中は変更されない。代替実施形態では、これらの値は動的にリセットされ、そのことにより、共有ＲＡＭバンク２２０２内のスペースのより効率的な割り当てを可能にするが、コストが高くなり複雑さも増す。
【０２６６】
ＦＩＦＯ２４０３は、先入れ先出し（First-In, First-Out）型のメモリ構造である。従って、最も新しく挿入されたエントリを表すトップと、最も古いエントリを表すボトムとを有する。ＦＩＦＯ２４０３は、ラップアラウンドし、現在のトップの位置及び現在のボトムの位置は使用中に変わる。
【０２６７】
トップ・レジスタ２４０６は、ＦＩＦＯ２４０３の現在のトップを構成する共有ＲＡＭバンク２２０２内のアドレス位置へのポインタを含む。ボトム・レジスタ２４０７は、ＦＩＦＯ２４０３の現在のボトムを構成する共有ＲＡＭバンク２２０２内のアドレス位置へのポインタを含む。
【０２６８】
カウント・レジスタ２４０８は、ＦＩＦＯ２４０３内における現在アクティブな構成要素の数を表す値を含む。これと同じ情報は、トップ・レジスタ２４０６とボトム・レジスタ２４０７とを比較することにより得ることができるが、計算することなく入手可能なこの情報を有することにより性能の利点が得られる。カウント・レジスタ２４０８は、ＦＩＦＯ２４０３にアイテムが追加されたときに自動的にインクリメントされ、アイテムが除去されたときに自動的にデクリメントされる。
【０２６９】
図２４に示すように、共有ＲＡＭコントローラ２３０１はまた、ＦＩＦＯ１〜３に対応する、ＦＩＦＯポインタ・レジスタ２２０６、２４０１及び２４０２を含む（個々のレジスタについては図示しない）。
【０２７０】
共有ＲＡＭバンク０はまた、データ構造１４０９も含む。図４１に関連して説明するように、共有ＲＡＭには、イニシエータ・テーブル、ＣＤＢ情報テーブル、ＩＯＰテーブル、転送要求テーブル及びグローバル変数などの、様々な非ＦＩＦＯデータ構造がストアされている。
【０２７１】
各フリーリスト及びそれに関連するテーブルは、同一の共有ＲＡＭバンクにストアする必要があることに留意されたい（図４１に関連して後述する）。
【０２７２】
共有ＲＡＭコントローラ２３０１はまた、クロスバー・アービトレーション・ロジック２４１０を含む。上述したように、クロスバー・スイッチ２２０１は、各ＨＥＭｉに対して１つのポートを有し、それらのポートを８つの共有ＲＡＭポート（各共有ＲＡＭバンクに対して１つ）、グローバル・レジスタ、デバッグＦＩＦＯ及びデータパスＤＲＡＭに接続する。このことは、共有ＲＡＭ及びＤＲＡＭポートへアクセスするためのＨＥＭｉ群（この実施形態では２３個のＨＥＭｉ）の間で調停する幾つかの手段を必要とする。
【０２７３】
この調停は、クロスバー・アービトレーション・ロジック２４１０により処理される。このロジックは、２つ以上のＨＥＭｉが同一のポートへのアクセスを要求した場合に、ＨＥＭｉ群の間で調停するために、フェア（fair）な調停アルゴリズムを使用する。好適実施形態では、この調停はラウンドロビン方式で行われ、ポートへのアクセス権を直前に得たＨＥＭｉから開始し、アクセスを所望する第１のＨＥＭｉに到達するまでＨＥＭｉ群を通じてカウントし、最も高い数字のＨＥＭｉ（この実施形態ではＨＥＭｉ２２）からへＨＥＭｉ０へラッピングアラウンドする。従って、ＨＥＭｉ５及び１０が特定の共有ＲＡＭポートへのアクセスを必要とする場合、そのポートへのアクセス権がある直前のＨＥＭｉはＨＥＭｉ１５である。クロスバー・アービトレーション・ロジック２４１０が１５からカウントアップし、２２に達した後はラッピングアラウンドするので、ＨＥＭｉ５にはアクセス権が与えられる。ＨＥＭｉ５は第１のＨＥＭｉとなり、ポートへの要求されるアクセスに達する。様々な他の調停アルゴリズムが使用可能であることを理解されたい。
【０２７４】
クロスバー・アービトレーション・ロジック２４１０はまた、ポートへのアクセス権を獲得したＨＥＭｉが要求した場合に、ポートをしっかりと保持するするための機構を含む。これは、ＨＥＭｉが、中断すべきではないトランザクションを終了させることを可能にする。
【０２７５】
図２４に示した設計は、単一のフラッシュ・ポートを一度に追加することによりシステムの容量を増加させることができるので、モジュールの拡張性を可能にすることに留意されたい。そのためには、フラッシュ・ポート、フラッシュメモリ及びフラッシュＨＥＭｉの追加、並びに（ＨＥＭｉワークリスト（下記参照）を保持するために）追加された４つのＨＥＭｉに１つずつ共有ＲＡＭを追加することに加えて、各共有ＲＡＭについて４セットのＦＩＦＯポインタ・レジスタを追加することが必要である。共有ＲＡＭの追加はまた、追加的なＣＤＢ情報、ＩＯＰ及び転送要求に割り当て可能なスペースを追加する。加えて、クロスバー・スイッチ２２０１に新しい共有ＲＡＭポートを追加することは、比較的容易である。
【０２７６】
この種類の拡張は、新たに追加されたバンクにデータを分散させるために、共有ＲＡＭバンクのレイアウトの若干の再設計を必要とするが、このことは、共有ＲＡＭバンクの初期化に使用されるデータを改変することにより処理することができる。ＨＥＭｉファームウェアのＨＥＭｉは変更する必要がない。
【０２７７】
このモジュールデザインは、任意のソフトウエアまたは主要ハードウエアの変更を必要とすることなく、２つないし３つのフラッシュ・ポートを含む単純なシステムから最大で２３個のフラッシュ・ポートを含むより大きなシステムへの拡張を可能にする。従って、２つないし３つのＨＥＭｉのみを含む安価なワークステーションデザインまたはより大きなシステムに、同じアーキテクチャを使用することができる。
【０２７８】
共有ＲＡＭコントローラ２３０１はまた、共有ＲＡＭブロック３１８へのアクセスのためにＨＥＭｉにより使用される、共有ＲＡＭアクセス・レジスタ・ブロック２４１１を含む。ブロック２４１１は、次のレジスタを含む。
【０２７９】
共有ＲＡＭアドレス・レジスタ２４１２は、共有ＲＡＭ内に、アクセスの対象であるダブルワードのアドレスを含む。このアドレスの高次ビットは、選択する特定の共有ＲＡＭバンクを示し、低ビットはそのバンク内の位置を示す。
【０２８０】
共有ＲＡＭデータ・オートインクリメント（Autoinc）・レジスタ２４１３は、アドレス・レジスタにストアされているアドレスから読み出されたまたは前記アドレスに書き込まれるダブルワードのデータを保持する。共有ＲＡＭデータ・オートインクリメント・レジスタを使用することにより、アドレス・レジスタ２４１２の値は自動的にインクリメントされる。読出しのときは、アドレス・レジスタ２４１２は、データがレジスタ２４１３にコピーされたときに、インクリメントする。書込みのときは、アドレス・レジスタ２４１２は、データがレジスタ２４１３から書き出されたときに、インクリメントする。
【０２８１】
このオートインクリメント・レジスタは、データのＤＭＡ型ブロック転送の前に、リピート・カウント・レジスタ２７０２（図２７に関連して説明する）と共に使用される。必要とされる転送カウントはリピート・カウント・レジスタ２７０２に書き込まれ、初期アドレスはアドレス・レジスタ２４１２に書き込まれる。データ・オートインクリメント・レジスタ２４１３は、その後、リピート・カウント・レジスタに示された反復回数だけ読出しまたは書込みを繰り返す。各繰り返しにより、次のアクセスが共有ＲＡＭ内の次のダブルワードとなるように、アドレス・レジスタ２４１２をインクリメントする。
【０２８２】
共有ＲＡＭデータ・レジスタ２４１４は、データ・オートインクリメント・レジスタと同じ機能を行うが、アドレス・レジスタ２４１２のインクリメントは行わない。レジスタ２４１４は、同一メモリ位置への多重アクセスに使用される（例えば、変数を読出し、それを改変する）。
【０２８３】
マップナンバー（Mapnum）・レジスタ２４１５は、共有ＲＡＭブロック３１８内のＦＩＦＯのうちの１つを選択するのに使用される。
【０２８４】
トップ・レジスタ２４１６、アペンド・レジスタ２４１７、プッシュ・レジスタ２４１８及びポップ・レジスタ２４１９は各々、ダブルワードのデータを保持する。これらのレジスタは、マップナンバー・レジスタ２４１５によって選択されるＦＩＦＯへの４つの互いに異なる種類のアクセスに使用される。ＨＥＭｉは、ＦＩＦＯにおけるトップの値の位置を変更することなくＦＩＦＯのトップからの値を読み出すことができるか、またはＦＩＦＯからのトップの値を「ポップ」することができ、それにより、ＦＩＦＯトップがＦＩＦＯの次の値をポイントする。これらのオペレーションにより、戻ってきた値を、トップ・レジスタ２４１６またはポップ・レジスタ２４１９にそれぞれ書き込むことができる。
【０２８５】
ＨＥＭｉはまた、新しい値がＦＩＦＯの新しいトップになるように、ＦＩＦＯの値を「プッシュ」するか、またはＦＩＦＯのボトムに値を加えることができる。これらのオペレーションのために、書込みデータがＨＥＭｉによりプッシュ・レジスタ２４１８またはアペンド・レジスタ２４１７へそれぞれ配置される。
【０２８６】
ＦＩＦＯのトップまたはボトムに情報を配置する能力は、さらなる柔軟性を提供する。例えば、このことは、より重要なタスクをワークリストのトップに配置し、あまり重要でないタスクをボトムに配置することを可能にする。
【０２８７】
図２５は、データパスＤＲＡＭ１０７との間の入力パス及び出力パスを示す。現在の実施形態では、ＳＳＤコントローラ１０６は、ＤＲＡＭへのアクセスを要する１８個のリソース（構成による）、最大で１２個のフラッシュ・ステージバッファ（ＦＳＢ０ ３０８、ＦＳＢ１ ３１４及びＦＳＢ１１ ２５０１として示される。１〜１１のフラッシュ・ステージバッファは明瞭化の目的のために図示していない。上述したように、特定の実施形態ではＳＳＤコントローラ１０６は１２個未満のフラッシュ・ポートを有し得、それ故に、１２個未満のフラッシュ・ステージバッファを有し得る）、ＰＩＯバッファ２２０４、デバッグＦＩＦＯ２２１０、受信ステージバッファ０ １７０６、送信ステージバッファ０ １７０８、受信ステージバッファ１ １７０７及び送信ステージバッファ１ １７０９を含み得る。
【０２８８】
これらのリソースとデータパスＤＲＡＭとの間の経路は、本明細書では「チャネル」と呼ばれる。各リソースは、必然的に物理的な送信経路によってＤＲＡＭに接続されるが、チャネルは概念的なものであり、実際のバス構造を必ずしも反映するものではないことを理解されたい。
【０２８９】
現在の実施形態では、データパスＤＲＡＭ１０７は、ＤＲＡＭポート２５０２として表される単一の入／出力ポートを有するが、この目的のために使用され得る他のメモリはそれよりも多い数のポートを有し得る。上述したように、ＤＲＡＭスケジューラ２３０４はチャネル間で調停を行い、ＤＲＡＭポート２５０２へのアクセスが必要なチャネルに対して、アクセス権をラウンドロビン方式で割り当てる。代替実施形態では、他の調停スキームを使用することができる。例えば、転送されているデータの種類に応じてアクセスの優先順位を決めることができる。または、ＤＲＡＭへのリソース探索アクセス（例えばデバッグＦＩＦＯ２２１０）を、フラッシュ・ステージバッファへのアクセス以下の優先順位に設定することができる。
【０２９０】
図２５は、スイッチ２５０３により行われる、チャネルとＤＲＡＭポート２５０２との間の接続を示す。ＤＲＡＭスケジューラ２３０４の制御下で動作することにより、スイッチ２５０３は、１回につき、複数のチャネルのうちの１つをＤＲＡＭポート２５０２へ接続する。図２５に示す矢印は、接続の方向を示す。例えば、フラッシュ・ステージバッファ３０８は、ＤＲＡＭからの読出しまたはＤＲＡＭに書込みをすることができ、デバッグＦＩＦＯ２２１０は、ＤＲＡＭに書き込むことはできるがＤＲＡＭから読み出すことはできず、送信バッファ１７０８は、ＤＲＡＭから読み出すことはできるがＤＲＡＭに書き込むことができない。
【０２９１】
スイッチ２５０３は概念的なものであり、必ずしも、単一の大きなスイッチを表すものではない。代わりに、この機能を、様々な位置に配置された多数のロジック・ゲートから構成してもよい。この機能の正確な物理的デザインは、実施によって異なる。
【０２９２】
チャネルがＤＲＡＭポート２５０２へのアクセス権を得た場合、チャネルとＤＲＡＭとの間の移動は、それぞれ４つのダブルワードからなる転送から構成されるバーストを発生させる。このバーストは、読出しまたは書込みが完了するまで、またはチャネルに接続されたリソースが満杯になる（ＤＲＡＭからの転送の場合）か、または空になる（ＤＲＡＭへの転送の場合）まで継続される。バーストか終了したら、スイッチ２５０３によってそのチャネルはアクセス権を失い、ＤＲＡＭスケジューラ２３０４はアクセス権を必要とする次のチャネルへのアクセス権を与える。
【０２９３】
Ｅ．ＨＥＭｉ群
【０２９４】
上述したように、ＳＳＤコントローラ１０６は、本明細書ではＨＥＭｉ群（ＨＥＭｉ’ｓ）と呼ばれる多数のプロセッサを含む。本明細書では、「プロセッサ」または「マイクロプロセッサ」は、少なくとも基本的な算術演算及び／または論理演算を実行可能なＡＬＵ、データを保持するプロセッサに固有のメモリ及び、ＡＬＵの動作を制御するコントロール・ロジックを含むあらゆるロジック・ブロックを指す。コントロール・ロジックは、ハードウェア、ソフトウェア及び／またはファームウェアから構成される。本明細書では、「ＨＥＭｉ」は好適実施形態において用いられる特定のプロセッサを指すが、内部ＨＥＭｉのデザインの多くの詳細は本明細書では重要ではなく、明瞭化の目的のために省略されていることを理解されたい。加えて、このＨＥＭｉデザインは、好適プロセッサ実施形態を構成するが、他の様々なプロセッサデザインが可能である。
【０２９５】
現在の実施形態では、ＳＳＤコントローラ１０６は、以下に示す、最大で２３個のＨＥＭｉ群を含み得る（この実施形態では、ナンバリングシステムはギャップを含むことに留意されたい）。
ＨＥＭｉ ０：ホスト・ポート０（１７０２）用の受信ＨＥＭｉ
ＨＥＭｉ １：ホスト・ポート０（１７０４）用の送信ＨＥＭｉ
ＨＥＭｉ ２：ホスト・ポート１（１７０３）用の受信ＨＥＭｉ
ＨＥＭｉ ３：ホスト・ポート１（１７０５）用の送信ＨＥＭｉ
ＨＥＭｉ ８：ＳＣＳＩ ＨＥＭｉ（２００１）
ＨＥＭｉ ９〜１４：ＲｄＷｒ ＨＥＭｉ群（２１０１〜２１０６）
ＨＥＭｉ １５〜２６：フラッシュＨＥＭｉ群（例えば、３０７、３０９、３１３）
【０２９６】
ＨＥＭｉ群の内部機能の特定の態様を、図２６を示す。好適実施形態では、全てのＨＥＭｉ群が同一のハードウェア要素を共有しているが、様々なファームウェア・オーバレイを使用することにより及び別の密結合要素に接続することにより（両方とも詳細については後述する）、様々な機能のためにカスタマイズすることができる。
【０２９７】
各ＨＥＭｉは、１，０００の５６ｂｉｔ ＶＬＩＷ命令を実行するためのファームウェアを保持可能な命令ＲＡＭであるｉＲＡＭ２６０１を含む。これらの各命令は、１〜２の共有ＲＡＭまたはレジスタの位置を読み出し、ＡＬＵを実行し、その結果をライトバック（write back）または分岐させることができる。
【０２９８】
後述するように、データパスＤＲＡＭ１０７は、各種類のＨＥＭｉについて、最大で８つの異なるファームウェア・オーバレイをストアする。これらのオーバレイは、実行される機能に基づいて必要とされたときに、ｉＲＡＭ２６０１にコピーされる。このことは、各ＨＥＭｉが、ファームウェアがｉＲＡＭのサイズにより制限される場合に、可能な命令の数よりも多い数の命令を実施することを可能にする。
【０２９９】
ＨＥＭｉの命令は、１６ビットのアドレスに基づいてフェッチされる。そのアドレスの３ビットは、ファームウェア・オーバレイを選択し、１３ビットはｉＲＡＭ２６０１内の命令のアドレスを構成する。フェッチされている命令の３ビットのファームウェア・オーバレイがｉＲＡＭ２６０１に現在ストアされているオーバーレイと一致しない場合、ファームウェア・スワップがトリガーされる。
【０３００】
一般に、ファームウェア・オーバレイのスワッピングは、共通タスクの実行に必要な命令をサポートするファームウェアを一緒にまとめることにより避けることができる。例えば、単一のファームウェア・オーバレイは、読出し及び書込みに必要な共通するオペレーションの大部分を処理することができる。他のファームウェア・オーバレイは、例えば初期化及び誤り訂正を処理する。
【０３０１】
各ＨＥＭｉはまた、ＨＥＭｉにより使用されるデータのストレージ・スペースとしての役割を果たす、２キロバイトのｍＲＡＭ２６０２を含む。
【０３０２】
図２６に示すように、各ＨＥＭｉは、フェッチ・ステージ２６０３、バッファ・ステージ２６０４、デコード・ステージ２６０５、リード・ステージ２６０６、ＡＬＵステージ２６０７及びライトバック・ステージ２６０８から構成される６ステージのパイプラインを含む。好適実施形態ではこれらの各ステージはＨＥＭｉ内のロジック・ブロックを構成するが、代替実施形態では各ステージはその状態の生成に使用されるオーバーレイング・プロセッサ・ハードウェアから独立してＨＥＭｉ状態を表すことができる。
【０３０３】
フェッチ・ステージは、実行される命令に関連するファームウェアのｉＲＡＭアドレスを判断する。そのアドレスはその後、フェッチ・ステージ２６０３とｉＲＡＭ２６０１との間の矢印によって示されるように、ｉＲＡＭへ送信される。
【０３０４】
そのアドレスでのファームウェアはその後、ｉＲＡＭ２６０１とＩバッファ・ステージ２６０４との間の矢印によって示されるように、バッファにロードされる。
【０３０５】
前記ファームウェアはその後、デコード・ステージ２６０５へ伝達される（Ｉバッファ・ステージ２６０４とデコード・ステージ２６０５との間の矢印によって示されるように）。デコード・ステージは、前記命令をデコードし、ジャンプ及びコールを実行する。また、デコード・ステージは、ジャンプ及びコールをフェッチ・ステージ２６０３へ送り戻す（デコード・ステージ２６０５からフェッチ・ステージ２６０３への矢印によって示されるように）。直線的な命令を実行する場合は、デコード・ステージ２６０５はリード・ステージ２６０６へパラメータを送信する。これらのパラメータは、要求されたオペレーションのためにデータを検索すべき位置を含む。
【０３０６】
リード・ステージ２６０６は、命令からの要求に応じて、１または２のメモリ若しくはレジスタ位置を読み出す。２つの位置を読み出す場合は、リード・ステージ２６０６の出力からその入力へループバックされる矢印によって示されるように、リード・ステージ２６０６は繰り返される。外部リード２６０９からリード・ステージ２６０６を指す矢印により示されるように、情報のためのソースには、ＲＡＭ２６０２及び外部メモリまたはレジスタが含まれる（概念的に外部リード２６０９によって示される）。図２６には図示しないが、情報はまた、内部レジスタからも入力される。
【０３０７】
リード・ステージ２６０６は、ＨＥＭｉのＡＬＵによるオペレーションのために、取得した情報をＡＬＵステージ２６０７へ送信する。そのオペレーションの結果は、フェッチ・ステージ２６０３（条件付き分岐｛ぶんき｝の場合）またはライトバック・ステージ２６０８へ送信される。
【０３０８】
ライトバック・ステージ２６０８は、ＡＬＵ動作の結果を、前記命令に指定された位置に書き込む。ライトバック・ステージ２６０８から延びる矢印によって示されるように、結果はｍＲＡＭ２６０２または外部リソースへ書き込まれる（外部ライト２６１０により概念的に示す）。
【０３０９】
図２７は、図２６に図示していないＨＥＭｉの態様を示し、様々なメモリ範囲アクセスに使用されるレジスタ及び、ＨＥＭｉに密結合したロジック（密結合ロジックブロック２７０１）を含んでいる。ＨＥＭｉ及び密結合ロジックの両方は、レジスタ及び本明細書中では示されていない他の構成要素を含み得ることを理解されたい。加えて、レジスタセット自体は、説明の目的のために単純化されている。
【０３１０】
図２７は、フラッシュＨＥＭｉ３０７及びその密結合ロジック・ブロック２７０１を示す。上述したように、全てのＨＥＭｉ群の内部デザインは同じである。しかし、互いに異なる種類のＨＥＭｉ群は、互いに異なる密結合ロジック・ブロックを有する。ブロック２７０１は、フラッシュＨＥＭｉ群に特有のものである。他の種類のＨＥＭｉ群のための密結合ロジックの差異は後述する。
【０３１１】
ＨＥＭｉ３０７は、オペレーションを繰り返すべき回数を計算するのに使用される値を保持するリピート・カウント・レジスタ２７０２を含む。或る値をリピート・カウント・レジスタにロードすると、ＨＥＭｉにより実行され特定の回数繰り返される次回の命令が生成される。各繰り返しは、リピート・カウント・レジスタ内の値をデクリメントする。
【０３１２】
様々な状況下で、リピート・カウント・レジスタ２７０２の値が「１」になると、ループは終了する。
【０３１３】
（ａ）リピート・カウント・レジスタの結果により条件付き分岐命令がループされ、分岐が行われるように状態が発生する場合、リピート・カウント・レジスタは自動的に、次回の命令を一度に行わせる「１」にされる。この条件付き分岐の場合は、この次回の命令は、分岐における第１の命令となることを理解されたい。
【０３１４】
（ｂ）リピート・カウント・レジスタに関連するフラグが設定された場合、特定のＦＩＦＯカウント・レジスタをゼロから１までインクリメントする任意のアクションが、リピート・カウント・レジスタの値を１にする。ＦＩＦＯカウント・レジスタは、ＨＥＭｉ（例えば、図２４に関連して説明したカウント・レジスタ２４０８）及び受信バッファ・カウント・レジスタ（図２８に関連して後述する）のためのワークリストに関連するものである。
【０３１５】
この機能は、ＨＥＭｉ群が実行すべきタスクを有する場合に、ＨＥＭｉ群をスリープ・モードから復帰させるのに使用される。ＨＥＭｉ群が実行すべき作業を有していない場合、ＨＥＭｉ群はスリープ・モードに入り、ＮＯＰ（ノーオペレーション命令）が、設定された回数繰り返される。そして、ＨＥＭｉが復帰すると、そのワークリストをチェックし、ワークリストにタスクが存在しない場合は、ＮＯＰの実行を再開する。これは、設定回数をリピート・カウント・レジスタ２７０２にロードし、その後、ＮＯＰを実行させることにより実現される。
【０３１６】
ＨＥＭｉがスリープ・モードの場合、ＨＥＭｉのワークリスト（下記参照）へタスクを書き込むと、ＨＥＭｉが復帰する。このことは、関係のあるカウント・レジスタから信号によりリピート・カウント・レジスタ２７０２を「１」にしてＨＥＭｉを復帰させ、次回のＮＯＰが実行された後に適切な行動を取らせることにより実現される。
【０３１７】
リピート・カウント・レジスタを使用してＮＯＰを繰り返すことにより、特別なスリープ・モード・ロジックを必要とせずに、ＨＥＭｉを低電力スリープ・モードにさせることが可能となる。加えて、このことにより、ＨＥＭｉをスリープ・モードのままにする期間を非常にきめ細かい精度で調節することが可能になる。例えば、現在実施すべき作業がないためにＨＥＭｉがスリープ・モードに入った場合、最大値がリピート・カウント・レジスタに書き込まれる好適実施形態では、この値は、１００万を若干超えた値であり、ＨＥＭｉは約４ミリ秒の間スリープ・モードに維持される。
【０３１８】
別の例では、ＨＥＭｉが多重または分割されたオペレーションを開始する場合、オペレーションが３２のＨＥＭｉサイクルを行うように、リピート・カウント・レジスタを使用して３２ＮＯＰを実行することができる。このことにより、後述するように、ＨＥＭｉの他の部分のオペレーションとは独立的に動作することができるロジックにより処理される多重または分割されたオペレーションの結果を待ちながら、ＨＥＭｉが低電力スリープ・モードに入ることが可能となる。
【０３１９】
さもなければコードのループが遮断されるので、上述したフラグは、ＮＯＰを実行する場合にリピート・カウント・レジスタを１にするために使用されることに留意されたい。この理由により、リピート・カウント・レジスタの後にＮＯＰが行われる場合はフラグが設定されるが、他の命令のためには設定されない。
【０３２０】
ＨＥＭｉ３０７はまた、ＨＥＭｉ群のｉＲＡＭ２６０１及びｍＲＡＭ２６０２へのアクセスを制御するローカル・レジスタ・ブロック２７０３を含む。
【０３２１】
ローカル・アドレス・レジスタ２７０４は、ローカル・メモリ内にアドレスを保持する。このアドレスは、ｉＲＡＭまたはｍＲＡＭのいずれかであり得、アドレスの高次ビットに依存する。ローカル・データ・オートインクリメント・レジスタ２７０５は、ローカル・メモリから読み出されたまたはローカル・メモリへ書き込まれるデータのダブルワードを保持する。このレジスタからの読出しは、ローカル・アドレス・レジスタ２７０４のインクリメントを引き起こす。ローカル・アドレス・レジスタ２７０４への値の書込み、リピート・カウント・レジスタ２７０２への値のロード、及び、ｍＲＡＭからレジスタ２７０５へ及びレジスタ２７０５から別の位置への移動の実行（これらの移動は１つの命令により実行される）により、ＨＥＭｉはｍＲＡＭ内の連続するアドレスからの一連のダブルワードのＤＭＡ様の移動を実行することができる。各ループは、レジスタ２７０４の自動的なインクリメント及びリピート・カウント・レジスタ２７０２の自動的なデクリメントを引き起こし、前記移動は、リピート・カウント・レジスタ２７０２がゼロになるまで継続される。ターゲットがデータ・オートインクリメント・レジスタを同様に使用する場合、追加的なロジックまたは命令を必要とせずに、前記移動はターゲット内の連続的なアドレスに再びストアされることに留意されたい。
【０３２２】
ローカル・データ・レジスタ２７０６は、ローカル・メモリから読み出されたまたはローカル・メモリに書き込まれるデータのダブルワードを保持するが、このレジスタはアドレスのインクリメントは引き起こさない。
【０３２３】
ＡＲＭ２００２は、専用ポートを経由して、ローカル・レジスタ・ブロック２７０３と通信する。ＡＲＭ２００２は、ｉＲＡＭ２６０１に対応するローカル・アドレス・レジスタ２７０４にアドレスを書き込むことができる唯一のソースである。ＡＲＭ２００２は、この機能を使用して、ｉＲＡＭ２６０１に新しいファームウェアをオーバーレイする処理を制御する。
【０３２４】
ＨＥＭｉ３０７はまた、各々が１つのアドレスをＨＥＭｉのｍＲＡＭ２６０２内に保持する５つのレジスタからなるウィンドウ・レジスタ２７０７を含む。これらのレジスタのうちの４つは、それぞれ１２８のダブルワードからなるウインドウをｍＲＡＭ内にセットアップするのに使用される。これらのウィンドウは、転送要求やページ要求などのデータ構造を作動させるために使用される。例えば、ページ要求を実行するためにフラッシュＨＥＭｉが必要とされる場合、そのページ要求のｍＲＡＭ内のアドレスが、ウィンドウ・レジスタのうちの１つにロードされる。ページ要求の特定の領域へのアクセスは、その後、ウィンドウ・レジスタ内の値とのオフセットとして処理することができ、それにより、データ構造に繰り返しオペレーションが要求される場合のアドレス計算過程が単純化される。
【０３２５】
５番目のウィンドウ・レジスタはｍＲＡＭスタックのために使用され、ローカル変数及び関数の独立変数をストアする。このスタック・ウィンドウ・レジスタは、他の４つのウィンドウ・レジスタと同様に動作するが、ＨＥＭｉ群が特別なスタック関連命令を有し、スタック・ウィンドウ・レジスタ内の値を自動的にインクリメントまたはデクリメントし、スタック・ウィンドウ・アドレスへオフセットを自動的に追加する機能を提供し、それにより１つのクロック・スタック動作を可能にする点が異なる。
【０３２６】
ローカル・レジスタ・ブロック２７０３及びウィンドウ・レジスタ２７０７を含むＨＥＭｉ群の内部レジスタは、「ハザードチェック」されている。ＨＥＭｉはパイプライン型プロセッサなので、書込み動作がそのような保護をすることなく移動オペレーションをすぐに実行する場合、その書込みは実質的に移動後に行われる。従って、書込み命令がレジスタ内への値の書込みであり、そのすぐ後の命令がレジスタの内容を別の位置へ移動させる場合、パイプラインは書込み前にレジスタの古い内容を移動させることができる。ハザードチェックは、そのような場合をチェックし、その後の命令を、適切なデータがロードされるまで遅延させることにより、この可能性を避ける。
【０３２７】
乗／除算エンジン２７１７は、多重及び分割オペレーションを実行するのに使用される。乗／除算エンジンは、ＨＥＭｉの残りの部分に対して独立的に動作することができるので、ＨＥＭｉは、実行される値を乗／除算エンジン２７１７内のレジスタに書き込んだ後に、オペレーションが実行されるまでスリープ・モードに入ることができる。このことにより電力が節約される。スリープ・モードについては後述する。
【０３２８】
手動ＣＲＣエンジン２７１９は、関連するＨＥＭｉにより書き込まれる情報のためのＣＲＣ値を生成する。
【０３２９】
スイッチ・エンディアン・エンジン２７２０は３２ビット・レジスタであり、レジスタに書き込まれたデータのバイト順を自動的にスワップする。このことは、互いに異なるプロトコルが互いに異なるバイト順を有するために行われる。データはフラッシュにリトルエンディアン形式でストアされるが、特定のプロトコルの場合は、ビッグエンディアン形式で送受信する必要がある。
【０３３０】
各ＨＥＭｉはまた、密結合ロジック・ブロック２７０１などの関連する密結合ロジックのブロックを有する。密結合ロジック・ブロック２７０１は、各フラッシュＨＥＭｉに密結合されたロジックを示す。後述するように、ロジック・ブロックは、密結合ロジック・ブロック２７０１とは幾つかの点で互いに異なる別の種類のＨＥＭｉ群に密結合される。従って、全てのＨＥＭｉの内部デザインが同一であるにも関わらず、互いに異なる密結合ロジックの使用に加えて互いに異なるファームウェアを使用することにより、各種類のＨＥＭｉをその特定のタスクのためにカスタマイズすることが可能となる。
【０３３１】
密結合ロジック・ブロック２７０１は、ＨＥＭｉ３０７に「密結合」されているリソースからなる。これは、ＨＥＭｉ３０７が、アドレス・スペースを共有するこれらのリソースにアクセスできる唯一のであることを意味し、これらのリソースへのアクセスは、ノー・ウェイト（待ち時間なし）状態で引き起こされる。
【０３３２】
好適実施形態では、密結合ロジックはＨＥＭｉの外部に設けられるが、代替実施形態では、このロジックの一部または全部をＨＥＭｉ自体に組み込むことができる。
【０３３３】
密結合ロジック・ブロック２７０１は、フラッシュＨＥＭｉ（例えばフラッシュ・ステージバッファ３０８）に関連するフラッシュ・ステージバッファへのアクセスを制御するステージバッファ・アクセス・レジスタ・ブロック２７０８を含む。
【０３３４】
アドレス・レジスタ２７０９、データ・レジスタ２７１０及びデータ・オートインクリメント・レジスタ２７１１は、共有ＲＡＭアクセス・レジスタ・ブロック２４１１内の対応するレジスタと同様に動作する。
【０３３５】
フラッシュＨＥＭｉ群は、ステージバッファへのこのアクセス経路を利用して、ステージバッファを通過するとき及び予期せぬ電力損失後に必要とされる再構築の間に（再構築の過程は図５８に関連して後述する）、スーパーブロック・メタデータ・テーブル内にストアされているタイムスタンプ情報を改変する。
【０３３６】
フラッシュ転送カウント・レジスタ２７１２、フラッシュ・アドレス・レジスタ２７１３及びフラッシュ・データ・レジスタ２７１４は、フラッシュ・グループとフラッシュ・ステージバッファとの間のＤＭＡオペレーションを制御する。レジスタ２７１３は、アクセスすべきフラッシュ・アドレスを含む。レジスタ２７１２は、読出しまたは書込みのダブルワードのカウントを含む。レジスタ２７１４は、フラッシュから受信したまたはフラッシュへ送信するデータを含む。
【０３３７】
ＤＭＡアドレス・レジスタ２７１５及びＤＭＡ転送カウント・レジスタ２７１６は、データパスＤＲＡＭ１０７とステージバッファとの間でのＤＭＡ転送のステージバッファ側を制御するのに使用される。レジスタ２７１５は、転送用のステージバッファ・アドレスを保持し、レジスタ２７１６は、ステージバッファとＰＩＯバッファとの間の転送のダブルワードのカウントを保持する。レジスタ２７１６への値の書込みは、ステージバッファとＰＩＯバッファとの間でのＤＭＡ転送を引き起こす。
【０３３８】
一般に、ＨＥＭｉは、内部移動コマンドを使用して、内部ロケーション、密結合ロジック及び特定の外部ロケーションの間でデータを移動させることができる。従って、例えば、新しいファームウェア・オーバレイが必要な場合、ＡＲＭプロセッサ２００２は、オーバレイ用のＤＲＡＭアドレスをＤＲＡＭアドレス・レジスタ２２１２に設定し（後述するように、ファームウェア・オーバレイはＤＲＡＭにストアされている）、オーバレイ用のｉＲＡＭアドレスをローカル・アドレス・レジスタ２７０４に設定し、ＤＲＡＭからの転送カウントを転送カウント・レジスタ２２１３に設定し、そして、転送に必要なダブルワードの数をリピート・カウント・レジスタ２７０２に設定する。ＤＲＡＭからＰＩＯバッファを介したデータ・レジスタ２２１４へのＤＭＡ転送は、上述したようにして行われる。内部ＨＥＭｉロジックは、レジスタ２２１４からローカル・データ・オートインクリメント・レジスタ２７０５へのデータの書込み及び、ローカル・アドレス・レジスタ２７０４により指示されるレジスタ２７０５からｉＲＡＭ位置への書込みを引き起こす。リピート・カウント・レジスタ２７０２はその後デクリメントされ、前記プロセスが繰り返される。ＡＲＭ２００２はこの機能を、初期ファームウェア・オーバレイを各ＨＥＭｉのｉＲＡＭにロードする時間をブートするのに使用する。
【０３３９】
別の例を挙げると、共有ＲＡＭからＨＥＭｉのｍＲＡＭへのＩＯＰのコピーは、４つのＨＥＭｉコマンドのみを必要とする。
【０３４０】
共有ＲＡＭアドレス・レジスタに共有ＲＡＭアドレスを書き込む；これは、共有ＲＡＭのＩＯＰのアドレスをレジスタ２４１２に書き込む。
【０３４１】
ローカル・アドレス・レジスタにｍＲＡＭアドレスを書き込む；これは、ＩＯＰがストアされるｍＲＡＭ内のアドレスをレジスタ２７０４に書き込む。
【０３４２】
リピート・カウント・レジスタに、ＩＯＰのダブルワードの数を書き込む；これは、リピート・カウント・レジスタ２７０２に、ＩＯＰに含まれるダブルワードの数をロードする。
【０３４３】
ローカル・データ・オートインクリメント・レジスタ、共有ＲＡＭデータ・オートインクリメント・レジスタを移動させる；これは、レジスタ２４１３からレジスタ２７０５へ値を移動させる。レジスタ２４１３内の値は、レジスタ２４１２によりポイントされる共有ＲＡＭ内のダブルワードである。その値のレジスタ２７０５への移動は、アドレス・レジスタ２７０によりポイントされたｍＲＡＭ位置への転送により引き起こされる。２つのデータ・オートインクリメント・レジスタの自動的な特定は、移動が生じたときにインクリメントさせられる関連するアドレス・レジスタにより引き起こされる。上述したように、この移動命令は、リピート・カウント・レジスタの値のゼロになるまで繰り返される。
【０３４４】
このようにして、ＨＥＭｉは、最低限の数のコマンドで自動的に行われるＤＭＡ様のアクセスを実現することができる。
【０３４５】
密結合ロジック・ブロック２７０１はまた、デバッグ・レジスタ・ブロック２７１８を含む。デバッグ・レジスタ・ブロック２７１８は、デバッグＦＩＦＯ２２１０への及びデバッグＦＩＦＯ２２１０からの転送に関するレジスタを含む。
【０３４６】
上述したように、密結合ロジック・ブロック２７０１は、フラッシュＨＥＭｉ群に対して特有である。密結合ロジック・ブロックは、他のＨＥＭｉ群と関連するが、ステージバッファ・アクセス・レジスタ・ブロック２７０８とは関連しない。
【０３４７】
受信ＨＥＭｉ群及び送信ＨＥＭｉ群（例えば受信ＨＥＭｉ０ １７０２及び送信ＨＥＭｉ０ １７０４）用の密結合ロジック・ブロックは、ホスト・ポート・オペレーションをサポートするようにデザインされた追加的なレジスタを含む。そのようなレジスタは、図２８に示されている。
【０３４８】
受信ＨＥＭｉ群用の密結合ロジック・ブロックは、ホスト・ポートとの通信のために及びホスト・ポートに関連する受信機能を制御するために使用される以下のレジスタを含む。
【０３４９】
受信バッファ・アクセス・レジスタ・ブロック２８０１：これは、受信ステージバッファからデータパスＤＲＡＭ１０７へのＤＭＡ転送を設定するのに使用される。このブロックは、転送用のＤＲＡＭアドレスを保持するＤＭＡアドレス・レジスタ２８０２と、実行すべき転送カウントを保持するＤＭＡ転送カウント・レジスタ２８０３とを含む。
【０３５０】
受信バッファ・カウント・レジスタ２８０４：これは、受信ステージバッファ データＦＩＦＯのエントリの数を与える。或る値をこのレジスタに書き込むと、受信ＨＥＭｉをそのスリープ・モードから復帰させることができる。
【０３５１】
プリミティブＦＩＦＯアクセス・レジスタ・ブロック２８０５：この１組のレジスタはインバウンド・プリミティブＦＩＦＯ１８０８と通信する。これらのレジスタは、トップ・レジスタ２８０６（ＦＩＦＯのトップを変更することなく、ＦＩＦＯから読み出される）、ポップ・レジスタ２８０７（ＦＩＦＯからトップアイテムを読み出し、ＦＩＦＯのトップを次のアイテムに移動させる）、カウント・レジスタ２８０８（ＦＩＦＯ内のアイテムの数を含む）及びアペンド・レジスタ２８０９（ＦＩＦＯのエンドにアイテム追加する）を含む。
【０３５２】
非データ・ペイロード・アクセス・レジスタ・ブロック２８１０：この１組のレジスタは非データ・ペイロードＦＩＦＯ１８０４と通信する。これらのレジスタは、プリミティブＦＩＦＯアクセス・レジスタ・ブロックにおける同様に名付けられたレジスタと同様に動作する、トップ・レジスタ２８１１、ポップ・レジスタ２８１２、カウント・レジスタ２８１３及びアペンド・レジスタ２８１４を含む。
【０３５３】
ヘッダ・サイズ・レジスタ２８１５：これは、現在ヘッダの長さを示す。この値は、受信ＨＥＭｉが、非データ・ペイロードＦＩＦＯ上で或るヘッドとその次のヘッダとを区別することを可能にする。
【０３５４】
プリミティブ・マッチ・レジスタ・ブロック２８１６：これらのレジスタは、特定のプロトコルのためにプリミティブ・マッチ・ロジックをカスタマイズするために、値をプリミティブ・マッチ・ロジック１８０２へロードするのに使用される。プリミティブ・マッチ・ロジック１８０２の使用及びカスタマイズは、図１９に関連して上述した。
【０３５５】
上述したように、プリミティブ・マッチ・ロジック１８０２は、プリミティブ・マッチ・レジスタ１９０２及びプリミティブ・マッチ・コントロール・レジスタ１９０３の２セットのレジスタを含む。プリミティブ・マッチ＃レジスタ２８１７は、プリミティブ・マッチ・ロード・レジスタ２８１８にストアされたプリミティブ・マッチ・レジスタ１９０２内の対応するレジスタへロードされる値、及び、リミティブ・マッチ・コントロール・ロード・レジスタ２８１９にストアされたプリミティブ・マッチ・コントロール・レジスタ１９０３内の対応するレジスタにロードされる値を生成する、各セットの１６個のレジスタのうちの１つを指す。
【０３５６】
ＷＷＮハッシュ・エンジン２８３０を使用して、受信した６４ビットのワールドワイドネーム値の２４ビットのハッシュが生成される。このハッシュは、受信したフレーム（送信者のＷＷＮの２４ビットのハッシュ値を含み得る）が、６４ビット値を含むイニシエータ・テーブル４１０８（下記参照）と一致するように内部で使用される。
【０３５７】
図２８は、ユニークな送信ＨＥＭｉ密結合レジスタを示す。
【０３５８】
送信バッファ・アクセス・レジスタ・ブロック２８２０：これは、データパスＤＲＡＭ１０７からのＤＭＡ転送の送信ステージバッファ側のセットアップに使用される。このレジスタ・ブロックは、ＤＭＡアドレス・レジスタ２８２１及びＤＭＡ転送カウント・レジスタ２８２２を含む。
【０３５９】
送信フレーム・バッファＦＩＦＯアクセス・レジスタ・ブロック２８２３：この１組のレジスタは、送信フレーム・バッファ１８０６の一部であるＦＩＦＯと通信する。これらのレジスタは、ポップ・レジスタ２８２４、カウント・レジスタ２８２５及びアペンド・レジスタ２８２６を含む。
【０３６０】
コマンドＦＩＦＯアクセス・レジスタ・ブロック２８２７：この１組のレジスタは、送信フレーム・バッファ１８０６の一部であるＦＩＦＯと通信する。これらのレジスタは、カウント・レジスタ２８２８及びアペンド・レジスタ２８２９を含む。
【０３６１】
図２９は、フラッシュＨＥＭｉ（例えばＨＥＭｉ３０７）のｍＲＡＭの内容を示す。
【０３６２】
１．ローカル転送要求テーブル２９０１。これは、最大で６つの転送要求を保持するスペースを含む。これらは、共有ＲＡＭからこのフラッシュＨＥＭｉのｍＲＡＭへコピーされた転送要求と、ガベージ・コレクション（下記参照）などの内部オペレーションに関連して取得されたローカル転送要求との組み合わせであり得る。例えば、スロット２９０２は、１つの転送要求をストアすることができ、スロット２９０３は１つの第２の転送要求をストアすることができる。
【０３６３】
２．ローカル転送要求キュー２９０４。これは、テーブル２９０１にストアされている転送要求のＦＩＦＯキューであり、フラッシュＨＥＭｉにより動作されるまでキューに入れられる。後述するように、一般に、転送要求に関連するページ要求が完了したときに及び転送要求それ自体が完了状態に入る準備ができた際に、転送要求はこのキューを受ける。
【０３６４】
３．ローカル転送要求フリーリスト２９０５。これは、空であり、それ故に新しい新しい転送要求を保持することができるローカル転送要求テーブル２９０１内のスロットへのポインタのリストを保持する。
【０３６５】
４．ページ要求テーブル２９０６。最大で１８のページ要求を保持するためのスペースを含む。各転送要求は、３つのページ要求を呼び出すことができる。そのため、ページ要求テーブル２９０６は、フラッシュＨＥＭｉ転送要求テーブル２９０１に適合させることが可能な６つの転送要求により呼び出されることができる１８のページ要求のためのスペースを含む。図示した例では、ページ要求テーブル２９０６は、フラッシュＨＥＭｉ転送要求テーブル２９０１、スロット２９０２内の転送要求のためのページ要求を保持するスロット２９０７及び２９０８内にページ要求を含み、スロット２９０９内のページ要求はスロット２９０３内の転送要求のためのものである。この例では、他のページ要求・スロットは空であり、これは、スペースが割り当てられているが現在は有効なページ要求によって満たされていないことを意味する。
【０３６６】
５．ページ要求フリーリスト２９１０。これは、ページ要求テーブル２９０６における全ての空いている（現在有効なページ要求を保持していない）ページ要求スロットのリストである。このリストはそれ故に、フラッシュＨＥＭｉが命令することができる新しいページ要求を表す。
【０３６７】
６．バンク・キュー２９１１。これは、テーブル２９０６にストアされているページ要求の１組のＦＩＦＯキューである。フラッシュ・グループ内の各バンクに対して互いに異なるページ要求が存在する。ページ要求の実行の準備が整ったら、読出しまたは書込みのためにページ要求が要求されるアドレスを保持するバンク・キューのエンドに付け加えられる。フラッシュＨＥＭｉは、バンク・キューの間で順番に交代する。ページ要求を含むバンク・キューにローテートした場合、ページ要求の継続的な実行に不可欠なリソースが利用可能であるかどうかを判断するために、トップのページ要求をキュー上で評価する。リソースが利用可能である場合、フラッシュＨＥＭｉは、利用可能なリソースを与えることが可能なページ要求に必要とされるタスクを実行し、その後、次のバンク・キューへローテートする。このようにして、フラッシュＨＥＭｉは、調停ロジックと必要とせずに、ページ要求をラウンドロビン方式で処理する。処理を完了したページ要求は、バンク・キューから除去される。このプロセスの詳細は、図５３に関連して後述する。
【０３６８】
現在の実施形態では、バンク・キューはＦＩＦＯであり、ページ要求は受信した順に処理される。代替実施形態では、優先順位の高いページ要求が、バンク・キューのボトムではなく、バンク・キューのトップに追加される。この実施形態では、特に重要なトランザクションを特定する呼び出し転送要求における優先順位ビットに基づいて、優先順位のビットがページ要求に設定され得る。
【０３６９】
８．スーパーブロック・フリーリスト２９１２。これは、空いておりそれ故に書込みに利用可能なこのフラッシュＨＥＭｉにより制御されるフラッシュ・グループに含まれるスーパーブロックのための識別子を含む。
【０３７０】
９．スーパーブロック・フリーリスト・カウンタ２９１３。これは、フリーリスト２９１２上のスーパーブロックの数を含む。この数は、性能の最適化のために別々に記録され、必要に応じて計算する必要はない。
【０３７１】
１０．オープン・スーパーブロック・ポインタ２９１４。これは、現在書込みオープンしているスーパーブロックのための指定を保持する。
【０３７２】
１１．ガベージ・コレクション閾値２９１５。現在の実施形態では、これは、両方ともガベージ・コレクションの目的のために使用されるリティカルな閾値及び非クリティカルな閾値の２つの変数を保持する。ガベージ・コレクションでのこれらの変数の使用は後述する。
【０３７３】
１２．ローカル変数２９１６。現在の実施形態では、これは、ＨＥＭｉにより使用される様々なローカル変数を保持する。
【０３７４】
１３．スタック・スペース２９１７。これは、タスクを処理するためにＨＥＭｉにより使用されるスタックを保持する。
【０３７５】
１４．コマンド・テーブル２９１８。これは、コマンドと、現在にフラッシュＨＥＭｉにより処理されている全ての転送要求により影響を受けるＬＢＡ範囲とのリストを保持する。
【０３７６】
上述したように、ＳＳＤコントローラ１０６は、それらのオペレーションが順番通りに行われるのを確実にするために、読出し／書込みコヒーレンシを実施する。フラッシュ・ポート・レベルでのコヒーレンシを実施するために、コマンド・テーブル２９１８がフラッシュＨＥＭｉにより使用される。フラッシュＨＥＭｉのワークリストから転送要求がポップし、ローカル転送要求テーブル２９０１にコピーされた場合、転送要求の影響を受けるＬＢＡ範囲はコマンド・テーブル２９１８に対してチェックされる。オーバーラップが存在する場合、初期の転送要求が完了するまで転送要求の実行がストールされ、その時点では、エントリがコマンド・テーブル２９１８から除去され、後の転送要求が除去されるまで保留される。フラッシュＨＥＭｉでの実行のために転送要求がクリアされると、その転送要求により影響を受けるＬＢＡ範囲がコマンド・テーブル２９１８に追加される。
【０３７７】
１５．スーパーページ・ポインタ・リスト２９１９。このリストは、このフラッシュＨＥＭｉに関連するフラッシュ・グループの各バンクについて１つのエントリを含む。各バンクについて、関連するエントリは、現在開いているスーパーブロックの次の空きスーパーページを指す。スーパーブロックが最初から開いておりデータを含んでいない場合、バンク１〜７はスーパーページ０を指し、バンク０はスーパーページ１を指す（各スーパーブロックのバンク０のスーパーページ０は、スーパーブロック・メタデータ・テーブルを含み、それ故に通常の書込みには利用できない）。
【０３７８】
フラッシュＨＥＭｉは、これらのカウンタを使用してスーパーページを書込みコマンドを含むページ要求に割り当てる。それ故に空のスーパーページが必要となる。スーパーページにページ要求を割り当てた場合（ページ要求の初期化中に起こる）、そのスーパーページを含んでいるバンクのためのスーパーページ・ポインタ・リスト２９１９内のエントリがインクリメントされる。
【０３７９】
リスト２９１９は、一実施形態では、オープン・スーパーブロック２９１４の情報と同一のデータ構造に含まれ得ることに留意されたい。
【０３８０】
１６．バンク・ビットマップ２９２０。このテーブルは、各バンクに対して２つのビットを保持する。一方のビットは、バンク・キューのトップでのページ要求が、バンクの動作を必要とするか否かを示す。他方のビットは、バンクのためのＲＢ信号がレディ状態であるか否かを示す。フラッシュＨＥＭｉは、このビットマップをチェックして、ページ要求のサービスを開始するべきか否かを判断する。
【０３８１】
共有ＲＡＭへアクセスするための共有ＲＡＭ・アクセス・レジスタ・ブロック２４１１の使用は、図３０に示されている。図３０は、共有ＲＡＭからのデータブロックの転送（例えば転送要求）に用いられる一連ステップを示す。
【０３８２】
ステップ３００１では、共有ＲＡＭ内の所望のデータのアドレスが、共有ＲＡＭアドレス・レジスタ２４１２に書き込まれる。この例では、これは、転送要求テーブル４１１１（下記参照）における転送要求のアドレスである。
【０３８３】
ステップ３００２では、データが転送されるＨＥＭｉ ｍＲＡＭアドレスが、ローカル・アドレス・レジスタ２７０４に書き込まれる。この場合、アドレスは、ローカル転送要求テーブル２９０１内の空のスロットを指す。
【０３８４】
ステップ３００３では、転送の完了に必要なダブルワードの数に対応する値が、リピート・カウント・レジスタ２７０２に書き込まれる。
【０３８５】
ステップ３００４では、ＨＥＭｉは、共有ＲＡＭから共有ＲＡＭデータ・オートインクリメント・レジスタ２４１３への読出しと、レジスタ２４１３からローカル・データ・オートインクリメント・レジスタ２７０５への読出しとを引き起こすコマンドを実行する。共有ＲＡＭからの読出しは、共有ＲＡＭアドレス・レジスタ２４１２内に特定されたアドレスで行われる。ローカル・データ・オートインクリメント・レジスタへの読出しは、ローカル・アドレス・レジスタ２７０４により特定されたｍＲＡＭ内のロケーションへのデータの書込みを引き起こす。２つのデータ・オートインクリメント・レジスタの使用は、それぞれのアドレス・レジスタの自動的なインクリメントを引き起こす。このコマンドの実行は、リピート・カウント・レジスタ２７０２のデクリメントを引き起こす。このＨＥＭｉデザインは、このステップを１回の命令で処理することを可能にすることに留意されたい。
【０３８６】
ステップ３００５では、リピート・カウント・レジスタ２７０２が０の値を含んでいるか否かをチェックする。
【０３８７】
リピート・カウント・レジスタ２７０２の値が０（ゼロ）であった場合（ステップ３００５の結果が「ｙｅｓ」）、転送は完了したと判断して、処理を終える。
【０３８８】
リピート・カウント・レジスタ２７０２の値が０（ゼロ）を超える値であった場合（ステップ３００５の結果が「ｎｏ」）、これは、さらなる転送が必要であることを示す。その場合、次のダブルワードの転送のためにステップ３００４へ戻る。
【０３８９】
ステップ３００４と３００５との間のループは、フラッシュＨＥＭｉのさらなる介入なしに連続することに留意されたい。アドレス・レジスタと、実行命令の繰り返しを行わせるリピート・カウント・レジスタのインクリメントとは、ＨＥＭｉがデータをＤＭＡ様バーストで素早くかつ効率的に転送することを可能にする。
【０３９０】
Ｆ．ＥＣＣ処理
【０３９１】
ＳＳＤコントローラ１０６は、フラッシュメモリ・モジュール１０８にデータが書き込まれるかまたは読み出されるとき、誤り訂正符号（「ＥＣＣ」）情報を生成してチェックする。（上記したように、データパスＤＲＡＭ１０７も内部ＥＣＣ機能を有するが、ＳＳＤコントローラ１０６はこの機能を制御せず、エラーが報告された場合にのみデータパスＤＲＡＭ１０７とインタフェースをとり、ＳＳＤコントローラ１０６にエラー・メッセージを発行させる。）
【０３９２】
ＥＣＣプロセスは図３１に示されており、図３１はフラッシュ・ポート０ ３０４を示す。上記したように、フラッシュ・ポート０は、フラッシュＨＥＭｉ０ ３０７及びフラッシュ・ステージバッファ０ ３０８を含み、フラッシュ・グループ０ ３０１に接続されている。
【０３９３】
図３１はまた、ＥＣＣ訂正エンジン３１０１を示す。上記したように、ＳＳＤコントローラ１０６は複数のフラッシュ・ポートを含み、各フラッシュ・ポートは関連付けられたフラッシュ・グループを有する。しかし、この実施形態では、ＳＳＤコントローラ１０６は１つのＥＣＣ訂正エンジンしか含まず、それはフラッシュ・ポート間で共有される。１つのＥＣＣ訂正エンジンしか存在しないので、フラッシュＨＥＭｉがＥＣＣ訂正エンジンを必要とするとき、フラッシュＨＥＭｉは先ずＥＣＣ訂正エンジンがビジーであるか否かチェックしなければならない。ＥＣＣ訂正エンジンがビジーでなければ、フラッシュＨＥＭｉはそれを使うことができる。ＥＣＣ訂正エンジンがビジーであれば、フラッシュＨＥＭｉは、そのＩＤを、グローバル・レジスタ２２０３（図２２を参照）に含まれるＥＣＣ訂正ＦＩＦＯに加えなければならない。当該ＦＩＦＯは、ＥＣＣ訂正エンジンへのアクセスを必要とする全てのフラッシュＨＥＭｉ群の順序付きリストを含む。ＨＥＭｉは、そのＩＤがＦＩＦＯのトップに来たとき、ＥＣＣ訂正エンジンへのアクセスを勝ち取る。
【０３９４】
別の実施形態では、ＳＳＤコントローラ１０６は、２つ以上のＥＣＣ訂正エンジンを含み得、最大ではフラッシュ・ポートの数だけＥＣＣ訂正エンジンを含み得る。この実施形態は、コスト及び複雑さを増大させるが、大量のエラーが訂正されなければならない場合により高速な性能を可能にする。この実施形態では、フラッシュＨＥＭｉ群は、ＥＣＣ訂正エンジンへのアクセスを待つ必要がない。他の代替実施形態では、所与の数のフラッシュ・ポート（例えば２または４）に対して１つのＥＣＣ訂正エンジンがあることがある。
【０３９５】
図３１に示すように、フラッシュ・ポート０ ３０４は、ＥＣＣロジック３１０２を含む。ＥＣＣロジック３１０２はさらに、ＥＣＣ生成部３１０３及びＥＣＣチェック部３１０４からなる。
【０３９６】
ＥＣＣ生成部３１０３は、或るデータの或るセクタのための複数のＥＣＣビットを一度に生成する。ＥＣＣ生成部３１０３がＥＣＣビットを生成するのは、フラッシュ・ステージバッファ３０８とフラッシュ・グループ３０１間でデータが転送されるときである。ステージバッファからフラッシュ・グループへの書込みのとき、ＥＣＣ情報はデータと共にストアされ、ＥＣＣ情報はＳＰａｇｅセクタのＥＣＣフィールド１３０３（図１３を参照）にストアされる。フラッシュ・グループからステージバッファへの読出しのとき、ＥＣＣ情報は、後述するようにＥＣＣチェック部３１０４によって使用される。
【０３９７】
好適実施形態では、ＥＣＣ生成部３１０３は、１セクタ当たり１２個のＥＣＣ符号を生成するので、ハミング・アルゴリズムを用いて１セクタ当たり１２のＥＣＣバイトを用いる。これはストレージに２０バイト弱を必要とし、ＳＰａｇｅセクタＥＣＣフィールド１３０３が２０バイトからなるのはこのためである。１セクタ当たりの生成されるＥＣＣの量は、初期化時に設定されるＥＣＣロジック３１０２内のレジスタに基づいてプログラム可能である。代替実施形態では、ＥＣＣサイズを０に設定し、他のフィールドが占める空間を配置換えまたは削減することによって、ＳＰａｇｅセクタのサイズを小さくすることを可能にし、その結果、各スーパーページが１６個のセクタを保持する（従って、１６個のＬＢＡを処理する）ことができるようになる。
【０３９８】
フラッシュ・グループ３０１からデータが読み出されるとき、ＥＣＣ生成部３１０３は、各セクタに対して新しい１組のＥＣＣビットを生成する。ＥＣＣチェック部３１０４は、次に、新たに生成されたＥＣＣビットとＥＣＣフィールド１３０３の内容とを比較する。この比較の結果は、フラグを用いて伝えられ、フラグは、ＥＣＣビットがマッチしたことかまたはエラーが発見されたことのいずれかを示す。ＥＣＣ情報を生成及びチェックする方法は、当分野で公知であり、本明細書では詳しく説明しない。
【０３９９】
ＥＣＣチェック部３１０４がＥＣＣエラーを発見すると、フラッシュＨＥＭｉ３０７は、セクタ・データ及びメタデータ（ＥＣＣフィールド１３０３を含む）をステージバッファ３０８からＥＣＣ訂正エンジン３１０１にコピーする。ＥＣＣ訂正エンジンは、ＥＣＣフィールド１３０３の内容を用いて、フラッシュ・グループ３０１への書込みまたは読出し中にデータ内に取り込まれたエラーを訂正しようと試みる。この場合もやはり、ＥＣＣ訂正プロセスの詳細は当分野で公知であり、本明細書には記載しない。好適実施形態では、ＥＣＣ訂正エンジンは、約２０バイトのＥＣＣ情報に基づき、１セクタ当たり１２個のエラーを訂正することができる。
【０４００】
ＥＣＣ訂正エンジン３１０１がデータの訂正に成功すると、フラッシュＨＥＭｉ３０７は、ＥＣＣ訂正エンジン３１０１からの出力を受け取りし、それをステージバッファ３０８にライトバックする。訂正データは、次に、ホストへの最終的な送信のために用いられる。（上記の図２７に関連する説明から理解されるように、２つの転送が関わっているが、ＨＥＭｉ構造は、データの各ダブルワードを、１つのＨＥＭｉ命令を用いてＥＣＣ訂正エンジン３１０１からステージバッファ３０８へ転送させる）。エラーの数が多すぎてＥＣＣ訂正エンジン３１０１が訂正できない場合には、２次誤り訂正プロトコルが呼び出される。このプロトコルは、２つの段階を有する。第１段階では、フラッシュ・グループからステージバッファへの読出しが１回または複数回繰り返され、同じセクタについて誤り訂正サイクルを再び開始する。このことが行われる理由は、エラーが、１つの状態と別の状態の間の閾値にあるセルによって発生することがあり、再読出しが追加の有効ビットを生成し得るからである。２度目（またはその後）にＥＣＣ訂正エンジンがデータを訂正することができる場合には、訂正がなされ、物理セクタは「バッド」と印が付けられ、データは別のセクタに再書込みされる。
【０４０１】
２次誤り訂正プロトコルの第２段階では、データは繰り返し読み出され、以前の読出しと一緒にＯＲされる。ＯＲ演算の結果、いずれかの読出し中にビット位置で「１」に遭遇すると、たとえそれより前か後の読出し中に当該ビット位置における値が「０」として読み出されても、当該「１」は維持されることになる。この方法が用いられる理由は、フラッシュメモリのエラーが一般にフラッシュ・セルからの電荷の漏洩によって発生し、セル内の値が「１」ではなく「０」として読み出される（例えば読出しディスターブ）ようにするからである。漏洩は、０と１の間の中間電荷レベルを有するセルをもたらし得るので、異なる読出しは、異なる戻り値をもたらし得る。ＯＲプロセスは、読出しから受信するＩの数を最大にする。ＯＲプロセスが設定回数完了したら、値はＥＣＣ訂正エンジン３１０１に戻され、データの訂正が今現在可能か否かが判定される。
【０４０２】
ＯＲプロセスは、実際にデータの破損を増加させ得るが、それは、当該破損がセルにおける電荷増加によって発生した場合においてであり、その結果、「０」値は断続的に「１」として読み出される。しかし、これは比較的稀なケースであるが、２次誤り訂正（ＯＲなしで読出し）の第１段階が機能しなかった後にのみＯＲプロセスを用いるのは理にかなっている。
【０４０３】
ＥＣＣ訂正エンジン３１０１が最終的にデータを訂正することができなければ、フラッシュＨＥＭｉはエラー・メッセージを発行し、エラー・メッセージはホスト・ポートを通ってデータに関連付けられたイニシエータに送信される。
【０４０４】
好適実施形態では、エラーの数が閾値を超えない限り、訂正データはフラッシュにライトバックされない。閾値は、訂正可能なエラーの数（好適実施形態では、１セクタ当たり１２）から、追加のエラーが後続の読出しのときに取り込まれる可能性に基づいて計算されるガードバンドを引いた値値に基づいて設定される。好適実施形態では、発明者は、セクタ読出しで見つかるエラーの数が当該セクタの直前の読出しで見つかるエラーの数よりも３つ多い（または３つ少ない）とは思えないと判断した。それゆえ、例えば、或る読出しで、セクタが３つの訂正可能なエラーを有するならば、次の読出しで、セクタは６個またはそれ以下の訂正可能なエラーを有する可能性が高い。
【０４０５】
この挙動が意味するところは、或るセクタが或る読出しで９つまたはそれ以下の訂正可能なエラーを有するとすれば、次の読出しでそのセクタは１２個またはそれ以下のエラーを有する可能性が高いということであり、エラーは次の読出しで訂正可能であることを意味していることを理解されたい。これは、今度は、訂正データをフラッシュにライトバックしなくてよいことをする。そのような書込みを避けることは重要である。というのも、フラッシュへの訂正データの書込みは、スーパーページ全体の再書込みの必要があるからである。
【０４０６】
この実施形態では、後続の読出しで訂正不可能なエラーが見つかる可能性をさらに抑えるために、ガードバンドは３ではなく４に設定される。それゆえ、読出しで見つかる訂正可能なエラーの閾値は８に設定される。８つより多いエラーが発見されたら、書込みハンドラが呼び出され、セクタを含むスーパーページは訂正データを含めてフラッシュに再書込みされる。８つより少ないエラーが発見されたら、スーパーページは再書込みされない。というのも、エラーの数は尚も次の読出しで訂正可能であると見込まれているからである。
【０４０７】
代替実施形態では、エラーを含むスーパーブロックは、優先的なガベージ・コレクションに対して識別され得る。というのも、特定のセクタにおけるエラーの存在は、隣接セクタもエラーを含むことを意味するからである。優先的なガベージ・コレクションは、ある程度の非効率性を含んでいる。というのも、選択されたスーパーブロックは、恐らくは、優先なしに選択されたであろうスーパーブロックよりも多くの有効データを含むことになるが（後述するガベージ・コレクションの説明を参照）、この非効率性は、エラーを含むことが分かったスーパーページを直ちに再書込みすることによって強いられる非効率性よりもずっと低いからである。
【０４０８】
ＩＶ．メタデータ構造
【０４０９】
Ａ．ＤＲＡＭ構造
【０４１０】
図３２は、データパスＤＲＡＭ１０７に見つかるデータ構造を示しており、各データ構造は、システムの初期化時に作成されかつ初期化される。これらは、次の構造を含む。
【０４１１】
フォワード・テーブル３２０１。これは、ＬＢＡアドレスとフラッシュメモリ・アドレスとの翻訳に用いられる。このテーブルについては、図３３に関連してさらに詳細に説明する。
【０４１２】
ＩＯＰデータ・バッファ３２０２。これは、ホスト・インタフェース３１０とフラッシュメモリ・モジュール１０８の間で転送されるデータをストアする。
【０４１３】
ＡＲＭ実行コード３２０３。これは、ＡＲＭプロセッサ２００２によって実行されるソフトウェアをストアする。好適実施形態では、このソフトウェアはＣ＋＋プログラミング言語で書き込まれる。
【０４１４】
ＡＲＭデータ３２０４。これは、処理中にＡＲＭプロセッサ２００２によって用いられるメモリ空間を構成する。
【０４１５】
リバース・テーブル（Reverse Table）ブロック３２０６。これは、ガベージ・コレクション及び電力損失からの回復に用いられる。リバース・テーブル・ブロック３２０６は、各フラッシュ・ポートのための別々のテーブルを含み、例えば、テーブル３２０５は、フラッシュ・ポート０のためのリバース・テーブルを含む。リバース・テーブル３２０５については、図３４に関連してさらに詳細に説明する。
【０４１６】
スーパーブロック・メタデータ・テーブル・ブロック３２０７。これは、各フラッシュ・ポートに対して現在オープンしているスーパーブロックのためのメタデータ・テーブルを含む。これらのテーブルについては、図３５に関連してさらに説明する。
【０４１７】
ＨＥＭｉコード・オーバレイ・テーブル３２０８。これは、初期化時に各ＨＥＭｉにロードされるファームウェアを含む。このテーブルは、各種のＨＥＭｉに対する８つのコード・オーバレイを含み、例えば、エントリ３２０９は、２つの受信ＨＥＭｉに対する８つのファームウェア・オーバレイを含み、エントリ３２１０は、２つの送信ＨＥＭｉに対する８つのファームウェア・オーバレイを含み、という具合である。これらのオーバレイは、上記した方法で必要に応じてＨＥＭｉ ｉＲＡＭにスワップインされるかまたはＨＥＭｉ ｉＲＡＭからスワップアウトされる。
【０４１８】
ＳＣＳＩタグ・テーブル３２１１。これは、それぞれの現在アクティブなイニシエータのための１つのロー（行）と、ＳＣＳＩプロトコルに従ってＳＣＳＩタグに対して認められた６５，５３６個の可能な値の各々のための１つのカラム（列）とを含む。特定のＳＣＳＩタグを含むＣＤＢが受信されると、当該イニシエータ及び当該ＳＣＳＩタグに対応するＳＣＳＩタグ・テーブル位置にビットが設定される。ＣＤＢの実行が完了したら、当該ビットはクリアされる。これにより、ＳＳＤコントローラ１０６は、全ての受信ＳＣＳＩタグが固有のものであること及び同じＳＣＳＩタグを持つ２つのアクティブなＣＤＢを１つのイニシエータが有することはないことを確認することができる。
【０４１９】
デバッグ・バッファ３２１２。これは、デバッグＦＩＦＯ２２１０から受信したデバッグデータをストアする循環バッファである。このデバッグデータは、ＨＥＭｉファームウェア内のデバッグ・コマンドに応じて通常のシステム動作中に回収される。回収された情報には、受信されたＣＤＢの基本コマンドフロー及び結果的に生成されたデータ構造（ＣＤＢ情報、ＩＯＰ、転送要求）が含まれる。エラーが検出された場合、エラーのタイプ及びエラーに対してなされた応答の特性（もしあれば）を識別するために、追加のデバッグ情報が回収される。
【０４２０】
図３３は、フォワード・テーブル３２０１を示す。フォワード・テーブル３２０１は、ホスト１０１及び１０２から受信したＬＢＡアドレスをフラッシュメモリ・モジュール１０８内の実際の物理フラッシュメモリ・アドレスに変えるために用いられる。
【０４２１】
フォワード・テーブル３２０１は、ＬＢＡによってインデックスを付けられ、システムがサポートできる１５個のＬＢＡ毎に１つのエントリを含む。図３３に示すように、フォワード・テーブル３２０１の第１のエントリはＬＢＡ０〜１４に関連し、第２のエントリはＬＢＡ１５〜２９に関連し、第３のエントリはＬＢＡ３０〜４４に関連し、という具合である。１エントリ当たりのＬＢＡの数は、スーパーページにストアされることができるＬＢＡの数と同じであることに留意されたい。より大きいかまたは小さいスーパーページを含む別の実施形態では、１フォワード・テーブル・エントリ当たりのＬＢＡの数は、同じようにより多くなるかまたは少なくなるであろう。
【０４２２】
フォワード・テーブル３２０１のサイズは、フラッシュ・モジュール１０８の全メモリ・サイズによって決まる。好適実施形態では、３００ギガバイトのフラッシュ・モジュールが、約６億個のＬＢＡをストアすることができ、それによってフォワード・テーブル３２０１に約４０００万個の可能なエントリを必要とする。フォワード・テーブル３２０１のサイズは、メモリの容量に応じてより大きいかまたは小さいことになる。
【０４２３】
各ＬＢＡエントリに対して、フォワード・テーブル３２０１は、物理フラッシュメモリチップ上の対応するデータの位置を識別するために用いられることができる情報、すなわち、ポート、バンク、ブロック及びページを含む。
【０４２４】
加えて、フォワード・テーブル３２０１は、「ユーザ」と呼ばれるフィールドを含み、このフィールドには、特定の顧客の役に立つであろう情報をストアすることができる。一実施形態では、ユーザ・フィールドは、所定の管理期間中（例えば１ヶ月間）に、関連付けられたＬＢＡがアクセス（読出しまたは書込み）された数をストアする。ユーザは、この情報を用いて、特定のＬＢＡグループが多かれ少なかれ頻繁に用いられる情報を含むか否かを判定し得る。使用頻繁が高い情報は、より高速かつ高コストなメモリに移動させられ得る。使用頻繁が高くない情報は、低速なアーカイバル・メモリに移動させられ得る。
【０４２５】
作動中、フォワード・テーブル３２０１は、次のように機能する。ホストからＬＢＡ（例えばＬＢＡ２３）が受信される。ＬＢＡは１５で除され、その整数の商は、フォワード・テーブル３２０１へのインデックスを求めるために用いられる。例えば、ＬＢＡ２３の場合、１５で除すると商は「１」であり、これは、当該ＬＢＡのための物理アドレス情報が、１つのローをフォワード・テーブルへのインデックスを付けることによって見つけられることを意味する。これは、図３３においてＬＢＡ１５−２９と名付けられたローである。
【０４２６】
選択されたローは、ＬＢＡ情報がストアされているポートを識別し、それゆえに、情報にアクセスするために用いられるフラッシュＨＥＭｉ及びフラッシュ・グループを識別する。
【０４２７】
選択されたローはさらに、情報がストアされている特定のバンクを識別し、それゆえに、選択されたフラッシュＨＥＭｉによって情報を選択するために用いられるＣＳ信号を識別する。選択されたローはまた、情報が見つけられるブロックを識別する。これは、バンクの各チップ上の同じブロックであることに留意されたい
【０４２８】
最終的に、選択されたローは、情報が見つけられるページを識別する。例えば、ローは、ブロック１のページ１を識別し得る。（この例では、ＬＢＡは実際にブロック１のスーパーページ１にストアされることになることを理解されたい。）
【０４２９】
上記したように、各スーパーページは１５個のＳＰａｇｅセクタを含み、各ＳＰａｇｅセクタは、１つのＬＢＡに関連する内容をストアすることができる。スーパーページがフォワード・テーブル３２０１から識別されたら、スーパーページ内の実際のＳＰａｇｅセクタは、上記した除算から余りを引くことによって得られる。与えられた例では、余りは８である（２３／１５＝１、余り８）。要求されたＬＢＡ情報は、それゆえ、各々の選択されたページの９番目のＰＳｅｃｔｏｒスロット（テーブルはＬＢＡ０から始まるので、８番目ではなく９番目）内で見つかるであろう。
【０４３０】
図３４は、リバース・テーブル３２０５を示す。上記したように、データパスＤＲＡＭ１０７は、フラッシュメモリ・グループ毎に１つのリバース・テーブルを含む。
【０４３１】
上記したように、各ブロックは、６４個のスーパーページからなり、各スーパーページは、バンク内の各ダイから１つである４つのページからのメモリ空間で構成されている。また、同じく上記したように、スーパーブロックは、グループ内の各バンクからの同じブロックからなる。例えば、特定のフラッシュ・グループのスーパーブロック０は、当該グループ内の全てのバンクからの全てのブロック０からなる。
【０４３２】
カラム３４０１は、スーパーブロック（０）を表し、バンク０のスーパーページ０〜６３、バンク１のスーパーページ０〜６３等のための複数のローを有し、１つのバンク上の６４個のスーパーページの各グループはブロックを表している。
【０４３３】
テーブル３２０５の各スーパーページ・ロー（例えばロー３４０２）は、スーパーブロック毎に同じスーパーページ（例えば、スーパーブロック０〜ｎのスーパーページ０）のエントリを含む。
【０４３４】
リバース・テーブル３２０５の各スーパーページ・フィールドは、１つの有効ビットを含む。「１」に設定されるとき、有効ビットは、当該スーパーページが、現在有効なプログラムされたデータを含む（すなわち、スーパーページには有効なままのデータが書き込まれている）か、または既に消去されており、書込み可能である（すなわち、消去後のデフォルト状態である値０ｘｆｆｆｆｆｆｆｆを含む）かのいずれかであることを示している。「０」に設定されるとき、有効ビットは、当該スーパーページが無効データを含むことを示し、それは読み出されることができず、書込み可能ではないことを意味している。当該スーパーページにストアされているＬＢＡに後から書込みがなされると、スーパーページが無効化される。フラッシュメモリには直接的な上書きができないので、スーパーページ上のＬＢＡが上書きされると、スーパーページ上で依然として有効な古いデータ及び新しいデータが新しいスーパーページにコピーされ、古いスーパーページは無効と印が付けられ、それがもはや（後述するガベージ・コレクションまで）用いられないことを意味する。
【０４３５】
それゆえ、例えば、フィールド３４０３の「１」は、フラッシュ・グループのバンク０のブロック０のスーパーページ１が、有効データを含むか、あるいは既に消去されており、書込み可能であるかのいずれかを示すことになるのに対して、フィールド３４０３の「０」は、フラッシュ・グループのバンク０のブロック０のスーパーページ１内のデータが無効であることを示すことになる。
【０４３６】
リバース・テーブル３２０５はまた、カウント（回数）ローを含む。このローの各エントリは、現在無効なスーパーブロック内のスーパーページの全数を表す数を含む。それゆえ、フィールド３４０４は、スーパーブロック０内の現在無効なスーパーページの数を表す数をストアする。
【０４３７】
カウントは、カラム内の「０」有効ビットの数を合計することによって計算される。しかし、カウントは、性能を最適化するように、別々に維持される。というのも、トータルカウント（総数）を別々のフィールドに維持すれば、必要とされるときにこの数を計算する必要がないからである。カウントは、ガベージ・コレクションのために用いられるが、その方法については詳細に後述する。
【０４３８】
リバース・テーブル３２０５はまた、ロー３４０５として示されるタイムスタンプ・ローを含む。これは、各スーパーブロックが元々書込みクローズされていた時間を示すタイムスタンプを含む。このフィールドの使用は復元プロセスを含むが、これについては図５８に関連して後述する。
【０４３９】
リバース・テーブル３２０５はまた、ロー３４０６として示される消去カウント・ローを含む。これは、スーパーブロックが消去された回数のカウントを含み、かつ、これを用いて、例えばガベージ・コレクションのために消去カウントのより多いスーパーブロックを優先することができる。
【０４４０】
図３５は、１つのスーパーブロックに関連しているメタデータ情報を含むスーパーブロック・メタデータ・テーブル３５０１を示す。各スーパーブロックのバンク０のスーパーページ０に、スーパーブロック・メタデータ・テーブルがストアされる（例えば、ポート０のブロック０のスーパーページ０に、ポート０のスーパーブロック０のためのスーパーブロック・メタデータ・テーブルがストアされる）。加えて、ＤＲＡＭ１０７のスーパーブロック・メタデータ・テーブル・ブロック３２０７に、各フラッシュ・グループに対して現在書込みオープンしているスーパーブロックのためのスーパーブロック・メタデータ・テーブルがストアされる。
【０４４１】
スーパーブロック・メタデータ・テーブル３５０１は、バンクによってまとめられるスーパーブロック内の各スーパーページに対して１つのローを含む。それゆえ、ロー３５０２は、バンク０のスーパーページ０の情報を含む。この後に、バンク０のスーパーページ１の情報を含むロー３５０３が続き、という具合に、バンク０のスーパーページ６３まで続き、そして、バンク１のスーパーページ０の情報を含むロー３５０４が続き、というようにして、最後のバンク（図３５ではバンクｎと表されている）に至る。
【０４４２】
スーパーブロック・メタデータ・テーブル３５０１は、各スーパーページに対して３つのタイプのメタデータ、すなわち、スーパーページ・タイムスタンプ、不良フラグ及びＬＢＡをストアする。
【０４４３】
スーパーページ・タイムスタンプ・カラム３５０５は、スーパーページが書き込まれた時間を含む。この情報も、スーパーページの最後に加えられ、データの損失が発生した場合に復元のために用いられるが、その方法については詳細に後述する。
【０４４４】
不良フラグ・カラム３５１０は、スーパーページが「不良（defective）」と印が付けられたか否かを示すシングルビットを含む。フラッシュ読出しまたは書込み中にスーパーページからのページが不良であると示されたら、スーパーページが不良であると識別される。一実施形態では、読出し中にこれが生じると、スーパーブロックはガベージ・コレクションへ追い込まれる。一実施形態では、書込み中にこれが生じると、異なるスーパーページが書込みに用いられる。どちらにしても、不良フラグが設定される。
【０４４５】
ＬＢＡカラム３５１１は、スーパーページに書き込まれたデータのＬＢＡアドレスを含む。上記したように、各スーパーページは、１５個の連続したＬＢＡのグループからのデータを含む。ＬＢＡカラム３５１１は、このグループの第１のＬＢＡを識別する。
【０４４６】
バンク０のスーパーページ０は、スーパーブロックのためのスーパーブロック・メタデータ・テーブルを含み、従ってＬＢＡに対応するデータを保持しないので、特別な場合である。このため、このスーパーページに関連付けられたＬＢＡフィールドは、ＬＢＡ情報を含まない。
【０４４７】
スーパーブロック・メタデータ・テーブル３５０１はまた、特定のスーパーページに固有ものもではないが、スーパーブロック全体に関連するメタデータを含む４つのフィールド、すなわち、スーパーブロック・タイムスタンプ３５０６、消去カウント・フィールド３５０７、オープン・フラグ３５０８及びクローズド・フラグ３５０９を含む。
【０４４８】
スーパーブロック・タイムスタンプ３５０６は、スーパーブロックが書込みクローズされていた時間を示すタイムスタンプを含む。後述するように、このフィールドは、電力損失回復のために用いられる。
【０４４９】
消去カウント・フィールド３５０７は、スーパーブロックが消去されたカウント（回数）を含む。後述するように、このフィールドは、ウェア・レベリングのために用いられ得る。
【０４５０】
オープン・フラグ３５０８は、スーパーブロックが書込みオープンされているときに設定される。
【０４５１】
クローズド・フラグ３５０９は、スーパーブロックがクローズされているときに設定される。後述するように、オープン・フラグ及びクローズド・フラグは、電力損失回復に用いられる。
【０４５２】
スーパーブロックが書込みオープンであるとき、そのメタデータ・テーブルは、フラッシュからＤＲＡＭ１０７にコピーされる。各スーパーページが書き込まれると、そのスーパーページに対応するＬＢＡフィールドに適切なＬＢＡが書き込まれ、カラム３５０５内のスーパーページ・タイムスタンプ・エントリには、スーパーページが書き込まれた時間が書き込まれる。同様に、或るスーパーページに不良があることが発見されると、そのスーパーページに対応する不良フィールドに書込みがなされる。
【０４５３】
スーパーブロックがクローズされているとき、関連付けられたスーパーブロック・メタデータ・テーブルは、ＤＲＡＭ１０７から、スーパーブロックを含むフラッシュ・グループのバンク０のブロック０のスーパーページ０に書き込まれ、その後、次のスーパーブロックがオープンされるように、スーパーブロック・メタデータ・テーブル・ブロック３２０７内でスーパーブロック・メタデータ・テーブルに上書きされる。
【０４５４】
スーパーブロック・メタデータ・テーブルは、次の３つの別々の時にフラッシュに書き込まれる。
【０４５５】
１．スーパーブロックが消去され、フリーリストに置かれるとき。このときには、メタデータ・テーブルはフラッシュに書き込まれるが、不良及び消去カウント・データのみが有効である。
【０４５６】
２．スーパーブロックがオープンしているとき。このときには、テーブルはステージバッファにコピーされる。フラッシュＨＥＭｉはオープン・フラグを設定し、テーブルをフラッシュにライトバックする（但し、コピーがステージバッファ内に残り、フラッシュに書き込まれる必要があるのはテーブルの一部のみであることを理解されたい）。これは、予期せぬ電力損失が発生した場合に、オープンしているスーパーブロックの識別を可能にする。
【０４５７】
３．スーパーブロックがクローズされているとき。このときには、書込み済みのテーブルはフラッシュにコピーバックされる。そうなる前に、フラッシュＨＥＭｉはクローズド・フラグを設定する。従って、これら２つのフラグは、スーパーブロックの全ての可能な状態、すなわち、空き（２つのフラグが未設定）、オープン（オープンしている）（オープン・フラグが設定され、クローズド・フラグが未設定）及びクローズド（クローズされている）（２つのフラグが設定されている）を示す。
【０４５８】
図３６は、ＩＯＰデータ・バッファ３２０２を示す。図３２に示すように、ＩＯＰデータ・バッファ３２０２はデータパスＤＲＡＭ１０７にストアされる。このバッファは、ホスト・インタフェース３１０から、またはフラッシュメモリ・モジュール１０８から、データパスＤＲＡＭ１０７によって受信されたデータをバッファリングするために用いられる。
【０４５９】
ＩＯＰデータ・バッファ３２０２は、ＳＳＤコントローラ１０６によってサポートされることができる各ＩＯＰに対して１つのロー（好適実施形態では、これは６０である）を含む。各ローは、３１５個のＳＰａｇｅセクタを保持できるほど大きいが、これは、１つのＩＯＰに戻されることができるデータの最大量である（７つの転送要求×３つのページ要求×１５個のＬＢＡ）。
【０４６０】
書込み動作中に、ＩＯＰデータ・バッファ３２０２は、ホストから受信したデータを保持する。読出し動作中に、データバッファは、フラッシュメモリから受信したデータを保持する。いずれにしても、データはＬＢＡ順にストアされる。このことは、特定の転送要求及び特定のページ要求に関連するデータのための正確な位置の計算をより容易にする。例えば、ＩＯＰによって発行される第１の転送要求の第１のページ要求に関連するデータは常に、データ・バッファ３２０２内の当該ＩＯＰのエントリの先頭に見られることになる（ＩＯＰ（０）のための第１の位置は、位置３６０１として示されている）。第１の転送要求の第２のページ要求に関連するデータは、常に当該エントリの先頭（例えば位置３６０２）からのオフセットで見られることになり、オフセットは第１のページ要求によって転送されるＬＢＡの数に基づいて計算される（転送の最初のＬＢＡがスーパーページに含まれるならば、第１のページ要求はスーパーページ全体に満たないものを転送することになることに留意されたい）。
【０４６１】
それゆえ、ＩＯＰデータ・バッファ３２０２は、ホストが開始する読出し及び書込み動作が、異なる時間に、すなわち順序がバラバラで完了し得るような複数の転送要求及びページ要求に分割されるという事実から、ホスト１０１及び１０２とのデータフローを切り離すように機能する。データ転送の順序がバラバラであるという特性にも拘わらず、ＩＯＰデータ・バッファ３２０２は、ホストが期待するＬＢＡ順にデータをストアする。
【０４６２】
ホストが開始する読出し中に、ＩＯＰデータ・バッファ３２０２は、転送要求によって戻されたデータを、要求されたデータ全てが存在するまで保持し、全データが揃った時点でデータはＬＢＡ順にホスト・インタフェースへ読み出される。ホストが開始する書込み中に、ＩＯＰデータ・バッファ３２０２は、ホストから受信したデータを、全データの受信が完了するまで保持し（この場合もやはりＬＢＡ順に）、受信が完了した時点でデータはフラッシュ・ステージバッファに転送される。このメカニズムにより、ＳＳＤコントローラ１０６は、たとえホストが開始するデータ転送動作がずっと小さなフラッシュ読出し及び書込みに内部で分割されても、ホストが期待する順にホストとのデータの授受ができ、また、データパスＤＲＡＭは、コントローラ内の他の構成要素がより低速でデータを転送するという事実にも拘わらず、最高速度で作動することができる。
【０４６３】
Ｂ．トランザクション構造
【０４６４】
上記したように、ＳＳＤコントローラ１０６は、フラッシュメモリ・モジュール１０８における読出し及び書込み動作を制御するために４つのタイプのデータ構造、すなわち、ＣＤＢ情報、ＩＯＰ、転送要求及びページ要求を用いる。
【０４６５】
ＳＣＳＩプロトコルに基づくシステムでは当たり前であるように、読出しまたは書込みは、ホストからのコマンド・ディスクリプタ・ブロック（「ＣＤＢ」）の受信によって開始される（他のプロトコルも同様のメカニズムを含むが、説明のためにＣＤＢを用いる）。ＳＳＤコントローラ１０６は、ＣＤＢ情報として知られる構造内にＣＤＢをストアする。コントローラは、一度に最大で１４４個のＣＤＢ情報を処理することができるが、さらに詳細に後述するように、そのうちの１６個は特殊目的のために留保されるので、一度に１２８個の標準のホストが開始する読出し／書込みコマンドが処理されることができる。但し、これらのうちの幾つかは、必要なリソースのアベイラビリティを「保留」していることがある。
【０４６６】
ＳＳＤコントローラ１０６は、ホストが開始する読出し及び書込みコマンドを、移動の階層に分割することによって処理する。システムは、ＣＤＢ情報を処理するためのＩＯＰを作成することから始める。全部で６０個のＩＯＰが一度にアクティブであり得る。各ＩＯＰは７つの転送要求を発行することができ（最大で１２０個の転送要求しか一度にアクティブであることができないが）、各転送要求は３つのページ要求を発行することができる。各ページ要求は、最大でデータ及びメタデータの１つのスーパーページ（例えばスーパーページ２１３）を移動させる。上記したように、各スーパーページは、１５個のＬＢＡに関連付けられたセクタ内容をストアする。
【０４６７】
このアーキテクチャは、１つのＩＯＰが、２５６個の連続したＬＢＡを含むホストが開始する転送の大部分を処理できるように設計されている。後述するように、転送される最初と最後のＬＢＡがスーパーページのどこに含まれるか、そしてデータ・ストライプのどこに含まれるか次第では、最初及び／または最後のページ要求が１つのＬＢＡしか転送しないことが可能であり、最初及び／または最後の転送要求が１つのスーパーページしか転送しないことも可能である。それゆえ、或る特定の状況では、順序通りの最初及び／または最後の転送要求は、実際には、１つのＬＢＡに関連付けられたセクタ内容しか転送しないこともある。それゆえ、１つのＩＯＰは、最小で２２５個、最大で３１個のＬＢＡを処理することができる。しかし、実際には、１つのＩＯＰが２５６個未満のＬＢＡを処理することができる状況は比較的稀であるので、このアーキテクチャでは、１つのＩＯＰは、ほとんどの場合、２５６個のＬＢＡを含むトランザクションを処理することができることになる。
【０４６８】
システムは、ＳＣＳＩプロトコルが要求するように、同じＩＯＰを繰り返し呼び出すことによって、多数のＬＢＡの転送を処理することができる。しかし、経験に基づいて、発明者は、２５６個のＬＢＡが、通常の作動条件下で実際に遭遇する最大の移動になると考えている。各ＬＢＡは、標準のハードドライブ・セクタに相当し、ＩＤＥドライブは一般的には一度に２５６個のセクタを転送することしかできないことに留意されたい。既存のホストがこの２５６個のセクタ限界に適合するように設計されているならば、１つのＩＯＰが、遭遇するホストが開始する転送の大部分を処理することができることになりそうである。
【０４６９】
図３７は、例示的なＣＤＢ情報、例えばＣＤＢ情報２０１の構造を示す。
【０４７０】
セルフポインタ３７０１は、ＣＤＢ情報テーブル４１０９内のこの特定のＣＤＢ情報の位置を識別するが、これについては図４１に関連して後述する。この値は、このＣＤＢ情報を識別する必要がない他のデータ構造に伝えられる。
【０４７１】
セルフポインタ３７０１は、ＣＤＢ情報２０１を呼び出すために用いられ、この目的のために、ＣＤＢ情報を用いることを望む動作によってコピーされる。加えて、セルフポインタ３７０１は、エラーチェックに用いられる。いつでも、セルフポインタ３７０１は、ＣＤＢ情報２０１を指さなければならない。セルフポインタ３７０１がそれ自身を指さないとすれば、これは或る動作がＣＤＢ情報に間違ったデータを上書きしたことを示す。この説明は、他のタイプのデータ構造に含まれるセルフポインタにも当てはまることに留意されたい。
【０４７２】
ＣＤＢフィールド３７０２は、ホストから得られたＣＤＢ（または同様なデータ構造）のコピーを含む。ＣＤＢの形式は、ホスト・プロトコルによって指定されるが、ＣＤＢは常に少なくともコマンド、データ転送のためのＬＢＡ、及び転送長を含む。
【０４７３】
イニシエータ・フィールド３７０３は、ＣＤＢに関与するイニシエータに対応する共有ＲＡＭのイニシエータ・テーブル４１０８（図４１を参照）内のイニシエータ・エントリへのポインタを含む。この情報は、ＣＤＢ内のホストによって供給されるメタデータから生じる。当該メタデータは、イニシエータ・テーブル４１０８と比較される。一致（マッチ）が見つかれば、イニシエータ・テーブル４１０８内の一致した位置へのポインタが、イニシエータ・フィールドに置かれる。一致が見つからなければ、イニシエータ・フリーリスト４１１２（図４１を参照）から新しいイニシエータが取り出され、テーブル４１０８に新しいイニシエータが入力され、新しいイニシエータへのポインタは、イニシエータ・フィールド３７０３内に置かれる。
【０４７４】
ＩＯＰフィールド３７０４は、ＣＤＢ情報によって求められるトランザクションを実行するために生成されたＩＯＰを指す。
【０４７５】
ＳＣＳＩタグ３７０５は、イニシエータから受信されたＳＣＳＩ（またはキュー）タグを含む。当分野で理解されているように、ＳＣＳＩタグは、接続が最初に形成されるときにイニシエータから受信される情報の一部である。この情報は、ＣＤＢに応じてイニシエータに戻されなければならない。
【０４７６】
ＳＣＳＩフラグ３７０６は、ＳＣＳＩプロトコルが必要とするフラグを含む。
【０４７７】
バースト長コントロール・フィールド３７０７は、イニシエータ情報のバースト長フィールド４２０４からコピーされたバースト長制御情報を含むが、これについては図４２に関連して後述する。
【０４７８】
Ｒｅｆタグ・フィールド３７０８は、ＣＤＢに関連して受信したＲｅｆタグ（もしあれば）を含むが、その使用については上記した。
【０４７９】
Ａｐｐタグ・フィールド３７０９は、ＣＤＢに関連して受信したＡｐｐタグ及びＡｐｐタグ・マスク（もしあれば）を含むが、その使用については上記した。
【０４８０】
図３８は、ＩＯＰ２０２などのＩＯＰの内部構造を示す。後述するように、ＩＯＰは、共有ＲＡＭブロック３１８のＩＯＰテーブル４１１０（後述する図４１を参照）内にストアされ、ＩＯＰがＨＥＭｉによって使用されているとき、ＩＯＰは当該ＨＥＭｉのｍＲＡＭへもコピーされる。
【０４８１】
好適実施形態では、各ＩＯＰは、次のフィールドを含む３２ダブルワードのデータ構造である。
【０４８２】
セルフポインタ３８０１。これは、このＩＯＰが位置する共有ＲＡＭ ＩＯＰテーブル４１１０（下記参照）内のアドレスを含む。このフィールドは、初期化時に設定される。これは、ＩＯＰがＩＯＰフリーリスト４１０３（下記参照）上にあるときに有効データを含むＩＯＰ内の唯一のフィールドである。
【０４８３】
呼出し（Calling）ＨＥＭｉフィールド３８０２は、このＩＯＰ上で現在作動しているＨＥＭｉに対する識別子を含む。これは、ＩＯＰ２０２内のデータを変更する権限を与えられている唯一のＨＥＭｉである（さらに後述するアボート・フラグ３８１１を除く。）。
【０４８４】
ホスト・ポート・フィールド３８０３は、ＩＯＰの呼び出しを生じさせた元のホストコマンドを受信したホスト・ポート（０または１）を識別する。後述するように、これは、コマンドが完了したときにＩＯＰが送信されなければならないポートである。
【０４８５】
イニシエータ・フィールド３８０４は、このＩＯＰの呼び出しをもたらしたＣＤＢに元々関与しているイニシエータに対応する共有ＲＡＭのイニシエータ・テーブル４１０８（下記参照）内のイニシエータ・エントリへのポインタを含む。
【０４８６】
ＣＤＢ情報フィールド３８０５は、このＩＯＰを呼び出させた共有ＲＡＭのＣＤＢ情報テーブル４１０９（下記参照）内のＣＤＢ情報へのポインタを含む。
【０４８７】
コマンド・フィールド３８０６は、ＩＯＰが実行するように指定されたコマンドのタイプを識別する。一実施形態では、ＩＯＰは、ホスト読出しまたは書込みコマンドに対して生成されるのみである。別の実施形態では、ＩＯＰは、他のタイプのコマンドに対して生成され得る。この実施形態では、ＩＯＰは、非読出し／書込みコマンドの処理のためにＡＲＭプロセッサ２００２に送信される。
【０４８８】
転送要求割り当てフィールド３８０７は、現在の読出しまたは書込み動作のためにＩＯＰが割り当てた転送要求の数を含む。ＩＯＰがＲｄＷｒ ＨＥＭｉによって初期化されるとき、当該ＨＥＭｉは、ＣＤＢ情報によって指定される読出しまたは書込みコマンドを実行するのに必要な転送要求の数を計算し、その数をこのフィールドに入力する。好適実施形態では、この数は最大で７に設定される。残存転送要求（Remaining Transfer Requests）フィールド３８０８は、ＩＯＰによって割り当てられたまだ完了していない転送要求の数を含む。ＩＯＰが最初に作成されるとき、このフィールドは、転送要求割り当てフィールド３８０７と同じ値を含む。各転送要求が完了すると、残存転送要求フィールド３８０８はデクリメントされる。
【０４８９】
転送要求ポインタ・アレイ３８０９は、ＩＯＰによって割り当てられた各転送要求のためのエントリを含む。そのような転送要求の各々に対して、転送要求ポインタ・アレイ３８０９は、転送要求を処理するフラッシュＨＥＭｉへのポインタ及び転送要求テーブル４１１１（下記参照）内の転送要求自体へのポインタを含む。転送要求へのポインタは、転送要求が転送要求フリーリスト４１０４（下記参照）から取り出されるときに、転送要求のセルフポインタ（下記参照）からコピーされる。
【０４９０】
転送要求ポインタ・アレイ・フィールド３８０９は、ＩＯＰの実行が完了したときに転送要求フリーリスト４１０４に戻されるべき転送要求を識別するために用いられる。このフィールドは、ＩＯＰアボート・フラグ３８１１が設定されたときにアボートされるべき転送要求を識別するためにも用いられる。アボート動作についてはさらに後述する。
【０４９１】
状態変数フィールド３８１０は、コマンドが完了したか否か、エラーが発生したか否かなどに関する情報を含めて、ＩＯＰの状態を追跡するために用いられる情報を含む。このフィールドはまた、ＩＯＰが新しいのか「リエントラント」なのかを示す。上記したように、ＣＤＢが、１つのＩＯＰによって処理されることができるようなより多くのデータの転送を求めると、転送は複数のセグメントに分割され、各セグメントを処理するために同じＩＯＰが繰り返し呼び出される。状態変数フィールド３８１０は、このプロセスにおいてＩＯＰの場所をを追跡する。
【０４９２】
アボート・フラグ３８１１。このフラグは、ＩＯＰの動作がアボートされなければならないことを示す。呼出しＨＥＭｉフィールド３８０２において識別されるＨＥＭｉ以外の任意のＨＥＭｉに書き込まれることができるのは、ＩＯＰの一部のみである。
【０４９３】
Ｒｅｆタグ・フィールド３８１２は、Ｒｅｆタグを含むが、その使用については上記した。
【０４９４】
Ａｐｐタグ・フィールド３８１３は、Ａｐｐタグ・マスク及びＡｐｐタグを含むが、その使用については上記した。
【０４９５】
図３９は、転送要求２０３などの転送要求の内部構造を示す。初期化時に、各転送要求のための転送要求テーブル４１１１（下記参照）に１６個の３２ビット・ダブルワードからなる空間が割り当てられる。好適実施形態では、これらのダブルワードのうちの１４個のみが用いされる。余り２つのダブルワードは、今後の拡張のために留保される。
【０４９６】
転送要求は、ＲｄＷｒ ＨＥＭｉ群によって生成され、フラッシュＨＥＭｉ群によって用いられるデータ構造である。転送要求は、以下のフィールドを含む。
【０４９７】
セルフポインタ３９０１。これは、転送要求テーブル４１１１（下記参照）内のこの特定の転送要求の位置を識別する。それは、この転送要求を識別する必要がない他のデータ構造、例えば、呼出し転送要求を識別するのに必要なページ要求に伝えられる。
【０４９８】
呼出しＩＯＰフィールド３９０２。これは、この転送要求を生成させるＩＯＰの識別子を含み、ＩＯＰセルフポインタ３８０１から取り出される。
【０４９９】
ＬＢＡフィールド３９０３。これは、転送のための開始ＬＢＡを含む。例えば、呼出しＩＯＰがＬＢＡ０〜１００からの読出しを要求すると、第１の転送要求のためのＬＢＡフィールド３９０３が「０」を読出し、第２の転送要求のためのＬＢＡフィールド３９０３が「４５」を読出し、第３の転送要求のためのＬＢＡフィールド３９０３が「９０」を読み出すことになる（上記したように、各転送要求は、最大で４５個のＬＢＡを処理することができる）。
【０５００】
転送長フィールド３９０４。これは、転送されるＬＢＡの数を含む。
【０５０１】
データパスＤＲＡＭポインタ３９０５。これは、この転送要求のためにデータが書き込まれるかまたはデータが読み出されるＩＯＰデータ・バッファ３２０２内のアドレスへのポインタを含む。上記したように、ＩＯＰデータ・バッファ３２０２は、ＩＯＰによってまとめられ、フラッシュメモリ・モジュール１０８から読み出されるかまたはフラッシュメモリ・モジュールに書き込まれるデータのための空間を含む。
【０５０２】
アボート・フラグ３９０６。このフラグは、転送要求の動作がアボートされなければならないことを示す。アボート・フラグは、データがアボートされたコマンドのために転送されないことを確実にするために、データを転送する前に転送要求によってチェックされる。アボート処理については、さらに後述する。
【０５０３】
コマンド・フィールド３９０７。これは、必要とされるコマンドの特性を識別する。可能な状態は、読出し／書込み、フォーマット（初期化）、移動及び消去を含む。
【０５０４】
状態変数３９０８。これらは、転送要求のカレント・ステート（現在の状態）を追跡するために用いられる変数を含む。フラッシュＨＥＭｉは、転送要求についての動作を開始するとき、これらの変数をチェックしてどのタイプの実行が要求されているかを判定する。例えば、「終了」状態変数は、フラッシュＨＥＭｉに、転送要求が終了したこと、クリーンアップ・ルーチン（後述）が開始すべきであることを伝える。
【０５０５】
Ｒｅｆタグ・フィールド３９０９。これは、転送要求を受ける第１のセクタのためのＲｅｆタグをストアする。この情報は、呼出しＩＯＰのＲｅｆタグ・フィールド３８１２から取り出されるが、必要に応じて、ＩＯＰによって呼び出される第１の転送要求以外の転送要求で調整される。
【０５０６】
Ａｐｐタグ・フィールド３９１０。これは、Ａｐｐタグ及びＡｐｐタグ・マスクをストアする。この情報は、呼出しＩＯＰのＡｐｐタグ・フィールド３８１３から取り出される。
【０５０７】
ページ要求割り当てフィールド３９１１は、現在の読出しまたは書込み動作に対して転送要求が割り当てられたページ要求の数を含む。好適実施形態では、この数は最大で３に設定される。
【０５０８】
残存ページ要求（Remaining Page Requests）フィールド３９１２は、まだ完了していない転送要求によって割り当てられるページ要求の数を含む。このフィールドは、当初は、ページ要求割り当てフィールド３９１１と同じ値を含む。各ページ要求が完了すると、フラッシュＨＥＭｉは残存ページ要求・フィールド３９１２をデクリメントする。
【０５０９】
ページ要求・ポインタ・アレイ３９１３。このフィールドは、転送要求によって必要とされる転送を処理するために割り当てられた各ページ要求へのポインタを含む。
【０５１０】
ページ要求割り当てフィールド３９１１、残存ページ要求・フィールド３９１２及びページ要求・ポインタ・アレイ・フィールド３９１３は、共有ＲＡＭ（下記参照）内の転送要求テーブル４１１１にストアされている転送要求には含まれない。その代わりに、これらのフィールドは、詳細に後述する或るプロセスにおいて転送要求がフラッシュＨＥＭｉのｍＲＡＭにストアされているときに転送要求に加えられる。
【０５１１】
図４０は、ページ要求２１０などのページ要求の構造を示す。ページ要求は、フラッシュＨＥＭｉ群のｍＲＡＭにストアされる。フラッシュＨＥＭｉがＲｄＷｒ ＨＥＭｉから転送要求を受信するとき、フラッシュＨＥＭｉは、転送要求を実行するのに必要なページ要求を作成し、転送要求のページ要求ポインタ・アレイ３９１３にそれらのページ要求を識別する情報を投入する。各ページ要求は、以下のフィールドを含む。
【０５１２】
ページ要求セルフポインタ４００１。これは、ページ要求を保持するフラッシュＨＥＭｉのｍＲＡＭにおけるページ要求テーブル２９０６内のページ要求の意図を指す。
【０５１３】
呼出し転送要求４００２。これは、このページ要求を呼び出し、転送要求セルフポインタ３９０１からコピーされた転送要求に対する識別子を含む。
【０５１４】
コマンド・フィールド４００３。これは、呼出し転送要求のコマンド・フィールド３９０７から生じる。このフィールド内の可能な値は、次のものを含む。
・読出し
・書込み
・リード・モディファイ・ライト
・消去
【０５１５】
転送要求内のコマンド・フィールド３９０７が「書込み」であり、ページ要求の転送長フィールド４０１０（下記参照）が、書込みがページ全体に満たないもののためであることを示していれば、リード・モディファイ・ライト状態が設定されることに留意されたい。後述するように、この場合、リード・モディファイ・ライトが必要とされ、その理由は、フラッシュ書込みは一度にページ全体で起こり、もしもページ要求がスーパーページ全体に満たない書込みであれば、古いスーパーページの残りは、新しいスーパーページにコピーされて書き込まれなければならない。
【０５１６】
データパスＤＲＡＭポインタ・フィールド４００４。これは、転送要求ＤＲＡＭポインタ・フィールド３９０５から生じるが、この特定のページ要求に関連するデータは転送要求に割り当てられたＤＲＡＭ空間内に置かれるかまたは見つかるべきである点（例えば、第１のページ要求に関連するデータは転送要求空間の先頭に見られることになり、第２のページ要求に関連するデータは転送要求空間内へオフセットされることになる、等）を反映するように変更される。
【０５１７】
ＳＰａｇｅインデックス・フィールド４００５は、このページ要求によって処理されているＬＢＡ範囲を表すインデックスをフォワード・テーブル３２０１内にストアする。この情報は、転送要求ＬＢＡフィールド３９０３に基づいて生成され、必要に応じて同じ転送要求の結果として開始される他のページ要求を反映するように変更される。
【０５１８】
フラッシュ読出しアドレス・フィールド４００６。これは、読出しが生じるフラッシュメモリ・グループ内のアドレスを含み、当該位置を、バンク、ブロック及びページによって識別する。この情報は、フォワード・テーブル３２０１から得られる。フラッシュＨＥＭｉが転送要求を受信すると、フラッシュＨＥＭｉは転送要求からのＬＢＡフィールド３９０３内の情報を用いて、フォワード・テーブル３２０１内のＬＢＡに対応するフラッシュ・アドレス情報を見つける。上記したように、ＬＢＡを１５で除してフォワード・テーブル内のローを見つけ、除算から得られる余りを用いてセクタの物理位置を識別することによって、ＬＢＡが物理フラッシュ・アドレスに変換される。
【０５１９】
フラッシュ書込みアドレス・フィールド４００７。これは、ページ要求による書込みに用いられるフラッシュ・グループのアドレスを含み、書込みに用いられるスーパーページに基づいて計算される。スーパーページの選択方法については後述する。リード・モディファイ・ライトが読出しアドレス及び書込みアドレス・フィールドの両方を必要とするので、ページ要求はその両方を含む。
【０５２０】
ヘッド長フィールド４００８。スーパーページの途中で転送が始まるような部分転送の場合、このフィールドは、ＬＢＡにおいてスーパーページの始まりと転送が始まるはずの位置とのオフセットを保持する。このフィールドは、フラッシュ読出しアドレスまたはフラッシュ書込みアドレス（上記参照）を決定するために用いられるＬＢＡを取り、そのＬＢＡを１５で割ることによって計算される。この除算で生じた余りは、ヘッド長フィールドに用いられる。
【０５２１】
テール長フィールド４００９。スーパーページの途中で転送が終わるような部分転送の場合、このフィールドは、ＬＢＡにおいてスーパーページの終わりと転送が終わるはずの位置とのオフセットを保持する。このフィールドは、転送長フィールド４０１０の値にヘッド長フィールド４００８の値を加え、その結果生じた値を「１５」から引くことによって計算される。
【０５２２】
転送長フィールド４０１０。これは、このページ要求に必要な転送の長さを指定する。この情報は、転送要求の転送長フィールド３９０４及びこの特定のページ要求が処理することが必要とされることになる転送の一部に基づき、フラッシュＨＥＭｉによって生成される。ヘッド長フィールド４００８、テール長フィールド４００９及び転送長フィールド４０１０は、常に合計すると１つのスーパーページ内のＬＢＡの数（この実施形態では、これは１５である）になることに留意されたい。
【０５２３】
状態変数フィールド４０１１。このフィールドは、ページ要求２１０のカレント・ステートの経過を追うために用いられる一連のフラグで構成されている。状態変数の使用の例は、図５１及び図５３に関連して説明する。複数のフラグが同時に設定され得るが、或る一定の組合せは不正である。好適実施形態では、このフィールドは、以下のフラグを含むが、用いられる正確なフラグはインプリメント依存であり、異なる１組の状態フラグを用いて同じ結果を得ることもできることを理解されたい。
【０５２４】
コマンド：これは、ページ要求が、フラッシュメモリ部にコマンドを発行する準備ができていることを示す。
【０５２５】
レディ／ウェイト（待ち）：これは、ページ要求が開始できる状態にあり、リソースが利用可能になるのを待っていることを示す。
【０５２６】
ニード・ステージバッファ（Need stage buffer）：これは、ページ要求がフラッシュ・ステージバッファの開始を必要としていることを示す。
【０５２７】
フラッシュ転送終了：これは、ページ要求によって求められるフラッシュ読出しまたは書込みが完了していることを示す。
【０５２８】
第１、第２の：これは、トランザクションの現在のフェーズを示す。例えば、リード・モディファイ・ライトにおいて、ページ要求は、トランザクションの異なるフェーズ中にフラッシュメモリ部に異なるコマンドを発行することが求められる。このフィールドにより、ページ要求は当該プロセスのどこにいるのかを把握することができる。
【０５２９】
ページ要求終了：これは、ページ要求が全ての必要な動作を完了したことを示す。
【０５３０】
データ転送エラー：これは、ページ要求によって処理された転送がエラーに終わったことを示す。
【０５３１】
Ｒｅｆタグ・フィールド４０１２は、ページ要求によってアドレス指定された第１のセクタのＲｅｆタグをストアする。この情報は、呼出し転送要求のＲｅｆタグ・フィールド３９０９から得られるが、必要に応じて、転送要求によって呼び出される第１のページ要求以外のページ要求のためにオフセットされる。
【０５３２】
Ａｐｐタグ・フィールド４０１３は、呼出し転送要求のＡｐｐタグ・フィールド３９１０から取り出されたＡｐｐタグ及びＡｐｐタグ・マスク情報をストアする。
【０５３３】
Ｃ．共有ＲＡＭ構造
【０５３４】
図４１は、共有ＲＡＭブロック３１８にストアされている情報を示す。共有ＲＡＭブロック３１８は、イニシエータに関連する２つのデータ構造、すなわちイニシエータ・フリーリスト４１１２及びイニシエータ・テーブル４１０８を含む。
【０５３５】
この実施形態では、ＳＳＤコントローラ１０６は、１６個の同時にアクティブなイニシエータからのコマンドに応答することができる。それゆえ、イニシエータ・テーブル４１０８は１６個のスロットを含み、各スロットは、イニシエータ０〜１５で表される１つのイニシエータに関連する情報のための空間、例えばイニシエータ情報ブロック４１０１を含むが、これについては図４２に関連してさらに後述する。ＳＣＳＩプロトコルは、ＳＳＤコントローラ１０６が少なくとも１６個のアクティブなイニシエータに応答することを要求しているが、代替実施形態では、ＳＳＤコントローラ１０６は、イニシエータ・テーブル４１０８及びイニシエータ・フリーリスト４１１２のサイズを増大させることによって、プロトコルによって要求されるよりも多数のイニシエータに応答するように設計されることができる。
【０５３６】
イニシエータ・フリーリスト４１１２は、イニシエータ・テーブル４１０８内の空のスロットへのポインタを含む深さ１６のＦＩＦＯキューである。新しいイニシエータが最初にＳＳＤコントローラ１０６と通信しようとするとき、イニシエータ・フリーリスト４１１２のトップからのポインタがキューから取り出され、当該ポインタによって参照されるイニシエータ・テーブル４１０８内のスロット（例えばスロット４１０１）が、新しいイニシエータに関する情報のストレージのために用いられる。イニシエータ・フリーリスト４１１２が空であれば、これは、ＳＳＤコントローラ１０６が追加のイニシエータを処理することができないことを示している。ＳＳＤコントローラ１０６は、ホスト・インタフェース３１０を介して状態情報を提供することによってこの条件に応答し得る。
【０５３７】
イニシエータ情報がＳＳＤコントローラ１０６に伝えられる方法は、プロトコル特有のものであることを理解されたい。しかし、一般には、この情報は、イニシエータが先ずＳＳＤコントローラ向けのコマンドを開始し始める前に提供されるデータ構造で伝えられる。当該データ構造内の情報は、イニシエータ・テーブル４１０８内の当該イニシエータのエントリを投入するために用いられる。
【０５３８】
共有ＲＡＭブロック３１８は、ＣＤＢ情報に関連する２つのデータ構造、すなわちＣＤＢ情報テーブル４１０９及びＣＤＢ情報フリーリスト４１０２を含む。
【０５３９】
ＣＤＢ情報テーブル４１０９は、ＣＤＢ情報０〜１４３と表される１４４個のＣＤＢ情報のためのスロットを含む。これらの各スロットは、１つのＣＤＢ情報、例えばＣＤＢ情報２０１をストアすることができる。ＣＤＢ情報にストアされる情報については図３７に関連して説明する。
【０５４０】
フリーリスト４１０２は、ＣＤＢ情報テーブル４１０９内の空のスロットへのポインタを含む深さ１４４のＦＩＦＯキューである。新しいＣＤＢ情報が必要とされるとき、フリーリスト４１０２のトップからポインタがポップされる。新しいＣＤＢ情報のための情報は、その後、ポップされたポインタが指すＣＤＢ情報テーブル４１０９内の空のスロットに書き込まれる。ＣＤＢ情報の処理が完了すると、当該ＣＤＢ情報は消去され、ＣＤＢ情報テーブル４１０９内のＣＤＢ情報を含むスロットへのポインタがフリーリスト４１０２に加えられ、それによって、空間を新しいＣＤＢのために使えるようにする。
【０５４１】
ＳＣＳＩプロトコルは、特殊な状況下で、たとえリソースが別な方法で利用可能でないとしても、ＳＳＤコントローラ１０６がＣＤＢを処理する能力を保証することを必要とする。これらの要件は、フリーリスト４１０２が制御される方法に影響するものであり、図４６及び図４７に関連して詳細に後述する。
【０５４２】
共有ＲＡＭブロック３１８は、ＩＯＰに関連する２つのデータ構造、すなわちＩＯＰテーブル４１１０及びＩＯＰフリーリスト４１０３を含む。これらは、対応するＣＤＢ情報構造と同じような働きをする。ＩＯＰテーブル４１１０は、ＳＳＤコントローラ１０６が一度に処理することができる６０個のＩＯＰのそれぞれに対するスロットを含む。ＩＯＰテーブル４１１０の各スロットに含まれるＩＯＰ情報の形式については、図３８に関連して説明する。ＩＯＰフリーリスト４１０３は、空いている（有効なＩＯＰが書き込まれていない）ＩＯＰテーブル４１１０内のスロットへのポインタを含む深さ６０のＦＩＦＯキューである。
【０５４３】
共有ＲＡＭブロック３１８は、転送要求に関連する２つのデータ構造、すなわち転送要求テーブル４１１１及び転送要求フリーリスト４１０４を含む。これらは、対応するＩＯＰ構造と同じような働きをする。転送要求テーブル４１１１は、ＳＳＤコントローラ１０６が一度に処理することができる１２０個の転送要求のそれぞれに対するスロットを含む。この情報の形式については、図３９に関連して説明する。転送要求フリーリスト４１０４は、空いている（有効な有効な転送要求が書き込まれていない）転送要求テーブル４１１１内のスロットへのポインタを含む深さ１２０のＦＩＦＯキューである。
【０５４４】
共有ＲＡＭブロック３１８はまた、ＳＳＤコントローラ１０６に含まれる各ＨＥＭｉに対して１つのワークリストを含む。説明している実施形態は、各ＨＥＭｉが、関連付けられたワークリストを共有ＲＡＭブロック３１８内に有するような２３個のＨＥＭｉを含むが、図４１にはそのうちの３つのみ、すなわち、４１０５、４１０６及び４１０７を示す。ＨＥＭｉの数はインプリメントによって様々であり、共有ＲＡＭブロック３１８は、各ＨＥＭｉに対して１つのワークリストを常に含むことになることを理解されたい。
【０５４５】
各ＨＥＭｉワークリストは、関連ＨＥＭｉによって作動させられるタスクのキューである。一般に、ＨＥＭｉワークリストは、ＣＤＢ情報テーブル４１０９内のＣＤＢ情報、ＩＯＰテーブル４１１０内のＩＯＰ、及び転送要求テーブル４１１１内の転送要求へのポインタを含み、ＨＥＭｉワークリスト上のそのようなポインタの存在は、関連ＨＥＭｉが、識別されたＣＤＢ情報、ＩＯＰまたは転送要求に関連する処理タスクを実行することを求められていることを示している。ＨＥＭｉ同士は、ポインタをＨＥＭｉワークリストに置くことによって通信する。
【０５４６】
この実施形態では、ワークリストはＦＩＦＯであり、図２４に関連して説明したようなＦＩＦＯポインタ・レジスタ（例えばポインタ・レジスタ２２０５）によって制御される。タスクが、特定のタスクを優先しようとする試みなしに、受信順にワークリストから取り出される。代替実施形態では、タスクは、例えばＩＯＰにプライオリティ・ビットを含めることによって、優先される。プライオリティ・ビット・セットを有するＩＯＰによって呼び出される転送要求も、プライオリティ・ビットを含み得る。そのような優先度の高い転送要求は、ＨＥＭｉワークリストのボトムに加えられる代わりにトップに追加されることができるので、そのような転送要求は、たとえ他の転送要求が既にワークリスト上にあっても、ＨＥＭｉによって処理される次の転送要求になる。
【０５４７】
ＣＤＢ情報、ＩＯＰまたは転送要求がＨＥＭｉワークリストに移動させられたら、他のＨＥＭｉは構造を変更することができない（アボート関連情報を除く）。
【０５４８】
共有ＲＡＭブロック３１８はまた、複数のグローバル変数４１１３を含む。これらは、処理の際にＨＥＭｉ群によって用いられる変数をストアする。
【０５４９】
図４２は、イニシエータ・テーブル４１０８内のエントリの構造を示す。それぞれのそのようなエントリ（例えばイニシエータ０ ４１０１）は、テーブル４１０８内のイニシエータの位置を指すイニシエータ・セルフポインタ・フィールド（４２０１）を含む。
【０５５０】
イニシエータ識別子フィールド４２０２は、この特定のイニシエータを識別する情報を含む。この情報は、ホストから受信され、ホストとＳＳＤコントローラ１０６間の通信に用いられるので、ホストは、ＳＳＤコントローラ１０６から適切なイニシエータへ通信をルーティングすることができる。イニシエータ識別子フィールド４２０２は、新しいイニシエータがＳＳＤコントローラ１０６への要求されたアクセスを有する（そのような要求の形式は、特定のプロトコル、例えば、ＳＡＳ、ＦＣＡＬなどに特有のものであり、当業者には明らかである）ことを示すホストから第１の要求を受信する受信ＨＥＭｉによって、データ投入される。そのような表示を受信すると、受信ＨＥＭｉは、イニシエータ・フリーリスト４１１２からイニシエータを取り出し、イニシエータ識別子フィールドにホストから受信された識別情報を投入する。好適実施形態では、イニシエータ識別子は、イニシエータのオープン・フレームの一部として受信されたワールドワイドネーム（ＷＷＮ）を含む。
【０５５１】
カウント・フィールド４２０３は、このイニシエータから受信されたまだ完了していないＣＤＢの数を含む。ＣＤＢが受信されたとき、受信ＨＥＭｉはイニシエータを識別し、当該イニシエータに対するカウント・フィールド４２０３をインクリメントする。ＩＯＰが実行を終えたとき、カウント・フィールド４２０３は、クリーンアップ・プロセスの一部としてデクリメントされる。カウント・フィールド４２０３が０に達したとき、これは、このイニシエータはシステム内に残るコマンドを有しないことを示している。その時点で、一実施形態では、イニシエータ情報は消去され、データ構造はイニシエータ・フリーリスト４１１２に戻される。代替実施形態では、イニシエータは、フリーリストが空でありかつ新しいイニシエータが必要とされるときにフリーリストに戻されるだけである。
【０５５２】
バースト長フィールド４２０４は、イニシエータが最初に作成されたときに受信したメタデータの一部としてホストから受信したバースト長制御情報を含む。バースト長制御情報は、ＳＣＳＩプロトコルによって指定され、バースト・データ転送の最大長を設定するために用いられる。イニシエータへの転送またはイニシエータからの転送が最大長を超えるならば、ＳＳＤコントローラ１０６は、転送をインタラプトし、他のイニシエータとの転送が起こるようにし、その後、転送を再開しなければならない。これは、転送を処理する送信ＨＥＭｉによって処理される。限界に到達した後、送信ＨＥＭｉは転送をディスコネクトし、その後すぐにリコネクトを試みる。
Ｖ．動作
Ａ．書込み性能
【０５５３】
大容量ソリッドステート・ドライブの基本性能のボトルネックは、フラッシュメモリへのインタフェースである。そのため、ＳＳＤコントローラ１０６は、そのインタフェースを最大限使用するように設計される。このことは、可能な限りフラッシュインタフェースをビジーに維持することを企図して、トランザクションを比較的小さなチャンクに分割し、且つ、そのチャンクを高度のパラレル処理で実行することによって行われる。すなわち、フラッシュメモリモジュール１０８は、多数のフラッシュ・グループを含み、このフラッシュ・グループの各々は、当該システムの他の部分への独立したインタフェース、さらに、各フラッシュグルーブが独立に且つパラレルに作動することを可能とする関連フラッシュ・ポートを有する。各フラッシュ・グループ内では、メモリは複数のバンクに分けられ、このバンクの各々は、パラレルに作動可能である。一度にＳＳＤコントローラ１０６へ接続し得るのは、フラッシュ・グループ毎に１つのバンクのみであるが、複数のバンクにトランザクションの小部分が送られ、複数バンクの内部フラッシュ動作実行を可能とし、その際、フラッシュインタフェースは、他の目的のために使用される。このことは、複数のバッファの使用に加えるに、読出しまたは書込みが連続して生ずる場合に可能であるよりもはるかに高速のトランザクション完了を可能とする。
【０５５４】
４０ＭＨｚで作動する典型的な現代のシングルレベルセル・フラッシュメモリチップは、１つのページ書込み動作を実行するのに約２００マイクロ秒を要する。（当業者に理解されるように、フラッシュメモリ書込み動作は、多くの場合、リード・モディファイ・ライトを含む。）さらに、データのスーパーページをステージバッファからフラッシュチップバッファ内に移動するために約５０マイクロ秒を要する。このことは、フラッシュ・グループは５つの連続した書込み動作を別々のバンクへとパイプライン処理することが可能であり、これにより、フラッシュインタフェースを完全に占有されたままにすることができる。各書込み動作は、５０マイクロ秒にわたって、バスを必要とし、次に、２００マイクロ秒にわたって内部的に作動し、この間、４つの他の書込み動作がバスを使用することができる。それゆえ、データは、５００マイクロ秒の間に、９０のＬＢＡの全ストライプに書き込むことができる。
【０５５５】
これは図４３に示されており、図４３は、１つのフラッシュ・グループと５０マイクロ秒ずつインクリメントさせた時間を相互参照するテーブルを含む。このテーブルは、９０のＬＢＡより成るバンク０〜５上のスーパーページへの６つのスーパーページ書込みを示している。
【０５５６】
第１の５０マイクロ秒期間では、バンク０は、バスを用いて、データの或るスーパーページをステージバッファからバンク０フラッシュ・ページ・バッファへ移動させる。このことは、図４３中に「Ｍ」として示す。次の４の５０マイクロ秒期間に、バンク０上のフラッシュ・ダイは、ページバッファからフラッシュメモリへの内部書込み動作を実行する（図４３中に「Ｗ」として示す）。
【０５５７】
バンク０は最初の期間後にバスを必要としないので、バンク１は、第２の５０マイクロ秒期間（時間１００として示される）中にステージバッファからバンク１のページバッファへデータを移動させることができる。次に、バンク１は、内部フラッシュ書込み動作を開始することができ、バスをバンク２へと転換する。バンク３、４及び５への書込みも同様に進行する。
【０５５８】
図に示すように、この６つのスーパーページ書込みには５００マイクロ秒を要する。フラッシュバスは、この期間のうちの３００マイクロ秒の間、使用状態にある。フラッシュ書込み動作は、バス動作とパラレルに起こり得るので、シリアルならば１，５００マイクロ秒（６×２５０）を要する書込みは、約３分の１の時間で完了する。
【０５５９】
さらに、３００マイクロ秒後に、フラッシュ・バスは空いており、これにより、他のトランザクションのバスへのアクセス達成が可能となり、これにより、複数のトランザクションのオーバーラップが可能となる。
【０５６０】
図４３は、書込み動作を示す。というのも、そのような動作に含まれるレイテンシーは、約１００マイクロ秒（フラッシュ・ページ・バッファへのデータの読出しに５０マイクロ秒、ステージバッファへのデータの移動に５０マイクロ秒）を要する読出し動作のレイテンシーを相当に上回るからである。それゆえ、ここに説明のアーキテクチャは、書込み性能を最大限とするように設計され、書込みには劣るが、同一のフラッシュ・グループ上に２つの読出し動作（１つは前記フラッシュからの読出し、１つはステージバッファへのデータの移動）をオーバーラップすることが可能である場合に限り、読出しの性能を向上させる傾向もある。
【０５６１】
同程度の性能が各フラッシュ・ポートにおいてパラレルに生ずるので、且つ、前記フラッシュ・グループにわたってデータがストライプされるので、このパラレル・パイプライン型アーキテクチャの使用なしの場合に可能なものよりも非常に迅速に多数のトランザクションを生起することができる。それゆえ、理論的には、１２個のフラッシュ・グループを含むシステムは、１，０８０個のＬＢＡ（１２×９０）を５００マイクロ秒で書き込むことが可能である。この理論的最大値は、書込みの各々が、バンク及びフラッシュ・グループに関して完全に整備されることを必要とするので、現実には頻繁に達成する可能性はなさそうである。しかしながら、明らかなように、ここに説明のアーキテクチャのパラレル処理及びパイプライン処理は、フラッシュ誘導レイテンシーをマスクし、且つ、従来のハードドライブまたはフラッシュメモリデバイスよりも相当に上回る性能での読出し及び書込みシークェンスを可能とする。
【０５６２】
ここに説明のアーキテクチャは、標準のＳＬＣフラッシュチップを組み込んだシステムに必要とされるレベルを越えた相当な性能のヘッドルームを含むので、大きな変更なしに、比較的に遅いＭＬＣフラッシュに適応させることができる。当業界で理解されるように、ＭＬＣ（「マルチレベルセル」）は、１フラッシュセルごとに２（またはそれより多い数）のビットをストアする。したがって、ＭＬＣチップは、規定の記憶量に対し比較的に安価である。しかし、ＭＬＣチップは、読出し及び書込みに時間が掛かる。
【０５６３】
図４４は、（現在市販されているＭＬＣチップの典型的な性能である）１ページの書込みに３５０マイクロ秒を要するＭＬＣフラッシュチップで作成された単一フラッシュ・グループ上の９０のＬＢＡ書込みを示す。見られるように、全書込みは、６００マイクロ秒内に完了する。これは、ＳＬＣデバイスに関し図４３に示される５００マイクロ秒を超えているが、ＭＬＣチップが各書込みのため追加の１００マイクロ秒を要するとの事実にもかかわらず、その差は、６つの完全ページ書込みのための１００マイクロ秒のみである。今までと同様に、この書込みは、複数のフラッシュ・グループにわたってパラレルに実行され得る。このパラレル処理は、ＭＬＣチップの追加的レイテンシーを大部分マスクするのに十分であり、そのため、使用されるのがＳＬＣチップであるかＭＬＣチップであるかににかかわらず、ホストインタフェースにわたる当該システムの応答性は、ホストに対して完全に受容可能となる。
【０５６４】
Ｂ．読出し及び書込み処理
【０５６５】
図４５は、ホストが開始する書込みコマンドを受信したときにホスト・ポート（例えば、ホスト・ポート０ １０４）によって進められるステップを示すフローチャートを含む。このフローチャートは、受信した最初のフレームを書込みとみなし、それを基本にして進行する。この理由で、現実の実行（例えば、受信したコマンドが読出しか書込みかを決定し、これに従い分岐する）に必要な多数のステップが示されていない。
【０５６６】
ステップ４５０１で、ＧｉｇａＢｌａｚｅ１８０１は、ホストからのプリミティブを受信する。
【０５６７】
ステップ４５０２で、ＧｉｇａＢｌａｚｅ１８０１は、プリミティブをプリミティブ・マッチ・ロジック１８０２へ送信する。
【０５６８】
ステップ４５０３で、プリミティブ・マッチ・ロジックは、そのプリミティブを、フレームが後に続くことを示すスタート・オブ・フレーム（「ＳＯＦ」）プリミティブとして識別する。（理解されるように、この説明は、性質上概念的であり、受信されるプリミティブの特定の性質を記述することを試みるものではない。また、理解されるように、通信の性質は、或る程度、特定のプロトコルに依拠しており、このプロセスの詳細は、使用されるプロトコルに依拠して異なる。）
【０５６９】
ステップ４５０４で、受信したプリミティブにマッチしたプリミティブ・マッチ・レジスタ１９０２からのレジスタに対応するプリミティブ・マッチ・コントロール・レジスタ１９０３からのレジスタの制御の下、フレーム解読ロジック１９０４が、フレームの第１のダブルワードを評価する。
【０５７０】
ステップ４５０５で、フレーム解読ロジックが、フレームがコマンドフレームであることを決定する。
【０５７１】
ステップ４５０６で、プリミティブ・マッチ・ロジック１８０２の制御の下で作動するフレームルータ１８０３が、フレームを非データ・ペイロードＦＩＦＯ１８０４に送信する。このことは、プリミティブ・マッチ・コントロール・レジスタとフレーム解読ロジックの制御の下に行われる。
【０５７２】
ステップ４５０７で、ホスト・ポートの受信ＨＥＭｉ（例えば、受信ＨＥＭｉ１７０２）が、ヘッダーＦＩＦＯからコマンドフレームをポップする。
【０５７３】
ステップ４５０８では、受信ＨＥＭｉがフレームを評価し、それがＣＤＢを含むことを決定する。
【０５７４】
ステップ４５０９で、フレームがＣＤＢを含むとの決定の結果として、受信ＨＥＭｉが、ＣＤＢ情報を生成する。
【０５７５】
ステップ４５１０で、受信ＨＥＭｉが、ＳＣＳＩ ＨＥＭｉ２００１にＣＤＢ情報を送信する。
【０５７６】
ステップ４５１１で、ＳＣＳＩ ＨＥＭｉ２００１が、ＣＤＢが書込みコマンドを含むことを決定する。
【０５７７】
ステップ４５１２で、ＣＤＢが書込みコマンドを含むとの決定に基づき、ＳＣＳＩ ＨＥＭｉ２００１が、ＲｄＷｒ ＨＥＭｉにＣＤＢ情報を送信する。
【０５７８】
ステップ４５１３で、ＣＤＢ情報に基づきＷｒＲｄ ＨＥＭｉがＩＯＰを生成する。
【０５７９】
ステップ４５１４で、ＷｒＲｄ ＨＥＭｉが、ＩＯＰを送信ＨＥＭｉ（例えば、１７０４）に送信する。
【０５８０】
ステップ４５１５で、ＳＳＤコントローラ１０６が、書き込まれるためのデータを含むデータフレームを受信するレディ状態に現在あることをホストに示すように設計された転送レディ・フレームを、送信ＨＥＭｉが生成する。
【０５８１】
ステップ４５１６で、送信ＨＥＭｉが、転送レディ・フレームをＧｉｇａＢｌａｚｅ１８０１に送信する。
【０５８２】
ステップ４５１７で、ＧｉｇａＢｌａｚｅが、転送レディ・フレームをホストに送信する。
【０５８３】
ステップ４５１８で、ＧｉｇａＢｌａｚｅが、転送レディ・フレームに応じてホストによって送られたプリミティブを受け取り、第１のデータ・フレームの始まりを信号で知らせる。
【０５８４】
ステップ４５１９で、ＧｉｇａＢｌａｚｅ１８０１が、プリミティブをプリミティブ・マッチ・ロジック１８０２へ送信する。
【０５８５】
ステップ４５２０で、プリミティブ・マッチ・レジスタが、プリミティブをＳＯＦとしてマッチする。
【０５８６】
ステップ４５２１で、プリミティブ・マッチ・コントロール・レジスタ１９０３の制御の下、フレーム解読ロジック１９０４がフレームの第１のダブルワードを評価する。
【０５８７】
ステップ４５２２で、フレーム解読ロジックは、フレームがデータフレームであることを決定する。
【０５８８】
ステップ４５２３では、プリミティブ・マッチ・ロジック１８０２の制御の下で作動するフレームルータ１８０３が、フレームのヘッダ部分を非データ・ペイロードＦＩＦＯ１８０４に送り、且つ、フレームのデータ部分を受信ステージバッファ１７０６に送信する。このことは、プリミティブ・マッチ・コントロール・レジスタ内のプリミティブの最初のマッチ、に加えるに、フレームのデータフレームとしての識別の結果として、行われる。この場合、プリミティブ・マッチ・コントロール・レジスタは、ルーチン・ロジックが或る組合せ数のダブルワードを非データ・ペイロードＦＩＦＯへ送り、さらに、後続のダブルワードをステージバッファへと送信することを生起する。
【０５８９】
ステップ４５２４で、受信ＨＥＭｉが、非データ・ペイロードＦＩＦＯからヘッダをポップする。
【０５９０】
ステップ４５２５で、受信ＨＥＭｉが、ヘッダを評価し、それがデータフレームを表すことを決定する。
【０５９１】
ステップ４５２６で、受信ＨＥＭｉが、ヘッダのターゲット・ポート・トランスファ・タグ（「ＴＰＴＴ」）部分をチェックする。全フレームとともに受信されるこのフィールドは、単一トランザクションに関連するフレーム、例えば、書込みコマンドを含むコマンドフレームと書き込まれるデータを含むデータフレームを結び合わせるデータを含む。このＴＰＴＴの情報は、入力コマンドの結果として作成されるＩＯＰの中にコピーされる。ステップ４５１３において作成されたＩＯＰに受信されたデータフレームを関連させるべく、この情報を、受信ＨＥＭｉが使用する。
【０５９２】
ステップ４５２７で、受信ＨＥＭｉが、受信ステージバッファに含まれるデータのＤＭＡ転送を、ＩＯＰによって特定されるデータパスＤＲＡＭ１０７内の或る場所にセットアップする。引き続いて進行する書込み動作の様式を以下に説明する。
【０５９３】
図４６は、ＳＳＤコントローラ１０６によるＣＤＢ処理の初期段階を示すフローチャートを含む。このフローチャートは、ＣＤＢ情報をＲｄＷｒ ＨＥＭｉに伝えることによるホストからのＣＤＢの受信からこのプロセスを図解する。
【０５９４】
理解されるように、また、この明細書に利用の全てのフローチャートに当てはまるように、図４６は、アルゴリズムの観点からこのプロセスを図解しており、実行の詳細または特定のソフトウエアのステップを説明することを企図していない。さらに、或る種類のステップの順序は、後のステップが先のステップの結果に依拠しないという意味で、任意である。現実の実施形態でのそのようなステップの順序の様式は、実行に依存する。
【０５９５】
ステップ４６０１で、ホスト１０１が、物理的なインタフェース１７０１を介して受信ＨＥＭｉ１７０２へＣＤＢを送信する。上述したように、このＣＤＢには、イニシエータの識別を含むメタデータが伴う。受信ＨＥＭｉ１７０２は、そのｍＲＡＭ内にこのＣＤＢとメタデータを一時的にストアする。
【０５９６】
ステップ４６０２では、受信ＨＥＭｉ１７０２が、クロスバー・スイッチ２２０１を介して共有ＲＡＭブロック３１８にアクセスし、１６よりも多いＣＤＢ情報が使用可能か否かを決定するべく、ＣＤＢ情報フリーリスト４１０２をチェックする。
【０５９７】
使用可能なものが１６以下であれば（ステップ４６０２の結果が「ｎｏ」）、プロセスは、図に関連して詳細に説明される特定例処理に関する図４７に図解のフローチャートへと進む。
【０５９８】
１６よりも多いＣＤＢ情報が使用可能であれば（ステップ４６０２の結果が「ｙｅｓ」）、ステップ４６０３において、受信ＨＥＭｉ１７０２は、クロスバー・スイッチ２２０１を介して共有ＲＡＭブロック３１８にアクセスし、メタデータ内に識別されたイニシエータが既に存在するか否かを判断するべく、イニシエータテーブル４１０８をチェックする。このステップは、図４７に示されるフローチャートへの結果の１つとしても達せられることにご留意願いたい。
【０５９９】
イニシエータがイニシエータテーブル４１０８内に無い場合（ステップ４６０３の結果が「ｎｏ」）、ステップ４６０４において、受信ＨＥＭｉ１７０２は、空きイニシエータが使用可能がどうか決定するべく、イニシエータフリーリスト４１１２をチェックする。
【０６００】
空きイニシエータが利用可能でなければ（ステップ４６０４の結果が「ｎｏ」）、ステップ４６０５において、受信ＨＥＭｉ１７０２が、キューフル・ルーチンを起動する。好適実施形態では、ＳＳＤコントローラ１０６がこの状況を処理する様式は、初期化の時点でユーザによって設定可能なパラメータに依拠する。この状況内でキューフル・リポートが作成されるべきことを、ユーザは決定することができ、これは、リソースが使用可能となるときまでコマンドの再試行が行われるようにイニシエータを制御する効果を有する。代替として、テーブルが、アクティブなコマンドを有していないことを意味する０のカウント・フィールド４２０３を有するいずれかのイニシエータを含むか否かを決定するべく、ユーザは、イニシエータテーブル４１０８のスクラブ（洗浄）の必要を決定することができる。そのようなイニシエータは、テーブルからスクラブされ、これにより、空間を新しいイニシエータのために使えるようにする。スクラブがイニシエータを開始すれば、プロセスの継続が可能である。そうでない場合には、キューフル・リポートが作成される。
【０６０１】
空きイニシエータが利用可能であれば（ステップ４６０４の結果が「ｙｅｓ」）、ステップ４６０６において、受信ＨＥＭｉ１７０２が、イニシエータフリーリスト４１１２からイニシエータをポップする。
【０６０２】
ステップ４６０７で、受信ＨＥＭｉ１７０２は、ＣＤＢを伴うメタデータ内に受け入れた識別情報を使用して、イニシエータアイデンティファイアフィールド４２０２にデータ投入する。
【０６０３】
ステップ４６０８において、受信ＨＥＭｉ１７０２は、イニシエータに関するカウント・フィールド４２０３に１を加える。イニシエータテーブル４１０８内にイニシエータが既に存在している（ステップ４６０３の結果が「ｙｅｓ」）か否（ステップ４６０７から）かに係らず、このステップは実行される。
【０６０４】
ステップ４６０９において、受信ＨＥＭｉ１７０２は、ＣＤＢ情報フリーリスト４１０２からＣＤＢ情報（例えばＣＤＢ情報２０１）をポップする。
【０６０５】
ステップ４６１０において、受信ＨＥＭｉ１７０２は、ＣＤＢ情報テーブル４１０９からのＣＤＢ情報をそれ自身のｍＲＡＭ内にコピーする。この時点では、セルフポインタフィールド３７０１を除き、ＣＤＢ情報は空であることにご留意願いたい。
【０６０６】
ステップ４６１１において、受信ＨＥＭｉ１７０２は、以下のようにＣＤＢ情報のフィールドにデータ投入する。
【０６０７】
ＣＤＢフィールド３７０２内に、ホスト１０１から受信したＣＤＢのコピーを置く。
【０６０８】
イニシエータフィールド３７０３内に、イニシエータテーブル４１０８内のそのイニシエータに関する入力からのセルフポインタ４２０１のコピーを置く。
【０６０９】
ＳＣＳＩタグ・フィールド３７０５、ＳＣＳＩフラグ・フィールド３７０６、Ｒｅｆタグフィールド３７０８、及びＡｐｐタグ・フィールド３７０９内に、ＣＤＢを含んだ伝送内でホスト１０１から受信したメタデータをセットする。このメタデータの性質は、図３７に関連して記述される。
【０６１０】
バーストレングスコントロールフィールド３７０７では、イニシエータフィールド３７０３内に識別された前記イニシエータに関連するイニシエータインフォ（ＩｎｉｔｉａｔｏｒＩｎｆｏ）のバーストレングスコントロールフィールド４２０４内に含まれる前記情報のコピーがセットされる。
【０６１１】
ステップ４６１２において、受信ＨＥＭｉ１７０２はクロスバー・スイッチ２２０１にアクセスして、セルフポインタ・フィールド３７０１によって指示されたＣＤＢ情報テーブル４１０９内のスロットに、データ投入されたＣＤＢ情報２０１をコピーする。
【０６１２】
ステップ４６１３において、受信ＨＥＭｉ１７０２は、ＳＣＳＩ ＨＥＭｉ２００１に関するワークリスト内に、セルフポインタ・フィールド３７０１のコピーをセットする。
【０６１３】
ＳＣＳＩ ＨＥＭｉ２００１に関するワークリストが予め空であった場合には、ワークリスト内へポインタを置くことによりＳＣＳｉ ＨＥＭｉを起こす。ワークリスト上に別のタスクが既に存在していた場合には、ＳＣＳＩ ＨＥＭｉは、これらのタスクを完了する。どちらにしても、或る時点で、ＣＤＢ情報２０１へのポインタは、ワークリストのトップにあり、ステップ４６１４において、ＳＣＳＩ ＨＥＭｉ２００１は、そのワークリストにアクセスし且つポインタをポップするためにクロスバー・スイッチ２２０１を使用する。
【０６１４】
ステップ４６１５において、ＳＣＳＩ ＨＥＭｉ２００１は、ＣＤＢ情報テーブル４１０９内のＣＤＢ情報２０１の場所にアクセスするためにクロスバー・スイッチ２２０１を使用し、ＣＤＢ情報をそれ自身のｍＲＡＭ内にコピーする。
【０６１５】
ステップ４６１６において、ＳＣＳＩ ＨＥＭｉ２００１は、ＣＤＢ情報２０１のＣＤＢフィールド３７０２からのＣＤＢのコマンド部分を読み出して、それが、データ転送か否か（読出しまたは書込み）を決定する。
【０６１６】
コマンドが読み出しまたは書き込み以外であれば（ステップ４６１６の結果が「ｎｏ」）、ステップ４６１７において、ＳＣＳＩ ＨＥＭｉ２００１は、ＣＤＢ情報を、読出しまたは書込み以外のコマンドの処理に関与するＡＲＭプロセッサ２００２に伝える。この時点で、図４６に記述されたプロセスは終了する。
【０６１７】
コマンドが読出しまたは書込みであれば（ステップ４６１６の結果が「ｙｅｓ」）、ステップ４６１８において、ＳＣＳＩ ＨＥＭｉ２００１が、ＣＤＢ情報２０１のＣＤＢフィールド３７０２内にストアされたＣＤＢの転送長フィールドとＬＢＡを、上述したように、ＳＣＳＩ ＨＥＭｉ２００１のｍＲＡＭ内にストアされたコマンドテーブル２００３と比較する。この比較によって、ＳＣＳＩ ＨＥＭｉ２００１は、ＣＤＢによって転送が要求されるＬＢＡのいずれかがコマンドテーブル内で既に識別されているかどうかを決定する。この比較での一致は、新たなＣＤＢの対象となっているＬＢＡの幾つかまたは全てが、既に、現在の転送の対象であることを示す。上述したように、ＳＳＤコントローラ１０６には、ＬＢＡが不一致なコマンドにさらされることがないように、一貫性を維持することが要求される。
【０６１８】
ＳＣＳＩ ＨＥＭｉ２００１が、コマンドテーブルに一致を発見したら（ステップ４６１８の結果が「ｙｅｓ」）、ステップ４６１９において、ＣＤＢ情報の実行を遅らせ、そして、ステップ４６１８へ戻る。このループは、一致が存在しなくなるまで続けられる。
【０６１９】
一致が発見されなければ（ステップ４６１８の結果が「ｎｏ」）、ステップ４６２０において、ＳＣＳＩ ＨＥＭｉ２００１が、ＣＤＢフィールド３７０２からの転送長及びＬＢＡをコマンドテーブル２００３内にセットする。
【０６２０】
ステップ４６２１では、ＳＣＳＩ ＨＥＭｉ２００１は、最も少ないタスクを含有するＲｄＷｒ ＨＥＭｉワークリストはどれかを決定するべく、ＲｄＷｒ ＨＥＭｉワークリストの各々に関してカウント・レジスタ（例えばカウント・レジスタ２４０８）にアクセスする。
【０６２１】
ステップ４６２２において、ＳＣＳＩ ＨＥＭｉ２００１は、ＣＤＢ情報２０１へのポインタを、識別されたワークリスト、例えば、ＲｄＷｒ ＨＥＭｉ２１０１に関するワークリスト上にセットし、図４６に記述のプロセスは完了する。
【０６２２】
ステップ４６０２の後で且つステップ４６０９の前のイニシエータ関連ステップは、１よりも多いイニシエータ（例えば、ＳＡＳ及びファイバーチャネル）を可能とするプロトコルを必要とするのみであることにご留意願いたい。単一イニシエータ（例えばＳＡＴＡ）を可能とするのみのプロトコルには、これらのステップは不要である。その代わり、ＳＡＴＡに基づくシステムに関しては、最初の機能設定コマンド（Set Features Command）が受信されたときに、コントローラ１０６が、イニシエータをセットアップする。当業界において理解されるように、機能設定コマンドは、バーストレングスフィールド４２０４に必要とされるバースト長情報を含む。イニシエータがセットアップされた後、ＣＤＢのプロセスは図４６に示されるように進行する。しかし、理解されるように、ステップ４６０３への応答は常に「ｙｅｓ」であり、プロセスはステップ４６０８（これは不要ではあるが有害ではない）に進み、次に、ステップ４６０９へと進む。このことが、ＳＡＴＡ、ＳＡＳ及びファイバーチャネルに関する共通なコードベースの使用を可能とする。
【０６２３】
代替的実施形態では、わずかに異なるコードベースが、イニシエータを全く有しないＳＡＳシステムに関して使用される。この実施形態では、図４６のプロセスは、ステップ４６０２からステップ４６０９へとスキップされる。さらに別の実施形態では、使用されるプロトコルに基づいて変数が設定され、その変数がＳＡＴＡプロトコルを識別した場合には、プロセスが４６０２から４６０９へとスキップする。
【０６２４】
上述したように、ＣＤＢ受信時にＣＤＢ情報フリーリスト４１０２上で使用可能なＣＤＢ情報が１６以下の場合には、特別な処理ルーチンが起動される。これらが存在する場合には、２つの特別なケースがチェックされ、処理される必要がある。
【０６２５】
第１のケースでは、ＳＳＤコントローラ１０６が、ＣＤＢはリソース外にあることが報告された後に少なくとも１つのＣＤＢの処理が可能であることを保証するべく、ＳＣＳＩプロトコルによってＳＳＤコントローラ１０６が要求される。この能力は、概ね、ホストが、エラー状況についての情報を求めるリクエストセンスＣＤＢを発行することを可能とすることを企図するが、プロトコルは、このような状況で発行されるいずれのＣＤＢに対してもコントローラが正確に応答することを要求する。
【０６２６】
１６個のアクティブなイニシエータに対する同時的なサポートがＳＳＤコントローラ１０６において可能であることを顧客の要求が命ずる場合に、第２の特別なケースが存在する。これは、１６までの実行可能な各イニシエータに関して少なくとも１つのアクティブなＣＤＢを支持することが可能でなければならないことを意味する。
【０６２７】
この顧客の要求は、１６である現在アクティブなイニシエータよりも少ない場合には、アクティブとなり得る（１６までの）各追加のイニシエータに１つのＣＤＢ情報を割り当てるべく、ＳＳＤコントローラ１０６は、十分なＣＤＢ情報を保存して維持しなければならない。顧客によってはこの要求を行わないので、この機構は実施に依拠することにご留意願いたい。一実施形態では、この機構は、初期設定において設定される変数によって作動可能とされる。別の実施形態では、この機能を必要とするシステム及びそうでないシステムのために、わずかに異なるコードベースが用いられる。
【０６２８】
一実施形態では、これらの特別なケースの両者とも、図４７に示されるように処理される。これらのステップは、図４６のステップ４６０２の結果が「ｎｏ」の後に、受信ＨＥＭｉによって実行されることにご留意願いたい。
【０６２９】
ステップ４７０１において、空きＣＤＢ情報が有るか否かを決定するべくＣＤＢ情報フリーリスト４１０２が調べられる。
【０６３０】
空きＣＤＢ情報が存在しなければ（ステップ４７０１の結果が「ｎｏ」）、プロセスはステップ４７０２へ進み、このステップはキューフル・ルーチンを起動する。詳細は使用されるプロトコルに依拠するが、概略、これには、ホストへキューフル・メッセージを戻すステップが含まれる。
【０６３１】
空きＣＤＢ情報があれば（ステップ４７０１の結果が「ｙｅｓ」）、ステップ４７０３において、フリーリスト上に単一の空きＣＤＢ情報のみがあるのか否かを決定するべくフリーリスト４１０２が調べられる。
【０６３２】
フリーリスト上に１つのＣＤＢ情報しかなければ（ステップ４７０３の結果が「ｙｅｓ」）、ステップ４７０４において、リザーブ・フラグがチェックされる。このフラグは、初期設定で「０」にセットされ、また、ＣＤＢ情報がフリーリスト４１０２に加えられるときには常に「０」にセットされる。このリザーブ・フラグは、現在のＣＤＢが、フリーリスト上の最新のＣＤＢ情報を使用する資格があるかどうかを示す。上述したように、ＳＣＳＩプロトコルは、キューフルの後に受け取られた１つの追加のＣＤＢが戻されることを要求する。このことは、フリーリスト上に１つのＣＤＢ情報のみが残っている場合には、第１のＣＤＢはキューフル表示をトリガすることが必要であり、第２のＣＤＢにはＣＤＢ情報の使用が許されることを意味する。
【０６３３】
リザーブ・フラグが設定されていなければ（ステップ４７０４の結果が「ｎｏ」）、ステップ４７０５において、リザーブ・フラグがセットされる。次に、プロセスはステップ４７０２へと続き、このステップがキューフル・ルーチンを起動する。
【０６３４】
リザーブ・フラグが設定されていれば（ステップ４７０４の結果が「ｙｅｓ」）、ステップ４７０６において、プロセスは図４６のステップ４６０３に戻り、これに続いて、リザーブＣＤＢ情報がＣＤＢに割り当てられることとなる。
【０６３５】
フリーリスト４１０２上の空きＣＤＢ情報の数が１よりも多ければ（ステップ４７０３の結果が「ｎｏ」）、プロセスはステップ４７０７へと進み、そこで、当該イニシエータが既に少なくとも１つの現在のＣＤＢを有するか否かを決定するために、そのＣＤＢに関与するイニシエータのカウント・フィールド４２０３が評価される（カウント・フィールド≧１）。
【０６３６】
そのイニシエータがアクティブなＣＤＢを有していなければ（またはこれが新しいイニシエータであれば）（ステップ４７０７の結果が「ｎｏ」）、プロセスはステップ４７０６へと進み、そこから、図４６のステップ４６０３に至り、それに続いて、このイニシエータ用にＣＤＢ情報がポップされることとなる。そのイニシエータに少なくとも１つのアクティブなＣＤＢが可能とされることを当該システムが保証するからである。
【０６３７】
そのイニシエータが既にアクティブなＣＤＢを有有していれば（ステップ４７０７の結果が「ｙｅｓ」）、当該システムには、そのイニシエータに対してＣＤＢを保証することを要求されず、プロセスはステップ４７０８へと進み、少なくとも１の値を備えたカウント・フィールド４２０３を有するイニシエータテーブル４１０８内の入力数が、「Ｖａｒ１」との名称の変数にセットされる。この値は、その各々が少なくとも１つのアクティブなコマンドを有する現にアクティブなイニシエータの数を表す。
【０６３８】
ステップ４７０９において、Ｖａｒ１は、１６から減算され、その計算結果が、「Ｖａｒ２」との名称の変数にセットされる。これは、ＣＤＢ情報が保証されなければならない追加のイニシエータの数を表す。
【０６３９】
ステップ４７１０において、フリーリスト４１０２上の入力数がＶａｒ２と比較される。空きＣＤＢ情報の数が、Ｖａｒ２よりも少なくとも２大きければ（ステップ４７１０の結果が「ｙｅｓ」）、プロセスはステップ４７０６へと進み、そこから、図４６のステップ４６０３に至り、それに続いて、保証に適合する十分なＣＤＢ情報の使用が可能なので、ＣＤＢ情報がポップされる。
【０６４０】
空きＣＤＢ情報の数が、２未満でＶａｒ２よりも大きければ（ステップ４７１０の結果が「ｎｏ」）、ステップ４７０２において、システムはキューフルを報告する。Ｖａｒ２によって表されるイニシエータの数の以後のサービスを可能とするためには十分な数の空きＣＤＢ情報が維持されなければならず、加えるに、１つの追加のＣＤＢ情報が保存にとどまる必要があることから、これは、必要である。
【０６４１】
このように、図４７に示されるフローチャートは、上述した２つの特別なケースに関するチェックを行う。
【０６４２】
図４８は、ＣＤＢ情報に基づいてＩＯＰと転送要求がセットアップされる様式を図解するフローチャートを含む。
【０６４３】
ステップ４８０１で、ＲｄＷｒ ＨＥＭｉ（例えばＲｄＷｒ ＨＥＭｉ２１０１）は、そのワークリストにアクセスし、ＣＤＢ情報（例えばＣＤＢ情報２０１）にポインタをポップするためにクロスバー・スイッチ２２０１を使用する。
【０６４４】
ステップ４８０２え、ＲｄＷｒ ＨＥＭｉ２１０１は、ポインタに符合するＣＤＢ情報テーブル４１０９内の場所にアクセスするためにクロスバー・スイッチ２２０１を使用し、その場所でＣＤＢ情報２０１を発見する。ＲｄＷｒ ＨＥＭｉ２１０１は、ＣＤＢ情報２０１をそのｍＲＡＭ内にコピーする。
【０６４５】
ステップ４８０３で、ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰフリーリスト４１０３上に、いずれかのＩＯＰが存在するか否かを決定する。
【０６４６】
フリーリスト上にＩＯＰが存在しなければ（ステップ４８０３の結果が「ｎｏ」）、ステップ４８０４において、ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰが実行を終了するのを待ち、その後、フリーリスト上に空きＩＯＰが存在したならば直ちに、プロセスを再度開始する。
【０６４７】
フリーリスト上にＩＯＰが存在すれば（ステップ４８０３の結果が「ｙｅｓ」）、ステップ４８０５において、ＲｄＷｒ ＨＥＭｉ２１０１は、共有ＲＡＭにアクセスするのにクロスバー・スイッチ２２０１を使用し、ＩＯＰによって要求される転送要求の数を処理するべくトランスファリクエストフリーリスト４１０１上に十分な転送要求が存在するか否かを決定する。
【０６４８】
フリーリスト上にある転送要求が不十分であれば（ステップ４８０５の結果が「ｎｏ」）、ステップ４８０６において、ＲｄＷｒ ＨＥＭｉ２１０１は、転送要求が解消するのを待って、その後、ステップ４８０７に進む。
【０６４９】
フリーリスト上に転送要求が存在すれば（ステップ４８０５の結果が「ｙｅｓ」）、ステップ４８０７において、ＲｄＷｒ ＨＥＭｉ２１０１が、フリーリストでトップのＩＯＰポインタを取り出す。このポインタは、ＣＤＢ情報のＩＯＰフィールド３７０４内にコピーされる。
【０６５０】
ステップ４８０８で、ＲｄＷｒ ＨＥＭｉ２１０１は、フリーリスト上のトップのポインタによって指示されたＩＯＰ（例えばＩＯＰ２０２）を、ＩＯＰテーブル４１１０からそのｍＲＡＭ内にコピーする。この時点で、このＩＯＰ内に含まれる唯一の情報は、セルフポインタ３８０１である。
【０６５１】
ステップ４８０９で、ＲｄＷｒ ＨＥＭｉ２１０１は、ＣＤＢフィールド３７０２からの転送長値を、ＣＤＢ情報から「ＴＬｖａｒ」との名称の変数にコピーする。この変数は、説明されるアルゴリズムの残りの間中、現在の転送長をストアする。（理解されるように、このケース及び他のケースにおいて、この説明は性質上概念的であり、現実の実行では、この名称の変数を含むこともあり、含まないこともある。）
【０６５２】
ステップ４８１０で、ＲｄＷｒ ＨＥＭｉ２１０１は、ＣＤＢフィールド３７０２からのＬＢＡ値をＣＤＢ情報から「ＬＢＡｖａｒ」との名称の変数へとコピーする。その変数が、記述されたアルゴリズムの残りの間中そのＬＢＡで現在の転送が始まることになっているＬＢＡをストアする。
【０６５３】
ステップ４８１１では、ＲｄＷｒ ＨＥＭｉ２１０１は、以下のように、ＩＯＰ２０２にデータ投入する。
【０６５４】
呼び出しＨＥＭｉフィールド３８０２では、ＲｄＷｒ ＨＥＭｉ２１０１は、自分の識別子をセットする。
【０６５５】
ＣＤＢ情報フィールド３８０５では、ＲｄＷｒ ＨＥＭｉ２１０１は、そのワークリストから予め取り出されたＣＤＢ情報ポインタをセットする。
【０６５６】
イニシエータ・フィールド３８０４では、ＲｄＷｒ ＨＥＭｉ２１０１は、ＣＤＢ情報２０１のイニシエータ・フィールド３７０３から得られたイニシエータ・ポインタを置く。
【０６５７】
ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰの現在の状態を表示すように状態変数フィールド３８１０を設定する。
【０６５８】
ＲｄＷｒ ＨＥＭｉ２１０１は、アボート・フラグ３８１１を初期化する。
【０６５９】
Ｒｅｆタグ・フィールド３８１２とＡｐｐタグ・フィールド３８１３では、ＲｄＷｒ ＨＥＭｉ２１０１は、ＣＤＢ情報２０１のＲｅｆタグ・フィールド３７０８とＡｐｐタグ・フィールド３７０９の内容（コンテンツ）をコピーする。
【０６６０】
ステップ４８１２で、ＲｄＷｒ ＨＥＭｉ２１０１は、フリーリストでトップの転送要求ポインタを取り出す。
【０６６１】
ステップ４８１３で、ＲｄＷｒ ＨＥＭｉ２１０１は、フリーリスト上のトップのポインタによって指示された転送要求を、転送要求テーブル４１１１からそのｍＲＡＭ内へとコピーする。この時点では、転送要求内に含まれる唯一の情報は、セルフポインタ３９０１である。
【０６６２】
ステップ４８１４で、ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰの転送要求割り当てフィールド３８０７をインクリメントして新たな転送要求を反映させる。
【０６６３】
ステップ４８１５で、ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰの残存転送要求フィールド３８０８をインクリメントして新たな転送要求を反映させる。
【０６６４】
ステップ４８１６で、ＲｄＷｒ ＨＥＭｉ２１０１は、転送要求のセルフポインタ３９０１をＩＯＰトランスファリクエストポインタアレイ３８０９内にコピーする。
【０６６５】
ステップ４８１７において、ＲｄＷｒ ＨＥＭｉ２１０１は、ＬＢＡｖａｒからの値を転送要求のＬＢＡフィールド３９０３内にコピーする。これは、転送の開始のために転送要求によって使用される場所である。
【０６６６】
ステップ４８１８において、ＲｄＷｒ ＨＥＭｉ２１０１は、ＩＯＰ転送長からＴＬｖａｒを減算し、その解をポインタに加算して計算された値を備える転送要求のＤＲＡＭポインタフィールド３９０５を、そのＩＯＰ専用のＩＯＰデータバッファ３２０３内のスペースにデータ投入する。この結果は、ＩＯＰのＤＲＡＭ内の何処のスペースに転送要求に関するデータがストアされることになるのかを示す。この値は、直前の転送要求によって処理される転送のサイズに等しい量だけ、各後続の転送要求毎に大きくなる。
【０６６７】
ステップ４８１９において、ＲｄＷｒ ＨＥＭｉ２１０１は、以下のように特定の転送要求フィールドにデータ投入する。
【０６６８】
呼出しＩＯＰフィールド３９０２では、ＲｄＷｒ ＨＥＭｉ２１０１は、自身が取り出したＩＯＰへのポインタをＩＯＰフリーリスト４１０３に置く。
【０６６９】
ＬＢＡフィールド３９０３では、ＲｄＷｒ ＨＥＭｉ２１０１は、転送に関する始動ＬＢＡを示す現在ＬＢＡｖａｒ内にある値のコピーをセットする。
【０６７０】
アボート・フラグ３９０６がクリアされる。
【０６７１】
コマンドフィールド３９０７内に、必要な種類のコマンドをセットする。本例では、このコマンドは読出しである。
【０６７２】
Ｒｅｆタグ・フィールド３９０９及びＡｐｐタグ・フィールド３９１０に、ＩＯＰ２０２のフィールド３８１２と３８１３から得られた情報が投入される。
【０６７３】
ステップ４８２０で、ＲｄＷｒ ＨＥＭｉは、転送要求のＬＢＡ値を１５で除算し、その商を、「Ｉｎｄｅｘ」という名称の変数内にセットする。
【０６７４】
ステップ４８２１において、ＲｄＷｒ ＨＥＭｉは、フォワード・テーブル３２０１内の探索の実行のためにＩｎｄｅｘを使用する。この探索により、転送要求のＬＢＡフィールド内に識別されたＬＢＡを含むスーパーページに符合するロー（行）が得られる。このローからのポートフィールドが、「ＰｏｒｔＡ」との名称の変数内にセットされる。
【０６７５】
ステップ４８２２で、ＴＬＶａｒ内の値が、「ＴＬＴｅｍｐ」との名称の変数内にコピーされる。
【０６７６】
ステップ４８２３で、「Ｐａｇｅ」との名称の変数が、値１に初期化される。上述したように、各転送要求は、最大で３のスーパーページを処理可能であり、このスーパーページの各々は、１５のＬＢＡのブロックを処理することができる。この変数は、その転送要求に割り当てられたそのようなＬＢＡブロックの数のトラックを保持する。
【０６７７】
ステップ４８２４で、ステップ４８２０で実行された除算の余りが１５から減算され、その計算結果が、「Ｏｆｆｓｅｔ」との名称の変数内にセットされる。上述したように、各スーパーページは、１５のＬＢＡを含み、転送内の第１のＬＢＡは、スーパーページの中心にオフセットされる。また、上述したように、各転送要求は、各ページ要求が単一のスーパーページを処理することが可能な３つのページ要求を起動することができる。結果として、第１のＬＢＡがスーパーページ内にオフセットされた場合、転送要求によって発行されるページ要求の１つは、１５よりも少ない数のＬＢＡを処理することとなる。ステップ４８２４は、このケースを扱う。
【０６７８】
ステップ４８２５で、Ｏｆｆｓｅｔ内の値が、ＴＬＴｅｍｐ内の値と比較される。
【０６７９】
ＯｆｆｓｅｔがＴＬＴｅｍｐ以上であれば（ステップ４８２５の結果が「ｙｅｓ」）、これは、転送が、転送要求によって処理可能なＬＢＡの範囲内で完了することを意味する。
【０６８０】
ステップ４８２６において、ＴＬＴｅｍｐ内の値が、転送要求の転送長フィールド３９０４内に書き込まれる。
【０６８１】
ステップ４８２７において、ＰｏｒｔＡ変数内に識別されたポートに関与するフラッシュＨＥＭｉに関するワークリスト上に、転送要求をセットする。ＩＯＰに関して必要な全ての転送要求が割り当てられることとなるので、プロセスは、次に、終了する。
【０６８２】
ＴＬＴｅｍｐがＯｆｆｓｅｔよりも大きければ（ステップ４８２５の結果が「ｎｏ」）、ステップ４８２８において、ＴＬＴｅｍｐは、それが１５以下であるか否かを決定するために評価される。
【０６８３】
ＴＬＴｅｍｐが１５以下であれば（ステップ４８２８の結果が「ｙｅｓ」）、この転送要求により転送が完了することを意味しており、プロセスはステップ４８２６へと続き、これは上述したように進行する。
【０６８４】
ＴＬＴｅｍｐが１５よりも大きければ（ステップ４８２４の結果が「ｎｏ」）、ステップ４８２９において、ＯｆｆｓｅｔがＴＬＴｅｍｐから減算され、その計算結果が、ＴＬＴｅｍｐ内に戻ってストアされる。このステップは、現にセットアップされている転送要求に割り当てられるべきＬＢＡを示すべく、ＴＬＴｅｍｐを繰り返しデクリメントする。この値は、次に、転送要求の転送長フィールドを計算するのに使用される。
【０６８５】
ステップ４８３０で、変数Ｉｎｄｅｘ内の値は、インクリメントされる。
【０６８６】
ステップ４８３１で、フォワード・テーブルの探索は、新たなＩｎｄｅｘ値に基づいて実行される。理解されるように、このことは、先行する探索によって提供されたローの後にローを生じ、したがって、１５のＬＢＡの次のブロックを生ずる。その行からのポート値は、「ＰｏｒｔＢ」との名称の変数に書き込まれる。これは、ＬＢＡの次のブロックをストアするスーパーページを表す。
【０６８７】
ステップ４８３２において、ＰｏｒｔＡとＰｏｒｔＢが比較される。両者が等しければ（ステップ４８３２の結果が「ｙｅｓ」）、これは、１５のＬＢＡの次のブロックを含むスーパーページが、先行するスーパーページと同じフラッシュ・グループ内にストアされることを意味する。これは、理論上、現在の転送要求が、ＬＢＡの次のブロックを処理することができることを意味する。
【０６８８】
ステップ４８３３で、Ｐａｇｅ変数は、３と比較される。Ｐａｇｅ変数が３より小さければ（ステップ４８３３のの結果が「ｎｏ」）、これは、転送要求が、１５のＬＢＡの追加ブロックを処理可能であることを意味しており、したがって、プロセスは、転送要求ループを介して次の繰り返しをセットアップするように進行する。
【０６８９】
ステップ４８３４で、Ｐａｇｅ変数は、ＬＢＡの新たなブロックが次のループ内の転送要求に割り当てられるという事実を示すべく、インクリメントされる。
【０６９０】
ステップ４８３５で、Ｏｆｆｓｅｔ変数内に値１５が書き込まれる。次の２のスーパーページに関するＬＢＡの範囲は、１５の正倍数の位置で始まるので、第１のスーパーページの後のいずれのスーパーページに関してもオフセットを必要としない。これは、ステップ４８２５での計算を目的として、及び、ステップ４８２９でのＴＬＴｅｍｐのデクリメントを目的として、Ｏｆｆｓｅｔを１５にセットすることによって処理される。プロセスは、次に、ステップ４８２５にループし、そして、ＬＢＡの次のブロックへと進む。
【０６９１】
ＰｏｒｔＢ内の値がＰｏｒｔＡ内の値と異なる場合（ステップ４８３２の結果が「ｎｏ」）、これは、ＬＢＡの次のブロックが、転送要求に割り当てられた先行するブロックとは異なるポート上にあることを意味する。転送要求は、１つのフラッシュ・グループ内のＬＢＡ上の作動のみが可能なので、現在の転送要求は、この時点で終了しなければならない。Ｐａｇｅ変数が３に等しければ（ステップ４８３３の結果が「ｙｅｓ」）、これは転送要求に既に３のスーパーページ相当のＬＢＡが割り当てられていることを意味することから、転送要求は、同様に、また、終了しなければならない。
【０６９２】
いずれの場合も、プロセスはステップ４８３６へと進み、このステップで、ＴＬＴｅｍｐがＴＬＶａｒから減算され、この計算結果、すなわち、転送要求に割り当てられたＬＢＡの数を含む計算結果が、転送要求の転送長フィールド３９０４にストアされる。
【０６９３】
ステップ４８３７において、転送要求が、ＰｏｒｔＡ変数に識別されるポートに関連するフラッシュ・グループに割り当てられたフラッシュＨＥＭｉに関するワークリストに付加される。
【０６９４】
ステップ４８３８で、ＴＬＴｅｍｐの値がＴＬＶａｒにストアされる。これが、次の転送要求の生成での使用のためにＴＬＶａｒをセットアップする。
【０６９５】
ステップ４８３９で、ＬＢＡＶａｒがトランスファリクエスト転送長フィールド内の値に加算され、その計算結果がＬＢＡＶａｒに戻ってストアされる。これが、次の転送要求の生成での使用のためにＬＢＡＶａｒをセットアップする。
【０６９６】
ステップ４８４０で、ＲｄＷｒ ＨＥＭｉは、ＩＯＰ転送要求割り当てフィールド３８０７を、これが「７」に等しいか否かを調べるために分析する。
【０６９７】
７つの転送要求が既に割り当てられていれば（ステップ４８４０の結果が「ｙｅｓ」）、ＩＯＰはそれ以上のいずれの転送要求の割り当てもできない。上述したように、このケースは、ＩＯＰを完了させることと、その後の、先行するＩＯＰの実行の結果として修正された転送長値とＬＢＡによるＩＯＰの再発行とによって処理される。すなわち、ステップ４８４１において、ＩＯＰの第１の繰り返しが完了し、この時点で、プロセスはステップ４８１１へループし、ここで、ＩＯＰの次の実行のためにＩＯＰフィールドにデータ投入される。
【０６９８】
７よりも少ない数の転送要求が既に割り当てられていれば（ステップ４８４０の結果が「ｎｏ」）、プロセスは、ステップ４８１２へとループして戻り、次の転送要求を発行するプロセスが始まる。新たな転送要求は、直前の転送要求に基づいて調節された転送長値及びＬＢＡを得ることにご留意願いたい。
【０６９９】
図４９は、フラッシュＨＥＭｉ（例えばフラッシュＨＥＭｉ３０７）が、フラッシュＨＥＭｉのワークリスト上に存在する転送要求に基づいて、読出しまたは書込み動作に関するページ要求をセットアップする様式を図解する。
【０７００】
ステップ４９０１で、フラッシュＨＥＭｉ３０７は、ローカル転送要求テーブル２９０１が少なくとも１つの空きスロットを含むか否かを決定するべく、そのローカル転送要求フリーリスト２９０５をチェックする。
【０７０１】
ローカル転送要求テーブル２９０１が少なくとも１つの空きスロットを含まない場合（ステップ４９０１の結果が「ｎｏ」）、ステップ４９０２において、フラッシュＨＥＭｉ３０７は待機し、その後にステップ４９０１に戻る。このウェイト（待ち）は、特定の時間の間、または、他のタスクが実行を終了する時までである。
【０７０２】
空きローカル転送要求が使用可能となったら（ステップ４９０１の結果が「ｙｅｓ」）、ステップ４９０３において、フラッシュＨＥＭｉ３０７は、そのワークリストにアクセスし、且つ、そのワークリストから転送要求をポップするべく、クロスバー・スイッチ２２０１を使用する。
【０７０３】
ステップ４９０４で、フラッシュＨＥＭｉ３０７は、次の空きローカル転送要求へのポインタを、ローカル転送要求フリーリスト２９０５からポップする。
【０７０４】
ステップ４９０５で、フラッシュＨＥＭｉ３０７は、共有ＲＡＭブロック３１８内の転送要求テーブル４１１１にアクセスするべくクロスバー・スイッチ２２０１を使用し、ワークリストによって指示される転送要求を、テーブルから、ローカル転送要求フリーリスト２９０５から取り出されたポインタによって指示されるローカル転送要求テーブル２９０１からのスロット内にコピーする。
【０７０５】
ステップ４９０６で、転送要求のＬＢＡフィールド３９０３からの値は、ＬＢＡｖａｒとして知られた変数内にコピーされる。
【０７０６】
ステップ４９０７で、転送要求の転送長フィールド３９０４からの値は、ＴＬｖａｒとして知られた変数内にコピーされる。
【０７０７】
ステップ４９０８で、転送要求のデータパスＤＲＡＭポインタフィールド３９０５からの値は、ＤＰｖａｒとして知られた変数内にコピーされる。
【０７０８】
ステップ４９０９で、フラッシュＨＥＭｉは、そのページ要求フリーリスト２９１０からページ要求をポップする。フラッシュＨＥＭｉ３０７のｍＲＡＭは、フラッシュＨＥＭｉ３０７が一度に処理可能な６つのローカル転送要求によって要求可能な最大数である１８個のページ要求を含むので、空きページ要求が存在するか否かを決定するのにチェックの必要はないことにご留意願いたい。
【０７０９】
ステップ４９１０で、ＬＢＡｖａｒ内の値は１５によって除算される。
【０７１０】
ステップ４９１１で、ステップ４９１０からの計算結果は、フォワード・テーブル３２０１へのオフセットとして使用される。この探索は、フラッシュメモリ内のＬＢＡの場所に関するバンク、ブロック及びページのアドレス情報を提供する。フォワード・テーブルからのポート情報は、このフラッシュＨＥＭｉに転送要求を送信する図４８のフローチャート内に使用されているので、不要であることにご留意願いたい。このフラッシュＨＥＭｉは、単一ポートを制御するのみである。
【０７１１】
ステップ４９１２で、フォワード・テーブルの探索からのバンク、ブロック及びページのアドレス情報は、ページ要求のフラッシュ・リード・アドレスフィールド４００６内にストアされる。全ページよりも少ない書込みを行う書込み動作はリード・モディファイ・ライトが必要なので、このような書込みにはアドレス読出しが必要であることにご留意願いたい。全ページの書込みがされるべきことを示す１５の転送長を伴うページ要求の書込みの場合には、ステップ４９１０〜４９１３はスキップ（省略）される。
【０７１２】
ステップ４９１３で、ステップ４９１０からの余りが、ヘッド長フィールド４００８内にコピーされる。これは、もし有るならば、そこで転送が始まるスーパーページ内へのオフセットを表す。
【０７１３】
ステップ４９１４で、ＤＰｖａｒからの値は、データパスＤＲＡＭポインタフィールド４００４内にコピーされる。これは、そこからページ要求がデータを読出し、または、そこへデータ要求がデータを書込む、データパスＤＲＡＭ１０７内の場所を示す。
【０７１４】
ステップ４９１５で、転送要求に基づいて他のページ要求フィールドにデータ投入される、これらのフィールドは、図４０に関連して上述されている。これらのフィールドには以下のようにデータ投入される。
【０７１５】
呼出し転送要求フィールド４００２を、呼び出しローカル転送要求（ローカル転送要求フリーリスト２９０５から取り出された値）へのポインタで埋める。
【０７１６】
コマンドフィールド４００３を、転送要求のコマンド・フイールド３９０７に基づいて埋める。転送要求の書込みのケースでは、書込みがスーパーページの全１５個のＬＢＡ（転送長＝１５）をカバーする場合には、コマンドフィールドは、単純な書込みで埋められ、または、書込みが全スーパーページよりも小さな範囲をカバーする場合には、コマンドフィールドはリード・モディファイ・ライトで埋められる。
【０７１７】
コマンドフィールド４００３がトランザクションを書込みまたはリード・モディファイ・ライトとして識別した場合には、フラッシュ書込みアドレス・フィールド４００７は、書き込まれるべきスーパーページの物理的アドレスで埋めらる。スーパーページが識別される様式は、図５４に関連して記述される。
【０７１８】
ステップ４９１５で、状態変数フィールド４０１１が、また、初期化される。
【０７１９】
ステップ４９１６で、ＴＬｖａｒが、値「１５」と比較される。
【０７２０】
ＴＬｖａｒが１５以下であれば（ステップ４９１６の結果が「ｙｅｓ」）、現在のページ要求が、転送要求によって要求された最新のページ要求を表していることを意味する。
【０７２１】
ステップ４９１７で、テール長フィールド４００９が、１５−（ＴＬｖａｒ＋ヘッド長）に設定される。これは、スーパーページのエンドにＬＢＡを含まない部分的な転送を表す。テール長フィールドは、転送要求に関する最新のページ要求を除き、全てのページ要求に関して０に設定されることにご留意願いたい。
【０７２２】
ステップ４９１８で、転送長フィールド４０１０は、ＴＬｖａｒにセットされる。
【０７２３】
ステップ４９１９で、ページ要求へのポインタが、転送要求のページ要求ポインタ・アレイ３９１３上に置かれる。
【０７２４】
ステップ４９２０で、ページ要求ポインタアレイ３９１９からの各ポインタが、ステップ４９１１の探索で得られたバンクに符合するバンクキュー２９１１内のキュー（キュー）上にコピーされる。
【０７２５】
ステップ４９２１で、転送要求「終了」変数が、呼び出し転送要求に関する転送要求状態変数３９０８にセットされる。この変数は、転送要求が、ローカル転送要求キュー２９０４から取り出される次の時にチェックされ、クリーンアップ・ルーチンに対する必要性を示す。
【０７２６】
図４９に記述されたプロセスは、これで終了する。
【０７２７】
ＴＬｖａｒが１５よりも大きければ（ステップ４９１６の結果が「ｎｏ」）、これは、現ページ要求が、転送要求に関する最新のページ要求ではないことを意味する。ステップ４９２２で、テール長フィールド４００９は「０」に設定される。
【０７２８】
ステップ４９２３で、ページ要求の転送長フィールド４０１０は、１５から、ヘッド長フィールド４００８に設定された値を引いた値に設定される。これは、スーパーページの先頭部分で始まらない転送に関するスーパーページ内へのオフセットを表す。
【０７２９】
ステップ４９２４で、ページ要求へのポインタが、転送要求のページ要求ポインタ・アレイ３９１３上に設定される。
【０７３０】
ステップ４９２５で、ＴＬｖａｒから１５が引かれる。
【０７３１】
ステップ４９２６で、転送長フィールド４０１０からの値がＬＢＡｖａｒに加えられる。
【０７３２】
ステップ４９２７で、転送長フィールド４０１０からの値がＤＰＶａｒに加えられる。プロセスは、次に、新たなページ要求のため、ステップ４９０９へループして戻る。
【０７３３】
このループは、転送要求によって要求される最新のページ要求がバンク・キュー上に転送されるまで継続する。
【０７３４】
図５０は、フラッシュＨＥＭｉ実行ループを示す。このループは、転送要求とページ要求の実行を処理する。
【０７３５】
ステップ５００１で、フラッシュＨＥＭｉは、フラッシュ・ポートが空いている（すなわち、現在、フラッシュ・グループとの転送に使用されていない）か否かを決定するべくフラッシュ・ポートをチェックする。
【０７３６】
フラッシュ・ポートが空いていなければ（ステップ５００１の結果が「ｎｏ」）、ページ要求ハンドラは作動できない。ステップ５００２で、フラッシュＨＥＭｉは、ローカル転送要求キュー２９０４上にいずれかの転送要求が存在するか否かを決定するべくチェックする。
【０７３７】
キューがローカル転送要求を含むならば（ステップ５００２の結果が「ｙｅｓ」）、ステップ５００３において、フラッシュＨＥＭｉは、キューのトップ上のローカル転送要求を処理する。
【０７３８】
ステップ５００３に続いて、または、キューがローカル転送要求を含んでいなければ（ステップ５００２の結果が「ｎｏ」）、ステップ５００４において、フラッシュＨＥＭｉは、フラッシュＨＥＭｉのワークリスト（例えば、ワークリスト４１０７）上にいずれかの転送要求が在るか否かを調べるべくチェックする。
【０７３９】
ワークリストが転送要求へのポインタを含むならば（ステップ５００４の結果が「ｙｅｓ」）、ステップ５００５において、フラッシュＨＥＭｉは、ローカルトランスファリクエストフリーリスト２９０５が、いずれかの空きローカル転送要求を含んでいないか否かを調べるべくチェックする。
【０７４０】
ローカル転送要求が使用可能であれば（ステップ５００５の結果が「ｙｅｓ」）、ステップ５００６において、フラッシュＨＥＭｉは、ワークリストのトップ上の転送要求を処理し、これには、転送要求のフラッシュＨＥＭｉのｍＲＡＭ内へのコピー及びページ要求の生成が含まれる（図４９参照）。
【０７４１】
ステップ５００６に続いて、またはワークリスト上に転送要求が無ければ（ステップ５００４の結果が「ｎｏ」）、または空きローカル転送要求が無ければ（ステップ５００５の結果が「ｎｏ」）、ステップ５００７において、フラッシュＨＥＭｉは、スリープ・モードに入る必要があるか否かを決定するべくその現在の状態をチェックする。例えば、ステップ５００１、５００２及び５００４の結果が「ｎｏ」であることによりステップ５００７に至った場合には、フラッシュＨＥＭｉは、いずれのページ要求または転送要求にも作用することができず、したがって、スリープ・モードに入ることとなる。上記に説明したように、スリープ・モードに入ることにより、フラッシュＨＥＭｉは、電力を節約し、転送要求がワークリストに加えられた場合には、それ自身の迅速な反応を可能とする。
【０７４２】
別の実施形態では、フラッシュＨＥＭｉは、他のタスクが使用可能でない時には、スリープ・モードには入らず、代わりに、パトロール機能ハンドラを呼び出す。パトロール機能は、以下に記述するように、エラーに関してスーパーページをチェックし、必要ならば、そのエラーを訂正する。
【０７４３】
ステップ５００８で、フラッシュＨＥＭｉは、必要とされるスリープ期間を計算する。これは、現在の状態に基づき、いずれかの実行中のタスクが完了する前にフラッシュＨＥＭｉを起こすように設計される。すなわち、例えば、フラッシュ・ポートがフラッシュ転送へのステージバッファによって使用されている場合には、フラッシュＨＥＭｉは、残り部分の転送がどの程度の長さとなるかを決定すべくフラッシュ転送カウント・レジスタ２７１２をチェックし、転送が行われる前にスリープ・モードが終了するようにスリープ・モードの期間を設定する。上記に説明したように、スリープ・モードは、一続きの無演算命令を繰り返すことによって設定され、使用されるノーオペレーション命令の数は、必要とされるスリープ期間に基づいて決定される。
【０７４４】
ステップ５００９において、フラッシュＨＥＭｉは、スリープ・モードに入る。スリープ・モードから出る時、プロセスは、ステップ５００１に戻る。
【０７４５】
ステップ５００１のチェックが、フラッシュ・ポートが空いていることを示していれば（ステップ５００１の結果が「ｙｅｓ」）、ステップ５０１０において、フラッシュＨＥＭｉは、（ａ）バンク・キューのトップでページ要求によって必要とされ（ニード・バンク・フラグが設定されている）、且つ（ｂ）レディ状態（バンクＲのフラグが設定されている）のバンクが有るか否かを決定すべくバンク・ビットマップ２９２０をチェックする。
【０７４６】
フラッシュ・ポートが空いていることを示していなければ（ステップ５０１０の結果が「ｎｏ」）、プロセスは、いずれかの転送要求を処理する必要があるかどうかを決定するべくステップ５００２へ進む。
【０７４７】
必要かつレディ（needed and ready）状態であるバンクがあれば（ステップ５０１０の結果が「ｙｅｓ」）、ステップ５０１１において、現在のバンクが、両方の基準に合致する最も低いバンクに設定される。例えは、バンクビットマップ２９２０が、バンク０、２及び４の全てが両方のフラグのセットを有することを示す場合には、ステップ５０１１は、バンク０を選択することになる。
【０７４８】
ステップ５０１２で、ページ要求がいくつかのリソース（例えばＤＭＡチャネル）を必要とするか否かを決定すべく、選択されたバンクキューのトップにあるページ要求の状態変数フィールド（本例内のキュー０）がチェックされる。ページ要求がリソースを必要とする場合（ステップ５０１２の結果が「ｙｅｓ」）、ステップ５０１３において、フラッシュＨＥＭｉが、リソースが使用可能かどうかを決定する。その使用可能性はステップ５００１において確認されているので、フラッシュ・ポートに関するチェックは不要なことにご留意願いたい。
【０７４９】
必要なリソースが利用可能であれば（ステップ５０１３の結果が「ｙｅｓ」）、または、リソースが必要でなければ（ステップ５０１２の結果が「ｎｏ」）、プロセスは、５０１４に進み、この中で、選択されたバンクキューのトップにあるページ要求内のコマンドフィールドは、コマンドが、読出し、または、リード・モディファイ・ライト、または、消去であるか否かを決定するべくチェックされ、適切なページ要求ハンドラが呼び出され、実行される。
【０７５０】
ページ要求ハンドラが戻った後に、ステップ５０１５に達する。このステップにおいて、ハンドラがフラッシュ・ポートを使用したか否かを決定するべくハンドラの戻り値がチェックされる。
【０７５１】
ハンドラが、フラッシュ・ポートを使用した場合（ステップ５０１５の結果が「ｙｅｓ」）、フラッシュ・ポートは現在ビジーなので、それ以上のページ要求の実行はできず、フラッシュＨＥＭｉがスリープ・モードに入ることができるかどうかの決定のためプロセスがステップ５００７へと進む。
【０７５２】
ハンドラがフラッシュ・ポートを使用しなかった場合（ステップ５０１５の結果が「ｎｏ」）、または、ページ要求に関して使用可能なリソースが不十分であった場合（ステップ５０１３の結果が「ｎｏ」）、ステップ５０１６において、より大きい番号の付いたバンクが、必要かつレディ状態であるか否かを決定するべくフラッシュＨＥＭｉがバンクビットマップ２９２０をチェックする。バンク０、２及び４が必要かつレディ状態であり、そして、バンク０が処理される上記に示した例では、バンク２がバンク０よりも大きい番号が付いており、そして、必要かつレディ状態なので、ステップ５０１６の結果は「ｙｅｓ」となる。他方、ステップ５０１４がバンク４を処理した場合、バンク０と２が必要かつレディ状態に維持されていても、この状態で４よりも大きい番号の付いたバンクは存在しないので、この例でのステップ５０１５の結果は「ｎｏ」である。
【０７５３】
必要かつレディ状態であるようなより大きい番号の付いたバンクが存在する場合（ステップ５０１６の結果が「ｙｅｓ」）、ステップ５０１７において、現在のバンクが、当該より大きい番号の付いたバンクにセットされる。次に、プロセスは、ステップ５０１２へと戻り、ここで、ステップ５０１７において選択されたバンクに関し、リソースチェックが起動される。
【０７５４】
必要かつレディ状態であるようなより大きい番号の付いたバンクが無い場合（ステップ５０１６の結果が「ｎｏ」）、プロセスは、ワークリスト上のいずれかの転送要求を処理すべく、ステップ５００４に戻る。処理に対しレディ状態にあるページ要求が常に有るとしても、ページ要求ハンドラのループを周期的に遮断して規則的基準に基づく転送要求の処理を可能とすることを確保するべく、プロセスはループのトップ（ステップ５００１）には戻らないことにご留意願いたい。
【０７５５】
このループは、システムに電力供給される限り、際限なく継続する。
【０７５６】
ページ要求読出しハンドラについて図５１で図解する。このフローチャートは、ページ要求が読出しコマンドを含む場合のステップ５０１４で行われるステップを示す。
【０７５７】
ステップ５１０１で、ページ要求がどの状態にあるかを決定するべくページリクエスト状態変数フィールド４０１１がチェックされる。通常、ページ要求の読出しは、３の状態：コマンド、ニード・ステージバッファ及びフラッシュ転送終了（Flash Transfer Done）を経て進行する。各状態に続いて、ハンドラは、図５０に図解された実行ループのステップ５０１５へ戻る。ページ要求は、コマンド及びニード・ステージバッファ段階の後のバンクキューのトップ上に残り、このような戻りに続いて、フラッシュＨＥＭｉ実行ループは後でこの同一のページ要求に戻ることにご留意願いたい。
【０７５８】
コマンド状態がセットされた場合（ステップ５１０１の結果が「コマンド」）、ステップ５１０２において、フラッシュＨＥＭｉが、ページ要求がそこからポップされたバンクキューに関連するフラッシュバンクに関するＣＳ信号をアサートする（例えば、線７０３上のＣＳのアサート）。
【０７５９】
ステップ５１０３で、フラッシュＨＥＭｉは、ＣＬＥ信号８０３をアサートし、バス７０９上に読出しコマンドの第１の命令コードをセットする。フラッシュＨＥＭｉは、ページ要求のコマンド・フィールド４００３内の読出しコマンドの存在に基づいてその命令コードの使用を認識する。ＣＬＥ信号のアサートは、コマンドのラッチを可能とするべく、ＣＳ信号によって選択されたバンク内のフラッシュダイを必要とし、そして、バス７０９上で送られるビットは、コマンドとしてラッチされる。
【０７６０】
ステップ５１０４において、フラッシュＨＥＭｉは、ＡＬＥ信号８０２をアサートし、バス７０９上に読出しに関する物理的アドレスをセットする。フラッシュページに関するアドレスは、フラッシュ読出しアドレス４００６から得られる。転送が、ページの先頭ではなく、ページへのオフセットで始まる場合には、このオフセットは、ヘッド長フィールド４００８から得られ、アドレスの一部として送られる。このオフセットは、バス７０９への転送が始まるページバッファ内の場所をセットするのに使用される。転送長フィールド４０１０は、適正数のバイトが送られたときに転送を中止するのに使用されるので、ページのエンド（テール長）でオフセットを送信することは理由が無いことにご留意願いたい。
【０７６１】
適正なバンクに関するＣＳ信号がアサートされた状態に維持されるので、そのバンク上のフラッシュダイは、ＡＬＥ信号を受信する。この信号は、フラッシュダイが、そのアドレスラッチ内にバス７０９上のビットをラッチすることを生起する。上記に説明したように、全部で４のダイは、同一のアドレスを受信し、これは、各々のダイ内のデータ１ページのスタートアドレスである。上記に、また、説明したように、バンクの各ダイ内の同一アドレスにある４つのページは、１つのスーパーページを構成し、１つのスーパーページは、１５のセクタに相当し、これは、１５個の連続するＬＢＡに関連するコンテンツを構成する。
【０７６２】
ステップ５１０５で、フラッシュＨＥＭｉは、ＣＬＥ信号８０３をアサートし、読出しコマンドの第２の命令コードをバス７０９にセットする。ＣＬＥ信号のアサートは、その信号のコマンドのラッチを可能とするべく、ＣＳ信号によって選択されたバンク内のフラッシュダイを必要としており、バス７０９上で送られたビットは、コマンドとしてラッチされる。フラッシュダイが第２の読出し命令コードを受信したときに、フラッシュメモリの先行する説明で特定したアドレスからページバッファへの読込みを自動的に開始する。
【０７６３】
ステップ５１０６で、フラッシュＨＥＭｉは、ページ要求の状態変数フィールド４０１１を更新する。他の更新の間に、現在の状態は、ニード・ステージバッファにセットされる。
【０７６４】
ステップ５１０７において、コマンド状態に関して実行される一連のステップがフラッシュ・ポートを使用したので、戻り値は、ビジーではないフラッシュ・ポートにセットされる。しかし、この使用は非常に短く、そして、完全である。
【０７６５】
つぎに、ページ要求読出しハンドラは、図５０のステップ５０１５に戻る。
【０７６６】
ステップ５０１４の結果として、ハンドラがこのページ要求を呼び出す２回目では、ステップ５１０１でチェックされる状態は、ニード・ステージバッファである。
【０７６７】
ステップ５１０８において、ステージバッファが、空いているか否かを決定するべくチェックされる。ステージバッファが空いていなければ（ステップ５１０８の結果が「ｎｏ」）、ページ要求の読出しハンドラは、何の作動もすることなく、元に戻る。ステージバッファが空いていれば（ステップ５１０８の結果が「ｙｅｓ」）、ステップ５１０９において、ステージバッファがこのプロセスに割り当てられる。
【０７６８】
ステップ５１１０で、フラッシュＨＥＭｉは、フラッシュメモリ・ページ・バッファ（これは、フラッシュ読出しの結果としてフラッシュメモリから読込まれた値を含む）からステージバッファへＤＭＡ転送をセットアップする。
【０７６９】
ステップ５１１１において、フラッシュＨＥＭｉは、ページ要求の状態変数フィールド４０１１を更新する。他の更新の間、現在の状態が、フラッシュ転送終了にセットされる。これはＤＭＡ転送なので、このことが、フラッシュ転送がフラッシュＨＥＭｉとは無関係に発生する事実を示す。ハンドラが呼び出される次の回に、フラッシュ転送は完了する。
【０７７０】
ステップ５１１２で、フラッシュ・ページバッファとステージバッファの間のＤＭＡ転送は、ページ要求読出しハンドラが元に戻った後の或る期間にわたりフラッシュ・ポートを占有するので戻り値は、ビジーなフラッシュ・ポートにセットされる。
【０７７１】
次に、ページ要求読出しハンドラは、図５０のステップ５０１５に戻る。
【０７７２】
ステップ５０１４の結果として、このページ要求に関してハンドラが呼び出される第３回目では、ステップ５１０１においてチェックされる状態は、フラッシュ転送終了である。
【０７７３】
ステップ５１１３で、フラッシュＨＥＭｉは、ステージバッファへの転送の一部として自動的に実行されるＥＣＣチェックが読出しデータ内に何らかのエラーを識別したか否かを決定する。
【０７７４】
エラーが検知されたら（ステップ５１１３の結果が「ｙｅｓ」）、ステップ５１１４においてエラーハンドラが呼び出される。このハンドラが動作する様式は、検知されたエラーの性質と数に依拠する。検知されたエラーの数が、訂正するには余りに多い場合には、２回目の読込みがより良いデータを生ずることを期待して、エラーハンドラは、２回目のデータ読出しを生起する（１以上のフラッシュセルの状態が、有効データとエラーとの間の閾値に近い場合には、このことが可能である）。検知されたエラーの数の訂正が可能な数の場合、エラー・ハンドラは、ＥＣＣ訂正エンジン３１０１によって訂正されるべきデータを生起することができる（図３１に関する説明参照）。
【０７７５】
ステップ５１１５で、フラッシュＨＥＭｉは、ステージバッファ（これは、ニード・ステージバッファ状態のプロセスの結果として、フラッシュ・ページバッファから読込まれた値を含む）からデータパスＤＲＡＭ１０７へＤＭＡ転送をセットアップする。
【０７７６】
ステップ５１１６で、ページ要求読出しハンドラはウェイト（待ち）状態にある。ＤＲＡＭへのＤＭＡ転送は非常に速いので、読出しハンドラは、この時点では、元に戻らないが、一時的には引き延ばす。
【０７７７】
ステップ５１１７において、フラッシュＨＥＭｉは、転送カウント・レジスタ２７１６が、ＤＭＡ転送の完了を示す０の値を有するか否かをチェックする。これが０の値を有していない場合（ステップ５１１７の結果が「ｎｏ」）、ウエイト（待ち）ステップ５１１６が繰り返される。ＤＭＡ転送が終了すると（ステップ５１１７への結果「ｙｅｓ」）、ステップ５１１８において、ステージバッファが、他のオペレーションによる使用のために解放される。
【０７７８】
ステップ５１１９で、ページ要求が、バンク・キューから取り出される。これは、このページ要求のこれ以上の処理が不要なので行われ、バンク・キュー上の次のページ要求をこの時点で処理することができる。
【０７７９】
ステップ５１２０で、フラッシュＨＥＭｉは、転送要求の残存ページ要求フィールド３９１２をデクリメントしてページ要求が完了した事実を示す。
【０７８０】
ステップ５１２１において、フラッシュＨＥＭｉは、残存ページ要求フィールドが０に達したか否かの決定のためのチェックを行う。
【０７８１】
このフィールドが０に達していたならば（ステップ５１２１の結果が「ｙｅｓ」）、これは、転送要求に関する全てのページ要求が完了したことを意味する。ステップ５１２２において、転送要求はローカル転送要求キュー２９０４に付加され、したがって、フラッシュＨＥＭｉ実行ループによって処理されることとなる。この時点で転送要求はダン（完了）状態（図４９のステップ４９２１参照）を有しており、これが、ローカル転送要求キューから取り出されたならば直ちにクリーンアップ工程が起動される（以下を参照）。
【０７８２】
転送要求に関して追加のページ要求が残っている場合（ステップ５１２１の結果が「ｎｏ」）、または、ステップ５１２２が完了した時に、ステップ５１２３に達する。ステップ５１２３において、戻り値が、フラッシュ・ポート・ノット・ビジーに設定される。
【０７８３】
次に、ページ要求読出しハンドラは、図５０のステップ５０１５に戻る。
【０７８４】
図５２は、フラッシュ読出し動作の或る態様を詳細に図解する。
【０７８５】
ステップ５２０１で、フラッシュＨＥＭｉは、ＣＳ／ＲＢバス７０２内の線の１つをロウ（ｌｏｗ）に駆動する。この信号は、続いて反転され、選択されたフラッシュ・メモリバンクの４のフラッシュ・メモリチップのチップ・イネーブル・ピン上に、その信号がハイ（ｈｉｇｈ）として受信されることを生起する。
【０７８６】
ステップ５２０２において、フラッシュＨＥＭｉは、ＣＬＥ信号８０３をハイ・に駆動する。これは、選択されたバンク上のダイに、次の信号の組はコマンドより成ることを知らせる。
【０７８７】
ステップ５２０３で、フラッシュＨＥＭｉは、バス７０９上の読出しコマンドの第１相を構成する８ビットを送出する。フラッシュメモリデバイスでは慣用的であるが、読出しコマンドの第１相は、フラッシュダイに対して読出しアドレスの受信準備を指令する。コマンドの第１相は８ビットで構成され、４のコピーが、３２ビット・バス７０９上をパラレルに駆動される。例えば、第１の読出しコマンドが、命令コード０８の場合、バス７０９上の情報は、０８０８０８０８となり、コマンドの１のコピーが各ダイに分配される。ＣＬＥは、予め、ハイに駆動されており、且つ、選択されたバンク内の各ダイのＣＬＥピン上に受信されるので、バンク内の各ダイは、前記コマンドを、そのコマンドラッチ内にラッチする。
【０７８８】
ステップ５２０４で、フラッシュＨＥＭｉは、ＣＬＥをロウに、そして、ＡＬＥ信号８０２をハイにアサートする。これによって、フラッシュダイによるアドレス受信が準備される。
【０７８９】
ステップ５２０５で、フラッシュＨＥＭｉは、読出されるアドレスの１バイトを送出する。これは、バス７０９上にアドレス・バイトの４コピーを送出することによって行われる。これが、選択されたバンク上の各フラッシュダイのアドレスラッチ内への、バイトのラッチを生起する。
【０７９０】
ステップ５２０６で、フラッシュＨＥＭｉは、全てのアドレス・バイトが送られたかどうかを決定する。全てのアドレス・バイトが送られてない場合（ステップ５２０６の結果が「ｎｏ」）、プロセスは、次のアドレス・バイトを送信するべく、ステップ５２０５へ戻る。好適実施形態では、各アドレスは、５バイトで構成されており、したがって、このループは、４回繰り返される。
【０７９１】
好適実施形態では、フラッシュダイに関する完全なアドレスを提供するためには５つのアドレス・ストローブで十分である。しかしながら、典型的なフラッシュメモリチップは、そのチップが要求するアドレス・ビットを超えたアドレス・ストローブを無視する。この理由で、アドレス機構のいかなる再設計の必要もなく、フラッシュ・ダイをより小さく且つ安価なフラッシュ・メモリチップに置換することができる。なぜなら、比較的小さなフラッシュ・メモリチップは、より少ないアドレス・バイト（例えば、５バイトではなく４バイト）を必要とするが、これらのチップは、受信したいずれの不要なアドレス・バイトも無視し、したがって、これらは、アドレスのサイクル数の削減の必要なしにシステムに組み込むことができるからである。同様に、アドレスのサイクル数、したがってアドレス・バイト数の増加によって、小さなチップに関するいかなるアドレス関連再設計の必要なしに、任意の寸法のフラッシュメモリチップを処理するようにシステムの設計が可能である。
【０７９２】
全アドレスが送られたならば（ステップ５２０６の結果が「ｙｅｓ」）、プロセスは、ステップ５２０７を継続し、その中で、ＣＬＥはアサートされ、ＡＬＥは、アサート停止される。
【０７９３】
ステップ５２０８で、読出しコマンドの第２相は、Ａ／Ｄバス上に送られる。慣用的には、読出しコマンドの第２相は、フラッシュメモリチップがフラッシュダイからページバッファへの読出しを開始するように機能する。
【０７９４】
ステップ５２０９で、フラッシュダイは、各々、それらのＲｅａｄｙ／Ｂｕｓｙピンをビジーにセットする。上述したように、これらのピンは、各々、１つのＣＳ／ＲＢ線に接続され、これらは、さらに、ＳＳＤコントローラ１０６のピンに接続される。フラッシュメモリバンクがビジーであり、追加のコマンドの受信ができないことをフラッシュＨＥＭｉが認識することは、これによって生起される。ビジー信号がアサートされる様式は、図１１に関連して詳細に記述される。
【０７９５】
ステップ５２１０において、各フラッシュダイは、要求されたフラッシュメモリアドレスからのデータをダイの内部ページバッファ内へと取り込む。
【０７９６】
ステップ５２１１で、フラッシュバンクからのＲ／Ｂ信号は、「レディ（ｒｅａｄｙ）」状態へと変化する。これは、ダイからの全部で４のＲｅａｄｙ／Ｂｕｓｙピンが、「ビジー」状態から「レディ」状態へ変わったことを意味しており、要求されたデータが各チップのページバッファ内に存在しており且つバス７０９上での読出しが可能であることを示している。
【０７９７】
ステップ５２１２で、フラッシュＨＥＭｉは、ＲＥをアサートする。従来と同様に、これは、影響を受けたバンク上のダイのページバッファがバス７０９上の各単一バイトを読み出すことを生起する。これらの４バイトがダブルワードを構成する。このダブルワードは、ステージバッファへ転送される。
【０７９８】
ステップ５２１３で、フラッシュ転送カウント・レジスタ２７１２は、デクリメントされる。このレジスタは、転送されるべきダブルワードの数を保持する。読出しが１ページの一部分のみの転送の場合には、ページバッファ内に追加のデータが存在したとしても、フラッシュ転送カウント・レジスタは、適切な時点で、転送を停止する。その追加のデータは、ページバッファが使用される次回に上書きされる。
【０７９９】
ステップ５２１４において、フラッシュ転送カウント・レジスタは、それが０に達したか否かを決定するべくチェックされる。それが０でない場合（ステップ５２１４の結果が「ｎｏ」）、プロセスはステップ５２１２に戻り、次のダブルワードの退出時間を記録する。
【０８００】
フラッシュ転送カウントが０であれば（ステップ５２１４の結果が「ｙｅｓ」）、フラッシュからの転送は完了である。この時点で、データはステージバッファ内に存在する。上述したように、これは、次に、ステージバッファからデータバスＤＲＡＭへと転送され、ここから、ホスト・ポートを介してホストに至る。
【０８０１】
図５３は、図５０のステップ５０１４の一部としてのペーシ要求書込みハンドラの実行を図解する。当業者によって理解されるように、フラッシュ書込みは、新たなデータでフラッシュページに上書きすることはせず、その代わり、古いフラッシュページを新たなデータを有する新たなフラッシュページで置換して、古いページを無効にする。すなわち、書込みがページの一部分の変更のみである場合、リード・モディファイ・ライトとして知られた動作中に、ページの変更されていない部分が新たなページにコピーされなければならない。
【０８０２】
ページ要求書込みハンドラは、ステップ５３０１で起動し、これは、ページ要求状態変数４０１１をチェックする。リード・モディファイ・ライト動作の場合、状態は、コマンドにセットされた状態変数で開始する。
【０８０３】
コマンド状態の識別に続くプロセス（ステップ５３０２〜５３０７）は、読出しハンドラでのコマンド状態の識別に続くプロセス（図５１のステップ５１０２−５１０７）と同様であり、以下により詳細に記述する（理解されるように、実際のソフトウエアの実施形態においては、これら２つのステップのグループは、単一なソフトウエア・ルーチン内に結合可能である）。このプロセスは、ニード・ステージバッファ及びステージ１にセットされた状態変数によって終了する。この時点で、フラッシュは、書込みに従うＬＢＡを含むスーパーページを読み出すようにセットアップされる。書込みハンドラは終了し、制御は、フラッシュＨＥＭｉ実行ループ（図５０のステップ５０１５）へ戻る。
【０８０４】
ニード・ステージバッファ１状態のプロセス（ステップ５３０８〜５３１２）は、読出しハンドラ内のニード・ステージバッファ状態の識別に続くプロセス（図５１のステップ５１０８〜５１１２）と同様である。影響を受けたページの全体がフラッシュページバッファ内に存在するが、書込みで変更されないＬＢＡを含むセクタのみがステージバッファ内にコピーされることにご留意願いたい。このプロセスは、ニード・ステージバッファ２にセットされる状態変数によって終了する。書込みハンドラは終了し、制御は、フラッシュＨＥＭｉ実行ループ（図５０のステップ５０１５）に戻る。
【０８０５】
ステップ５３０１内のニード・ステージバッファ２状態の識別に続くプロセスは、ステップ５３１３で始まり、この中で、ＥＣＣロジック３１０２がフラッシュから読込んだデータの中にいずれかのＥＣＣエラーを検知したかどうかについての決定が行われる。
【０８０６】
エラーが検知された場合（ステップ５３１３の結果が「ｙｅｓ」）、ステップ５３１４において、エラーハンドラが呼び出される。ハンドラが作動する様式は、検知されたエラーの性質と数に依拠する。検知されたエラーの数が訂正するには余りに多すぎる場合には、２回目の読込みがより良好なデータを生ずるとの期待で、エラーハンドラが２回目のデータ読込みを生起する（１以上のフラッシュセルが有効データとエラーの間の閾値に近い場合には可能である）。検知されたエラーの数が訂正可能な数ならば、エラーハンドラは、ＥＣＣ訂正エンジン３１０１によるデータ訂正を生起することができる（図３１に関連する説明参照）。
【０８０７】
エラーが検知されなかった場合（ステップ５３１３の結果が「ｎｏ」）、ステップ５３１５において、ＤＲＡＭからステージバッファＤＭＡへの転送がセットアップされる。ＤＭＡ転送がフラッシュＨＥＭｉによってセットアップされると、ＨＥＭｉによるそれ以上のいかなる干渉もなく、自動的にプロセスが進行する。この転送は、書込み内で変えられたＬＢＡに符合するデータを含むのみであり、このデータは、フラッシュから受信したデータと併合され、したがって、このステップに続き、ステージバッファは、新たに書込まれたＬＢＡと上書きされていないスーパーページからのＬＢＡに関する古いデータを含む全スーパーページ（４ページ）のデータを保持することにご留意願いたい。
【０８０８】
ステップ５３１６及び５３１７は、図５１内のステップ５１１６及び５１１７と同一であり、詳細な記述は省略する。
【０８０９】
ステップ５３１８で、ＣＳ信号がセットされる。このステップは、図５１のステップ５１０２と同一である。
【０８１０】
ステップ５３１９で、ＣＬＥがセットされ、第１の書込み命令コードがフラッシュに送られる。このステップは、図５１内のステップ５１０３と同様に動作する。
【０８１１】
ステップ５３２０で、ＡＬＥがセットされ、書込みに関するアドレスがフラッシュに送られる。このステップは、図５１内のステップ５１０４と同一である。
【０８１２】
ステップ５３２１で、フラッシュＨＥＭｉは、ステージバッファからのＤＭＡ転送をフラッシュにセットアップする。次に、この転送は、フラッシュＨＥＭｉによるそれ以上の関与なしに、自動的に行われる。
【０８１３】
ステップ５３２２で、フラッシュＨＥＭｉは、次の状態がフラッシュトランスァダンであることを示すべく、ページ要求状態変数（ぺージ要求状態変数）を更新する。
【０８１４】
ステップ５３２３で、戻り値がフラッシュ・ポート・ビジーにセットされ、これに続いて、書込みハンドラが終了し、制御がフラッシュＨＥＭｉ実行ループ（図５０のステップ５０１５）に戻る。この時点で、データのスーパーページは、ステージバッファからフラッシュページバッファへと転送されつつあり、フラッシュは、フラッシュページバッファからフラッシュセルへの書込みのためセットアップされる。
【０８１５】
書込みハンドラが呼び出される次の回に、フラッシュ転送終了状態は、ステップ５３０１内で識別される。ステップ５３２４において、ＣＳがセットされる。これは、図５１のステップ５１０２と同一である。
【０８１６】
ステップ５３２５で、ＣＬＥがセットされ、第２の書込み命令コードがフラッシュに送られる。これが、フラッシュによるフラッシュページバッファからフラッシュメモリへの値の書込みを生起する。
【０８１７】
ステップ５３２６で、ステージバッファは、他のオペレーションによる使用のために解放される。
【０８１８】
ステップ５３２７で、フラッシュＨＥＭｉは、次の状態がページリクエウトダンであることを示すべくページ要求状態変数を更新する。
【０８１９】
ステップ５３２８で、戻り値は、フラッシュ・ポート・ノット・ビシーにセットされ、書込みハンドラが終了し、制御がフラッシュＨＥＭｉ実行ループ（図５０のステップ５０１５）に戻る。この時点で、データは、フラッシュ・ページバッファからフラッシュセルへと書き込まれつつある。
【０８２０】
ステップ５３０１におけるページリクエストダン状態の識別に続くプロセスが、ステップ５３２９で始まり、その中で、書込み上に何らかのエラーが検知されたか否かを決定すべくチェックが行われる。
【０８２１】
エラーが検知されたら（ステップ５３２９の結果が「ｙｅｓ」）、ステップ５３３０において、エラーハンドが呼び出される。このステップは、ステップ５３１４と同様に動作する。
【０８２２】
エラーが検知されなかったら（ステップ５３２９の結果が「ｎｏ」）、プロセスは、ステップ５３３１乃至５３３５を続ける。これは、図５１のステップ５１１９−５１２３と同一である。これに続いて、書込みハンドラは終了し、制御が、フラッシュＨＥＭｉ実行ループ（図５０のステップ５０１５）に戻る。
【０８２３】
図５３に示すプロセスは、リード・モディファイ・ライト動作を図解する。ペーシ要求の転送長が１５の場合、これは、書込みが全スーパーページを置換することを示しているが、オペレーションのリード・モディファイ部分は不要であり、そして、コマンド及びニード・ステージバッファ１のパスは使用されない。代わりに、ページ要求状態変数は、ニード・ステージバッファ２状態で始まる。
【０８２４】
上述したように、書込み動作の場合には、フラッシュＨＥＭｉには、ペーシ要求にスーバーページを割り当てることが要求される。図５４内のフローチャートは、このプロセスを図解する。
【０８２５】
ステップ５４０１で、フラッシュＨＥＭｉは、フォワード・テーブル３２０１内への探索のためのインデックスとして転送要求によってページ要求に割り当てられた第１のＬＢＡを使用し、ＬＢＡに関連したデータを現に保持するバンクを識別する。
【０８２６】
ステップ５４０２で、フラッシュＨＥＭｉは、バンク上にいずれかの使用可能なスーパーページが有るか否かを決定するべくスーパーページ・ポインタリスト２９１９をチェックする。リード・モディファイ・ライトに関するバンク選択が、同一バンク上のスーパーページを、元のデータを保持するスーパーページとして使用することを試みる。トランザクションの読出し側は、ステージバッファへの読出しのいかなる必要もなしに、フラッシュメモリからフラッシュページバッファへのデータの読出しによって処理可能なので、これは、性能を格段に向上する。次に、新たなデータと古いデータとは、ページバッファ内で併合される。この方法は、ステージバッファへの読出しを避けることによって、書込み動作の性能を高め、且つ、フラッシュインタフェースのタイアップをさけ、これにより、これを他のトランザクションのために空けておく。
【０８２７】
スーパーページがバンク上で使用可能であれば（ステップ５４０２の結果が「ｙｅｓ」）、プロセスは、ステップ５４０３に進み、この中で、スーパーページが不良として識別されたか否かを決定するべくスーパーブロック・メタデータ・テーブル３５０１において、スーパーペーシに符合する入力がチェックされる。
【０８２８】
スーパーページが不良であれば（ステップ５４０３の結果が「ｙｅｓ」）、プロセスはステップ５４０４に進み、この中で、不良スーパーページはスキップされる。次に、プロセスは、ステップ５４０２に戻る。
【０８２９】
スーパーページが不良でなければ（ステップ５４０３の結果が「ｎｏ」）、プロセスは、以下に記述したステップ５４１２に進む。
【０８３０】
バンク上に使用可能なスーパーページが無い場合（ステップ５４０２の結果が「ｎｏ」）、ステップ５４０５において、フラッシュＨＥＭｉが、バンクをインクリメントし、これにより、次のバンクへと移動し、必要ならば、バンク０に転換する。
【０８３１】
ステップ５４０６で、フラッシュＨＥＭｉは、それが、フラッシュ・グループ内の全てのバンクをチェックしたかどうか（すなわち、カレント・バンクがチェックされた第１のバンクと同一かどうか）を決定する。全てのバンクをチェックしていない場合（ステップ５４０６の結果が「ｎｏ」）、スーパーページが次のバンク上で使用可能かどうかを決定すべくフラッシュＨＥＭｉがステップ５４０２に戻る。ステップ５４０５内のインクリメントの結果として、各回で新たなバンクを介してチェックされることにご留意願いたい。
【０８３２】
全てのバンクがチェックされ、スーパーページが利用可能でなければ（ステップ５４０６の結果が「ｙｅｓ」）、現在オープンしているスーパーブロックはフル状態であり、クローズされなければならず、新しいスーパーブロックがオープンされなければならない。ステップ５４０７で、フラッシュＨＥＭｉは、現在オープンしているスーパーブロックに関するスーパーブロック・メタデータ・テーブル３５０１をデータパスＤＲＡＭ１０７から開いているスーパーブロックのブロック０のスーパーページ０にコピーする。これは、データを移動させる内部転送要求を発行することによって達成される。コピー動作の前に、テーブルのククローズド・フラグ３５０９がセットされる。
【０８３３】
ステップ５４０８で、フラッシュＨＥＭｉは、次のスーパーブロックをスーパープロック・フリーリスト２９１２からポップし、そのスーパーブロックの識別子をオープン・スーパーブロック・ポインタ２９１４内にコピーする。
【０８３４】
ステップ５４０９で、フラッシュＨＥＭｉは、現在の時刻を、新たにオープンされたスーパーブロックに符合するリバース・テーブル（例えばリバース・テーブル３２０５）内のタイムスタンプ・フィールド内に書き込む。
【０８３５】
ステップ５４１０において、フラッシュＨＥＭｉは、新たにオープンされたスーパーブロックのブロック０のスーパーページ０から、データパスＤＲＡＭ１０７のスーパーブロック・メタデータ・テーブル３５０１内へ、スーパーブロック・メタデータ・テーブルをコピーする。この時点では、テーブルは、不良及び消去カウント（回数）情報、並びに、セットされているオープン・フラグ３５０８を除き、空白である。
【０８３６】
ステップ５４１１で、フラッシュＨＥＭｉは、スーパーページ・ポインタ・リスト２９１９を初期化する。スーパーブロック・メタデータ・テーブルがスーパーページ０を占めるので、バンク０に関するポインタは、スーパーページ１にセットされる。他の全てのポインタは、スーパーページ０にセットされる。次に、プロセスは、スーパーページのページ要求への割り当てのためにステップ５４０２に戻る。
【０８３７】
バンク上に使用可能な不良でないスーパーページがあれば（ステップ５４０３の結果が「ｎｏ」）、ステップ５４１２に達する。ステップ５４１２で、フラッシュＨＥＭｉは、次のスーパーページをページ要求へのポインタリスト上に割り当て、現バンクからの入力を選択する。フラッシュＨＥＭｉは、スーパーページのアドレスを、ページ要求のフラッシュ書き込みアドレス・フィールド４００７内に書き込む。フラッシュ・アドレスは、ポート、バンク、ブロック及びページによって特徴付けられるので、全アドレスの使用が可能であることにご留意願いたい。フラッシュＨＥＭｉは、単一ポート上で作動するのみであり、また、バンク、ブロック及びページ情報は、どのスーパーページリストが使用されたかを識別するのに使用されたバンク、スーパーページ番号、スーパーブロック識別子の組合せに基づいて使用可能であることから、ポート情報は必要ではない。
【０８３８】
ステップ５４１３で、フラッシュＨＥＭｉは、関連するバンクに関するポインタをインクリメントすることによって、ステップ５４１２内で割り当てられたスーパーページを示すべくスーパーページ・ポインタ・リストを更新する。
【０８３９】
この動作の進行はここで終了する。
【０８４０】
完了したトランザクションのクリーンアップが、図５５に記述されている。このフローチャートに記述されているプロセスは、図５０のステップ５００３の一部として実行される。この時点で、転送要求に関する最新のページ要求が完了したと決定しているページ要求ハンドラの結果として、ホストが開始する読出しまたは書込みコマンドの一部として呼び出された転送要求は、ローカル転送要求キューの上に存在する（例えば、図５１のステップ５１２２）。
【０８４１】
ステップ５５０１で、転送要求は、ローカル転送要求キューから取り出される。ステップ５５０１乃至５５０４は、フラッシュＨＥＭｉ上で動作する転送要求ハンドラによって実行される。
【０８４２】
ステップ５５０２で、転送要求の状態変数フィールド３９０８が、チェックされる。通常、キュー上の転送要求は、終了を有することとなるが（例えば、図４９のステップ４９１１参照）、ガベージ・コレクション・ルーチンの一部として起動された転送要求は主要な例外である。この場合、転送要求は、完了した読出しまたは書込みコマンドの結果であるので、終了状態を有する。
【０８４３】
ステップ５５０３で、ページ要求ポインタ・アレイ３９１３内に識別されたページ要求は、ページ要求フリーリスト２９１０上にセットされる。これらのページ要求は、この時点で、他の転送要求によって使用されることが可能である。
【０８４４】
ステップ５５０４で、内部転送要求が、ローカル転送要求フリーリスト２９０５上にセットされる。この内部転送要求は、この時点で、フラッシュＨＥＭｉの外部ワークリスト上の転送要求への割り当てが自由である。転送要求ハンドラは、フラッシュＨＥＭｉ上で動作するＩＯＰハンドラを呼び出し、そして、終了する。
【０８４５】
ステップ５５０５で、フラッシュＨＥＭｉ上で動作するＩＯＰハンドラは、転送要求の呼出しＩＯＰフィールド３９０２内に識別されたＩＯＰの残存転送要求フィールド３８０８をデクリメントする。この時点で、ＩＯＰはいずれのＨＥＭｉのワークリスト上にも存在せず、したがって、それはフラッシュＨＥＭｉのワークリスト上には存在しないけれども、フラッシュＨＥＭｉはそれにアクセス可能とされていることにご留意願いたい。
【０８４６】
ステップ５５０６で、フラッシュＨＥＭｉは、残存転送要求フィールドが、ＩＯＰがアクティブな転送要求を有していないことを示す０に達したかどうかを決定する。
【０８４７】
その値が０よりも大きければ（ステップ５５０６の結果が「ｎｏ」）、転送要求ハンドラは終了する。ＩＯＰは未だ終了していないので、クリーンアップは不要である。
【０８４８】
その値が０ならば（ステップ５５０６の結果が「ｙｅｓ」）、ステップ５５０７において、ＩＯＰが、ＩＯＰのホスト・ポートフィールド３８０３内に識別されたポートに関連する送信ＨＥＭｉに関するワークリスト上にセットされる。次に、フラッシュＨＥＭｉ上で動作していたＩＯＰハンドラは終了する。
【０８４９】
ステップ５５０８で、ＩＯＰコマンドフィールド３８０６が、ＩＯＰが読出しまたは書込みコマンドに関係するのかどうかを決定すべく評価される。このステップ及び後続の全てのステップは、送信ＨＥＭｉ上で動作するＩＯＰハンドラによって実行される。
【０８５０】
コマンドが読み出しコマンドであれば（ステップ５５０８の結果が「ｙｅｓ」）、ステップ５５０９において、送信ＨＥＭｉは、データ及びデータをホストに搬送するのに必要な他のフレームをセットアップし、これらのフレームをホストに送信する。
【０８５１】
ステップ５５０９に続いて、または、コマンドが、読出しではなく書込みであれば（ステップ５５０８の結果が「ｎｏ」）、ステップ５５１０において、送信ＨＥＭｉは、コマンドが完了したことを示す状態フレームをホストに送信する。
【０８５２】
ステップ５５１１で、送信ＨＥＭｉは、（ａ）ＩＯＰ ＣＤＢ情報フィールド３８０５内に識別されたＣＤＢ情報をＣＤＢ情報フリーリスト４１０２上に置き、（ｂ）ＩＯＰをＩＯＰフリーリスト４１０３上に置き、（ｃ）ＩＯＰ転送要求ポインタ・アレイ３８０９内に識別された転送要求を転送要求フリーリスト４１０４上にセットする。
【０８５３】
ステップ５５１２で、送信ＨＥＭｉは、ＣＤＢ情報とＩＯＰの終わりを示すべく各種の他のデータ構造をクリーンアップする。例えば、送信ＨＥＭｉは、ＩＯＰのイニシエータ・フィールド３８０４内に識別されたイニシエータに関するイニシエータ情報エントリ内のカウント・フィールド４２０３をデクリメントする。
【０８５４】
クリーンアップ・プロセスはここで終了する。
【０８５５】
Ｃ．ガベージ・コレクション
【０８５６】
ガベージ・コレクションは、フラッシュメモリ空間を新しい書き込みのために使えるようにするプロセスである。各ポートに関連するフラッシュＨＥＭｉが、そのポートに関連するフラッシュ・グループに関してガベージ・コレクションが必要か否かを決定して、必要ならばガベージ・コレクションを実行するように、ガベージ・コレクションは、フラッシュ・ポート毎に行われる。
【０８５７】
各フラッシュ・グループは、多数のスーパーブロックを含み、それらは、以下の３の状態の１つになっている、すなわち、（１）オープン（現在書き込みオープンである１つのスーパーブロック）、（２）クローズド（データが書き込み済みであるがもはや書き込みオープンではない複数のスーパーブロック）、（３）空き（既に消去され、今後の書き込みのために利用可能であるような、スーパーブロック・フリーリスト２９１２上の複数のスーパーブロック）。クローズされているスーパーブロックは、通常、有効なスーパーページ（現在有効なデータを有するセクタを含む）と無効なスーパーページ（その後にどこか別の場所に書き込まれたのでもはや有効ではないＬＢＡに対応するセクタを含む）の組合せを含む。図３４に関連して説明されたように、無効なスーパーページは、リバース・テーブル内で、フラッシュ・グループ向けに設計されている。
【０８５８】
動作するために、各フラッシュ・グループは、空きスーパーブロックを必要とする。というもの、オープンしているスーパーブロックに含まれる書込みの余地が不十分（すなわち、スーパーページ・ポインタ・リスト２９１９上に示される空きスーパーページがない）ならば、スーパーブロックはクローズされなければならず、スーパーブロック・フリーリストからのスーパーブロックがオープンされなければならず、新しいデータは新たにオープンされたスーパーブロックに書き込まれなければならない。ガベージ・コレクションは、スーパーブロックを今後の書き込みのために使えるようにするようにデータを統合するプロセスである。
【０８５９】
図２９に戻ると、好適実施形態では、スーパーブロック・フリーリスト２９１２からスーパーブロックが割り当てられるたびに、関連フラッシュＨＥＭｉのｍＲＡＭ内のスーパーブロック・フリーリスト・カウンタ２９１３がデクリメントされる。このカウンタは、スーパーブロック・フリーリスト２９１２上に現在あるスーパーブロックの数を含む。
【０８６０】
カウンタ２９１３のデクリメントに続いて、カウンタ内に現在保持されている値が、フラッシュＨＥＭｉのｍＲＡＭのガベージ・コレクション閾値セクション２９１５内に維持されている２つの値、すなわちクリティカルな閾値及び非クリティカルな閾値と比較される。好適実施形態では、これらの値は初期化時にそれぞれデフォルト値「２」及び「６」に設定されるが、後述するように、他の値を用いることもできる。さらに、これらの値はプログラム可能であり、従ってユーザによって変更可能である。
【０８６１】
カウンタ値（ひいてはスーパーブロック・フリーリスト上のスーパーブロックの数）がクリティカルな閾値またはそれ以下であれば、クリティカル・フラグが設定され、フラッシュＨＥＭｉはクリティカルなガベージ・コレクション・モードにシフトし、ガベージ・コレクション動作が、ホスト読み出し及び書き込みを含む全ての動作より優先する。これは、カウンタ値（及びスーパーブロック・フリーリスト上のスーパーブロックの数）がクリティカルな閾値を超え、クリティカル・フラグがリセットされるまで続く。
【０８６２】
カウンタ値がクリティカルな閾値を上回っているが非クリティカルな閾値またはそれ以下であれば、フラッシュＨＥＭｉは非クリティカルなガベージ・コレクション・モードにシフトし、ガベージ・コレクション動作が開始されるが、ホストが開始する読み出し及び書き込みが全て処理されて初めてガベージ・コレクション動作が開始される。利用可能な空き空間の量が非クリティカルな閾値を上回っていれば、ガベージ・コレクションは生じない。
【０８６３】
好適実施形態では、クリティカルな閾値は２に設定されるが、その理由は、入力される書込みが確実に収容されることができるようにするために常に少なくとも１つの空きスーパーブロックが必要であり、クリティカル・フラグが設定される前にローカル転送要求キュー２９０４上にあった転送要求が追加スーパーブロックを使い切る可能性を防止するために追加スーパーブロックが必要とされるからである。クリティカル・モード中であっても、既にローカル転送要求キュー上にある転送要求は、全ての他の新しい転送要求と同様にローカル転送要求キュー２９０４のボトムに加えられるガベージ・コレクション転送要求の前にフラッシュＨＥＭｉによって処理されることになることに留意されたい。
【０８６４】
好適実施形態では、非クリティカルな閾値は「６」に設定されるが、これは、ガベージ・コレクションの頻度の低下（より少ない数が要求される）と一連のホストが開始する書き込みがクリティカル・モードのガベージ・コレクションの必要性によって中断される可能性の最小化（より多い数が要求される）間の妥協を表している。代替実施形態では、この数は幾分多いかまたは少ないかのいずれかに設定されることができる。より少ない数はガベージ・コレクションの頻度を低下させる傾向があり、従ってガベージ・コレクションが行われる前にスーパーブロックがクローズされたままである時間が増加することになることに留意されたい。スーパーブロックに含まれる有効データの量は時間と共に減少する傾向があるので（スーパーブロックの有効なスーパーページに新しい書き込みがなされ、無効化されるため）、ガベージ・コレクションは、より古くて陳腐化したスーパーブロックに対してより効率的であり、その理由は、そのようなスーパーブロックには、オープンしているスーパーブロックにコピーされなければならない有効な情報がより少ないためである。それゆえ、非クリティカルな閾値をより小さい値に設定することは、ガベージ・コレクションが行われる前に所与のスーパーブロックがクローズされている時間を増加させることによってガベージ・コレクション動作の効率を高める傾向がある。しかし、この場合もやはり、これは１つの妥協案であり、その理由は、数が小さければ小さいほど、システム性能を低下させることになるクリティカルな閾値に到達する可能性が高く、クリティカル・モードのガベージ・コレクションは通常の読み出し及び書き込みより優先するためである。
【０８６５】
ガベージ・コレクションのプロセスが、図５６に示すフローチャート内に図解される。
【０８６６】
ガベージ・コレクションは、消去のためのスーパーブロックの選択を必要とする。このことは、ステップ５６０１内に示される。これは、選択されたスーパーブロック内の有効なスーパーペーシからのデータが現在オープンしているスーパーブロックに書き込まれることを必要とするので、有効データ最小量を有するスーパーブロックを選択することは有意義である。すなわち、ガベージ・コレクションが開始したとき、関連するフラッシュＨＥＭｉは、フラッシュ・グループに関するリバース・テーブル内の各スーパーブロックに関するカウント・フィールドを、つい最近スーパーブロック・フリーリストに加えられたスーパーブロックの後ろのスーパーブロックから始めて、各スーパーブロックを通して番号順に進めて、スーパーブロック０を介して最低値に戻り、チェックする（例えば、ガベージ・コレクションの結果としてフリーリストに加えられた最新のスーパーブロックが１７の場合、次のガベージ・コレクション内でチェックされる第１のスーパーブロック・カウント・フィールドは１８である）。
【０８６７】
フラッシュＨＥＭｉは、無効なスーパーページの最大数を示す最高カウント・フィールド値を備えたスーパーブロックを選択する。好適実施形態において、１より多い数のスーパーブロックが最高カウント・フィールドとタイであれば、該当するそのようなスーパーブロックの第１のものが、ガベージ・コレクションに関して選択される。代替的実施形態において、タイは、タイになっている各スーパーブロックに関するスーパーブロック・メタデータ・テーブル（またはリバース・テーブル）内の消去カウント・フィールドを、選択された最低消去カウントを有するスーパーブロックでチェックすることによって壊すことができる。この代替例は、有る程度の磨耗の均等化を提供する利点がある。当業者が理解されるように、消去オペレーションは、フラッシュメモリに磨耗を生ずる傾向があり、そのため、多数の消去のあるブロックは、多数の欠陥を有する傾向がある。この種類の磨耗の均等化は、各ガベージ・コレクションの前に追加的なオペレーションを課す不都合はあるが、ブロックにわたって欠陥数を均等にする傾向がある。
【０８６８】
ガベージ・コレクションに関してスーパーブロックが選択されると、ステップ５６０２で、関連するフラッシュＨＥＭｉが、そのスーパーブロック内の有効な各スーパーページから現在オープンしているスーパーブロック内へとデータを移動させるのに十分な一連の内部転送要求が生成される。
【０８６９】
内部転送要求は、特定のフラッシュＨＥＭｉ群によって且つこれに特有に発行される。これらは、内部転送要求は、発行フラッシュＨＥＭｉのｍＲＡＭ内に保持されるのみで且つ共有ＲＡＭには決してストアされずまたは他のいずれかのＨＥＭｉによって動作させられる点で、通常の転送要求とは異なる。内部転送要求は、ＩＯＰの結果としての起動はされないので、各内部転送要求の呼出しＩＯＰフィールド３９０２は、空のまま残される。
【０８７０】
上述したように、各転送要求は、３のページ要求を発行することができ、各ページ要求は、１のスーパーページのデータの転送を生起することができる。すなわち、移動データ発行にフラッシュＨＥＭｉに要求される内部転送要求の数は、スーパーブロック内の有効なスーパーページを３で割って、端数を切り上げた数に等しい。
【０８７１】
好適実施形態において、フラッシュ・グループ毎に８つのブロックであると仮定すると、各スーパーブロックは、５１２個のスーパーページ（ブロック毎に６４個のスーパーページ×８）を含み、したがって、理論的には、ガベージ・コレクションは、１７１の転送要求の発行を要求する（しかし、理解されるように、スーパーブロック内のすべてのスーパーページが有効ならば、スーパーブロック上でガベージ・コレクションを実行するのに機能する点は無い）。しかしながら、実際、ガベージ・コレクションに関して選択されたスーパーブロックは、比較的少ない有効なスーパーページを有する傾向があるので、１７１よりも相当に少ない転送要求が必要とされる。
【０８７２】
ステップ５６０３で、ステップ５６０２でセットアップされた転送要求の結果として発行されたページ要求が実行される。理解されるように、古いスーパーブロックからオープンしているスーパーブロックへ有効なスーパーページを移動させるのに必要な転送要求の数は６より大きくなる可能性があり、これが、フラッシュＨＥＭｉによって同時に処理可能な転送要求の数なので、ステップ５６０２及び５６０３は、多分、オーバーラップする。すなわち、いくつかの数の転送要求が割り当てられ、次に、これらの転送要求に関してページ要求が実行され、各転送要求が完了するのに伴い、ローカル転送要求テーブル２９０１内のそのスロットが開き、これにより、フラッシュＨＥＭｉが新たな転送要求を発行するのを可能とする。
【０８７３】
有効なスーパーページから現在オープンしているスーパーブロック内ヘデータをコピーするオペレーションは、外部データ無しであることを除き、通常の書込み動作と同様である。スーパーページ・ポインタ・リスト２９１９の記述に関連して上記に説明したように、書込みは、書込みによって無効とされるべきスーパーページのように、同一バンク上のスーパーページに優先的に行われる。これは、必要な転送の数を最小にする。なぜなら、フラッシュバンク内の一の場所から同一バンクの他の場所への書込みは、データのフラッシュ・ステージバッファへの移動を必要とはしないが、書込みは、データのフラッシュメモリからフラッシュ・ページバッファへの書込みとその後のフラッシュページバッファからフラッシュメモリへと戻る書込みによって達成可能だからである。これは、データのステージバッファへの転送に必要な移動よりも格段に速く、ステージバッファとフラッシュ・グループを接続するバスにタイアップしない。
【０８７４】
ガベージ・コレクション書込みは、スーパーページ・ポインタ・リスト２９１９を使用して、同一バンクに対して優先する。１のページリクエストは、フラッシュメモリからの読出しとフラッシュメモリへの書込みの両方を処理することができ、したがって、単一の転送要求は３の有効なスーパーページを処理することができる。通常の書込みでのように、有効なスーパーページから新たな場所内にデータがコピーされる各回に、それらのＬＢＡに符合するフォワード・テーブル３２０１内の入力が更新される。
【０８７５】
データを古いスーパーブロックからオープンしているスーパーブロック内へと移動する転送要求に続いて、ステップ５６０４において、全部で７つのページ要求を含む、３の転送要求が発行される（前２つの転送要求内に３のページ要求、そして３番目の転送要求内に１のページ要求）。これらのページ要求の各々は、単一ブロックのためのフラッシュ消去コマンドを実行する。上述したように、各スーパーブロックは、ポートの８つのバンクの各々内の同一ブロックを構成する。すなわち、各ページ要求は、異なるチップ選択で同一のブロックを消去する。当業者が理解されるように、フラッシュ消去コマンドは、消去されたブロック内に書き込まれるための一連の「１」を生起する。これらの７つのページ要求は、スーパーブロックのブロック１〜７を消去する。
【０８７６】
ガベージ・コレクション動作に関する最新の転送要求は、３つのページ要求を含む。ステップ５６０５において、これらのページ要求の最初のものが、スーパーブロックのスーパーページ０、バンク０（図３５参照）内にストアされたスーパーブロック・メタデータ・テーブルからの欠陥列及び消去カウントをフラッシュ・ステージバッファ内にコピーする。これは、スーパーブロックのバンク０内に属し、ステップ５６０４において消去されない。
【０８７７】
ステップ５６０６で、フラッシュＨＥＭｉは、スーパーブロック・メタデータ・テーブル内の消去カウント・フィールド３５０７をインクリメントし、スーパーブロックがこの時点で追加の時間に関して消去されている事実を示す。
【０８７８】
ステップ５６０７で、フラッシュＨＥＭｉは、データパスＤＲＡＭ１０７内のフラッシュ・グループに関するリバース・テーブルにアクセスし、スーパーブロックからの全てのスーパーページを有効と印を付け、スーパーブロックに関するカウント・フィールドを０にセットする。
【０８７９】
ステップ５６０８で、最新の転送要求からの第２のページ要求が、ブロック０を消去する。これ及びステップ５６０９〜５６１０は、ステップ５６０７とパラレルに生起可能であることをご留意願いたい。
【０８８０】
ステップ５６０９において、最新のページ要求が、ステージバッファからの消去カウント及び欠陥データをスーパーブロックのバンク０のスーパーページ０内に戻ってコピーし、これにより、これらの入力を除き空白であるフラッシュ内の新たなスーパーブロック・メタデータ・テーブルをセットアップする。
【０８８１】
ステップ５６１０で、スーパーブロックは、スーパーブロック・フリーリスト２９１２上に戻ってセットされ、スーパーブロック・フリーリスト・カウンタ２９１３は、インクリメントされる。次に、このスーパーブロックに関するガベージ・コレクション動作は完了する。
【０８８２】
好適実施形態は、ホストが開始する書込みの場合に正しく生起するように、古いスーパーブロックからの有効なデータを現在オープンしているスーパーブロック内へコピーするが、代替実施形態では、同時に、２つの「オープンしている」スーパーブロックが存在し、１つは、通常の読出しに使用され、第２のものは、ガベージ・コレクション工程を介してリサイクルされるスーパーブロックからのデータを訂正するのに使用される。この実施形態では、ガベージ・コレクション起動転送要求が識別され（例えば、転送要求内のガベージ・コレクション・フラグによって）、ホストが開始する書込みに関して使用される開いているスーパーブロックよりも、むしろ、開いているガベージ・コレクション・スーパーブロックへのデータ書込みを生起する。
【０８８３】
ガベージ・コレクションから結果として生ずる有効なデータは、書込みに関して現在オープンしているスーパーブロック内の有効なデータと比べると比較的に「新鮮ではない」。この理由で、ガベージ・コレクションから結果として生ずる有効なデータのガベージ・コレクション・スーパーブロック内へのコピーは、比較的に新鮮でないデータを集める傾向があり、したがって、頻繁に使用される可能性は少ない。当業者に理解されるように、最近書き込まれたものでないデータは、最近のデータと比較するに、近い将来に読出しまたは書込みが行われる可能性は格段に小さい。
【０８８４】
「ガベージ・コレクション」スーパーブロックの使用は、比較的新鮮でないデータを１以上のスーパーブロック内に集める利点を有する。そのようなデータは、上書きされる可能性が比較的に小さいので、そのようなスーパーブロックは、有効なデータでいっぱいになる傾向がある。上述したように、有効でないデータを比較的に高い比率で有するスーパーブロックにガベージ・コレクションを優先的に適用した場合には、ガベージ・コレクションの保存場所として使用されているスーパーブロックは、多分、それ自身ガベージ・コレクションの対象とされない。このことは、比較的に動かないことが期待されるデータは、比較的少数のスーパーブロックに集中し、このデータはガベージ・コレクションの対象とされることはなく、したがって、ガベージ・コレクション工程の一部としてこのデータを新たなスーパーブロックへ規則的にコピーする必要はない、という利点を有する。逆に、通常の書込みに使用されるスーパーブロックは、頻繁に使用され且つ再書込みのされるデータの集中を有する傾向がある。したがって、そのようなスーパーブロックは、比較的高い比率で有効でないスーパーページを含む傾向がある。そのようなスーパーブロックが、自身でガベージ・コレクションの対象とされたときには、スーパーブロックで外へとコピーされるべき有効データ量は、比較的に少なく、これにより、ガベージ・コレクションのために必要な時間は減少する。
【０８８５】
したがって、ガベージ・コレクション・スーパーブロックは、幾分かの追加される複雑性の不都合はあるものの、ガベージ・コレクション動作のための必要時間量を最小にすることによって、性能を改善することができる。
【０８８６】
この代替的実施形態の延長として、比較的に高価な速いメモリ及び比較的に安価な遅いメモリを含む階層メモリシステムが使用される。ガベージ・コレクションの間に集められるデータのストアに使用されるスーパーブロックは、比較的に遅いメモリ内にストアされる。なぜなら、そのようなスーパーブロックは、比較的最近に更新され、したがって速いメモリ内のスーパーブロック内にストアされるデータ程には頻繁に必要とはされないデータを保持することを期待されているからである。
【０８８７】
Ｄ．パトロール機能
【０８８８】
当分野で理解されているように、フラッシュメモリのデータ完全性は、様々な理由から損なわれ得る。各読出しの間に、ページのセル内の電荷が僅かに消失し、セルの電圧を正しく読み出されなくなるまで低下させることがある。互いに隣接するページ同士もまた、読出し動作の影響を受け、それによって、実際のセルが読み出されなくてもそのようなページのセルの電圧を低下させることがある。これは、「読出しディスターブ」と呼ばれる。時間とともに、この消失は、セル電圧を閾値以下に低下させ、かつ「１」を「０」として登録させ得る。これらのエラーが処理されなければ、時間とともにＥＣＣにより回復可能であるよりも多くのエラーがある可能性があり、データの破損が生じ得る。
【０８８９】
その上、メモリセルのプログラミング（書込み）または消去はまた、性能を低下させ、データエラーの増加の原因になり得る。例えば、セルがプログラミングまたは消去されるとき、電荷がフローティング・ゲートに流れ込んだり流れ出たりするように電圧の増加が必要とされ得る。しかし、電圧の増加は、セルを形成するために用いられる半導体材料にストレスを加えることがある。数多くのプログラミングまたは消去サイクルを繰り返すことで、セルが電荷を効率的にストアする能力は低下し、データエラーの増加につながりかねない。
【０８９０】
フラッシュメモリセルが書き込まれてからの時間はまた、データの信頼性の欠如の一因となりかねない。
【０８９１】
これらの問題は、スーパーページを不良と認定させ得るフラッシュメモリ内の物理的欠陥が原因である場合もそうでない場合もあることに留意されたい。物理的欠陥は永久的なものであり、影響を受けたスーパーページは永久にマップアウト（map out）されて、それ以上使われない。その代わりに、これらの種類のエラーは、スーパーページ上の１若しくは複数のフラッシュ・セルによって保持される電荷の低下によって生じる一時的なものである。そのような一時的エラーの検出は、スーパーページが不良と認定されることを必要とせず、エラー自体は、ＥＣＣを用いて訂正可能である。
【０８９２】
しかし、ＥＣＣは、１ページ当たり所与の数のエラーを訂正することしかできない。さらに、ページの完全性が上記の要因（例えば、読出しディスターブ、書込みディスターブなど）に影響され始めると、そのページのエラーの数が時間とともに増加する可能性が高いので、或る時点でページ上の情報は回復可能ではなくなる。
【０８９３】
エラー・ハンドリングは、エンタープライズレベルのフラッシュストレージが直面している最も重要な課題の１つを抱えている。当分野で公知のように、フラッシュストレージは比較的高い誤り率を有し、これは、フラッシュメモリ・システムにおける誤り訂正はかなりのシステム・リソースを消費するリード・モディファイ・ライト動作を用いてページ全体を書き込むことを必要とするという事実によって一層ひどくなる。
【０８９４】
ＳＳＤコントローラ１０６は、フラッシュメモリ・エラーを処理するのにこの上なく適している。というのも、多数のプロセッサ、及び複数の独立したパイプラインにより、コントローラ１０６は、ホスト視点のシステム性能を低下させることなく、事実上連続的にエラーを検出して訂正することができるからである。
【０８９５】
ＳＳＤコントローラ１０６の構造は、誤り訂正アルゴリズムの観点から重要な選択を可能にするが、そのうちのいくつかは本明細書に記載されている。
【０８９６】
一実施形態では、ＳＳＤコントローラ１０６は、各フラッシュ・グループを独立して「パトロール」し、有効な情報を含む全てのスーパーページを読み出し、閾値を超えるエラーを訂正する各フラッシュＨＥＭｉ上で実行するファームウェアから構成される独立したパトロール機能を用いる。この実施形態は、図５７に示されている。
【０８９７】
図５７のフローチャートは、図５０のステップ５００４の結果が「ｎｏ」であるところから始まる。図５０に関連して上記したように、ステップ５００７〜５００９は、状況次第でパトロール機能に置き換えられることがある。
【０８９８】
ステップ５７０１は、パトロール機能が作動しているか否かを判定するためのチェックを表す。一実施形態では、パトロール機能は周期的に作動する。この実施形態では、パトロール機能は、フラッシュ・グループの全ての有効なスーパーページをチェックし、その後、一定期間シャットダウンする。例えば、パトロール機能は、２４時間に１回、実行完了（run to completion）し得る。この実施形態では、パトロール機能が完了したら、指定された期間が終了するまで再開せず、例えば、パトロール機能は、午前零時毎に始まり、実行完了し（後述するように、パトロール機能は、他の動作が行われるように、周期的にインタラプトされる）、その後、次の午前零時までシャットダウンされ得る。
【０８９９】
パトロール機能が周期的に実行する実施形態では、ステップ５７０１の結果が「ｎｏ」であれば、図５０のステップ５００７に導かれ、ステップ５００７で、フラッシュＨＥＭｉはスリープ・モードに入ることがある。
【０９００】
パトロール機能が連続的に作動している実施形態では（この場合もやはり、パトロール機能は他のタスクのためにインタラプトされる）、ステップ５７０１はスキップされる。それらの実施形態では、またはパトロール機能が作動していれば（ステップ５７０１の結果が「ｙｅｓ」）、ステップ５７０２で、ローカル転送要求が利用可能であるか否かを判定するためのチェックが行われる。好適実施形態では、このステップ及び特定の後続ステップは、独立パトロール関数プログラミングを表すものではないが、その代わりに、ホストが開始する読出し及び書込みに通常は用いられるファームウェア・ルーチン（例えば図４９）をコールすることに留意されたい。
【０９０１】
ローカル転送要求が利用可能でなければ（ステップ５７０２の結果が「ｎｏ」）、処理は図５０のステップ５００７に戻る。ローカル転送要求が利用可能であれば（ステップ５７０２の結果が「ｙｅｓ」）、ステップ５７０３でローカル転送要求がポップされる。
【０９０２】
ステップ５７０４で、ローカル転送要求が投入される。一般に、これは、ホストが開始するトランザクション（例えば図４９を参照）に用いられるプロセスに酷似しており、コマンド・フィールド３９０７には読出しコマンドが用いられる。しかし、転送要求のためのＬＢＡ範囲は、フラッシュ・グループ間で用いられるＬＢＡストライピングを考慮して、このフラッシュ・グループのパトロール機能の直前の反復に用いられるＬＢＡ範囲に基づき、目標は、フラッシュ・グループに割り当てられた全てのＬＢＡをカバーすることである。
【０９０３】
パトロール機能が次の初期化を最初に実行するとき（または断続的なシャットダウン後に最初に再スタートするとき）、転送要求は、フラッシュ・グループ内にストアされている第１の９０個のＬＢＡを割り当てられることになる。その次のときには、転送要求は、フラッシュ・グループ内にストアされている次の９０個のＬＢＡを割り当てられることになり、という具合に、フラッシュ・グループ内にストアされている最後のＬＢＡに到達するまで続き、最後のＬＢＡに到達した時点で、パトロール機能は、最初から再スタートする（パトロール機能が連続的に実行するならば）か、次のトリガリング・イベント（例えば次の午前零時）までシャットダウンすることになる。
【０９０４】
パトロール機能は、フラッシュＨＥＭｉ ｍＲＡＭ内のデータ構造（例えば、ローカル変数２９１６内の変数）を用いて、直前に割り当てられたＬＢＡの経過を追う。
【０９０５】
上記したように（例えば図１６及び付随の説明を参照）、ＬＢＡは、フラッシュ・グループ間でストライピングされる。それゆえ、パトロール機能は、次の９０個のＬＢＡを転送要求に単純に割り当てることができないが、代わりにフラッシュ・グループに割り当てられた９０個のＬＢＡの次のグループを識別しなければならない。これは、フラッシュ・グループに等しいポート値を有する次のローを見つけるためのフォワード・テーブル３２０１を介して、パトロール機能が実行中であることを知ることによって達成されることができる。あるいは、パトロール機能は、まず第１にフラッシュ・グループにＬＢＡを割り当てるために用いられるのと同じアルゴリズムを用いることができる（例えば、ＬＢＡは、９０にフラッシュ・グループの数を乗じた数に等しいギャップを有する９０のストライプに割り当てられる）。
【０９０６】
ステップ５７０４におけるローカル転送要求の投入に続いて、ステップ５７０５で、３つのページ要求がポップされかつデータ投入され、各ページ要求は転送要求に割り当てられた４５個のＬＢＡのうちの１５個を受信する。ページ要求がデータ投入される方法については、図４９に関連して上記した。
【０９０７】
ステップ５７０６で、ページ要求はバンク・キューに送信される。これは、ホストが開始するトランザクションを処理するためにページ要求が生成されるのに用いられるのと同じプロセスである。例えば図４９を参照されたい。
【０９０８】
ステップ５７０７で、ページ要求の読出しが実行される。データは、フラッシュ・ステージバッファに読み出されるが、データパスＤＲＡＭ１０７に送信されないことに留意されたい。それよりむしろ、読出しの唯一の目的は、ＥＣＣチェック部をトリガすることである。図３１に関連して上記したように、ＥＣＣチェック部３１０４は、データがフラッシュ・ステージバッファに読み出される度に作動し、エラーが発見されたら、データはＥＣＣ訂正エンジン３１０１に送信される。
【０９０９】
ステップ５７０８で、ＥＣＣチェック部３１０４によって設定されたインジケータをチェックして、読出しエラーが検出されたか否かを判定する。否であれば（ステップ５７０８の結果が「ｎｏ」）、処理は図５０のループの始めに戻る。これにより、フラッシュＨＥＭｉは、パトロール機能が実行中でも他の非パトロール機能タスクを処理することができ、パトロール機能が、ホストが開始する読出し及び書込みのための性能を著しく低下させないことが確実になる。他の動作が求められていなければ、図５０のループがステップ５００４に戻るとき、当該ステップの結果が「ｎｏ」であれば、このときには新しい一連の４５個のＬＢＡにより再びパトロール機能をトリガすることになる。
【０９１０】
読出しエラーが検出されたら（ステップ５７０８の結果が「ｙｅｓ」）、ステップ５７０９で、エラーを含むセクタがＥＣＣ訂正エンジン３１０１に送信される。ＥＣＣ訂正については図３１に関連して上記した。
【０９１１】
ステップ５７１０で、ＥＣＣエンジン３１０１によって訂正されたエラーの数は、許容可能なエラーの閾値を上回るか否かがチェックされ、許容可能なエラーの閾値は、この実施形態では８に設定される（図３１に関連して上記参照）。
【０９１２】
エラーの数が閾値またはそれ以下であれば（ステップ５７１０の結果が「ｎｏ」）、パトロール機能は、図５０のステップ５００１に制御を返す。図３１に関連して上記したように、検出されたエラーの数が閾値を超えなければ、訂正されたデータはフラッシュに書き込まれない。
【０９１３】
エラーの数が閾値を超えるならば（ステップ５７１０の結果が「ｙｅｓ」）、ステップ５７１１で、訂正されたデータはリード・モディファイ・ライト動作を用いて新しいスーパーページに書き込まれる。上記の図５３及び付随の説明を参照されたい。
【０９１４】
ステップ５７１１の後に、パトロール機能は、図５０のステップ５００１に制御を返す。
【０９１５】
図５７は、パトロール機能の一実施形態を説明しており、ここでは、パトロール機能は、各フラッシュ・グループ上で独立して実行する。これは、各フラッシュ・グループが独立したフラッシュＨＥＭｉによって支配されているという事実によって可能となる。ＳＳＤコントローラ１０６に固有の処理能力は、システム全体の性能に何ら影響することなく、かつ、フラッシュのどの領域が特にエラーを起こしやすいかを予測しようとする必要なしに、フラッシュ・エラーを継続または断続ベースで検出及び訂正することを可能にする。
【０９１６】
別の実施形態では、ＳＳＤコントローラ１０６は、パトロール機能のためのＩＯＰを発行する。各ＩＯＰは、ＬＢＡ範囲を指定し、ＩＯＰは、ＳＳＤコントローラ１０６によって支配されているＬＢＡ範囲全体がカバーされるまで、周期的に発行される。この実施形態では、どのＬＢＡがどのフラッシュ・グループに割り当てられるかを別々に計算する必要がない。というのも、これは、ＳＳＤコントローラ１０６がＩＯＰを処理すると自動的に処理されるからである（上記参照）。
【０９１７】
この実施形態では、他のタスクが処理待ちか否かを判定するためのいかなるチェックも行われない。このため、ＩＯＰの発行は、一定の間隔をあけて行われるべきである（例えば毎分１つ）。加えて、１つの代替実施形態では、パトロール機能ＩＯＰの結果呼び出された転送要求及びページ要求は、優先順位が低いものとして識別され、他の転送要求及びページ要求の後に処理される場合がある（上記参照）。
【０９１８】
Ｅ．アボート処理
【０９１９】
ＳＳＤコントローラ１０６は、ＳＣＳＩアボート・コマンド及び他の関連プロトコルにおける類似のコマンドに正しく応答することが求められる。アボート・コマンドは、特定の読出しまたは書込みコマンド、または特定のイニシエータからの全てのコマンドをアボートするように要求する。ＳＳＤコントローラ１０６はまた、ハード・リセットに正しく応答しなければならない。ハード・リセットにおいては、全てのカレント・コマンドがアボートされ、システムはデフォルトのパワーオン状態に戻される。
【０９２０】
アボート・コマンドまたはハード・リセットに続いて、アボートされた書込みコマンドに制約されていたがアボート以前には開始しなかったようなＬＢＡ内にストアされているデータは、未定義状態にあり、イニシエータは、そのようなデータを再書込みし、それを既知の状態に戻すことを求められる。
【０９２１】
特定のコマンドのアボートが要求される場合、ＳＳＤコントローラは、アボート・コマンドと共に受信されたＳＣＳＩタグを識別しかつ当該情報をＣＤＢ情報テーブル４１０９に存在するＣＤＢ情報内のＳＣＳＩタグ・フィールド３７０５にマッチさせることで応答し、それによって、今現在アボートされているコマンドに応じて生成されたＣＤＢ情報を識別する。当該ＣＤＢ情報のＩＯＰフィールド３７０４は、その後、トランザクションを処理するために呼び出されたＩＯＰを識別するために用いられる。その後、ＩＯＰの結果として発行された各転送要求を識別するために、当該ＩＯＰの転送要求ポインタ・アレイ３８０９がチェックされる。これらの転送要求の各々はその後アボートされるが、それは、そのアボート・フラグ３９０６が設定され、フラッシュＨＥＭｉ実行ループが各転送要求のためのアボート・ハンドラを開始することを意味する。アボート・ハンドラは、転送要求を終了状態に置き、ページ要求・ポインタ・アレイ３９１３内で識別された全てのページ要求をバンク・キューから削除する。ページ要求、転送要求及びＩＯＰのクリーンアップは、図５５に関連して説明したように進行する。
【０９２２】
アボート・キュー・コマンドは、アボート・キュー・コマンドに関与するイニシエータによって発行された全てのコマンドのアボートを要求する。当該イニシエータは、アボート・キュー・コマンドを伴うメタデータから識別される。当該イニシエータを識別する全てのＣＤＢ情報及びＩＯＰは、全てのワークリストから削除されかつフリーリストに戻されることによって引っ込められ、そのようなＩＯＰによって発行された全ての転送要求も引っ込められる。
【０９２３】
ハード・リセットは、全てのアクティブなコマンドの終了を要求する。一実施形態では、これは、全てのアクティブなＩＯＰ内のアボート・フラグ３８１１を設定するが他のアクションを起こさないことによって処理される。データ（書込み）または状態情報（読出し）をホストに送信するためにＩＯＰが送信ＨＥＭｉに送信されるとき（図５５のステップ５５０７を参照）、送信ＨＥＭｉは、アボート・フラグを読み出し、ホストに通信を送信せずにＩＯＰの処理を終了させる。トランザクションは、その他の点では正常に完了する。従って、この実施形態では、ホストに通信が送信されないことを除いて全てのトランザクションは正常に完了するので、特別な処理は必要ない。
【０９２４】
代替実施形態では、ハード・リセットによって、全てのアクティブなＩＯＰ及び転送要求にアボート・フラグが設定される。これがなされると、ＨＥＭｉワークリストから取り出されたＩＯＰ及び転送要求は処理されないがその代わりに無視され、全てのページ要求がバンク・キューから削除される。（全てのページ要求、ＩＯＰ及び転送要求が引っ込められた結果として）全てのＨＥＭｉの仕事がなくなると、制御はＡＲＭ２００２に任される。ＡＲＭ２００２は、全てのページ要求、ＩＯＰ及び転送要求をフリーリストに戻すことと、全ての状態パラメータをデフォルト値に設定することとを含む、クリーンアップに関与する。この代替実施形態は、全てのトランザクションを完了させるよりも高速であるが、特別な処理を用いる必要があるので、ソフトウェア・エラーのリスクがもたらされる。
【０９２５】
Ｆ．電力損失回復
【０９２６】
上記したように、データパスＤＲＡＭ１０７は、フォワード・テーブル及びリバース・テーブルをストアするために用いられる。ＤＲＡＭからの読出しまたは書込みは、フラッシュからの読出しまたは書込みよりもずっと高速であるので、この情報をＤＲＡＭにストアすることにより、特にこれらのテーブルに要求される大量の書込みを考慮すると、かなりの性能上の利点が得られる。
【０９２７】
しかし、ＤＲＡＭ１０７は揮発性メモリなので、突然停電した場合には、これらのテーブルは復元されなければならず、各フラッシュ・ポートに対して現在オープンしているスーパーブロックのためのスーパーブロック・メタデータ・テーブル（これもまた、上記したように、ＤＲＡＭ１０７内にストアされている）も復元されなければならない。
【０９２８】
一般に、オープンしているスーパーブロック・メタデータ・テーブルは、フラッシュのスーパーページ・メタデータ・フィールド内にストアされた情報を用いて復元され、フォワード・テーブル及びリバース・テーブルは、フラッシュのスーパーブロック・メタデータ・テーブル及び復元されたオープンしているスーパーブロック・メタデータ・テーブル内にストアされた情報を用いて復元される。これは、図５８に示されており、図５８は、１つのフラッシュ・グループのための復元プロセスを示している。
【０９２９】
ステップ５８０１で、カレント・スーパーブロックは０に設定される。これは、フラッシュ・グループ内のスーパーブロック全てを通じてループを開始する。
【０９３０】
ステップ５８０２で、カレント・スーパーブロックのためのスーパーブロック・メタデータ・テーブル３５０１は、フラッシュからステージバッファへコピーされる。フラッシュメモリ内よりもステージバッファ内のテーブルからの読出し及び書込みの方が容易である。
【０９３１】
ステップ５８０３で、スーパーブロック・メタデータ・テーブルのオープン・フラグ３５０８及びクローズド・フラグ３５０９がチェックされ、電力損失時にスーパーブロックが消去された状態にあったか否かが判定される。
【０９３２】
両方のフラグがクリアされると（ステップ５８０３の結果が「ｙｅｓ」）、これはスーパーブロックが消去されたことを意味する。ステップ５８０４で、スーパーブロックは、スーパーブロック・フリーリスト２９１２に置かれ、その後、処理はステップ５８２１に続き、そこでは後述するように次のスーパーブロックの解析をトリガする。
【０９３３】
スーパーブロックが消去されなかったら（ステップ５８０３の結果が「ｎｏ」）、ステップ５８０５で、オープン・フラグ及びクローズド・フラグがチェックされ、電力損失時にスーパーブロックがオープンされていたか否かが判定される。これは、オープン・フラグが設定され、クローズド・フラグが設定されていないことによって示される。このステップは、ステップ５８０３と結合することができることに留意されたい。
【０９３４】
電力損失時にスーパーブロックがクローズされていたら（ステップ５８０５の結果が「ｎｏ」）、ステップ５８０６でスーパーブロック・メタデータ・テーブルからのスーパーブロック・タイムスタンプ３５０６は、スーパーブロックのためのリバース・テーブル・タイムスタンプ・フィールド３４０５へコピーされる。このステップは、リバース・テーブルをスーパーブロックのための正しいタイムスタンプ情報で更新する。
【０９３５】
ステップ５８０７で、バンクは０に設定される。これは、全ブロックを通じてループを開始する。各スーパーブロックは、各バンクにつき１つのブロックからなることに留意されたい。
【０９３６】
ステップ５８０８で、スーパーページは０に設定される。これは、ブロック内の６４個のスーパーページを通じてループを開始する。
【０９３７】
ステップ５８０９で、カレント・スーパーページ及びバンクのためのスーパーブロック・メタデータ・テーブルＬＢＡフィールドは、フォワード・テーブル３２０１内への検索のためのインデックスとして用いられる。バンク０、スーパーページ０は、特別な場合であり、というのも、このスーパーページはスーパーブロック・メタデータ・テーブルを含むので、このスーパーページは解析をスキップさせられるからであることに留意されたい。
【０９３８】
ＬＢＡのためのフォワード・テーブルのローが既に埋められていれば（ステップ５８０９の結果が「ｙｅｓ」）、これは復元プロセス中に既にＬＢＡに遭遇したことを意味し、ＬＢＡはオープンしているスーパーブロックに少なくとも２回書き込まれたことを意味する。このことは、最後のそのような書込みが有効と認定され、それ以前の書込みが無効にされることを必要とする。ステップ５８１０で、ＬＢＡに対応するフォワード・テーブル・ローからのデータは、ＬＢＡが書き込まれたスーパーブロックを識別するために用いられる。上記の以前のスーパーブロックのためのリバース・テーブル・タイムスタンプ・フィールド３４０５は、現在評価されているスーパーブロックのためのスーパーブロック・メタデータ・テーブルからのタイムスタンプ・フィールド３５０６と比較される。
【０９３９】
リバース・テーブル・タイムスタンプがスーパーブロック・メタデータ・テーブル・タイムスタンプより小さい（時間が早い）ならば（ステップ５８１０の結果が「＜」）、これは、フォワード・テーブル内にあるエントリが、その後に、現在評価されているスーパーブロック・メタデータ・テーブルに反映されたより新しいエントリに取って代わられたことを意味する。この場合、ステップ５８１１で、ＬＢＡのための既存のフォワード・テーブル・エントリに対応する既存のリバース・テーブル・スーパーページ・エントリは、リバース・テーブル内で無効と印が付けられる。処理は、その後、後述するステップ５８１５に進む。
【０９４０】
既存のフォワード・テーブル エントリに対応するリバース・テーブル・タイムスタンプがスーパーブロック・メタデータ・テーブル・タイムスタンプより大きい（時間が遅い）ならば（ステップ５８１０の結果が「＞」）、これは、現在フォワード・テーブル内にあるＬＢＡエントリがスーパーブロック・メタデータ・テーブル内のＬＢＡエントリに取って代わった（例えば、現在評価されているスーパーブロックに書き込まれた後にＬＢＡが再書込みされた）ことを意味する。この場合、ステップ５８１２で、カレント・スーパーブロック・メタデータ・テーブル内のＬＢＡを含むスーパーページのリバース・テーブル・エントリは、無効と印が付けられる。処理は、その後、後述するステップ５８１７に進む。
【０９４１】
リバース・テーブル・タイムスタンプがスーパーブロック・メタデータ・テーブル・タイムスタンプと等しければ（ステップ５８１０の結果が「＝」）、これは同じＬＢＡが同じスーパーブロックに２回書き込まれたことを意味する。どちらが後から書き込まれたかを判定するために、スーパーページ・メタデータからタイムスタンプを読み出す必要がある。ステップ５８１３で、２つのスーパーページからのタイムスタンプ・フィールド１４０３の内容は、フラッシュからステージバッファへコピーされる。
【０９４２】
ステップ５８１４で、スーパーページ・タイムスタンプ同士が比較される。
【０９４３】
ステップ５８１１で、２つのスーパーページのうちのより古い方がリバース・テーブル内で無効と印が付けられる。
【０９４４】
ＬＢＡが既にフォワード・テーブル内にない（ステップ５８０９の結果が「ｎｏ」）か、または古いスーパーページがリバース・テーブル内で無効と印が付けられているステップ５８１１に続いて、ステップ５８１５に到達する。ステップ５８１５で、ＬＢＡに対応するフォワード・テーブルのフィールドには、新しいスーパーページのためのフラッシュ・アドレス情報が書き込まれる。ＬＢＡのためのフォワード・テーブルのエントリは、ここで、現在の有効なバージョンのＬＢＡデータをストアするものとしてこのスーパーページを指す。
【０９４５】
ステップ５８１６で、スーパーページは、リバース・テーブル内で無効と印が付けられる。
【０９４６】
ステップ５８１６の後またはステップ５８１２の後に、ステップ５８１７に到達する。ステップ５８１７で、スーパーページはインクリメントされる。
【０９４７】
ステップ５８１８で、インクリメントされたスーパーページ値は６３と比較される。
【０９４８】
新たにインクリメントされたスーパーページが６３以下であれば（ステップ５８１８の結果が「ｎｏ」）、これは、追加のスーパーページが依然としてカレント・バンク内で評価されることを意味し、処理はステップ５８０９に戻り、ステップ５８０９で次のスーパーページの評価が始まる。スーパーブロック・メタデータ・テーブルに記載のスーパーページは、０から６３まで順に評価されることに留意されたい。
【０９４９】
新たにインクリメントされたスーパーページが６３より大きければ（ステップ５８１８の結果が「ｙｅｓ」）、これはバンク内の最後のスーパーページに到達したことを意味する。ステップ５８１９で、バンクはインクリメントされる。
【０９５０】
ステップ５８２０で、新たにインクリメントされたバンク値は、「ｎ」で表されるバンクの数と比較される。（上記したように、バンクの数はインプリメント特有のものである。）
【０９５１】
新たにインクリメントされたバンクがｎより小さいかまたは等しければ（ステップ５８２０の結果が「ｎｏ」）、これは、追加のブロックが依然としてスーパーブロック内でチェックされることを意味する。（上記したように、スーパーブロックは、各バンク上の同じブロックからなる。）この場合、処理はステップ５８０８に戻り、ステップ５８０８で次のバンクのスーパーページ０の評価が始まる。バンクは、０からｎまで順に評価されることを理解されたい。
【０９５２】
新たにインクリメントされたバンクがｎより大きければ（ステップ５８２０の結果が「ｙｅｓ」）、これはスーパーブロック内の最後のブロックに到達したことを意味する。
【０９５３】
ステップ５８２１で、スーパーブロックはインクリメントされる。このステップには、ステップ５８２０またはステップ５８０４のいずれかから到達し、ここでは、カレント・スーパーブロックはスーパーブロック・フリーリストに置かれることに留意されたい。
【０９５４】
ステップ５８２２で、新たにインクリメントされたスーパーブロック値が、「ｐ」で表される１フラッシュ・グループ当たりのスーパーブロックの全数と比較される。（上記したように、１フラッシュ・グループ当たりのスーパーブロックの数はインプリメント特有のものである。）
【０９５５】
新たにインクリメントされたスーパーブロックがｐより小さいかまたは等しければ（ステップ５８２２の結果が「ｎｏ」）、これは、追加のスーパーブロックが依然としてこのフラッシュ・グループ内で評価されることを意味する。この場合、処理はステップ５８０２に戻り、ステップ５８０２で、次のスーパーブロックのためのスーパーブロック・メタデータ・テーブルがステージバッファへコピーされ、前のスーパーブロックのためのテーブルを上書きし、新しいスーパーブロックのためにプロセスが再び始まる。
【０９５６】
新たにインクリメントされたスーパーブロックがｐより大きければ（ステップ５８２２の結果が「ｙｅｓ」）、最後のスーパーブロックが既に評価されており、このフラッシュ・グループのためのスーパーブロック・メタデータ・テーブル、フォワード・テーブル及びリバース・テーブルの回復は完了である。
【０９５７】
ステップ５８０５に戻り、オープン・フラグ及びクローズド・フラグの解析がスーパーブロックは電力損失時にオープンされていた（オープン・フラグが設定され、クローズド・フラグが未設定）ことを示すならば、このスーパーブロックのためのフラッシュ内にストアされているスーパーブロック・メタデータ・テーブルは、どのＬＢＡがスーパーブロックのスーパーページに割り当てられたかを判定するのに有用ではないであろう。というのも、この情報は、スーパーブロックがクローズされているときにフラッシュ内にストアされるだけであるからである。このため、スーパーブロック・メタデータ・テーブルは、フラッシュ内にストアされたスーパーページ・メタデータを用いて復元されなければならない。テーブルが復元されたら、スーパーブロックは全ての他のスーパーブロックに用いられるのと同じ方法を用いて解析されることができる。
【０９５８】
ステップ５８２３で、現在の時刻がスーパーブロック・メタデータ・テーブルのタイムスタンプ・フィールド３５０６に書き込まれる。このタイムスタンプは、スーパーブロックがクローズされていた時刻を反映しないが（電力損失の時点でスーパーブロックはクローズされていなかったので）、現在の時刻は、任意の他のスーパーブロックのためのリバース・テーブル・タイムスタンプ値より遅いことが保証される。それゆえ、オープンしているスーパーブロックとクローズされているスーパーブロックに同じＬＢＡが書き込まれるならば、オープンしているスーパーブロックのためのタイムスタンプ値は、クローズされているスーパーブロックのためのタイムスタンプ値より時間が遅いことになるので、オープンしているスーパーブロックのためのスーパーページが、ＬＢＡのための有効な内容をストアするものとして受け入れられるようにする。これは、正しい結果である。というのも、オープンしているスーパーブロック内の情報は、その名が示す通り、以前にクローズされたスーパーブロック内の情報より時間が遅いからである。復元手順が完了した後、オープンしているスーパーブロックはオープンしたままであることに留意されたい。スーパーブロックがクローズされているとき、スーパーブロック・メタデータ・テーブル・タイムスタンプ値は、テーブルがフラッシュにストアバックされる前にクローズの時間が上書きされることになり、従って訂正されることになる。
【０９５９】
ステップ５８２４で、バンクは０に設定されるので、スーパーブロックの全ブロック（１バンク当たり１つ）を通じてループを開始する。ステップ５８２５で、スーパーページは０に設定されるので、ブロック内の全スーパーページを通じてループを開始する。
【０９６０】
ステップ５８２６で、カレント・スーパーページのためのスーパーページ・メタデータ１４０１が、フラッシュからステージバッファにコピーされる。
【０９６１】
ステップ５８２７で、電力損失の前にスーパーページに書込みがなされたか否かを判定する。書込みがなされたスーパーページは、有効なメタデータを含むことになるためのチェックが行われる。
【０９６２】
スーパーページに書込みがなされたならば（ステップ５８２７の結果が「ｙｅｓ」）、ステップ５８２８で、スーパーページ・メタデータは、スーパーブロック・メタデータ・テーブル内の当該スーパーページにエントリを投入するために用いられる。ＳＰａｇｅインデックス・フィールド１４０２は、スーパーブロック・メタデータ・テーブルのＬＢＡフィールドのために用いられる。タイムスタンプ・フィールド１４０３は、スーパーブロック・メタデータ・テーブルのスーパーページ・タイムスタンプ・フィールドのために用いられる。消去されたスーパーブロックのためのメタデータ・テーブルのフラッシュ・バージョン内に欠陥情報が維持されるので、スーパーページのためのスーパーブロック・メタデータ不良フィールドは、既に有効な情報を含み、従って、オープンしているスーパーブロックのためのメタデータ・テーブルがフラッシュからステージバッファへコピーされるときに有効であることに留意されたい。
【０９６３】
ステップ５８２９〜５８３２は、ステップ５８１７〜５８２０と同じように働く。上記したように、これらのステップは、ループ・プロセスを制御し、各ブロックの各スーパーページが評価されることを確実にする。
【０９６４】
カレント・スーパーページに書込みがされなかったら（ステップ５８２７の結果が「ｎｏ」）、処理はステップ５８３１にスキップし、そこでバンクはインクリメントされることに留意されたい。スーパーブロックのスーパーページは、各バンクにおいて順番に割り当てられるので、或るバンクの或るスーパーページに書込みがされていなければ、それは、当該バンクのそれ以降のスーパーページにも書込みがされないことを意味する。
【０９６５】
スーパーブロック・メタデータ・テーブルの最後のブロックが評価されたら（ステップ５８３２の結果が「ｙｅｓ」）、テーブルの復元プロセスは完了し、処理はステップ５８０６に戻り、ステップ５８０６で、メタデータ・テーブルのためのタイムスタンプ情報がリバース・テーブルへコピーされ、それによって、このスーパーブロック内のスーパーページは、任意の他のスーパーブロックとの競合が見られても常に有効として処理されることを保証する。処理は、このスーパーブロックに対して、ステップ５８０６からまた続く。
【０９６６】
ＶＩ．ＭＬＣフラッシュ
【０９６７】
本明細書に記載の実施形態の大部分はＳＬＣフラッシュメモリを用いているが、ＳＳＤコントローラ１０６はＭＬＣフラッシュの使用にもよく適合している。ＭＬＣフラッシュは、１つのフラッシュ・セル当たり複数ビットをストアしているので、大量のデータをストアすることができる。ＭＬＣはまた、ストレージ・ボリュームの単位当たりのコストがより低い。
【０９６８】
しかし、ＭＬＣには、データセンタなどの高性能・高信頼性用途においてＭＬＣの使用を困難にする幾つかの問題がある。第１に、ＭＬＣはＳＬＣより遅い。上記したように、ＭＬＣ書込みはＳＬＣ書込みより１００マイクロ秒長くかかり、性能が劣るＭＬＣすらある。
【０９６９】
第２に、ＭＬＣフラッシュはＳＬＣフラッシュより耐久性が劣る傾向がある。一般に、ＳＬＣフラッシュは、故障なしで１００，０００消去サイクルの処理を行うように仕様が定められるが、現在のＭＬＣフラッシュ技術は、１０，０００消去サイクルの処理を行うように仕様が定められているに過ぎない。
【０９７０】
第３に、ＭＬＣフラッシュは、ＳＬＣよりデータの誤り率が高い。ＳＳＤコントローラ１０６は、非常に高い性能水準で、かつコントローラのソフトウェアまたはハードウェアへの変更が最小限であるかまたは全くない状態で、ＭＬＣフラッシュで作動するように設計されている。
【０９７１】
第１に、図４４に関連して上記したように、ＳＳＤコントローラ１０６に用いられるパラレル・パイプライン処理は書込みレイテンシーを隠すので、ＭＬＣ書込みはＳＬＣ書込みよりも時間が掛かるが、一連の書込みを通じてこの差の大部分は隠される。というのも、ＳＳＤコントローラ１０６は、或る書込みをページサイズのチャンクに分けて、それらのチャンクをパラレルかつ重複的に処理することができるからである。
【０９７２】
第２に、ＳＳＤコントローラ１０６のフラッシュメモリ・アーキテクチャは、新たに書き込まれたデータを比較的大きなメモリ空間内で移動させる傾向があり、それによって、特別なウェア・レベリング技術を用いなくても消去サイクル制限の効果を最小にする。上記したように、既存のデータを保持するスーパーページとは異なるスーパーページに新しい書込みがなされ、新しいスーパーページは、元のスーパーページとは異なるブロック上に存在し得る。これは、フラッシュ・グループ内でデータを移動させる傾向があるので、データの特定の構成要素が比較的頻繁に消去される場合、これらの消去は、多数の物理フラッシュ・ページの全域に広げられることになる。
【０９７３】
別の実施形態では、ＳＳＤコントローラ１０６は、陽的ウェア・レベリング法を用いることができる。例えば、ガベージ・コレクションが行われるスーパーブロックを識別する際に、ＳＳＤコントローラ１０６は、消去カウント・フィールド３５０７（図３５を参照）内で識別された消去カウントが比較的少ないスーパーブロックを優先的に選択することができる。各スーパーブロックの消去カウント情報は、タイムスタンプ・フィールド３４０５と同様の方法でリバース・テーブルのロー内にストアされることができる。ＳＳＤコントローラ１０６は、消去カウント情報を用いて、同数の有効なスーパーページを有するスーパーブロック間を結ぶガベージ・コレクション（図５６に関連する説明を参照）を中断することができ、あるいは、消去カウント情報を用いて、スーパーブロックを複数のカテゴリーに分けることができ、危険区域に近付く消去カウント（例えば５，０００消去）を有するスーパーブロックが「ガベージ・コレクション」スーパーブロックとして優先的に選択される（図５６に関連して上記したように、一実施形態では、ガベージ・コレクション動作に関連して消去されるスーパーブロックからの有効データが、ガベージ・コレクション・スーパーブロックにストアされ、ガベージ・コレクション・スーパーブロックに関して比較的少ないデータ無効化をもたらすので、当該スーパーブロックの消去は、比較的発生頻度が低い傾向がある）。同様に、上記したように、消去カウント値が閾値を超えるスーパーブロックは、通常のガベージ・コレクションに対して優先的に選択されないように識別され、それによってそのようなスーパーブロックに関してさらなるウェアを減らすことができる。
【０９７４】
ここで説明した本発明の様々な態様の実施形態は、好適なインプリメントであるが、当業者は、それらの変形形態も可能であり得ることを理解することになろう。従って、本発明は、添付の請求項の全ての範囲内で保護される権利がある。
【図１】
2011508349.tif 000003
【図２】
2011508349.tif 000004
【図３】
2011508349.tif 000005
【図４】
2011508349.tif 000006
【図５】
2011508349.tif 000007
【図６】
2011508349.tif 000008
【図７】
2011508349.tif 000009
【図８】
2011508349.tif 000010
【図９】
2011508349.tif 000011
【図１０】
2011508349.tif 000012
【図１１】
2011508349.tif 000013
【図１２】
2011508349.tif 000014
【図１３】
2011508349.tif 000015
【図１４】
2011508349.tif 000016
【図１５】
2011508349.tif 000017
【図１６】
2011508349.tif 000018
【図１７】
2011508349.tif 000019
【図１８】
2011508349.tif 000020
【図１９】
2011508349.tif 000021
【図２０】
2011508349.tif 000022
【図２１】
2011508349.tif 000023
【図２２】
2011508349.tif 000024
【図２３】
2011508349.tif 000025
【図２４】
2011508349.tif 000026
【図２５】
2011508349.tif 000027
【図２６】
2011508349.tif 000028
【図２７】
2011508349.tif 000029
【図２８】
2011508349.tif 000030
【図２９】
2011508349.tif 000031
【図３０】
2011508349.tif 000032
【図３１】
2011508349.tif 000033
【図３２】
2011508349.tif 000034
【図３３】
2011508349.tif 000035
【図３４】
2011508349.tif 000036
【図３５】
2011508349.tif 000037
【図３６】
2011508349.tif 000038
【図３７】
2011508349.tif 000039
【図３８】
2011508349.tif 000040
【図３９】
2011508349.tif 000041
【図４０】
2011508349.tif 000042
【図４１】
2011508349.tif 000043
【図４２】
2011508349.tif 000044
【図４３】
2011508349.tif 000045
【図４４】
2011508349.tif 000046
【図４５Ａ】
2011508349.tif 000047
【図４５Ｂ】
2011508349.tif 000048
【図４６Ａ】
2011508349.tif 000049
【図４６Ｂ】
2011508349.tif 000050
【図４７】
2011508349.tif 000051
【図４８Ａ】
2011508349.tif 000052
【図４８Ｂ】
2011508349.tif 000053
【図４８Ｃ】
2011508349.tif 000054
【図４８Ｄ】
2011508349.tif 000055
【図４９Ａ】
2011508349.tif 000056
【図４９Ｂ】
2011508349.tif 000057
【図５０Ａ】
2011508349.tif 000058
【図５０Ｂ】
2011508349.tif 000059
【図５１Ａ】
2011508349.tif 000060
【図５１Ｂ】
2011508349.tif 000061
【図５２Ａ】
2011508349.tif 000062
【図５２Ｂ】
2011508349.tif 000063
【図５３Ａ】
2011508349.tif 000064
【図５３Ｂ】
2011508349.tif 000065
【図５４】
2011508349.tif 000066
【図５５】
2011508349.tif 000067
【図５６】
2011508349.tif 000068
【図５７】
2011508349.tif 000069
【図５８Ａ】
2011508349.tif 000070
【図５８Ｂ】
2011508349.tif 000071
【図５８Ｃ】
2011508349.tif 000072
【図５８Ｄ】
2011508349.tif 000073
【国際調査報告】
2011508349.tif 000074