IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 東芝メモリ株式会社の特許一覧

<>
  • 特開-メモリシステムおよび制御方法 図1
  • 特開-メモリシステムおよび制御方法 図2
  • 特開-メモリシステムおよび制御方法 図3
  • 特開-メモリシステムおよび制御方法 図4
  • 特開-メモリシステムおよび制御方法 図5
  • 特開-メモリシステムおよび制御方法 図6
  • 特開-メモリシステムおよび制御方法 図7
  • 特開-メモリシステムおよび制御方法 図8
  • 特開-メモリシステムおよび制御方法 図9
  • 特開-メモリシステムおよび制御方法 図10
  • 特開-メモリシステムおよび制御方法 図11
  • 特開-メモリシステムおよび制御方法 図12
  • 特開-メモリシステムおよび制御方法 図13
  • 特開-メモリシステムおよび制御方法 図14
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024087479
(43)【公開日】2024-07-01
(54)【発明の名称】メモリシステムおよび制御方法
(51)【国際特許分類】
   G06F 12/00 20060101AFI20240624BHJP
   G06F 3/06 20060101ALI20240624BHJP
【FI】
G06F12/00 560B
G06F12/00 597U
G06F3/06 301F
G06F3/06 302A
【審査請求】未請求
【請求項の数】14
【出願形態】OL
(21)【出願番号】P 2022202322
(22)【出願日】2022-12-19
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】菅野 伸一
【テーマコード(参考)】
5B160
【Fターム(参考)】
5B160CD01
5B160MM01
(57)【要約】
【課題】不揮発性メモリからからデータを効率良く読み出すことできるメモリシステムを実現する。
【解決手段】メモリシステムは、複数のダイを含む不揮発性メモリと、コントローラと、ダイ毎に設けられた、第1のキュー、第2のキュー、およびコマンドバッファとを含む。コントローラは、第1のダイに対応するコマンドバッファに実行対象のリードコマンドが格納されたことに応じ、実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定する。次のリードコマンドの発行が必要と判定したことに応じ、コントローラは、実行対象のリードコマンドによって読み出しが要求される第1のデータに後続する第2のデータが格納されている第2のダイを特定し、第2のデータを読み出すためのリードコマンドを、第2のダイに対応する第2のキューに格納する。
【選択図】図5
【特許請求の範囲】
【請求項1】
複数のダイを含む不揮発性メモリと、
前記複数のダイを制御するように構成されたコントローラと、
前記ダイ毎に設けられた、第1のキュー、第2のキュー、およびコマンドバッファと、を具備し、前記第1のキューは、ホストからのリード要求に関連付けられた単一のリードコマンド、または前記ホストからのリード要求に関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを格納するためのキューであり、前記第2のキューは、前記複数のリードコマンドのうちの後続のいずれかのリードコマンドを格納するためのキューであり、前記コマンドバッファは、前記第1のキューおよび前記第2のキューから選択されたキューからフェッチされる実行対象のリードコマンドを格納するためのバッファであり、
前記コントローラは、
前記複数のダイのうちの第1のダイに対応する前記コマンドバッファに前記実行対象のリードコマンドが格納されたことに応じ、
前記実行対象のリードコマンドが前記単一のリードコマンドと前記複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かに基づいて、前記実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定し、
前記次のリードコマンドの発行が必要と判定したことに応じ、
論理物理アドレス変換テーブルを参照して、前記実行対象のリードコマンドによって読み出しが要求される第1のデータに後続する第2のデータが格納されている第2のダイと、前記第2のダイに格納されている前記第2のデータの長さと、を特定し、
前記第2のデータを読み出すためのリードコマンドを生成し、
前記実行対象のリードコマンドを前記第1のダイに送信する処理と、前記生成したリードコマンドを前記第2のダイに対応する前記第2のキューに格納する処理と、を実行する、ように構成されている、
メモリシステム。
【請求項2】
前記コントローラは、
前記第1のダイのページバッファへの前記第1のデータの読み出しの完了後、前記第1のダイの前記ページバッファから前記第1のデータを読み出し、
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しと前記第2のダイのページバッファへの前記第2のデータの読み出しとの双方の完了後、前記第2のダイの前記ページバッファから前記第2のデータを読み出すように構成されている、
請求項1に記載のメモリシステム。
【請求項3】
前記コントローラは、
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しが完了していない状態で、前記第2のダイの前記ページバッファへの前記第2のデータの読み出しが完了した場合、前記第2のダイの前記ページバッファから前記第2のデータを読み出さずに、前記第1のダイの前記ページバッファへの前記第1のデータの読み出しが完了するまで待ち、
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しの完了後に、前記第1のダイの前記ページバッファから前記第1のデータを読み出す処理と、前記第2のダイの前記ページバッファから前記第2のデータを読み出す処理と、を実行するように構成される、
請求項2に記載のメモリシステム。
【請求項4】
前記コントローラは、
前記複数のダイのいずれか一つのダイに対応する前記第1のキューおよび前記第2のキューの双方にリードコマンドが格納されている場合、前記第2のキューを前記第1のキューよりも優先的に選択し、前記第2のキューに格納されているリードコマンドを前記実行対象のリードコマンドとしてフェッチするように構成されている、
請求項1に記載のメモリシステム。
【請求項5】
前記コントローラは、
前記第1のダイのページバッファへの前記第1のデータの読み出しの完了に応じ、第1のリードバッファを前記第1のダイに割り当て、前記第1のダイの前記ページバッファから前記第1のリードバッファに前記第1のデータを転送し、
前記第2のダイのページバッファへの前記第2のデータの読み出しの完了に応じ、
前記第1のダイに前記第1のリードバッファが割り当て済みである否かを判定し、
前記第1のダイに前記第1のリードバッファが既に割り当てられている場合、第2のリードバッファを前記第2のダイに割り当て、前記第2のダイの前記ページバッファから前記第2のリードバッファに前記第2のデータを転送するように構成されている、
請求項1に記載のメモリシステム。
【請求項6】
前記コントローラは、
前記第1のダイに前記第1のリードバッファが割り当てられていない場合、前記第1のダイに前記第1のリードバッファが割り当てられた後に、前記第2のダイに前記第2のリードバッファを割り当てるように構成されている、
請求項5に記載のメモリシステム。
【請求項7】
前記コントローラは、
前記次のリードコマンドの発行が必要と判定したことに応じ、前記第2のデータが格納されている前記第2のダイと前記第2のデータの前記長さとを特定する処理と、前記第2のデータが転送されるべき前記ホストのメモリ上の位置を示す位置情報を算出する処理とを実行するようにさらに構成されている、
請求項1に記載のメモリシステム。
【請求項8】
複数のダイを含む不揮発性メモリを制御する制御方法であって、
前記ダイ毎に、第1のキュー、第2のキュー、およびコマンドバッファを管理することと、前記第1のキューは、ホストからのリード要求に関連付けられた単一のリードコマンド、または前記ホストからのリード要求に関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを格納するためのキューであり、前記第2のキューは、前記複数のリードコマンドのうちの後続のいずれかのリードコマンドを格納するためのキューであり、前記コマンドバッファは、前記第1のキューおよび前記第2のキューから選択されたキューからフェッチされる実行対象のリードコマンドを格納するためのバッファであり、
前記複数のダイのうちの第1のダイに対応する前記コマンドバッファに前記実行対象のリードコマンドが格納されたことに応じ、
前記実行対象のリードコマンドが前記単一のリードコマンドと前記複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かに基づいて、前記実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定することと、
前記次のリードコマンドの発行が必要と判定したことに応じ、
論理物理アドレス変換テーブルを参照して、前記実行対象のリードコマンドによって読み出しが要求される第1のデータに後続する第2のデータが格納されている第2のダイと、前記第2のダイに格納されている前記第2のデータの長さと、を特定することと、
前記第2のデータを読み出すためのリードコマンドを生成することと、
前記実行対象のリードコマンドを前記第1のダイに送信する処理と、前記生成したリードコマンドを前記第2のダイに対応する前記第2のキューに格納する処理と、を実行することとを具備する、
制御方法。
【請求項9】
前記第1のダイのページバッファへの前記第1のデータの読み出しの完了後、前記第1のダイの前記ページバッファから前記第1のデータを読み出すことと、
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しと前記第2のダイのページバッファへの前記第2のデータの読み出しとの双方の完了後、前記第2のダイの前記ページバッファから前記第2のデータを読み出すことと、をさらに具備する、
請求項8に記載の制御方法。
【請求項10】
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しが完了していない状態で、前記第2のダイの前記ページバッファへの前記第2のデータの読み出しが完了した場合、前記第2のダイの前記ページバッファから前記第2のデータを読み出さずに、前記第1のダイの前記ページバッファへの前記第1のデータの読み出しが完了するまで待つことと、
前記第1のダイの前記ページバッファへの前記第1のデータの読み出しの完了後に、前記第1のダイの前記ページバッファから前記第1のデータを読み出す処理と、前記第2のダイの前記ページバッファから前記第2のデータを読み出す処理と、を実行することとをさらに具備する、
請求項9に記載の制御方法。
【請求項11】
前記複数のダイのいずれか一つのダイに対応する前記第1のキューおよび前記第2のキューの双方にリードコマンドが格納されている場合、前記第2のキューを前記第1のキューよりも優先的に選択し、前記第2のキューに格納されているリードコマンドを前記実行対象のリードコマンドとしてフェッチすることをさらに具備する、
請求項8に記載の制御方法。
【請求項12】
前記第1のダイのページバッファへの前記第1のデータの読み出しの完了に応じ、第1のリードバッファを前記第1のダイに割り当て、前記第1のダイの前記ページバッファから前記第1のリードバッファに前記第1のデータを転送することと、
前記第2のダイのページバッファへの前記第2のデータの読み出しの完了に応じ、
前記第1のダイに前記第1のリードバッファが割り当て済みである否かを判定することと、
前記第1のダイに前記第1のリードバッファが既に割り当てられている場合、第2のリードバッファを前記第2のダイに割り当て、前記第2のダイの前記ページバッファから前記第2のリードバッファに前記第2のデータを転送することと、をさらに具備する
請求項8に記載の制御方法。
【請求項13】
前記第1のダイに前記第1のリードバッファが割り当てられていない場合、前記第1のダイに前記第1のリードバッファが割り当てられた後に、前記第2のダイに前記第2のリードバッファを割り当てることをさらに具備する、
請求項12に記載の制御方法。
【請求項14】
前記次のリードコマンドの発行が必要と判定したことに応じ、前記第2のデータが格納されている前記第2のダイと前記第2のデータの前記長さとを特定する処理と、前記第2のデータが転送されるべき前記ホストのメモリ上の位置を示す位置情報を算出する処理とを実行することをさらに具備する、
請求項8に記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの1つとして、NAND型フラッシュメモリを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
SSDのようなメモリシステムにおいては、リード処理のスループットを向上することが必要とされている。
【0004】
また、ホストによっては、ホストによって発行されたリード要求によって指定されるリード対象データを、そのリード対象データに含まれる先頭のデータから最後のデータの順序に従って、ホストに転送することが求められる場合もある。
【0005】
メモリシステムにおいては、不揮発性メモリからデータを効率良く読み出すことが可能な技術が必要とされている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】米国特許第11,409,436号明細書
【特許文献2】米国特許第10,338,846号明細書
【特許文献3】米国特許出願公開第2007/0005922号明細書
【発明の概要】
【発明が解決しようとする課題】
【0007】
本発明の一実施形態が解決しようとする課題は、不揮発性メモリからデータを効率良く読み出すことできるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【0008】
実施形態によれば、メモリシステムは、複数のダイを含む不揮発性メモリと、前記複数のダイを制御するように構成されたコントローラと、前記ダイ毎に設けられた、第1のキュー、第2のキュー、およびコマンドバッファと、を具備する。前記第1のキューは、ホストからのリード要求に関連付けられた単一のリードコマンド、または前記ホストからのリード要求に関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを格納するためのキューである。前記第2のキューは、前記複数のリードコマンドのうちの後続のいずれかのリードコマンドを格納するためのキューである。前記コマンドバッファは、前記第1のキューおよび前記第2のキューから選択されたキューからフェッチされる実行対象のリードコマンドを格納するためのバッファである。前記コントローラは、前記複数のダイのうちの第1のダイに対応する前記コマンドバッファに前記実行対象のリードコマンドが格納されたことに応じ、前記実行対象のリードコマンドが前記単一のリードコマンドと前記複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かに基づいて、前記実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定する。前記コントローラは、前記次のリードコマンドの発行が必要と判定したことに応じ、論理物理アドレス変換テーブルを参照して、前記実行対象のリードコマンドによって読み出しが要求される第1のデータに後続する第2のデータが格納されている第2のダイと、前記第2のダイに格納されている前記第2のデータの長さと、を特定する。前記コントローラは、前記第2のデータを読み出すためのリードコマンドを生成する。前記コントローラは、前記実行対象のリードコマンドを前記第1のダイに送信する処理と、前記生成したリードコマンドを前記第2のダイに対応する前記第2のキューに格納する処理と、を実行する。
【図面の簡単な説明】
【0009】
図1】実施形態に係るメモリシステムを含む情報処理システムの構成例を示すブロック図。
図2】実施形態に係るメモリシステムの不揮発性メモリに含まれる複数のダイのうちの代表的な1つのダイの構成例を示すブロック図。
図3】実施形態に係るメモリシステムの複数のダイからデータを並列に読み出すための処理を示すタイミングチャート。
図4】実施形態に係るメモリシステムにおける、ホストリードコマンドプールと、複数のフラッシュコマンドキューと、複数のダイと、複数のチャンネルと、リードバッファとの関係の例を示すブロック図。
図5】実施形態に係るメモリシステムにおける複数のフラッシュコマンドキューの各々の構成例を示すブロック図。
図6】実施形態に係るメモリシステムにおいて実行されるリード処理の一例を示す図。
図7】実施形態に係るメモリシステムにおいて実行されるリード処理の手順の例を示す図。
図8】実施形態に係るメモリシステムに設けられたリードバッファにおけるリードデータの受信順序の例と、リードバッファからホストへのリードデータの転送順序の例とを示すタイミングチャート。
図9】一周目においてリードバッファに保持されるリードデータの例と二周目においてリードバッファに保持されるリードデータの例とを示す図。
図10】不揮発性メモリのリードタイミングの例と不揮発性メモリからリードバッファへの転送タイミングの例とを示すタイミングチャート。
図11】実施形態に係るメモリシステムにおいて実行されるリード処理の手順を示すフローチャート。
図12】実施形態に係るメモリシステムにおいて、不揮発性メモリの読み出し完了時に実行される処理の手順を示すフローチャート。
図13】実施形態に係るメモリシステムにおいて、リードバッファへのデータ転送完了時に実行される処理の手順を示すフローチャート。
図14】実施形態に係るメモリシステムにおいて、ホストへのデータ転送完了時に実行される処理の手順を示すフローチャート。
【発明を実施するための形態】
【0010】
以下、図面を参照して、実施形態を説明する。
【0011】
以下では、実施形態に係るメモリシステムがソリッドステートドライブ(SSD)として実現されている場合を想定する。図1は、実施形態に係るメモリシステムを含む情報処理システム1の構成例を示すブロック図である。情報処理システム1は、ホスト(ホストデバイス)2と、SSD3とを含む。ホスト2と、SSD3とは、バス7を介して接続可能である。
【0012】
ホスト2は、情報処理装置である。ホスト2は、例えば、パーソナルコンピュータ、サーバコンピュータ、またはモバイルデバイスである。ホスト2は、SSD3にアクセスする。具体的には、ホスト2は、データを書き込むためのコマンドであるライトコマンドをSSD3に発行する。また、ホスト2は、データを読み出すためのコマンドであるリードコマンドをSSD3に発行する。
【0013】
SSD3は、ホスト2に接続可能なストレージデバイスである。SSD3は、不揮発性メモリを含む。SSD3は、内部の不揮発性メモリにデータを書き込むことが可能である。また、SSD3は、内部の不揮発性メモリからデータを読み出すことが可能である。
【0014】
SSD3とホスト2との間の通信は、バス7を介して実行される。バス7は、ホスト2とSSD3とを接続する伝送路である。バス7は、例えば、PCI expressTM(PCIeTM)バスである。PCIeバスは、全二重(full duplex)伝送路である。全二重伝送路は、ホスト2からSSD3へデータおよび入出力(I/O)コマンドを送信する伝送路と、SSD3からホスト2へデータおよび応答を送信する伝送路との双方を含む。I/Oコマンドは、不揮発性メモリへのデータの書き込み、または不揮発性メモリからのデータの読み出しを行うためのコマンドである。I/Oコマンドは、例えば、ライトコマンド、またはリードコマンドである。以下では、ホスト2から発行されるライトコマンドは、ライト要求またはホストライトコマンドとも称される。また、ホスト2から発行されるリードコマンドは、リード要求またはホストリードコマンドとも称される。
【0015】
ホスト2とSSD3とを接続するための論理インタフェースの規格としては、例えば、NVM expressTM(NVMeTM)規格が使用され得る。NVMe規格のインタフェースでは、少なくとも1つのサブミッションキュー(SQ)と、この少なくとも1つのサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とを含む対のキューを用いて、ホスト2とSSD3との間の通信が行われる。この対のキューは、サブミッションキュー/コンプリーションキューペア(SQ/CQペア)と称される。
【0016】
次に、ホスト2の構成について説明する。
【0017】
ホスト2は、プロセッサ21と、メモリ22とを含む。プロセッサ21およびメモリ22は、内部バス20を介して相互接続される。
【0018】
プロセッサ21は、例えばCPUである。プロセッサ21は、SSD3、または、ホスト2に接続された他のストレージデバイスからメモリ22にロードされるソフトウェア(ホストソフトウェア)を実行する。ホストソフトウェアは、例えば、オペレーティングシステム、ファイルシステム、アプリケーションプログラム、を含む。
【0019】
メモリ22は、例えば揮発性のメモリである。メモリ22は、メインメモリ、システムメモリ、またはホストメモリとも称される。メモリ22は、例えばダイナミックランダムアクセスメモリ(DRAM)である。メモリ22の記憶領域の一部は、ホストリードバッファ221として使用される。ホストリードバッファ221は、SSD3の不揮発性メモリから読み出されたリードデータが転送されるべき記憶領域である。ホストリードバッファ221は、ホストリードコマンド毎にホスト2によってメモリ22上に割り当てられる。ホストリードコマンドは、リードデータが転送されるべきメモリ22内の位置を示す位置情報を指定するパラメータであるデータポインタを含む。このホストリードコマンドは、フィジカル・リージョン・ページ(PRP)エントリ、PRPリスト、またはスキャッタ・ギャザー・リスト(SGL)を使用して、リードデータが転送されるべき位置情報を指定することができる。例えば、ホストリードコマンドがPRPエントリを使用して位置情報を指定する場合を想定する。この場合、ホストリードコマンドは、第1のPRPエントリフィールド(PRP1)と、第2のPRPエントリフィールド(PRP2)とを含む。PRP1およびPRP2の各々は、PRPエントリを使用して、リードデータが転送されるべきメモリ22内の位置(メモリページ)を指定する。PRPエントリは、メモリページへのポインタである。PRPエントリは、メモリページのページベースアドレスと、そのメモリページ内のオフセットとを含む。ページベースアドレスは、一つのメモリページを識別するアドレスである。
【0020】
また、メモリ22の記憶領域の他の一部は、SQ/CQペア222を格納するために使用される。SQ/CQペア222に含まれるサブミッションキューSQの各々は、SSD3にI/Oコマンド(ホストライトコマンド、ホストリードコマンド)を発行するために使用されるキューである。サブミッションキューSQの各々は、複数のスロットを含む。複数のスロットの各々は、一つのI/Oコマンドを格納可能である。ホスト2は、サブミッションキューSQをホスト2のメモリ22に作成する。また、ホスト2は、サブミッションキュークリエイトコマンドをSSD3に発行する。サブミッションキューSQの各々が作成されたメモリ22内の記憶位置を示すアドレス、サブミッションキューSQの各々のサイズ、これらサブミッションキューSQに関連付けられたコンプリーションキューCQの識別子、等は、サブミッションキュークリエイトコマンドによってSSD3に通知される。
【0021】
SQ/CQペアに含まれるコンプリーションキューCQは、I/Oコマンドの完了を示す完了応答をSSD3から受信するために使用されるキューである。完了応答は、完了したコマンドの処理の成功または失敗を示すステータスを示す情報を含む。完了応答は、コマンド完了、またはコマンド完了通知とも称される。コンプリーションキューCQは、複数のスロットを含む。複数のスロットの各々は、一つの完了応答を格納可能である。ホスト2は、コンプリーションキューCQをホスト2のメモリ22に作成する。また、ホスト2は、コンプリーションキュークリエイトコマンドをSSD3に発行する。コンプリーションキューCQが作成されたメモリ22内の記憶位置を示すアドレス、およびこのコンプリーションキューCQのサイズ、等は、コンプリーションキュークリエイトコマンドによってSSD3に通知される。
【0022】
次に、SSD3の内部構成について説明する。
【0023】
SSD3は、コントローラ4と、不揮発性メモリとしての、例えば、NAND型フラッシュメモリ5とを含む。また、SSD3は、ランダムアクセスメモリ、例えば、揮発性メモリであるダイナミックランダムアクセスメモリ(DRAM)6をさらに含んでいてもよい。
【0024】
コントローラ4は、メモリコントローラである。コントローラ4は、例えば、system-on-a-chip(SoC)のような制御回路である。コントローラ4は、NAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、ホスト2から受信されるI/Oコマンドそれぞれを処理することによって、NAND型フラッシュメモリ5からデータを読み出すためのリード処理と、NAND型フラッシュメモリ5にデータを書き込むためのライト処理とを実行する。コントローラ4とNAND型フラッシュメモリ5とを接続する物理インタフェースとしては、例えば、Toggleインタフェース、またはオープンNANDフラッシュインタフェース(ONFI)が使用される。コントローラ4の各部の機能は、専用ハードウェア、プログラムを実行するプロセッサ、またはこれら専用ハードウェアとプロセッサとの組み合わせにより実現され得る。
【0025】
NAND型フラッシュメモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。NAND型フラッシュメモリ5は、例えば、複数のダイを含む。ダイは、メモリダイ、フラッシュダイ、メモリチップ、フラッシュチップとも称される。これらダイの各々は、NAND型フラッシュメモリダイとして実現される。以下では、ダイをフラッシュダイと称する。図1においては、NAND型フラッシュメモリ5が、32個のフラッシュダイ#0~#31を含む場合が例として示されている。
【0026】
DRAM6は、例えば、論理物理アドレス変換テーブル(logical-to-physical address translation table:L2Pテーブル)61を記憶する記憶領域を含む。L2Pテーブル61は、マッピング情報を格納するテーブルである。マッピング情報は、論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間のマッピングを所定の管理サイズの単位で示す情報である。論理アドレスは、SSD3にアクセスするためにホスト2によって使用されるアドレスである。論理アドレスとしては、例えば、論理ブロックアドレス(LBA)が使用される。物理アドレスは、NAND型フラッシュメモリ5内の記憶位置を示すアドレスである。物理アドレスは、例えば、フラッシュダイアドレスと、ブロックアドレスと、ページのアドレスと、ページ内のオフセットアドレスとの組み合わせによって表現され得る。
【0027】
次に、コントローラ4の内部構成を説明する。コントローラ4は、例えば、ホストインタフェース(ホストI/F)41と、スタティックRAM(SRAM)42と、CPU43と、直接メモリアクセスコントローラ(DMAC)44と、誤り訂正回路45と、NANDインタフェース(NAND I/F)46と、DRAMインタフェース(DRAM I/F)47とを含む。これらホストインタフェース41と、SRAM42と、CPU43と、DMAC44と、誤り訂正回路45と、NANDインタフェース46と、DRAMインタフェース47とは、内部バス40を介して相互接続される。
【0028】
ホストインタフェース41は、ホスト2との通信を実行する通信インタフェース回路である。ホストインタフェース41は、例えば、PCIeコントローラによって実現されている。また、ホストインタフェース41は、アービトレーション機構を含む。このアービトレーション機構は、SQ/CQペア222に含まれる複数のサブミッションキューSQから、I/OコマンドがフェッチされるべきサブミッションキューSQを選択する機構である。アービトレーション機構は、例えば、ラウンドロビンアービトレーション機構、または重み付きラウンドロビンアービトレーション機構である。
【0029】
SRAM42は、揮発性メモリである。SRAM42の記憶領域は、例えば、CPU43の作業領域として使用される。SRAM42は、例えば、ホストリードコマンドプール421を記憶する記憶領域と、フラッシュコマンドキュー422を記憶する記憶領域と、リードバッファ(RB)423を記憶する記憶領域とを含む。
【0030】
ホストリードコマンドプール421は、ホスト2によって発行される複数のI/Oコマンドのうちのホストリードコマンドのグループを格納するために使用される記憶領域である。ホストリードコマンドの各々は、開始LBA(SLBA)、データ長、データポインタ、等を指定する。開始LBA(SLBA)は、リード対象データに対応する一つ以上のLBAのうちの最初のLBAを示す。データ長は、リード対象データの長さ、つまりリード対象データのサイズを示す。データ長は、LBAの数によって表されてもよい。データポインタは、リード対象データが転送されるべきホスト2のメモリ22内の位置を示す位置情報である。
【0031】
フラッシュコマンドキュー422は、フラッシュメモリ5からデータを読み出すためのリードコマンド(フラッシュリードコマンド)のグループが格納される内部キューである。フラッシュコマンドキュー422は、フラッシュダイ毎に設けられている。あるフラッシュダイに対応するフラッシュコマンドキュー422には、このフラッシュダイからデータを読み出すためのリードコマンド(フラッシュリードコマンドとも称される)が格納される。フラッシュコマンドキュー422の詳細は、図3および図4を参照して、後述する。
【0032】
リードバッファ(RB)423は、フラッシュメモリ5から読み出されたリードデータを一時的に記憶するためのデータバッファである。リードバッファ(RB)423は、SSD3におけるリード処理のスループットを改善するために使用される。リード処理のスループットは、単位時間当たりにSSD3からホスト2に転送されるリードデータの量を示す。リードデータは、フラッシュメモリ5から読み出されるデータ(ユーザデータ)である。
【0033】
CPU43は、プロセッサである。CPU43は、フラッシュメモリ5または図示しないROMに格納されている制御プログラム(ファームウェア)をSRAM42にロードする。そしてCPU43は、このファームウェアを実行することによって様々な処理を行う。なお、ファームウェアは、DRAM6にロードされてもよい。
【0034】
CPU43は、例えば、フラッシュトランスレーション層(FTL)として、フラッシュメモリ5に記憶されたデータの管理と、フラッシュメモリ5に含まれるブロックの管理とを行う。フラッシュメモリ5に記憶されたデータの管理は、例えば、マッピング情報の管理を含む。CPU42は、L2Pテーブル61のマッピング情報を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを管理サイズの単位で管理する。管理サイズは、例えば、4KiBである。
【0035】
フラッシュメモリ5においては、ブロック内のページへのデータの書き込みは、このブロックの1プログラム/イレーズサイクル当たり1回のみ可能である。つまり、データが既に書き込まれているブロック内の記憶位置(物理記憶位置)に新たなデータを直接上書きすることはできない。このため、既にブロック内の物理記憶位置に書き込まれているデータを更新する場合には、コントローラ4は、そのブロック(または別のブロック)内の未書き込みページ(空きページ)に新たなデータを書き込み、そして以前のデータを無効データとして扱う。換言すれば、コントローラ4は、ある論理アドレスに対応する更新データを、この論理アドレスに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ4は、L2Pテーブル61を更新して、この論理アドレスに、この別の物理記憶位置を示す物理アドレスを関連付ける。
【0036】
フラッシュメモリ5に含まれるブロックの管理は、フラッシュメモリ5に含まれる不良ブロック(バッドブロック)の管理と、ウェアレベリングと、ガベージコレクション(GC)とを含む。
【0037】
GCは、フリーブロックの個数を増やすための動作である。フリーブロックとは、有効データを含まないブロックを意味する。コントローラ4は、各ブロックの状態(フリーブロック、アクティブブロック、書き込み済みページ、空きページ、有効データの量、無効データの量、等)を管理する。GC動作においては、コントローラ4は、有効データと無効データとが混在する幾つかのブロックをGCソースブロックとして選択する。GCソースブロックは、コピー元ブロックとも称される。コントローラ4は、GCソースブロックに含まれる有効データをGCデスティネーションブロック(例えば、フリーブロック)にコピーする。GCデスティネーションブロックは、コピー先ブロックとも称される。ここで、有効データとは、論理アドレスに関連付けられているデータを意味する。論理アドレスに最新データとして関連付けられているデータは有効データであり、後にホスト2からリードされる可能性がある。無効データとは、どの論理アドレスにも関連付けられていないデータを意味する。どの論理アドレスにも関連付けられていないデータは、もはやホスト2からリードされる可能性が無いデータである。GCソースブロックからGCデスティネーションブロックに有効データをコピーすると、コントローラ4は、L2Pテーブル61を更新して、コピーされた有効データの論理アドレスそれぞれにコピー先の物理アドレスをマッピングする。有効データが別のブロックにコピーされることによって無効データのみになったブロックは、フリーブロックとして解放される。これによって、このブロックは、このブロックに対するデータ消去動作が実行された後にデータの書き込みに再利用することが可能となる。
【0038】
DMAC44は、ダイレクトメモリアクセス(DMA)を実行する回路である。DMAC44は、ホスト2のメモリ22とSRAM42(またはDRAM6)との間のデータ転送を実行する。例えば、リード処理においては、DMAC44は、フラッシュメモリ5からリードバッファ(RB)423にリードデータを転送する処理と、リードバッファ(RB)423からホスト2のメモリ22にリードデータを転送する処理とを実行する。
【0039】
誤り訂正回路45は、フラッシュメモリ5にデータが書き込まれる際に、エンコード処理を実行する。エンコード処理において、誤り訂正回路45は、フラッシュメモリ5に書き込まれるべきデータにエラー訂正コード(ECC)を冗長コードとして付加する。フラッシュメモリ5からデータがリードされた際に、誤り訂正回路45は、デコード処理を実行する。デコード処理において、誤り訂正回路45は、フラッシュメモリ5から読み出されたデータに付加されたECCを使用して、このデータの誤り訂正を実行する。
【0040】
NANDインタフェース46は、NAND型フラッシュメモリ5を制御する回路である。NANDインタフェース46は、NAND型フラッシュメモリ5に含まれる複数のフラッシュダイに電気的に接続される。
【0041】
個々のフラッシュダイは、独立して動作可能である。このため、フラッシュダイは、並列動作可能な単位として機能する。NANDインタフェース46は、例えば、NANDコントローラ461-0、461-1、…、461-7を含む。NANDコントローラ461-0、461-1、…、461-7は、チャンネルch0、ch1、…、ch7にそれぞれ接続される。NANDコントローラ461-0、461-1、…、461-7の各々は、対応するチャンネルを介して、1つまたは複数のフラッシュダイに接続される。図1においては、チャンネルch0、ch1、…、ch7の各々に4つのフラッシュダイが接続されている場合が例示されている。この場合、NANDコントローラ461-0は、チャンネルch0を介して、フラッシュダイ#0、#8、#16および#24に接続される。NANDコントローラ461-1は、チャンネルch1を介して、フラッシュダイ#1、#9、#17および#25に接続される。そして、NANDコントローラ461-7は、チャンネルch7を介して、フラッシュダイ#7、#15、#23および#31に接続される。フラッシュダイ#0、#1、…、#7は、コントローラ4によってバンクBNK0として扱われる。フラッシュダイ#8、#9、…、#15は、コントローラ4によってバンクBNK1として扱われる。フラッシュダイ#16、#17、…、#23は、コントローラ4によってバンクBNK2として扱われる。フラッシュダイ#24、#25、…、#31は、コントローラ4によってバンクBNK3として扱われる。バンクは、インターリーブ動作によって、複数のフラッシュダイを並列動作させる単位である。
【0042】
図1に示されるNAND型フラッシュメモリ5の構成においては、コントローラ4は、7チャンネルと、バンクインタリーブ動作とによって、フラッシュダイ#0~#31を並列にアクセスすることができる。このため、コントローラ4は、最大で32個のフラッシュダイに対するデータの書き込みまたは読み出しを並列に実行することができる(並列アクセス数=32)。なお、フラッシュダイ#0~#31の各々は、複数のプレーンを有するマルチプレーン構成を有していてもよい。例えば、フラッシュダイ#0~#31の各々が2プレーンを含む場合、コントローラ4は、最大で64個のプレーンに対するデータの書き込みまたは読み出しを並列に実行することができる(並列アクセス数=64)。
【0043】
DRAMインタフェース47は、DRAM6を制御する回路である。DRAMインタフェース47は、DRAM6にデータを格納する。また、DRAMインタフェース47は、DRAM6に格納されているデータを読み出す。
【0044】
次に、CPU43の機能構成を説明する。CPU43は、FTLとして機能する構成要素に加え、ライト処理部431、リード処理部432、スケジューラ433、およびリードデータ転送制御部434を含む。ライト処理部431、リード処理部432、スケジューラ433、およびリードデータ転送制御部434の各々の一部または全部は、コントローラ4の専用ハードウェアによって実現されてもよい。
【0045】
ライト処理部431は、ホスト2から受信されるライト要求(ホストライトコマンド)それぞれを処理することによって、ライト処理を実行する。ライト処理は、例えば、ホストライトコマンドに関連付けられたライトデータをホスト2のメモリ22から取得する処理と、NAND型フラッシュメモリ5内の記憶位置にライトデータを書き込む処理と、L2Pテーブル61を更新して、ホストライトコマンドによって指定された論理アドレスに、ライトデータが書き込まれた記憶位置を示す物理アドレスをマッピングする処理とを含む。
【0046】
リード処理部432は、ホスト2から受信されるリード要求(ホストリードコマンド)それぞれを処理することによって、リード処理を実行する。リード処理は、例えば、L2Pテーブル61を参照することによって、ホストリードコマンドによって指定された論理アドレスを物理アドレスに変換する処理と、ホストリードコマンドによって指定されたデータポインタに基づいて、データが転送されるべきホスト2のメモリ22上の位置を示す位置情報を算出する処理(PRP/SGLデコード処理とも称される)と、物理アドレスによって示されるNAND型フラッシュメモリ5内の記憶位置からデータを読み出す処理と、読み出されたデータを、算出した位置情報によって示されるホスト2のメモリ22上の位置に転送する処理と、を含む。
【0047】
リード処理部432によって実行されるリード処理は、スケジューリング処理とリードデータ転送処理とに大別される。スケジューリング処理は、ホスト2から受信される各リード要求に基づいてNAND型フラッシュメモリ5からデータを読み出すための1つまたは複数のリードコマンドを1つまたは複数のフラッシュダイに発行する処理である。NAND型フラッシュメモリ5からデータを読み出すための各リードコマンドは、例えば、読み出されるべきデータが格納されている物理記憶位置を示す物理アドレスと、このデータの長さとを含んでいてもよい。
【0048】
このスケジューリング処理は、スケジューラ433によって実行される。リードデータ転送処理は、各フラッシュダイから読み出されるリードデータをホスト2のメモリ22(ホストリードバッファ221)に転送する処理である。このリードデータ転送処理は、リードデータ転送制御部434によって実行される。スケジューラ433およびリードデータ転送制御部434は、リード処理部432の構成要素として実現されていてもよい。
【0049】
スケジューラ433は、リード処理のスループットを最大化するために、データ読み出し動作が並列に実行されるフラッシュダイの数、つまり、並列読み出し数、を最大化できるように、スケジューリング処理を実行する。また、スケジューラ433は、ホスト2から受信されるリード要求(ホストリードコマンド)によって指定されるリード対象データを、そのリード対象データに含まれる先頭のデータから最後のデータの順序でホスト2に転送できるように、スケジューリング処理を実行する。
【0050】
スケジューリング処理では、ホストリードコマンドプール421と、フラッシュダイ毎に設けられたフラッシュコマンドキュー422とが使用される。
【0051】
ホストリードコマンドプール421は、各リード要求(ホストリードコマンド)の内容を示すコマンド管理情報を記憶するために使用される。例えば、1つのリード要求に対して1つのコマンド管理情報がホストリードコマンドプール421に保持されてもよい。コマンド管理情報は、対応するホストリードコマンドによって指定された情報、例えば、開始LBA、データ長、データポインタなどを含んでもよい。
【0052】
一つのフラッシュダイに対応するフラッシュコマンドキュー422は、第1のキューと、第2のキューと、コマンドバッファと、を含む。
【0053】
第1のキューは、ホスト2からのホストリードコマンドに関連付けられた単一のリードコマンド、またはホスト2からのホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを格納するためのキューである。ホストリードコマンドに関連付けられた単一のリードコマンドは、このホストリードコマンドによって指定されたリード対象データをある一つのフラッシュダイから読み出すための一つのリードコマンドである。リード対象データが格納されているフラッシュダイが、例えばフラッシュダイ#mである場合、スケジューラ433は、このリード対象データを読み出すためのリードコマンドを、フラッシュダイ#mに対応する第1のキューに格納する。
【0054】
一方、ホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドは、このホストリードコマンドによって指定されたリード対象データのうちの先頭のデータをある一つのフラッシュダイから読み出すための一つのリードコマンドである。リード対象データのサイズが比較的大きい場合、リード対象データは、2以上のフラッシュダイに跨がって格納されている場合がある。リード対象データのうちの先頭のデータが格納されているフラッシュダイが、例えばフラッシュダイ#mである場合、スケジューラ433は、ホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンド、つまり、リード対象データのうちの先頭のデータを読み出すためのリードコマンドを、フラッシュダイ#mに対応する第1のキューに格納する。
【0055】
第2のキューは、ホストリードコマンドに関連付けられた複数のリードコマンドのうちの後続のいずれかのリードコマンドを格納するためのキューである。複数のリードコマンドのうちの後続のいずれかのリードコマンドは、複数のリードコマンドのうちの2番目以降のいずれかのリードコマンドである。例えば、あるホストリードコマンドによって指定されたリード対象データのうちの2番目のデータがフラッシュダイ#mに格納されている場合、スケジューラ433は、2番目のデータを読み出すためのリードコマンド、つまりこのホストリードコマンドに関連付けられた複数のリードコマンドのうちの2番目のリードコマンドを、フラッシュダイ#mに対応する第2のキューに格納する。また、このリード対象データのうちの3番目のデータがフラッシュダイ#nに格納されている場合、スケジューラ433は、3番目のデータを読み出すためのリードコマンド、つまりこのホストリードコマンドに関連付けられた複数のリードコマンドのうちの3番目のリードコマンドを、フラッシュダイ#nに対応する第2のキューに格納する。
【0056】
コマンドバッファは、第1のキューおよび第2のキューから選択されたキューからフェッチされる実行対象のリードコマンドを格納するためのバッファである。例えば、フラッシュダイ#mに対応するコマンドバッファには、フラッシュダイ#mに対応する第1のキューおよびフラッシュダイ#mに対応する第2のキューから選択されたキューからフェッチされる実行対象のリードコマンドが、フラッシュダイ#mに送信されるべきリードコマンドとして格納される。
【0057】
あるフラッシュダイ(例えばフラッシュダイ#m)に対応するコマンドバッファに実行対象のリードコマンドが格納されたことに応じ、スケジューラ433は、実行対象のリードコマンドが単一のリードコマンドと複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かに基づいて、この実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定する。
【0058】
第1のキューおよび第2のキューに格納されるリードコマンドの各々には、対応するホストリードコマンドとこのリードコマンドとの関係を示す情報と、対応するホストリードコマンドのコマンド管理情報へのポインタであるコマンドポインタと、が付帯情報として付加されていてもよい。
【0059】
ホストリードコマンドとこのリードコマンドとの関係を示す情報は、例えば、ホストリードコマンドに関連付けられた一つ以上のリードコマンドのうちの先頭のリードコマンドから当該リードコマンドまでのオフセットを示すオフセット情報と、当該リードコマンドがホストリードコマンドに関連付けられた一つ以上のリードコマンドのうちの最後のリードコマンドであることを示すエンド情報とを含む。例えば、「CMDx Part0」または「CMDx-1」で表されるリードコマンドは、ホストリードコマンドCMDxに関連付けられた最初のリードコマンドである。「CMDx Part1」または「CMDx-2」で表されるリードコマンドは、ホストリードコマンドCMDxに関連付けられた2番目のリードコマンドである。この2番目のリードコマンドがホストリードコマンドCMDxに関連付けられた最後のリードコマンドである場合、2番目のリードコマンドの付帯情報は、エンド情報をさらに含んでいてもよい。あるホストリードコマンドCMDxに関連付けられた単一のリードコマンドは、「CMDx Part0」または「CMDx-1」で表されてもよい。単一のリードコマンドは最後のリードコマンドでもあるので、単一のリードコマンドの付帯情報は、エンド情報をさらに含んでいてもよい。
【0060】
コマンドポインタは、対応するホストリードコマンドのコマンド管理情報(開始LBA、データ長、データポインタ等)が記憶されているSRAM42内の記憶位置を示すアドレスである。
【0061】
スケジューラ433は、実行対象のリードコマンドが単一のリードコマンドと複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かを、実行対象のリードコマンドに付加された付帯情報に基づいて、あるいは付帯情報とコマンド管理情報との双方に基づいて、判定することができる。
【0062】
実行対象のリードコマンドが単一のリードコマンドである場合、あるいは実行対象のリードコマンドが複数のリードコマンドのうちの最後のリードコマンドである場合には、スケジューラ433は、実行対象のリードコマンドに後続する次のリードコマンドの発行が必要ではないと判定する。
【0063】
一方、実行対象のリードコマンドが複数のリードコマンドのうちの先頭または中間のリードコマンドである場合、スケジューラ433は、実行対象のリードコマンドに後続する次のリードコマンドの発行が必要である、つまり実行対象のリードコマンドによってフラッシュダイ#mから読み出されるべきデータに後続する次のデータを読み出すことが必要である、と判定する。
【0064】
次のリードコマンドの発行が必要と判定したことに応じ、スケジューラ433は、L2Pテーブル61を参照して、実行対象のリードコマンドによって読み出しが要求されるデータ(第1のデータ)に後続するデータ(第2のデータ)が格納されているダイ(フラッシュダイ#n)と、このフラッシュダイ#nに格納されている第2のデータの長さと、を特定する。そして、スケジューラ433は、第2のデータを読み出すためのリードコマンドを生成する。
【0065】
第2のデータを読み出すためのリードコマンドを生成した後、スケジューラ433は、実行対象のリードコマンドをフラッシュダイ#mに送信する処理と、生成したリードコマンドをフラッシュダイ#nに対応する第2のキューに格納する処理と、を実行する。
【0066】
以上のスケジューリング処理により、一つのホストリードコマンドによって指定されるリード対象データが複数のフラッシュダイに分散されている場合には、このリード対象データの先頭のデータから最後のデータにそれぞれ対応する複数のリードコマンドを、これら複数のリードコマンドのうちの先頭のリードコマンドから最後のリードコマンドの順序で、複数のフラッシュダイに送信することが可能となる。この結果、リード対象データをそのリード対象データに含まれる先頭のデータから最後のデータの順序でNAND型フラッシュメモリ5から読み出すことが可能となる。
【0067】
また、以上のスケジューリング処理では、あるフラッシュダイ(例えばフラッシュダイ#m)に対応するコマンドバッファに実行対象のリードコマンドが格納されたことに応じ、つまり、あるリードコマンドをフラッシュダイ#mに対応するコマンドバッファを介してフラッシュダイ#mに送信することを決定したことに応じ、第2のデータが格納されているフラッシュダイと、第2のデータの長さと、が特定される。これにより、実行対象のリードコマンドに先行するリードコマンドに対応する読み出し動作がフラッシュダイ#mにおいて実行されている間に、第2のデータが格納されているフラッシュダイと、第2のデータの長さと、を特定する処理を実行することが可能となる。実行対象のリードコマンドに先行するリードコマンドに対応する読み出し動作がフラッシュダイ#mにおいて実行されている間は、実行対象のリードコマンドをフラッシュダイ#mに送信することはできない。よって、先行するリードコマンドに対応する読み出し動作の完了を待っている待ち時間を利用して、第2のデータが格納されているフラッシュダイと、第2のデータの長さと、を効率良く特定することが可能となる。
【0068】
よって、リード対象データに含まれる複数のデータがそれぞれ格納されているフラッシュダイの全てを最初に特定する場合に比べ、リード対象データに含まれる先頭のデータを読み出すための先頭のリードコマンドを、先頭のデータが格納されているフラッシュダイに対応する第1のキューに迅速に格納することが可能となる。
【0069】
ここで、第1のデータが格納されているフラッシュダイと、このフラッシュダイに格納されている第1のデータの長さと、第1のデータに後続する第2のデータが格納されている別のフラッシュダイと、この別のフラッシュダイに格納されている第2のデータの長さとを特定する処理との例について説明する。ここでは、ホストリードコマンドによって指定されたリード対象データの長さが8(=8LBA=32KiB)であり、第1のデータの長さが4(=4LBA=16KiB)であり、第2のデータの長さが4(=4LBA=16KiB)であり、第1のデータと第2のデータが2つのフラッシュダイに分散されている場合を想定する。
【0070】
第1のデータが格納されているフラッシュダイを特定する処理では、スケジューラ433は、例えば、ホストリードコマンドによって指定された開始LBAに関連付けられた物理アドレスをL2Pテーブル61から取得する。そして、スケジューラ433は、取得した物理アドレス(例えば、取得した物理アドレスの上位ビット部)に基づいて、第1のデータが格納されているフラッシュダイを特定する。
【0071】
特定したフラッシュダイに格納されている第1のデータの長さを特定する処理では、スケジューラ433は、例えば、開始LBA+1に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBAに関連付けられた物理アドレスと開始LBA+1に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第1のデータの長さを示す値を1から2に変更する。そして、スケジューラ433は、開始LBA+2に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+1に関連付けられた物理アドレスと開始LBA+2に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第1のデータの長さを示す値を1だけ増やし、第1のデータの長さを示す値を2から3に変更する。そして、スケジューラ433は、開始LBA+3に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+2に関連付けられた物理アドレスと開始LBA+3に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第1のデータの長さを示す値を1だけ増やし、第1のデータの長さを示す値を3から4に変更する。そして、スケジューラ433は、開始LBA+4に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+4に関連付けられた物理アドレスに対応するフラッシュダイが、開始LBA+3に関連付けられた物理アドレスに対応するフラッシュダイと異なる場合、スケジューラ433は、第1のデータの長さが4であると決定する。そして、スケジューラ433は、第1のデータを読み出すためのリードコマンドCMD-0を生成し、生成したリードコマンドCMD-0を、第1のデータが格納されているフラッシュダイに対応する第1のキューに格納する。このリードコマンドCMD-0は、例えば、開始LBAに関連付けられた物理アドレス、データ長(=4)、コマンドポインタ、オフセット情報等を含む。なお、リードコマンドCMD-0の内容を示す情報がコマンド管理情報に追加されるように、スケジューラ433は、SRAM42上のコマンド管理情報を更新してもよい。
【0072】
第2のデータが格納されているフラッシュダイを特定する処理では、スケジューラ433は、開始LBA+4を、第2のデータの最初のLBAとして特定してもよい。4は、リードコマンドCMD-0によって指定された第1のデータのデータ長である。開始LBAは、リードコマンドCMD-0によって指定されたポインタを使用してコマンド管理情報を参照することによって、取得し得る。
【0073】
スケジューラ433は、開始LBA+4に関連付けられた物理アドレスをL2Pテーブル61から取得する。そして、スケジューラ433は、取得した物理アドレス(例えば、取得した物理アドレスの上位ビット部)に基づいて、第2のデータが格納されているフラッシュダイを特定する。
【0074】
特定したフラッシュダイに格納されている第2のデータの長さを特定する処理では、スケジューラ433は、例えば、開始LBA+5に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+4に関連付けられた物理アドレスと開始LBA+5に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第2のデータの長さを示す値を1から2に変更する。そして、スケジューラ433は、開始LBA+6に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+5に関連付けられた物理アドレスと開始LBA+6に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第2のデータの長さを示す値を1だけ増やし、第2のデータの長さを示す値を2から3に変更する。そして、スケジューラ433は、開始LBA+7に関連付けられた物理アドレスをL2Pテーブル61から取得する。開始LBA+6に関連付けられた物理アドレスと開始LBA+7に関連付けられた物理アドレスとが、同じフラッシュダイ内の連続する物理アドレスである場合には、スケジューラ433は、第2のデータの長さを示す値を1だけ増やし、第2のデータの長さを示す値を3から4に変更する。第1のデータの長さと現在の第2のデータの長さとの合計は、コマンド管理情報によって示されるデータ長に一致する。このため、スケジューラ433は、第2のデータの長さが4であると決定する。そして、スケジューラ433は、第2のデータを読み出すためのリードコマンドCMD-1を生成し、生成したリードコマンドCMD-1を、第2のデータが格納されているフラッシュダイに対応する第2のキューに格納する。このリードコマンドCMD-1は、例えば、開始LBA+4に関連付けられた物理アドレス、データ長(=4)、コマンドポインタ、オフセット情報等を含む。なお、リードコマンドCMD-1の内容を示す情報がコマンド管理情報にさらに追加されるように、スケジューラ433は、SRAM42上のコマンド管理情報を更新してもよい。
【0075】
リードデータ転送制御部434は、ホスト2から受信されたホストリードコマンドによって指定されるリード対象データを、そのリード対象データに含まれる先頭のデータから最後のデータの順序で、ホスト2に転送するデータ転送制御処理を実行する。
【0076】
データ読み出し動作に必要な時間(読み出し時間tR)は、フラッシュダイ毎に異なる場合がある。このため、リード対象データがそのリード対象データに含まれる先頭のデータから最後のデータの順序でフラッシュダイから読み出されることを確実にするために、リードデータ転送制御部434は、以下の処理を実行する。
【0077】
ここでは、第1のデータを読み出すための実行対象のリードコマンドがフラッシュダイ#mに送信された後に、第1のデータに後続する第2のデータを読み出すための次のリードコマンドがフラッシュダイ#nに送信された場合を想定する。
【0078】
フラッシュダイ#mのページバッファへの第1のデータの読み出しの完了後、リードデータ転送制御部434は、フラッシュダイ#mのページバッファから第1のデータを読み出す。つまり、フラッシュダイ#mにおいては、メモリセルアレイからページバッファに第1のデータを読み出す動作(センス動作)が実行される。フラッシュダイ#mにおいてこのセンス動作が完了すると、リードデータ転送制御部434は、フラッシュダイ#mのページバッファから第1のデータを読み出す。
【0079】
そして、フラッシュダイ#mのページバッファへの第1のデータの読み出しとフラッシュダイ#nのページバッファへの第2のデータの読み出しとの双方の完了後、リードデータ転送制御部434は、フラッシュダイ#nのページバッファから第2のデータを読み出す。
【0080】
つまり、フラッシュダイ#mのページバッファへの第1のデータの読み出しが完了していない状態で、フラッシュダイ#nのページバッファへの第2のデータの読み出しが完了した場合、リードデータ転送制御部434は、フラッシュダイ#nのページバッファから第2のデータを読み出さずに、フラッシュダイ#mのページバッファへの第1のデータの読み出しが完了するまで待つ。フラッシュダイ#mのページバッファへの第1のデータの読み出しの完了後、リードデータ転送制御部434は、フラッシュダイ#mのページバッファへの第1のデータを読み出す処理と、フラッシュダイ#nのページバッファから第2のデータを読み出す処理と、を実行する。
【0081】
このように、リード対象データに含まれる複数のデータを先頭のデータから最後のデータの順序に並べ替える処理は、各フラッシュダイのページバッファからデータを読み出すタイミングを制御することによって実行される。これにより、フラッシュダイ毎にtRが異なる場合であっても、リード対象データを、そのリード対象データに含まれる先頭のデータから最後のデータの順序で、ホスト2に転送することができる。
【0082】
また、リードデータ転送制御部434は、複数の各フラッシュダイにリードバッファ423を割り当てる処理を以下のように実行する。
【0083】
ここでは、第1のデータを読み出すための実行対象のリードコマンドがフラッシュダイ#mに送信された後に、第1のデータに後続する第2のデータを読み出すための次のリードコマンドがフラッシュダイ#nに送信された場合を想定する。
【0084】
フラッシュダイ#mのページバッファへの第1のデータの読み出しの完了に応じ、リードデータ転送制御部434は、リードバッファ423内の一つの記憶領域である第1のリードバッファをフラッシュダイ#mに割り当て、第1のダイのページバッファから第1のリードバッファに第1のデータを転送する。
【0085】
フラッシュダイ#nのページバッファへの第2のデータの読み出しの完了に応じ、リードデータ転送制御部434は、フラッシュダイ#mに第1のリードバッファが割り当て済みである否かを判定する。フラッシュダイ#mに第1のリードバッファが既に割り当てられている場合、リードデータ転送制御部434は、リードバッファ423内の別の一つの記憶領域である第2のリードバッファを、フラッシュダイ#nに割り当て、フラッシュダイ#nのページバッファから第2のリードバッファに第2のデータを転送する。
【0086】
これにより、ホスト2に転送できないデータがリードバッファ423に長い間滞留することを防ぐことができるので、SSD3に設けることが必要なリードバッファ423の容量を最小化することができる。
【0087】
次に、フラッシュダイの構成を説明する。図2は、NAND型フラッシュメモリ5に含まれる複数のフラッシュダイのうちの代表的な1つのメモリダイの構成例を示すブロック図である。その他のフラッシュダイも基本的には同様の構成となっている。
【0088】
ここでは、複数のフラッシュダイのうちのフラッシュダイ#0の構成例が代表して示されている。他のフラッシュダイもフラッシュダイ#0と同じ構成を有している。また、ここでは、フラッシュダイ#0が2つのプレーンを含むマルチプレーン構成である場合が例として示されている。
【0089】
フラッシュダイ#0は、2つのプレーン(プレーンPLN0、およびプレーンPLN1)と、2つのプレーン(プレーンPLN0、およびプレーンPLN1)にそれぞれ対応する2つの周辺回路(周辺回路51-0、および周辺回路51-1)とを含む。
【0090】
プレーンPLN0およびプレーンPLN1の各々は、メモリセルアレイを含む。プレーンPLN0およびプレーンPLN1の各々のメモリセルアレイは、ブロックBLK0~BLKx-1を含む。ブロックBLK0~BLKx-1の各々は、データ消去動作の単位である。ブロックBLK0~BLKx-1の各々は、消去ブロック、フラッシュブロック、またはメモリブロックとも称される。ブロックBLK0~BLKx-1の各々は、ページP0~Py-1を含む。ページP0~Py-1の各々は、データ書き込み動作およびデータ読み出し動作の単位である。ページP0~Py-1の各々は、例えば、同一ワード線に接続された複数のメモリセルを含む。
【0091】
周辺回路51-0および周辺回路51-1の各々は、対応するプレーンのメモリセルアレイを制御する回路である。周辺回路51-0は、ページバッファ511-0を含む。ページバッファ511-0は、プレーンPLN0のメモリセルアレイに書き込むべきデータまたはプレーンPLN0のメモリセルアレイから読み出されたデータを一時的に格納するためのバッファである。同様に、周辺回路51-1も、ページバッファ511-1を含む。ページバッファ511-1は、プレーンPLN1のメモリセルアレイに書き込むべきデータまたはプレーンPLN1のメモリセルアレイから読み出されたデータを一時的に格納するためのバッファである。
【0092】
次に、並列読み出し動作について説明する。図3は、複数のフラッシュダイからデータを並列に読み出すための処理を示すタイミングチャートである。
【0093】
各フラッシュダイからのデータ読み出し動作は、センス動作と、データ出力動作(Data out)とを含む。センス動作は、メモリセルアレイからページバッファにデータを読み出す動作である。データ出力動作(Data out)は、チャンネルchを介して、ページバッファからコントローラ4にデータを転送する動作である。各フラッシュダイにおいて、プレーンPLN0におけるセンス動作は、プレーンPLN1におけるセンス動作と同時に実行することができる。しかしながら、各フラッシュダイのプレーンPLN0およびプレーンPLN1は同じチャンネルを共有しているため、プレーンPLN0のページバッファからコントローラ4にデータを転送するデータ出力動作と、プレーンPLN1のページバッファからコントローラ4にデータを転送するデータ出力動作とを、同時に実行することはできない。同様に、バンクBNK0~BNK3は互いに独立して動作可能であるが、同じチャンネルを介して同時にデータを転送することはではない。一方、図1で示したようにチャンネルch1~ch7は互いに独立しているため、チャンネルch1~ch7を介したデータ転送は、同時に実行することができる。
【0094】
このため、SSD3においては、図3に示すように、チャンネルch0を共有する計8個のプレーン(BNK0,PLN0),(BNK0,PLN1),(BNK1,PLN0),(BNK1,PLN1),(BNK2,PLN0),(BNK2,PLN1),(BNK3,PLN0),および(BNK3,PLN1)からのデータ読み出しは、これら8個のプレーンからのデータ転送がチャンネルch0を介して時分割方式で実行されるように、並列に実行される。
【0095】
同様に、チャンネルch1を共有する計8個のプレーン(BNK0,PLN0),(BNK0,PLN1),(BNK1,PLN0),(BNK1,PLN1),(BNK2,PLN0),(BNK2,PLN1),(BNK3,PLN0),および(BNK3,PLN1)からのデータ読み出しは、これら8個のプレーンからのデータ転送がチャンネルch1を介して時分割方式で実行されるように、並列に実行される。
【0096】
次に、リード処理の概略を説明する。図4は、ホストリードコマンドプールと、複数のフラッシュコマンドキューと、複数のダイと、複数のチャンネルと、リードバッファとの関係の例を示すブロック図である。
【0097】
ホスト2から受信されるホストリードコマンドは、ホストリードコマンドプール421に蓄積される。コントローラ4は、ホストリードコマンドプール421に蓄積されたホストリードコマンド毎に、以下の処理を実行する。
【0098】
コントローラ4は、ホストリードコマンドによって指定された論理アドレスに対応する物理アドレスをL2Pテーブル61から取得する。コントローラ4は、取得した物理アドレスに基づいて、ホストリードコマンドによって指定されたリード対象データが格納されているフラッシュダイを特定する。コントローラ4は、リード対象データを読み出すためのリードコマンドを生成する。そして、コントローラ4は、生成したリードコマンドを、特定したフラッシュダイに対応するフラッシュコマンドキューに格納する。
【0099】
コントローラ4においては、フラッシュダイ#0~#31に1対1の関係で対応付けらフラッシュコマンドキュー422-0~422-31が設けられている。例えば、フラッシュダイ#0に対応するフラッシュコマンドキュー422-0は、フラッシュダイ#0からデータを読み出すための複数のリードコマンドを格納可能である。フラッシュダイ#1に対応するフラッシュコマンドキュー422-1は、フラッシュダイ#1からデータを読み出すための複数のリードコマンドを格納可能である。そして、フラッシュダイ#31に対応するフラッシュコマンドキュー422-31は、フラッシュダイ#31からデータを読み出すための複数のリードコマンドを格納可能である。
【0100】
コントローラ4は、フラッシュコマンドキュー422-0~422-31からフラッシュダイ#0~#31にリードコマンドをそれぞれ送信する。フラッシュダイ#0~#31の各々は、センス動作を実行して、メモリセルアレイからページバッファにデータを読み出す。フラッシュダイ#0~#31の各々から読み出されたリードデータは、対応するチャンネルを介してコントローラ4に転送され、そしてリードバッファ423に格納される。コントローラ4は、各ホストリードコマンドに対応するデータを、リードバッファ423からホスト2に転送する。
【0101】
ここで、並列読み出し数を最大化するための処理について説明する。
【0102】
各ホストリードコマンドによって指定されるリード対象データのサイズが比較的小さい場合、異なるホストリードコマンドの組み合わせに基づいて異なるフラッシュダイに複数のリードコマンドが発行される。この場合、これらリードコマンドを並列に実行することが必要となる。
【0103】
一方、一つのホストリードコマンドによって指定されるリード対象データのサイズが比較的大きい場合もある。例えば、ページサイズが16KiBである場合、一つのリードコマンドによって読み出されるデータの最大サイズは、16KiBである。フラッシュダイ当たりのプレーンの数が2である場合、一つのリードコマンドによって読み出されるデータの最大サイズは、32KiBである。フラッシュダイ当たりのプレーンの数が4である場合、一つのリードコマンドによって読み出されるデータの最大サイズは、64KiBである。
【0104】
一つのホストリードコマンドによって2MiBのような大きなサイズのリード対象データの読み出しが要求される場合もある。このような大きなサイズのリード対象データが異なるフラッシュダイに分散されている場合、一つのホストリードコマンドに関連付けられた複数のリードコマンドが生成される。
【0105】
例えば、フラッシュダイ当たりのプレーンの数が2で、ページサイズが16KiBで、一つのホストリードコマンドによって指定されるリード対象データのサイズが128KiBである場合、ホストリードコマンドに関連付けられた4つのリードコマンドが生成される場合がある。例えば、128KiBリード対象データの最初の32KiBデータがフラッシュダイ#0に格納されており、128KiBリード対象データの2番目の32KiBデータがフラッシュダイ#1に格納されており、128KiBリード対象データの3番目の32KiBデータがフラッシュダイ#2に格納されており、128KiBリード対象データの4番目の32KiBデータがフラッシュダイ#7に格納されている場合、最初の32KiBデータを読み出すための1番目のリードコマンドは、フラッシュコマンドキュー422-0を介してフラッシュダイ#0に送信される。2番目の32KiBデータを読み出すための2番目のリードコマンドは、フラッシュコマンドキュー422-1を介してフラッシュダイ#1に送信される。3番目の32KiBデータを読み出すための3番目のリードコマンドは、フラッシュコマンドキュー422-2を介してフラッシュダイ#2に送信される。4番目の32KiBデータを読み出すための4番目のリードコマンドは、フラッシュコマンドキュー422-7を介してフラッシュダイ#7に送信される。
【0106】
フラッシュダイ毎に、ビジー/レディーステートは異なる。また、フラッシュ毎にデータ読み出し時間(tR)が異なる場合もある。
【0107】
このため、同じホストリードコマンドに関連付けられた複数のリードコマンドを単純に複数のフラッシュダイに送信すると、ホスト2に送信する順序と異なる順序で、複数のデータが異なるフラッシュダイからリードバッファ423に転送されてしまう。このことは、SSD3に設けることが必要なリードバッファ423のサイズが巨大化される要因となる。
【0108】
そこで、本実施形態では、コントローラ4は、以下のようなスケジューリング処理を行う。
【0109】
コントローラ4は、読み出しを実行したらすぐにホスト2に転送できる場合に、フラッシュダイにリードコマンドを送信する。
【0110】
一つのホストリードコマンドに関連付けられた複数のリードコマンドについては、複数のリードコマンドのうちの先頭のリードコマンドから直前のリードコマンドまでの全てを他のフラッシュダイそれぞれに発行済みの場合に、直前のリードコマンドに後続する次のリードコマンドをフラッシュダイに発行する。これにより、ホストリードコマンドに関連付けられた複数のリードコマンドを、このホストリードコマンドによって指定されるリード対象データに含まれる複数のデータがホスト2に転送されるべき順序と同じ順序で、異なるフラッシュダイにそれぞれ送信することができる。この結果、基本的には、リード対象データに含まれる複数のデータを、これらデータがホスト2に転送されるべき順序と同じ順序で、異なるフラッシュダイから読み出すことができる。
【0111】
コントローラ4は、同じホストリードコマンドに関連付けられたリードコマンドを同じフラッシュダイに対応するフラッシュコマンドキューに同時にキューイングすることは禁止する。同じホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドは、フラッシュダイがビジーでなければ無条件に発行可能である。
【0112】
また、コントローラ4は、以下のようなリードデータ並べ替え処理を行う。
【0113】
コントローラ4は、リードデータ並べ替え処理を、各フラッシュダイからリードバッファ423へリードデータを転送するタイミングを制御することによって実行する。
【0114】
例えば、同じホストリードコマンドによって指定されたリード対象データに含まれる先頭のデータを読み出すための先頭のリードコマンドがフラッシュダイ#0に送信され、リード対象データに含まれる2番目のデータを読み出すための2番目のリードコマンドがフラッシュダイ#1に送信され、リード対象データに含まれる3番目のデータを読み出すための3番目のリードコマンドがフラッシュダイ#2に送信された場合を想定する。
【0115】
フラッシュダイ#0のページバッファへの先頭のデータの読み出しの完了後、コントローラ4は、フラッシュダイ#0のページバッファからリード対象データのうちの先頭のデータを読み出す。この場合、コントローラ4は、フラッシュダイ#0のページバッファへの先頭のデータの読み出しの完了後、第1のリードバッファ(リードバッファ423内の一つの記憶領域)をフラッシュダイ#0に割り当て、フラッシュダイ#0のページバッファから第1のリードバッファに先頭のデータを転送する。
【0116】
このように、リード対象データのうちの先頭のデータについては、その先頭のデータのページバッファへの読み出しが完了すれば、無条件にその先頭のデータをページバッファから読み出すことができる。
【0117】
そして、フラッシュダイ#0のページバッファへの先頭のデータの読み出しとフラッシュダイ#1のページバッファへの2番目のデータの読み出しとの双方が完了した後、コントローラ4は、フラッシュダイ#1のページバッファから2番目のデータを読み出す。この場合、フラッシュダイ#1のページバッファから2番目のデータの読み出しの完了に応じ、コントローラ4は、フラッシュダイ#0に第1のリードバッファが割り当て済みである否かを判定する。フラッシュダイ#0に第1のリードバッファが既に割り当てられている場合、コントローラ4は、第2のリードバッファ(リードバッファ423内の別の一つの領域)をフラッシュダイ#1に割り当て、フラッシュダイ#1ページバッファから第2のリードバッファに2番目のデータを転送する。一方、フラッシュダイ#0に第1のリードバッファが割り当てられていない場合、コントローラ4は、フラッシュダイ#0に第1のリードバッファが割り当てられた後に、フラッシュダイ#1に第2のリードバッファを割り当てる。
【0118】
このように、2番目のデータは、先頭のデータのページバッファへの読み出しが完了しことを条件に、フラッシュダイ#1のページバッファから読み出される。フラッシュダイ#0のページバッファへの先頭のデータの読み出しが完了していない状態で、フラッシュダイ#1のページバッファへの2番目のデータの読み出しが完了した場合、コントローラ4は、フラッシュダイ#1のページバッファから2番目のデータを読み出さずに、フラッシュダイ#0のページバッファへの先頭のデータの読み出しが完了するまで待つ。そして、フラッシュダイ#0のページバッファへの先頭のデータの読み出しの完了後に、コントローラ4は、フラッシュダイ#0のページバッファから先頭のデータを読み出す処理と、フラッシュダイ#1のページバッファから2番目のデータを読み出す処理とを実行する。
【0119】
そして、フラッシュダイ#0のページバッファへの先頭のデータの読み出しと、フラッシュダイ#1のページバッファへの2番目のデータの読み出しと、フラッシュダイ#2のページバッファへの3番目のデータの読み出しとが完了した後、コントローラ4は、フラッシュダイ#2のページバッファから3番目のデータを読み出す。
【0120】
フラッシュダイ#0のページバッファへの先頭のデータの読み出しまたはフラッシュダイ#1のページバッファへの2番目のデータの読み出しの少なくとも一方が完了していない状態で、フラッシュダイ#2のページバッファへの2番目のデータの読み出しが完了した場合、コントローラ4は、フラッシュダイ#2のページバッファから2番目のデータを読み出さずに、フラッシュダイ#0のページバッファへの先頭のデータの読み出しとフラッシュダイ#1のページバッファへの2番目のデータの読み出しの双方が完了するのを待つ。
【0121】
このようなリードデータ並べ替え処理により、たとえフラッシュダイ毎にtRが異なる場合であっても、ホストリードコマンドによって指定されるリード対象データが、そのリード対象データに含まれる先頭のデータから最後のデータの順序でホスト2に転送されることを確実にすることができる。
【0122】
また、先頭のデータから最後のデータの順序でリードバッファを各フラッシュダイに割り当てているので、コントローラ4は、リードバッファをあるフラッシュダイに割り当てし次第、このフラッシュダイからリードバッファへデータの転送を開始できる。また、フラッシュダイからリードバッファへデータの転送が完了し次第、コントローラ4は、このリードバッファからホスト2へのデータの転送を開始できる。
【0123】
このように、リードバッファからホスト2へのデータの転送の順序と、フラッシュダイからリードバッファへのデータの転送の順序は、個々のダイへのリードバッファの割り当ての順序と一致する。
【0124】
次に、SSD3に設けることが必要なリードバッファ423の総容量について説明する。リードバッファ423の総容量は、全チャネルのフラッシュダイからコントローラ4へのデータ転送が絶え間なく実行でき、かつPCIeバスのようなバス7を介したホスト2へのデータの転送も絶え間なく実行できるように、設定され得る。ここで、フラッシュメモリ5全体のリードバンド幅がチャネル当たりのバンド幅よりも十分に大きければ、フラッシュダイ毎のtRのバラツキによる性能低下は、目立たなくなる。フラッシュメモリ5全体のリードバンド幅(Read Bandwidth)は、以下の式によって表される。
【0125】
Read Bandwidth = (1/tR) × page size × total number of dies × planes per die
ここで、1/tRは、単位時間当たりに実行可能なセンス動作の数を示す。total number of diesは、SSD3に設けられたフラッシュダイの総数である。planes per dieは、フラッシュダイ当たりのプレーンの数である。
【0126】
1チャンネル当たりの帯域幅は、PCIeバスのようなバス7の帯域幅よりも小さい。PCIeバスの帯域幅(PCIeBandwidth、以下、ここではPCIeBWと略して呼ぶ場合もある):1チャンネル当たりの帯域幅(Bandwidth per channel、以下、ここではBW/Cと略して呼ぶ場合もある)が例えば4:1である場合、本実施形態では、PCIeバスの帯域幅全体を使用してリードデータをホスト2に転送できるようにするために、少なくとも5つのリードバッファがSRAM42上に設けられる。
【0127】
これら5つのリードバッファのうちの任意の4つのリードバッファは、フラッシュメモリ5からコントローラ4に並列に転送されるリードデータを一時的に格納するため使用される。つまり、4つのリードバッファがリードデータの入力用バッファとして使用される。各入力用バッファは、遅いスピードで転送されるフラッシュダイからのリードデータを遅いスピードで受信し、受信したリードデータを格納する。
【0128】
5つのリードバッファのうちの任意の1つのリードバッファは、PCIeバスを介してリードデータをホスト2に転送するために使用される。つまり、1つのリードバッファがリードデータの出力バッファとして使用される。出力バッファに格納されているリードデータは、速いスピードで出力バッファから読み出され、そしてPCIeバスを介してホスト2のメモリ22に転送される。
【0129】
次に、フラッシュコマンドキュー422の構成例について説明する。図5は、実施形態に係るメモリシステム3における複数のフラッシュコマンドキュー422の各々の構成例を示すブロック図である。
【0130】
SRAM42に含まれるフラッシュコマンドキュー422は、フラッシュダイ#0~#31それぞれに一対一で対応するフラッシュコマンドキュー422-0~422-31を含む。例えば、フラッシュコマンドキュー422-0は、フラッシュダイ#0からデータを読み出すためのリードコマンドのグループを格納するために使用される。他のフラッシュコマンドキューと他のフラッシュダイとの間の関係も同様である。
【0131】
フラッシュコマンドキュー422-0~422-31の各々は、一つのリーディングリードキューと、一つのフォローイングリードキューと、一つのネクストコマンドバッファとを含む。リーディングリードキューおよびフォローイングリードキューの各々は、例えば、1以上の深さを有する先入れ先出し(FIFO)キューである。例えば、フラッシュコマンドキュー422-0は、リーディングリードキュー4221-0と、フォローイングリードキュー4222-0と、ネクストコマンドバッファ4223-0とを含む。フラッシュコマンドキュー422-1は、リーディングリードキュー4221-1と、フォローイングリードキュー4222-1と、ネクストコマンドバッファ4223-1とを含む。そして、フラッシュコマンドキュー422-31は、リーディングリードキュー4221-31と、フォローイングリードキュー4222-31と、ネクストコマンドバッファ4223-31とを含む。
【0132】
リーディングリードキュー4221-0~4221-31は、第1のキューとも称される。例えば、リーディングリードキュー4221-0は、フラッシュダイ#0に格納されているデータを読み出すためのリードコマンドのうち、ホストリードコマンドに関連付けられた単一のリードコマンド、またはホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを格納する。
【0133】
フォローイングリードキュー4222-0~4222-31は、第2のキューとも称される。例えば、フォローイングリードキュー4222-0は、フラッシュダイ#0に格納されているデータを読み出すためのリードコマンドのうち、ホストリードコマンドに関連付けられた複数のリードコマンドのうちの後続のいずれかのリードコマンドを格納する。
【0134】
ネクストコマンドバッファ4223-0~4223-31は、単にコマンドバッファとも称される。例えば、ネクストコマンドバッファ4223-0は、リーディングリードキュー4221-0およびフォローイングリードキュー4222-0から選択されたキューからフェッチされる実行対象のリードコマンドを格納する。
【0135】
ホスト2からフェッチされた各ホストリードコマンドに関連付けられた1つ以上のリードコマンドをフラッシュダイ#0~#31のいずれかに送信する処理は、スケジューラ433によって制御される。
【0136】
まず、ホスト2のサブミッションキュー(SQ)からフェッチされたホストリードコマンドは、ホストリードコマンドプール421に格納される。
【0137】
スケジューラ433は、ホストリードコマンドプール421に格納された複数のホストリードコマンドから1つのホストリードコマンドを選択する。スケジューラ433は、選択したホストリードコマンドによって指定される論理アドレスに関連付けられた物理アドレスをL2Pテーブル61から取得する。スケジューラ433は、取得した物理アドレスに基づいて、選択したホストリードコマンドによって指定されたリード対象データが格納されているフラッシュダイを特定する。そして、スケジューラ433は、ホストリードコマンドに関連付けられた単一のリードコマンド、またはホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを生成する。単一のリードコマンドは、ホストリードコマンドによって指定されたリード対象データをある一つのフラッシュダイから読み出すための1つのリードコマンドである。複数のリードコマンドのうちの先頭のリードコマンドは、ホストリードコマンドによって指定されたリード対象データのうちの先頭のデータをある一つのフラッシュダイから読み出すための一つのリードコマンドである。
【0138】
スケジューラ433は、特定したフラッシュダイに対応するフラッシュコマンドキューを選択する。そして、スケジューラ433は、ホストリードコマンドに関連付けられた単一のリードコマンド、またはホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドを、選択したフラッシュコマンドキューのリーディングリードキューに格納する。
【0139】
あるフラッシュダイに対応するリーディングリードキューおよびフォローイングリードキューの双方にリードコマンドが格納されている場合、スケジューラ433は、フォローイングリードキューをリーディングリードキューよりも優先的に選択し、フォローイングリードキューに格納されているリードコマンドを実行対象のリードコマンドとしてフェッチし、フェッチした実行対象のリードコマンドを、対応するネクストコマンドバッファに格納する。このようにフォローイングリードキューを優先的に選択することにより、異なる複数のフラッシュダイからの読み出しを必要とするホストリードコマンドが同時に実行される数を制限できる。また、ある1つのホストリードコマンドに関連付けられた複数のリードコマンドの実行が一旦開始された後は、異なる複数のフラッシュダイからの読み出しを必要とする他のホストリードコマンドの開始を抑制することが可能となる。この結果、ある1つのホストリードコマンドによって指定されたリード対象データに含まれる複数のデータの全てをある短い時間内にフラッシュメモリ5から読み出すことが可能となり、ホスト2への転送が開始できない多くのデータでリードバッファ423が長い間専有されてしまうことを防止できる。
【0140】
なお、リーディングリードキューに格納されているリードコマンドが1つのホストリードコマンドに関連付けられた単一のリードコマンドである場合には、リーディングリードキューが優先して選択されてもよい。なぜなら、単一のリードコマンドに対応する処理はすぐに完了するので、たとえ1つのホストリードコマンドに関連付けられた複数のリードコマンドの実行が一旦開始された後に単一のリードコマンドが実行されても、1つのホストリードコマンドに関連付けられたこれら複数のリードコマンドの処理の完了までに要する時間は、あまり長くならないからである。
【0141】
リーディングリードキューまたはフォローイングリードキューから選択されたリードコマンドをネクストコマンドバッファに格納したことに応じ、つまり、あるリードコマンドを、あるフラッシュダイにコマンドバッファを介して送信することを決定したことに応じ、スケジューラ433は、ネクストコマンドバッファに格納された実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否か、つまり実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータの読み出しが必要か否かを判定する。
【0142】
次のリードコマンドの発行が必要な場合、スケジューラ433は、次のリードコマンドを生成する。このとき、スケジューラ433は、L2Pテーブル61を参照して、ネクストコマンドバッファに格納された実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイと、この特定されたフラッシュダイに格納されているこの後続のデータの長さとを特定する。
【0143】
そして、スケジューラ433は、ネクストコマンドバッファに格納された実行対象のリードコマンドをフラッシュダイに送信する処理と、実行対象のリードコマンドに後続する次のリードコマンドを、特定されたフラッシュダイに対応するフォローイングリードキューに格納する処理とを実行する。
【0144】
例えば、フラッシュダイ#0に対応するネクストコマンドバッファ4223-0に格納された実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイがフラッシュダイ#1である場合、スケジューラ433は、フラッシュダイ#0に対応するネクストコマンドバッファ4223-0のステージで、この後続のデータが格納されているフラッシュダイ#1と、フラッシュダイ#1に格納されているこの後続のデータの長さとを特定する。そして、スケジューラ433は、この後続のデータをフラッシュダイ#1から読み出すための次のリードコマンドを生成する。そして、スケジューラ433は、実行対象のリードコマンドをフラッシュダイ#0に送信する処理と、生成した次のリードコマンドをフラッシュダイ#1に対応するフォローイングリードキュー4222-1に格納する処理とを実行する。この場合、実行対象のリードコマンドをフラッシュダイ#0に送信した後に、生成した次のリードコマンドをフラッシュダイ#1に対応するフォローイングリードキュー4222-1に格納してもよい。あるいは、生成した次のリードコマンドをフラッシュダイ#1に対応するフォローイングリードキュー4222-1に格納した後に、実行対象のリードコマンドをフラッシュダイ#0に送信してもよい。生成した次のリードコマンドをフラッシュダイ#1に対応するフォローイングリードキュー4222-1に格納する処理では、例えば、スケジューラ433は、まず、生成した次のリードコマンドをフラッシュダイ#0に対応するネクストコマンドバッファ4223-0内に準備し、そして、生成した次のリードコマンドを、ネクストコマンドバッファ4223-0からフラッシュダイ#1に対応するフォローイングリードキュー4222-1に転送してもよい。
【0145】
フォローイングリードキュー4222-1にリードコマンドが格納されると、スケジューラ433は、フォローイングリードキュー4222-1を選択し、フォローイングリードキュー4222-1に格納されたリードコマンドを、ネクストコマンドバッファ4223-1に実行対象のリードコマンドとして格納する。この場合にも、スケジューラ433は、ネクストコマンドバッファ4223-1に格納された実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定する。
【0146】
ネクストコマンドバッファ4223-1に格納された実行対象のリードコマンドに後続する次のリードコマンドの発行が必要である場合、スケジューラ433は、次のリードコマンドを生成する。このとき、スケジューラ433は、L2Pテーブル61を参照して、ネクストコマンドバッファ4223-1に格納された実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイと、この特定されたフラッシュダイに格納されている後続するデータの長さとを特定する。
【0147】
そして、スケジューラ433は、ネクストコマンドバッファに格納された実行対象のリードコマンドをフラッシュダイ#1に送信する処理と、後続する次のリードコマンドを、特定されたフラッシュダイに対応するフォローイングリードキューに格納する処理とを実行する。
【0148】
例えば、ネクストコマンドバッファ4223-1に格納された実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイがフラッシュダイ#31である場合、スケジューラ433は、フラッシュダイ#1に対応するネクストコマンドバッファ4223-1のステージで、後続するデータが格納されているフラッシュダイ#31と、フラッシュダイ#31に格納されている後続するデータの長さとを特定する。スケジューラ433は、後続するデータをフラッシュダイ#31から読み出すための次のリードコマンドを生成する。そして、スケジューラ433は、実行対象のリードコマンドをフラッシュダイ#1に送信する処理と、生成した次のリードコマンドをフラッシュダイ#31に対応するフォローイングリードキュー4222-31に格納する処理とを実行する。この場合、実行対象のリードコマンドをフラッシュダイ#1に送信した後に、生成した次のリードコマンドをフラッシュダイ#31に対応するフォローイングリードキュー4222-31に格納してもよい。あるいは、生成した次のリードコマンドをフラッシュダイ#31に対応するフォローイングリードキュー4222-31に格納した後に、実行対象のリードコマンドをフラッシュダイ#1に送信してもよい。生成した次のリードコマンドをフラッシュダイ#31に対応するフォローイングリードキュー4222-31に格納する処理では、例えば、スケジューラ433は、まず、生成した次のリードコマンドをフラッシュダイ#1に対応するネクストコマンドバッファ4223-1内に準備し、そして、生成した次のリードコマンドを、ネクストコマンドバッファ4223-1からフラッシュダイ#31に対応するフォローイングリードキュー4222-31に転送してもよい。
【0149】
あるネクストコマンドバッファに格納されたリードコマンドは、このネクストコマンドバッファに対応するフラッシュダイの状態がビジー状態からレディー状態に遷移した後に、このネクストコマンドバッファに対応するフラッシュダイに送信される。フラッシュダイは、受信したリードコマンドに基づいて、メモリセルアレイからページバッファにデータを読み出すセンス動作を実行する。
【0150】
あるフラッシュダイのページバッファに読み出されたデータが、ホストリードコマンドに対応するリード対象データのうちの先頭のデータである場合には、リードデータ転送制御部434は、データがページバッファに読み出されたことに応じて、このデータをリードバッファ423に転送する。また、あるフラッシュダイのページバッファに読み出されたデータが、ホストリードコマンドに対応するリード対象データの先頭のデータ以外のデータである場合には、リードデータ転送制御部434は、このデータよりも前のデータのページバッファへの読み出しが完了した後に、このフラッシュダイのページバッファに読み出されたデータを、リードバッファ423に転送する処理を開始する。
【0151】
そして、リードデータ転送制御部434は、リードバッファ423からデータを読み出し、読み出したデータを、PCIeバスを介してホスト2に転送する。
【0152】
次に、リード処理について説明する。図6は、実施形態に係るメモリシステムにおいて実行されるリード処理の例を示す図である。図6では、ホストリードコマンドによって指定されたリード対象データが3つのフラッシュダイに分散されている場合が例として示されている。
【0153】
ホスト2から受信されたホストリードコマンドは、ホストリードコマンドプール421に格納される。ここで、格納されたホストリードコマンドが、開始LBAとしてLBA0を指定し、データ長(データサイズ)として10を指定する場合を想定する。データ長=1は、リード対象データのサイズが10個のLBAに対応するサイズであることを表している。ページサイズは、例えば、16KiBであり、1つのLBAに対応するサイズは、例えば、4KiBである。各ページは、4つのオフセット0~3に対応する4つの4KiB領域を含む。
【0154】
まず、スケジューラ433は、L2Pテーブル61を参照して、ホストリードコマンドによって指定されたリード対象データのうちの先頭のデータが格納されているフラッシュダイと、このフラッシュダイに格納されている先頭のデータの長さ(サイズ)とを特定する。
【0155】
ここで、図6に示すように、フラッシュダイ#iのブロックBLK0のページP0にLBA0~LBA3に対応する16KiBデータ(D1~D4)が格納され、フラッシュダイ#jのブロックBLK100のページP0にLBA4~LBA7に対応する16KiBデータ(D5~D8)が格納されており、フラッシュダイ#kのブロックBLK200のページP0にLBA8~LBA9に対応する8KiBデータ(D9~D10)が格納されている場合を想定する。
【0156】
この場合、L2Pテーブル61から取得された4つのLBA(LBA0~3)にそれぞれ対応する4つの物理アドレスがフラッシュダイ#iにおける連続する4つの物理アドレスであることから、スケジューラ433は、フラッシュダイ#iを、リード対象データのうちの先頭のデータが格納されているフラッシュダイとして特定する。さらに、スケジューラ433は、4つのLBAに対応する長さ(=16KiB)を、フラッシュダイ#iに格納されている先頭のデータの長さとして特定する。スケジューラ433は、フラッシュダイ#iのブロックBLK0のページP0から16KiBデータ(D1~D3)を読み出すためのリードコマンドCMD0-1を生成し、リードコマンドCMD0-1をフラッシュダイ#iに対応するリーディングリードキュー4221-iに格納する。ここで、フォローイングリードキュー4222-iにリードコマンドが格納されていない場合、スケジューラ433は、リーディングリードキュー4221-iを選択し、リーディングリードキュー4221-iに格納されているリードコマンドCMD0-1を、ネクストコマンドバッファ4223-iに格納する。
【0157】
リードコマンドCMD0-1がネクストコマンドバッファ4223-iに格納されたことに応じて、スケジューラ433は、リードコマンドCMD0-1に後続する次のリードコマンドの発行が必要か否かを判定する。この判定は、例えば、このリードコマンドCMD0-1に付加された付帯情報に基づいて実行されてもよい。
【0158】
リードコマンドCMD0-1は、1つのホストリードコマンドに関連付けられた複数のリードコマンドのうちの先頭のリードコマンドであり、且つ複数のリードコマンドのうちの最後のリードコマンドではない。したがって、スケジューラ433は、リードコマンドCMD0-1に後続する次のリードコマンドの発行が必要であると判定する。
【0159】
次のリードコマンドの発行が必要であると判定したことに応じ、スケジューラ433は、L2Pテーブル61を参照して、先頭のデータに後続する2番目のデータが格納されているフラッシュダイと、このフラッシュダイに格納されている2番目のデータの長さとを特定する。L2Pテーブル61から取得された4つのLBA(LBA4~77)にそれぞれ対応する4つの物理アドレスがフラッシュダイ#jにおける連続する4つの物理アドレスであることから、スケジューラ433は、フラッシュダイ#jを、2番目のデータが格納されているフラッシュダイとして特定する。また、スケジューラ433は、4つのLBAに対応する長さ(=16KiB)を、フラッシュダイ#jに格納されている2番目のデータの長さとして特定する。スケジューラ433は、フラッシュダイ#jのブロックBLK100のページP0から16KiBデータ(D5~D7)を読み出すためのリードコマンドCMD0-2を生成する。
【0160】
そして、スケジューラ433は、リードコマンドCMD0-1をフラッシュダイ#iに送信する処理と、リードコマンドCMD0-2をフラッシュダイ#jに対応するフォローイングリードキュー4222-jに格納する処理と、を実行する。
【0161】
フォローイングリードキュー4222-jにリードコマンドCMD0-2が格納されると、スケジューラ433は、フォローイングリードキュー4222-jをリーディングリードキュー4221-jよりも優先的に選択し、これによってリードコマンドCMD0-2をフラッシュダイ#jに対応するネクストコマンドバッファ4223-jに格納する。
【0162】
リードコマンドCMD0-2がネクストコマンドバッファ4223-jに格納されたことに応じて、スケジューラ433は、リードコマンドCMD0-2に後続する次のリードコマンドの発行が必要か否かを判定する。この判定は、例えば、このリードコマンドCMD0-2に付加された付帯情報に基づいて実行されてもよい。
【0163】
リードコマンドCMD0-2は、1つのホストリードコマンドに関連付けられた複数のリードコマンドのうちの2番目のリードコマンドであり、且つ複数のリードコマンドのうちの最後のリードコマンドではない。したがって、スケジューラ433は、リードコマンドCMD0-2に後続する次のリードコマンドの発行が必要であると判定する。
【0164】
次のリードコマンドの発行が必要であると判定したことに応じ、スケジューラ433は、L2Pテーブル61を参照して、2番目のデータに後続する3番目のデータが格納されているフラッシュダイと、このフラッシュダイに格納されている3番目のデータの長さとを特定する。L2Pテーブル61から取得された2つのLBA(LBA8~9)にそれぞれ対応する2つの物理アドレスがフラッシュダイ#kにおける連続する2つの物理アドレスであることから、スケジューラ433は、フラッシュダイ#kを、3番目のデータが格納されているフラッシュダイとして特定する。また、スケジューラ433は、2つのLBAに対応する長さ(=8KiB)を、フラッシュダイ#kに格納されている3番目のデータの長さとして特定する。スケジューラ433は、フラッシュダイ#kのブロックBLK200のページP0から8KiBデータ(D9~D10)を読み出すためのリードコマンドCMD0-3を生成する。
【0165】
そして、スケジューラ433は、リードコマンドCMD0-2をフラッシュダイ#jに送信する処理と、リードコマンドCMD0-3をフラッシュダイ#kに対応するフォローイングリードキュー4222-kに格納する処理と、を実行する。
【0166】
フォローイングリードキュー4222-kにリードコマンドCMD0-3が格納されると、スケジューラ433は、フォローイングリードキュー4222-kをリーディングリードキュー4221-kよりも優先的に選択し、これによってリードコマンドCMD0-3をフラッシュダイ#kに対応するネクストコマンドバッファ4223-kに格納する。
【0167】
リードコマンドCMD0-3がネクストコマンドバッファ4223-kに格納されたことに応じて、スケジューラ433は、リードコマンドCMD0-3に後続する次のリードコマンドの発行が必要か否かを判定する。この判定は、例えば、このリードコマンドCMD0-3に付加された付帯情報に基づいて実行されてもよい。
【0168】
リードコマンドCMD0-3は、1つのホストリードコマンドに関連付けられた複数のリードコマンドのうちの最後のリードコマンドである。したがって、スケジューラ433は、リードコマンドCMD0-3に後続する次のリードコマンドの発行が必要ないと判定する。
【0169】
スケジューラ433は、リードコマンドCMD0-3をフラッシュダイ#kに送信する処理を実行する。
【0170】
以上の処理により、ホストリードコマンドのリード対象データに対応する3つのリードコマンドCMD-1、CMD-2、およびCMD-3が、CMD-1、CMD-2、およびCMD-3の順序で、フラッシュダイ#i、#j、#kにそれぞれ送信される。
【0171】
次に、PRP/SGLデコードを実行するタイミングについて説明する。図7は、実施形態に係るメモリシステムにおいて実行されるリード処理の手順の例を示す図である。
【0172】
まず、コントローラ4は、コマンドフェッチ処理によって、ホスト2のサブミッションキューSQからホストリードコマンドをフェッチする(ステップS1)。コントローラ4は、S1でフェッチしたホストリードコマンドを、ホストリードコマンドプール421に格納する。
【0173】
コントローラ4は、ホストリードコマンドに関連付けられた先頭のリードコマンド(フラッシュリードコマンド)を生成するために、L2Pテーブル61を参照する(ステップS2)。コントローラ4は、L2Pテーブル61を参照して、ホストリードコマンドによって指定されたリード対象データに含まれる先頭のデータが格納されている記憶位置を示す物理アドレスを取得する。取得した物理アドレスに基づいて、コントローラ4は、先頭のリードコマンドを生成する。この場合、コントローラ4は、ホストリードコマンドによって指定された開始LBAに関連付けられた物理アドレスをL2Pテーブル61から取得し、取得した物理アドレスに基づいて、先頭のデータが格納されているフラッシュダイを特定する。コントローラ4は、特定されたフラッシュダイに対応するフラッシュコマンドキュー422に、生成したリードコマンドを格納する。
【0174】
コントローラ4は、フラッシュコマンドキュー422に格納されたリードコマンドに対応するデータが転送されるべき、ホスト2のホストリードバッファ221上の記憶位置を示すアドレスを算出するために、PRP/SGLデコードを実行する(ステップS3)。
【0175】
生成したリードコマンドに後続する次のリードコマンドの発行が必要な場合、コントローラ4は、ホストリードコマンドに関連付けられた最後のリードコマンドが生成されるまで、ステップS2の処理と、ステップS3の処理を繰り返す。
【0176】
コントローラ4は、生成したリードコマンドを、特定したフラッシュダイに発行する(ステップS4)。リードコマンドを受信したフラッシュダイは、リードコマンドが指定する物理アドレスが示す記憶位置を含むページからページバッファ511にデータを読み出すセンス動作を実行する。
【0177】
ページバッファ511へのデータの読み出しが完了した後、コントローラ4は、特定したフラッシュダイに、リードバッファRBに割り当てる(ステップS5)。特定したフラッシュダイに割り当てられるリードバッファRBは、リードバッファ423内の一つの記憶領域である。
【0178】
コントローラ4は、ページバッファ511に格納されているデータを、S5で割り当てたリードバッファRBに転送する(ステップS6)。
【0179】
そして、コントローラ4は、S3で取得したアドレスに基づいて、リードバッファRBからホストリードバッファ221上の記憶領域にデータを転送する(ステップS7)。S7では、ステップS2で特定された長さを有するデータがリードバッファRBからホストリードバッファ221上の記憶領域に転送される。
【0180】
このように、本実施形態では、ホストリードコマンドに関連付けられた複数のリードコマンドの生成が必要な場合、リード対象の複数のフラッシュダイを特定する処理が一度に実行されるのではなく、リード対象データに含まれる先頭のデータから最後のデータの順序でリード対象の複数のフラッシュダイが順次特定されるように、リード対象の複数のフラッシュダイを特定する処理が、時分割で実行される。
【0181】
さらに、本実施形態では、図7で説明したように、リード対象データに含まれる複数のデータが転送されるべきホスト2のホストリードバッファ221上の複数のアドレスを算出するステップS3の処理も、複数のアドレスを一度に算出するのではなく、時分割で実行される。したがって、複数のアドレスを一度に算出する場合に比べ、同時に記憶しておくことが必要なPRP/SGLデコード結果の量、つまり算出されたアドレスの数を、減らすことができる。これにより、PRP/SGLデコード結果を記憶するためにSSD3に用意することが必要なメモリリソースの量を削減できる。
【0182】
次に、リードバッファ423におけるリードデータの受信順序と、リードバッファ423からホストリードバッファ221へのリードデータの転送順序について説明する。図8は、実施形態に係るメモリシステムに設けられたリードバッファにおけるリードデータの受信順序の例と、リードバッファからホストへのリードデータの転送順序の例とを示すタイミングチャートである。
【0183】
図8の横軸は、時間を示す。図8の上段は、リードバッファ423が受信するデータと、データの受信処理にかかる時間とが示されている。図8の下段は、リードバッファ423からホスト2に転送されているデータと、データの転送処理にかかる時間とが示されている。また、ここでは、PCIeバスの帯域幅(PCIeBW)と1チャンネル当たりの帯域幅(BW/C)との比率が4:1であり、5つのリードバッファRB#1~RB#5がSRAM42上に設けられている場合が示されている5つのリードバッファRB#1~RB#5のうちのいずれか4つのリードバッファは、フラッシュダイから読み出されたリードデータを、チャンネルを介して受信する処理に同時的に使用される。また、5つのリードバッファRB#1~RB#5のうちのいずれか1つのリードバッファは、そのリードバッファに格納されたリードデータを、PCIeバスを介してホスト2に転送するために使用される。
【0184】
まず、時点T1において、リードコマンドCMD0 Part0に対応するリードデータに対する受信処理が開始される。リードコマンドCMD0 Part0に対応するリードデータは、ホストリードコマンドCMD0によって指定されたリード対象データのうちの先頭のデータである。リードコマンドCMD0 Part0に対応するリードデータは、リードコマンドCMD0 Part0が発行されたフラッシュダイのページバッファから読み出される。そして、リードコマンドCMD0 Part0に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#1に転送され、そしてリードバッファRB#1に格納される。リードコマンドCMD0 Part0に対応するリードデータの受信処理は、時点T1から時点T5に渡って実行される。
【0185】
次いで、時点T2において、リードコマンドCMD1 Part0に対応するリードデータに対する受信処理が開始される。リードコマンドCMD1 Part0に対応するリードデータは、ホストリードコマンドCMD1によって指定されたリード対象データのうちの先頭のデータである。リードコマンドCMD1 Part0に対応するリードデータは、リードコマンドCMD1 Part0が発行されたフラッシュダイのページバッファから読み出される。リードコマンドCMD1 Part0に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#2に転送され、そしてリードバッファRB#2に格納される。リードコマンドCMD1 Part0に対応するリードデータの受信処理は、時点T2から時点T6に渡って実行される。
【0186】
次いで、時点T3において、リードコマンドCMD0 Part1に対応するリードデータに対する受信処理が開始される。リードコマンドCMD0 Part1に対応するリードデータは、ホストリードコマンドCMD0によって指定されたリード対象データのうちの2番目のデータである。リードコマンドCMD0 Part1に対応するリードデータは、リードコマンドCMD0 Part1が発行されたフラッシュダイのページバッファから読み出される。リードコマンドCMD0 Part1に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#3に転送され、そしてリードバッファRB#3に格納される。リードコマンドCMD0 Part1に対応するリードデータの受信処理は、時点T3から時点T7に渡って実行される。
【0187】
次いで、時点T4において、リードコマンドCMD0 Part2に対応するリードデータに対する受信処理が開始される。リードコマンドCMD0 Part2に対応するリードデータは、ホストリードコマンドCMD0によって指定されたリード対象データのうちの3番目のデータである。リードコマンドCMD0 Part2に対応するリードデータは、リードコマンドCMD0 Part2が発行されたフラッシュダイのページバッファから読み出される。リードコマンドCMD0 Part2に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#4に転送され、そしてリードバッファRB#4に格納される。リードコマンドCMD0 Part2に対応するリードデータの受信処理は、時点T4から時点T8に渡って実行される。
【0188】
次いで、時点T5において、リードコマンドCMD0 Part0に対応するリードデータの受信処理が完了する。これに応じて、リードバッファRB#1に格納されているリードコマンドCMD0 Part0に対応するリードデータをホスト2に転送する転送処理が開始される。リードコマンドCMD0 Part0に対応するリードデータの転送処理は、受信処理の速度の4倍の速度で、時点T5から時点T6に渡って実行される。
【0189】
また、時点T5では、リードコマンドCMD2 Part0に対応するリードデータに対する受信処理が開始される。リードコマンドCMD2 Part0に対応するリードデータは、ホストリードコマンドCMD2によって指定されたリード対象データのうちの先頭のデータである。リードコマンドCMD2 Part0に対応するリードデータは、リードコマンドCMD2 Part0が発行されたフラッシュダイのページバッファから読み出される。このフラッシュダイは、例えば、リードコマンドCMD0 Part0が発行されたフラッシュダイと同じチャンネルに接続されているフラッシュダイである。リードコマンドCMD2 Part0に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#5に転送され、そしてリードバッファRB#5に格納される。リードコマンドCMD2 Part0に対応するリードデータの受信処理は、時点T5から時点T9に渡って実行される。
【0190】
次いで、時点T6において、リードコマンドCMD1 Part0に対応するリードデータの受信処理が完了し、且つリードコマンドCMD0 Part0に対応するリードデータをホスト2に転送する転送処理も完了する。これに応じて、リードバッファRB#2に格納されているリードコマンドCMD1 Part0に対応するリードデータをホスト2に転送する転送処理が開始される。リードコマンドCMD1 Part0に対応するリードデータの転送処理は、受信処理の速度の4倍の速度で、時点T6から時点T7に渡って実行される。また、時点T6において、リードコマンドCMD0 Part0に対応するリードデータをホスト2に転送する転送処理が完了したため、リードバッファRB#1は、新たなリードデータの受信処理に利用可能となる。
【0191】
そして、時点T6では、リードコマンドCMD0 Part3に対応するリードデータに対する受信処理が開始される。リードコマンドCMD0 Part3に対応するリードデータは、ホストリードコマンドCMD0によって指定されたリード対象データのうちの4番目のデータである。リードコマンドCMD0 Part3に対応するリードデータは、リードコマンドCMD0 Part3が発行されたフラッシュダイのページバッファから読み出される。このフラッシュダイは、例えば、リードコマンドCMD1 Part0が発行されたフラッシュダイと同じチャンネルに接続されているフラッシュダイである。リードコマンドCMD0 Part3に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#1に転送され、そしてリードバッファRB#1に格納される。リードコマンドCMD0 Part3に対応するリードデータの受信処理は、時点T6から時点T10に渡って実行される。
【0192】
次いで、時点T7において、リードコマンドCMD1 Part1に対応する受信処理が完了し、且つリードコマンドCMD1 Part0に対応するリードデータの転送処理も完了する。これに応じ、リードバッファRB#3に格納されているリードコマンドCMD0 Part1に対応するリードデータをホスト2に転送する転送処理が開始される。リードコマンドCMD0 Part1に対応するリードデータの転送処理は、受信処理の速度の4倍の速度で、時刻T7から時刻T8に渡って実行される。また、リードコマンドCMD1 Part0に対応するリードデータの転送処理が完了したため、リードバッファRB#2は、新たなリードデータの受信処理に利用可能となる。
【0193】
そして、時点T7では、リードコマンドCMD2 Part1に対応するリードデータの受信処理が開始される。リードコマンドCMD2 Part1に対応するリードデータは、ホストリードコマンドCMD2によって指定されたリード対象データのうちの2番目のデータである。リードコマンドCMD2 Part1に対応するリードデータは、リードコマンドCMD2 Part1が発行されたフラッシュダイのページバッファから読み出される。このフラッシュダイは、例えば、リードコマンドCMD0 Part1が発行されたフラッシュダイと同じチャンネルに接続されているフラッシュダイである。リードコマンドCMD2 Part1に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#2に転送され、そしてリードバッファRB#2に格納される。リードコマンドCMD2 Part1に対応するリードデータの受信処理は、時点T7から時点T11に渡って実行される。
【0194】
次いで、時点T8において、リードコマンドCMD0 Part2に対応するリードデータの受信処理が完了し、且つリードコマンドCMD0 Part1に対応するリードデータをホスト2に転送する転送処理も完了する。これに応じて、リードバッファRB#4に格納されているリードコマンドCMD0 Part2に対応するリードデータをホスト2に転送する転送処理が開始される。リードコマンドCMD0 Part2に対応するリードデータの転送処理は、受信処理の速度の4倍の速度で、時刻T8から時刻T9に渡って実行される。また、リードコマンドCMD0 Part1に対応するリードデータの転送処理が完了したため、リードバッファRB#3は、新たなリードデータの受信処理に利用可能となる。
【0195】
そして、時間T8では、リードコマンドCMD0 Part4に対応するリードデータに対する受信処理が開始される。リードコマンドCMD0 Part4に対応するリードデータは、ホストリードコマンドCMD0によって指定されたリード対象データのうちの5番目のデータである。リードコマンドCMD0 Part4に対応するリードデータは、リードコマンドCMD0 Part4が発行されたフラッシュダイのページバッファから読み出される。このフラッシュダイは、例えば、リードコマンドCMD0 Part2が発行されたフラッシュダイと同じチャンネルに接続されているフラッシュダイである。リードコマンドCMD0 Part4に対応するリードデータは、1チャンネル当たりの帯域幅(BW/C)に対応する遅い速度でページバッファからリードバッファRB#2に転送され、そしてリードバッファRB#2に格納される。リードコマンドCMD0 Part4のデータの受信処理は、時点T8から時点T12に渡って実行される。
【0196】
次に、リードバッファの各記憶領域に格納されるデータについて説明する。図9は、一周目においてリードバッファに保持されるリードデータの例と二周目においてリードバッファに保持されるリードデータの例とを示す図である。
【0197】
図8の時点T1から時点T6までの間で説明したように、一周目では、リードバッファRB#1にリードコマンドCMD0 Part0に対応するリードデータが格納され、リードバッファRB#2にリードコマンドCMD1 Part0に対応するリードデータが格納され、リードバッファRB#3にリードコマンドCMD0 Part1に対応するリードデータが格納され、リードバッファRB#4にリードコマンドCMD0 Part2に対応するリードデータが格納され、リードバッファRB#5にリードコマンドCMD2 Part0に対応するリードデータが格納される。
【0198】
ついで、一周目に格納されたリードコマンドCMD0 Part0に対応するリードデータをホスト2に転送する転送処理の完了に応じて、二周目のデータとして、リードコマンドCMD0 Part3に対応するデータがリードバッファRB#1に格納される。そして、一周目に格納されたリードコマンドCMD1 Part0に対応するリードデータをホスト2に転送する転送処理の完了に応じて、二周目のデータとして、リードコマンドCMD2 Part1に対応するリードデータがリードバッファRB#2に格納される。一周目に格納されたリードコマンドCMD0 Part1に対応するリードデータをホスト2に転送する転送処理の完了に応じて、二周目のデータとして、リードコマンドCMD0 Part4に対応するリードデータがリードバッファRB#3に格納される。
【0199】
次に、フラッシュメモリのリード処理のタイミングについて説明する。図10は、フラッシュメモリのリードタイミングの例とフラッシュメモリからリードバッファへの転送タイミングの例とを示すタイミングチャートである。
【0200】
図10の横軸は、時間を示す。図10の上段は、フラッシュダイが、各リードコマンドに基づいてリード動作を実行するタイミングを示す。図10の下段は、各リードコマンドに対応するデータが、フラッシュダイからリードバッファ423に転送されるタイミングを示す。
【0201】
PCIeバスの帯域幅(PCIeBW)と1チャンネル当たりの帯域幅(BW/C)との間の比率が4:1である場合、リード処理のスループットを改善するためには、図10の下段に示されるように、4つのリードコマンドに対応するリードデータをフラッシュメモリ5からリードバッファ423に並列に転送することが好ましい。フラッシュダイにおけるリード動作(センス動作)に必要とされる時間tRが、リードバッファ423への転送動作にかかる時間よりも、長い場合には、複数のリードコマンドに基づいたリード動作を並行して実行することで、リード処理のスループットを改善することができる。
【0202】
図10で示されている場合では、最大で7つのリードコマンドに基づいたリード動作が並列に実行されている。
【0203】
次に、リード処理の手順について説明する。図11は、実施形態に係るメモリシステムにおいて実行されるリード処理の手順を示すフローチャートである。
【0204】
まず、コントローラ4は、ホスト2からホストリードコマンドを受信する(ステップS11)。受信されたホストリードコマンドは、ホストリードコマンドプール421に格納される。
【0205】
コントローラ4は、L2Pテーブル61を参照して、S11で受信したホストリードコマンドのリード対象データの先頭のデータが格納されているフラッシュダイと、特定したフラッシュダイに格納されているデータのサイズ(長さ)とを特定する(ステップS12)。
【0206】
コントローラ4は、先頭のデータをリードするためのリードコマンドを生成し、S12で特定したフラッシュダイに対応するリーディングリードキューに、生成したリードコマンドを格納する(ステップS13)。
【0207】
コントローラ4は、S13でリーディングリードキューに格納されたリードコマンドを、S12で特定したフラッシュダイに送信することを決定する(ステップS14)。この場合、フラッシュダイに送信することが決定されたリードコマンドは、実行対象のリードコマンドとしてネクストコマンドバッファに格納される。
【0208】
コントローラ4は、S14でフラッシュダイに送信することが決定されたリードコマンドに対応する先頭のデータに後続するデータの読み出しが必要であるか否か、つまり、実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否か、を判定する(ステップS15)。この判定は、実行対象のリードコマンドがホストリードコマンドに関連付けられた単一のリードコマンドとホストリードコマンドに関連付けられた複数のリードコマンドのうちの最後のリードコマンドとを除く他のリードコマンドであるか否かに基づいて、実行される。
【0209】
後続のデータの読み出しが必要でない場合、つまり次のリードコマンドの発行が必要でない場合(S15でNo)、コントローラ4は、S14で決定されたリードコマンド(実行対象のリードコマンド)をフラッシュダイに送信し(ステップS16)、リード処理を終了する。
【0210】
後続のデータの読み出しが必要な場合、つまり次のリードコマンドの発行が必要である場合(S15でYes)、コントローラ4は、S14で決定されたリードコマンド(実行対象のリードコマンド)がネクストコマンドバッファのステージにて、L2Pテーブル61を参照して、後続のデータが格納されているフラッシュダイと、このフラッシュダイに格納されている後続のデータのサイズ(長さ)とを特定する(ステップS17)。後続のデータは、実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータである。ステップS17では、コントローラ4は、後続のデータをステップS17で特定したフラッシュダイからリードするための次のリードコマンドを生成する。
【0211】
コントローラ4は、ネクストコマンドバッファに格納されているS14で決定されたリードコマンド(実行対象のリードコマンド)をS12で特定したフラッシュダイに送信する処理と、生成した次のリードコマンドを、S17で特定したフラッシュダイに対応するフォローイングリードキューに格納する処理とを実行する(ステップS18)。
【0212】
コントローラ4は、S17で特定したフラッシュダイに対応するフォローイングリードキューを、S17で特定したフラッシュダイに対応するリーディングリードキューよりも優先して選択する。このため、コントローラ4は、S18でフォローイングリードキューに格納された次のリードコマンドを、S17で特定したフラッシュダイに送信することを決定する(ステップS19)。フラッシュダイに送信することを決定されたリードコマンドは、S17で特定したフラッシュダイに対応するネクストコマンドバッファに実行対象のリードコマンドとして格納される。
【0213】
コントローラ4は、S19で送信することを決定されたリードコマンドに対応するデータに後続するデータの読み出しが必要であるか否か、つまり、S17で特定したフラッシュダイに対応するネクストコマンドバッファに格納された実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否か、を判定する(ステップS20)。
【0214】
後続のデータの読み出しが必要でない場合、つまり次のリードコマンドの発行が必要でない場合(ステップS20でNo)、コントローラ4は、S19で決定されたリードコマンド(実行対象のリードコマンド)をS17で特定したフラッシュダイに送信し(ステップS21)、リード処理を終了する。
【0215】
後続のデータの読み出しが必要な場合、つまり次のリードコマンドの発行が必要である場合(S20でYes)、コントローラ4は、S17以降の処理を再度実行する。このとき、先の説明における「S14で決定されたリードコマンド」は、「S19で決定されたリードコマンド」に相当する。
【0216】
このように、あるリードコマンドがあるフラッシュダイ#mに対応するネクストコマンドバッファに実行対象のリードコマンドとして格納された場合、コントローラ4は、実行対象のリードコマンドに後続する次のリードコマンドの発行が必要か否かを判定する。そして、次のリードコマンドの発行が必要と判定したことに応じ、コントローラ4は、実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイ#nと、このフラッシュダイ#nに格納されている後続のデータの長さと、を特定する。そして、コントローラ4は、後続のデータを読み出すための次のリードコマンドを生成し、実行対象のリードコマンドをフラッシュダイ#mに送信する処理と、生成した次のリードコマンドをフラッシュダイ#nに対応するフォローイングリードキューに格納する処理とを実行する。
【0217】
次に、不揮発性メモリの読み出し完了時に実行される処理について説明する。図12は、実施形態に係るメモリシステムにおいて、不揮発性メモリの読み出し完了時に実行される処理の手順を示すフローチャートである。
【0218】
まず、あるフラッシュダイのページバッファ511へのデータの読み出しが完了したことに応じて(開始)、コントローラ4は、ページバッファ511に読み出されたデータが、次の読み出し順序に対応するデータであるか否かを判定する(ステップS31)。例えば、あるホストリードコマンドによって指定されるリード対象データの先頭データを読み出すための1番目のリードコマンドと、先頭データに後続するデータを読み出すための2番目のリードコマンドとが、1番目のリードコマンド、2番目のリードコマンドという順序で異なるフラッシュダイにそれぞれ送信された場合を想定する。この場合、1番目のリードコマンドに対応するデータのページバッファ511への読み出しが完了していなければ、次の読み出し順序に対応するデータは、1番目のリードコマンドに対応するデータである。1番目のリードコマンドに対応するデータのページバッファ511への読み出しが既に完了していれば、次の読み出し順序に対応するデータは、2番目のリードコマンドに対応するデータである。
【0219】
ページバッファ511に読み出されたデータが、次の読み出し順序に対応するデータでない場合(S31でNo)、ページバッファ511に読み出されたデータは、読み出し可能条件を満たしていない。このため、コントローラ4は、ページバッファ511にデータを維持し(ステップS32)、この処理を終了する。つまり、コントローラ4は、ページバッファ511からデータを読み出さずに、この処理を終了する。
【0220】
ページバッファ511に読み出されたデータが、次の読み出し順序に対応するデータである場合(S31でYes)、ページバッファ511に読み出されたデータは、読み出し可能条件を満たしている。このため、コントローラ4は、このフラッシュダイにリードバッファ(リードバッファ423内の1つの記憶領域)を割り当てる(ステップS33)。
【0221】
コントローラ4は、ページバッファ511からデータを読み出し、読み出したデータを、S33で割り当てられたリードバッファに転送する(ステップS34)。次の読み出し順序に対応するデータは、S34でリードバッファに転送されたデータに後続する次のデータに変更される。
【0222】
コントローラ4は、あるフラッシュダイにおいて後続のデータのページバッファ511への読み出しが完了しているか否かを判定する(ステップS35)。
【0223】
後続のデータのページバッファ511への読み出しが完了している場合(S35でYes)、コントローラ4は、S31以降の処理を再度実行する。
【0224】
後続のデータのページバッファ511への読み出しが完了していない場合(S35でNo)、コントローラ4は、この処理を終了する。
【0225】
次に、リードバッファへのデータ転送完了時に実行される処理について説明する。図13は、実施形態に係るメモリシステムにおいて、リードバッファへのデータ転送完了時に実行される処理の手順を示すフローチャートである。
【0226】
あるリードバッファへのデータの転送が完了したことに応じて(開始)、コントローラ4は、このリードバッファにデータ転送の完了をマークする(ステップS41)。
【0227】
コントローラ4は、他のデータをホスト2に転送中であるか否かを判定する(ステップS42)。
【0228】
他のデータをホスト2に転送中でない場合(S42でNo)、コントローラ4は、リードバッファへの転送が完了したデータをホスト2のメモリ22に転送する処理を開始する(ステップS43)。
【0229】
他のデータをホスト2に転送中である場合(S42でYes)、コントローラ4は、S43の手順をスキップする。
【0230】
そして、コントローラ4は、あるフラッシュダイにおいてページバッファに維持されているデータ(図12のS32でページバッファに維持されたデータ)を、このフラッシュダイに割り当てられたリードバッファに転送し(ステップS44)、この処理を終了する。ステップS44が実行される時点では、図12のS32でページバッファに維持されたデータは、読み出し可能条件を満たしているためである。つまり、あるフラッシュダイのページバッファへの読み出しが完了したデータが次の読み出し順序に対応するデータではない場合、コントローラ4は、このデータをこのフラッシュダイのページバッファから読み出さずに、他のデータの読み出しが完了してこのデータの読み出し可能条件が満されるまで待つ。そして、このデータの読み出し可能条件が満された後、コントローラ4は、このフラッシュダイにリードバッファを割り当て、このフラッシュダイのページバッファに格納されているデータをリードバッファに転送する。
【0231】
次に、ホストへのデータ転送完了時に実行される処理について説明する。図14は、実施形態に係るメモリシステムにおいて、ホストへのデータ転送完了時に実行される処理の手順を示すフローチャートである。
【0232】
リードバッファからホスト2のメモリ22へのデータの転送が完了したことに応じて(開始)、コントローラ4は、ホスト2のメモリ22に転送されたデータが格納されていたリードバッファ(リードバッファ423内の1つの記憶領域)を解放する(ステップS51)。解放されたリードバッファは、新たなデータの格納に利用可能となる。
【0233】
コントローラ4は、ホスト2への未転送データ無しであるか否かを判定する(ステップS52)。ホスト2への未転送データ無しである場合、ホスト2へまだ転送されていないデータは、リードバッファ423に残っていない。
【0234】
このため、ホスト2への未転送データが無い場合(S52でYes)、コントローラ4は、この処理を終了する。
【0235】
ホスト2への未転送データがある場合(S52でNo)、コントローラ4は、未転送データをホスト2に転送し(ステップS53)、この処理を終了する。
【0236】
以上説明したように、実施形態によれば、コントローラ4は、ホストリードコマンドによって指定されるリード対象データが複数のフラッシュダイに分散されている場合、リード対象データの先頭のデータから最後のデータにそれぞれ対応する複数のリードコマンドを、これら複数のリードコマンドのうちの先頭のリードコマンドから最後のリードコマンドの順序で、異なる複数のダイに送信することが可能となる。この結果、リード対象データをそのリード対象データに含まれる先頭のデータから最後のデータの順序で、フラッシュメモリ5から読み出すことが可能となる。よって、大容量のリードバッファを設けることなく、ホストリードコマンドによって指定されるリード対象データを、そのリード対象データに含まれる先頭のデータから最後のデータの順序で、ホスト2に転送することができる。
【0237】
また、あるフラッシュダイ(例えばフラッシュダイ#m)に対応するネクストコマンドバッファに実行対象のリードコマンドが格納されたことに応じ、つまり、あるリードコマンドをフラッシュダイ#mに対応するコマンドバッファを介してフラッシュダイ#mに送信することを決定したことに応じ、コントローラ4は、実行対象のリードコマンドによって読み出しが要求されるデータに後続するデータが格納されているフラッシュダイと、このフラッシュダイに格納されている後続のデータの長さと、を特定する。これにより、実行対象のリードコマンドに先行するリードコマンドに対応する読み出し動作がフラッシュダイ#mにおいて実行されている間に、後続のデータが格納されているフラッシュダイと、後続のデータの長さと、を特定する処理を実行することが可能となる。
【0238】
また、各フラッシュダイからリードバッファ423に転送されるデータの順序が制御されるため、リードバッファ423上でホスト2に転送される順序に並べ替える必要が無い。そのため、並べ替えに必要とされる時間、およびリードバッファ423のリソースを削減することができる。
【0239】
よって、コントローラ4は、効率的にフラッシュダイからデータを読み出すことができる。
【0240】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0241】
1…情報処理システム、2…ホスト、3…SSD、4…コントローラ、5…NAND型フラッシュメモリ、6…DRAM、7…バス、20…内部バス、21…プロセッサ、22…メモリ、40…内部バス、41…ホストインタフェース、42…SRAM、43…CPU、44…DMAC、45…誤り訂正回路、46…NANDインタフェース、47…DRAMインタフェース、61…L2Pテーブル、431…ライト処理部、432…リード処理部、433…スケジューラ、434…リードデータ転送制御部。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14