(57)【要約】【課題】メモリシステムの動作を高速化する。【解決手段】実施形態のメモリシステムは、半導体記憶装置と、メモリコントローラとを含む。メモリコントローラは、コマンドバッファとディスクリプタバッファとを有する。メモリコントローラは、外部から受信した第１コマンドをコマンドバッファに格納し、格納した第１コマンドに基づいてホスト機器から第１ディスクリプタをフェッチし、フェッチした第１ディスクリプタをディスクリプタバッファに格納し、外部から受信した第２コマンドをコマンドバッファに格納し、未使用の第1ディスクリプタの一部をディスクリプタバッファから破棄し、格納した第２コマンドに基づいて、ホスト機器から第２ディスクリプタをフェッチし、破棄した第１ディスクリプタの一部が格納されていたアドレスに、フェッチした第２ディスクリプタを格納する。【選択図】図１０
2020154493.tif 000002
【特許請求の範囲】
【請求項１】
半導体記憶装置と、
前記半導体記憶装置と外部のホスト機器との間のデータ転送を制御し、コマンドバッファとディスクリプタバッファとを有するメモリコントローラと、を備え、
前記メモリコントローラは、
外部から受信した第１コマンドを前記コマンドバッファに格納し、
格納した前記第１コマンドに基づいて、前記ホスト機器から第１ディスクリプタをフェッチし、
フェッチした前記第１ディスクリプタを前記ディスクリプタバッファに格納し、
外部から受信した第２コマンドを前記コマンドバッファに格納し、
未使用の前記第１ディスクリプタの一部を前記ディスクリプタバッファから破棄し、
格納した前記第２コマンドに基づいて、前記ホスト機器から第２ディスクリプタをフェッチし、
破棄した前記第１ディスクリプタの一部が格納されていたアドレスに、フェッチした前記第２ディスクリプタを格納する、
メモリシステム。
【請求項２】
前記メモリコントローラは、前記第２コマンドの優先度に基づいて、未使用の前記第1ディスクリプタの一部を前記ディスクリプタバッファから破棄する、
請求項１に記載のメモリシステム。
【請求項３】
前記メモリコントローラは、前記ディスクリプタバッファの空きに基づいて、未使用の前記第１ディスクリプタの一部を前記ディスクリプタバッファから破棄する、
請求項１に記載のメモリシステム。
【請求項４】
前記メモリコントローラは、前記ディスクリプタバッファに格納された前記第２ディスクリプタに基づいて前記ホスト機器に割り当てられた領域を用いて、前記コマンドバッファに格納された前記第２コマンドに基づいた動作を実行した後に、
格納した前記第１コマンドに基づいて、破棄した前記第１ディスクリプタの一部と同じディスクリプタである第３ディスクリプタを前記ホスト機器からフェッチし、
フェッチした前記第３ディスクリプタを前記ディスクリプタバッファに格納する、
請求項１乃至請求項３の何れか一項に記載のメモリシステム。
【請求項５】
前記メモリコントローラは、前記コマンドバッファに格納されたコマンドに対応するディスクリプタの数に基づいて前記第１ディスクリプタを破棄するか否かを判断し、
前記メモリコントローラが前記第１コマンドに基づいて前記ホスト機器からフェッチするディスクリプタの数は、前記メモリコントローラが前記第２コマンドに基づいて前記ホスト機器からフェッチするディスクリプタの数よりも多い、
請求項１乃至請求項４の何れか一項に記載のメモリシステム。
【請求項６】
前記メモリコントローラは、前記ディスクリプタバッファに格納されたディスクリプタに対応するデータ転送量に基づいて前記第１ディスクリプタを破棄するか否かを判断し、
前記第１ディスクリプタに基づいた前記メモリシステムと前記ホスト機器との間のデータ転送量は、前記第２ディスクリプタに基づいた前記メモリシステムと前記ホスト機器との間のデータ転送量よりも多い、
請求項１乃至請求項４の何れか一項に記載のメモリシステム。
【請求項７】
前記メモリコントローラは、
前記第１コマンドに対応する動作の種類を確認し、
前記動作の種類が書き込み動作の場合は、格納した前記第１ディスクリプタを前記ディスクリプタバッファから破棄すると判断し、
前記動作の種類が読み出し動作の場合は、格納した前記第１ディスクリプタを前記ディスクリプタバッファから破棄しないと判断する、
請求項１乃至請求項４の何れか一項に記載のメモリシステム。
【請求項８】
半導体記憶装置と、
前記半導体記憶装置と外部のホスト機器との間のデータ転送を制御し、コマンドバッファとディスクリプタバッファとを有するメモリコントローラと、を備え、
前記メモリコントローラは、
外部から受信した第１コマンドを前記コマンドバッファに格納し、
格納した前記第１コマンドに基づいて、前記ホスト機器から第１ディスクリプタをフェッチし、
フェッチした前記第１ディスクリプタを前記ディスクリプタバッファに格納し、
外部から受信した第２コマンドを前記コマンドバッファに格納し、
格納した前記第２コマンドに基づいて、前記ホスト機器から第２ディスクリプタをフェッチし、
未使用の前記第１ディスクリプタの一部が格納されているアドレスに、フェッチした前記第２ディスクリプタを上書きする、
メモリシステム。
【請求項９】
前記メモリコントローラは、前記ディスクリプタバッファに格納された前記第２ディスクリプタに基づいて前記ホスト機器に割り当てられた領域を用いて、前記コマンドバッファに格納された前記第２コマンドに基づいた動作を実行した後に、
格納した前記第１コマンドに基づいて、前記第２ディスクリプタが上書きされた前記第１ディスクリプタの一部と同じディスクリプタである第３ディスクリプタを前記ホスト機器からフェッチし、
フェッチした前記第３ディスクリプタを前記ディスクリプタバッファに格納する、
請求項８に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、メモリシステムに関する。
【背景技術】
【０００２】
データを不揮発に記憶することが可能なＮＡＮＤ型フラッシュメモリが知られている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第４９３９４４３号公報
【特許文献２】特開２００９−０６５５６４号公報
【特許文献３】米国特許第８６８３１２６号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
メモリシステムの動作を高速化する。
【課題を解決するための手段】
【０００５】
実施形態のメモリシステムは、半導体記憶装置と、メモリコントローラとを含む。メモリコントローラは、半導体記憶装置と外部のホスト機器との間のデータ転送を制御し、コマンドバッファとディスクリプタバッファとを有する。メモリコントローラは、外部から受信した第１コマンドを前記コマンドバッファに格納し、格納した前記第１コマンドに基づいて前記ホスト機器から第１ディスクリプタをフェッチし、フェッチした前記第１ディスクリプタを前記ディスクリプタバッファに格納し、外部から受信した第２コマンドを前記コマンドバッファに格納し、未使用の前記第1ディスクリプタの一部を前記ディスクリプタバッファから破棄し、格納した前記第２コマンドに基づいて、ホスト機器から第２ディスクリプタをフェッチし、破棄した前記第１ディスクリプタの一部が格納されていたアドレスに、フェッチした前記第２ディスクリプタを格納する。
【図面の簡単な説明】
【０００６】
【図１】実施形態に係るメモリシステムのブロック図。
【図２】実施形態に係るメモリシステムの備える半導体記憶装置のブロック図。
【図３】実施形態に係るメモリシステムの備える半導体記憶装置に含まれたメモリセルアレイの回路図。
【図４】実施形態に係るメモリシステムの備えるメモリコントローラに含まれたホストインターフェイス回路のブロック図。
【図５】実施形態に係るメモリシステムの動作実行シーケンスの一例を示すフローチャート。
【図６】実施形態に係るメモリシステムにおいてＰＲＰ（Physical Region Page）が使用された場合における動作シーケンスの一例を示す模式図。
【図７】実施形態に係るメモリシステムにおいてＳＧＬ（Scatter Gather List）が使用された場合における動作シーケンスの一例を示す模式図。
【図８】実施形態に係るメモリシステムにおけるバッファ解放動作の一例を示すフローチャート。
【図９】実施形態に係るメモリシステムにおけるバッファ解放動作の一例を示すフローチャート。
【図１０】実施形態に係るメモリシステムにおける、ディスクリプタ数に基づくバッファ解放動作の一例を示す模式図。
【図１１】実施形態に係るメモリシステムにおける、ディスクリプタ数に基づくバッファ解放動作の一例を示す模式図。
【図１２】実施形態に係るメモリシステムにおける、ＮＬＢ（Number of Logical Blocks）に基づくバッファ解放動作の一例を示す模式図。
【図１３】実施形態に係るメモリシステムにおける、コマンド種別に基づくバッファ解放動作の一例を示す模式図。
【図１４】実施形態に係るメモリシステムにおける、優先度に基づくバッファ解放動作の一例を示す模式図。
【発明を実施するための形態】
【０００７】
以下に、実施形態について図面を参照して説明する。実施形態は、発明の技術的思想を具体化するための装置や方法を例示している。図面は模式的又は概念的なものであり、各図面の寸法及び比率等は必ずしも現実のものと同一とは限らない。本明細書において“接続”とは、電気的に接続されている事を示し、間に別の素子を介することを除外しない。
【０００８】
尚、以下の説明において、略同一の機能及び構成を有する構成要素については、同一符号を付す。参照符号を構成する文字の後の数字は、同じ文字を含んだ参照符号によって参照され、且つ同様の構成を有する要素同士を区別するために使用される。同様に、参照符号を構成する数字の後の文字は、同じ数字を含んだ参照符号によって参照され、且つ同様の構成を有する要素同士を区別するために使用される。同じ文字又は数字を含んだ参照符号で示される要素を相互に区別する必要がない場合、これらの要素はそれぞれ文字又は数字のみを含んだ参照符号により参照される。
【０００９】
［実施形態］
以下に、実施形態に係るメモリシステム１について説明する。
【００１０】
［１］構成
［１−１］メモリシステム１の全体構成
図１は、実施形態に係るメモリシステム１の構成例を示している。実施形態に係るメモリシステム１は、例えばＳＳＤ（Solid State Drive）であり、データを不揮発に保持することが出来る。実施形態に係るメモリシステム１は、外部のホスト機器２と通信し、ホスト機器２からの命令に応じて各種動作を実行し得る。実施形態に係るメモリシステム１は、例えば半導体記憶装置１０Ａ及び１０Ｂ、ＤＲＡＭ（Dynamic Random Access Memory）２０、並びにメモリコントローラ３０を含んでいる。
【００１１】
半導体記憶装置１０Ａ及び１０Ｂのそれぞれは、データを不揮発に記憶するＮＡＮＤ型フラッシュメモリである。メモリシステム１に含まれる半導体記憶装置１０の個数は、任意の個数に設計され得る。半導体記憶装置１０の詳細な構成については後述する。
【００１２】
ＤＲＡＭ２０は、メモリコントローラ３０の記憶領域として使用される揮発性メモリである。ＤＲＡＭ２０は、例えばホスト機器２から受信した書き込みデータを一時的に記憶する。ＤＲＡＭ２０は、メモリコントローラ３０やホスト機器２等に内蔵されても良い。
【００１３】
メモリコントローラ３０は、例えばＳｏＣ（System on Chip）であり、ホスト機器２からの命令に応答して半導体記憶装置１０Ａ及び１０Ｂのそれぞれに対して読み出し、書き込み、及び消去等を命令する。また、メモリコントローラ３０は、例えばＣＰＵ（Central Processing Unit）３１、ＲＡＭ（Random Access Memory）３２、ホストインターフェイス回路（ホストＩ／Ｆ）３３、ＮＡＮＤインターフェイス回路（ＮＡＮＤＩ／Ｆ）３４、及びＤＲＡＭインターフェイス回路（ＤＲＡＭＩ／Ｆ）３５を含んでいる。
【００１４】
ＣＰＵ３１は、メモリコントローラ３０全体の動作を制御する中央演算処理装置である。ＣＰＵ３１は、例えばホスト機器２から受信した書き込み命令に応答して、書き込みコマンドを発行する。また、ＣＰＵ３１は、例えばウェアレベリング等、半導体記憶装置１０のメモリ空間を管理するための様々な処理を実行する。
【００１５】
ＲＡＭ３２は、例えばＳＲＡＭ（Static Random Access Memory)等の揮発性メモリである。ＲＡＭ３２は、ＣＰＵ３１の作業領域として使用され、例えば半導体記憶装置１０を管理するためのファームウェアや各種管理テーブル等を保持する。
【００１６】
ホストインターフェイス回路３３は、ホストバスを介してホスト機器２と接続され、メモリコントローラ３０及びホスト機器２間のデータ、コマンド、及びアドレスを送受信する回路である。ホストインターフェイス回路３３は、例えばＳＡＴＡ（Serial Advanced Technology Attachment）、ＳＡＳ（Serial Attached SCSI）、ＰＣＩｅ（PCI Express）（登録商標）、ＮＶＭｅ（NVM Express）等の通信インターフェイス規格をサポートし得る。ホストインターフェイス回路３３の詳細な構成については後述する。
【００１７】
ＮＡＮＤインターフェイス回路３４は、メモリコントローラ３０及び半導体記憶装置１０間におけるデータ、コマンド、及びアドレスを送受信する回路である。ＮＡＮＤインターフェイス回路３４は、ＮＡＮＤインターフェイス規格をサポートしている。
【００１８】
ＤＲＡＭインターフェイス回路３５は、ＤＲＡＭ２０に接続され、メモリコントローラ３０とＤＲＡＭ２０との間の通信を行う回路である。ＤＲＡＭインターフェイス回路３５は、ＤＲＡＭインターフェイス規格をサポートしている。
【００１９】
以上で説明したメモリシステム１に接続されたホスト機器２は、例えばサブミッションキューＳＱ、ディスクリプタメモリＤＭ、及び転送領域ＴＡを含んでいる。
【００２０】
サブミッションキューＳＱは、ホスト機器２がメモリシステム１に実行させる動作を、いわゆる待ち行列の形式で保持し得る記憶部である。ディスクリプタメモリＤＭは、メモリシステム１によって使用される複数のディスクリプタを保持する記憶部である。転送領域ＴＡは、半導体記憶装置１０とホスト機器２との間のデータの転送に使用される一時記憶領域である。
【００２１】
［１−２］半導体記憶装置１０の構成
図２は、実施形態に係るメモリシステム１に含まれた半導体記憶装置１０の構成例を示している。半導体記憶装置１０は、例えばメモリセルアレイ１１、コマンドレジスタ１２、アドレスレジスタ１３、シーケンサ１４、ドライバモジュール１５、ロウデコーダモジュール１６、並びにセンスアンプモジュール１７を含んでいる。
【００２２】
メモリセルアレイ１１は、複数のブロックＢＬＫ０〜ＢＬＫ（ｋ−１）（ｋは１以上の整数）を含んでいる。ブロックＢＬＫは、データを不揮発に記憶することが可能な複数のメモリセルの集合であり、例えばデータの消去単位として使用される。また、メモリセルアレイ１１には、複数のビット線及び複数のワード線が設けられる。各メモリセルは、例えば１本のビット線と１本のワード線とに関連付けられている。
【００２３】
コマンドレジスタ１２は、半導体記憶装置１０がメモリコントローラ３０から受信したコマンドＣＭＤを保持する。コマンドＣＭＤは、例えばシーケンサ１４に読み出し動作、書き込み動作、消去動作等を実行させる命令を含んでいる。
【００２４】
アドレスレジスタ１３は、半導体記憶装置１０がメモリコントローラ３０から受信したアドレス情報ＡＤＤを保持する。アドレス情報ＡＤＤは、例えばブロックアドレスＢＡ、ページアドレスＰＡ、及びカラムアドレスＣＡを含んでいる。例えば、ブロックアドレスＢＡ、ページアドレスＰＡ、及びカラムアドレスＣＡは、それぞれブロックＢＬＫ、ワード線、及びビット線の選択に使用される。
【００２５】
シーケンサ１４は、半導体記憶装置１０全体の動作を制御する。例えば、シーケンサ１４は、コマンドレジスタ１２に保持されたコマンドＣＭＤに基づいてドライバモジュール１５、ロウデコーダモジュール１６、及びセンスアンプモジュール１７等を制御して、読み出し動作、書き込み動作、消去動作等を実行する。
【００２６】
ドライバモジュール１５は、読み出し動作、書き込み動作、消去動作等で使用される電圧を生成する。そして、ドライバモジュール１５は、例えばアドレスレジスタ１３に保持されたページアドレスＰＡに基づいて、選択されたワード線に対応する信号線に生成した電圧を印加する。
【００２７】
ロウデコーダモジュール１６は、アドレスレジスタ１３に保持されたブロックアドレスＢＡに基づいて、対応するメモリセルアレイ１１内の１つのブロックＢＬＫを選択する。そして、ロウデコーダモジュール１６は、例えば選択されたワード線に対応する信号線に印加された電圧を、選択されたブロックＢＬＫ内の選択されたワード線に転送する。
【００２８】
センスアンプモジュール１７は、書き込み動作において、メモリコントローラ３０から受信した書き込みデータＤＡＴに応じて、各ビット線に所望の電圧を印加する。また、センスアンプモジュール１７は、読み出し動作において、ビット線の電圧に基づいてメモリセルに記憶されたデータを判定し、判定結果を読み出しデータＤＡＴとしてメモリコントローラ３０に転送する。
【００２９】
［１−３］メモリセルアレイ１１の回路構成
図３は、実施形態における半導体記憶装置１０に含まれたメモリセルアレイ１１の回路構成の一例を、メモリセルアレイ１１に含まれた複数のブロックＢＬＫのうち１つのブロックＢＬＫを抽出して示している。ブロックＢＬＫは、例えば４つのストリングユニットＳＵ０〜ＳＵ３を含んでいる。
【００３０】
各ストリングユニットＳＵは、ビット線ＢＬ０〜ＢＬ（Ｌ−１）（Ｌは１以上の整数）にそれぞれ関連付けられた複数のＮＡＮＤストリングＮＳを含んでいる。各ＮＡＮＤストリングＮＳは、例えばメモリセルトランジスタＭＴ０〜ＭＴ７、並びに選択トランジスタＳＴ１及びＳＴ２を含んでいる。メモリセルトランジスタＭＴは、制御ゲート及び電荷蓄積層を含み、データを不揮発に保持する。選択トランジスタＳＴ１及びＳＴ２のそれぞれは、各種動作時におけるストリングユニットＳＵの選択に使用される。
【００３１】
各ＮＡＮＤストリングＮＳにおいて、メモリセルトランジスタＭＴ０〜ＭＴ７は、直列接続される。選択トランジスタＳＴ１のドレインは、関連付けられたビット線ＢＬに接続され、選択トランジスタＳＴ１のソースは、直列接続されたメモリセルトランジスタＭＴ０〜ＭＴ７の一端に接続される。選択トランジスタＳＴ２のドレインは、直列接続されたメモリセルトランジスタＭＴ０〜ＭＴ７の他端に接続される。選択トランジスタＳＴ２のソースは、ソース線ＳＬに接続される。
【００３２】
同一のブロックＢＬＫにおいて、メモリセルトランジスタＭＴ０〜ＭＴ７の制御ゲートは、それぞれワード線ＷＬ０〜ＷＬ７に共通接続される。ストリングユニットＳＵ０〜ＳＵ３内の選択トランジスタＳＴ１のゲートは、それぞれ選択ゲート線ＳＧＤ０〜ＳＧＤ３に共通接続される。ストリングユニットＳＵ０〜ＳＵ３内の選択トランジスタＳＴ２のゲートは、それぞれ選択ゲート線ＳＧＳ０〜ＳＧＳ３に共通接続される。
【００３３】
以上で説明したメモリセルアレイ１１の回路構成において、ビット線ＢＬは、各ストリングユニットＳＵで同一のカラムアドレスが割り当てられたＮＡＮＤストリングＮＳによって共有される。ソース線ＳＬは、例えば複数のブロックＢＬＫ間で共有される。
【００３４】
１つのストリングユニットＳＵ内で共通のワード線ＷＬに接続された複数のメモリセルトランジスタＭＴの集合は、例えばセルユニットＣＵと称される。例えば、それぞれが１ビットデータを記憶するメモリセルトランジスタＭＴを含むセルユニットＣＵの記憶容量が、「１ページデータ」として定義される。セルユニットＣＵは、メモリセルトランジスタＭＴが記憶するデータのビット数に応じて、２ページデータ以上の記憶容量を有し得る。
【００３５】
尚、実施形態における半導体記憶装置１０に含まれたメモリセルアレイ１１の回路構成は、以上で説明した構成に限定されない。例えば、各ＮＡＮＤストリングＮＳが含むメモリセルトランジスタＭＴ並びに選択トランジスタＳＴ１及びＳＴ２の個数は、それぞれ任意の個数に設計され得る。各ブロックＢＬＫが含むストリングユニットＳＵの個数は、任意の個数に設計され得る。
【００３６】
［１−４］ホストインターフェイス回路３３の構成
図４は、実施形態におけるメモリコントローラ３０に含まれたホストインターフェイス回路３３の構成例を示している。ホストインターフェイス回路３３は、例えばコマンドバッファ４０、ディスクリプタバッファ４１、キャッシュメモリ４２、及びＤＭＡ（Direct Memory Access）コントローラ４３を含んでいる。
【００３７】
コマンドバッファ４０は、ホスト機器２のサブミッションキューＳＱに基づいたコマンドを保持する。コマンドバッファ４０は、例えばバッファ領域ＣＢ０〜ＣＢ（ｍ−１）（ｍは１以上の整数）を含んでいる。例えば、バッファ領域ＣＢの各々は、１つのコマンドを保持する。メモリシステム１は、コマンドバッファ４０に保持されたコマンドに基づいて、読み出し動作、書き込み動作、消去動作等を実行する。コマンドのサイズは、例えば６４byteである。
【００３８】
ディスクリプタバッファ４１は、コマンドバッファ４０に保持されたコマンドに基づいたディスクリプタを保持する。ディスクリプタバッファ４１は、例えばバッファ領域ＤＢ０〜ＤＢ（ｎ−１）（ｎは１以上の整数）を含んでいる。例えば、バッファ領域ＤＢの各々は、１つのディスリプタを保持する。メモリシステム１は、ディスクリプタバッファ４１に保持されたディスクリプタに基づいて、ホスト機器２の転送領域ＴＡ内にメモリシステム１及びホスト機器２間のデータ転送に使用する記憶領域を割り当てる。
【００３９】
キャッシュメモリ４２は、例えばＳＲＡＭ等の揮発性メモリである。キャッシュメモリ４２は、例えばメモリシステム１とホスト機器２との間のデータ転送における、一時的な記憶領域として使用される。ＤＭＡコントローラ４３は、メモリシステム１及びホスト機器２間のデータ転送を制御する。ＤＭＡコントローラ４３を用いたデータ転送は、ＣＰＵ３１による制御を介さずに実行される。
【００４０】
尚、実施形態におけるメモリコントローラ３０に含まれたホストインターフェイス回路３３の構成は、以上で説明した構成に限定されない。例えば、キャッシュメモリ４２やＤＭＡコントローラ４３は、少なくともメモリコントローラ３０内に含まれていれば良い。また、ＤＭＡコントローラ４３は、省略されても良い。この場合、メモリコントローラ３０及びホスト機器２間のデータ転送は、ＣＰＵ３１によって制御される。
【００４１】
［２］動作
［２−１］メモリシステム１の動作実行シーケンス
以下に、図５を用いて、実施形態に係るメモリシステム１の動作実行シーケンスについて説明する。図５は、実施形態に係るメモリシステム１の動作実行シーケンスの一例を示すフローチャートである。
【００４２】
メモリシステム１に実行させる所定の動作に対応する少なくとも１つのコマンドがサブミッションキューＳＱに格納されると、ホスト機器２は、コマンドが格納されたことをメモリシステム１に通知する（ステップＳ１０）。メモリコントローラ３０は、サブミッションキューＳＱにコマンドが格納されたことが通知されると、コマンドの転送をホスト機器２に要求する（ステップＳ１１）。
【００４３】
コマンドの転送が要求されると、ホスト機器２は、サブミッションキューＳＱに格納されたコマンドをメモリコントローラ３０に転送する（ステップＳ１２）。メモリコントローラ３０は、ホスト機器２からコマンドを受け取ると、当該コマンドをコマンドバッファ４０に格納する（ステップＳ１３）。
【００４４】
次に、メモリコントローラ３０は、必要に応じてバッファ解放動作を実行する（ステップＳ１４）。ステップＳ１４におけるバッファ解放動作は、例えばディスクリプタバッファ４１の空き領域が足りない場合に実行される。一方で、ディスクリプタバッファ４１の空き領域が足りている場合、ステップＳ１４におけるバッファ解放動作はスキップされる。バッファ解放動作の詳細については後述する。
【００４５】
それから、メモリコントローラ３０は、ステップＳ１３の処理でコマンドバッファ４０に格納したコマンドに基づいて、ディスクリプタの転送をホスト機器２に要求する（ステップＳ１５）。メモリコントローラ３０は、バッファ解放動作によって空いた領域を用いて所定の条件を満たしたコマンドに対応するディスクリプタをフェッチする。すなわち、ＣＰＵ３１は、所定の条件を満たしたコマンドに対応するディスクリプタを、優先度の低いディスクリプタの替わりにディスクリプタバッファ４１に格納する。ディスクリプタの転送が要求されると、ホスト機器２は、ディスクリプタメモリＤＭに格納された複数のディスクリプタのうち、メモリコントローラ３０から要求されたディスクリプタをメモリコントローラ３０に転送する（ステップＳ１６）。メモリコントローラ３０は、ホスト機器２からディスクリプタを受け取ると、当該ディスクリプタをディスクリプタバッファ４１に格納する（ステップＳ１７）。
【００４６】
そして、メモリコントローラ３０は、ディスクリプタバッファ４１に格納されたディスクリプタに基づいた動作を実行する（ステップＳ１８）。ステップＳ１８においてメモリコントローラ３０は、ディスクリプタバッファ４１に格納されたディスクリプタに基づいて、メモリシステム１及びホスト機器２間のデータ転送に使用する記憶領域（転送領域ＴＡ内のデータ領域）の割り当てをホスト機器２に指示する。
【００４７】
その後、メモリコントローラ３０は、コマンドバッファ４０に格納されたコマンドとディスクリプタバッファ４１に格納されたディスクリプタとに基づいた動作を実行する。言い換えると、メモリコントローラ３０は、ディスクリプタバッファ４１に格納されたディスクリプタによって転送領域ＴＡ内に割り当てられたデータ領域を用いて、コマンドバッファ４０に格納されたコマンドに基づいた動作（例えば読み出し動作、書き込み動作等）を実行する（ステップＳ１９）。
【００４８】
例えば、ステップＳ１９において読み出し動作が実行された場合、メモリコントローラ３０は、ディスクリプタバッファ４１に格納されたディスクリプタに対応する転送領域ＴＡへ、半導体記憶装置１０から読み出したデータを送信する。ステップＳ１９において書き込み動作が実行された場合、メモリコントローラ３０は、ディスクリプタバッファ４１に格納されたディスクリプタに対応する転送領域ＴＡに保持されたデータを受信し、半導体記憶装置１０に書き込みを行わせる。つまり、メモリコントローラ３０は、半導体記憶装置１０とホスト機器２との間のデータ転送を中継する。
【００４９】
以上で説明した動作実行シーケンスにおいてメモリコントローラ３０は、ＮＶＭｅ規格に基づいた動作を実行する場合、データ転送に使用する記憶領域の割り当てにＰＲＰ（Physical Region Page）又はＳＧＬ（Scatter Gather List）を使用する。ＰＲＰ及びＳＧＬのどちらが使用されるのかは、コマンドバッファ４０に保持されたコマンドに基づいて決定される。以下に、実施形態に係るメモリシステム１において、ＰＲＰを使用した場合における動作シーケンスと、ＳＧＬを使用した場合における動作シーケンスとの概要について簡潔に説明する。
【００５０】
（ＰＲＰを使用した場合における動作シーケンス）
ＰＲＰでは、先頭と末尾を除くディスクリプタ一つに対し、一律に同じサイズの記憶領域が割り当てられる。ＰＲＰを使用した場合における動作シーケンスにおいて、メモリコントローラ３０がディスクリプタに基づいて転送領域ＴＡに割り当てるデータ領域のサイズは、例えば一律ページサイズに指定される。図６は、実施形態に係るメモリシステム１においてＰＲＰが使用された場合における動作シーケンスの一例を示す模式図である。図６に示された“Ｓ１２”及び“Ｓ１６”は、それぞれ図５を用いて説明したステップＳ１２及びＳ１６の処理に対応している。
【００５１】
図６におけるコマンドは、ＰＲＰの使用を指示するコマンドと、データポインタＰＲＰ１及びＰＲＰ２とを含んでいる。
【００５２】
尚、ＰＲＰでは、ステップＳ１８の処理の前に、データポインタＰＲＰ１に含まれたディスクリプタが、コマンドバッファ４０からディスクリプタバッファ４１に転送される。その結果、においてディスクリプタバッファ４１は、コマンドバッファ４０から転送されたＰＲＰエントリＥＮＴ０と、データポインタＰＲＰ２に基づいてディスクリプタメモリＤＭから転送されたＰＲＰリストとを格納する。
【００５３】
ＰＲＰエントリおよびＰＲＰリストは、データ転送に使用する記憶領域を指定するディスクリプタである。ＰＲＰエントリＥＮＴ０は、転送領域ＴＡに割り当てるデータ領域の先頭のアドレス情報を含んでいる。ＰＲＰリストは、転送領域ＴＡに割り当てるデータ領域の続きのアドレス情報を含んでいる。ＰＲＰリストは、例えば対応するコマンドにおけるデータの転送量がＰＲＰエントリＥＮＴ０で足りない場合に使用される。ＰＲＰリストは、例えばＰＲＰエントリＥＮＴ０に続くアドレス情報を示すＰＲＰエントリＥＮＴ１及びＥＮＴ２を含んでいる。
【００５４】
では、ＰＲＰエントリＥＮＴ０、ＰＲＰエントリＥＮＴ１、及びＰＲＰエントリＥＮＴ２は、それぞれ転送領域ＴＡのアドレス“Ａ”、アドレス“Ｂ”、及びアドレス“Ｃ”を指定している。転送領域ＴＡには、ＰＲＰエントリＥＮＴ０に基づいた４ＫＢのデータ領域Ａと、ＰＲＰエントリＥＮＴ１に基づいた４ＫＢのデータ領域Ｂと、ＰＲＰエントリＥＮＴ２に基づいた４ＫＢのデータ領域Ｃとが割り当てられている。
【００５５】
尚、以上の説明では、ＰＲＰリストが２つのＰＲＰエントリを有する場合について例示したが、これに限定されない。ＰＲＰリストが含むＰＲＰエントリの数は、任意の数に設定され得る。ＰＲＰリストは、１つのＰＲＰリストで転送領域ＴＡに必要なデータ領域が確保できない場合に、次のＰＲＰリストを指定する情報を含んでいても良い。
【００５６】
（ＳＧＬを使用した場合における動作シーケンス）
ＳＧＬでは、ディスクリプタ一つに対し、任意のサイズの記憶領域が割り当てられる。ＳＧＬを使用した場合における動作シーケンスにおいて、メモリコントローラ３０がディスクリプタに基づいて転送領域ＴＡに割り当てるデータ領域のサイズは、それぞれ個別に指定され得る。図７は、実施形態に係るメモリシステム１においてＳＧＬが使用された場合における動作シーケンスの一例を示す模式図である。図７に示された“Ｓ１２”及び“Ｓ１６”は、それぞれ図５を用いて説明したステップＳ１２及びＳ１６の処理に対応している。
【００５７】
データポインタＳＧＬ１に基づいたディスクリプタはＳＧＬセグメントＳＥＧ０を含んでいる。ＳＧＬセグメントは、データ転送に使用する領域を指定するディスクリプタである。ＳＧＬセグメントＳＥＧ０は、転送領域ＴＡに割り当てるデータ領域の先頭のアドレス情報と、転送領域ＴＡで確保するデータ長の情報（例えば３ＫＢ）とを含んでいる。ＳＧＬセグメントＳＥＧ０は、次のＳＧＬセグメントＳＥＧ１を示す情報を含んでいる場合がある。
【００５８】
ＳＧＬセグメントＳＥＧ０が次のＳＧＬセグメントＳＥＧ１を示す情報を含んでいる場合、メモリコントローラ３０は、ＳＧＬセグメントＳＥＧ１に対応するディスクリプタの転送をホスト機器２に指示する。ＳＧＬセグメントＳＥＧ１は、例えばＳＧＬセグメントＳＥＧ０に続くアドレスを指定するアドレス情報と、転送領域ＴＡで確保するデータ長の情報（例えば１６ＫＢ）と、次のＳＧＬセグメントＳＥＧ２を示す情報とを含んでいる。
【００５９】
ＳＧＬセグメントＳＥＧ１が次のＳＧＬセグメントＳＥＧ２を示す情報を含んでいる場合、メモリコントローラ３０は、ＳＧＬセグメントＳＥＧ２に対応するディスクリプタの転送をホスト機器２に指示する。ＳＧＬセグメントＳＥＧ２は、例えばＳＧＬセグメントＳＥＧ１に続くアドレスを指定するアドレス情報と、転送領域ＴＡで確保するデータ長の情報（例えば４ＫＢ）とを含んでいる。メモリコントローラ３０が受け取ったＳＧＬセグメントＳＥＧ１及びＳＥＧ２のそれぞれは、ディスクリプタバッファ４１に格納される。
【００６０】
図７の例では、ＳＧＬセグメントＳＥＧ２がデータポインタＳＧＬ１に関連付けられた最後のＳＧＬセグメントＳＥＧに相当している。ＳＧＬセグメントＳＥＧ０、ＳＥＧ１、及びＳＥＧ２は、それぞれ転送領域ＴＡのアドレス“Ａ”、アドレス“Ｂ”、及びアドレス“Ｃ”を指定している。転送領域ＴＡには、例えばＳＧＬセグメントＳＥＧ０に基づいた３ＫＢのデータ領域Ａと、ＳＧＬセグメントＳＥＧ１に基づいた１６ＫＢのデータ領域Ｂと、ＳＧＬセグメントＳＥＧ２に基づいた４ＫＢのデータ領域Ｃとが割り当てられている。
【００６１】
尚、以上の説明では、データポインタＳＧＬ１に基づいてＳＧＬセグメントＳＥＧ１が転送され、ＳＧＬセグメントＳＥＧ１に基づいてＳＧＬセグメントＳＥＧ２が転送される場合について例示したが、これに限定されない。データポインタＳＧＬ１に基づいて転送されるＳＧＬセグメントＳＥＧの数は、当該コマンドで必要なデータサイズに基づいて任意の数に設定され得る。
【００６２】
［２−２］バッファ解放動作
実施形態に係るメモリシステム１は、コマンドバッファ４０に複数のコマンドが格納された場合、これらのコマンドに対応するディスクリプタの総数に対して、ディスクリプタバッファ４１の容量が足りなくなることがある。これに対して実施形態に係るメモリシステム１は、バッファ解放動作を実行することが出来る。バッファ解放動作は、ディスクリプタバッファ４１に格納済みの複数のディスクリプタの中から、所定の条件を満たしたディスクリプタを破棄する動作である。
【００６３】
図８は、実施形態に係るメモリシステム１のバッファ解放動作の一例を示すフローチャートである。尚、以下の説明では、コマンドバッファ４０に格納されたコマンドに基づいて、ディスクリプタバッファ４１に格納されたディスクリプタのことを、フェッチ済みのディスクリプタと呼ぶ。ディスクリプタバッファ４１に格納されたディスクリプタに基づいて転送領域ＴＡに確保された記憶領域のことを、フェッチ済みのデータ領域と呼ぶ。
【００６４】
メモリコントローラ３０は、ディスクリプタバッファ４１に空きがあるかどうかを判断する（ステップＳ２０）。
【００６５】
ディスクリプタバッファ４１に空きがあると判断した場合（ステップＳ２０、ＹＥＳ）、メモリコントローラ３０はバッファ解放動作を終了する（エンド）。ディスクリプタバッファ４１に空きがないと判断した場合（ステップＳ２０、ＮＯ）、メモリコントローラ３０は、直近で受信したコマンドの属性を確認する（ステップＳ２１）。コマンドの属性は、後述する所定の条件に使用されるパラメータ及び情報を含んでいる。
【００６６】
メモリコントローラ３０は、直近で受信したコマンドの属性が所定の条件を満たしているかどうかを判断する（ステップＳ２２）。直近で受信したコマンドの属性が所定の条件を満たしていないと判断した場合（ステップＳ２２、ＮＯ）、メモリコントローラ３０はディスクリプタバッファ４１が空くまで待機し（ステップＳ２３）、バッファ解放動作を終了する（エンド）。直近で受信したコマンドの属性が所定の条件を満たしていると判断した場合（ステップＳ２２、ＹＥＳ）、メモリコントローラ３０はフェッチ済みのディスクリプタのうち優先度の低いディスクリプタの組を破棄する。（ステップＳ２４）。ステップＳ２２における所定の条件の詳細については後述する。
【００６７】
図９は、実施形態に係るメモリシステム１の完了処理の一例を示すフローチャートである。ステップＳ１９の処理によって１つのコマンドに対応する動作が完了すると、メモリコントローラ３０は、完了処理を実行する。
【００６８】
メモリコントローラ３０は、コマンドバッファ４０に格納されている動作完了済みのコマンドを破棄する（ステップＳ３０）。
【００６９】
ステップＳ３０の処理の後、メモリコントローラ３０は、コマンドバッファ４０に格納された全てのコマンドの処理が完了したかどうかを判断する（ステップＳ３１）。
【００７０】
ステップＳ３１の処理において、コマンドバッファ４０に格納された全てのコマンドの処理が完了していると判断した場合（ステップＳ３１、ＹＥＳ）、メモリコントローラ３０は完了処理を終了し、アイドル状態に移行する（エンド）。
【００７１】
ステップＳ３１の処理において、コマンドバッファ４０に格納された全てのコマンドの処理が完了していないと判断した場合（ステップＳ３１、ＮＯ）、メモリコントローラ３０は、コマンドバッファ４０に格納されているコマンドにバッファ解放動作の対象とされたものが含まれているかどうかを判断する（ステップＳ３２）。
【００７２】
ステップＳ３２の処理において、バッファ解放動作の対象とされたコマンドが含まれていないと判断した場合（ステップＳ３２、ＮＯ）、メモリコントローラ３０は、ステップＳ１９の処理に移行する。
【００７３】
バッファ解放動作の対象とされたコマンドが含まれていると判断した場合（ステップＳ３２、ＹＥＳ）、メモリコントローラ３０は、ディスクリプタバッファ４１が必要量空いているかどうかを判断する（ステップＳ３３）。すなわち、メモリコントローラ３０は、バッファ解放動作によって破棄したディスクリプタと同じディスクリプタを、直近のステップＳ３０の処理によって形成されたディスクリプタバッファ４１の空き領域に格納可能かどうかを判断する。
【００７４】
ステップＳ３３の処理において、ディスクリプタバッファ４１が必要量空いていないと判断した場合（ステップＳ３３、ＮＯ）、メモリコントローラ３０は、ステップＳ１９の処理に移行する。
【００７５】
ステップＳ３３の処理において、ディスクリプタバッファ４１が必要量空いていると判断した場合（ステップＳ３３、ＹＥＳ）、メモリコントローラ３０は、破棄したディスクリプタと同じディスクリプタをフェッチする。具体的には、ホスト機器２が、メモリコントローラ３０の要求に基づいて、ディスクリプタメモリＤＭに保持された複数のディスクリプタから、当該コマンドによって指示されたアドレスに保持されたディスクリプタをメモリコントローラ３０に再び転送する。言い換えると、ホスト機器２は、あるコマンドに対応して転送済みのディスクリプタを、再びメモリコントローラ３０に転送する。
【００７６】
以上のように、実施形態に係るメモリシステム１において、バッファ解放動作の対象となったコマンドに対応するディスクリプタは、ホスト機器２からメモリコントローラ３０に複数回転送され得る。そして、メモリコントローラ３０は、ステップＳ１６以降の動作を順次実行する。それから、メモリコントローラ３０は、ステップＳ３１の処理において、コマンドバッファ４０に格納されたコマンドの処理が全て完了するまで上述した動作を繰り返し実行する。
【００７７】
以下に、ステップＳ２２における所定の条件の一例について説明する。ステップＳ２２における所定の条件としては、例えばディスクリプタ数、ＮＬＢ（Number of Logical Blocks）、コマンド種別、優先度情報が挙げられる。
【００７８】
（ディスクリプタ数に基づくバッファ解放動作）
まず、ディスクリプタ数に基づくバッファ解放動作について説明する。実施形態に係るメモリシステム１は、ディスクリプタ数に基づくバッファ解放動作を実行する場合、フェッチ済みのディスクリプタ数が多いコマンドを、バッファ解放動作の対象とする。
【００７９】
図１０及び図１１は、実施形態に係るメモリシステム１における、ディスクリプタ数に基づくバッファ解放動作の一例を示す模式図である。尚、以下の説明で参照される同様の図面では、説明を簡単にするため、ディスクリプタバッファ４１がバッファ領域ＤＢ０〜ＤＢ７のみ有するものと仮定する。また、図１０及び図１１に示す一例では、ＰＲＰが適用されている。
【００８０】
メモリコントローラ３０が、ステップＳ１３の処理によって、コマンドバッファ４０に格納されたコマンドに基づいてディスクリプタをフェッチすると、ディスクリプタバッファ４１が一杯になることがある（ステップＳ２０、ＮＯ）。図１０（１）に示す例では、コマンドＣＭＤ０に対応するディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４がバッファ領域ＤＢ０〜ＤＢ４にそれぞれ格納され、コマンドＣＭＤ１に対応するディスクリプタＣＭＤ１_Ｄ０〜ＣＭＤ１_Ｄ２がバッファ領域ＤＢ５〜ＤＢ７にそれぞれ格納されている。また、各ディスクリプタの転送量は４ＫＢに固定されている。
【００８１】
メモリコントローラ３０は、コマンドＣＭＤ２を受信すると（図１０（２））、ステップＳ２１の処理によって、受信したコマンドの属性（本例では、ディスクリプタ数）を確認する。そして、メモリコントローラ３０は、所定の条件として、例えばコマンドＣＭＤ２に基づくディスクリプタ数が、対応するディスクリプタ数が最も多いコマンドのディスクリプタ数よりも少ないかどうかを確認する（ステップＳ２２）。尚、本処理において所定の条件を満たしたかどうかは、少なくともディスクリプタ数に基づいて判断されていれば良い。
【００８２】
それから、メモリコントローラ３０は、所定の条件を満たした場合に（ステップＳ２２、ＹＥＳ）、ステップＳ２４の処理によって、フェッチ済みのディスクリプタ数が多いコマンドに対応するディスクリプタの一部を破棄する。図１０（３）に示す例では、バッファ領域ＤＢ３及びＤＢ４に格納されたコマンドＣＭＤ０のディスクリプタの一部であるＣＭＤ０_Ｄ３及びＣＭＤ０_Ｄ４が破棄されている。
【００８３】
続けて、メモリコントローラ３０は、ステップＳ１５の処理によってコマンドＣＭＤ２に基づいたディスクリプタの転送をホスト機器２に要求し、ホスト機器２は、ステップＳ１６の処理によって、要求されたディスクリプタをメモリコントローラ３０に転送する（図１０（４））。そして、メモリコントローラ３０は、ステップＳ１７の処理によって、コマンドＣＭＤ２に対応するディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１をバッファ領域ＤＢ３及びＤＢ４にそれぞれ格納する。次に、メモリコントローラ３０は、ステップＳ１８の処理によって、ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１に対応するデータ領域の割り当てをホスト機器２に指示する。それから、メモリコントローラ３０は、ステップＳ１９の処理によって、コマンドＣＭＤ２及びディスクリプタＣＭＤ２_Ｄ０〜１に基づいた動作、すなわちディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１によって転送領域ＴＡ内に割り当てられたデータ領域を用いてコマンドＣＭＤ２に基づいた動作を実行する（図１０（５））。
【００８４】
コマンドＣＭＤ２及びディスクリプタＣＭＤ２_Ｄ０〜１に基づいた動作が完了すると、メモリコントローラ３０は、ステップＳ３０の処理における動作の完了処理を実行する（図１１（６））。この場合、バッファ領域ＤＢ３及びＤＢ４に格納されたコマンドＣＭＤ２のディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１が破棄される。これにより、ディスクリプタバッファ４１に空きが出来たため、メモリコントローラ３０は、破棄されたディスクリプタと同じディスクリプタをフェッチする（図１１（７））。具体的には、メモリコントローラ３０は、コマンドＣＭＤ０ならびに破棄されず残っているコマンドＣＭＤ０のディスクリプタＣＭＤ０_Ｄ０〜２に基づいて、ホスト機器２に対して、ＣＭＤ０_Ｄ３及びＣＭＤ０_Ｄ４の転送を再び要求する。言い換えると、メモリコントローラ３０は、バッファ解放動作によって破棄したディスクリプタの一部と同じディスクリプタを、ホスト機器２からフェッチする。そして、受け取ったディスクリプタＣＭＤ０_Ｄ３及びＣＭＤ０_Ｄ４をバッファ領域ＤＢ３及びＤＢ４に再格納する。それから、メモリコントローラ３０は、コマンドＣＭＤ０及びディスクリプタＣＭＤ０_Ｄ０〜４に基づいた動作、すなわちディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４によって転送領域ＴＡ内に割り当てられたデータ領域を用いてコマンドＣＭＤ０に基づいた動作の実行を開始する（図１１（８））。
【００８５】
尚、以上の説明では、バッファ解放動作によって破棄されたディスクリプタと同じディスクリプタが、ディスクリプタバッファ４１内で破棄される前と同じアドレスに格納される場合について例示したが、これに限定されない。破棄されたディスクリプタと同じディスクリプタが格納されるアドレスは、ディスクリプタバッファ４１内の空きアドレスであれば何れのアドレスであっても良い。
【００８６】
（ＮＬＢに基づくバッファ解放動作）
次に、ＮＬＢに基づくバッファ解放動作について説明する。ＮＬＢは、フェッチ済みのディスクリプタによって転送されるデータ量のことを示している。実施形態に係るメモリシステム１は、ＮＬＢに基づくバッファ解放動作を実行する場合、フェッチ済みのディスクリプタにおいてＮＬＢが大きいコマンドを、バッファ解放動作の対象とする。
【００８７】
図１２は、実施形態に係るメモリシステム１における、ＮＬＢに基づくバッファ解放動作の一例を示す模式図である。また、図１２に示す一例では、ＳＧＬが適用されている。メモリコントローラ３０が、ステップＳ１３の処理によって、コマンドバッファ４０に格納されたコマンドに基づいてディスクリプタをフェッチすると、ディスクリプタバッファ４１が一杯になることがある（ステップＳ２０、ＮＯ）。図１２（１）に示す例では、ディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４のそれぞれの転送量は１ＫＢに設定され、ディスクリプタＣＭＤ１_Ｄ０〜ＣＭＤ１_Ｄ２の転送量は、３２ＫＢ、４ＫＢ、４ＫＢにそれぞれ設定されている。
【００８８】
メモリコントローラ３０は、コマンドＣＭＤ２を受信すると（図１２（２））、ステップＳ２１の処理によって受信したコマンドの属性（本例では、ＮＬＢ）を確認する。そして、メモリコントローラ３０は、所定の条件として、例えばコマンドＣＭＤ２に基づくＮＬＢが、対応するＮＬＢが最も大きいコマンドのＮＬＢよりも小さいかどうかを確認する（ステップＳ２２）。尚、本処理において、所定の条件を満たしたかどうかは、少なくともＮＬＢに基づいて判断されていれば良い。
【００８９】
それから、メモリコントローラ３０は、所定の条件を満たした場合に（ステップＳ２２、ＹＥＳ）、ステップＳ２４の処理によって、ＮＬＢの大きいコマンドに対応するディスクリプタの一部を破棄する（バッファ解放動作）。図１２（３）に示す例では、バッファ領域ＤＢ６及びＤＢ７に格納されたコマンドＣＭＤ１のディスクリプタＣＭＤ１_Ｄ１及びＣＭＤ１_Ｄ２が破棄されている。
【００９０】
続けて、メモリコントローラ３０は、ステップＳ１５の処理によって、コマンドＣＭＤ２に基づいたディスクリプタの転送をホスト機器２に要求し、ホスト機器２は、ステップＳ１６の処理によって、要求されたディスクリプタをメモリコントローラ３０に転送する（図１２（４））。そして、メモリコントローラ３０は、ステップＳ１７の処理によって、コマンドＣＭＤ２に対応するディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１をバッファ領域ＤＢ６及びＤＢ７にそれぞれ格納する。ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１のデータ転送量は、１６ＫＢ、８ＫＢにそれぞれ設定されており、破棄されたディスクリプタよりもデータ転送量が大きい。次に、メモリコントローラ３０は、ステップＳ１８の処理によって、ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１に対応するデータ領域の割り当てをホスト機器２に指示する。それから、メモリコントローラ３０は、ステップＳ１９の処理によって、コマンドＣＭＤ２及びディスクリプタＣＭＤ２_Ｄ０〜１に基づいた動作、すなわちディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１によって転送領域ＴＡ内に割り当てられたデータ領域を用いてコマンドＣＭＤ２に基づいた動作を実行する（図１２（５））。その他の動作は、ディスクリプタ数に基づくバッファ解放動作と同様のため、説明を省略する。
【００９１】
（コマンド種別に基づくバッファ解放動作）
次に、コマンド種別に基づくバッファ解放動作について説明する。コマンド種別は、当該コマンドに基づいて実行される動作の種類を示している。例えば、コマンド種別は、読み出し動作、書き込み動作等のうち何れかの動作に対応している。
【００９２】
実施形態に係るメモリシステム１は、コマンド種別に基づくバッファ解放動作を実行する場合、フェッチ済みのディスクリプタにおいて優先度の低いコマンド種別に対応するコマンドに基づいたディスクリプタを、バッファ解放動作の対象とする。
【００９３】
図１３は、実施形態に係るメモリシステム１における、ＮＬＢに基づくバッファ解放動作の一例を示す模式図である。メモリコントローラ３０が、ステップＳ１３の処理によって、コマンドバッファ４０に格納されたコマンドに基づいてディスクリプタをフェッチすると、ディスクリプタバッファ４１が一杯になることがある（ステップＳ２０、ＮＯ）。図１３（１）に示す例では、ディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４のコマンド種別が書き込み（Write）に設定され、ディスクリプタＣＭＤ１_Ｄ０〜ＣＭＤ１_Ｄ２のコマンド種別が読み出し（Read）に設定されている。また、書き込み（Write）は優先度が低く、読み出し（Read）は優先度が高く、設定されている。
【００９４】
メモリコントローラ３０は、コマンドＣＭＤ２を受信すると（図１３（２））、ステップＳ２１の処理によって受信したコマンドの属性（本例では、コマンド種別）を確認する。そして、メモリコントローラ３０は、所定の条件として、コマンドＣＭＤ２のコマンド種別の優先度が、フェッチ済みのコマンドＣＭＤ０及びＣＭＤ１のコマンド種別よりも高いかどうかを確認する（ステップＳ２２）。尚、本処理において、所定の条件を満たしたかどうかは、少なくともコマンド種別に基づいて判断されていれば良い。
【００９５】
それから、メモリコントローラ３０は、所定の条件を満たした場合に（ステップＳ２２、ＹＥＳ）、ステップＳ２４の処理によってメモリコントローラ３０は、優先度の低いコマンド種別に属するコマンドに基づいてフェッチしたディスクリプタの一部を破棄する（バッファ解放動作）。図１３（３）に示す例では、バッファ領域ＤＢ３及びＤＢ４に格納されたコマンドＣＭＤ０のディスクリプタＣＭＤ０_Ｄ３及びＣＭＤ０_Ｄ４が破棄されている。
【００９６】
続けて、メモリコントローラ３０は、ステップＳ１５の処理によって、コマンドＣＭＤ２に基づいたディスクリプタの転送をホスト機器２に要求し、ホスト機器２は、ステップＳ１６の処理によって、要求されたディスクリプタをメモリコントローラ３０に転送する（図１３（４））。そして、メモリコントローラ３０は、ステップＳ１７の処理によって、コマンドＣＭＤ２に対応するディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１をバッファ領域ＤＢ６及びＤＢ７にそれぞれ格納する。ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１のコマンド種別は、読み出しに設定されている。次に、メモリコントローラ３０は、ステップＳ１８の処理によって、ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１に対応するデータ領域の割り当てをホスト機器２に指示する。それから、メモリコントローラ３０は、ステップＳ１９の処理によって、コマンドＣＭＤ２及びディスクリプタＣＭＤ２_Ｄ０〜１に基づいた動作、すなわちディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１によって転送領域ＴＡ内に割り当てられたデータ領域を用いてコマンドＣＭＤ２に基づいた動作を実行する（図１３（５））。その他の動作は、ディスクリプタ数に基づくバッファ解放動作と同様のため、説明を省略する。
【００９７】
（優先度情報に基づくバッファ解放動作）
次に、優先度情報に基づくバッファ解放動作について説明する。優先度情報としては、例えば書き込みの優先度設定や、データの転送方法や、レイテンシ情報や、Data Set Managementの値等、あらゆるパラメータを利用することが出来る。
【００９８】
ここで、優先度情報における優先度の設定方法の一例について説明する。メモリシステム１は、ディスクリプタバッファ４１が複数のコマンドＣＭＤにそれぞれ対応する複数組のディスクリプタを保持することによって、複数の半導体記憶装置１０に対する並列処理が出来る場合がある。そして、メモリシステム１は、必要なディスクリプタ数が多いコマンドＣＭＤよりも、必要なディスクリプタ数が少ないコマンドＣＭＤを複数組保持した方が、並列処理が出来る可能性が高くなる。このため、優先度の設定方法としては、必要なディスクリプタ数が多いコマンドＣＭＤの優先度よりも、必要なディスクリプタ数が少ないコマンドＣＭＤの優先度の方を高くすることが考えられる。
【００９９】
具体例として、データの転送方法が優先度情報として使用される場合の優先度の設定例について簡潔に述べる。データの転送方法としては、シーケンシャル転送とランダム転送とが挙げられる。そして、シーケンシャル転送は、指定するアドレスの数がランダム転送よりも少ないため、ランダム転送よりもディスクリプタ数が少なくて済む傾向がある。このため、データの転送方法を優先度情報として使用する場合、例えばシーケンシャル転送の優先度が高（High）に設定され、ランダム転送が低（Low）に設定される。
【０１００】
実施形態に係るメモリシステム１は、優先度情報に基づくバッファ解放動作を実行する場合、フェッチ済みのディスクリプタにおいて優先度の低い動作に対応するコマンドに基づいたディスクリプタを、バッファ解放動作の対象とする。
【０１０１】
図１４は、実施形態に係るメモリシステム１における、優先度に基づくバッファ解放動作の一例を示す模式図である。メモリコントローラ３０が、ステップＳ１３の処理によって、コマンドバッファ４０に格納されたコマンドに基づいてディスクリプタをフェッチすると、ディスクリプタバッファ４１が一杯になることがある（ステップＳ２０、ＮＯ）。図１４（１）に示す例では、ディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４の優先度がLowに設定され、ディスクリプタＣＭＤ１_Ｄ０〜ＣＭＤ１_Ｄ２の優先度がHighに設定されている。具体的には、例えば、優先度がLowであるディスクリプタＣＭＤ０_Ｄ０〜ＣＭＤ０_Ｄ４は、ランダム転送に対応し、優先度がHighであるディスクリプタＣＭＤ１_Ｄ０〜ＣＭＤ１_Ｄ２は、シーケンシャル転送に対応している。
【０１０２】
その後、メモリコントローラ３０は、コマンドＣＭＤ２を受信すると（図１４（２））、ステップＳ２１の処理によって受信したコマンドの属性（本例では、優先度情報）を確認する。そして、メモリコントローラ３０は、所定の条件として、コマンドＣＭＤ２の優先度情報に基づいた優先度が、フェッチ済みのコマンドＣＭＤ０及びＣＭＤ１よりも高いかどうかを確認する（ステップＳ２２）。尚、本処理において所定の条件を満たしたかどうかは、少なくとも優先度情報に基づいて判断されていれば良い。
【０１０３】
それから、メモリコントローラ３０は、所定の条件を満たした場合に（ステップＳ２２、ＹＥＳ）、ステップＳ２４の処理によって優先度がLowであるコマンドに対応するディスクリプタの一部を破棄する。図１４（３）に示す例では、バッファ領域ＤＢ３及びＤＢ４に格納されたコマンドＣＭＤ０のディスクリプタＣＭＤ０_Ｄ３及びＣＭＤ０_Ｄ４が破棄されている。
【０１０４】
続けて、メモリコントローラ３０は、コマンドＣＭＤ２に基づいたディスクリプタの転送をホスト機器２に要求する（図１４（４））。そして、メモリコントローラ３０は、コマンドＣＭＤ２に対応するディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１をバッファ領域ＤＢ６及びＤＢ７にそれぞれ格納する。ディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１は、優先度Highに設定されており、破棄されたディスクリプタよりも優先度が高い設定になっている。次に、メモリコントローラ３０は、コマンドＣＭＤ２及びディスクリプタＣＭＤ２_Ｄ０〜１に基づいた動作、すなわちディスクリプタＣＭＤ２_Ｄ０及びＣＭＤ２_Ｄ１によって転送領域ＴＡ内に割り当てられたデータ領域を用いてコマンドＣＭＤ２に基づいた動作を実行する（図１４（５））。その他の動作は、ディスクリプタ数に基づくバッファ解放動作と同様のため、説明を省略する。
【０１０５】
［３］実施形態の効果
実施形態に係るメモリシステム１に依れば、メモリシステム１の動作を高速化することが出来る。以下に、実施形態に係るメモリシステム１の詳細な効果について説明する。
【０１０６】
ＳＳＤ等のメモリシステム１は、ホスト機器２の指示に基づいた動作を実行する際に、実行するコマンドに基づいたディスクリプタの転送をホスト機器２に要求する。そして、ホスト機器２は、メモリシステム１から要求されたディスクリプタをメモリシステムに転送する。ＮＶＭｅでは、このようなコマンドに基づいたディスクリプタの転送方式として、ＰＲＰ及びＳＧＬが使用される。ＰＲＰ及びＳＧＬのそれぞれは、Scatter/Gather転送を可能とするために、ディスクリプタチェインを構成している。
【０１０７】
ＰＲＰ及びＳＧＬに対応するディスクリプタは、ホスト機器２内のディスクリプタメモリＤＭに格納されている。このため、メモリコントローラ３０は、ホスト機器２とメモリシステム１との間のデータ転送を行う前に、ディスクリプタメモリＤＭに格納されたディスクリプタのフェッチをする必要がある（プリフェッチ）。メモリコントローラ３０は、プリフェッチしたデータを、例えばディスクリプタバッファ４１に格納する。
【０１０８】
ディスクリプタバッファ４１に対しては、例えばコマンド毎に固定領域を割り当てることが考えられる。この場合、ディスクリプタバッファ４１における領域の管理が容易になり、同時に実行することが可能なコマンドの数が常に一定（ディスクリプタバッファ４１に格納出来る最大のコマンド数）になる。
【０１０９】
一方で、固定領域よりも大きい領域を必要とするコマンドには、１つのコマンドに対して複数の固定領域が割り当てられる。この場合、割り当てられた固定領域内に使用されない領域が発生し得る。また、複数の固定領域が割り当てられたコマンドにおいて、対応するディスクリプタの転送サイズが小さい場合、ディスクリプタバッファ４１に格納されたディスクリプタによる合計の転送サイズが小さくなる。すなわち、メモリシステム１及びホスト機器２間のデータ転送量が少なくなり、メモリシステム１の転送性能が低下するおそれがある。また、複数の固定領域を必要とするコマンドが多くなると、メモリシステム１がプリフェッチすることが出来るコマンドの数が少なくなる。この場合、メモリシステム１には、並列で処理することが可能なコマンドをプリフェッチすることが出来なくなる可能性が生じ得る。
【０１１０】
また、ディスクリプタバッファ４１に対しては、コマンド毎に必要な領域を割り当てることが考えられる。この場合、ディスクリプタバッファ４１の使用領域が大きいコマンドに対して、適切な領域が割り当てられる。このため、メモリコントローラ３０は、空き領域が少なくなるようにディスクリプタバッファ４１の領域を管理することが出来、プリフェッチするコマンドの数が少なくなることを抑制することが出来る。一方で、ディスクリプタバッファ４１の使用領域が大きく、且つ並列処理することが出来ない複数のコマンドがプリフェッチされる場合も考えられる。この場合には、メモリシステム１及びホスト機器２間のデータ転送量が少なくなり、メモリシステム１の転送性能が低下するおそれがある。
【０１１１】
以上のようなメモリ割り当て方法に対して転送性能の低下を抑制するためには、ディスクリプタバッファ４１の容量を大きくすることが考えられる。しかしながら、ディスクリプタバッファ４１の容量を大きくする場合には、大きな回路面積が必要となり、メモリシステム１の製造コストが高くなり得る。
【０１１２】
そこで、実施形態に係るメモリシステム１は、ディスクリプタバッファ４１を動的に解放し、再割り当てを実行する。言い換えると、実施形態に係るメモリシステム１は、優先度の低い動作のディスクリプタを一時的に破棄することによって、優先度の高い動作を優先的に処理する。
【０１１３】
具体的には、実施形態に係るメモリシステム１は、新規のコマンドを受信し、ディスクリプタバッファ４１の空きが足りている場合は、ディスクリプタのフェッチを実行する。そして、実施形態に係るメモリシステム１は、新規のコマンドを受信し、ディスクリプタバッファ４１の空きが足りない場合には、未使用ディスクリプタをディスクリプタバッファ４１から一時的に破棄し、その領域を新規のコマンドのディスクリプタのフェッチに用いる。
【０１１４】
実施形態に係るメモリシステム１において、ディスクリプタバッファ４１に格納されたディスクリプタの再割り当てのアルゴリズムは、様々な方法が使用され得る。例えば、実施形態に係るメモリシステム１は、ディスクリプタ数や、ＮＬＢや、コマンド種別や、優先度情報等に基づいて、ディスクリプタバッファ４１のバッファ解放動作を実行する。
【０１１５】
例えば、読み出し動作は、内部レイテンシが大きいため、複数の半導体記憶装置１０に対して並列実行可能なコマンド数が書き込み動作よりも多い。このため、新規のコマンドが読み出し動作に対応し、フェッチ済みのディスクリプタに書き込み動作に対応するものが含まれている場合、書き込み動作に対応するフェッチ済みのディスクリプタを破棄して、読み出し動作に対応するディスクリプタをフェッチすることが有効である。
【０１１６】
その結果、実施形態に係るメモリシステム１は、転送性能を柔軟に最適化することが出来、有限なメモリ容量下で転送性能を効率的に引き出すことが出来る。つまり、実施形態に係るメモリシステム１は、複数の半導体記憶装置１０の利用効率を向上することが出来る。尚、実施形態に係るメモリシステム１は、その他のアルゴリズムを利用した場合においても同様の効果を得ることが出来る。各アルゴリズムは、適宜カスタマイズされ、ユーザにとって最適な性能を向上し得る。
【０１１７】
［４］変形例等
実施形態のメモリシステムは、半導体記憶装置と、メモリコントローラとを含む。メモリコントローラは、半導体記憶装置と外部のホスト機器との間のデータ転送を制御し、コマンドバッファとディスクリプタバッファとを有する。メモリコントローラは、外部から受信した第１コマンドを前記コマンドバッファに格納し、格納した前記第１コマンドに基づいて前記ホスト機器から第１ディスクリプタをフェッチし、フェッチした前記第１ディスクリプタを前記ディスクリプタバッファに格納し、外部から受信した第２コマンドを前記コマンドバッファに格納し、未使用の前記第1ディスクリプタの一部を前記ディスクリプタバッファから破棄し、格納した前記第２コマンドに基づいて、ホスト機器から第２ディスクリプタをフェッチし、破棄した前記第１ディスクリプタの一部が格納されていたアドレスに、フェッチした前記第２ディスクリプタを格納する。これにより、実施形態に係るメモリシステムは、動作を高速化することが出来る。
【０１１８】
実施形態に係るメモリシステム１の動作説明では、ディスクリプタバッファ４１が一杯になった状態でメモリコントローラ３０が新たに１つのコマンドを受信する場合について例示したが、これに限定されない。メモリコントローラ３０は、コマンドバッファ４０の空きがある分、適宜新しいコマンドを受信し得る。そして、メモリコントローラ３０は、バッファ解放動作を適宜実行し得る。
【０１１９】
実施形態に係るメモリシステム１の動作説明では、ＮＶＭｅを一例として挙げたが、その他のインターフェイス規格においても同様に動作することが出来る。実施形態に係るメモリシステム１は、少なくともメモリコントローラ３０がフェッチ済み且つ対応する動作が未完了のディスクリプタを破棄し、ディスクリプタメモリＤＭの同じアドレスに格納されたディスクリプタを再フェッチする動作を実行していれば良い。
【０１２０】
本明細書において“同じディスクリプタ”とは、ディスクリプタメモリＤＭにおいて同じアドレスに格納されているディスクリプタのことを示している。実施形態において、バッファ解放動作におけるディスクリプタバッファ４１のバッファ領域の解放サイズは、適宜変更され得る。実施形態におけるメモリシステム１は、少なくとも新規のコマンドに対応するディスクリプタをフェッチすることが可能な分、バッファ領域ＤＢを解放していれば良い。
【０１２１】
実施形態では、バッファ解放動作のアルゴリズムとして複数種類説明したが、これらのアルゴリズムは組み合わされても良い。メモリシステム１は、例えばディスクリプタ数とＮＬＢとの両方を考慮して、バッファ解放動作を実行しても良い。その他のアルゴリズムについても同様に組み合わせ可能であり、３つ以上のアルゴリズムを用いて複合的にバッファ解放動作における優先度を決定しても良い。
【０１２２】
実施形態では、バッファ解放動作によって、動作が完了していないディスクリプタが破棄される場合について例示したが、これに限定されない。例えば、メモリコントローラ３０は、バッファ解放動作の対象であるディスクリプタが格納されているアドレスに、新規のコマンドに基づいたディスクリプタを上書きしても良い。この場合、上書きされたディスクリプタは、実施形態で説明した各バッファ解放動作における破棄されたディスクリプタと同様に扱われる。また、メモリコントローラ３０は、上書きされたディスクリプタをホスト機器２から再フェッチする際に、ディスクリプタの上書きを実行しても良い。このような場合においても、メモリシステムは、実施形態と同様の効果を得ることが出来る。
【０１２３】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことが出来る。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１２４】
１…メモリシステム、２…ホスト機器、１０…半導体記憶装置、１１…メモリセルアレイ、１２…コマンドレジスタ、１３…アドレスレジスタ、１４…シーケンサ、１５…ドライバモジュール、１６…ロウデコーダモジュール、１７…センスアンプモジュール、３０…メモリコントローラ、３１…ＣＰＵ、３２…ＲＡＭ、３３…ホストインターフェイス回路
３４…ＮＡＮＤインターフェイス回路、３５…ＤＲＡＭインターフェイス回路、４０…コマンドバッファ、４１…ディスクリプタバッファ、４２…キャッシュメモリ、４３…ＤＭＡコントローラ、ＢＬＫ…ブロック、ＳＵ…ストリングユニット、ＢＬ…ビット線、ＷＬ…ワード線、ＳＧＤ…選択ゲート線、ＳＧＳ…選択ゲート線、ＭＴ…メモリセルトランジスタ、ＳＴ１…選択トランジスタ、ＳＴ２…選択トランジスタ
【図１】
2020154493.tif 000003
【図２】
2020154493.tif 000004
【図３】
2020154493.tif 000005
【図４】
2020154493.tif 000006
【図５】
2020154493.tif 000007
【図６】
2020154493.tif 000008
【図７】
2020154493.tif 000009
【図８】
2020154493.tif 000010
【図９】
2020154493.tif 000011
【図１０】
2020154493.tif 000012
【図１１】
2020154493.tif 000013
【図１２】
2020154493.tif 000014
【図１３】
2020154493.tif 000015
【図１４】
2020154493.tif 000016