(57)【要約】【課題】記憶装置の性能を向上させる。【解決手段】  実施形態の記憶装置は、ホストからコマンドがライトされるコマンド格納領域と、ホストから、コマンド格納領域へのコマンドのライトを通知するためのコマンド発行通知がライトされるコマンド発行通知領域と、データを記憶する不揮発性記憶媒体と、ホストと通信し不揮発性記憶媒体へのアクセスを制御するコントローラと、を具備する。コントローラは、コマンド格納領域へ第１のコマンドがライトされたことを検出したことに応じて、第１のコマンドに対するコマンド発行通知が、コマンド発行通知領域にライトされる前に、第１のコマンドの実行に必要な第１のステップを実行する。【選択図】図１２
2018160155.tif 000002
【特許請求の範囲】
【請求項１】
ホストからコマンドがライトされるコマンド格納領域と、
前記ホストから、前記コマンド格納領域への前記コマンドのライトを通知するためのコマンド発行通知がライトされるコマンド発行通知領域と、
データを記憶する不揮発性記憶媒体と、
前記ホストと通信し前記不揮発性記憶媒体へのアクセスを制御するコントローラと、
を具備し、
前記コントローラは、
前記コマンド格納領域へ第１のコマンドがライトされたことを検出したことに応じて、
前記第１のコマンドに対する前記コマンド発行通知が、前記コマンド発行通知領域にライトされる前に、
前記第１のコマンドの実行に必要な第１のステップを実行する
記憶装置。
【請求項２】
前記コントローラは、
前記第１のコマンドが前記不揮発性記憶媒体からのデータのリードを要求するリードコマンドである場合に、
前記第１のステップとして、前記不揮発性記憶媒体へデータのリードを要求するリードリクエストを発行する
請求項１に記載の記憶装置。
【請求項３】
データを一時的に格納するバッファをさらに具備し、
前記コントローラは、
前記第１のコマンドが前記不揮発性記憶媒体からのデータのリードを要求するリードコマンドである場合に、
前記第１のステップとして、前記不揮発性記憶媒体からデータをリードし、前記データを前記バッファに格納する
請求項１に記載の記憶装置。
【請求項４】
前記コントローラは、
前記第１のコマンドに対する前記コマンド発行通知が前記コマンド発行通知領域にライトされたことに応じて、
前記バッファに格納した前記データを、前記ホストに送信する
請求項３に記載の記憶装置。
【請求項５】
データを一時的に格納するバッファをさらに具備し、
前記コントローラは、
ライトコマンドに応じて前記ホストから受信したデータを前記バッファに格納し、
前記第１のコマンドが前記バッファに格納された前記データの、前記不揮発性記憶媒体へのライトを要求するフラッシュコマンドである場合に、
前記第１のステップとして、前記不揮発性記憶媒体へデータのライトを要求するライトリクエストを発行する
請求項１に記載の記憶装置。
【請求項６】
データを一時的に格納するバッファをさらに具備し、
前記コントローラは、
ライトコマンドに応じて前記ホストから受信したデータを前記バッファに格納し、
前記第１のコマンドが前記バッファに格納された前記データの、前記不揮発性記憶媒体へのライトを要求するフラッシュコマンドである場合に、
前記第１のステップとして、前記バッファに格納された前記データを前記不揮発性記憶媒体へライトする
請求項１に記載の記憶装置。
【請求項７】
前記コントローラは、
前記第１のコマンドが前記不揮発性記憶媒体へのデータのライトを要求するライトコマンドである場合に、
前記第１のステップとして、前記不揮発性記憶媒体へデータのリードを要求するリードリクエストを発行する
請求項１に記載の記憶装置。
【請求項８】
前記コントローラは、
前記不揮発性記憶媒体との間で、第１の単位ごとにデータの転送をし、
前記ライトコマンドに応じて前記不揮発性記憶媒体へライトされるべきデータが、
前記第１の単位の一部である場合に、
前記第１のステップとして、前記不揮発性記憶媒体へ前記第１の単位のデータを含むデータのリードを要求するリードリクエストを発行する
請求項７に記載の記憶装置。
【請求項９】
データを一時的に格納するバッファをさらに具備し、
前記コントローラは、
前記不揮発性記憶媒体との間で、第１の単位ごとにデータの転送をし、
前記第１のコマンドが前記不揮発性記憶媒体へのデータのライトを要求するライトコマンドであり、
前記ライトコマンドに応じて前記不揮発性記憶媒体へライトされるべきデータが、
前記第１の単位の一部である場合に、
前記第１のステップとして、前記不揮発性記憶媒体から前記第１の単位のデータを含むデータをリードし、前記データを前記バッファに格納する
請求項１に記載の記憶装置。
【請求項１０】
前記コントローラは、
前記第１のコマンドに対する前記コマンド発行通知が前記コマンド発行通知領域にライトされたことに応じて、
前記ホストから前記ライトコマンドに応じたデータを受信する
請求項８に記載の記憶装置。
【請求項１１】
前記コントローラは、
前記第１のコマンドに対する前記コマンド発行通知が前記コマンド発行通知領域にライトされたことに応じて、
前記ホストから前記ライトコマンドに応じたデータを受信する
請求項９に記載の記憶装置。
【請求項１２】
データを記憶する不揮発性記憶媒体と、
前記不揮発性記憶媒体へのアクセスを制御するコントローラと、
を具備し、
前記コントローラは、
前記ホストからコマンドを受信した後、前記ホストからコマンド発行通知を受信する前に、
前記コマンドの実行を開始する
記憶装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、記憶装置に関する。
【背景技術】
【０００２】
記憶装置、例えば不揮発性半導体メモリを有する半導体記憶装置においては、半導体プロセスの微細化が進み、メモリセルからのデータのリード時間の増大、また、メモリセルへのデータのプログラム時間の増大による性能の低下が問題となっている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１２−１３２６４４号明細書
【特許文献２】特開２０１１−１７５６６６号明細書
【特許文献３】特開２０００−２５０７１５号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明が解決しようとする課題は、記憶装置の性能を向上させることにある。
【課題を解決するための手段】
【０００５】
上記課題を達成するために、実施形態の記憶装置は、ホストからコマンドがライトされるコマンド格納領域と、ホストから、コマンド格納領域へのコマンドのライトを通知するためのコマンド発行通知がライトされるコマンド発行通知領域と、データを記憶する不揮発性記憶媒体と、ホストと通信し不揮発性記憶媒体へのアクセスを制御するコントローラと、を具備する。コントローラは、コマンド格納領域へ第１のコマンドがライトされたことを検出したことに応じて、第１のコマンドに対するコマンド発行通知が、コマンド発行通知領域にライトされる前に、第１のコマンドの実行に必要な第１のステップを実行する。
【図面の簡単な説明】
【０００６】
【図１】第１の実施形態の記憶装置の構成を説明するブロック図である。
【図２】第１の実施形態に係るファームウェアの実行により実現される各種機能部を説明する図である。
【図３】第１の実施形態に係るデータの単位を説明する図である。
【図４】第１の実施形態に係るＮＡＮＤメモリの構成を説明する図である。
【図５】第１の実施形態に係るリード動作について説明する図である。
【図６】第１の実施形態に係るライト動作について説明する図である。
【図７】第１の実施形態に係るホストインタフェース制御部の構成を説明するブロック図である。
【図８】第１の実施形態に係るアドレスマップを説明する図である。
【図９】第１の実施形態に係るホストからのコマンドの発行を説明する図である。
【図１０】第１の実施形態に係るホストへのコマンド完了報告を説明する図である。
【図１１】第１の実施形態に係るコマンドの実行プロトコルを説明する図である。
【図１２】第１の実施形態に係るリードコマンドの実行方法について説明する図である。
【図１３】第２の実施形態に係るリードコマンドの実行手順を説明するフローチャートである。
【図１４】第２の実施形態に係るライトコマンド実行時のデータの流れの例を説明する図である。
【図１５】第２の実施形態に係るライトコマンド実行時のデータの流れの別の例を説明する図である。
【図１６】第２の実施形態に係るフラッシュコマンドの実行方法について説明する図である。
【図１７】第２の実施形態に係るフラッシュコマンドの実行手順を説明するフローチャートである。
【図１８】第３の実施形態に係るリード・モディファイ・ライト処理を説明する図である。
【図１９】第３の実施形態に係るライトコマンドの実行方法について説明する図である。
【図２０】第３の実施形態に係るライトコマンドの実行手順を説明するフローチャートである。
【図２１】第４の実施形態に係るコマンド書き換えの例を説明する図である。
【図２２】第４の実施形態に係るコマンド書き換えの別の例を説明する図である。
【図２３】第４の実施形態に係るコマンドの先行実行の制限の例を説明する図である。
【発明を実施するための形態】
【０００７】
以下、実施形態の記憶装置を、図面を参照して説明する。なお、以下の説明において、同一の機能及び構成を有する構成要素については、共通する参照符号を付す。
【０００８】
［第１の実施形態］
図１は、第１の実施形態の記憶装置の構成を説明するブロック図である。
【０００９】
記憶装置１０は、ホスト２０と通信可能である。記憶装置１０は、コントローラ１００と、不揮発性記憶媒体２００と、バッファ３００と、を含む。
【００１０】
コントローラ１００は、ホスト２０と通信し、記憶装置１０全体の動作を制御する。コントローラ１００は、例えばＳｏＣ（Ｓｙｓｔｅｍ  ｏｎ  ａ  Ｃｈｉｐ）として構成される半導体集積回路である。
【００１１】
本実施形態の説明では、ホスト２０はＮＶＭｅ（ＮＶＭ  Ｅｘｐｒｅｓｓ）（登録商標）規格に適合したインタフェースをサポートするコンピュータであるが、これに限定されるものではない。
【００１２】
ホスト２０は、記憶装置１０へのデータのリード又はライトを実行する際に、例えば、論理アドレスとしてのＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓｉｎｇ）を利用する。ＬＢＡは、例えば、セクタ（例えば５１２Ｂのサイズを有する）に対して０からの通し番号をつけた論理アドレスである。また、ホスト２０は、所望のキー情報を論理アドレスとして利用してもよい。記憶装置１０は、論理アドレスと、不揮発性記憶媒体２００の物理アドレスとを、図示しない論物変換テーブルを用いて関連付ける。
【００１３】
不揮発性記憶媒体２００は、データを不揮発的に（永続的に）記憶する。本実施形態の不揮発性記憶媒体２００はＮＡＮＤ型フラッシュメモリであるが、これに限定されるものではない。例えば、３次元構造フラッシュメモリ、ＮＯＲ型フラッシュメモリ、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）などの不揮発性半導体メモリや、磁気ディスク、光ディスクなどのディスク媒体であってもよい。以下の説明においては、不揮発性記憶媒体２００をＮＡＮＤメモリ２００と表記することがある。
【００１４】
本実施形態の記憶装置１０は４チャネル（Ｃｈ）のＮＡＮＤメモリ２００を有する。コントローラ１００は、各チャネルに接続されたＮＡＮＤメモリ２００を並列に制御可能である。１つのチャネルに複数のＮＡＮＤメモリ２００、すなわち複数のメモリチップが接続されてもよい。以下では各チャネルに接続されているＮＡＮＤメモリ２００をＮＡＮＤメモリＣｈ０〜Ｃｈ３と表記する。チャネルの数は４より多くても少なくてもよい。
【００１５】
バッファ３００は、データを揮発的に（一時的に）に記憶する。バッファ３００に記憶されるデータには、（１）ホスト２０から受信したデータ、（２）ＮＡＮＤメモリ２００からリードしたデータ、（３）コントローラ１００が記憶装置１０を制御するにあたり必要な情報、などがある。
【００１６】
本実施形態のバッファ３００はＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）であるが、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）など他の種類の汎用メモリでもよい。バッファ３００は、コントローラ１００に内蔵されていてもよい。
【００１７】
コントローラ１００は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１０と、ホストインタフェース（ＩＦ）制御部１２０と、バッファ制御部１４０と、メモリインタフェース（ＩＦ）制御部１６０と、を含む。
【００１８】
ＣＰＵ１１０は、ＦＷ（Ｆｉｒｍｗａｒｅ）に基づき記憶装置１０全体の制御を行う。図２は、ＣＰＵ１１０がＦＷを実行することによって実現する各種機能部を示す図である。ＣＰＵ１１０は、記憶装置１０全体を制御する処理部１１２として機能する。処理部１１２は、ホスト処理部１１４と、バッファ処理部１１６と、メモリ処理部１１８と、を含む。ホスト処理部１１４は、ホストＩＦ制御部１２０を主に制御する。バッファ処理部１１６は、バッファ制御部１４０を主に制御する。メモリ処理部１１８は、メモリＩＦ制御部１６０を主に制御する。
【００１９】
ＣＰＵ１１０は、コントローラ１００に内蔵せず、別個の半導体集積回路としてもよい。また、以下の説明においてＦＷにより実行される機能の一部、又は、全部は専用のＨＷ（Ｈａｒｄｗａｒｅ）によっても実行可能であり、ＨＷにより実行される機能の一部、又は、全部をＦＷによって実行することも可能である。
【００２０】
図１に戻って説明を続ける。
【００２１】
ホストＩＦ制御部１２０は、ホスト２０から受信したコマンドの解釈や実行などを行う。ホストＩＦ制御部１２０の詳細な構成については後述する。
【００２２】
バッファ制御部１４０は、バッファ３００へのデータのライト、リードの制御、及び、バッファ３００の空き領域の管理などを行う。
【００２３】
メモリＩＦ制御部１６０は、複数のＮＡＮＤ制御部１６２を含む。ＮＡＮＤ制御部１６２は、ＮＡＮＤメモリＣｈ０〜Ｃｈ３のそれぞれに接続される（以下、ＮＡＮＤ制御部Ｃｈ０〜Ｃｈ３と表記することがある）。ＮＡＮＤ制御部１６２は、ＮＡＮＤメモリ２００へのデータのライト、リード、イレース等の動作を制御する。
【００２４】
次に、図３ａ〜図３ｃを参照して、本実施形態に係るデータの単位について説明する。
【００２５】
図３ａに示すように、ＮＡＮＤメモリ２００に対するデータのリードライトにおける最小管理単位はクラスタと呼ばれる。本実施形態ではクラスタのサイズは４ｋＢである。１つのクラスタは例えば８セクタのデータを含む。
【００２６】
図３ｂに示すように、ＮＡＮＤメモリ２００のデータのリードライトが可能な最小の回路構成の単位は物理ページと呼ばれる。本実施形態では物理ページのサイズは１６クラスタ（４ｋＢ×１６クラスタ＝６４ｋＢ）である。
【００２７】
図３ｃに示すように、ＮＡＮＤメモリ２００のデータのイレースが可能な最小の回路構成の単位は物理ブロックと呼ばれる。本実施形態では物理ブロックのサイズは１６物理ページ（６４ｋＢ×１６物理ページ＝１０２４ｋＢ）である。
【００２８】
これら各単位のサイズは一例であり、これらの値に限定されるものではない。
【００２９】
次に、図４を参照して、本実施形態に係るＮＡＮＤメモリ２００の構成を説明する。
【００３０】
ＮＡＮＤメモリ２００は、ページバッファ２０２と、メモリセルアレイ２０４と、を含む。ページバッファ２０２はデータを一時的に格納する。メモリセルアレイ２０４はデータを不揮発的に記憶する。
【００３１】
本実施形態ではページバッファ２０２のサイズは１物理ページ分のデータのサイズに等しい。すなわち、ページバッファ２０２のサイズは１６クラスタ（６４ｋＢ）である。ページバッファ２０２に格納されたデータは、一度にメモリセルアレイ２０４にライト（プログラム）することができる。また、メモリセルアレイ２０４からリードしたデータは、一度にページバッファ２０２に格納することができる。
【００３２】
次に、図５ａ及び図５ｂを参照して、本実施形態におけるＮＡＮＤメモリ２００からのリード動作について説明する。
【００３３】
図５ａに示すように、ＮＡＮＤメモリ２００は、メモリセルアレイ２０４から物理ページ単位でデータをリードする。ＮＡＮＤメモリ２００は、リードしたデータをページバッファ２０２に格納する。ＮＡＮＤメモリ２００は、ページバッファ２０２に格納されたリードデータを、クラスタ単位でコントローラ１００へ出力する。コントローラ１００は、出力されたリードデータを、バッファ３００に格納する。
【００３４】
図５ｂは、リード動作のタイミングチャートである。
【００３５】
コントローラ１００は、ＮＡＮＤメモリ２００へリード動作を要求するために、リードリクエストを発行する（Ｓ１００）。次に、コントローラ１００は、リード対象のアドレスをＮＡＮＤメモリ２００へ入力する（Ｓ１０１）。ＮＡＮＤメモリ２００は、時間ｔＲをかけて、対象のデータをメモリセルアレイ２０４からリードし、リードしたデータをページバッファ２０２へ格納する。この間、ＮＡＮＤメモリ２００は、コントローラ１００へ、ＢＵＳＹ信号をアサートする。
【００３６】
ＢＵＳＹ信号がネゲートされると、コントローラ１００は、ＮＡＮＤメモリ２００へデータアウトリクエストを発行する（Ｓ１０２）。データアウトリクエストを受信したＮＡＮＤメモリ２００は、ページバッファ２０２に格納されたデータをコントローラ１００へ出力する（Ｓ１０３）。
【００３７】
次に、図６ａ及び図６ｂを参照して、本実施形態におけるＮＡＮＤメモリ２００へのライト動作について説明する。
【００３８】
図６ａに示すように、コントローラ１００はクラスタ単位でデータをページバッファ２０２にライトする。ＮＡＮＤメモリ２００は、ページバッファ２０２に格納されたライトデータを、物理ページ単位でメモリセルアレイ２０４にライトする。
【００３９】
図６ｂは、ライト動作のタイミングチャートである。
【００４０】
コントローラ１００は、ＮＡＮＤメモリ２００へライト動作を要求するために、ライトリクエストを発行する（Ｓ２００）。次に、コントローラ１００は、ライト対象のアドレスをＮＡＮＤメモリ２００へ入力する（Ｓ２０１）。次に、コントローラ１００は、ライトデータをページバッファ２０２にライトする（Ｓ２０２）。
【００４１】
ＮＡＮＤメモリ２００は、時間ｔＰｒｏｇをかけて、対象のデータをメモリセルアレイ２０４へライトする。この間、ＮＡＮＤメモリ２００は、コントローラ１００へ、ＢＵＳＹ信号をアサートする。
【００４２】
次に、図７を参照して、本実施形態に係るホスト２０、及び、ホストＩＦ制御部１２０の構成を説明する。
【００４３】
ホスト２０は、ホストコントローラ２２と、ホストブリッジ２４と、ホストメモリ２６と、を含む。
【００４４】
ホストコントローラ２２及びホストメモリ２６は、ホストブリッジ２４に接続される。
【００４５】
ホストコントローラ２２は、ホスト２０における各種制御を実施する。
【００４６】
ホストメモリ２６は、ホストコントローラ２２により生成されるデータ、周辺装置などとの間で交換されるデータなどを記憶する。ホストメモリ２６は、第１領域と、第２領域と、を含む。第１領域は、コンプリーションキュー（ＣＱ）２８を含む。コンプリーションキュー２８は、記憶装置１０が実行を完了したコマンドの完了情報を格納する。本実施形態のコンプリーションキュー２８は、８つのコマンド完了情報を格納する領域（ＣＱ＃０〜ＣＱ＃７）を含むものとするが、これに限定されるものではない。第２領域は、ホストデータバッファ３０を含む。ホストデータバッファ３０は、記憶装置１０との間のデータ転送に用いられる。
【００４７】
ホストブリッジ２４は、記憶装置１０などの周辺装置が接続されるインタフェースを有している。このインタフェースには、例えば、ＮＶＭｅインタフェースがある。
【００４８】
ホストＩＦ制御部１２０は、ホストインタフェース（ＩＦ）１２２と、ドアベル１２４と、ＣＱ  Ｈｅａｄポインタ１２６と、ＳＱ  Ｔａｉｌポインタ１２８と、コマンドセット監視部１３０と、サブミッションキュー（ＳＱ）１３２と、コマンド実行部１３４と、を含む。
【００４９】
ホストＩＦ１２２は、ホストブリッジ２４に接続される。ホストＩＦ１２２は、ホスト２０からドアベル１２４及びサブミッションキュー１３２へのアクセスのインタフェースとなる。
【００５０】
サブミッションキュー（ＳＱ）１３２は、例えばＳＲＡＭから成る。サブミッションキュー（ＳＱ）１３２は、ＤＲＡＭや、レジスタでもよい。ホスト２０は、サブミッションキュー１３２にコマンドをライトする。すなわちサブミッションキュー１３２は、コマンド格納領域として機能する。本実施形態のサブミッションキュー１３２は、８つのコマンドを格納する領域（ＳＱ＃０〜ＳＱ＃７）を含むものとするが、これに限定されるものではない。
【００５１】
ホスト２０は、ドアベル１２４をライトすることにより、ＣＱ  Ｈｅａｄポインタ１２６及びＳＱ  Ｔａｉｌポインタ１２８を操作する。ＣＱ  Ｈｅａｄポインタ１２６及びＳＱ  Ｔａｉｌポインタ１２８のそれぞれは、例えばレジスタと、加算回路などの演算回路から構成されるが、これに限定されるものではない。ホスト２０は、コマンド完了情報を受信した時にＣＱ  Ｈｅａｄポインタ１２６を操作する。ホスト２０は、コマンドを発行する時にＳＱ  Ｔａｉｌポインタ１２８を操作する。詳細については後述する。
【００５２】
コマンドセット監視部１３０は、サブミッションキュー１３２へのコマンドのライトを監視する。コマンド実行部１３４は、ホスト２０との通信インタフェースに適合したプロトコルでコマンドの実行を行う。また、コマンド実行部１３４は、バッファ制御部１４０との間でデータの送受信を行う。
【００５３】
記憶装置１０は、ホスト２０に対し、ドアベル１２４及びサブミッションキュー１３２へのアクセスを許可する。図８は、本実施形態に係るアドレスマップを説明するための図である。
【００５４】
ホスト２０は、アドレス＝０ｘ１００８またはアドレス＝０ｘ１００Ｃをアクセスすることによりドアベル１２４にアクセスすることができる。ホスト２０は、アドレス＝０ｘ１００８をアクセスすることにより、ＳＱ  Ｔａｉｌポインタ１２８を操作することができる。アドレス＝０ｘ１００８はＳＱ  Ｔａｉｌドアベルと称される。ホスト２０は、アドレス＝０ｘ１００Ｃをアクセスすることにより、ＣＱ  Ｈｅａｄポインタ１２６を操作することができる。アドレス＝０ｘ１００ＣはＣＱ  Ｈｅａｄドアベルと称される。
【００５５】
ホスト２０は、アドレス＝０ｘ１００００をアクセスすることにより、サブミッションキュー１３２の第１コマンド領域（ＳＱ＃０）にアクセスすることができる。同様に、ホスト２０は、アドレス＝０ｘ１００４０〜０ｘ１０１Ｃ０をアクセスすることにより、サブミッションキュー１３２の第２コマンド領域（ＳＱ＃１）〜第８コマンド領域（ＳＱ＃７）にそれぞれアクセスすることができる。
【００５６】
次に、図９ａ及び図９ｂを参照して、本実施形態に係るホストからのコマンドの発行について説明する。
【００５７】
図９ａは、コマンド発行前のサブミッションキュー１３２の状態を示す。ＳＱ＃０〜ＳＱ＃７のいずれにもコマンドは格納されていない。また、ＳＱ  Ｔａｉｌポインタ１２８はＳＱ＃０を示している。
【００５８】
図９ｂは、ホスト２０がＣＭＤ＃０〜ＣＭＤ＃３の４つのコマンドを発行した後の状態を示す。ＣＭＤ＃０〜ＣＭＤ＃３はそれぞれＳＱ＃０〜ＳＱ＃３に格納されている。ホスト２０は、ＳＱ  ＴａｉｌドアベルにＳＱ  Ｔａｉｌポインタ１２８の値をライトすることにより、ＳＱ  Ｔａｉｌポインタ１２８を操作する。ここではホスト２０は、ＳＱ  Ｔａｉｌドアベルに、ＳＱ  Ｔａｉｌポインタ１２８がＳＱ＃４を指すような値をライトしたものとする。ＳＱ  Ｔａｉｌポインタ１２８がＳＱ＃４を示すことにより、ＳＱ＃０〜ＳＱ＃３に格納されたＣＭＤ＃０〜ＣＭＤ＃３が有効となり、記憶装置１０は各コマンドの実行を開始することができる。すなわち、ＳＱ  Ｔａｉｌドアベルを介したＳＱ  Ｔａｉｌポインタ１２８の操作は、コマンド発行通知として機能する。
【００５９】
次に、図１０ａ及び図１０ｂを参照して、本実施形態に係るホストへのコマンドの実行完了報告について説明する。
【００６０】
図１０ａは、コマンドの実行完了報告前のコンプリーションキュー２８の状態を示す。ＣＱ＃０〜ＣＱ＃７のいずれにもコマンド完了情報は格納されていない。また、ＣＱ  Ｈｅａｄポインタ１２６はＣＱ＃０を示している。
【００６１】
記憶装置１０は、コマンドの実行が完了すると、コマンド完了情報をコンプリーションキュー２８にライトする。図１０ｂは、記憶装置１０がＣＭＤ＃０〜ＣＭＤ＃３の４つのコマンド完了情報をライトした後の状態を示す。ＣＭＤ＃０〜ＣＭＤ＃３はそれぞれＣＱ＃０〜ＣＱ＃３に格納されている。記憶装置１０は、コンプリーションキュー２８にコマンド完了情報をライトすると、ホスト２０に割り込み（ｉｎｔｅｒｒｕｐｔ）を通知する。
【００６２】
割り込みの通知を受けたホスト２０は、コンプリーションキュー２８をリードし、コマンド完了情報を取得する。そしてホスト２０は、ＣＱ  ＨｅａｄドアベルにＣＱ  Ｈｅａｄポインタ１２６の値をライトすることにより、ＣＱ  Ｈｅａｄポインタ１２６を操作する。ここではホスト２０は、ＣＱ  Ｈｅａｄドアベルに、ＣＱ  Ｈｅａｄポインタ１２６がＣＱ＃１を指すような値をライトしたものとする。ＣＱ  Ｈｅａｄポインタ１２６がＣＱ＃１を示すことにより、記憶装置１０は、ホスト２０がＣＱ＃０に格納されたＣＭＤ＃０のコマンド完了情報を取得したということを、認識することができる。
【００６３】
次に、図１１ａ〜図１１ｃを参照して、本実施形態に係るコマンドの実行プロトコルを説明する。本実施形態においては、記憶装置１０は、ＮＶＭｅ規格に適合した実行プロトコルで各種コマンドを実行する。
【００６４】
図１１ａは、リードコマンドのプロトコルを説明するための図である。
【００６５】
ホスト２０は、記憶装置１０に、リードコマンドを発行する（Ｓ３００）。より具体的には、ホスト２０は、サブミッションキュー１３２にリードコマンドをライトする。次にホスト２０は、ＳＱ  ＴａｉｌドアベルにＳＱ  Ｔａｉｌポインタ１２８の値をライトし、リードコマンドの発行を記憶装置１０に対して通知する（Ｓ３０１）。リードコマンドは、開始ＬＢＡ、転送数、リードデータを格納するホストデータバッファ３０のアドレスを含む。
【００６６】
記憶装置１０は、開始ＬＢＡ及び転送数で指定されたリードデータを、ホスト２０に転送する（Ｓ３０２）。この時、記憶装置１０は、リードコマンドで指定されたアドレスに対応するホストデータバッファ３０に、リードデータをライトする。ホストデータバッファ３０へのリードデータのライトが完了すると、記憶装置１０は、コンプリーションキュー２８にリードコマンドの完了情報をライトする（Ｓ３０３）。次に記憶装置１０は、ホスト２０に対して割り込みを通知する（Ｓ３０４）。割り込みの通知を受けたホスト２０は、コンプリーションキュー２８からリードコマンドの完了情報を取得する。ホスト２０は、ＣＱ  ＨｅａｄドアベルにＣＱ  Ｈｅａｄポインタ１２６の値をライトし、リードコマンドの完了情報を取得したことを、記憶装置１０に対して通知する（Ｓ３０５）。
【００６７】
図１１ｂは、ライトコマンドのプロトコルを説明するための図である。
【００６８】
ホスト２０は、記憶装置１０に、ライトコマンドを発行する（Ｓ３１０）。より具体的には、ホスト２０は、サブミッションキュー１３２にライトコマンドをライトする。次にホスト２０は、ＳＱ  ＴａｉｌドアベルにＳＱ  Ｔａｉｌポインタ１２８の値をライトし、ライトコマンドの発行を記憶装置１０に対して通知する（Ｓ３１１）。ライトコマンドは、開始ＬＢＡ、転送数、ライトデータを格納するホストデータバッファ３０のアドレスを含む。
【００６９】
記憶装置１０は、ライトコマンドで指定されたアドレスに対応するホストデータバッファ３０から、ライトデータをフェッチする（Ｓ３１２）。開始ＬＢＡ及び転送数で指定されたライトデータのフェッチが完了すると、記憶装置１０は、コンプリーションキュー２８にライトコマンドの完了情報をライトする（Ｓ３１３）。次に記憶装置１０は、ホスト２０に対して割り込みを通知する（Ｓ３１４）。割り込みの通知を受けたホスト２０は、コンプリーションキュー２８からライトコマンドの完了情報を取得する。ホスト２０は、ＣＱ  ＨｅａｄドアベルにＣＱ  Ｈｅａｄポインタ１２６の値をライトし、ライトコマンドの完了情報を取得したことを、記憶装置１０に対して通知する（Ｓ３１５）。
【００７０】
図１１ｃは、ノンデータコマンドのプロトコルを説明するための図である。
【００７１】
ホスト２０は、記憶装置１０に、ノンデータコマンドを発行する（Ｓ３２０）。より具体的には、ホスト２０は、サブミッションキュー１３２にノンデータコマンドをライトする。次にホスト２０は、ＳＱ  ＴａｉｌドアベルにＳＱ  Ｔａｉｌポインタ１２８の値をライトし、ノンデータコマンドの発行を記憶装置１０に対して通知する（Ｓ３２１）。
【００７２】
記憶装置１０は、ノンデータコマンドで指定された動作が完了すると、コンプリーションキュー２８に、ノンデータコマンドの完了情報をライトする（Ｓ３２２）。次に記憶装置１０は、ホスト２０に対して割り込みを通知する（Ｓ３２３）。割り込みの通知を受けたホスト２０は、コンプリーションキュー２８からノンデータコマンドの完了情報を取得する。ホスト２０は、ＣＱ  ＨｅａｄドアベルにＣＱ  Ｈｅａｄポインタ１２６の値をライトし、ノンデータコマンドの完了情報を取得したことを、記憶装置１０に対して通知する（Ｓ３２４）。
【００７３】
次に、図１２を参照して、本実施形態に係るリードコマンドの実行方法について説明する。図１２では、コンプリーションキュー２８への、リードコマンドの完了情報のライト以降の処理は省略してある。
【００７４】
図１１ａを参照して説明したように、ＮＶＭｅのプロトコルでは、ＳＱ  Ｔａｉｌドアベルがライトされ、リードコマンドが有効になるまではリードデータをホスト２０へ転送することはできない。本実施形態の記憶装置１０は、ＳＱ  Ｔａｉｌドアベルへのライトに先立って、リードコマンドの実行に必要な実行ステップを先行して開始する。
【００７５】
ホスト２０は、記憶装置１０に、リードコマンドを発行する（Ｓ４００）。より具体的には、ホスト２０は、サブミッションキュー１３２にリードコマンドをライトする。
【００７６】
コマンドセット監視部１３０は、ホストＩＦ１２２へのアクセスアドレスを監視することにより、コマンドがサブミッションキュー１３２にライトされたことを検出することができる。コマンドがライトされたことを検出したコマンドセット監視部１３０は、コマンドがライトされたことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、サブミッションキュー１３２から当該コマンドを取得する。ホスト処理部１１４は、コマンドの内容を解釈し、リードコマンドの動作に必要な指示をホストＩＦ制御部１２０（より具体的にはコマンド実行部１３４）に送る。指示を受けたホストＩＦ制御部１２０は、メモリＩＦ制御部１６０に対しデータのリードを要求する（Ｓ４０１）。
【００７７】
要求を受けたメモリＩＦ制御部１６０は、ＮＡＮＤメモリ２００へリードリクエスト及びリードアドレスを出力する（Ｓ４０２）。ＮＡＮＤメモリ２００は、時間ｔＲの後、リードデータをバッファ制御部１４０へ出力する（Ｓ４０３）。バッファ制御部１４０は、リードデータをバッファ３００へ格納する。
【００７８】
ホスト２０がＳＱ  Ｔａｉｌドアベルをライトし、ＳＱ  Ｔａｉｌポインタ１２８を操作すると、当該リードコマンドは有効になる（Ｓ４０４）。コマンドセット監視部１３０は、リードコマンドが有効になったことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、バッファ３００からのデータのリード、及び、ホスト２０へのデータ転送に必要な指示をホストＩＦ制御部１２０（より具体的にはコマンド実行部１３４）に送る。指示を受けたホストＩＦ制御部１２０は、バッファ制御部１４０にリードデータの転送を要求する（Ｓ４０５）。ホストＩＦ制御部１２０は、バッファ３００からリードされたリードデータを、ホストデータバッファ３０にライトする（Ｓ４０６）。
【００７９】
次に、図１３を参照して、本実施形態に係るリードコマンドの実行手順を説明する。
【００８０】
ホストＩＦ制御部１２０は、リードコマンドがサブミッションキュー１３２にライトされるのを監視する（Ｓ５００）。リードコマンドがライトされると（Ｓ５００；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示によりメモリＩＦ制御部１６０に対し、データのリードを要求する（Ｓ５０１）。
【００８１】
次にホストＩＦ制御部１２０は、ＳＱ  Ｔａｉｌドアベルへのライトを監視する（Ｓ５０２）。ＳＱ  Ｔａｉｌドアベルがライトされ、すなわちＳＱ  Ｔａｉｌポインタ１２８が操作され、リードコマンドが有効になると（Ｓ５０２；Ｙｅｓ）、バッファ処理部１１６は、必要なリードデータがバッファ３００に格納されたかどうかを確認する（Ｓ５０３）。リードデータのバッファ３００への格納が完了すると（Ｓ５０３；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示によりバッファ制御部１４０に対し、バッファ３００からのリードデータのリードを要求する（Ｓ５０４）。そして、ホストＩＦ制御部１２０は、リードデータをホスト２０へ転送する（Ｓ５０５）。
【００８２】
以上説明した第１の実施形態の記憶装置によれば、リードコマンドに対するコマンド発行通知の前に、先行して不揮発性記憶媒体からのデータのリードを開始するので、記憶装置の性能を向上させることができる。
【００８３】
［第２の実施形態］
第２の実施形態の記憶装置１０は、コマンド発行通知の前に、ノンデータコマンド、例えばフラッシュコマンドの実行に必要な実行ステップを実行する。
【００８４】
まず、図１４及び図１５を参照して、ライトコマンド実行時の記憶装置１０内のデータの流れを説明する。図１１ｂを参照して説明したライトコマンドは、ＦＵＡ（Ｆｏｒｃｅ  Ｕｎｉｔ  Ａｃｃｅｓｓ）という属性値を有する。
【００８５】
図１４は、ＦＵＡ＝１のライトコマンドの実行時のデータの流れを説明するための図である。図１４においては、割り込み通知以降の処理は省略してある。
【００８６】
ホスト２０は、記憶装置１０に、ライトコマンドを発行する（Ｓ６００）。より具体的には、ホスト２０は、サブミッションキュー１３２にライトコマンドをライトする。次にホスト２０は、ＳＱ  ＴａｉｌドアベルにＳＱ  Ｔａｉｌポインタ１２８の値をライトし、ライトコマンドの発行を記憶装置１０に対して通知する（Ｓ６０１）
記憶装置１０は、ライトコマンドで指定されたアドレスに対応するホストデータバッファ３０から、ライトデータをフェッチする（Ｓ６０２）。記憶装置１０は、フェッチしたライトデータをバッファ３００に格納する（Ｓ６０３）。さらに記憶装置１０は、バッファ３００に格納したライトデータを、ＮＡＮＤメモリ２００へライトする（Ｓ６０４）。
【００８７】
記憶装置１０は、ライトコマンドで指定された転送数分のライトデータの、ＮＡＮＤメモリ２００へのライトが完了すると、コンプリーションキュー２８に、ライトコマンドの完了情報をライトする（Ｓ６０５）。ＦＵＡ＝１の場合は、ライトデータをＮＡＮＤメモリ２００へライトしてから、ライトコマンドの完了情報をライトしなければならない。
【００８８】
図１５は、ＦＵＡ＝０のライトコマンドの実行時のデータの流れを説明するための図である。図１５においても、割り込み通知以降の処理は省略してある。
【００８９】
ライトコマンドの発行までの処理（Ｓ６１０及びＳ６１１）は図１４と同じであるのでここでは説明を省略する。
【００９０】
記憶装置１０は、ライトコマンドで指定されたアドレスに対応するホストデータバッファ３０から、ライトデータをフェッチする（Ｓ６１２）。記憶装置１０は、フェッチしたライトデータをバッファ３００に格納する（Ｓ６１３）。
【００９１】
記憶装置１０は、ライトコマンドで指定された転送数分のライトデータのバッファ３００への格納が完了すると、コンプリーションキュー２８に、ライトコマンドの完了情報をライトする（Ｓ６１４）。ＦＵＡ＝０の場合は、ライトデータをＮＡＮＤメモリ２００へライトする前に、ライトコマンドの完了情報をライトしてもよい。
【００９２】
バッファ３００へ格納されたライトデータは、例えば記憶装置１０のアイドル時などに、ＮＡＮＤメモリ２００へライトされる（Ｓ６１５）。
【００９３】
次に、図１６を参照して、本実施形態に係るフラッシュコマンドの実行方法について説明する。フラッシュコマンドは図１１ｃを参照して説明したノンデータコマンドの一種である。フラッシュコマンドはＦＵＡ＝０のライトコマンドに応じてバッファ３００に格納されたライトデータの、ＮＡＮＤメモリ２００へのライトを要求する。図１６においても、割り込み通知以降の処理は省略してある。
【００９４】
ホスト２０は、記憶装置１０に、フラッシュコマンドを発行する（Ｓ７００）。より具体的には、ホスト２０は、サブミッションキュー１３２にフラッシュコマンドをライトする。
【００９５】
コマンドセット監視部１３０は、ホストＩＦ１２２へのアクセスアドレスを監視することにより、コマンドがサブミッションキュー１３２にライトされたことを検出することができる。コマンドがライトされたことを検出したコマンドセット監視部１３０は、コマンドがライトされたことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、サブミッションキュー１３２から当該コマンドを取得する。ホスト処理部１１４は、コマンドの内容を解釈し、フラッシュコマンドの動作に必要な指示をホストＩＦ制御部１２０（より具体的にはコマンド実行部１３４）に送る。指示を受けたホストＩＦ制御部１２０は、メモリＩＦ制御部１６０に対し、バッファ３００に格納されたライトデータのＮＡＮＤメモリ２００へのライトを要求する（Ｓ７０１）。
【００９６】
要求を受けたメモリＩＦ制御部１６０は、ＮＡＮＤメモリ２００へライトリクエスト及びライトアドレスを出力する（Ｓ７０２）。次にメモリＩＦ制御部１６０はバッファ制御部１４０に対し、バッファ３００に格納されたライトデータの転送を要求する。バッファ制御部１４０は、バッファ３００に格納されたライトデータをＮＡＮＤメモリ２００へライトする（Ｓ７０３）。ＮＡＮＤメモリ２００は、時間ｔＰｒｏｇをかけて、ライトデータをメモリセルアレイ２０４へライトする。
【００９７】
ホスト２０がＳＱ  Ｔａｉｌドアベルをライトし、ＳＱ  Ｔａｉｌポインタ１２８を操作すると、当該フラッシュコマンドは有効になる（Ｓ７０４）。コマンドセット監視部１３０は、フラッシュコマンドが有効になったことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、ライトデータのＮＡＮＤメモリ２００へのライトが完了したことを確認する。そしてホスト処理部１１４は、ホストＩＦ制御部１２０に対し、ホスト２０にフラッシュコマンドの完了情報をライトするよう指示をする（Ｓ７０５）。
【００９８】
次に、図１７を参照して、本実施形態に係るフラッシュコマンドの実行手順を説明する。
【００９９】
ホストＩＦ制御部１２０は、フラッシュコマンドがサブミッションキュー１３２にライトされるのを監視する（Ｓ８００）。フラッシュコマンドがライトされると（Ｓ８００；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示によりメモリＩＦ制御部１６０に対し、データのライトを要求する（Ｓ８０１）。
【０１００】
次にホストＩＦ制御部１２０は、ＳＱ  Ｔａｉｌドアベルへのライトを監視する（Ｓ８０２）。ＳＱ  Ｔａｉｌドアベルがライトされ、すなわちＳＱ  Ｔａｉｌポインタ１２８が操作され、フラッシュコマンドが有効になると（Ｓ８０２；Ｙｅｓ）、ホスト処理部１１４は、フラッシュ対象であるライトデータの、ＮＡＮＤメモリ２００へのライトが完了したかを確認する（Ｓ８０３）。ライトデータのライトが完了すると（Ｓ８０３；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示により、ホスト２０に対しフラッシュコマンドの完了情報をライトする（Ｓ８０４）。
【０１０１】
以上説明した第２の実施形態の記憶装置によれば、フラッシュコマンドに対するコマンド発行通知の前に、先行して不揮発性記憶媒体へのライト動作を開始するので、記憶装置の性能を向上させることができる。
【０１０２】
［第３の実施形態］
第３の実施形態の記憶装置１０は、コマンド発行通知の前に、ライトコマンドの実行に必要な実行ステップを実行する。
【０１０３】
まず、図１８を参照して、本実施形態に係るリード・モディファイ・ライト処理について説明する。
【０１０４】
前述のとおり、コントローラ１００とＮＡＮＤメモリ２００との間のデータ転送は、クラスタが基本単位となる。一方で、ホスト２０と記憶装置１０との間のデータ転送はセクタが基本単位となる。
【０１０５】
ここで、図１８ａに示すように、セクタ０〜セクタ７を含むクラスタ０のうち、ホスト２０からのライトコマンドに応じてセクタ４のみが書き換えられる場合を考える。
【０１０６】
このような場合、図１８ｂに示すように、記憶装置１０は、まずＮＡＮＤメモリ２００からクラスタ０を含むデータをリードし、バッファ３００に格納する（Ｓ９００）。次にホスト２０よりセクタ４のデータを受信し、バッファ３００に格納する（Ｓ９０１）。そして、Ｓ９００でバッファ３００に格納したクラスタ０のデータのうち、セクタ４以外のデータと、Ｓ９０１でバッファ３００に格納したセクタ４のデータをマージして、ＮＡＮＤメモリ２００にライトする（Ｓ９０２）。なお、Ｓ９００とＳ９０１の順序は入れ替わってもよい。
【０１０７】
次に、図１９を参照して、本実施形態に係るライトコマンドの実行方法について説明する。図１９では、コンプリーションキュー２８への、ライトコマンドの完了情報のライト以降の処理は省略してある。
【０１０８】
図１１ｂを参照して説明したように、ＮＶＭｅのプロトコルでは、ＳＱ  Ｔａｉｌドアベルがライトされ、ライトコマンドが有効になるまではライトデータをホスト２０からフェッチすることはできない。本実施形態の記憶装置１０は、ＳＱ  Ｔａｉｌドアベルへのライトに先立って、ライトコマンドの実行に必要な実行ステップ、例えば上述したリード・モディファイ・ライト処理を先行して開始する。
【０１０９】
ホスト２０は、記憶装置１０に、ライトコマンドを発行する（Ｓ１０００）。より具体的には、ホスト２０は、サブミッションキュー１３２にライトコマンドをライトする。
【０１１０】
コマンドセット監視部１３０は、ホストＩＦ１２２へのアクセスアドレスを監視することにより、コマンドがサブミッションキュー１３２にライトされたことを検出することができる。コマンドがライトされたことを検出したコマンドセット監視部１３０は、コマンドがライトされたことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、サブミッションキュー１３２から当該コマンドを取得する。ホスト処理部１１４は、コマンドの内容を解釈する。ホスト処理部１１４は、リード・モディファイ・ライト処理が必要と判断した場合、リード・モディファイ・ライト処理に必要な指示をホストＩＦ制御部１２０（より具体的にはコマンド実行部１３４）に送る。指示を受けたホストＩＦ制御部１２０は、メモリＩＦ制御部１６０に対し、データのリードを要求する（Ｓ１００１）。
【０１１１】
要求を受けたメモリＩＦ制御部１６０は、ＮＡＮＤメモリ２００へリードリクエスト及びリードアドレスを発行する（Ｓ１００２）。ＮＡＮＤメモリ２００は、時間ｔＲの後、リードデータをバッファ制御部１４０へ出力する（Ｓ１００３）。バッファ制御部１４０は、リードデータをバッファ３００へ格納する。
【０１１２】
ホスト２０がＳＱ  Ｔａｉｌドアベルをライトし、ＳＱ  Ｔａｉｌポインタ１２８を操作すると、当該ライトコマンドは有効になる（Ｓ１００４）。コマンドセット監視部１３０は、ライトコマンドが有効になったことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、ホストＩＦ制御部１２０（より具体的にはコマンド実行部１３４）にデータのフェッチを指示する。指示を受けたホストＩＦ制御部１２０は、ホストデータバッファ３０からデータをフェッチする（Ｓ１００５）。
【０１１３】
バッファ制御部１４０は、ホストＩＦ制御部１２０がフェッチしたデータをバッファ３００へ格納する（Ｓ１００６）。バッファ処理部１１６は、Ｓ１００３でバッファ３００に格納されたデータと、Ｓ１００６でバッファ３００に格納されたデータとをマージする（Ｓ１００７）。
【０１１４】
メモリＩＦ制御部１６０は、ＮＡＮＤメモリ２００へライトリクエスト及びライトアドレスを出力する（Ｓ１００８）。次にメモリＩＦ制御部１６０はバッファ制御部１４０に対し、マージデータの転送を要求する。バッファ制御部１４０は、バッファ３００に格納されたマージデータをＮＡＮＤメモリ２００へライトする（Ｓ１００９）。
【０１１５】
次に、図２０を参照して、本実施形態に係るライトコマンドの実行手順を説明する。
【０１１６】
ホストＩＦ制御部１２０は、ライトコマンドがサブミッションキュー１３２にライトされるのを監視する（Ｓ１１００）。ライトコマンドがライトされると（Ｓ１１００；Ｙｅｓ）、ホスト処理部１１４はリード・モディファイ・ライト処理が必要か否かを判断する（Ｓ１１０１）。
【０１１７】
リード・モディファイ・ライト処理が必要である場合（Ｓ１１０１；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示によりメモリＩＦ制御部１６０に対し、データのリードを要求する（Ｓ１１０２）。
【０１１８】
次にホストＩＦ制御部１２０は、ＳＱ  Ｔａｉｌドアベルへのライトを監視する（Ｓ１１０３）。ＳＱ  Ｔａｉｌドアベルがライトされ、すなわちＳＱ  Ｔａｉｌポインタ１２８が操作され、ライトコマンドが有効になると（Ｓ１１０３；Ｙｅｓ）、ホストＩＦ制御部１２０は、ホスト処理部１１４の指示によりライトデータをホストデータバッファ３０からフェッチする（Ｓ１１０４）。
【０１１９】
次にバッファ処理部１１６は、リード・モディファイ・ライト処理に必要なデータがバッファ３００に格納されたかを確認する（Ｓ１１０５）。必要なデータのバッファ３００への格納が完了すると（Ｓ１１０５；Ｙｅｓ）、バッファ処理部１１６は、バッファ３００上のデータのマージする（Ｓ１１０６）。
【０１２０】
そしてバッファ処理部１１６及びメモリ処理部１１８は、バッファ制御部１４０及びメモリＩＦ制御部１６０に対し、マージしたデータのＮＡＮＤメモリ２００へのライトを要求する（Ｓ１１０７）。
【０１２１】
一方、リード・モディファイ・ライト処理が必要ではない場合（Ｓ１１０１；Ｎｏ）、ＳＱ  Ｔａｉｌドアベルがライトされ、ライトコマンドが有効になるまでに先行してできる処理はない。この場合、ライトコマンドが有効になるのを待ち（Ｓ１１０８）、ホストデータバッファ３０からのライトデータのフェッチ（Ｓ１１０９）、ＮＡＮＤメモリ２００へのデータのライト（Ｓ１１１０）を行う。
【０１２２】
以上説明した第３の実施形態の記憶装置によれば、ライトコマンドに対するコマンド発行通知の前に先行して、リード・モディファイ・ライト処理に必要なデータを不揮発性記憶媒体からリードし始めるので、記憶装置の性能を向上させることができる。
【０１２３】
［第４の実施形態］
第４の実施形態の記憶装置１０は、コマンド発行通知の前に先行して実行を開始したコマンドが、書き換えられた場合などに適切な処理を行う。
【０１２４】
図２１に示す例においては、第１の実施形態で説明したように、サブミッションキュー１３２のＳＱ＃０に格納されたＣＭＤ＃０（リードコマンド）について、ＳＱ  Ｔａｉｌドアベルがライトされるより前に、対応するデータをバッファ３００に格納している（Ｓ１２００）。
【０１２５】
この時、ホスト２０がＳＱ＃０のコマンドを別なコマンドＣＭＤ＃０’に書き換えた場合を考える。別なコマンドＣＭＤ＃０’とは、例えばライトコマンドやノンデータコマンドである場合、ＣＭＤ＃０とは別なＬＢＡを指定するリードコマンドである場合がある。
【０１２６】
コマンドセット監視部１３０は、ホストＩＦ１２２へのアクセスアドレスを監視することにより、ＳＱ＃０に格納されているコマンドが書き換えられたことを検出することができる。コマンドが書き換えられたことを検出したコマンドセット監視部１３０は、コマンドが書き換えられたことをホスト処理部１１４へ通知する。通知を受けたホスト処理部１１４は、バッファ３００に格納されていたＣＭＤ＃０に対応するデータを破棄する（Ｓ１２０２）。
【０１２７】
なお、上記の説明は、第３の実施形態において説明した、リード・モディファイ・ライト用にバッファ３００に格納したデータの破棄についても同様である。
【０１２８】
図２２に示す例においては、第２の実施形態で説明したように、サブミッションキュー１３２のＳＱ＃０に格納されたＣＭＤ＃０（フラッシュコマンド）について、ＳＱ  Ｔａｉｌドアベルがライトされるより前に、対応するデータをＮＡＮＤメモリ２００にライトしている（Ｓ１２１０）。
【０１２９】
この時、ホスト２０がＳＱ＃０のコマンドを別なコマンドＣＭＤ＃０’に書き換えた場合を考える。この場合、記憶装置１０は、当該データについては特別な操作を行わない。第２の実施形態において説明したように、バッファ３００に格納されたライトデータのＮＡＮＤメモリ２００へのライトは、フラッシュコマンドに応じてのみ行われるものではなく、記憶装置１０のアイドル時に行ってよいからである。また仮に当該データが無効化された場合は、論物変換テーブル上で当該データを無効とすればよいからである。
【０１３０】
図２３に示す例においては、第１の実施形態で説明したように、サブミッションキュー１３２のＳＱ＃０に格納されたＣＭＤ＃０（リードコマンド）、及び、ＳＱ＃１に格納されたＣＭＤ＃１（リードコマンド）について、ＳＱ  Ｔａｉｌドアベルがライトされるより前に、対応するデータをバッファ３００に格納している（Ｓ１２２０及びＳ１２２１）。
【０１３１】
一方でＳＱ＃２にはＣＭＤ＃２（ライトコマンド）が格納されている。この時、ホスト処理部１１４は、ＳＱ＃３に格納されているリードコマンド（ＣＭＤ＃３）を先行して実行を開始しない。ＣＭＤ＃２のライトコマンドの実行により、ＣＭＤ＃３のリードコマンドが対象とするデータの内容が変更される可能性があるからである。なお、ＣＭＤ＃２が指定する論理アドレスの範囲と、ＣＭＤ＃３が指定する論理アドレスの範囲に重複がない場合は、ＣＭＤ＃３を先行して実行を開始してもよい。
【０１３２】
以上説明した第４の実施形態の記憶装置によれば、先行して実行を開始したコマンドが書き換えられた場合などにおいて、適切な処理をすることができるので、記憶装置の性能を向上させることができる。
【０１３３】
以上説明した少なくとも１つの実施形態の記憶装置によれば、コマンド発行通知の受信に先立って、コマンド実行に必要な実行ステップの実行を開始するので、記憶装置の性能を向上させることができる。
【０１３４】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１３５】
１０…記憶装置、２０…ホスト、２２…ホストコントローラ、２４…ホストブリッジ、２６…ホストメモリ、２８…コンプリーションキュー、３０…ホストデータバッファ、１００…コントローラ、１１０…ＣＰＵ、１１２…処理部、１１４…ホスト処理部、１１６…バッファ処理部、１１８…メモリ処理部、１２０…ホストインタフェース制御部、１２２…ホストインタフェース、１２４…ドアベル、１２６…ＣＱ  Ｈｅａｄポインタ、１２８…ＳＱ  Ｔａｉｌポインタ、１３０…コマンドセット監視部、１３２…サブミッションキュー、１３４…コマンド実行部、１４０…バッファ制御部、１６０…メモリインタフェース制御部、１６２…ＮＡＮＤ制御部、２００…不揮発性記憶媒体、２０２…ページバッファ、２０４…メモリセルアレイ、３００…バッファ
【図１】
2018160155.tif 000003
【図２】
2018160155.tif 000004
【図３】
2018160155.tif 000005
【図４】
2018160155.tif 000006
【図５】
2018160155.tif 000007
【図６】
2018160155.tif 000008
【図７】
2018160155.tif 000009
【図８】
2018160155.tif 000010
【図９】
2018160155.tif 000011
【図１０】
2018160155.tif 000012
【図１１】
2018160155.tif 000013
【図１２】
2018160155.tif 000014
【図１３】
2018160155.tif 000015
【図１４】
2018160155.tif 000016
【図１５】
2018160155.tif 000017
【図１６】
2018160155.tif 000018
【図１７】
2018160155.tif 000019
【図１８】
2018160155.tif 000020
【図１９】
2018160155.tif 000021
【図２０】
2018160155.tif 000022
【図２１】
2018160155.tif 000023
【図２２】
2018160155.tif 000024
【図２３】
2018160155.tif 000025