(57)【要約】【課題】  複数のメモリチップを備える不揮発性メモリに対するアクセス性能を向上できるメモリシステムを実現する。【解決手段】  実施形態によれば、複数のメモリチップを含む不揮発性メモリとコントローラとを具備する。前記コントローラは、第１メモリチップへコマンドの転送を開始してから前記第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、第２メモリチップへコマンドの転送を開始してから前記第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、第１キューから第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送した後に、第２キューから第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送する。【選択図】図２
2019164487.tif 000002
【特許請求の範囲】
【請求項１】
並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む不揮発性メモリと、
前記第１メモリチップに関連付けられた第１キューと前記第２メモリチップに関連付けられた第２キューとを含む複数のキューを含み、
前記第１メモリチップによって実行されるべき第１コマンドと、前記第２メモリチップによって実行されるべき第２コマンドとを生成し、
前記第１キューに前記第１コマンドを格納し、
前記第２キューに前記第２コマンドを格納し、
前記第１メモリチップへコマンドの転送を開始してから前記第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、前記第２メモリチップへコマンドの転送を開始してから前記第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送した後に、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送し、
前記第２コマンド処理速度が前記第１コマンド処理速度よりも遅いならば、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送した後に、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送するように構成されるコントローラと、
を具備するメモリシステム。
【請求項２】
前記コントローラは、さらに、
前記第１メモリチップによって実行されるべき第３コマンドと、前記第２メモリチップによって実行されるべき第４コマンドとを生成し、
前記第１キューに前記第３コマンドを格納し、
前記第２キューに前記第４コマンドを格納し、
前記第１キューから前記第３コマンドを取得し、前記取得された第３コマンドを前記第１メモリチップへ転送してから、前記第１メモリチップによる前記第３コマンドの実行が完了するまでの時間に基づいて前記第１コマンド処理速度を計測し、
前記第２キューから前記第４コマンドを取得し、前記取得された第４コマンドを前記第２メモリチップへ転送してから、前記第２メモリチップによる前記第４コマンドの実行が完了するまでの時間に基づいて前記第２コマンド処理速度を計測するように構成される請求項１記載のメモリシステム。
【請求項３】
前記第１コマンドと前記第２コマンドとはそれぞれ、プログラムコマンドとリードコマンドとイレーズコマンドのいずれかである請求項１記載のメモリシステム。
【請求項４】
前記第１コマンドは、前記第１メモリチップに第１データを書き込むためのプログラムコマンドであり、
前記第２コマンドは、前記第２メモリチップに第２データを書き込むためのプログラムコマンドであり、
前記コントローラは、さらに、
前記第１コマンド処理速度が前記第２コマンド処理速度よりも遅いならば、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示した後に、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示し、
前記第２コマンド処理速度が前記第１コマンド処理速度よりも遅いならば、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示した後に、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示するように構成される請求項１記載のメモリシステム。
【請求項５】
並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む不揮発性メモリと、
第１キューと、前記第１キューよりも後にコマンドが転送される対象となる第２キューとを含む複数のキューを含み、
前記第１メモリチップへコマンドの転送を開始してから前記第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、前記第２メモリチップへコマンドの転送を開始してから前記第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、前記第１キューに前記第１メモリチップを関連付け、前記第２キューに前記第２メモリチップを関連付け、
前記第２コマンド処理速度が前記第１コマンド処理速度よりも遅いならば、前記第１キューに前記第２メモリチップを関連付け、前記第２キューに前記第１メモリチップを関連付け、
前記第１キューに関連付けられたメモリチップによって実行されるべき第１コマンドと、前記第２キューに関連付けられたメモリチップによって実行されるべき第２コマンドとを生成し、
前記第１キューに前記第１コマンドを格納し、
前記第２キューに前記第２コマンドを格納し、
前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１キューに関連付けられたメモリチップへ転送した後に、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２キューに関連付けられたメモリチップへ転送するように構成されるコントローラと、
を具備するメモリシステム。
【請求項６】
前記コントローラは、さらに、
前記第１キューが前記第１メモリチップに関連付けられ、且つ前記第２キューが前記第２メモリチップに関連付けられているときに、前記第１メモリチップによって実行されるべき第３コマンドと、前記第２メモリチップによって実行されるべき第４コマンドとを生成し、
前記第１キューに前記第３コマンドを格納し、
前記第２キューに前記第４コマンドを格納し、
前記第１キューから前記第３コマンドを取得し、前記取得された第３コマンドを前記第１メモリチップへ転送してから、前記第１メモリチップによる前記第３コマンドの実行が完了するまでの時間に基づいて前記第１コマンド処理速度を計測し、
前記第２キューから前記第４コマンドを取得し、前記取得された第４コマンドを前記第２メモリチップへ転送してから、前記第２メモリチップによる前記第４コマンドの実行が完了するまでの時間に基づいて前記第２コマンド処理速度を計測するように構成される請求項５記載のメモリシステム。
【請求項７】
前記コントローラは、ファームウェアを実行することによって、前記第１コマンド処理速度と前記第２コマンド処理速度とを計測するように構成される請求項６記載のメモリシステム。
【請求項８】
前記コントローラは、ファームウェアを実行することによって、
前記第１コマンド処理速度が前記第２コマンド処理速度よりも遅いならば、前記第１キューに前記第１メモリチップを関連付け、前記第２キューに前記第２メモリチップを関連付け、
前記第２コマンド処理速度が前記第１コマンド処理速度よりも遅いならば、前記第１キューに前記第２メモリチップを関連付け、前記第２キューに前記第１メモリチップを関連付けるように構成される請求項５記載のメモリシステム。
【請求項９】
前記第１コマンドと前記第２コマンドとはそれぞれ、プログラムコマンドとリードコマンドとイレーズコマンドのいずれかである請求項５記載のメモリシステム。
【請求項１０】
前記第１コマンドは、前記第１キューに関連付けられたメモリチップに第１データを書き込むためのプログラムコマンドであり、
前記第２コマンドは、前記第２キューに関連付けられたメモリチップに第２データを書き込むためのプログラムコマンドであり、
前記コントローラは、さらに、
前記第１キューに前記第１コマンドを格納し、
前記第２キューに前記第２コマンドを格納し、
前記第１キューから前記第１コマンドを取得し、前記第１データを前記第１キューに関連付けられたメモリチップに転送して当該メモリチップにプログラムを指示した後に、前記第２データを前記第２キューに関連付けられたメモリチップに転送して当該メモリチップにプログラムを指示するように構成される請求項５記載のメモリシステム。
【請求項１１】
並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む不揮発性メモリと、
前記第１メモリチップに関連付けられた第１キューと前記第２メモリチップに関連付けられた第２キューとを含む複数のキューを含み、
前記第１メモリチップによって実行されるべき第１コマンドと、前記第２メモリチップによって実行されるべき第２コマンドとを生成し、
前記第１キューに前記第１コマンドを格納し、
前記第２キューに前記第２コマンドを格納し、
第１期間において前記第１メモリチップへ転送されたコマンドの数に基づく第１コマンド転送速度が、前記第１期間において前記第２メモリチップへ転送されたコマンドの数に基づく第２コマンド転送速度よりも遅いならば、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送した後に、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送し、
前記第２コマンド転送速度が前記第１コマンド転送速度よりも遅いならば、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送した後に、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送するように構成されるコントローラと、
を具備するメモリシステム。
【請求項１２】
前記コントローラは、さらに、
前記第１メモリチップによって実行されるべき複数の第３コマンドと、前記第２メモリチップによって実行されるべき複数の第４コマンドとを生成し、
前記第１期間において、前記第１キューに格納される前記複数の第３コマンドの内、前記第１メモリチップへ転送されたコマンドの第１の数をカウントし、
前記第１期間において、前記第２キューに格納される前記複数の第４コマンドの内、前記第２メモリチップへ転送されたコマンドの第２の数をカウントし、
前記第１の数に基づいて前記第１コマンド転送速度を決定し、
前記第２の数に基づいて前記第２コマンド転送速度を決定するように構成される請求項１１記載のメモリシステム。
【請求項１３】
前記コントローラは、さらに、
前記第１メモリチップによって実行されるべき複数の第３コマンドと、前記第２メモリチップによって実行されるべき複数の第４コマンドとを生成し、
前記第１期間において、前記第１キューに格納される前記複数の第３コマンドの内、前記第１メモリチップへ転送されたコマンドの処理開始位置の数と前記第１メモリチップによる実行が完了したコマンドの処理終了位置の数の少なくとも一方を含む第１の数をカウントし、
前記第１期間において、前記第２キューに格納される前記複数の第４コマンドの内、前記第２メモリチップへ転送されたコマンドの処理開始位置の数と前記第２メモリチップによる実行が完了したコマンドの処理終了位置の数の少なくとも一方を含む第２の数をカウントし、
前記第１の数に基づいて前記第１コマンド転送速度を決定し、
前記第２の数に基づいて前記第２コマンド転送速度を決定するように構成される請求項１１記載のメモリシステム。
【請求項１４】
前記第１コマンドと前記第２コマンドとはそれぞれ、プログラムコマンドとリードコマンドとイレーズコマンドのいずれかである請求項１１記載のメモリシステム。
【請求項１５】
前記第１コマンドは、前記第１メモリチップに第１データを書き込むためのプログラムコマンドであり、
前記第２コマンドは、前記第２メモリチップに第２データを書き込むためのプログラムコマンドであり、
前記コントローラは、さらに、
前記第１コマンド転送速度が前記第２コマンド転送速度よりも遅いならば、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示した後に、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示し、
前記第２コマンド転送速度が前記第１コマンド転送速度よりも遅いならば、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示した後に、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示するように構成される請求項１１記載のメモリシステム。
【請求項１６】
並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む不揮発性メモリと、
第１キューと、前記第１キューよりも後にコマンドが転送される対象となる第２キューとを含む複数のキューを含み、
第１期間において前記第１メモリチップへ転送されたコマンドの数に基づく第１コマンド転送速度が、前記第１期間において前記第２メモリチップへ転送されたコマンドの数に基づく第２コマンド転送速度よりも遅いならば、前記第１キューに前記第１メモリチップを関連付け、前記第２キューに前記第２メモリチップを関連付け、
前記第２コマンド転送速度が前記第１コマンド転送速度よりも遅いならば、前記第１キューに前記第２メモリチップを関連付け、前記第２キューに前記第１メモリチップを関連付け、
前記第１キューに関連付けられたメモリチップによって実行されるべき第１コマンドと、前記第２キューに関連付けられたメモリチップによって実行されるべき第２コマンドとを生成し、
前記第１キューに前記第１コマンドを格納し、
前記第２キューに前記第２コマンドを格納し、
前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１キューに関連付けられたメモリチップへ転送した後に、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２キューに関連付けられたメモリチップへ転送するように構成されるコントローラと、
を具備するメモリシステム。
【請求項１７】
前記コントローラは、さらに、
前記第１キューが前記第１メモリチップに関連付けられ、且つ前記第２キューが前記第２メモリチップに関連付けられているときに、前記第１メモリチップによって実行されるべき複数の第３コマンドと、前記第２メモリチップによって実行されるべき複数の第４コマンドとを生成し、
前記第１期間において、前記第１キューに格納される前記複数の第３コマンドの内、前記第１メモリチップへ転送されたコマンドの第１の数をカウントし、
前記第１期間において、前記第２キューに格納される前記複数の第４コマンドの内、前記第２メモリチップへ転送されたコマンドの第２の数をカウントし、
前記第１の数に基づいて前記第１コマンド転送速度を決定し、
前記第２の数に基づいて前記第２コマンド転送速度を決定するように構成される請求項１６記載のメモリシステム。
【請求項１８】
前記コントローラは、さらに、
前記第１キューが前記第１メモリチップに関連付けられ、且つ前記第２キューが前記第２メモリチップに関連付けられているときに、前記第１メモリチップに対して実行されるべき複数の第３コマンドと、前記第２メモリチップに対して実行されるべき複数の第４コマンドとを生成し、
前記第１期間において、前記第１キューに格納される前記複数の第３コマンドの内、前記第１メモリチップへ転送されたコマンドの処理開始位置の数と前記第１メモリチップによる実行が完了したコマンドの処理終了位置の数の少なくとも一方を含む第１の数をカウントし、
前記第１期間において、前記第２キューに格納される前記複数の第４コマンドの内、前記第２メモリチップへ転送されたコマンドの処理開始位置の数と前記第２メモリチップによる実行が完了したコマンドの処理終了位置の数の少なくとも一方を含む第２の数をカウントし、
前記第１の数に基づいて前記第１コマンド転送速度を決定し、
前記第２の数に基づいて前記第２コマンド転送速度を決定するように構成される請求項１６記載のメモリシステム。
【請求項１９】
前記第１コマンドと前記第２コマンドとはそれぞれ、プログラムコマンドとリードコマンドとイレーズコマンドのいずれかである請求項１６記載のメモリシステム。
【請求項２０】
前記第１コマンドは、前記第１メモリチップに第１データを書き込むためのプログラムコマンドであり、
前記第２コマンドは、前記第２メモリチップに第２データを書き込むためのプログラムコマンドであり、
前記コントローラは、さらに、
前記第１コマンド転送速度が前記第２コマンド転送速度よりも遅いならば、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示した後に、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示し、
前記第２コマンド転送速度が前記第１コマンド転送速度よりも遅いならば、前記第２データを前記第２メモリチップに転送して前記第２メモリチップにプログラムを指示した後に、前記第１データを前記第１メモリチップに転送して前記第１メモリチップにプログラムを指示するように構成される請求項１６記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、不揮発性メモリを備えるメモリシステムに関する。
【背景技術】
【０００２】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。
【０００３】
このようなメモリシステムの一つとして、ＮＡＮＤ型フラッシュメモリを備えるソリッドステートドライブ（ＳＳＤ）が知られている。ＳＳＤは、様々なコンピューティングデバイスのメインストレージとして使用されている。
【０００４】
ＳＳＤのようなストレージには、複数のフラッシュメモリのチップが搭載されている。このようなストレージでは、各メモリチップに対するアクセスが並列に実行されるチップインタリーブ実行により、ストレージ全体のアクセス性能が向上する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第９６３９２８０号明細書
【特許文献２】特許第５２９６０４１号公報
【特許文献３】特許第５２９２８１３号公報
【特許文献４】特開２０１３−２００６９２号公報
【特許文献５】米国特許第８８６８８５１号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明が解決しようとする課題は、複数のメモリチップを備える不揮発性メモリに対するアクセス性能を向上できるメモリシステムを提供することである。
【課題を解決するための手段】
【０００７】
実施形態によれば、メモリシステムは、不揮発性メモリと、コントローラとを具備する。前記不揮発性メモリは、並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む。前記コントローラは、前記第１メモリチップに関連付けられた第１キューと前記第２メモリチップに関連付けられた第２キューとを含む複数のキューを含み、前記第１メモリチップによって実行されるべき第１コマンドと、前記第２メモリチップによって実行されるべき第２コマンドとを生成し、前記第１キューに前記第１コマンドを格納し、前記第２キューに前記第２コマンドを格納する。前記コントローラは、前記第１メモリチップへコマンドの転送を開始してから前記第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、前記第２メモリチップへコマンドの転送を開始してから前記第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送した後に、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送する。前記コントローラは、前記第２コマンド処理速度が前記第１コマンド処理速度よりも遅いならば、前記第２キューから前記第２コマンドを取得し、前記取得された第２コマンドを前記第２メモリチップへ転送した後に、前記第１キューから前記第１コマンドを取得し、前記取得された第１コマンドを前記第１メモリチップへ転送する。
【図面の簡単な説明】
【０００８】
【図１】第１実施形態に係るメモリシステムの構成例を示すブロック図。
【図２】第１実施形態のメモリシステム内のフラッシュコントローラエンジンと複数のＮＡＮＤ型フラッシュメモリチップとの構成を示すブロック図。
【図３】図２のフラッシュコントローラエンジンによって用いられるアービトレーションルールの例と、アービトレーションルールに従って各キュー（コマンドキュー）から転送されたコマンドが複数のメモリチップで並列に実行される例とを示す図。
【図４】第１実施形態のメモリシステムにおいて、メモリチップのコマンド実行速度に関係しない順序のアービトレーションルールに基づいて、複数のメモリチップでコマンドが並列に実行される例を示す図。
【図５】第１実施形態のメモリシステムにおいて、コマンド処理速度が遅いメモリチップから順にコマンドが並列に実行される例を示す図。
【図６】第１実施形態のメモリシステムにおいて、コマンド処理速度に関係しない順序で複数のメモリチップにコマンドを並列に実行させる例と、コマンド処理速度が遅いメモリチップから順にコマンドを並列に実行させる例との比較を示す図。
【図７】第１実施形態のメモリシステムによって、単位期間内におけるコマンドの処理開始位置の数と処理終了位置の数とがカウントされる第１の例を示す図。
【図８】図７のコマンド処理終了位置の数が小さいキューから順に、コマンドが転送される例を示す図。
【図９】第１実施形態のメモリシステムによって、単位期間内におけるコマンドの処理開始位置の数と処理終了位置の数とがカウントされる第２の例を示す図。
【図１０】図９のコマンド処理終了位置の数が小さいキューから順に、コマンドが転送される例を示す図。
【図１１】第１実施形態のメモリシステムにおいて、フラッシュコントローラエンジンが複数のコマンドを受け付ける例を示す図。
【図１２】図１１の複数のコマンドがキューに格納される例を示す図。
【図１３】図１２のキューに格納されたコマンドが、アービトレーションルールに基づく順序で転送される例を示す図。
【図１４】図１２のキューに格納されたコマンドが、キューのコマンド転送速度に応じて変更されたアービトレーションルールに基づく順序で転送される例を示す図。
【図１５】第１実施形態のメモリシステムによって実行されるコマンド転送制御処理の手順の例を示すフローチャート。
【図１６】第２実施形態に係るメモリシステムの構成例を示すブロック図。
【図１７】第２実施形態のメモリシステム内のフラッシュコントローラエンジンと複数のＮＡＮＤ型フラッシュメモリチップとの構成を示すブロック図。
【図１８】第２実施形態のメモリシステムにおいて、キュー−チップテーブルに基づいて、フラッシュコントローラエンジンが受け付けた複数のコマンドがキューに格納される例を示す図。
【図１９】図１８のキューに格納されたコマンドが、アービトレーションルールに基づいて転送される例を示す図。
【図２０】図１８のキューに、キューのコマンド転送速度に応じて変更されたキュー−チップテーブルに基づいてコマンドが格納される例を示す図。
【図２１】図２０のキューに格納されたコマンドが、アービトレーションルールに基づいて転送される例を示す図。
【図２２】第２実施形態のメモリシステムによって実行されるコマンド転送制御処理の手順の例を示すフローチャート。
【発明を実施するための形態】
【０００９】
以下、実施の形態について図面を参照して説明する。
【００１０】
（第１実施形態）  
まず、図１および図２を参照して、第１実施形態に係るメモリシステムを含む情報処理システム１の構成を説明する。
【００１１】
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、例えば、ＮＡＮＤ型フラッシュメモリを備えたソリッドステートドライブ（ＳＳＤ）３として実現されている。
【００１２】
情報処理システム１は、ホスト（ホストデバイス）２と、ＳＳＤ３とを含む。ホスト２は、ＳＳＤ３にアクセスする情報処理装置（コンピューティングデバイス）である。ホスト２は、大量且つ多様なデータをＳＳＤ３に保存するサーバ（ストレージサーバ）であってもよいし、パーソナルコンピュータであってもよい。
【００１３】
ＳＳＤ３は、ホスト２として機能する情報処理装置のメインストレージとして使用され得る。ＳＳＤ３は、この情報処理装置に内蔵されてもよいし、この情報処理装置にケーブルまたはネットワークを介して接続されてもよい。
【００１４】
ホスト２とＳＳＤ３とを相互接続するためのインタフェースとしては、ＳＣＳＩ、Ｓｅｒｉａｌ  Ａｔｔａｃｈｅｄ  ＳＣＳＩ（ＳＡＳ）、ＡＴＡ、Ｓｅｒｉａｌ  ＡＴＡ（ＳＡＴＡ）、ＰＣＩ  Ｅｘｐｒｅｓｓ（ＰＣＩｅ）（登録商標）、Ｅｔｈｅｒｎｅｔ（登録商標）、Ｆｉｂｒｅ  ｃｈａｎｎｅｌ、ＮＶＭ  Ｅｘｐｒｅｓｓ（ＮＶＭｅ）（登録商標）等が使用され得る。
【００１５】
ＳＳＤ３は、コントローラ４および不揮発性メモリ（ＮＡＮＤ型フラッシュメモリ）５を備える。コントローラ４は、Ｓｙｓｔｅｍ−ｏｎ−ａ−ｃｈｉｐ（ＳｏＣ）のような回路によって実現され得る。ＳＳＤ３は、揮発性メモリであるランダムアクセスメモリ、例えば、ＤＲＡＭ６を備えていてもよい。あるいは、ＳＲＡＭのようなランダムアクセスメモリがコントローラ４に内蔵されていてもよい。ＤＲＡＭ６等のランダムアクセスメモリには、例えば、ＮＡＮＤ型フラッシュメモリ５に書き込まれるデータを一時的に格納するためのバッファ領域であるライトバッファ（ＷＢ）３１と、アドレス変換テーブル（論理物理アドレス変換テーブル）として機能するルックアップテーブル（ＬＵＴ）３２のキャッシュ領域とが設けられている。ＬＵＴ３２は、論理アドレスそれぞれとＮＡＮＤ型フラッシュメモリ５の物理アドレスそれぞれとの間のマッピングを管理する。なお、ＤＲＡＭ６は、コントローラ４の内部に設けられていてもよい。
【００１６】
ＮＡＮＤ型フラッシュメモリ５は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。このＮＡＮＤ型フラッシュメモリ５は、二次元構造のＮＡＮＤ型フラッシュメモリであってもよいし、三次元構造のＮＡＮＤ型フラッシュメモリであってもよい。
【００１７】
ＮＡＮＤ型フラッシュメモリ５のメモリセルアレイは、複数のブロックＢ０〜Ｂｍ−１を含む。ブロックＢ０〜Ｂｍ−１の各々は複数のページ（ここではページＰ０〜Ｐｎ−１）を含む。ブロックＢ０〜Ｂｍ−１は、最小の消去単位として機能する。ブロックは、「消去ブロック」、または「物理ブロック」と称されることもある。ページＰ０〜Ｐｎ−１の各々は、同一ワード線に接続された複数のメモリセルを含む。ページＰ０〜Ｐｎ−１は、データ書き込み動作およびデータ読み出し動作の単位である。なお、ワード線をデータ書き込み動作およびデータ読み出し動作の単位としてもよい。
【００１８】
コントローラ４は、Ｔｏｇｇｌｅ  ＤＤＲ、Ｏｐｅｎ  ＮＡＮＤ  Ｆｌａｓｈ  Ｉｎｔｅｒｆａｃｅ（ＯＮＦＩ）のようなインタフェースコントローラ４２３，４３３を含むフラッシュコントローラエンジン１３を介して、不揮発性メモリであるＮＡＮＤ型フラッシュメモリ５に電気的に接続されている。フラッシュコントローラエンジン１３は、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたＮＡＮＤ制御回路として機能する。
【００１９】
ＮＡＮＤ型フラッシュメモリ５は、図２に示すように、複数のＮＡＮＤ型フラッシュメモリチップを含む。個々のＮＡＮＤ型フラッシュメモリチップは独立して動作可能である。このため、ＮＡＮＤ型フラッシュメモリチップは、並列動作可能な単位として機能する。以下では、ＮＡＮＤ型フラッシュメモリチップをメモリチップとも称する。
【００２０】
フラッシュコントローラエンジン１３は、一つ以上のチャネルを介して、ＮＡＮＤ型フラッシュメモリ５内の一つ以上のメモリチップにそれぞれ接続されている。図２においては、コマンドディスパッチャ４１に複数のチャネルＣＨ０，ＣＨ１，……が接続され、これら複数のチャネルＣＨ０，ＣＨ１，……の各々に、複数のＮＡＮＤ型フラッシュメモリチップが接続されている場合が例示されている。
【００２１】
より具体的には、チャネルＣＨ０には、ＮＡＮＤ型フラッシュメモリチップＭＣ０〜ＭＣｘ−１が接続されている。また、チャネルＣＨ１には、ＮＡＮＤ型フラッシュメモリチップＭＣｘ〜ＭＣｙ−１が接続されている。図２の構成例においては、ＮＡＮＤ型フラッシュメモリチップＭＣ０〜ＭＣｙ−１を並列動作させることができる。
【００２２】
次に、図１のコントローラ４の構成について説明する。
【００２３】
コントローラ４は、複数のチャネルを介して複数のＮＡＮＤ型フラッシュメモリチップに電気的に接続される。コントローラ４は、ＮＡＮＤ型フラッシュメモリ５（複数のＮＡＮＤ型フラッシュメモリチップ）を制御する。
【００２４】
コントローラ４は、ＮＡＮＤ型フラッシュメモリ５のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層（ＦＴＬ）として機能してもよい。このＦＴＬによって実行されるデータ管理には、（１）論理アドレスそれぞれとＮＡＮＤ型フラッシュメモリ５の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、（２）ページ単位のリード／ライトとブロック単位の消去動作とを隠蔽するための処理、等が含まれる。論理アドレスは、ＳＳＤ３をアドレス指定するためにホストによって使用されるアドレスである。この論理アドレスとしては、論理ブロックアドレス（論理ブロックアドレッシング）が使用される。
【００２５】
論理ブロックアドレス（ＬＢＡ）それぞれと物理アドレスそれぞれとの間のマッピングの管理は、アドレス変換テーブル（論理物理アドレス変換テーブル）として機能するＬＵＴ３２を用いて実行される。コントローラ４は、ＬＵＴ３２を使用して、ＬＢＡそれぞれと物理アドレスそれぞれとの間のマッピングを所定の管理サイズ単位で管理する。あるＬＢＡに対応する物理アドレスは、このＬＢＡのデータがライトされたＮＡＮＤ型フラッシュメモリ５内の物理記憶位置を示す。ＬＵＴ３２は、ＳＳＤ３の電源オン時にＮＡＮＤ型フラッシュメモリ５からＤＲＡＭ６にロードされてもよい。
【００２６】
一つのページへのデータ書き込みは、一つのプログラム／イレーズ（Ｐ／Ｅ）サイクル当たり１回のみ可能である。このため、コントローラ４は、あるＬＢＡに対応する更新データを、このＬＢＡに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ４は、ＬＵＴ３２を更新してこのＬＢＡをこの別の物理記憶位置に関連付けると共に、以前のデータを無効化する。ＬＵＴ３２から参照されているデータ（すなわち、論理アドレスと紐付けられているデータ）は有効データとも称する。また、どの論理アドレスとも紐付けられていないデータは無効データとも称する。有効データは、後にホスト２からリードされる可能性があるデータである。無効データは、もはやホスト２からリードされる可能性がないデータである。
【００２７】
ブロック管理には、バッドブロックの管理と、ウェアレベリングと、ガベージコレクション（ＧＣ）等が含まれる。ウェアレベリングは、物理ブロックそれぞれの消耗を均一化するための動作である。ガベージコレクションは、データを書き込むことが可能なフリーブロック（フリー論理ブロック）の個数を増やすため、有効データと無効データとが混在するいくつかの対象ブロック（対象論理ブロック）内の有効データを別のブロック（例えばフリー論理ブロック）に移動する。
【００２８】
そして、コントローラ４は、ＬＵＴ３２を更新して、移動された有効データのＬＢＡそれぞれを移動先の物理アドレスにマッピングする。有効データが別のブロックに移動されることによって無効データのみになったブロック（論理ブロック）はフリーブロック（フリー論理ブロック）として解放される。これによって、この論理ブロックはその消去後に再利用することが可能となる。
【００２９】
コントローラ４は、ホストインタフェース１１、ＣＰＵ１２、フラッシュコントローラエンジン１３、ＤＲＡＭインタフェース１４等を含んでもよい。これらホストインタフェース１１、ＣＰＵ１２、フラッシュコントローラエンジン１３、ＤＲＡＭインタフェース１４は、バス１０を介して相互接続されていてもよい。
【００３０】
ホストインタフェース１１は、ホスト２から様々なコマンド、例えば、Ｉ／Ｏコマンド、各種制御コマンド、等を受信する回路として機能する。Ｉ／Ｏコマンドには、ライトコマンド、リードコマンド、アンマップコマンド（トリムコマンド）、フォーマットコマンド、フラッシュコマンド等が含まれ得る。フォーマットコマンドは、メモリシステム（ＳＳＤ３）全体をアンマップするためのコマンドである。フラッシュコマンドは、メモリシステム内にキャッシュされている（バッファされている）ダーティデータ（ユーザデータおよび関連する管理データ）をＮＡＮＤ型フラッシュメモリ５に書き込むことで全てクリーンな状態にするためのコマンドである。
【００３１】
ＤＲＡＭインタフェース１４は、ＤＲＡＭ６のアクセスを制御するように構成されたＤＲＡＭコントローラとして機能する。ＤＲＡＭ６の記憶領域は、上述したように、ＷＢ３１、ＬＵＴ３２等を格納するために利用される。ＤＲＡＭ６の記憶領域は、ＧＣに用いられるＧＣバッファをさらに格納するために利用されてもよい。
【００３２】
ＣＰＵ１２は、ホストインタフェース１１、フラッシュコントローラエンジン１３、およびＤＲＡＭインタフェース１４を制御するように構成されたプロセッサである。ＣＰＵ１２は、図示しないＲＯＭ等に格納されているファームウェア（制御プログラム）２０を実行することによって様々な処理を行う。このＣＰＵ１２は、上述のＦＴＬの処理に加え、ホスト２からの様々なコマンドを処理するためのコマンド処理等を実行することができる。ＣＰＵ１２の動作は、ＣＰＵ１２によって実行される上述のファームウェア２０によって制御される。なお、ＦＴＬ処理およびコマンド処理の一部または全部は、コントローラ４内の専用ハードウェアによって実行されてもよい。
【００３３】
ＣＰＵ１２は、ファームウェア２０を実行することによって、コマンド制御部２１として機能することができる。
【００３４】
コマンド制御部２１は、ホスト２からコマンドを受信し、そのコマンドに応じてコントローラ４内の各部を制御する。ホスト２から受信されるコマンドは、上述したように、ライトコマンド、リードコマンド、等である。コマンド制御部２１は、受信されたコマンドがＮＡＮＤ型フラッシュメモリ５に対するアクセスを要求するコマンドである場合、そのアクセスの内容に応じたコマンドをフラッシュコントローラエンジン１３に送出する。また、コマンド制御部２１は、ガベージコレクション動作のようなＳＳＤ３内の動作により、ＮＡＮＤ型フラッシュメモリ５に対するアクセスが要求される場合に、そのアクセスの内容に応じたコマンドをフラッシュコントローラエンジン１３に送出することもできる。フラッシュコントローラエンジン１３に送出されるコマンドは、例えば、プログラムコマンド、リードコマンド、イレーズコマンド、等である。
【００３５】
より具体的には、例えば、ホスト２からライトコマンドを受信した場合、コマンド制御部２１は、そのライトコマンドで指定されたＬＢＡ範囲（例えば、開始ＬＢＡと、終了ＬＢＡまたはサイズ）に対応する物理アドレス（物理アドレス範囲）を決定し、またそのライトコマンドに応じて受信されたユーザデータをＤＲＡＭ６上のライトバッファ３１に蓄積する。そして、コマンド制御部２１は、指定されたＬＢＡ範囲に対応する物理アドレスに、受信されたユーザデータを書き込むためのプログラムコマンドをフラッシュコントローラエンジン１３に送出する。ユーザデータの書き込みが完了した場合、コマンド制御部２１は、ライトコマンドで指定されたＬＢＡ範囲と、ユーザデータが書き込まれた物理アドレスとの対応を示すように、ＬＵＴ３２を更新する。
【００３６】
また、ホスト２からリードコマンドを受信した場合、コマンド制御部２１は、ＬＵＴ３２を用いて、そのリードコマンドで指定されたＬＢＡ範囲（例えば、開始ＬＢＡと、終了ＬＢＡまたはサイズ）を物理アドレスに変換する。そして、コマンド制御部２１は、この変換により得られた物理アドレスに格納されたデータを読み出すためのリードコマンドをフラッシュコントローラエンジン１３に送出する。データの読み出しが完了したならば、コマンド制御部２１は、読み出されたデータをホスト２に送信する。
【００３７】
さらに、例えば、有効データを格納していないフリーブロック（フリー論理ブロック）の一つが選択され、書き込み先ブロックとして用いられる場合に、コマンド制御部２１は、選択されたフリーブロックにイレーズ処理を施すために、当該フリーブロックに含まれる各物理ブロック内の全てのメモリセルを消去状態にするためのイレーズコマンドをフラッシュコントローラエンジン１３に送出する。イレーズコマンドでは、消去動作が実行されるべき物理ブロックのアドレスが指定される。フリーブロックは、イレーズ処理を経ることで、書き込み先ブロックとして割り当てられる。
【００３８】
図２は、フラッシュコントローラエンジン１３の構成を示す。フラッシュコントローラエンジン１３は、コマンドディスパッチャ４１と、一つ以上のチャネルＣＨ０，ＣＨ１とを備える。各チャネルＣＨ０，ＣＨ１は、ＮＡＮＤ型フラッシュメモリ５内の複数のメモリチップに接続される。
【００３９】
図２に示す例では、チャネルＣＨ０は、複数のメモリチップＭＣ０，ＭＣ１，ＭＣ２，……，ＭＣｘ−１に接続され、チャネルＣＨ１は、複数のメモリチップＭＣｘ，ＭＣｘ＋１，……，ＭＣｙ−１に接続されている。フラッシュコントローラエンジン１３は、チャネルＣＨ０，ＣＨ１毎のチップインタリーブ実行により、各チャネルＣＨ０，ＣＨ１に接続された複数のメモリチップを並列に動作させることができる。
【００４０】
チャネルＣＨ０は、複数のキュー（コマンドキュー）Ｑ０，Ｑ１，Ｑ２，……，Ｑｘ−１、アービタ４２２、インタフェースコントローラ（Ｉ／Ｆコントローラ）４２３、およびキューモニタ部４２４を含む。また、チャネルＣＨ１は、複数のキューＱｘ，Ｑｘ＋１，Ｑｘ＋２，……，Ｑｙ−１、アービタ４３２、Ｉ／Ｆコントローラ４３３、およびキューモニタ部４３４を含む。
【００４１】
複数のキューＱ０，Ｑ１，Ｑ２，……，Ｑｘ−１は、チャネルＣＨ０のＩ／Ｆコントローラ４２３に接続される複数のメモリチップＭＣ０，ＭＣ１，ＭＣ２，……，ＭＣｘ−１にそれぞれ対応する。すなわち、キューＱ０とメモリチップＭＣ０とが相互に関連付けられ、キューＱ１とメモリチップＭＣ１とが相互に関連付けられ、キューＱ２とメモリチップＭＣ２とが相互に関連付けられ、またキューＱｘ−１とメモリチップＭＣｘ−１とが相互に関連付けられる。
【００４２】
同様に、複数のキューＱｘ，Ｑｘ＋１，Ｑｘ＋２，……，Ｑｙ−１は、チャネルＣＨ１のＩ／Ｆコントローラ４３３に接続される複数のメモリチップＭＣｘ，ＭＣｘ＋１，……，ＭＣｙ−１にそれぞれ対応する。すなわち、キューＱｘとメモリチップＭＣｘとが相互に関連付けられ、キューＱｘ＋１とメモリチップＭＣｘ＋１とが相互に関連付けられ、キューＱｘ＋２とメモリチップＭＣｘ＋２とが相互に関連付けられ、またキューＱｙ−１とメモリチップＭＣｙ−１とが相互に関連付けられる。
【００４３】
各キューは、対応するメモリチップに転送（送出）されるコマンドシーケンスを格納することができる。各チャネルＣＨ０，ＣＨ１では、複数のメモリチップにそれぞれ対応する複数のキューを設けることにより、チップインタリーブ実行を効率化させることができる。
【００４４】
なお、一つのキューに対して、複数のメモリチップが関連付けられてもよい。その場合、一つのキューは、対応する複数のメモリチップに対して転送されるコマンドシーケンスを格納する。
【００４５】
コマンドディスパッチャ４１は、フラッシュコントローラエンジン１３に対して送出されたコマンドを受け付け、そのコマンドに応じてアクセスされるメモリチップに対応するキューに格納する。より具体的には、コマンドディスパッチャ４１は、受け付けたコマンドで指定された物理アドレスに基づいて、その物理アドレスによって示される物理記憶位置（領域）を含むメモリチップを特定する。そして、コマンドディスパッチャ４１は、特定されたメモリチップに対応するいずれかのキューに、そのコマンドを格納する。
【００４６】
例えば、メモリチップＭＣ０内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ０に対応するキューＱ０に格納する。メモリチップＭＣ１内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ１に対応するキューＱ１に格納する。メモリチップＭＣ２内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ２に対応するキューＱ２に格納する。また、メモリチップＭＣｘ−１内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣｘ−１に対応するキューＱｘ−１に格納する。
【００４７】
同様に、メモリチップＭＣｘ内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣｘに対応するキューＱｘに格納する。メモリチップＭＣｘ＋１内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣｘ＋１に対応するキューＱｘ＋１に格納する。メモリチップＭＣｘ＋２内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣｘ＋２に対応するキューＱｘ＋２に格納する。また、メモリチップＭＣｙ−１内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣｙ−１に対応するキューＱｙ−１に格納する。
【００４８】
これにより、各チャネルＣＨ０，ＣＨ１に設けられる複数のキューの各々には、コマンドが格納（蓄積）される。
【００４９】
アービタ４２２，４３２は、各チャネルＣＨ０，ＣＨ１における、コマンドが転送される対象（転送元）となるキューの順序を示すアービトレーションルール４２２Ａ，４３２Ａを管理する。アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａとして規定されたキューの順序に則り、各キューに格納されたコマンドの一つを、そのキューに対応するメモリチップに、Ｉ／Ｆコントローラ４２３，４３３を介して順次転送する。なお、アービトレーションルール４２２Ａ，４３２Ａは、例えば、各チャネルＣＨ０，ＣＨ１内に設けられる特定の記憶領域に格納され、また、ＳＳＤ３の電源オン時にＮＡＮＤ型フラッシュメモリ５からその特定の記憶領域にロードされてもよい。
【００５０】
Ｉ／Ｆコントローラ４２３，４３３は、転送されたコマンドが、当該コマンドで指定された物理アドレスを含むいずれかのメモリチップに送出されるように制御する。転送されたコマンドは、格納されていたキューから削除される。また、Ｉ／Ｆコントローラ４２３，４３３は、接続されているメモリチップのレディ／ビジー信号（ＲＹ／ＢＹ）を監視することにより、メモリチップによるコマンドの実行の完了を検出し、またステータスリードコマンドをメモリチップに送出することにより、コマンドに応じた動作の成功／失敗等を検出することもできる。
【００５１】
転送されたコマンドを受信したメモリチップは、そのコマンドを実行し、当該コマンドに応じた動作を行う。より具体的には、例えば、プログラムコマンドを受信したメモリチップは、そのプログラムコマンドに応じて受信されたユーザデータを、指定された物理アドレス（物理記憶位置）に書き込むデータ書き込み動作を行う。リードコマンドを受信したメモリチップは、指定された物理アドレスからデータを読み出すデータ読み出し動作を行う。また、イレーズコマンドを受信したメモリチップは、指定された物理アドレスのデータを消去する消去動作を行う。
【００５２】
以上により、あるチャネルに設けられた複数のキューにそれぞれ対応する複数のメモリチップにおいて、コマンドが並列に実行される。
【００５３】
キューモニタ部４２４，４３４は、例えば、キューから対応するメモリチップにコマンドの転送を開始してから、そのメモリチップによる当該コマンドの実行が完了するまでの時間に基づくコマンド処理速度を、相互に関連付けられたキューとメモリチップの組毎に、計測する。キューモニタ部４２４，４３４は、各キューについて、チップインタリーブ実行中のある単位期間内に、対応するメモリチップにコマンドの転送を開始してから、そのメモリチップによる当該コマンドの実行が完了するまでのコマンド処理時間をコマンド毎に計測する。そして、その単位期間内に計測された幾つかのコマンド処理時間の平均値、最大値、最小値等に基づいて、キューとメモリチップの組毎のコマンド処理速度を算出する。なお、以下では、キューとメモリチップの組のコマンド処理速度を、キューのコマンド処理速度、あるいはメモリチップのコマンド処理速度とも称する。
【００５４】
キューモニタ部４２４，４３４は、キューから対応するメモリチップにコマンドが転送される時点を示す処理開始位置と、メモリチップによる当該コマンドの実行が完了した時点を示す処理終了位置とを検出することができる。コマンド処理時間は、処理開始位置から処理終了位置までの経過時間に相当する。キューモニタ部４２４，４３４は、例えば、各キューや、キューに対応するメモリチップの状態を示すレジスタを読み取ることにより、コマンドの処理開始位置や処理終了位置を検出する。
【００５５】
あるいは、キューモニタ部４２４，４３４は、キューから対応するメモリチップに転送されるコマンドの転送速度（コマンド転送速度）を、キュー毎に計測してもよい。キューモニタ部４２４，４３４は、キュー毎に、例えば、チップインタリーブ実行中のある単位期間内に、そのキューから対応するメモリチップに転送されたコマンドの数をカウントする。そして、キューモニタ部４２４，４３４は、カウントされたコマンドの数を用いてコマンド転送速度を算出（決定）する。
【００５６】
より具体的には、キューモニタ部４２４，４３４は、単位期間において、あるキューから対応するメモリチップに対して転送されたコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方をカウントする。そして、キューモニタ部４２４，４３４は、カウントされたコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方を用いて、コマンド転送速度を決定（算出）する。
【００５７】
なお、一つのキューに対して複数のメモリチップが関連付けられる場合にも、キューモニタ部４２４，４３４は、同様にして、関連付けられたキューとメモリチップの組毎のコマンド処理速度またはコマンド転送速度を算出することができる。
【００５８】
アービタ４２２，４３２は、キューモニタ部４２４，４３４によって取得された各キューのコマンド処理速度またはコマンド転送速度に基づいて、コマンドが転送される対象となるキューの順序が、コマンド処理速度またはコマンド転送速度が遅い順に対応するように、アービトレーションルール４２２Ａ，４３２Ａを変更することもできる。
【００５９】
例えば、チャネルＣＨ０に接続される並列に動作可能な複数のメモリチップに、第１メモリチップと第２メモリチップとが含まれる場合を想定する。コマンド制御部２１は、ホスト２から受信されるコマンド等に応じて、第１メモリチップによって実行されるべき第１コマンドと、第２メモリチップによって実行されるべき第２コマンドとを生成し、フラッシュコントローラエンジン１３に送出する。
【００６０】
コマンドディスパッチャ４１は、第１コマンドを、第１メモリチップに関連付けられた第１キューに格納し、第２コマンドを、第２メモリチップに関連付けられた第２キューに格納する。そして、アービタ４２２は、アービトレーションルール４２２Ａに従うことによって、以下のように動作する。
【００６１】
アービタ４２２は、（１）第１メモリチップへコマンドの転送を開始してから第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、第２メモリチップへコマンドの転送を開始してから第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送した後に、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送する。また、アービタ４２２は、（２）第２コマンド処理速度が第１コマンド処理速度よりも遅いならば、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送した後に、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送する。
【００６２】
これら第１処理速度と第２処理速度とは、第１メモリチップによって実行されるべき第３コマンドと第２メモリチップによって実行されるべき第４コマンドとが処理される際に計測され得る。より具体的には、コマンドディスパッチャ４１は、第３コマンドを第１キューに格納し、第４コマンドを第２キューに格納する。キューモニタ部４２４は、第１キューから第３コマンドを取得し、取得された第３コマンドを第１メモリチップへ転送してから、第１メモリチップによる第３コマンドの実行が完了するまでの時間に基づいて第１コマンド処理速度を計測する。また、キューモニタ部４２４は、第２キューから第４コマンドを取得し、取得された第４コマンドを第２メモリチップへ転送してから、第２メモリチップによる第４コマンドの実行が完了するまでの時間に基づいて第２コマンド処理速度を計測する。
【００６３】
あるいは、アービタ４２２は以下のように動作してもよい。
【００６４】
アービタ４２２は、（１）第１期間において第１メモリチップへ転送されたコマンドの数に基づく第１コマンド転送速度が、その第１期間において第２メモリチップへ転送されたコマンドの数に基づく第２コマンド転送速度よりも遅いならば、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送した後に、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送する。また、アービタ４２２は、（２）第２コマンド転送速度が第１コマンド転送速度よりも遅いならば、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送した後に、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送する。
【００６５】
これら第１転送速度と第２転送速度とは、第１メモリチップによって実行されるべき複数の第３コマンドと第２メモリチップによって実行されるべき複数の第４コマンドとが処理される際に計測され得る。より具体的には、キューモニタ部４２４は、第１期間において、第１キューに格納される複数の第３コマンドの内、第１メモリチップへ転送されたコマンドの第１の数をカウントし、第２キューに格納される複数の第４コマンドの内、第２メモリチップへ転送されたコマンドの第２の数をカウントする。キューモニタ部４２４は、カウントされた第１の数に基づいて第１コマンド転送速度を決定し、カウントされた第２の数に基づいて第２コマンド転送速度を決定する。
【００６６】
なお、第１コマンドが第１データを第１メモリチップに書き込むためのプログラムコマンドであり、第２コマンドが第２データを第２メモリチップに書き込むためのプログラムコマンドである場合、アービタ４２２は以下のように動作する。すなわち、アービタ４２２は、（１）第１コマンド処理速度が第２コマンド処理速度よりも遅いならば、あるいは第１コマンド転送速度が第２コマンド転送速度よりも遅いならば、第１データを第１メモリチップに転送して第１メモリチップにプログラムを指示した後に、第２データを第２メモリチップに転送して第２メモリチップにプログラムを指示する。また、アービタ４２２は、（２）第２コマンド処理速度が第１コマンド処理速度よりも遅いならば、あるいは第２コマンド転送速度が第１コマンド転送速度よりも遅いならば、第２データを第２メモリチップに転送して第２メモリチップにプログラムを指示した後に、第１データを第１メモリチップに転送して第１メモリチップにプログラムを指示する。
【００６７】
以下では、説明を分かりやすくするために、図３に示すように、チャネルＣＨ０に４個のキューＱ０〜Ｑ３が設けられる場合について主に例示する。これら４個のキューＱ０〜Ｑ３は、ＮＡＮＤ型フラッシュメモリ５に設けられる４個のメモリチップＭＣ０〜ＭＣ３にそれぞれ対応する。図３は、アービトレーションルール４２２Ａの例と、当該アービトレーションルール４２２Ａに規定されたキューの順序に従って転送されたコマンドが、メモリチップＭＣ０〜ＭＣ３で並列に実行される例とを示す。
【００６８】
図３（Ａ）は、アービトレーションルール４２２Ａで規定された、コマンドが転送される対象となるキューの順序の例を示す。図３（Ａ）では、キューＱ０、キューＱ１、キューＱ２、キューＱ３の順序であるラウンドロビンのコマンドアービトレーションルールが規定されている。
【００６９】
また、図３（Ｂ）は、アービトレーションルール４２２Ａに示されるキューの順序に従って、各々のキューに格納されたコマンドの一つが、対応するメモリチップに対して転送されることを示す。各キューから転送されるコマンドは、例えば、そのキューに格納されている一つ以上のコマンド（コマンドシーケンス）の内、当該キューに格納されたタイミングが最も早いコマンドである。
【００７０】
より具体的には、図３（Ｂ）に示すように、アービトレーションルール４２２Ａに従って、最初のキューＱ０に格納されたコマンド（例えば、プログラムコマンド）が、対応するメモリチップＭＣ０に対して転送される場合、そのコマンドに応じたデータがメモリチップＭＣ０に転送されるデータ転送期間Ｔ００の後、メモリチップＭＣ０は当該コマンドに応じた動作（例えば、データ書き込み動作）の期間Ｔ０１、ビジー状態（チップビジー）となる。つまり、キューＱ０からメモリチップＭＣ０に転送された一つのコマンドの処理には、データ転送期間Ｔ００と、当該コマンドに応じた動作期間Ｔ０１とを含む時間（コマンド処理時間）を要する。動作期間は、メモリチップによるコマンド実行時間であり、チップビジー期間とも称する。
【００７１】
次いで、メモリチップＭＣ０へのデータ転送期間Ｔ００が完了したことに応じて、キューＱ０に後続するキューＱ１に格納されたコマンドが、対応するメモリチップＭＣ１に転送される。この場合、そのコマンドに応じたデータがメモリチップＭＣ１に転送されるデータ転送期間Ｔ１０の後、メモリチップＭＣ１は当該コマンドに応じた動作の期間Ｔ１１、ビジー状態となる。つまり、キューＱ１からメモリチップＭＣ１に転送された一つのコマンドの処理には、データ転送期間Ｔ１０と、当該コマンドに応じた動作期間Ｔ１１とを含む時間を要する。
【００７２】
そして、メモリチップＭＣ１へのデータ転送期間Ｔ１０が完了したことに応じて、キューＱ１に後続するキューＱ２に格納されたコマンドが、対応するメモリチップＭＣ２に転送される。この場合、そのコマンドに応じたデータがメモリチップＭＣ２に転送されるデータ転送期間Ｔ２０の後、メモリチップＭＣ２は当該コマンドに応じた動作の期間Ｔ２１、ビジー状態となる。つまり、キューＱ２からメモリチップＭＣ２に転送された一つのコマンドの処理には、データ転送期間Ｔ２０と、当該コマンドに応じた動作期間Ｔ２１とを含む時間を要する。
【００７３】
さらに、メモリチップＭＣ２へのデータ転送期間Ｔ２０が完了したことに応じて、キューＱ２に後続するキューＱ３に格納されたコマンドが、対応するメモリチップＭＣ３に転送される。この場合、そのコマンドに応じたデータがメモリチップＭＣ３に転送されるデータ転送期間Ｔ３０の後、メモリチップＭＣ３は当該コマンドに応じた動作の期間Ｔ３１、ビジー状態となる。つまり、キューＱ３からメモリチップＭＣ３に転送された一つのコマンドの処理には、データ転送期間Ｔ３０と、当該コマンドに応じた動作期間Ｔ３１とを含む時間を要する。
【００７４】
上述した例では、アービタ４２２は、転送順序が連続するキュー間で、コマンドの処理開始（転送開始）のタイミングをデータ転送期間だけずらして、複数のキューから各々に対応する複数のメモリチップに転送されるコマンドを並列に処理（チップインタリーブ実行）している。つまり、あるキューから転送されるコマンドのデータ転送期間と、後続するキューから転送されるコマンドのデータ転送期間とが連続し、これら二つのデータ転送期間の間に遅延はない。
【００７５】
これに対して、図４に示すように、ある種類のコマンド（例えば、プログラムコマンド）の実行に応じた動作期間Ｔ０１，Ｔ１１，Ｔ２１，Ｔ３１が、メモリチップＭＣ０〜ＭＣ３毎に異なり、ばらつきがある場合を想定する。より具体的には、複数のメモリチップＭＣ０〜ＭＣ３のコマンド実行速度（例えば、プログラム速度）が、メモリチップＭＣ３、メモリチップＭＣ１、メモリチップＭＣ０、メモリチップＭＣ２の順に遅い場合（ＭＣ３＜ＭＣ１＜ＭＣ０＜ＭＣ２）を想定する。
【００７６】
図４に示す例では、キューＱ０からメモリチップＭＣ０に２番目のコマンドが転送されたときに、このコマンドに応じたデータがメモリチップＭＣ０に転送されるデータ転送期間Ｔ０２が完了したにも関わらず、後続するキューＱ１からメモリチップＭＣ１に２番目のコマンドを転送することができていない。これは、データ転送期間Ｔ０２が完了したときに、キューＱ１に対応するメモリチップＭＣ１による１番目のコマンドの実行が完了しておらず、メモリチップＭＣ１がビジー状態（Ｔ１１）であるためである。
【００７７】
そのため、後続するキューＱ１からメモリチップＭＣ１への２番目のコマンドは、メモリチップＭＣ１による１番目のコマンドの実行が完了したこと（すなわち、１番目のコマンドに応じた動作期間Ｔ１１が完了したこと）に応じて転送が開始されることになる。したがって、メモリチップＭＣ０に対するデータ転送期間Ｔ０２が完了してからメモリチップＭＣ１に対するデータ転送期間Ｔ１２が開始されるまでに、遅延時間Ｌ１が生じることになる。
【００７８】
同様に、キューＱ２からメモリチップＭＣ２に２番目のコマンドが転送されたときに、このコマンドに応じたデータがメモリチップＭＣ２に転送されるデータ転送期間Ｔ２２が完了したにも関わらず、後続するキューＱ３からメモリチップＭＣ３に２番目のコマンドを転送することができていない。これは、データ転送期間Ｔ２２が完了したときに、キューＱ３に対応するメモリチップＭＣ３による１番目のコマンドの実行が完了しておらず、メモリチップＭＣ３がビジー状態（Ｔ３１）であるためである。
【００７９】
そのため、後続するキューＱ３からメモリチップＭＣ３への２番目のコマンドは、メモリチップＭＣ３による１番目のコマンドの実行が完了したこと（すなわち、１番目のコマンドに応じた動作期間Ｔ３１が完了したこと）に応じて転送が開始されることになる。したがって、メモリチップＭＣ２に対するデータ転送期間Ｔ２２が完了してからメモリチップＭＣ３に対するデータ転送期間Ｔ３２が開始されるまでに、遅延時間Ｌ２が生じることになる。
【００８０】
このように、対応するキューＱ１，Ｑ３が新たなコマンドを転送可能な順番になっても、コマンド実行速度が遅いメモリチップＭＣ１，ＭＣ３がビジー状態であるので、キューＱ１，Ｑ３からメモリチップＭＣ１，ＭＣ３に新たなコマンドを転送することができない。これにより生じる遅延時間Ｌ１，Ｌ２により、チャネルＣＨ０に接続された複数のメモリチップＭＣ０〜ＭＣ３全体のアクセス性能が低下する。すなわち、コマンド実行速度が遅いメモリチップＭＣ１，ＭＣ３は、チャネルＣＨ０に接続された複数のメモリチップＭＣ０〜ＭＣ３全体でのアクセス性能を低下させるボトルネックとなる。
【００８１】
そのため、本実施形態では、コマンドが転送される対象となるキューの順序（アービトレーションルール）を、キュー毎のコマンド処理速度またはコマンド転送速度に基づいて動的に変更する。上述したように、コマンド処理速度は、キューから対応するメモリチップにコマンドの転送が開始されてから、メモリチップによる当該コマンドの実行が完了するまでの時間に基づく速度である。また、コマンド転送速度は、単位期間内にキューからメモリチップに転送されたコマンドの数に基づく速度である。
【００８２】
図５に示す例では、複数のメモリチップのコマンド実行速度（例えば、プログラム速度）が、メモリチップＭＣ３、メモリチップＭＣ１、メモリチップＭＣ０、メモリチップＭＣ２の順に遅い場合（ＭＣ３＜ＭＣ１＜ＭＣ０＜ＭＣ２）に、キューＱ３、キューＱ１、キューＱ０、キューＱ２の順序であるラウンドロビンのコマンドアービトレーションルールが規定されている。コマンドが転送される対象となるキューの順序は、対応するメモリチップのコマンド実行速度が遅い順序に対応している。したがって、データ転送期間が一定であるとするならば、コマンドが転送される対象となるキューの順序は、コマンド処理速度が遅い順序に対応している。
【００８３】
この場合、キューＱ３から対応するメモリチップＭＣ３に２番目のコマンド（２番目のコマンドに応じたデータ）が転送されるデータ転送期間Ｔ３２が完了したことに応じて、後続するキューＱ１からメモリチップＭＣ１に２番目のコマンドを転送することができる。つまり、データ転送期間Ｔ３２が完了したときに、後続するキューＱ１に対応するメモリチップＭＣ１による１番目のコマンドの実行が完了しているので、遅延時間を生じることなく、後続するキューＱ１からメモリチップＭＣ１に２番目のコマンドを転送することができる。  
【００８４】
順序が連続する他のキュー間でも同様のことが云える。
【００８５】
したがって、コマンドが転送される対象となるキューの順序を、対応するメモリチップのコマンド実行速度が遅い順序に対応させることにより、図４に示した例の場合よりも、チャネルＣＨ０に接続された複数のメモリチップＭＣ０〜ＭＣ３全体でのアクセス性能を向上させることができる。
【００８６】
図６は、コマンド処理速度（コマンド実行速度）に基づいて、コマンドが転送される対象となるキューの順序を変更した場合に、チャネルＣＨ０に接続された複数のメモリチップＭＣ０〜ＭＣ３全体でのアクセス性能が向上する具体的な例を示す。ここでは、キューＱ０〜Ｑ３からメモリチップＭＣ０〜ＭＣ３にプログラムコマンドが転送される場合を例示する。
【００８７】
また、コマンドに応じたデータがメモリチップＭＣ０〜ＭＣ３に転送されるデータ転送期間が一定の８０マイクロ秒（μｓ）であり、メモリチップＭＣ０によるプログラム時間が２８０μｓであり、メモリチップＭＣ１によるプログラム時間が３２０μｓであり、メモリチップＭＣ２によるプログラム時間が２４０μｓであり、メモリチップＭＣ３によるプログラム時間が３６０μｓであることを想定する。なお、プログラム時間は、転送されたプログラムコマンドを実行するメモリチップの動作期間である。つまり、プログラム時間は、プログラムコマンドが転送されたことに応じて、対応するメモリチップが動作することによりビジー状態に維持される期間である。したがって、メモリチップＭＣ０〜ＭＣ３のプログラム速度（コマンド実行速度）は、メモリチップＭＣ３、メモリチップＭＣ１、メモリチップＭＣ０、メモリチップＭＣ２の順に遅い。また、コマンド処理速度も、メモリチップＭＣ３（キューＱ３）、メモリチップＭＣ１（キューＱ１）、メモリチップＭＣ０（キューＱ０）、メモリチップＭＣ２（キューＱ２）の順に遅い。
【００８８】
まず、（ａ）コマンド処理速度に関係なく、キューＱ０、キューＱ１、キューＱ２、キューＱ３の順に、対応するメモリチップＭＣ０，ＭＣ１，ＭＣ２，ＭＣ３にそれぞれプログラムコマンドが転送される場合について説明する。この場合、図４に示した例と同様に、対応するキューＱ１，Ｑ３から新たなコマンドを転送可能な順番になっても、プログラム速度が遅いメモリチップＭＣ１，ＭＣ３がビジー状態であるので、キューＱ１，Ｑ３からメモリチップＭＣ１，ＭＣ３に新たなコマンドを転送することができない状況が生じる。
【００８９】
図６に示す例では（ａ）の場合に、このような状況が、データ転送期間Ｔ０２が終了してからデータ転送期間Ｔ１２が開始されるまで、データ転送期間Ｔ２２が終了してからデータ転送期間Ｔ３２が開始されるまで、データ転送期間Ｔ０４が終了してからデータ転送期間Ｔ１４が開始されるまで、およびデータ転送期間Ｔ２４が終了してからデータ転送期間Ｔ３４が開始されるまでにおいて生じている。そして、メモリチップＭＣ０〜ＭＣ３にそれぞれ３個のコマンドが転送される場合に要する全体の処理時間は１５６０μｓになる。
【００９０】
次いで、（ｂ）コマンドが転送される対象となるキューの順序を、コマンド処理速度が遅い順序に対応させる場合、すなわち、キューＱ３、キューＱ１、キューＱ０、キューＱ２の順に、対応するメモリチップＭＣ３，ＭＣ１，ＭＣ０，ＭＣ２にそれぞれプログラムコマンドが転送される場合について説明する。この場合には、キューＱ０〜Ｑ３が新たなコマンドを転送可能な順番になったときに、対応するメモリチップＭＣ０〜ＭＣ３がビジー状態であるという状況を無くすか、あるいは低減することができる。
【００９１】
図６に示す例では（ｂ）の場合において、キューＱ１，Ｑ０，Ｑ２が新たなコマンドを転送可能な順番になったときに、各々に対応するメモリチップＭＣ１，ＭＣ０，ＭＣ２がビジー状態であることがないので、キューＱ１，Ｑ０，Ｑ２から対応するメモリチップＭＣ１，ＭＣ０，ＭＣ２に新たなコマンドを遅延なく転送することができる。これにより、メモリチップＭＣ０〜ＭＣ３にそれぞれ３個のコマンドが転送される場合に要する全体の処理時間は１４４０μｓになる。
【００９２】
したがって、図６に示すように、コマンドが転送される対象となるキューの順序を、コマンド処理速度が遅い順序に対応させるように変更した場合、キューＱ０〜Ｑ３からメモリチップＭＣ０〜ＭＣ３にコマンドを転送して実行する全体の処理時間を１２０μｓだけ短縮することができる。
【００９３】
なお、上述したコマンド処理速度の代わりに、単位期間内に各キューから対応するメモリチップに転送されたコマンドの数に基づくコマンド転送速度が用いられてもよい。各キューＱ０〜Ｑ３のコマンド転送速度は、例えば、キューＱ０〜Ｑ３毎にカウントされる、単位期間内に転送されたコマンドの数に基づいて決定され得る。また、各キューＱ０〜Ｑ３のコマンド転送速度は、キューＱ０〜Ｑ３毎にカウントされる、単位期間内にコマンドの転送が開始された位置（処理開始位置）の数と、メモリチップによるコマンドの実行が終了した位置（処理終了位置）の数の少なくとも一方に基づいて決定されてもよい。
【００９４】
図７は、キューＱ０〜Ｑ３毎に、単位期間内のコマンドの処理開始位置と処理終了位置とがカウントされる例を示す。ここでは、コマンドに応じたデータがメモリチップＭＣ０〜ＭＣ３に転送されるデータ転送期間が一定の８０μｓであり、メモリチップＭＣ０によるプログラム時間（チップビジー期間）が３２０μｓであり、メモリチップＭＣ１によるプログラム時間が２８０μｓであり、メモリチップＭＣ２によるプログラム時間が２４０μｓであり、メモリチップＭＣ３によるプログラム時間が３６０μｓであることを想定する。図７に示す例では、図６を参照して上述した（ａ）の場合と同様に、コマンド実行速度が遅いメモリチップＭＣ３がビジー状態であるので、対応するキューＱ３が新たなコマンドを転送可能な順番になっても、キューＱ３からメモリチップＭＣ３に新たなコマンドを転送することができない状況が生じている。
【００９５】
キューモニタ部４２４は、単位期間内において、例えば、キューからメモリチップにデータ転送が開始された時点（例えば、データ転送期間Ｔ０２の先頭位置）をコマンドの処理開始位置としてカウントし、メモリチップによる当該コマンドの実行が完了した時点（例えば、チップビジー期間Ｔ０３の終端位置）を処理終了位置としてカウントする。メモリチップによる当該コマンドの実行が完了した時点は、例えば、メモリチップから実行完了の応答があった時点や、メモリチップがビジー状態からレディ状態に戻った時点である。
【００９６】
キューモニタ部４２４は、例えば、キューＱ０について、単位期間に含まれるデータ転送期間Ｔ０２およびＴ０４の先頭位置を二つのコマンド処理開始位置としてカウントし、プログラム時間Ｔ０１およびＴ０３の終端位置を二つのコマンド処理終了位置としてカウントする。図７では、キューＱ０の単位期間内における処理開始位置の数と処理終了位置の数とが（２，２）と示されている。
【００９７】
同様にして、キューＱ１とキューＱ２の各々について、二つのコマンド処理開始位置と二つのコマンド処理終了位置（すなわち、（２，２））がカウントされる。また、キューＱ３について、単位期間に含まれるデータ転送期間Ｔ３０およびＴ３２の先頭位置が二つのコマンド処理開始位置としてカウントされ、プログラム時間Ｔ３１の終端位置が一つのコマンド処理終了位置としてカウントされる。図７では、キューＱ３の単位期間内における処理開始位置の数と処理終了位置の数とが（２，１）と示されている。
【００９８】
アービタ４２２は、カウントされたキュー毎のコマンド処理開始位置の数とコマンド処理終了位置の数の少なくとも一方を用いて、アービトレーションルール４２２Ａの変更が必要であるか否かを判定し、必要であればアービトレーションルール４２２Ａを変更する。
【００９９】
より具体的には、アービタ４２２は、カウントされたコマンド処理開始位置の数が小さい順、カウントされたコマンド処理終了位置の数が小さい順、またはカウントされたコマンド処理開始位置とコマンド処理終了位置との和が小さい順に、コマンドが転送される対象となるキューの順序を入れ替える。図７に示す例では、アービタ４２２は、カウントされたコマンド処理終了位置の数（＝１）が最も小さいキューＱ３が、コマンドが転送される対象となる順序の先頭となるようにアービトレーションルール４２２Ａを変更する。変更後のアービトレーションルール４２２Ａは、例えば、キューＱ３、キューＱ０、キューＱ１、キューＱ２の順に、対応するメモリチップＭＣ３，ＭＣ０，ＭＣ１，ＭＣ２にそれぞれコマンドが転送されることを示す。このキューＱ３、キューＱ０、キューＱ１、キューＱ２の順は、コマンド処理時間が長い順、すなわち、コマンド処理速度が遅い順に対応している。
【０１００】
図８は、この変更後のアービトレーションルール４２２Ａに基づいてコマンドが転送される例を示す。図８に示す例では、キューＱ０，Ｑ１，Ｑ２が新たなコマンドを転送可能な順番になったときに、各々に対応するメモリチップＭＣ０，ＭＣ１，ＭＣ２がビジー状態であることがないので、キューＱ０，Ｑ１，Ｑ２から対応するメモリチップＭＣ０，ＭＣ１，ＭＣ２に新たなコマンドを即座に転送することができる。つまり、あるキューに対応するメモリチップに対するデータ転送期間が完了してから、次のキューに対応するメモリチップに対するデータ転送期間が開始されるまでに、遅延時間が生じない。このような構成において、メモリチップＭＣ０〜ＭＣ３にそれぞれ３個のコマンドが転送される場合に要する全体の処理時間は１４４０μｓになる。
【０１０１】
したがって、図７に示した例と図８に示した例とを比較すると、コマンドが転送される対象となるキューの順序を、単位期間内にカウントされたコマンド処理終了位置の数が小さい順序に対応させるように変更した場合、複数のメモリチップＭＣ０〜ＭＣ３の全体の処理時間を１２０μｓだけ短縮することができる。
【０１０２】
なお、図８に示した例では、単位期間において、キューＱ０〜Ｑ３のコマンド処理開始位置の数が全て同じであり、またコマンド処理終了位置の数も全て同じである（（２，２））。したがって、アービトレーションルール４２２Ａは変更されない。
【０１０３】
次いで、図９は、メモリチップＭＣ０〜ＭＣ３のプログラム時間が、図７および図８で示した例とは異なる場合を示す。図９に示す例では、コマンドに応じたデータがメモリチップＭＣ０〜ＭＣ３に転送されるデータ転送期間が一定の８０μｓであり、メモリチップＭＣ０によるプログラム時間（チップビジー期間）が２８０μｓであり、メモリチップＭＣ１によるプログラム時間が３２０μｓであり、メモリチップＭＣ２によるプログラム時間が２４０μｓであり、メモリチップＭＣ３によるプログラム時間が３６０μｓであることを想定する。この場合、対応するキューＱ１，Ｑ３が新たなコマンドを転送可能な順番になっても、コマンド実行速度が遅いメモリチップＭＣ１，ＭＣ３がビジー状態であるので、キューＱ１，Ｑ３からメモリチップＭＣ１，ＭＣ３に新たなコマンドを転送することができない状況が生じている。
【０１０４】
キューモニタ部４２４は、キューＱ０について、単位期間に含まれるデータ転送期間Ｔ０２およびＴ０４の先頭位置を二つのコマンド処理開始位置としてカウントし、プログラム時間Ｔ０１およびＴ０３の終端位置を二つのコマンド処理終了位置としてカウントする。図９では、キューＱ０の単位期間内における処理開始位置の数と処理終了位置の数とが（２，２）と示されている。
【０１０５】
同様にして、キューＱ１とキューＱ２の各々について、二つのコマンド処理開始位置と二つのコマンド処理終了位置（すなわち、（２，２））がカウントされる。また、キューＱ３について、単位期間に含まれるデータ転送期間Ｔ３０およびＴ３２の先頭位置が二つのコマンド処理開始位置としてカウントされ、プログラム時間Ｔ３１の終端位置が一つのコマンド処理終了位置としてカウントされる。図９では、キューＱ３の単位期間内における処理開始位置の数と処理終了位置の数とが（２，１）と示されている。
【０１０６】
アービタ４２２は、カウントされたキュー毎のコマンド処理開始位置の数とコマンド処理終了位置の数の少なくとも一方を用いて、アービトレーションルール４２２Ａの変更が必要であるか否かを判定し、必要であればアービトレーションルール４２２Ａを変更する。
【０１０７】
より具体的には、アービタ４２２は、カウントされたコマンド処理開始位置の数が小さい順、カウントされたコマンド処理終了位置の数が小さい順、またはカウントされたコマンド処理開始位置とコマンド処理終了位置との和が小さい順に、コマンドが転送される対象となるキューの順序を入れ替える。図９に示す例では、アービタ４２２は、カウントされたコマンド処理終了位置の数（＝１）が最も小さいキューＱ３が、コマンドが転送される対象となる順序の先頭となるようにアービトレーションルール４２２Ａを変更する。変更後のアービトレーションルール４２２Ａは、例えば、キューＱ３、キューＱ０、キューＱ１、キューＱ２の順に、対応するメモリチップＭＣ３，ＭＣ０，ＭＣ１，ＭＣ２にそれぞれコマンドが転送されることを示す。
【０１０８】
図１０は、この変更後のアービトレーションルール４２２Ａに基づいてコマンドが転送される例を示す。図１０に示す例では、キューＱ０，Ｑ１，Ｑ２が新たなコマンドを転送可能な順番になったときに、各々に対応するメモリチップＭＣ０，ＭＣ１，ＭＣ２がビジー状態であることがないので、キューＱ０，Ｑ１，Ｑ２から対応するメモリチップＭＣ０，ＭＣ１，ＭＣ２に新たなコマンドを即座に転送することができる。つまり、あるキューに対応するメモリチップに対するデータ転送期間が完了してから、次のキューに対応するメモリチップに対するデータ転送期間が開始されるまでに、遅延時間が生じない。このような構成において、メモリチップＭＣ０〜ＭＣ３に対してそれぞれ３個のコマンドが転送される場合に要する全体の処理時間は１４４０μｓになる。
【０１０９】
したがって、図９に示した例と図１０に示した例とを比較すると、コマンドが転送される対象となるキューの順序を、単位期間内にカウントされたコマンド処理終了位置の数が小さい順序に対応させるように変更した場合、キューＱ０〜Ｑ３からメモリチップＭＣ０〜ＭＣ３にコマンドを転送して実行する全体の処理時間を１２０μｓだけ短縮することができる。
【０１１０】
なお、図１０に示した例では、変更後のアービトレーションルール４２２Ａに示されるキューＱ３、キューＱ０、キューＱ１、キューＱ２の順は、コマンド処理時間が長い順（キューＱ３，Ｑ１，Ｑ０，Ｑ２の順）とは一部が対応していない。しかし、キューＱ０〜Ｑ３からのメモリチップＭＣ０〜ＭＣ３にコマンドを転送して実行する全体の処理時間は、変更後のアービトレーションルール４２２Ａに示されるキューの順序が、コマンド処理時間が長い順と一致する図８の例と同様に短縮されている。このように、コマンド処理時間の関係によっては、必ずしもキューＱ０〜Ｑ３の順序をコマンド処理時間が長い順に完全に対応させなくても、同様の短縮の効果を得ることができる場合もある。
【０１１１】
また、図１０に示した例では、キューＱ０〜Ｑ３のコマンド処理開始位置の数が全て同じであり、またコマンド処理終了位置の数も全て同じである（（２，２））。したがって、アービトレーションルール４２２Ａは変更されない。
【０１１２】
次いで、図１１から図１４を参照して、フラッシュコントローラエンジン１３の動作について説明する。ここでは、一例として、チャネルＣＨ０における動作について説明するが、他のチャネルにおける動作も同様である。
【０１１３】
図１１に示すように、コマンドディスパッチャ４１は、コマンド制御部２１（ＣＰＵ１２）により送出されたコマンドＣ０〜Ｃ４を受け付ける。上述したように、コマンドＣ０〜Ｃ４は、ホスト２から受信される様々なコマンド（例えば、ライトコマンド、リードコマンド等）を処理することや、ガベージコレクション動作のようなＳＳＤ３内の動作により生成された、メモリチップＭＣ０〜ＭＣ３によって実行されるコマンドである。
【０１１４】
コマンドディスパッチャ４１が受け付ける各コマンドＣ０〜Ｃ４は、例えば、プログラムコマンド、リードコマンド、およびイレーズコマンドのいずれかである。プログラムコマンドでは、データが書き込まれるべき物理アドレス（例えば、チップ、ブロック、およびページ）が指定されている。リードコマンドでは、データが読み出されるべき物理アドレスが指定されている。また、イレーズコマンドでは、データが消去されるべき物理アドレスが指定されている。
【０１１５】
コマンドディスパッチャ４１が受け付けるコマンドＣ０〜Ｃ４には、例えば、シーケンシャルライトのためのプログラムコマンドも含まれ得る。また、コマンドＣ０〜Ｃ４には、様々な種類のコマンドが混在していてもよい。
【０１１６】
コマンドディスパッチャ４１は、各コマンドＣ０〜Ｃ４で指定された物理アドレスに基づき、コマンドＣ０〜Ｃ４をキューＱ０〜Ｑ３に振り分ける。より具体的には、コマンドディスパッチャ４１は、メモリチップＭＣ０〜ＭＣ３から、指定された物理アドレスによって示される物理記憶位置を含むメモリチップを特定する。そして、コマンドディスパッチャ４１は、キューＱ０〜Ｑ３の内の、特定されたメモリチップに対応するキューにコマンドを格納（蓄積）する。
【０１１７】
例えば、メモリチップＭＣ０内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ０に対応するキューＱ０に格納する。メモリチップＭＣ１内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ１に対応するキューＱ１に格納する。メモリチップＭＣ２内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ２に対応するキューＱ２に格納する。また、メモリチップＭＣ３内の物理アドレスを指定するコマンドを受け付けた場合、コマンドディスパッチャ４１は、そのコマンドをメモリチップＭＣ３に対応するキューＱ３に格納する。
【０１１８】
図１２は、コマンドディスパッチャ４１による振り分けによって、各キューＱ０〜Ｑ３にコマンドが格納された例を示す。ここでは、キューＱ０にコマンドＣ０，Ｃ４が格納され、キューＱ１にコマンドＣ２，Ｃ５が格納され、キューＱ２にコマンドＣ１，Ｃ７が格納され、キューＱ３にコマンドＣ３，Ｃ６が格納されている。したがって、コマンドＣ０，Ｃ４は、キューＱ０に対応するメモリチップＭＣ０に転送されるコマンドであり、コマンドＣ２，Ｃ５は、キューＱ１に対応するメモリチップＭＣ１に転送されるコマンドであり、コマンドＣ１，Ｃ７は、キューＱ２に対応するメモリチップＭＣ２に転送されるコマンドであり、コマンドＣ３，Ｃ６は、キューＱ３に対応するメモリチップＭＣ３に転送されるコマンドである。
【０１１９】
アービタ４２２は、アービトレーションルール４２２Ａに従って、キューＱ０〜Ｑ３に格納されたコマンドを取得し、メモリチップＭＣ０〜ＭＣ３に取得したコマンドに応じた処理を実行させる。図１３に示す例では、アービトレーションルール４２２Ａは、コマンドが転送される対象となるキューの順序がキューＱ０、キューＱ１、キューＱ２、キューＱ３の順であることを示している。
【０１２０】
図１３に示すように、アービタ４２２は、このアービトレーションルール４２２Ａに従って以下のように動作する。  
（１）キューＱ０からコマンドＣ０を取得し、対応するメモリチップＭＣ０にコマンドＣ０を転送する（メモリチップＭＣ０にコマンドＣ０に応じた処理を実行させる）。  
（２）キューＱ１からコマンドＣ２を取得し、対応するメモリチップＭＣ１にコマンドＣ２を転送する（メモリチップＭＣ１にコマンドＣ２に応じた処理を実行させる）。  
（３）キューＱ２からコマンドＣ１を取得し、対応するメモリチップＭＣ２にコマンドＣ２を転送する（メモリチップＭＣ２にコマンドＣ１に応じた処理を実行させる）。  
（４）キューＱ３からコマンドＣ３を取得し、対応するメモリチップＭＣ３にコマンドＣ３を転送する（メモリチップＭＣ３にコマンドＣ３に応じた処理を実行させる）。
【０１２１】
また、キューモニタ部４２４は、上記のような動作を監視（モニタリング）することにより、各キューのコマンド転送速度、または関連付けられたキューとメモリチップの複数の組の各々のコマンド処理速度を取得する。コマンド転送速度は、上述したように、例えば、単位期間内におけるコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方を、キュー毎にカウントすることによって得られる。また、コマンド処理速度は、コマンドの処理開始位置から処理終了位置までの経過時間に基づいて得られる。
【０１２２】
取得されたコマンド転送速度またはコマンド処理速度が、例えば、キューＱ３、キューＱ０、キューＱ１、キューＱ２の順に遅いことを示す場合、アービタ４２２は、コマンドが転送される対象となるキューの順序が、コマンド転送速度またはコマンド処理速度が遅い順に対応するようにアービトレーションルール４２２Ａを変更する。したがって、図１４に示すように、変更後のアービトレーションルール４２２Ａは、コマンドが転送される対象となるキューの順序が、キューＱ３、キューＱ０、キューＱ１、キューＱ２の順であることを示す。
【０１２３】
そして、アービタ４２２は、変更後のアービトレーションルール４２２Ａに従って、キューＱ０〜Ｑ３に格納されたコマンドを取得し、メモリチップＭＣ０〜ＭＣ３に取得したコマンドに応じた処理を実行させる。図１４に示すように、アービタ４２２は、このアービトレーションルール４２２Ａに従って、以下のように動作する。  
（１）キューＱ３からコマンドＣ６を取得し、対応するメモリチップＭＣ３にコマンドＣ６を転送する（メモリチップＭＣ３にコマンドＣ６に応じた処理を実行させる）。  
（２）キューＱ０からコマンドＣ４を取得し、対応するメモリチップＭＣ０にコマンドＣ４を転送する（メモリチップＭＣ０にコマンドＣ４に応じた処理を実行させる）。  
（３）キューＱ１からコマンドＣ５を取得し、対応するメモリチップＭＣ１にコマンドＣ５を転送する（メモリチップＭＣ１にコマンドＣ５に応じた処理を実行させる）。  
（４）キューＱ２からコマンドＣ７を取得し、対応するメモリチップＭＣ２にコマンドＣ７を転送する（メモリチップＭＣ２にコマンドＣ７に応じた処理を実行させる）。
【０１２４】
このように、コマンドが転送される対象となるキューの順序が、コマンド転送速度またはコマンド処理速度が遅い順に対応するように動的に変更される。これにより、例えば、コマンド実行速度がより遅いメモリチップに対して先にコマンドが転送されるので、キューＱ０〜Ｑ３からメモリチップＭＣ０〜ＭＣ３にコマンドを転送して実行する全体の処理時間を短縮することができる。したがって、メモリチップＭＣ０〜ＭＣ３を備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１２５】
次いで、図１５のフローチャートを参照して、コントローラ４によって実行されるコマンド転送制御処理の手順の例を説明する。ここでは、各キューＱ０，Ｑ１，……，Ｑｙ−１にコマンドが既に格納されていることを想定する。
【０１２６】
まず、アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａに従って、最初のキューに格納されたコマンドの内の一つを、当該キューに対応するメモリチップに転送する（ステップＳ１１）。
【０１２７】
そして、アービタ４２２，４３２は、次のキューに格納されたコマンドの内の一つを、当該キューに対応するメモリチップに転送する（ステップＳ１２）。同様にして、アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａに示される順序に従って、該当するキュー毎に格納されたコマンドの内の一つを対応するメモリチップに転送することにより、最後の順番のキューまでコマンドを順次転送する（ステップＳ１３）。
【０１２８】
また、ステップＳ１１からステップＳ１３までの手順と並行して、キューモニタ部４２４，４３４は、各キューから、対応するメモリチップに転送されるコマンドの処理開始位置と処理終了位置の少なくとも一方を監視する（ステップＳ１４）。キューモニタ部４２４，４３４は、例えば、コマンドの処理開始位置と処理開始位置の少なくとも一方を、キュー毎にカウントする。また、キューモニタ部４２４，４３４は、処理開始位置の時間および処理終了位置の時間、または処理開始位置から処理終了位置までの経過時間を計測してもよい。
【０１２９】
ステップＳ１３およびステップＳ１４が完了した後、アービタ４２２，４３２は、第１期間が経過したか否かを判定する（ステップＳ１５）。第１期間は、キュー毎のコマンド転送速度が計測される単位期間である。第１期間が経過していない場合（ステップＳ１５のＮＯ）、ステップＳ１１およびステップＳ１４に戻り、コマンドの転送と、その処理開始位置と処理終了位置の少なくとも一方の監視とが続行される。
【０１３０】
第１期間が経過した場合（ステップＳ１５のＹＥＳ）、アービタ４２２，４３２は、キュー毎に、第１期間内のコマンド転送速度を取得する（ステップＳ１６）。アービタ４２２，４３２は、キュー毎に、例えば、第１期間内に転送されたコマンド数を取得する。第１期間内にあるメモリチップに転送されたコマンド数は、例えば、ステップＳ１４で第１期間内にカウントされたコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方によって表され得る。
【０１３１】
次いで、アービタ４２２，４３２は、取得されたキュー毎のコマンド転送速度に基づいて、コマンドが転送される対象となるキューの順序の入れ替えが必要であるか否か、すなわち、アービトレーションルール４２２Ａ，４３２Ａの変更が必要であるか否かを判定する（ステップＳ１７）。アービタ４２２，４３２は、例えば、コマンドが転送される対象となるキューの順序がコマンド転送速度が遅い順に対応している場合、キューの順序の入れ替えが必要でないと判断する。一方、アービタ４２２，４３２は、コマンドが転送される対象となるキューの順序がコマンド転送速度が遅い順に対応していない場合、キューの順序の入れ替えが必要であると判断する。
【０１３２】
キューの順序の入れ替えが必要でない場合（ステップＳ１７のＮＯ）、ステップＳ１１およびステップＳ１４に戻る。
【０１３３】
一方、キューの順序の入れ替えが必要である場合（ステップＳ１７のＹＥＳ）、アービタ４２２，４３２は、コマンドが転送される対象となるキューの順序がコマンド転送速度が遅い順に入れ替えられるように、アービトレーションルール４２２Ａ，４３２Ａを変更し（ステップＳ１８）、ステップＳ１１およびステップＳ１４に戻る。
【０１３４】
なお、ステップＳ１６の手順において、アービタ４２２，４３２は、キュー（メモリチップ）毎のコマンド処理速度を取得してもよい。アービタ４２２，４３２は、例えば、ステップＳ１４で計測された処理開始位置の時間および処理終了位置の時間、または処理開始位置から処理終了位置までの経過時間に基づいて、キュー毎のコマンド処理速度を取得する。この場合、ステップＳ１７およびステップＳ１８の手順において、コマンド転送速度の代わりにコマンド処理速度が用いられる。
【０１３５】
以上のように、あるチャネルに接続される複数のメモリチップに対応する複数のキューのコマンド転送速度またはコマンド処理速度が遅い順に、キューから対応するメモリチップにコマンドが転送されるように、コマンドが転送される対象となるキューの順序（アービトレーションルール）が動的に変更される。これにより、コマンドが並列に実行される際に発生する遅延が低減され、複数のキューから複数のメモリチップにコマンドを転送して実行する全体の処理時間を短縮することができる。したがって、複数のメモリチップを備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１３６】
また、アービトレーションルールが動的に変更されるので、ファームウェア２０内に設けられるコマンド制御部２１は、キューのコマンド転送速度やコマンド処理速度を考慮することなく、コマンドをフラッシュコントローラエンジン１３に送出することができる。送出されたコマンドは、当該コマンドが実行されるメモリチップに対応するキューに格納され、キューのコマンド転送速度やコマンド処理速度が遅い順に対応するメモリチップに転送することができる。
【０１３７】
なお、一つのキューに対して複数のメモリチップが関連付けられる場合にも、アービタ４２２，４３２は、コマンド転送速度またはコマンド処理速度がより遅いキューほど、コマンドが転送される対象となる順序が先になるように、アービトレーションルール４２２Ａ，４３２Ａを動的に変更する。これにより、一つのキューに対して複数のメモリチップが関連付けられる場合にも同様に、それら複数のメモリチップを備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１３８】
（第２実施形態）  
第１実施形態では、各キューのコマンド処理速度またはコマンド転送速度を監視するためのキューモニタ部４２４，４３４が、フラッシュコントローラエンジン１３内に設けられている。これに対して、第２実施形態では、図１６に示すように、キューモニタ部２２が、ＣＰＵ１２によって実行されるファームウェア２０の一部として実現される。
【０１３９】
第２実施形態に係るＳＳＤ３の構成は第１実施形態のＳＳＤ３と同様であり、第２実施形態と第１実施形態とでは、ファームウェア２０を実行することによってキューモニタ部２２として機能するＣＰＵ１２による処理の手順と、コマンドディスパッチャ４１およびアービタ４２２，４３２によって実行される処理の手順のみが異なる。以下、第１実施形態と異なる点のみを説明する。
【０１４０】
図１６に示すように、ファームウェア２０には、コマンド制御部２１に加えてキューモニタ部２２がさらに設けられている。キューモニタ部２２は、第１実施形態のキューモニタ部４２４，４３４と同様に、キューとメモリチップの複数の組の各々のコマンド処理速度、または各キューのコマンド転送速度を監視する。
【０１４１】
より具体的には、キューモニタ部２２は、例えば、フラッシュコントローラエンジン１３から、キューから対応するメモリチップへのコマンドの転送が開始された時点を示す信号（データ）や、メモリチップによるコマンドの実行が終了した時点を示す信号を受信することや、キューやメモリチップの状態を示すレジスタを読み取ること等によって、コマンドの処理開始位置と処理終了位置とを検出する。キューモニタ部２２は、検出された処理開始位置から処理終了位置までの経過時間に基づいて、キューとメモリチップの組毎のコマンド処理速度を算出することができる。
【０１４２】
また、キューモニタ部２２は、コマンドの処理開始位置の数と処理終了位置の数の少なくとも一方を、キュー毎にカウントしてもよい。キューモニタ部２２は、カウントされたコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方を用いて、各キューのコマンド転送速度を取得することができる。
【０１４３】
また、図１７に示すように、アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａだけでなく、キュー−チップテーブル４２２Ｂ，４３２Ｂも管理する。キュー−チップテーブル４２２Ｂ，４３２Ｂは、キューとメモリチップとの対応関係を示す。例えば、キュー−チップテーブル４２２Ｂでは、複数のキューＱ０，Ｑ１，Ｑ２，……，Ｑｘ−１に、複数のメモリチップＭＣ０，ＭＣ１，ＭＣ２，……，ＭＣｘ−１がそれぞれ対応することが示される。また、キュー−チップテーブル４３２Ｂでは、複数のキューＱｘ，Ｑｘ＋１，Ｑｘ＋２，……，Ｑｙ−１に、複数のメモリチップＭＣｘ，ＭＣｘ＋１，ＭＣｘ＋２，……，ＭＣｙ−１がそれぞれ対応することが示される。
【０１４４】
コマンドディスパッチャ４１は、ＣＰＵ１２（コマンド制御部２１）によってフラッシュコントローラエンジン１３に送出されるコマンドを受け付け、これらコマンドの各々をキューＱ０，Ｑ１，……，Ｑｙ−１のいずれかに振り分ける。上述したように、コマンドは、例えば、プログラムコマンド、リードコマンド、およびイレーズコマンドのいずれかである。プログラムコマンドでは、データが書き込まれるべき物理アドレス（例えば、チップ、ブロック、およびページ）が指定されている。リードコマンドでは、データが読み出されるべき物理アドレスが指定されている。また、イレーズコマンドでは、データが消去されるべき物理アドレスが指定されている。
【０１４５】
コマンドディスパッチャ４１は、各コマンドで指定された物理アドレスに基づき、コマンドをキューＱ０，Ｑ１，……，Ｑｙ−１のいずれかに振り分ける。より具体的には、コマンドディスパッチャ４１は、ＮＡＮＤ型フラッシュメモリ５内の複数のメモリチップＭＣ０，ＭＣ１，……，ＭＣｙ−１から、指定された物理アドレスによって示される物理記憶位置を含むメモリチップを特定する。そして、コマンドディスパッチャ４１は、キュー−チップテーブル４２２Ｂ，４３２Ｂに従って、キューＱ０，Ｑ１，……，Ｑｙ−１の内の、特定されたメモリチップに対応するキューにコマンドを送出する。これにより、コマンドに応じてアクセスされるべきメモリチップに対応するキューに、当該コマンドが格納される。
【０１４６】
アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａに示される順序に従って、コマンドが転送される対象となるキューに格納されたコマンドの一つを取得する。そして、アービタ４２２，４３２は、そのコマンドに指定された物理アドレスに基づいて特定されるメモリチップに、当該コマンドに応じた処理を実行させる。
【０１４７】
さらに、アービタ４２２，４３２は、キューモニタ部２２によって取得されたコマンド処理速度またはコマンド転送速度に基づいて、アービトレーションルール４２２Ａ，４３２Ａによって示される、コマンドが転送される対象となる順序が先であるキューほど、コマンド処理速度またはコマンド転送速度が遅いキューに関連付けられていたメモリチップが関連付けられるように、キュー−チップテーブル４２２Ｂ，４３２Ｂを変更することもできる。アービタ４２２，４３２は、各キューのコマンド処理速度またはコマンド転送速度に基づいて、キュー−チップテーブル４２２Ｂ，４３２Ｂを変更し、アービトレーションルール４２２Ａ，４３２Ａを変更しないように構成されてもよい。すなわち、コマンドが転送される対象となるキューの順序は固定されていてもよい。
【０１４８】
例えば、チャネルＣＨ０に接続される並列動作可能な複数のメモリチップに、第１メモリチップと第２メモリチップとが含まれる場合を想定する。また、チャネルＣＨ０には、第１キューと、この第１キューよりも後にコマンドが転送される対象となる第２キューとが含まれている。この場合に、アービタ４２２は、以下のようにキュー−チップテーブル４２２Ｂを変更する。すなわち、アービタ４２２は、（１）第１メモリチップへコマンドの転送を開始してから第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、第２メモリチップへコマンドの転送を開始してから第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、第１キューに第１メモリチップを関連付け、第２キューに第２メモリチップを関連付ける。また、アービタ４２２は、（２）第２コマンド処理速度が第１コマンド処理速度よりも遅いならば、第１キューに第２メモリチップを関連付け、第２キューに第１メモリチップを関連付ける。
【０１４９】
コマンド制御部２１は、ホスト２から受信されるコマンド等に応じて、第１キューに関連付けられたメモリチップによって実行されるべき第１コマンドと、第２キューに関連付けられたメモリチップによって実行されるべき第２コマンドとを生成し、フラッシュコントローラエンジン１３に送出する。コマンドディスパッチャ４１は、第１キューに第１コマンドを格納し、第２キューに第２コマンドを格納する。そして、アービタ４２２は、アービトレーションルール４２２Ａに従って、第１キューから第１コマンドを取得し、取得された第１コマンドを第１キューに関連付けられたメモリチップへ転送した後に、第２キューから第２コマンドを取得し、取得された第２コマンドを第２キューに関連付けられたメモリチップへ転送する。
【０１５０】
これら第１コマンド処理速度と第２コマンド処理速度とは、第１メモリチップによって実行されるべき第３コマンドと第２メモリチップによって実行されるべき第４コマンドとが処理される際に計測され得る。ここでは、第１キューが第１メモリチップに関連付けられ、且つ第２キューが第２メモリチップに関連付けられていることを想定する。
【０１５１】
コマンドディスパッチャ４１は、第３コマンドを第１キューに格納し、第４コマンドを第２キューに格納する。キューモニタ部２２は、第１キューから第３コマンドを取得し、取得された第３コマンドを第１メモリチップへ転送してから、第１メモリチップによる第３コマンドの実行が完了するまでの時間に基づいて第１コマンド処理速度を計測する。また、キューモニタ部２２は、第２キューから第４コマンドを取得し、取得された第４コマンドを第２メモリチップへ転送してから、第２メモリチップによる第４コマンドの実行が完了するまでの時間に基づいて第２コマンド処理速度を計測する。
【０１５２】
あるいは、アービタ４２２は、以下のようにキュー−チップテーブル４２２Ｂを変更してもよい。すなわち、アービタ４２２は、（１）第１期間において第１メモリチップへ転送されたコマンドの数に基づく第１コマンド転送速度が、第１期間において第２メモリチップへ転送されたコマンドの数に基づく第２コマンド転送速度よりも遅いならば、第１キューに第１メモリチップを関連付け、第２キューに第２メモリチップを関連付ける。また、アービタ４２２は、第２コマンド転送速度が第１コマンド転送速度よりも遅いならば、第１キューに第２メモリチップを関連付け、第２キューに第１メモリチップを関連付ける。
【０１５３】
これら第１コマンド転送速度と第２コマンド転送速度とは、第１メモリチップによって実行されるべき複数の第３コマンドと第２メモリチップによって実行されるべき複数の第４コマンドとが処理される際に計測され得る。キューモニタ部２２は、第１期間において、第１キューに格納される複数の第３コマンドの内、第１メモリチップへ転送されたコマンドの第１の数をカウントし、カウントされた第１の数に基づいて第１コマンド転送速度を決定する。また、キューモニタ部２２は、第１期間において、第２キューに格納される複数の第４コマンドの内、第２メモリチップへ転送されたコマンドの第２の数をカウントし、カウントされた第２の数に基づいて第２コマンド転送速度を決定する。
【０１５４】
なお、第１コマンドが第１データを第１キューに関連付けられたメモリチップに書き込むためのプログラムコマンドであり、第２コマンドが第２データを第２キューに関連付けられたメモリチップに書き込むためのプログラムコマンドである場合、アービタ４２２は以下のように動作する。すなわち、アービタ４２２は、（１）第１コマンド処理速度が第２コマンド処理速度よりも遅いならば、あるいは第１コマンド転送速度が第２コマンド転送速度よりも遅いならば、第１データを第１キューに関連付けられたメモリチップに転送してそのメモリチップにプログラムを指示した後に、第２データを第２キューに関連付けられたメモリチップに転送してそのメモリチップにプログラムを指示する。また、アービタ４２２は、（２）第２コマンド処理速度が第１コマンド処理速度よりも遅いならば、あるいは第２コマンド転送速度が第１コマンド転送速度よりも遅いならば、第２データを第２キューに関連付けられたメモリチップに転送してそのメモリチップにプログラムを指示した後に、第１データを第１キューに関連付けられたメモリチップに転送してそのメモリチップにプログラムを指示する。
【０１５５】
図１８から図２１を参照して、フラッシュコントローラエンジン１３の動作について説明する。ここでは、一例として、チャネルＣＨ０における動作について説明するが、他のチャネルにおける動作も同様である。
【０１５６】
図１８は、コマンドディスパッチャ４１による振り分けによって、各キューＱ０〜Ｑ３にコマンドが格納されている例を示す。各キューＱ０〜Ｑ３には、キュー−チップテーブル４２２Ｂに従って、対応するメモリチップＭＣ０〜ＭＣ３によって実行されるべきコマンドがそれぞれ格納される。キュー−チップテーブル４２２Ｂは、キューＱ０、キューＱ１、キューＱ２、およびキューＱ３と、メモリチップＭＣ０、メモリチップＭＣ１、メモリチップＭＣ２、およびメモリチップＭＣ３とがそれぞれ対応することを示している。
【０１５７】
したがって、キューＱ０には、対応するメモリチップＭＣ０によって実行されるべきコマンドＣ０，Ｃ４，Ｃ９が格納される。キューＱ１には、対応するメモリチップＭＣ１によって実行されるべきコマンドＣ２，Ｃ５，Ｃ１０が格納される。キューＱ２には、メモリチップＭＣ２によって実行されるべきコマンドＣ１，Ｃ７，Ｃ８が格納される。また、キューＱ３には、メモリチップＭＣ３によって実行されるべきコマンドＣ３，Ｃ６，Ｃ１１が格納される。
【０１５８】
アービタ４２２は、アービトレーションルール４２２Ａに示される順序に従って、キューＱ０〜Ｑ３に格納されたコマンドを取得し、各キューＱ０〜Ｑ３に対応するメモリチップＭＣ０〜ＭＣ３に、取得されたコマンドに応じた処理を実行させる。図１８に示す例では、アービトレーションルール４２２Ａは、コマンドが転送される対象となるキューの順序がキューＱ０、キューＱ１、キューＱ２、キューＱ３の順であることを示している。
【０１５９】
図１９に示すように、アービタ４２２は、このアービトレーションルール４２２Ａに従って以下のように動作する。  
（１）キューＱ０からコマンドＣ０を取得し、対応するメモリチップＭＣ０にコマンドＣ０を転送する（メモリチップＭＣ０にコマンドＣ０に応じた処理を実行させる）。  
（２）キューＱ１からコマンドＣ２を取得し、対応するメモリチップＭＣ１にコマンドＣ２を転送する（メモリチップＭＣ１にコマンドＣ２に応じた処理を実行させる）。  
（３）キューＱ２からコマンドＣ１を取得し、対応するメモリチップＭＣ２にコマンドＣ２を転送する（メモリチップＭＣ２にコマンドＣ１に応じた処理を実行させる）。  
（４）キューＱ３からコマンドＣ３を取得し、対応するメモリチップＭＣ３にコマンドＣ３を転送する（メモリチップＭＣ３にコマンドＣ３に応じた処理を実行させる）。
【０１６０】
キューＱ０〜Ｑ３に格納されている他のコマンドＣ４〜Ｃ１１も、同様の順序で対応するメモリチップＭＣ０〜ＭＣ３に転送される。
【０１６１】
キューモニタ部２２は、このような動作を監視することにより、各キューのコマンド転送速度、またはキューとメモリチップの複数の組の各々のコマンド処理速度を取得する。コマンド転送速度は、上述したように、例えば、単位期間内におけるコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方を、キュー毎にカウントすることによって得られる。また、コマンド処理速度は、コマンドの処理開始位置から処理終了位置までの経過時間に基づいて得られる。
【０１６２】
図２０に示すように、取得されたコマンド転送速度またはコマンド処理速度が、例えば、キューＱ３、キューＱ１、キューＱ０、キューＱ２の順に遅いことを示す場合、アービタ４２２は、アービトレーションルール４２２Ａに示される、コマンドが転送される対象となる順序が先であるキューほど、コマンド転送速度またはコマンド処理速度が遅いキューに関連付けられていたメモリチップが関連付けられるように、キュー−チップテーブル４２２Ｂを変更する。したがって、変更後のキュー−チップテーブル４２２Ｂは、キューＱ０、キューＱ１、キューＱ２、およびキューＱ３に対して、メモリチップＭＣ３、メモリチップＭＣ１、メモリチップＭＣ０、およびメモリチップＭＣ２がそれぞれ関連付けられることを示す。
【０１６３】
コマンドディスパッチャ４１は、変更後のキュー−チップテーブル４２２Ｂに従って、フラッシュコントローラエンジン１３に対して送出される各コマンドＣ１２〜Ｃ２３を、そのコマンドが実行されるべきメモリチップに対応するキューに格納する。
【０１６４】
図２１に示すように、アービタ４２２は、アービトレーションルール４２２Ａに従って、キューＱ０〜Ｑ３に格納されたコマンドを取得し、対応するメモリチップＭＣ０〜ＭＣ３に取得したコマンドに応じた処理を実行させる。より具体的には、アービタ４２２は、例えば、以下のように動作する。  
（１）キューＱ０からコマンドＣ１５を取得し、対応するメモリチップＭＣ３にコマンドＣ１５を転送する（メモリチップＭＣ３にコマンドＣ１５に応じた処理を実行させる）。
（２）キューＱ１からコマンドＣ１３を取得し、対応するメモリチップＭＣ１にコマンドＣ１３を転送する（メモリチップＭＣ１にコマンドＣ１３に応じた処理を実行させる）。
（３）キューＱ２からコマンドＣ１４を取得し、対応するメモリチップＭＣ０にコマンドＣ１４を転送する（メモリチップＭＣ０にコマンドＣ１４に応じた処理を実行させる）。
（４）キューＱ３からコマンドＣ１２を取得し、対応するメモリチップＭＣ２にコマンドＣ１２を転送する（メモリチップＭＣ２にコマンドＣ１２に応じた処理を実行させる）。
【０１６５】
このように、キュー−チップテーブル４２２Ｂは、アービトレーションルール４２２Ａによって示される、コマンドが転送される対象となる順序が先であるキューほど、コマンド転送速度またはコマンド処理速度が遅いキューに関連付けられていたメモリチップが関連付けられることを示すように変更される。これにより、コマンドが転送される対象となるキューの順序（アービトレーションルール）が固定された状態においても、例えば、コマンド実行速度がより遅いメモリチップに対して先にコマンドが転送されるので、キューＱ０〜Ｑ３からメモリチップＭＣ０〜ＭＣ３にコマンドを転送して実行する全体の処理時間を短縮することができる。したがって、メモリチップＭＣ０〜ＭＣ３を備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１６６】
次いで、図２２のフローチャートを参照して、コントローラ４によって実行されるコマンド転送制御処理の手順の例を説明する。
【０１６７】
まず、コマンドディスパッチャ４１は、アービトレーションルール４２２Ａ，４３２Ａに従って、最初のキューにコマンドを一定量蓄積する（ステップＳ２１）。そして、コマンドディスパッチャ４１は、次のキューにコマンドを一定量蓄積する（ステップＳ２２）。同様にして、コマンドディスパッチャ４１は、アービトレーションルール４２２Ａ，４３２Ａに示される順序に従って、該当するキューにコマンドを一定量蓄積することにより、最後の順番のキューまでコマンドを一定量蓄積する（ステップＳ２３）。なお、ステップＳ２１からステップＳ２３までの手順は、並列に行われてもよい。
【０１６８】
次いで、アービタ４２２，４３２は、アービトレーションルール４２２Ａ，４３２Ａに従って、複数のキュー内のコマンドを対応するメモリチップにそれぞれ転送する（ステップＳ２４）。
【０１６９】
ステップＳ２４の手順と並行して、キューモニタ部２２は、各キューから、対応するメモリチップに転送されるコマンドの処理開始位置と処理終了位置の少なくとも一方を監視する（ステップＳ２５）。キューモニタ部２２は、例えば、コマンドの処理開始位置と処理終了位置の少なくとも一方を、キュー毎にカウントする。また、キューモニタ部２２は、処理開始位置の時間および処理終了位置の時間、または処理開始位置から処理終了位置までの経過時間を計測してもよい。
【０１７０】
そして、アービタ４２２，４３２は、あるチャネル内の複数のキューに格納された全てのコマンドについて、メモリチップによる実行が完了したか否かを判定する（ステップＳ２６）。全てのコマンドの実行が完了していない場合（ステップＳ２６のＮＯ）、ステップＳ２４およびステップＳ２５に戻り、コマンドの転送と、その処理開始位置と処理終了位置の少なくとも一方の監視とが続行される。
【０１７１】
全てのコマンドの実行が完了した場合（ステップＳ２６のＹＥＳ）、アービタ４２２，４３２は、キュー毎に、第１期間内のコマンド転送速度を取得する（ステップＳ２７）。アービタ４２２，４３２は、キュー毎に、例えば、第１期間内に転送されたコマンド数を取得する。第１期間内にあるメモリチップに転送されたコマンド数は、例えば、ステップＳ２５で第１期間内にカウントされたコマンドの処理開始位置の数と処理終了位置の数の少なくとも一方によって表され得る。
【０１７２】
次いで、アービタ４２２，４３２は、取得されたキュー毎のコマンド転送速度に基づいて、キューとメモリチップとの対応関係の入れ替えが必要であるか否かを判定する（ステップＳ２８）。例えば、アービタ４２２，４３２は、コマンドが転送される対象となる順序が先であるキューほど、コマンド転送速度が遅い場合、対応関係の入れ替えが必要でないと判定する。一方、アービタ４２２，４３２は、コマンドが転送される対象となるキューの順序が、コマンド転送速度が遅い順に対応していない場合、対応関係の入れ替えが必要であると判定する。
【０１７３】
キューとメモリチップとの対応関係の入れ替えが必要でない場合（ステップＳ２８のＮＯ）、ステップＳ２１に戻り、キューへのコマンドの蓄積が続行される。
【０１７４】
キューとメモリチップとの対応関係の入れ替えが必要である場合（ステップＳ２８のＹＥＳ）、アービタ４２２，４３２は、コマンドが転送される対象となる順序が先であるほど、コマンド転送速度が遅いキューに関連付けられていたメモリチップが関連付けられるように、キュー−チップテーブル４２２Ｂ，４３２Ｂを変更し（ステップＳ２９）、ステップＳ２１に戻る。
【０１７５】
なお、ステップＳ２７の手順において、アービタ４２２，４３２は、キュー（メモリチップ）毎のコマンド処理速度を取得してもよい。アービタ４２２，４３２は、例えば、ステップＳ２５で計測された処理開始位置の時間および処理終了位置の時間、または処理開始位置から処理終了位置までの経過時間に基づいて、キュー毎のコマンド処理速度を取得する。この場合、ステップＳ２８およびステップＳ２９の手順において、コマンド転送速度の代わりにコマンド処理速度が用いられる。
【０１７６】
以上のように、あるチャネルに接続される複数のメモリチップに対応する複数のキューのコマンド転送速度またはコマンド処理速度が遅い順に、キューからメモリチップにコマンドが転送されるように、キューとメモリチップとの対応関係（キュー−チップテーブル）が動的に変更される。これにより、コマンドを並列に実行する際に発生する遅延を低減し、複数のキューから複数のメモリチップにコマンドを転送して実行する全体の処理時間を短縮することができる。したがって、複数のメモリチップを備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１７７】
なお、一つのキューに対して複数のメモリチップが関連付けられる場合、アービタ４２２，４３２は、コマンドが転送される対象となる順序が先であるキューほど、コマンド実行速度またはコマンド処理速度が遅いキューに関連付けられていた複数のメモリチップが関連付けられるように、キュー−チップテーブル４２２Ｂ，４３２Ｂを動的に変更することができる。これにより、一つのキューに対して複数のメモリチップが関連付けられる場合にも同様に、複数のメモリチップを備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１７８】
以上説明したように、第１および第２実施形態によれば、複数のメモリチップを備える不揮発性メモリに対するアクセス性能を向上させることができる。ＮＡＮＤ型フラッシュメモリ５は、並列に動作可能であって、第１メモリチップと第２メモリチップを含む複数のメモリチップを含む。コントローラ４は、第１メモリチップに関連付けられた第１キューと第２メモリチップに関連付けられた第２キューとを含む複数のキューを含み、第１メモリチップによって実行されるべき第１コマンドと、第２メモリチップによって実行されるべき第２コマンドとを生成し、第１キューに第１コマンドを格納し、第２キューに第２コマンドを格納する。コントローラ４は、第１メモリチップへコマンドの転送を開始してから第１メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第１コマンド処理速度が、第２メモリチップへコマンドの転送を開始してから第２メモリチップによる当該コマンドの実行が完了するまでの時間に基づく第２コマンド処理速度よりも遅いならば、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送した後に、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送する。コントローラ４は、第２コマンド処理速度が第１コマンド処理速度よりも遅いならば、第２キューから第２コマンドを取得し、取得された第２コマンドを第２メモリチップへ転送した後に、第１キューから第１コマンドを取得し、取得された第１コマンドを第１メモリチップへ転送する。
【０１７９】
これにより、異なるアクセス時間を要する複数のメモリチップでコマンドを並列に実行（チップインタリーブ実行）する場合に、コマンド実行速度が遅いメモリチップから順にコマンドが実行されるように制御することができる。したがって、複数のメモリチップを備えるＮＡＮＤ型フラッシュメモリ５に対するアクセス性能を向上させることができる。
【０１８０】
なお、本発明のいくつかの実施形態では、不揮発性メモリとしてＮＡＮＤ型フラッシュメモリを例示した。しかし、各実施形態の機能は、例えば、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＰＲＡＭ（Ｐｈａｓｅ  ｃｈａｎｇｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲｅＲＡＭ（Ｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、または、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）のような他の様々な不揮発性メモリにも適用できる。
【０１８１】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１８２】
１…情報処理システム、２…ホスト、３…ＳＳＤ、４…コントローラ、５…ＮＡＮＤ型フラッシュメモリ、６…ＤＲＡＭ、１０…バス、１１…ホストインタフェース、１２…ＣＰＵ、１３…フラッシュコントローラエンジン、１４…ＤＲＡＭインタフェース、２０…ファームウェア、２１…コマンド制御部、３１…ライトバッファ、３２…ルックアップテーブル（ＬＵＴ）、４１…コマンドディスパッチャ、４２２，４３２…アービタ、４２３，４３３…インタフェースコントローラ、４２４，４３４…キューモニタ部。
【図１】
2019164487.tif 000003
【図２】
2019164487.tif 000004
【図３】
2019164487.tif 000005
【図４】
2019164487.tif 000006
【図５】
2019164487.tif 000007
【図６】
2019164487.tif 000008
【図７】
2019164487.tif 000009
【図８】
2019164487.tif 000010
【図９】
2019164487.tif 000011
【図１０】
2019164487.tif 000012
【図１１】
2019164487.tif 000013
【図１２】
2019164487.tif 000014
【図１３】
2019164487.tif 000015
【図１４】
2019164487.tif 000016
【図１５】
2019164487.tif 000017
【図１６】
2019164487.tif 000018
【図１７】
2019164487.tif 000019
【図１８】
2019164487.tif 000020
【図１９】
2019164487.tif 000021
【図２０】
2019164487.tif 000022
【図２１】
2019164487.tif 000023
【図２２】
2019164487.tif 000024