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

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

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

(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024179958
(43)【公開日】2024-12-26
(54)【発明の名称】メモリシステム
(51)【国際特許分類】
   G06F 12/06 20060101AFI20241219BHJP
   G06F 12/00 20060101ALI20241219BHJP
【FI】
G06F12/06 550A
G06F12/00 560B
【審査請求】未請求
【請求項の数】14
【出願形態】OL
(21)【出願番号】P 2023099308
(22)【出願日】2023-06-16
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】永井 宏一
【テーマコード(参考)】
5B160
【Fターム(参考)】
5B160AA14
5B160CD06
(57)【要約】
【課題】受信した大量のコマンドに対して効率的にタイムアウト処理を実行することができるメモリシステムを実現する。
【解決手段】メモリシステムのコントローラは、コマンドが次に格納されるスロットを示すポインタと、前記ポインタが現在の値よりも小さい値に更新されたことに応じて更新されるサイクルカウンタとを含む拡張ポインタを管理する。前記コントローラは、前記第1時間が経過する度に、終端の時刻が、現在の時刻から特定の時間前の時刻と一致する、第1時間範囲を特定し、前記複数のエントリのうち、前記第1時間範囲に対応する第1エントリに格納されている拡張ポインタを取得する。前記コントローラは、前記第1拡張ポインタを用いて、前記第1時間範囲に前記第1キューに格納された一つ以上のコマンドを特定する。前記コントローラは、前記特定された一つ以上のコマンドをアボートする。
【選択図】図17
【特許請求の範囲】
【請求項1】
メモリと、
前記メモリを制御するコントローラと、を具備し、外部のホストと接続可能な
メモリシステムであって、
前記コントローラは、
前記ホストから受信するコマンドをそれぞれに格納可能な複数のスロットを含む第1キューを介して前記受信したコマンドに応じた処理を実行可能であり、
前記複数のスロットのうちのコマンドが次に格納されるスロットを示すポインタと、前記ポインタが現在の値よりも小さい値に更新されたことに応じて更新されるサイクルカウンタとを含む拡張ポインタを管理し、
それぞれが、第1時間を単位とする連続した複数の時間範囲のうちの一つの時間範囲に対応する、複数のエントリを含む第1テーブルを管理し、
前記第1時間が経過する度に、前記複数のエントリのうちの一つのエントリを選択し、
前記選択された一つのエントリに、現在の、前記複数のスロットのうちのコマンドが次に格納されるスロットを示すポインタと、サイクルカウンタと、を含む拡張ポインタを格納し、
前記第1時間が経過する度に、終端の時刻が、現在の時刻から特定の時間前の時刻と一致する、第1時間範囲を特定し、
前記複数のエントリのうち、前記第1時間範囲に対応する第1エントリに格納されている第1拡張ポインタを取得し、
前記第1拡張ポインタを用いて、前記第1時間範囲に前記第1キューに格納された一つ以上のコマンドを特定し、
前記特定された一つ以上のコマンドをアボートする、ように構成された
メモリシステム。
【請求項2】
前記コントローラは、
前記第1時間範囲より一つ前の第2時間範囲をさらに特定し、
前記複数のエントリのうち、前記第2時間範囲に対応する第2エントリに格納されている第2拡張ポインタを取得し、
前記第1拡張ポインタと、前記第2拡張ポインタが同じである場合、前記第1時間範囲に前記第1キューに格納された一つ以上のコマンドを特定して、前記特定された一つ以上のコマンドをアボートする処理を含む、タイムアウト処理をスキップし、
前記第1拡張ポインタと、前記第2拡張ポインタが異なる場合、前記第1拡張ポインタと、前記第2拡張ポインタとを用いて、前記タイムアウト処理を実行する、ように構成された
請求項1に記載のメモリシステム。
【請求項3】
前記コントローラは、
前記第1キューから第1コマンドをフェッチする際、
前記第1コマンドの内容と、前記第1コマンドに対応する拡張ポインタとを、第2テーブルの複数のエントリのうちの一つのエントリに格納し、前記拡張ポインタは、前記第1コマンドがフェッチされるときのサイクルカウンタと、前記第1コマンドが格納されていた前記第1キューのスロットを示す前記ポインタとを含み、
前記第1時間が経過する度に、
前記第2テーブルの複数のエントリのうち、前記第2時間範囲に対応する前記第2拡張ポインタ以上であり、且つ前記第1時間範囲に対応する前記第1拡張ポインタよりも一つ前の前記第1キューのスロットを示す第3拡張ポインタ以下である拡張ポインタが格納されている一つ以上のエントリが存在するか否かを判定し、
前記一つ以上のエントリに対応する一つ以上のコマンドをアボートする、ように構成された
請求項2に記載のメモリシステム。
【請求項4】
前記コントローラは、
前記第1キューから第1コマンドをフェッチする際、
前記第1コマンドの内容と、前記第1コマンドが前記第1キューに格納された時刻が含まれる前記時間範囲を示す情報とを、第2テーブルの複数のエントリのうちの一つのエントリに格納し、
前記第1時間が経過する度に、
前記第2テーブルの複数のエントリのうち、前記第1時間範囲を示す情報が格納されている一つ以上のエントリが存在するか否かを判定し、
前記一つ以上のエントリに対応する一つ以上のコマンドをアボートする、ように構成された
請求項2に記載のメモリシステム。
【請求項5】
前記コントローラは、
前記特定された一つ以上のコマンドのうちの、一つ以上の第2コマンドが前記第1キューに格納され、且つ処理が完了していない場合、
前記第2コマンドの処理を中断し、
前記第2コマンドの処理が失敗したことを示す第1完了応答を前記ホストに送信し、
前記第2テーブルの複数のエントリのうち、前記第2コマンドに対応するエントリを無効化し、
前記特定された一つ以上のコマンドのうちの、一つ以上の第3コマンドが前記第1キューに格納されている場合、
前記第3コマンドをフェッチし、
前記第3コマンドの処理を実行せずに、前記第3コマンドの処理が失敗したことを示す第2完了応答を前記ホストに送信する、ように構成された
請求項3または4に記載のメモリシステム。
【請求項6】
前記コントローラは、
前記複数のスロットのうちのコマンドが次に格納されるスロットを示す前記ポインタが、更新前のポインタの値よりも小さい値に更新されたこととき、
前記サイクルカウンタの値が上限値であるか否かを判定し、
前記サイクルカウンタの値が上限値ではない場合、前記サイクルカウンタを1だけインクリメントし、
前記サイクルカウンタの値が上限値である場合、前記サイクルカウンタを初期値に更新する、ように構成された
請求項1に記載のメモリシステム。
【請求項7】
前記サイクルカウンタの上限値は、前記複数のスロットの個数、前記特定の時間、および前記コントローラが前記特定の時間が経過する間に処理することができる前記コマンドの個数のうちの少なくとも一つに基づいて決定される、
請求項6に記載のメモリシステム。
【請求項8】
前記コントローラは、
前記フェッチされた第1コマンドの処理が完了したことに応じて、
前記第2テーブルの複数のエントリのうち、前記第1コマンドに対応するエントリを無効化する、ように構成された
請求項3または請求項4に記載のメモリシステム。
【請求項9】
前記第1キューまたは第2キューを介して、前記ホストからコマンドを受信する前記コントローラであって、
前記第1キューに対応する前記第1時間と、前記第2キューに対応する第2時間とを管理し、
前記第1時間が経過する度に、前記第1キューを介して受信したコマンドに対するタイムアウト処理を実行し、
前記第2時間が経過する度に、前記第2キューを介して受信したコマンドに対する前記タイムアウト処理を実行する、ように構成された
請求項2に記載のメモリシステム。
【請求項10】
前記コントローラは、
前記第1時間を起算した時刻から、第3時間の整数倍の時間が経過した後に、前記第2時間を起算し、
前記第1時間、および前記第2時間は、それぞれ前記第3時間の整数倍である、
請求項9に記載のメモリシステム。
【請求項11】
前記特定の時間は、前記第1時間の整数倍である、
請求項1に記載のメモリシステム。
【請求項12】
前記第1テーブルは、
前記特定の時間を前記第1時間で除した数に1を加えた数のエントリを少なくとも有する、
請求項11に記載のメモリシステム。
【請求項13】
前記メモリシステムは、
揮発性メモリをさらに具備し、
前記第1テーブルは、
前記特定の時間を前記第1時間で除した数に1を加えた数のエントリを有し、
前記コントローラは、
前記第1時間が経過する度に、
前記第1テーブルに空きのエントリが無い場合、前記第1テーブルの複数のエントリのうちの、前記第1時間範囲より一つ前の時間範囲に対応する第2エントリに格納されている第4拡張ポインタを、前記揮発性メモリに退避し、
現在の拡張ポインタの値を、前記第1テーブルの複数のエントリのうちの最も古い時間範囲に対応するエントリに上書きする、ように構成された
請求項11に記載のメモリシステム。
【請求項14】
前記コントローラは、
前記第1時間が経過する毎に、
前記退避された第4拡張ポインタと、前記第1時間範囲に対応する前記第1エントリに格納されている第5拡張ポインタとを用いて、前記第1時間範囲に前記第1キューに格納された一つ以上のコマンドを特定する、ように構成された
請求項13に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを備えるメモリシステムに関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの1つとして、例えば、NAND型フラッシュメモリ等の不揮発性メモリと、この不揮発性メモリを制御するコントローラとを備えるソリッドステートドライブ(SSD)が知られている。
【0003】
メモリシステムのコントローラは、外部のホストから発行され、受信したコマンドに基づいて、メモリシステムを制御する。メモリシステムは、発行されてからの経過時間が所定時間を上回ったコマンドをアボートするタイムアウト処理を実行する。
【0004】
大量のコマンドを受信することのできるメモリシステムにおいては、このようなタイムアウト処理を効率的に実行することができる技術が必要とされている。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】米国特許第10,860,511号明細書
【特許文献2】米国特許出願公開第2022/0113909号明細書
【特許文献3】米国特許出願公開第2022/0350536号明細書
【発明の概要】
【発明が解決しようとする課題】
【0006】
本発明の一実施形態が解決しようとする課題は、受信した大量のコマンドに対して効率的にタイムアウト処理を実行することができるメモリシステムを提供することである。
【課題を解決するための手段】
【0007】
実施形態によれば、メモリシステムは、メモリと、コントローラと、を具備する。前記コントローラは、前記メモリを制御する。前記メモリシステムは、外部のホストと接続可能である。前記コントローラは、前記ホストから受信するコマンドをそれぞれに格納可能なスロットを複数含む第1キューを介して前記受信したコマンドに応じた処理を実行可能である。前記コントローラは、前記複数のスロットのうちのコマンドが次に格納されるスロットを示すポインタと、前記ポインタが現在の値よりも小さい値に更新されたことに応じて更新されるサイクルカウンタとを含む拡張ポインタを管理する。前記コントローラは、それぞれが、第1時間を単位とする連続した複数の時間範囲のうちの一つの時間範囲に対応する、複数のエントリを含む第1テーブルを管理する。前記コントローラは、前記第1時間が経過する度に、前記複数のエントリのうちの一つのエントリを選択する。前記コントローラは、前記選択された一つのエントリに、現在の、前記複数のスロットのうちのコマンドが次に格納されるスロットを示すポインタと、サイクルカウンタと、を含む拡張ポインタを格納する。前記コントローラは、前記第1時間が経過する度に、終端の時刻が、現在の時刻から特定の時間前の時刻と一致する、第1時間範囲を特定する。前記コントローラは、前記複数のエントリのうち、前記第1時間範囲に対応する第1エントリに格納されている拡張ポインタを取得する。前記コントローラは、前記第1拡張ポインタを用いて、前記第1時間範囲に前記第1キューに格納された一つ以上のコマンドを特定する。前記コントローラは、前記特定された一つ以上のコマンドをアボートする。
【図面の簡単な説明】
【0008】
図1】実施形態に係るメモリシステムを含む情報処理システムの構成例を示すブロック図。
図2】実施形態に係るメモリシステムを含む情報処理システムにおいて使用される、サブミッションキューの複数の状態の例を示す図。
図3】実施形態に係るメモリシステムを含む情報処理システムにおいて実行される、コマンド処理の流れを示す図。
図4】実施形態に係るメモリシステムにおいて使用されるタイムスロットの例を示す図。
図5】実施形態に係るメモリシステムにおいて使用される拡張ポインタの例を示す図。
図6】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューの第1の状態の例を示す図。
図7】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューの第2の状態の例を示す図。
図8】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューの第3の状態の例を示す図。
図9】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューの第4の状態の例を示す図。
図10】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューにおける拡張ポインタを比較する第1の例を示す図。
図11】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューにおける拡張ポインタを比較する第2の例を示す図。
図12】実施形態に係るメモリシステムにおいて使用されるフェッチコマンド管理テーブルの構成例を示す図。
図13】実施形態に係るメモリシステムにおいて使用されるタイムスロット管理テーブルの構成例を示す図。
図14】実施形態に係るメモリシステムにおいて複数の拡張ポインタが格納されているタイムスロット管理テーブルの第1の状態の例を示す図。
図15】実施形態に係るメモリシステムにおいて複数の拡張ポインタが格納されているタイムスロット管理テーブルの第2の状態の例を示す図。
図16】実施形態に係るメモリシステムにおいて使用されるフェッチコマンド管理テーブルの変形例を示す図。
図17】実施形態に係るメモリシステムにおいて管理される仮想的なサブミッションキューと、複数のタイムスロットとの間の関係の例を示す図。
図18】実施形態に係るメモリシステムにおける、発行済みのコマンドの管理の例を示す図。
図19】実施形態に係るメモリシステムにおける、タイムアウト処理のタイミングの例を示す図。
図20】実施形態に係るメモリシステムとホストとにおいて実行される、コマンド処理の手順の例を示すシーケンス図。
図21】実施形態に係るメモリシステムにおいて実行されるサブミッションキュー拡張テールポインタの更新処理の手順の例を示すフローチャート。
図22】実施形態に係るメモリシステムにおいて実行されるサブミッションキュー拡張テールポインタを記録する処理の手順の例を示すフローチャート。
図23】実施形態に係るメモリシステムにおいて実行されるタイムアウト処理の手順の第1の例を示すフローチャート。
図24】実施形態に係るメモリシステムにおいて実行されるタイムアウト処理の手順の第2の例を示すフローチャート。
【発明を実施するための形態】
【0009】
以下、図面を参照して、実施形態を説明する。
【0010】
図1は、実施形態に係るメモリシステムを含む情報処理システム1の構成例を示すブロック図である。情報処理システム1は、ホスト(ホストデバイス)2と、メモリシステム3とを含む。
【0011】
ホスト2は、情報処理装置である。ホスト2は、例えば、パーソナルコンピュータ、サーバコンピュータ、またはモバイルデバイスである。ホスト2は、メモリシステム3にアクセスする。具体的には、ホスト2は、データを書き込むためのコマンドであるライトコマンドをメモリシステム3に発行する。また、ホスト2は、データを読み出すためのコマンドであるリードコマンドをメモリシステム3に発行する。またさらに、ホスト2は、メモリシステム3を管理するためのコマンドであるアドミンコマンドをメモリシステム3に発行する。また、ホスト2は、メモリシステム3にアクセスするときに、他の種類のコマンドをメモリシステム3に発行してもよい。
【0012】
メモリシステム3は、ホスト2に接続可能なストレージデバイスである。メモリシステム3は、例えば、ソリッドステートドライブ(SSD)として実現される。メモリシステム3は、不揮発性メモリを含む。メモリシステム3は、内部の不揮発性メモリにデータを書き込むことが可能である。また、メモリシステム3は、内部の不揮発性メモリからデータを読み出すことが可能である。
【0013】
メモリシステム3とホスト2との間の通信は、バス10を介して実行される。バス10は、ホスト2とメモリシステム3とを接続する伝送路である。バス10は、例えば、PCI express(登録商標)(PCIe(登録商標))バスである。このバスを介してホスト2はメモリシステム3のRAM411を読み書きでき、メモリシステム3はホスト2のRAM22を読み書きできる。
【0014】
ホスト2とメモリシステム3とを接続するための論理インターフェースの規格としては、例えば、NVM expressTM(NVMeTM)規格が使用され得る。NVMe規格のインターフェースでは、少なくとも1つのサブミッションキュー(SQ)と、この少なくとも1つのサブミッションキュー(SQ)に関連付けられたコンプリーションキュー(CQ)とを含む対のキューを用いて、ホスト2とメモリシステム3との間の通信が行われる。この対のキューは、サブミッションキュー/コンプリーションキューペア(SQ/CQペア)と称される。また、複数のサブミッションキューに対して一つのコンプリーションキューが対応していてもよい。
【0015】
次に、ホスト2の構成について説明する。
【0016】
ホスト2は、CPU21と、RAM22と、メモリインターフェース(メモリI/F)23とを含む。CPU21、RAM22、およびメモリI/F23は、内部バス20を介して相互接続される。尚、メモリインターフェース(メモリI/F)23は、ルートポート(root port)とも呼ばれる場合がある。
【0017】
CPU21は、例えば、プロセッサである。CPU21は、メモリシステム3、または、ホスト2に接続された他のストレージデバイスからRAM22にロードされるソフトウェア(ホストソフトウェア)を実行する。ホストソフトウェアは、例えば、オペレーティングシステム、ファイルシステム、アプリケーションプログラム、を含む。
【0018】
RAM22は、例えば揮発性のメモリである。RAM22は、メインメモリ、システムメモリ、またはホストメモリとも称される。RAM22は、例えばダイナミックランダムアクセスメモリ(DRAM)である。RAM22の記憶領域の一部は、サブミッションキュー(SQ)221-0、…、221-v、およびコンプリーションキュー(CQ)222-0、…、222-wを格納するために使用される。また、RAM22の記憶領域の他の一部は、サブミッションキューホストヘッドポインタ(SQHHP)223-0、…、223-v、サブミッションキューホストテールポインタ(SQHTP)224-0、…、224-v、およびコンプリーションキューホストヘッドポインタ(CQHHP)225-0、…、225-wを格納するために使用される。
【0019】
サブミッションキュー221-0、…、221-vのそれぞれは、ホスト2がメモリシステム3に対して発行するコマンドを格納するためのキューである。つまり、サブミッションキュー221-0、…、221-vの各々は、メモリシステム3にコマンド(入出力(I/O)コマンド、アドミンコマンド)を発行するために、ホスト2によって使用されるキューである。I/Oコマンドは、メモリシステム3の不揮発性メモリへのデータの書き込み、または不揮発性メモリからのデータの読み出しを実行するためのコマンドである。サブミッションキュー221-0、…、221-vの各々は、複数のスロットを含む。複数のスロットは、それぞれ一つのコマンドを格納可能である。またコマンドとともに、サブミッションキューを特定するサブミッションキューIDと合わせることで、発行したコマンドをホスト2が特定できるCommand Identifier(CID)も格納可能である。ホスト2は、サブミッションキューをホスト2のRAM22に作成する。また、ホスト2は、サブミッションキュークリエイトコマンドをメモリシステム3に発行する。サブミッションキューの各々が作成されたRAM22内の記憶位置を示すサブミッションキュー(SQ)ベースアドレス、作成されたサブミッションキューの各々のサイズ、これらサブミッションキューに関連付けられた、即ちこのサブミッションキューを使って発行されたコマンドの完了通知が書きこまれるコンプリーションキューの識別子(コンプリーションキューID)、等は、サブミッションキュークリエイトコマンドによってメモリシステム3に通知される。SQベースアドレスは、例えば、対応するサブミッションキューに含まれる複数のスロットのうちの先頭のスロットに対応する、RAM22上の記憶位置を示すアドレスである。サブミッションキューのサイズは、例えば、対応するサブミッションキューに含まれる複数のスロットの個数である。ホスト2は、SQHHP223-0、…、223-v、およびSQHTP224-0、…、224-vを使用して、サブミッションキュー221-0、…、221-vを管理する。例えば、サブミッションキュー221-nは、SQHHP223-nおよびSQHTP224-nに対応する(ここで、nは、0からvまでの任意の整数)。SQHHP223-nは、初期値はキューの先頭を示すが、その後はメモリシステム3がホスト2に通知したスロットを指す最新ポインタであり、そのポインタは最新のフェッチ済みコマンドが格納されている次のスロットを示す。SQHTP224-nは、サブミッションキュー221-nの複数のスロットのうちの新しいコマンドが次に格納される空きスロットを示す。以降では、I/Oコマンドを発行するために使用されるサブミッションキューを用いて、ホスト2がメモリシステム3にI/Oコマンドを発行する場合について説明する。以降で記載される「コマンド」は、例えば、I/Oコマンドである。ただし、本実施形態において、I/Oコマンドの代わりに、アドミンコマンド、あるいは他の種類のコマンドが、ホスト2からメモリシステム3に、発行された場合であっても同様の処理が実行され得る。
【0020】
コンプリーションキュー222-0、…、222-wは、コマンドの処理の結果を示す完了応答を格納するためのキューである。つまり、コンプリーションキュー222-0、…、222-wは、メモリシステム3から完了応答を受信するために使用される。完了応答は、対応するコマンドが発行されたサブミッションキューのIDとそのコマンドのCID、コマンドの処理が成功したこと、あるいは処理が失敗したことを示すステータスを含む。完了応答は、コマンド完了、コマンド完了通知、またはコマンドコンプリーションとも称される。コンプリーションキュー222-0、…、222-wのそれぞれは、複数のスロットを含む。複数のスロットの各々は、一つの完了応答を格納可能である。ホスト2は、コンプリーションキューをホスト2のRAM22に作成する。また、ホスト2は、コンプリーションキュークリエイトコマンドをメモリシステム3に発行する。コンプリーションキューが作成されたRAM22内の記憶位置を示すコンプリーションキュー(CQ)ベースアドレス、およびこのコンプリーションキューのサイズ、等は、コンプリーションキュークリエイトコマンドによってメモリシステム3に通知される。CQベースアドレスは、対応するコンプリーションキューに含まれる複数のスロットのうちの先頭のスロットに対応する、RAM22上の記憶位置を示すアドレスである。コンプリーションキューのサイズは、コンプリーションキューに含まれる複数のスロットの個数である。ホスト2は、CQHHP225-0、…、225-wを使用して、コンプリーションキュー222-0、…、222-wを管理する。例えば、コンプリーションキュー222-mは、CQHHP225-mに対応する(ここで、mは、0からwまでの任意の整数)。CQHHP225-mは、コンプリーションキュー222-mの複数のスロットのうち次に処理されるべき完了応答が格納されているスロットを示すポインタである。また、ホスト2は直接的にはコンプリーションキューTail Pointerをメモリシステム3から受け取らない。代わりに、コンプリーションキューの各スロットにはPhase Tag Bitというフィールドがあり、メモリシステム3はスロットを上書きする度に、このBitの値を上書き前の値から反転させる。例えば初期状態ではゼロとすると、コンプリーションキューに完了情報を書くときにこのBitを1とする。ホスト2は各スロットのこのBitの値を順に読み、このBitが0に変わったスロットが、そのコンプリーションキューのTail Pointerの示すスロットであると判別できる。メモリシステム3がコンプリーションキューの最後のスロットまで書くと、次はキューの先頭のスロットに書きこむが、今度はPhase Tag Bitは0に設定される。ホスト2も、コンプリーションキューの最後まで完了処理を終えた後、読み出し先がキューの先頭に移るが、今度はこのBitの値が1に変わるスロットが、そのコンプリーションキューのTail Pointerの示すスロットであると判別する。
【0021】
つまりメモリシステム3は書き込み先がコンプリーションキューの先頭に移る度に、書きこむべきPhase Tag Bitの値を反転させる。ホスト2も読み出し先がコンプリーションキューの先頭に移る度に、比較すべきPhase Tag Bitの値を反転させる。
【0022】
メモリインターフェース23は、メモリシステム3との通信を実行する通信インターフェース回路である。メモリインターフェース23は、例えば、PCIeコントローラによって実現される。
【0023】
次に、メモリシステム3の内部構成について説明する。以下では、メモリシステム3に含まれる不揮発性メモリがNAND型フラッシュメモリによって実現されている場合を想定する。尚、NAND型フラッシュメモリは他のフラッシュメモリや、MRAM、ReRAM、FeRAM、相変化メモリ等の他の不揮発性メモリであってもよい。
【0024】
メモリシステム3は、コントローラ4と、不揮発性メモリ5と、を含む。
【0025】
コントローラ4は、メモリコントローラである。コントローラ4は、例えば、System-on-a-Chip(SoC)のような制御回路である。コントローラ4は、不揮発性メモリ5に電気的に接続されている。コントローラ4は、ホスト2から受信されるI/Oコマンドそれぞれを処理することによって、不揮発性メモリ5からデータを読み出すためのリード処理と、不揮発性メモリ5にデータを書き込むためのライト処理とを実行する。コントローラ4と不揮発性メモリ5とを接続する物理インターフェースとしては、例えば、Toggleインターフェース、またはオープンNANDフラッシュインターフェース(ONFI)が使用される。コントローラ4の各部の機能は、専用ハードウェア、プログラムを実行するプロセッサ、またはこれら専用ハードウェアとプロセッサとの組み合わせにより実現され得る。
【0026】
不揮発性メモリ5は、2次元構造のフラッシュメモリであってもよいし、3次元構造のフラッシュメモリであってもよい。不揮発性メモリ5は、複数のブロックを含む。複数のブロックの各々は、データ消去動作の最小単位である。複数のブロックの各々は、メモリブロックまたは物理ブロックとも称される。複数のブロックの各々は、複数のページを含む。複数のページの各々は、データ書き込み動作およびデータ読み出し動作の各々の単位である。ページは、同じワード線に接続されたメモリセルの集合を含む。ページは、物理ページとも称される。
【0027】
不揮発性メモリ5は、複数のメモリチップ51-0、…、51-yを含む。メモリチップは、ダイ、メモリダイ、フラッシュダイ、フラッシュチップとも称される。これらメモリチップの各々は、NAND型フラッシュメモリチップとして実現される。
【0028】
次に、コントローラ4の内部構成を説明する。コントローラ4は、例えば、ホストインターフェース(ホストI/F)41と、CPU42、タイマ43、NANDインターフェース(NAND I/F)44と、サイクルカウンタ制御回路45と、スタティックRAM(SRAM)46と、ダイナミックRAM(DRAM)47と、を含む。これらホストI/F41と、CPU42と、タイマ43と、NAND I/F44と、サイクルカウンタ制御回路45と、SRAM46と、DRAM47とは、内部バス40を介して相互接続される。
【0029】
ホストインターフェース41は、ホスト2との通信を実行する通信インターフェース回路である。ホストインターフェース41は、例えば、ホスト2のメモリインターフェース23を介して、ホスト2との通信を実行する。ホストインターフェース41は、例えば、PCIeコントローラによって実現される。ホストインターフェース41は、RAM411を含む。ホストインターフェース41は、エンドポイント(end point)と呼ぶ場合もある。
【0030】
RAM411は、揮発性メモリである。RAM411は、複数のサブミッションキューテールポインタ(SQTP)4111-0、…、4111-vと、複数のコンプリーションキューヘッドポインタ(CQHP)4112-0、…、4112-wと、を含む。
【0031】
SQTP4111-0、…、4111-vは、それぞれ、サブミッションキュー221-0、…、221-vに対応するポインタである。また、SQTP4111-0、…、4111-vは、RAM411の記憶領域のうちのサブミッションキュー(SQ)テールドアベルレジスタに格納されている値である。ドアベルレジスタとは、RAM411中の記憶領域の内、I/F経由で外部から書きこまれることによりCPU42に割り込みを発生させる、あるいはサイクルカウンタ制御回路45などのハードウェアが起動するような通知がなされ、書き込みに応じた作業が迅速に始められる機能をもつものをいう。
【0032】
例えば、SQTP4111-nは、サブミッションキュー221-nの複数のスロットのうち、次に新しいコマンドが格納される先頭のスロットを示すポインタである。つまり、SQTPによって示されるスロットは、コマンドが格納されていない空きスロットである。SQTPの値は、ホスト2がSQテールドアベルレジスタにライトアクセスすることによって更新される。これによって、サイクルカウンタ制御回路45が起動してSQETPの更新を行い、またコマンドフェッチ部421が起動して、可能であれば新たにコマンドをフェッチする。
【0033】
CQHP4112-0、…、4112-wは、それぞれ、コンプリーションキュー222-0、…、222-wに対応するポインタである。CQHP4112-0、…、4112-wは、RAM411の記憶領域のうちのコンプリーションキュー(CQ)ヘッドドアベルレジスタに格納されている値である。例えば、CQHP4112-mは、コンプリーションキュー222-mの複数のスロットのうち、ホスト2が処理した最後のスロットの次のスロットを示す。CQHPの値は、ホスト2がCQヘッドドアベルレジスタにライトアクセスすることによって更新される。CQHPが更新されることにより、メモリシステム3は、CQTPを、CQHPの一つ前まで進めることができる。つまり、コンプリーションキューがフル状態のため、新たな完了通知を発行できない状態であったとしても、ホスト2がCQHPを更新することにより割り込みが発生し、メモリシステム3は直ちに完了通知作業を開始できる。
【0034】
CPU42は、プロセッサである。CPU42は、不揮発性メモリ5または図示しないROMに格納されている制御プログラム(ファームウェア)をSRAM46にロードする。そして、CPU42は、このファームウェアを実行することによって様々な処理を行う。なお、CPU42は、SRAM46の代わりに、ファームウェアをDRAM47にロードしてもよい。
【0035】
CPU42は、例えば、フラッシュトランスレーション層(FTL)として、不揮発性メモリ5に記憶されたデータの管理と、不揮発性メモリ5に含まれるブロックの管理とを行う。不揮発性メモリ5に記憶されたデータの管理は、例えば、マッピング情報の管理を含む。CPU42は、L2Pテーブル(不図示)のマッピング情報を使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを管理サイズの単位で管理する。管理サイズは、例えば、4KiBである。論理アドレスは、ホスト2によって使用される、不揮発性メモリ5に格納されているデータを指定するアドレスである。論理アドレスとして、例えば、論理ブロックアドレス(LBA)が使用される。物理アドレスは、コントローラ4および不揮発性メモリ5によって使用される、不揮発性メモリ5内の記憶位置を指定するアドレスである。
【0036】
不揮発性メモリ5においては、ブロック内のページへのデータの書き込みは、このブロックの1プログラム/イレーズサイクル当たり1回のみ可能である。つまり、データが既に書き込まれているブロック内の記憶位置(物理記憶位置)に新たなデータを直接上書きすることはできない。このため、既にブロック内の物理記憶位置に書き込まれているデータを更新する場合には、コントローラ4は、そのブロック(または別のブロック)内の未書き込みページ(空きページ)に新たなデータを書き込み、そして以前のデータを無効データとして扱う。換言すれば、コントローラ4は、ある論理アドレスに対応する更新データを、この論理アドレスに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ4は、L2Pテーブルを更新して、この論理アドレスに、この別の物理記憶位置を示す物理アドレスを関連付ける。
【0037】
不揮発性メモリ5に含まれるブロックの管理は、不揮発性メモリ5に含まれる不良ブロック(バッドブロック)の管理と、ウェアレベリングと、ガベージコレクション(GC)とを含む。
【0038】
CPU42は、コマンドフェッチ部421と、タイムアウト処理部422とを含む。
【0039】
コマンドフェッチ部421は、コマンドフェッチ処理を実行する。コマンドフェッチ処理は、複数のサブミッションキュー221-0、…、221-vの複数のスロットのうち、フェッチされるべきコマンドが格納されているスロットを特定し、特定されたスロットに格納されているコマンドをフェッチする処理である。コマンドフェッチ部421は、例えば、サブミッションキュー221-nの複数のスロットのうち、SQHP461-nによって示されるスロットからコマンドをフェッチする。そして、コマンドフェッチ部421は、フェッチされたコマンドに関する情報を、フェッチコマンド管理テーブル464-nに格納する。フェッチされたコマンドに関する情報は、少なくとも、フェッチされたコマンドの内容とCIDを含む。コマンドの内容は、そのコマンドの種類を示す情報、およびそのコマンドが指定する論理アドレスなどを含む。コマンドをフェッチすると、コマンドフェッチ部はSQHP461-nを一つ進める。この作業をフェッチできるコマンドの上限に達するまで、あるいはSQHP461-nが、SQTP4111-nに達するまで、すなわちサブミッションキュー221-nが空になるまで繰り返す。フェッチできるコマンドの上限に達した場合は、フェッチしたコマンドが完了次第、新たなコマンドをフェッチする。
【0040】
また、コマンドフェッチ部421は、アービトレーション機構(図示せず)を含む。このアービトレーション機構は、ホスト2の複数のサブミッションキュー221-0、…、221-vから、コマンドがフェッチされるべきサブミッションキューを選択する機構である。アービトレーション機構は、例えば、ラウンドロビンアービトレーション機構、または重み付きラウンドロビンアービトレーション機構である。
【0041】
タイムアウト処理部422は、タイムアウト処理を実行する。タイムアウト処理は、ホスト2から発行されたコマンドのうち、発行されてから経過した時間が特定の時間(以降、タイムアウト時間と称する)に達しているコマンドを特定し、特定したコマンドをアボートする処理である。ここで、コマンドが発行されてから経過した時間は、そのコマンドがサブミッションキューに格納され、対応するサブミッションキューテールドアベルレジスタ4111に新しいSQTPが書かれてから経過した時間である。タイムアウト時間は、例えば、サブミッションキュー毎に、ホスト2によって指定される。以降では、サブミッションキュー221-nに対応するタイムアウト時間を、タイムアウト時間TOnとする。また、タイムアウト処理部422は、サブミッションキュー221-0、…、221-vそれぞれに対するタイムアウト処理を定期的に実行する。例えば、タイムアウト処理部422は、サブミッションキュー221-nに対するタイムアウト処理を、時間Tnが経過する度に実行する。Tnは、第1時間とも称する。タイムアウト処理部422は、タイムアウト処理が実行される時間間隔を、サブミッションキュー毎に異なる時間間隔に設定してもよい。つまり、タイムアウト処理部422は、第1時間Tnが経過する毎に、サブミッションキュー221-nを介して発行されたコマンドに対するタイムアウト処理を実行する。ここで、タイムアウト処理部422は、タイムアウト時間TOnが第1時間Tnの整数倍になるように第1時間Tnを設定し得る(すなわち、TOn=Mn×Tn、Mnは1以上の整数)。また、タイムアウト処理部422は、第2時間Tmが経過する毎に、サブミッションキュー221-mを介して発行されたコマンドに対するタイムアウト処理を実行する。
【0042】
タイマ43は、時間をカウントするハードウェア回路である。タイマ43は、例えば、タイマ刻みTcを有する。タイマ43は、タイマ刻みTcが経過する毎に、コントローラ4の他の構成要素に通知を発行してもよい。タイマ刻みTcは、第3時間とも称される。例えば、サブミッションキュー221-nに対応する第1時間Tn、およびサブミッションキュー221-mに対応する第2時間Tmは、それぞれ第3時間Tcの整数倍の時間に設定され得る。
【0043】
NANDインターフェース44は、不揮発性メモリ5を制御する回路である。NANDインターフェース44は、複数のメモリコントローラ441-0、…、441-xを含む。複数のメモリコントローラ441-0、…、441-xのそれぞれは、不揮発性メモリ5に含まれる複数のメモリチップ51-0、…、51-yのうちの一つ以上のメモリチップに電気的に接続される。
【0044】
サイクルカウンタ制御回路45は、サブミッションキュー毎に、サイクルカウンタを制御するハードウェア回路である。サイクルカウンタは、各サイクルで、コマンドがサブミッションキューの複数のスロットに一通り格納される複数のサイクルのうちの一つのサイクルを示す。一つのサイクルにおいて、コマンドの発行と、コマンドのフェッチとが繰り返されることによって、サブミッションキューの先頭のスロットから最後尾のスロットまでのそれぞれのスロットに一度ずつコマンドが格納される。そして、次に発行されるコマンドが格納されるべきスロットが先頭のスロットになったとき、あるサイクルから次のサイクルに移行する。つまり、サイクルカウンタは、SQTPが、サブミッションキューのスロットを周った回数に対応する。サイクルカウンタ制御回路45は、SQTP4111-nが、更新前のSQTP4111-nの値よりも小さい値に更新された場合、ドアベルレジスタの機能により動作を開始し、サブミッションキュー221-nに対応するサイクルカウンタを更新する。サブミッションキュー221-nに対応するサイクルカウンタが上限値以外の値である場合、サイクルカウンタ制御回路45は、サイクルカウンタを1だけインクリメントする。また、サブミッションキュー221-nに対応するサイクルカウンタが上限値である場合、サイクルカウンタ制御回路45は、サイクルカウンタを初期値に更新する。サイクルカウンタの上限値は、対応するサブミッションキューに含まれるスロットの個数、タイムアウト時間、およびタイムアウト時間が経過する間にコントローラ4が処理することができる、対応するサブミッションキューを介して発行されたコマンドの個数、のうちの少なくとも一つに基づいて決定される。
【0045】
SRAM46は、揮発性メモリである。SRAM46の記憶領域は、例えば、CPU42の作業領域として使用される。また、SRAM46は、複数のサブミッションキューヘッドポインタ(SQHP)461-0、…、461-vと、複数のコンプリーションキューテールポインタ(CQTP)462-0、…、462-wと、サブミッションキュー拡張テールポインタ(SQETP)463-0、…、463-v、フェッチコマンド管理テーブル464-0、…、464-v、および第1EP465-0、…、465-vを記憶する記憶領域を含む。
【0046】
SQHP461-0、…、461-vは、それぞれ、サブミッションキュー221-0、…、221-vに対応するポインタである。例えば、SQHP461-nは、サブミッションキュー221-nの複数のスロットのうち、次にフェッチされるべきコマンドが格納されているスロットを示す。コントローラ4は、SQHP461-nによって示されるサブミッションキュー221-nのスロットから一つのコマンドをフェッチすると、SQHP461-nの値を更新する。このとき、更新前のSQHP461-nがサブミッションキュー221-nの最後尾のスロット以外のスロットを示している場合、コントローラ4は、SQHP461-nを1だけインクリメントする。一方、更新前のSQHP461-nがサブミッションキュー221-nの最後尾のスロットを示している場合、コントローラ4は、SQHP461-nをサブミッションキュー221-nの先頭のスロットを示す値に更新する。SQHP461-nを更新した後に完了応答を送信するとき、コントローラ4は、その完了応答にサブミッションキュー221-nに対応するサブミッションキューの識別子(サブミッションキューID)と、更新後のSQHP461-nの値とを格納する。これにより、コントローラ4は、更新されたSQHP461-nの値をホスト2に通知する。このとき、完了応答に対応するコマンドは、サブミッションキュー221-nのスロットからフェッチされたコマンドであってもよいし、あるいは他のサブミッションキューのスロットからフェッチされたコマンドであってもよい。
【0047】
CQTP462-0、…、462-wは、それぞれ、コンプリーションキュー222-0、…、222-wに対応するポインタである。例えば、CQTP462-mは、コンプリーションキュー222-mの複数のスロットのうち、次に新しい完了応答が格納されるスロットを示す。つまり、CQTPによって示されるスロットは、コマンドが格納されていない空きスロットである。コントローラ4は、一つの完了応答をコンプリーションキュー222-mに発行する準備が完了したことに応じて、CQTP462-mを更新する。このとき、更新前のCQTP462-mがコンプリーションキュー222-mの最後尾のスロット以外のスロットを示している場合、コントローラ4は、CQTP462-mを1だけインクリメントする。一方、更新前のCQTP462-mがコンプリーションキュー222-mの最後尾のスロットを示している場合、コントローラ4は、CQTP462-mをコンプリーションキュー222-mの先頭のスロットを示す値に更新する。そして、コントローラ4は、準備された完了応答をコンプリーションキュー222-mに格納する。また、ホスト2は、二つ以上の完了応答を発行する準備が完了したときに、準備されたコマンド完了の数だけ、CQTP462-mの値をまとめて更新してもよい。CQTP462―mを更新した後、メモリシステム3は、メモリI/F23を通して、ホスト2に割り込みを発生させることにより、ホスト2は少なくとも、一つのCQTP462が更新されたことを知ることができる。割り込みの種類によっては、割り込みとともに、コンプリーションキューのIDを通知することができるので、その場合は、ホストはCQTP4114が更新されたコンプリーションキューを特定できる。
【0048】
SQETP463-0、…、463-vは、それぞれ、サブミッションキュー221-0、…、221-vに対応する拡張ポインタである。拡張ポインタは、ポインタフィールドと、サイクルカウンタフィールドとを含む。例えば、SQETP463-nのポインタフィールドは、サブミッションキュー221-nに対応するSQTP4111-nを示す。また、SQETP463-nのサイクルカウンタフィールドは、サブミッションキュー221-nに対応するサイクルカウンタを示す。SQETP463-nは、SQTP4111-nが更新されたことに応じて、更新される。
【0049】
フェッチコマンド管理テーブル464-0、…、464-vは、それぞれ、サブミッションキュー221-0、…、221-vに対応する。フェッチコマンド管理テーブル464-0、…、464-vは、ホスト2から受信(フェッチ)されたコマンドと、コマンドが発行された時間の範囲に関する情報とを管理するために使用されるテーブルである。フェッチコマンド管理テーブル464-0、…、464-vは、それぞれ、複数のエントリを含む。フェッチコマンド管理テーブル462-nの複数のエントリそれぞれは、少なくとも、サブミッションキュー221-nからフェッチされたコマンドの内容を格納する。例えば、フェッチコマンド管理テーブル464-nの複数のエントリそれぞれは、サブミッションキュー221-nからフェッチされたコマンドの内容と、そのコマンドが格納されているスロットを示すEPとを格納する。あるいは、フェッチコマンド管理テーブル464-nの複数のエントリそれぞれは、サブミッションキュー221-nからフェッチされたコマンドの内容と、そのコマンドに対応するタイムスロットを示す情報とを格納する。複数のタイムスロットは、第1時間単位の連続する複数の時間範囲である。あるタイムスロットの間に発行されたコマンドは、そのタイムスロットに対応付けられる。タイムスロットの詳細については後述する。
【0050】
第1EP465-0、…、465-vは、後述するタイムスロット管理テーブル471-0、…、471-vから、一時的に退避された拡張ポインタである。第1EP465-nは、サブミッションキュー221-nに対応し、タイムスロット管理テーブル471-nから退避された拡張ポインタである。第1EP465-nは、タイムアウト対象のタイムスロットよりも一つ前のタイムスロットの終端の時刻におけるSQETP463-nである。第1EP465-0、…、465-vの詳細については、後述する。なお、第1EPは演算にすぐ利用し、その後不要になるため、可能であれば演算機であるCPU42などのレジスタにロードしてもよい。
【0051】
DRAM47は、揮発性メモリである。DRAM47の記憶領域の一部は、タイムスロット管理テーブル471-0、…、471-vを記憶するために使用される。DRAM47は、コントローラ4の内部ではなく、コントローラ4の外部にあってもよい。
【0052】
タイムスロット管理テーブル471-0、…、471-vのそれぞれは、サブミッションキュー221-0、…、221-vに対応する。タイムスロット管理テーブル471-0、…、471-vは、タイムスロットと、拡張ポインタとの対応関係を管理するために使用されるテーブルである。タイムスロット管理テーブル471-0、…、471-vのそれぞれは、複数のエントリを含む。複数のエントリそれぞれは、一つのタイムスロットに対応する。各エントリには、対応するタイムスロットの終端の時刻における、SQETPが格納される。つまり、Tnが経過する度に、タイムスロット管理テーブル471-nのいずれか一つのエントリに順に、SQETP463-nが格納される。そして、あるタイムスロットに対応するエントリに格納されているSQETPが示すスロットの一つ前のスロットに対応するコマンドは、そのタイムスロットの終端の時刻までに発行されたコマンドのうちの最新のコマンドである。ここでは、タイムスロット管理テーブル471-0、…、471-vがDRAM47に記憶されている場合について説明したが、タイムスロット管理テーブル471-0、…、471-vは、SRAM46に記憶されていてもよい。
【0053】
次に、サブミッションキューの構成例について説明する。図2は、実施形態に係るメモリシステム3を含む情報処理システム1において使用される、サブミッションキュー221-nの複数の状態を示す図である。ここで、サブミッションキュー221-nに含まれるスロットの個数は、SIZEnであり、サブミッションキュー221-nはスロットSLT0~SLT SIZEn-1を含む。この図はメモリシステム2が認識している状態を示すが、ホスト2が認識している状態は、SQHP461-nを図示されていないSQHHP223-nに置き換え、且つSQTP4111-nをSQHTP224-nに置き換えたものである。
【0054】
図2の(a)は、空の状態のサブミッションキュー221-nを示す。つまり、サブミッションキュー221-nの複数のスロットは、いずれも、コマンドが格納されていない、空きのスロットである。
【0055】
このとき、SQHP461-nと、SQTP4111-nとは、どちらも同じスロット(ここでは、スロットSLT2)を示す。例えば、コントローラ4は、SQHP461-nおよびSQTP4111-nが同じスロットを示していることから、サブミッションキュー221-nがコマンドを格納していない空の状態であると判定する。つまり、コントローラ4は、サブミッションキュー221-nがフェッチ可能なコマンドを格納していないサブミッションキューであると判定する。また、ホスト2も、同様に、SQHHP223-nおよびSQHTP224-nが同じスロットを示していることから、サブミッションキュー221-nがコマンドを格納していない空の状態であると判定する。そして、ホスト2は、SQHTP224-nによって示されるスロットSLT2が、次に新しいコマンドを格納可能なスロットであると特定する。
【0056】
図2の(b)は、二つのコマンドが格納されているサブミッションキュー221-nを示す。図2の(b)におけるサブミッションキュー221-nは、図2の(a)におけるサブミッションキュー221-nに二つのコマンドが格納された状態である。
【0057】
図2(a)の状態のサブミッションキュー221-nのスロットSLT2およびSLT3それぞれにコマンドを格納すると、ホスト2は、(b)の状態になり、サブミッションキューテールドアベルレジスタであるSQTP4111-nにライトアクセスすることによって、SQTP4111-nを2だけインクリメントするように更新する。これにより、SQTP4111-nは、スロットSLT4を示す値になり、メモリシステム3から見ても(b)の状態になる。ホスト2は、一つのコマンドをサブミッションキュー221-nに格納する度に、RAM411のサブミッションキューテールドアベルレジスタSQTP4111-nにライトアクセスしてもよいし、あるいは、複数のコマンドをサブミッションキュー221-nに格納した後に、RAM411のサブミッションキューテールドアベルレジスタSQTP4111-nにライトアクセスすることで、SQTP4111-nを一度に更新してもよい。
【0058】
サブミッションキュー221-nのスロットSLT2およびSLT3は、それぞれ、コマンドが格納されるため「使用中」(occupied)となる。コントローラ4は、SQHP461-nとSQTP4111-nとが異なる値になると、フェッチ可能なコマンドがサブミッションキュー221-nに格納されていると判定する。コントローラ4は、サブミッションキュー221-nに格納されているコマンドの個数を、SQHP461-nとSQTP4111-nとの差から特定する。ここで、SQHP461-nとSQTP4111-nとの差が2であり、SQHP461-nがスロットSLT2を示していることから、コントローラ4は、スロットSLT2とSLT3とにフェッチ可能なコマンドが格納されていると判定する。
【0059】
図2の(c)は、フル状態のサブミッションキュー221-nを示す。図2の(b)におけるサブミッションキュー221-nに、さらに、SIZEn-3個のコマンドが格納されると、サブミッションキュー221-nは、フル状態になる。
【0060】
サブミッションキュー221-nのスロットSLT SIZEn-1にコマンドが格納されると、次に新たなコマンドが格納されるべきスロットは、スロットSLT0になる。そのため、SQTP4111-nは、スロットSLT SIZEn-1を示す値の後、スロットSLT0を示す値に更新される。このような構成から、サブミッションキュー221-nは、環状のキューとも称される。そして、スロットSLT0にコマンドを格納すると、ホスト2は、SQTP461-nを、スロットSLT1を示す値に更新する。ホスト2(およびコントローラ4)は、SQHTP224-n(SQTP4111-n)の値がSQHHP223-n(SQHP461-n)が示すスロットの一つ前のスロットを示す値であるとき、サブミッションキュー221-nがフル状態であると判定する。ホスト2は、メモリシステム3からの通知によりSQHHP223-nが更新されて、サブミッションキュー221-nがフル状態でなくなるまで、サブミッションキュー221-nのスロットSLT1にコマンドを格納しない。
【0061】
ここでは、サブミッションキュー221-0、…、221-vのうちの一つのサブミッションキュー221-nの構成を例示して説明したが、コンプリーションキュー222-0、…、222-wの構成も、同様な環状のキューで実現され得る。
【0062】
ただし、ホスト2では、コンプリーションキューのテールポインタを直接的に管理しておらず、Phase Tag Bitの値が変わったスロットを指すポインタが、ホスト2が認識できるテールポインタとなる。
【0063】
次に、コマンド処理について説明する。図3は、実施形態に係るメモリシステム3を含む情報処理システム1において実行される、コマンド処理の流れを示す図である。ここで、ホスト2がサブミッションキュー221-nを介してコマンドを発行し、メモリシステム3のコントローラ4が発行されたコマンドを処理し、処理したコマンドに対応する完了応答をコンプリーションキュー222-mを介して送信する場合について説明する。
【0064】
ステップ1: ホスト2は、メモリシステム3に送信すべき一つ以上の新たなコマンドをサブミッションキュー221-nの一つ以上の空きスロットに格納する。これら一つ以上の新たなコマンドは、SQHTP224-nの現在の値によって示されるスロットから始まる一つ以上の空きスロットに格納される。サブミッションキュー221-nに格納される新たなコマンドは、ライトコマンドであってもよいし、リードコマンドであってもよいし、他のコマンドであってもよい。図2では、サブミッションキュー221-nに格納されている各コマンドは「CMD」として表記されている。
【0065】
ステップ2: ホスト2は、SQHTP224-nの値を更新する。ホスト2は、SQHTP224-nの値を、ステップ1で格納されたコマンドの個数だけインクリメントする。
【0066】
ステップ3: サブミッションキュー221-nに一つ以上の新たなコマンドが格納されたことをメモリシステム3のコントローラ4に通知するために、ホスト2は、このサブミッションキュー221-nに対応するメモリシステム3内のサブミッションキューテールドアベルレジスタにライトアクセスして、このサブミッションキュー221-nに対応するSQTP4111-nの値を更新する。SQTP4111-nの値は、更新されたSQHTP224-nの値に更新される。このようなドアベルレジスタを介したSQTP4111-nの更新は、サブミッションキュー221-nに格納されたコマンドそれぞれの処理をコントローラ4に開始させるトリガーとなる。
【0067】
ステップ4: コントローラ4は、SQTP4111-nが更新されたことに応じて、SQETP463-nを更新する。コントローラ4は、SQテールドアベルレジスタに格納されている更新後のSQTP4111-nと、SQETPのポインタフィールドに格納されている更新前のSQTP4111-nと、を比較する。更新後のSQTP4111-nが、更新前のSQTP4111-nよりも小さい場合、コントローラ4は、SQTP4111-nが最後尾のスロット(例えばスロットSLT SIZEn-1)から先頭のスロット(例えばスロットSLT0)に周ったと判定し、サイクルカウンタを更新する。このとき、サイクルカウンタが上限値である場合、コントローラ4は、サイクルカウンタを初期値(通常は最小値であるゼロ)に設定する。また、サイクルカウンタが上限値以外である場合、コントローラ4は、サイクルカウンタを1だけインクリメントする。そして、コントローラ4は、更新されたサイクルカウンタと、更新後のSQTPとを、更新されたSQETP463-nとして記録する。一方、更新後のSQTP4111-nが、更新前のSQTP4111-n以上である場合、コントローラ4は、単に、更新後のSQTP4111-nをSQETP463-nのポインタフィールドに格納する。
【0068】
ステップ5: コントローラ4は、SQTP4111-nの新たな値とSQHP461-nの値との間の差分から、サブミッションキュー221-nに格納された新たなコマンドの数を認識することができる。コントローラ4は、サブミッションキュー221-nから一つ以上の任意の数のコマンドをフェッチする。
【0069】
ステップ6: コントローラ4は、フェッチされたコマンドに関する情報をフェッチコマンド管理テーブル464-nに格納するように、フェッチコマンド管理テーブル464-nを更新する。コントローラ4は、フェッチコマンド管理テーブル464-nの一つの無効化されたエントリを、フェッチされた一つのコマンドに関する情報が格納されるエントリとして選択する。そして、コントローラ4は、その一つのエントリに、その一つのコマンドの内容、CIDと、その一つのコマンドが格納されていたサブミッションキュー221-nのスロットを示す拡張ポインタとを格納する。ステップ5でフェッチされた各コマンドの内容は、フェッチコマンド管理テーブル464-nを使用して管理され得る。また、ステップ5でフェッチされた各コマンドは、フェッチコマンド管理テーブル464-nとは異なるSRAM46の記憶領域に一時的に格納されていてもよい。コマンドを一つずつフェッチしている場合、つまりSQEHPの指すスロットのコマンドをフェッチし、都度SQEHPを一つずつ進めた場合の拡張ポインタは、フェッチ時のSQEHPである。あるいは、コントローラ4は、フェッチコマンド管理テーブル464-nの一つのエントリに、そのコマンドの内容と、そのコマンドが含まれるタイムスロットを示す情報とを格納する。タイムスロットを示す情報は、例えば、そのタイムスロットが対応付けられているタイムスロット管理テーブル471-nに含まれる一つのエントリを示す値である。
【0070】
ステップ7: コントローラ4は、サブミッションキュー221-nに対応するSQHP461-nの値がステップ5でフェッチしたコマンドの数だけ増えるように、SQHP461-nの値を更新する。
【0071】
ステップ8: コントローラ4は、フェッチしたコマンドそれぞれを実行する。一部の例外を除き、これらコマンドが実行される順序は制限されず、これらコマンドは、これらコマンドがフェッチされた順序と異なる順序で実行されてもよい。各コマンドを実行する処理においては、コントローラ4は、必要に応じて、ホスト2のRAM22にあるデータを不揮発性メモリ5に書きこみ、または不揮発性メモリ5のデータをホスト2のRAM22に書きこむ。
【0072】
ステップ9: ある一つのコマンドの処理が完了すると、コントローラ4は、処理が完了したコマンドに対応する、フェッチコマンド管理テーブル464-nの一つのエントリを無効化するように、フェッチコマンド管理テーブル464-nを更新する。無効化されたエントリは、新たな情報を格納可能なエントリとなる。
【0073】
ステップ10: コントローラ4は、この完了したコマンドを示す、このコマンドが格納されていたサブミッションキューのIDと対応するCID、およびコマンドの完了のステータス、更新されたあるサブミッションキューのSQHPとそのキューのIDを示す新たな応答を、コンプリーションキュー222-mの次の空きスロットに格納する。この空きスロットは、ステップ10で更新される前のCQTP462-mが示すスロットである。図2では、コンプリーションキュー222-mに格納されている完了応答の各々は「CPL」として表記されている。コンプリーションキュー222-mは、完了したコマンドがフェッチされたサブミッションキュー221-nに関連付けられており、サブミッションキュー221-nで発行されたコマンドの完了応答は、かならずコンプリーションキュー222-mで行われる。
【0074】
ステップ11: そして、コントローラ4は、コンプリーションキュー222-mに対応するCQTP462-mを更新して、このCQTP462-mの値を1だけインクリメントする。ステップ10および11において、完了応答がコンプリーションキュー222-mに格納された後に、CQTP462-mが更新される場合について説明したが、コントローラ4は、CQTP462-mを更新した後に、完了応答をコンプリーションキュー222-mに格納してもよい。
【0075】
ステップ12: コントローラ4は、割り込みをホスト2に送信する。コントローラ4は、ステップ11で完了応答が格納されたコンプリーションキュー222-mに対応する割り込みベクタを含む割り込みをホスト2に送信して、新たな完了応答がコンプリーションキュー222-mに格納されたことをホスト2に通知してもよい。
【0076】
ステップ13: ホスト2は、CQHHP225-mの現在の値によって示されるスロットから完了応答を取得し、取得した完了応答を処理する。完了応答に含まれるサブミッションキューのIDとCIDから、このコマンド発行のリクエスト元を同定し、そのリクエストに対して完了応答を返す。
【0077】
ステップ14: ホスト2は、ステップ13で処理した完了応答に含まれる、サブミッションキューIDと、SQHPの値とに基づいて、SQHHPを更新する。サブミッションキューIDは、例えば、サブミッションキュー221-nに対応する識別子である。完了応答に含まれる、サブミッションキューIDと、SQHPの値とは、この完了応答に対応するコマンド以外のコマンドがフェッチされたことに応じて更新されたSQHPの値に関する情報であってもよい。また、サブミッションキューIDは、サブミッションキュー221-n以外のサブミッションキューを示す識別子であってもよい。ただし、一つの完了応答に含まれる、サブミッションキューIDと、SQHHPとは、一つのサブミッションキューに対応する。
【0078】
ステップ15: ホスト2は、ステップ13で一つの完了応答を処理したことに応じて、CQHHP225-mを更新して、CQHHP225-mを1だけインクリメントする。このとき、更新前のCQHHP225-mがコンプリーションキュー222-mの最後尾のスロット以外のスロットを示している場合、コントローラ4は、CQHHP225-mを1だけインクリメントする。一方、更新前のCQHHP225-mがコンプリーションキュー222-mの最後尾のスロットを示している場合、コントローラ4は、CQHHP225-mをコンプリーションキュー222-mの先頭のスロットを示す値に更新する。
これを繰り返してPhase Tag Bitの値が反転する直前のスロットまでステップ13の完了応答を行う。また、ホスト2は、二つ以上の完了応答を処理した後に、処理したコマンド完了の数だけCQHHP225-mの値をインクリメントするように、CQHHP225-mを更新してもよい。
【0079】
ステップ16: ホスト2は、コンプリーションキュー222-mに対応するメモリシステム3内のコンプリーションキューヘッドドアベルレジスタにライトアクセスして、CQHP4112-mの値を更新する。CQHP4112-mの値は、ステップ15で更新されたCQHHP225-mの値に更新される。
【0080】
次に、タイムスロットについて説明する。図4は、実施形態に係るメモリシステム3において使用されるタイムスロットの例を示す図である。
【0081】
コントローラ4は、サブミッションキュー毎に、複数のタイムスロットを管理する。例えば、コントローラ4は、サブミッションキュー221-nに対応する、複数のタイムスロットを管理する。サブミッションキュー221-nに対応する複数のタイムスロットは、第1時間Tn単位の連続する複数の時間範囲である。一つのタイムスロットは、第1時間Tnの時間範囲である。
【0082】
図4では、0から開始する時刻と、サブミッションキュー221-nに対応する複数のタイムスロットとが示されている。以降では、サブミッションキュー221-nに対応し、且つ時刻(t-1)×Tnから時刻t×Tnまでの範囲に対応する、タイムスロットをTSn,tと表す。ここでtは整数である。
【0083】
コントローラ4は、あるタイムスロットの間にサブミッションキュー221-nに発行されたコマンドを、そのタイムスロットに対応付けて管理する。具体的には、コントローラ4は、時刻(t-1)×Tnが経過してから時刻t×Tnに達するまでの間にサブミッションキュー221-nに発行されたコマンドを、タイムスロットTSn,tに対応付ける。つまり、時刻(t-1)×Tnにサブミッションキュー221-nに発行されたコマンドは、タイムスロットTSn,tに対応付けられずに、タイムスロットTSn,t-1に対応付けられる。そして、時刻t×Tnにサブミッションキュー221-nに発行されたコマンドは、タイムスロットTSn,tに対応付けられる。
【0084】
コントローラ4は、タイムスロットの単位で、タイムアウト処理を実行する。コントローラ4は、タイムアウト時間TOnがMn×Tnである場合、時刻(t+Mn)×Tnで、タイムスロットTSn,tに対応するコマンドのうち、処理が未完了のコマンドに対してタイムアウト処理を実行する。ここでMnは、1以上の整数である。このとき、タイムスロットTSn,tに対応付けられたコマンドがサブミッションキュー221-nに発行されてから経過した時間は、Mn×Tn以上であり、且つ(Mn+1)×Tn未満である。つまり、時刻(t+Mn)×Tnでは、タイムスロットTSn,tに対応するコマンドがサブミッションキュー221-nに発行されてから経過した時間は、Mn×Tn以上である。
【0085】
このようなタイムスロットを使用することによって、コントローラ4は、受信(フェッチ)した複数のコマンドそれぞれについて、サブミッションキューに発行されてから経過した時間を管理することを必要としない。特に、一度に大量のコマンドを並行して処理するようなメモリシステム3では、処理が未完了であるコマンド一つずつについて発行されてから経過した時間を計測する必要を回避することができる。
【0086】
このように、コントローラ4は、一つのタイムスロットに含まれる複数のコマンドを一時にタイムアウトする。そのため、あるコマンドがサブミッションキュー221-nに発行されてからタイムアウトされるまでの時間は、Mn×Tn以上から、(Mn+1)×Tn未満までの値を取り得る。そのため、タイムアウト時間TOn(=Mn×Tn)に対する、実際にコマンドがタイムアウトされるまでの時間の精度は、((Mn+1)×Tn-Mn×Tn)/(Mn×Tn)=1/Mnで表される。このことから、タイムアウト時間が変更される場合であっても、Mnを固定して、Tnを変更することによって、タイムアウトの精度を一定に保つことができる。
【0087】
ここで説明されたタイムスロットTSn,tは、時刻(t-1)×Tnが経過してからt×Tnに達するまでの時間範囲に発行されたコマンドを時刻t×Tnに発行されたコマンドのグループとして取り扱うものである。一方、タイムスロットTSn,tが、時刻t×Tnから(t+1)×Tnに到達する前までの時間範囲に発行されたコマンドを時刻t×Tnに発行されたコマンドのグループとして取り扱う場合、Mnは2以上の整数となる。そして、時刻(t+Mn)×Tnにタイムアウトされるコマンドは、時刻t×Tnから(t+1)×Tnに到達する前までの時間範囲に発行されたコマンドとなる。これらのコマンドがサブミッションキュー221-nに発行されてから経過した時間は、(Mn-1)×Tnより大きく、且つMn×Tn以下である。
【0088】
次に、拡張ポインタ(Extended Pointer、EP)について説明する。図5は、実施形態に係るメモリシステム3において使用される拡張ポインタの例を示す図である。
【0089】
拡張ポインタは、サイクルカウンタと、ポインタとを含む。拡張ポインタは、一つの仮想的なサブミッションキューのスロットに対応する。一つの仮想的なサブミッションキューのスロットは、一つのコマンドに対応し得る。拡張ポインタは、サブミッションキューテール(またはヘッド)ポインタを拡張したポインタである。拡張ポインタは、タイムアウト処理の対象となる可能性があるコマンドを特定するためのポインタである。特に、拡張ポインタは、既にサブミッションキューからフェッチされているために、サブミッションキューのスロットを示すポインタでは特定できないコマンドを特定するために拡張されたポインタである。例えば、拡張ポインタは、サイクルカウンタを示す情報が格納されるサイクルカウンタフィールドと、ポインタを示す情報が格納されるポインタフィールドとを含む。あるいは、拡張ポインタは、サイクルカウンタフィールドである上位ビットと、ポインタフィールドである下位ビットからなるビット列によって実現されてもよい。
【0090】
サイクルカウンタは、ポインタが環状のキューを周った回数を示す。例えば、サブミッションキュー221-nのSQTP4111-nに対応するサイクルカウンタは、サブミッションキューテールドアベルレジスタに格納されている更新されたSQTP4111-nの値が、更新前のSQTPよりも小さい値である場合に、サイクルカウンタ制御回路45によって1だけインクリメントされる。このとき、更新前のサイクルカウンタの値が上限値である場合には、サイクルカウンタ制御回路45は、1だけインクリメントする代わりに、サイクルカウンタを初期値に設定する。
【0091】
サブミッションキュー221-nに対応するサイクルカウンタの上限値MAXCCは、サブミッションキュー221-nのサイズ、タイムアウト時間TOn、およびメモリシステム3のコマンド処理速度のうちの少なくとも一つに基づいて決定される。例えば、サイクルカウンタの上限値MAXCCは、タイムアウト時間TOnの間にホスト2が発行可能なコマンドの数の最大値をサブミッションキュー221-nのサイズで除した値の小数点以下を切り上げた整数に1を加えた数であるMAXCYCLEを拡張ポインタがカバーできる値である必要がある。ここで、タイムアウト時間TOnの間にホスト2が発行可能なコマンドの数の最大値は、タイムアウト時間TOnの間にコントローラ4がサブミッションキュー221-nからフェッチ可能なコマンドの数の最大値に、サブミッションキュー221-nのサイズを加えた数である。
【0092】
具体的には、サブミッションキュー221-nのサイズをSIZEn、タイムアウト時間をTOn[s]、メモリシステム3のコマンド処理速度をMaxCom[1/s]とする。この場合、タイムアウト時間TOnが経過するまでにサブミッションキュー221-nからコントローラ4がフェッチ可能なコマンドの数の最大値MAXFNは、タイムアウト時間TOnの間にメモリシステム3のコントローラ4によって処理可能なコマンドの数の最大値に等しい。つまり、MAXFNは、TOn×MaxComとなる。そして、タイムアウト時間TOnの間にホスト2が発行可能なコマンドの数の最大値は、MAXFN+SIZEnである。よって、MAXCYCLEは、(TOn×MaxCom+SIZEn)/SIZEn+1である。そして、サイクルカウンタの上限値MAXCCは、拡張ポインタが算出されたMAXCYCLEを格納可能なサイズとなるようなフィールドの幅を定める値に設定される(例えば、MAXCC=2^(フィールドの幅)-1)。
【0093】
ここで、実用的なコマンドの中で速く処理することができるコマンドを基準にMaxComを設定することにより、非実用的なコマンドが処理される場合と比べて、サイクルカウンタの上限値を抑えることができる。これにより、サイクルカウンタフィールドの幅を小さくすることができる。実用的なコマンドの中で速く処理することができるコマンドは、例えば、最小単位のサイズのデータを指定し、且つ連続する論理アドレスを指定している複数のリードコマンドである。また、非実用的なコマンドの中で速く処理することができるコマンドは、例えば、コマンド種類を示す未定義のコードによって指定され、コマンド未定義を示すエラーが発生するコマンドである。
【0094】
ポインタは、サブミッションキューの複数のスロットのうちの、一つのスロットを示すポインタである。
【0095】
次に、仮想的なサブミッションキューの例について説明する。以降で示されるサブミッションキュー拡張ヘッドポインタ(SQEHP)は、タイムアウト対象のタイムスロットよりも一つ古いタイムスロットの終端の時刻におけるサブミッションキュー拡張テールポインタ(SQETP)と同じ値である。サイクルカウンタの値がj、ポインタの値がkである拡張ポインタを、EP(j,k)と表す(ここで、0≦j≦MAXCC-1、且つ0≦k≦SIZEn-1)。
【0096】
図6は、実施形態に係るメモリシステム3において管理される仮想的なサブミッションキューの第1の状態の例を示す図である。仮想的なサブミッションキューに含まれる複数のスロットそれぞれは、拡張ポインタが取り得る一つの値に対応する。そのため、サブミッションキュー221-nに対応する仮想的なサブミッションキューに含まれるスロットの個数は、サブミッションキュー221-nに対応するサイクルカウンタの上限値MAXCC-1(縦軸、0~MAXCC-1の個数)と、サブミッションキュー221-nのサイズ(横軸、0~SIZEn-1の個数)とによって決定される。図6におけるサブミッションキュー221-nは、フル状態である。そして、サブミッションキュー221-nを介して発行され、仮想サブミッションキューにあるコマンドは、全てまだフェッチされておらず、未完了である。
【0097】
SQHP461-nは、スロットSLT SIZEn-1を示し、SQTP4111-nはスロットSLT SIZEn-2を示す。SQTP4111-nが、SQHP461-nが示すスロットの一つ前のスロットを示しているため、サブミッションキュー221-nは、フル状態である。このとき、SQTP4111-nによって示されるスロットSLT SIZEn-2は、空きスロットである。
【0098】
SQHP461-nおよびSQEHP463-nに対応する拡張ポインタは、EP(0,SIZEn-1)である。EP(0,SIZEn-1)に対応するスロットは、サブミッションキュー221-nの最後尾のスロットである。そのため、次のコマンドは、サブミッションキュー221-nの先頭のスロットに格納されている。つまり、EP(0,SIZEn-1)の次は、コマンドが格納されているスロットの位置を示すポインタが初期値に更新され、このとき、拡張ポインタのサイクルカウンタは1だけインクリメントされEP(1,0)となる。
【0099】
そして、サブミッションキュー221-nがフル状態になるまでコマンドが発行されると、SQTP4111-nおよびSQETP463-nに対応する拡張ポインタは、EP(1,SIZEn-2)である。ホスト2のRAM22上のサブミッションキュー221-n(すなわち、実メモリに対応するスロット)に対応している拡張ポインタは、EP(0,SIZEn-1)からEP(1,SIZEn-2)までの拡張ポインタの範囲に含まれるポインタである。他の拡張ポインタは、仮想的なサブミッションキュー221-nのスロットのうちの、RAM22の記憶領域に対応していない仮想的な空きスロットに対応している。
【0100】
図7は、実施形態に係るメモリシステム3において管理される仮想的なサブミッションキュー221-nの第2の状態の例を示す図である。図7の第2の状態の例は、図6で示された第1の状態の後であって、タイムアウト時間TOnが経過し、且つタイムアウト処理が実行される前の時点を示している。ここで、タイムアウト時間TOnの間にMAXFNのコマンドはサブミッションキュー221-nからフェッチされており、且つSIZEnのコマンドが新たにホスト2から発行されている。そのため、TOnが経過した後もサブミッションキュー221-nはフル状態である。
【0101】
具体的には、SQEHPに対応する拡張ポインタは、EP(0,SIZEn-1)である。SQHP461-nに対応する拡張ポインタは、EP(MAXCC-2,1)である。そのため、EP(0,SIZEn-1)からEP(MAXCC-2,0)までの拡張ポインタの範囲に含まれる拡張ポインタは、フェッチ済みで、且つ処理が未完了なコマンドに対応している可能性がある仮想的なスロットに対応する。フェッチ済みで、且つ処理が未完了なコマンドが対応している可能性がある仮想的なスロットは、フェッチ済みで、且つ処理が未完了なコマンドと、フェッチ済みで、且つ処理が完了しているコマンドの一方に対応する。
【0102】
また、SQTP4111-n、およびSQETP463-nに対応する拡張ポインタは、EP(MAXCC-1,0)である。そのため、EP(MAXCC-2,1)からEP(MAXCC-1,0)までの拡張ポインタの範囲に含まれる拡張ポインタは、ホスト2のRAM22上のサブミッションキュー221-nの複数のスロットに対応している。
【0103】
次に、SQEHPに対応する拡張ポインタがEP(0,0)であり、タイムアウト時間TOnが経過する間に、ホスト2が発行可能な最大の数のコマンドがサブミッションキュー221-nに発行された場合の仮想的なサブミッションキューの第3の状態の例を図8に示す。
【0104】
この場合、EP(0,0)からEP(MAXCC-3,1)までの拡張ポインタの範囲に含まれる拡張ポインタは、フェッチ済みで、且つ処理が未完了なコマンドが対応している可能性がある仮想的なスロットに対応する。また、SQTP4111-nおよびSQETP463-nに対応する拡張ポインタは、EP(MAXCC-2,1)である。そのため、EP(MAXCC-3,2)からEP(MAXCC-2,1)までの拡張ポインタの範囲に含まれる拡張ポインタは、ホスト2のRAM22上のサブミッションキュー221-nの複数のスロットに対応している。
【0105】
次に、SQEHPに対応する拡張ポインタがEP(j+2,SIZEn-2)であり、タイムアウト時間TOnが経過する間に、ホスト2が発行可能な最大の数のコマンドがサブミッションキュー221-nに発行された場合の仮想的なサブミッションキューの第4の状態の例を図9に示す。
【0106】
まず、EP(j+2,SIZEn-2)からEP(MAXCC-1,SIZEn-1)までの拡張ポインタの範囲に含まれる拡張ポインタは、フェッチ済みで、且つ処理が未完了なコマンドが対応している可能性があるスロットである。EP(MAXCC-1,SIZEn-1)に対応するスロットまでコマンドが格納され、次にコマンドが格納されるべきスロットが先頭のスロットになったとき、コントローラ4は、その先頭のスロットを更新されたサイクルカウンタを含む拡張ポインタに対応付ける。このとき、更新前のサイクルカウンタの値がMAXCC-1(すなわち、上限値)であるため、コントローラ4は、サイクルカウンタを、0(すなわち、初期値)に更新する。これにより、次にコマンドが格納されるべきスロットに対応する拡張ポインタは、EP(0,0)となる。その後、コマンドの発行、およびコマンドフェッチが進むにつれて、サイクルカウンタおよびポインタは順次更新される。
【0107】
そして、図9においてホスト2が管理しているSQHHP223-nに対応する拡張ポインタは、EP(j,k+2)であり、ホスト2が管理しているSQHTP224-nに対応する拡張ポインタは、EP(j+1,k+1)である。SQHTP224-nは、SQHHP223-nが示すスロットの一つ前のスロットを示しているため、ホスト2から見たサブミッションキュー221-nは、フル状態である。そのため、ホスト2は、サブミッションキュー221-nに新たなコマンドを発行することができないと判定する。
【0108】
このとき、コントローラ4は、サブミッションキュー221-nから一つ以上((SIZEn-2)-(k+2)個)のコマンドをフェッチしており、SQHP461-nを更新しているが、未だホスト2に更新後のSQHP461-nの値を通知していない。そのため、SQHP461-nに対応する拡張ポインタは、SQHHP223-nと異なり、EP(j,SIZEn-2)である。
【0109】
また、ホスト2は、EP(j+1,k)に対応するサブミッションキュー221-nのスロットにコマンドを格納しているが、未だサブミッションキューテールドアベルレジスタにライトアクセスしていない。そのため、コントローラ4が管理しているSQTP4111-nおよびSQETP463-nに対応する拡張ポインタは、SQHTP224-nと異なり、EP(j+1,k)である。
【0110】
これにより、SQTP4111-nが示すスロットと、SQHP461-nが示すスロットの一つ前のスロットとが異なるため、コントローラ4は、サブミッションキュー221-nをフル状態であると判定しない。
【0111】
実際には、コントローラ4によって次にフェッチされるコマンドが格納されているスロットはSQHPが示す、EP(j、SIZEn-2)に対応し、SQHPがホスト2に通知されたことによりSQHHPが進んだ後にホスト2によって次にコマンドが格納されるべきスロットは、SQHTPが示すEP(j+1,k+1)である。
【0112】
図9において、EP(j+2,SIZEn-2)からEP(MAXCC-1,SIZEn-1)までの拡張ポインタの範囲と、EP(0,0)からEP(j、k+1)までの拡張ポインタの範囲とに含まれる拡張ポインタは、フェッチ済みで且つ処理が未完了なコマンドが対応している可能性がある仮想的なスロットに対応している。以降では、EP(j+2,SIZEn-2)からEP(j、k+1)までのような、拡張ポインタの最後尾および拡張ポインタの先頭をまたがる拡張ポインタの範囲について、拡張ポインタのワープを含む範囲と称する。
【0113】
このように、拡張ポインタがワープしている場合、ある拡張ポインタが、二つの拡張ポインタの間の範囲に含まれているか否かの判定を、直接計算することができない場合がある。そのため、ワープを考慮して拡張ポインタを比較計算するための二つの方法についてそれぞれ説明する。
【0114】
まず、図10を参照して、第1の方法について説明する。図10は、実施形態に係るメモリシステム3において管理される仮想的なサブミッションキューにおける拡張ポインタを比較する第1の例を示す図である。第1の方法を適用する前の図10における各拡張ポインタの値は、図9で示される拡張ポインタの値と同じである。
【0115】
第1の方法において、コントローラ4は、SQEHPからみて、ワープしている拡張ポインタのサイクルカウンタに、MAXCCを加える。つまり、仮想的なサブミッションキューのスロットのうち、SQEHPのサイクルカウンタ未満のサイクルカウンタを含む拡張ポインタを、ワープしている拡張ポインタであるとみなす。これにより、サイクルカウンタが初期値に更新された後の拡張ポインタのサイクルカウンタを、MAXCC以上に拡張する。
【0116】
このとき、元のサイクルカウンタが0である拡張ポインタ(例えば、EP(0,0))は、サイクルカウンタがMAXCCである拡張ポインタ(例えば、EP(MAXCC,0))として計算される。そして、SQHHP223-nがEP(MAXCC+j,k+2)、SQHP461-nがEP(MAXCC+j,SIZEn-2)、SQTP4112-nがEP(MAXCC+j+1,k)、SQHTP224-nがEP(MAXCC+j+1,k+1)に対応する。EP(j+2,SIZEn-2)からEP(MAXCC+j,k+1)までの間の拡張ポインタは、フェッチ済みで且つ処理が未完了なコマンドが対応している可能性がある仮想的なスロットに対応する。EP(MAXCC+j,k+2)からEP(MAXCC+j+1,k+1)までの範囲に含まれる拡張ポインタは、ホスト2のRAM22上のサブミッションキュー221-nの複数のスロットに対応する。
【0117】
このように、第1の方法が適用された拡張ポインタは、ワープが無い、連続した拡張ポインタとなるため、拡張ポインタを直接的に比較計算することができる。しかし、第1の方法が適用された拡張ポインタのサイクルカウンタの上限値は、元のサイクルカウンタの値のおよそ2倍の値を取り得る。そのため、計算のために使用される拡張ポインタを一時的に格納するため、元のサイクルカウンタフィールドよりも大きいサイズのフィールドが必要とされることになる。
【0118】
次いで、図11を参照して、第2の方法について説明する。第2の方法では、SQEHPのサイクルカウンタに基づいて、他の拡張ポインタのサイクルカウンタを減算する。図11は、実施形態に係るメモリシステム3において管理される仮想的なサブミッションキューにおける拡張ポインタを比較する第2の例を示す図である。
【0119】
コントローラ4は、計算前のSQEHPに含まれるサイクルカウンタの値を、各拡張ポインタのサイクルカウンタから減算する。具体的には、SQEHPのサイクルカウンタであるj+2を、各拡張ポインタのサイクルカウンタから減算する。これにより、SQEHPのサイクルカウンタを初期値にシフトするように、他の拡張ポインタもシフトさせることができる。
【0120】
減算後のSQEHP(すなわち、SQEHP-(j+2,0))の拡張ポインタは、EP(0,SIZEn-2)となる。減算後のSQEHPは、初期値のサイクルカウンタを含む。
【0121】
減算後のSQHHP223-n(すなわち、SQHHP-(j+2,0))の拡張ポインタにおいて、サイクルカウンタは、アンダーフロー(すなわち、EP(-2,k+2))となる。そのため、拡張ポインタが周ったときの逆処理として、サイクルカウンタにMAXCCが加算される。よって、減算後のSQHHP223-nは、EP(MAXCC-2,k+2)となる。なお、SQHHPはホスト2にあるので、メモリシステム3は把握していないため、実際にはこの演算は行われない。
【0122】
減算後のSQHP461-n(すなわち、SQHP-(j+2,0))の拡張ポインタは、アンダーフローするため、サイクルカウンタにMAXCCがさらに加算されることによって、EP(MAXCC-2,SIZEn-2)となる。
【0123】
減算後のSQTP4111-n(すなわち、SQTP-(j+2,0))の拡張ポインタは、アンダーフローするため、サイクルカウンタにMAXCCがさらに加算されることによって、EP(MAXCC-1,k)となる。
【0124】
そして、減算後のSQHTP224-n(すなわち、SQHTP-(j+2,2))の拡張ポインタは、アンダーフローするため、サイクルカウンタにMAXCCがさらに加算されることによって、EP(MAXCC-1,k+1)となる。なお、SQHTPはホスト2にあるので、メモリシステム3は把握していないため、実際にはこの演算は行われない。
【0125】
このように、第2の方法が適用された拡張ポインタは、ワープが無い、連続した拡張ポインタとなるため、拡張ポインタを直接的に比較計算することができる。そして、第2の方法が適用される拡張ポインタの最大値は、MAXCC-1であり、減算前と変わらない。そのため、第2の方法を適用しても、拡張ポインタのサイズは変わらない。
【0126】
以降の説明で二つ以上の拡張ポインタが比較される場合には、図10、11を参照して説明した、第1の方法または第2の方法が使用され得る。
【0127】
次に、フェッチコマンド管理テーブル464-nの構成例について説明する。図12は、実施形態に係るメモリシステム3において使用されるフェッチコマンド管理テーブル464-nの構成例を示す図である。ここでは、各コマンドに対応する拡張ポインタが管理される場合に使用されるフェッチコマンド管理テーブル464-nが示される。
【0128】
フェッチコマンド管理テーブル464-nは、サブミッションキュー221-nに対応する。フェッチコマンド管理テーブル464-nは、それぞれ一つのコマンドに対応するエントリを複数含む。フェッチコマンド管理テーブル464-nに含まれるエントリの個数は、例えば、MAXFN(タイムアウト時間TOnが経過する間にフェッチ可能なコマンド数の最大値)である。各エントリは、サブミッションキューエントリの内容と、拡張ポインタとを格納する。
【0129】
サブミッションキューエントリの内容は、対応するコマンドの内容を示す情報である。サブミッションキューエントリの内容は、例えば、コマンドの種類を示す情報、コマンドが指定する論理アドレス、コマンドID、CIDを含む。対応するコマンドがライトコマンドである場合、サブミッションキューエントリの内容は、例えば、ライトコマンドを示す情報と、ライトデータに対応する論理アドレス、ライトデータが格納されているRAM22上のアドレス、CID,などを含む。また、対応するコマンドがリードコマンドである場合、サブミッションキューエントリの内容は、例えば、リードコマンドを示す情報と、リードデータに対応する論理アドレス、リードデータが格納されるべきRAM22上のアドレス、CID,などを含む。
【0130】
拡張ポインタは、対応するコマンドが格納されていたサブミッションキュー221-nのスロットを示す。拡張ポインタは、そのコマンドをフェッチしたときのSQHP461-nと、サイクルカウンタと、を含む。このサイクルカウンタとして、SQTP4111-nがSQHP461-nよりも後ろのスロットを示す場合には、SQETP463-nに含まれるサイクルカウンタと同じ値が使用され、SQTP4111-nがSQHP461-nよりも前のスロットを示す場合には、SQETP463-nに含まれるサイクルカウンタから1だけ減算した値が使用される。
【0131】
コントローラ4は、サブミッションキュー221-nから一つのコマンドをフェッチすると、フェッチコマンド管理テーブル464-nに含まれる複数のエントリのうち、一つの空きエントリを選択する。そして、コントローラ4は、フェッチしたコマンドに関連する、サブミッションキューエントリの内容と拡張ポインタとを選択したエントリに格納する。そして、SQHPを一つ進める。
【0132】
コントローラ4は、フェッチしたコマンドの処理が完了すると、そのコマンドに対応するフェッチコマンド管理テーブル464-nのエントリを無効化する。コントローラ4は、フェッチコマンド管理テーブル464-nのエントリを無効化する際に、そのエントリの内容を削除する。あるいは、コントローラ4は、フェッチコマンド管理テーブル464-nのエントリが有効であるか否かを示す情報を各エントリ中に持ち、無効を示す値に更新することによって、そのエントリを無効にし、新たなコマンドに関する情報を格納可能な状態に設定してもよい。そのため、フェッチコマンド管理テーブル464-nの有効なエントリは、フェッチ済みで且つ処理が未完了なコマンドに対応する。以降では、無効化された際に、フェッチコマンド管理テーブル464-nのエントリに格納されている情報が削除される場合について説明する。
【0133】
次に、タイムスロット管理テーブル471-nの構成例について説明する。図13は、実施形態に係るメモリシステム3において使用されるタイムスロット管理テーブル471-nの構成例を示す図である。
【0134】
タイムスロット管理テーブル471-nは、サブミッションキュー221-nに対応する。タイムスロット管理テーブル471-nは、それぞれが一つのタイムスロットに対応するエントリを複数含む。タイムスロット管理テーブル471-nは、例えば、タイムアウト時間TOnがMn×Tnで表される場合、(Mn+1)個のエントリを有する。各エントリは、Tn毎のSQETP463-nを格納する。各エントリの初期値は、例えば、拡張ポインタの初期値である。拡張ポインタの初期値は、例えば、0を示すサイクルカウンタと、スロットSLT0を示すポインタとを含む。
【0135】
コントローラ4は、例えば、動作の開始からTnが経過すると、行番号0のエントリを先頭のタイムスロットTSn,1に対応する拡張ポインタが格納されるべきエントリとして選択する。そして、あらかじめその選択されたエントリに格納されていた拡張ポインタを示す情報を一時的にSRAM46の第1EP465-nに退避した後、コントローラ4は、現在のSQETP463-nを行番号0のエントリに格納する。つまり、タイムスロット管理テーブル471-nのエントリに格納されるSQETP463-nは、このエントリに対応するタイムスロットの終端の時刻におけるSQETP463-nである。
【0136】
その後、Tnが経過する度に、コントローラ4は、新たなエントリを選択する。そして、コントローラ4は、その時刻おけるSQETP463-nを、その時刻におけるタイムスロットに対応する拡張ポインタとして、選択されたエントリに格納する。
【0137】
動作の開始から(Mn+1)×Tnが経過すると、コントローラ4は、行番号MnのエントリをタイムスロットTSn,Mn+1に対応する拡張ポインタが格納されるべきエントリとして選択する。そして、あらかじめその選択されたエントリに格納されていた拡張ポインタを示す情報を一時的にSRAM46の第1EP465-nに退避した後、コントローラ4は、現在のSQETP463-nを行番号Mnのエントリに格納する。ここで、SRAM46に退避される拡張ポインタは、初期値である。
【0138】
また、動作の開始から(Mn+1)×Tnが経過したとき、先頭のタイムスロットTSn,1の終端の時刻からタイムアウト時間TOn(=Mn×Tn)が経過している。このとき、コントローラ4は、タイムスロットTSn,1をタイムアウト対象のタイムスロットに指定する。また、タイムアウト時間の係数がMnであり、且つタイムスロット管理テーブル471-nに含まれるエントリの数がMn+1である場合に、動作の開始から(Mn+1)×Tnが経過した以降では、コントローラ4は、新たにSQETP463-nが格納されたエントリの次のエントリがタイムアウト対象のタイムスロットに対応するエントリであると判定してもよい。
【0139】
そして、コントローラ4は、SRAM46に退避された拡張ポインタであるタイムアウト対象のタイムスロットの一つ前のタイムスロットに対応する拡張ポインタ(以降第1拡張ポインタ(EP)と称する)と、タイムアウト対象のタイムスロットに対応するエントリからタイムアウト対象のタイムスロットに対応する拡張ポインタ(以降第2拡張ポインタ)とを取得する。コントローラ4は、例えば、第1拡張ポインタと、第2拡張ポインタとが異なる場合に、タイムアウト対象のタイムスロットに対応するコマンドを探索する。タイムアウト対象のタイムスロットに対応するコマンドは、第1拡張ポインタが示すスロットから、第2拡張ポインタが示すスロットの一つ前のスロットまでの範囲に含まれるスロットに格納されていたコマンドである。
【0140】
また、第1拡張ポインタと、第2拡張ポインタが同じである場合、タイムアウト対象のタイムスロットの間にコマンドが発行されていない。そのため、コントローラ4は、タイムアウト処理が不要であると判定する。
【0141】
次に、時刻がS×Tn(Sは、Mn+1より大きい整数)まで進んだ時のタイムスロット管理テーブル473-nの構成例について説明する。図14は、実施形態に係るメモリシステム3において使用されるタイムスロット管理テーブル473-nの第1の状態の例を示す図である。
【0142】
図14において、行番号0に対応するエントリは、タイムスロットTSn,S-2に対応し、時刻(S-2)×TnのSQETP463-nを格納している。
【0143】
行番号1に対応するエントリは、タイムスロットTSn,S-1に対応し、時刻(S-1)×TnのSQETP463-nを格納している。
【0144】
行番号2に対応するエントリは、タイムスロットTSn,Sに対応し、時刻S×Tnの時のSQETP463-nを格納している。
【0145】
行番号3に対応するエントリは、タイムスロットTSn,S-Mnに対応し、時刻(S-Mn)×TnのSQETP463-nを格納している。
【0146】
行番号4に対応するエントリは、タイムスロットTSn,S-Mn+1に対応し、時刻(S-Mn+1)×TnのSQETP463-nを格納している。
【0147】
行番号Mn-1に対応するエントリは、タイムスロットTSn,S-4に対応し、時刻(S-4)×Tnの時のSQETP463-nを格納している。
【0148】
行番号Mnに対応するエントリは、タイムスロットTSn,S-3に対応し、時刻(S-3)×Tnの時のSQETP463-nを格納している。
【0149】
このとき、最新のタイムスロットに対応するエントリは、行番号2に対応するエントリである。そして、タイムアウト対象のタイムスロットは、TSn,S-Mnであり、タイムアウト対象のタイムスロットに対応するエントリは、行番号3に対応するエントリである。コントローラ4は、行番号3に対応するエントリに格納されている拡張ポインタを、第2EPとして取得する。また、コントローラ4は、タイムスロットTSn,Sに対応する拡張ポインタが行番号2に対応するエントリに格納される前に、行番号2に対応するエントリに格納されていたタイムスロットTSn,S-Mn―1の拡張ポインタを第1EPとして、SRAM46に退避させておく。
【0150】
コントローラ4は、第1EPと第2EPとが同じ値である場合に、タイムアウト対象のTSn,S-Mnの間に発行されたコマンドが無かったと判定する。また、第1EPと第2EPとが異なる値である場合、コントローラ4は、第1EPから第2EPの一つ前の拡張ポインタまでの範囲に含まれる拡張ポインタに対応するコマンドを特定し、特定したコマンドをアボートするタイムアウト処理を実行する。ある拡張ポインタが示す仮想的なサブミッションキューのスロットに格納されていた(あるいは格納されている)コマンドを、その拡張ポインタに対応するコマンドと称する。
【0151】
次に、タイムスロットTSn,S-Mnで一つのコマンドが発行された後、後続のコマンドが発行されずに時刻がS×Tnまで進んだ場合のタイムスロット管理テーブル471-nの構成例について説明する。図15は、実施形態に係るメモリシステム3において使用されるタイムスロット管理テーブル471-nの第2の状態の例を示す図である。
【0152】
図15において、行番号0に対応するエントリは、タイムスロットTSn,S-2に対応し、時刻(S-2)×TnのSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXであり、Xは、例えば、Cを示すサイクルカウンタと、Pを示すポインタとを含む。
【0153】
行番号1に対応するエントリは、タイムスロットTSn,S-1に対応し、時刻(S-1)×TnのSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXである。
【0154】
行番号2に対応するエントリは、時刻S×Tnで更新されるエントリである。更新前の行番号2に対応するエントリは、タイムスロットTSn,S-(Mn+1)に対応し、時刻(S-(Mn+1))×Tnの時のSQETP463-nが格納されている。更新前のエントリに格納されている拡張ポインタの値は、X-1である。X-1は、例えば、Cを示すサイクルカウンタと、(P-1)を示すポインタとを含む。行番号2に対応するエントリに格納されていた更新前の拡張ポインタは、エントリの更新の際に、SRAM46に一時的に格納される。更新後の行番号2に対応するエントリは、タイムスロットTSn,Sに対応し、時刻S×Tnの時のSQETP463-nが格納されている。更新後のエントリに格納されている拡張ポインタの値は、Xである。
【0155】
行番号3に対応するエントリは、タイムスロットTSn,S-Mnに対応し、時刻(S-Mn)×TnのSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXである。
【0156】
行番号4に対応するエントリは、タイムスロットTSn,S-Mn+1に対応し、時刻(S-Mn+1)×TnのSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXである。
【0157】
行番号Mn-1に対応するエントリは、タイムスロットTSn,S-4に対応し、時刻(S-4)×Tnの時のSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXである。
【0158】
行番号Mnに対応するエントリは、タイムスロットTSn,S-3に対応し、時刻(S-3)×Tnの時のSQETP463-nが格納されている。このエントリに格納されている拡張ポインタの値はXである。
【0159】
このとき、最新のタイムスロットに対応するエントリは、行番号2に対応するエントリである。そして、タイムアウト対象のタイムスロットは、TSn,S-Mnであり、タイムアウト対象のタイムスロットに対応するエントリは、行番号3に対応するエントリである。コントローラ4は、行番号3に対応するエントリに格納されている拡張ポインタを、第2EPとして取得する。また、コントローラ4は、更新前の行番号2に対応するエントリに格納されていた拡張ポインタを第1EPとして、SRAM46から取得する。この第1EPは、タイムスロットTSn,S-(Mn+1)に対応する。コントローラ4は、第1EPから第2EPの一つ前の拡張ポインタまでの範囲に含まれる拡張ポインタに対応するコマンドをタイムアウト対象のコマンドであると判定する。ここで、第1EPの値はX-1であり、第2EPの値がXであることから、X-1(つまり第1EP)に対応する一つのコマンドがタイムスロットTSn,S-(Mn+1)に対応するコマンドである。第1EPに対応する一つのコマンドのみが、タイムアウト処理の対象になり得るコマンドである。
【0160】
コントローラ4は、フェッチコマンド管理テーブル462-nに格納されている拡張ポインタのうち、第1EP以上第2EPの一つ前のEP以下のEPが存在するか否かを判定する。ここでは、コントローラ4は、第1EP以上第2EPの一つ前のEP以下のEPに対応するコマンドに関する情報が、フェッチコマンド管理テーブル464-nに格納されているか否かを判定する。フェッチコマンド管理テーブル464-nに情報が格納されているコマンドは、サブミッションキュー221-nからフェッチ済み、且つ処理が未完了のコマンドである。そのため、コントローラ4は、該当するコマンドに対してタイムアウト処理を実行する。これにより、コントローラ4は、該当するコマンドをアボートする。アボートされたコマンドは、処理が中断され、アボートされたことを示す情報を含む完了応答がホスト2に発行される。
【0161】
また、EPに対応するコマンドが未だサブミッションキュー221-nに格納されている場合、コントローラ4は、該当するコマンドをフェッチする。そして、コントローラ4は、フェッチしたコマンドをアボートする。EPが現在のSQHPに対応する拡張ポインタ以上の場合に、コントローラ4は、EPに対応するコマンドが未だサブミッションキュー221-nに格納されており、サブミッションキュー221-nにタイムアウト対象のコマンドが格納されていると判定する。なお、EPを、第1EPから一つずつ進めて調べていく場合、あるところで、現在のSQHPに対応する拡張ポインタになった場合、以後は第2EPの一つ前のEPまで全てサブミッションキュー221-nに格納されていることになるので、判定は繰り返さなくてよい。
【0162】
次に、タイムアウト対象のタイムスロットに対応するコマンドを探索する方法として、フェッチコマンド管理テーブル464-0、…、464-vにおいて、コマンドと、タイムスロットを示す情報との間の対応関係が管理されている場合について説明する。図16は、実施形態に係るメモリシステム3において使用されるフェッチコマンド管理テーブル464-nの変形例を示す図である。ここでは、フェッチコマンド管理テーブル464-nの複数のエントリの各々に、各コマンドに対応する、タイムスロットに対応するタイムスロット管理テーブル471-nの行番号が格納されている。
【0163】
フェッチコマンド管理テーブル464-nは、サブミッションキュー221-nに対応する。フェッチコマンド管理テーブル464-nは、それぞれ一つのコマンドに対応する、エントリを複数含む。フェッチコマンド管理テーブル464-nに含まれるエントリの個数は、例えば、MAXFNである。各エントリは、サブミッションキューエントリの内容と、タイムスロット管理テーブル471-nの行番号とを格納する。
【0164】
サブミッションキューエントリの内容は、対応するコマンドの内容を示す情報である。
【0165】
タイムスロット管理テーブル471-nの行番号は、対応するコマンドがサブミッションキュー221-nに発行された時刻が含まれるタイムスロットに対応するタイムスロット管理テーブル471-nの行番号を示す情報である。
【0166】
コントローラ4は、サブミッションキュー221-nから一つのコマンドをフェッチすると、フェッチコマンド管理テーブル464-nの複数のエントリのうち、一つの空きエントリを選択する。コントローラ4は、選択したエントリに、フェッチしたコマンドを対応付ける。
【0167】
コントローラ4は、対応付けたエントリに、フェッチされたコマンドの内容を示す情報と、タイムスロット管理テーブル471-nの行番号とを格納する。ここで、コントローラ4は、格納したタイムスロット管理テーブル471-nの行番号を起動中に保持し、その初期値は、タイムスロット管理テーブル471-nの行のうち、最初に書き込まれる行番号である。この行番号は、コントローラ4が、後続するコマンドをフェッチした際に、タイムスロット管理テーブル471-nの行番号を特定するために使用する。具体的には、コントローラ4は、フェッチしたコマンドに対応する拡張ポインタが、保持しているタイムスロット管理テーブル471-nの行番号に対応する拡張ポインタよりも小さいか否かを判定する。フェッチしたコマンドに対応する拡張ポインタが、保持しているタイムスロット管理テーブル471-nの行番号に対応する拡張ポインタよりも小さい場合、コントローラ4は、フェッチしたコマンドが前回フェッチされたコマンドと同じタイムスロットに対応すると判定する。そして、コントローラ4は、保持しているタイムスロット管理テーブル471-nの行番号を、対応付けたエントリに格納する。フェッチしたコマンドに対応する拡張ポインタが、保持しているタイムスロット管理テーブル471-nの行番号に対応する拡張ポインタである場合、コントローラ4は、保持しているタイムスロット管理テーブル471-nの行番号に1を加えた行番号に対応する拡張ポインタを取得し、再度フェッチしたコマンドに対応する拡張ポインタと比較する。コントローラ4は、フェッチされたコマンドに対応する拡張ポインタが、タイムスロット管理テーブル471-nの行番号に対応する拡張ポインタよりも小さくなるまで続けて、この条件が満たされたときのタイムスロット管理テーブル471-nの行番号の一つ前の行番号を対応付けたエントリに格納し、また保持しているタイムスロット管理テーブル471-nの初期値の行番号を更新する。
【0168】
コントローラ4は、フェッチしたコマンドの処理が完了すると、そのコマンドに対応するフェッチコマンド管理テーブル464-nのエントリを無効化する。そのため、フェッチコマンド管理テーブル464-nの有効なエントリは、フェッチ済みで且つ処理が未完了なコマンドに対応する。
【0169】
このようなフェッチコマンド管理テーブル464-nを使用することにより、拡張ポインタが各エントリに格納される場合と比べて、フェッチコマンド管理テーブル464-nのために必要とされる記憶領域のサイズを減らすことができる。これは、タイムスロット管理テーブル471-nの行番号を示すフィールドのサイズが、拡張ポインタのフィールドのサイズよりも小さいためである。また、コントローラ4は、タイムアウト対象のコマンドを特定する場合に、各コマンドに対応するEPが、第1EP以上第2EPの一つ前のEP以下の範囲にあるか否かを判定するのではなく、各コマンドに対応する行番号がタイムアウト対象のタイムスロットに対応する行番号と一致するか否かを判定する。そのため、コントローラ4は、先に説明した第1の方法や第2の方法を使用した拡張ポインタの比較を実行する必要がないため、より高速にタイムアウト処理を実行することができる。
【0170】
ただし、このようなフェッチコマンド管理テーブル464-nを使用する場合には、コントローラ4は、コマンドをフェッチする度に、拡張ポインタをタイムスロット管理テーブル471-nの行番号に変換することが必要とされる。そのため、タイムスロット管理テーブル471-nへのアクセス回数の増加、および前回フェッチされたコマンドに対応するタイムスロット管理テーブル471-nの行番号を一時的に保持することなどによって、コマンドフェッチ処理に必要とされるリソースが増加し得る。
【0171】
次に、仮想的なサブミッションキュー221-nの複数のスロットそれぞれに対応するタイムスロットを明示して説明する。図17は、実施形態に係るメモリシステム3において管理される仮想的なサブミッションキューと、複数のタイムスロットとの間の関係の例を示す図である。
【0172】
SQ拡張ヘッドポインタ(SQEHP)は、EP(j+2,SIZEn-2)を示す。EHPは、フェッチ済みで且つ処理が未完了なコマンドが対応している可能性がある仮想的なスロットのうちの先頭のスロットを示すが、EHPの指すスロットのコマンド自体は、フェッチ済みでかつ未完了であり、その先のスロットのコマンドはフェッチは済んでいるが、完了しているものと、完了していないものの両方がある可能性がある。EHPの指すスロットのコマンドが完了すると、EHPは、次のフェッチ済みで未完了のコマンドに対応するスロットを指すEPに更新される。フェッチ済みで未完了のコマンドが無くなった場合は、SQHPと同じ場所まで進む。ここで、あらたにコマンドがフェッチされると、SQHPのみが進み、EHPは再びフェッチ済みで未完了のコマンドに対応するスロットを示す。
【0173】
SQホストヘッドポインタ(SQHHP)は、EP(j,k+2)に対応する。SQHHPは、ホスト2が管理しているSQHPである。SQHHPは、RAM22上のサブミッションキュー221-nに対応する記憶領域のうち、ホスト2がまだデータを保持していなければならない一番古いスロットの記憶位置を示す。
【0174】
SQヘッドポインタ(SQHP)は、EP(j,SIZEn-2)に対応する。SQHPは、コントローラ4が管理しているSQHPである。HPは、次にフェッチされるべきコマンドが格納されているスロットを示す。
【0175】
SQ拡張テールポインタ(SQETP)は、EP(j+1,k)を示す。SQETPは、コントローラ4が管理しているSQTPに対応する拡張ポインタである。SQETPは、次に発行されるコマンドが格納されるべきスロットを示す。そのため、コントローラ4から見て、SQETPが示すスロットの一つ前のスロットは、最新のコマンドが格納されたスロットである。
【0176】
SQホストテールポインタ(SQHTP)は、EP(j+1,k+1)に対応する。SQHTPは、ホスト2が管理しているSQTPであり、次に発行されるコマンドが格納されるスロットを示す。SQHTPが、SQHHPが示すスロットの一つ前のスロットを示しているため、ホスト2から見たサブミッションキュー221-nは、フル状態である。そのため、図17におけるSQHTPは、フル状態のサブミッションキュー221-nの複数のスロットのうちの、コマンドが格納されていないスロットを示している。
【0177】
タイムスロットTSn,N-Mnは、時刻(t+(N-Mn-1))×Tnが経過してから時刻(t+(N-Mn))×Tnまでの時間範囲である。タイムスロットTSn,N-Mnに対応するコマンドは、EP(j+2,SIZEn-2)からEP(j+3,k-1)までの範囲に含まれるスロットに格納されたコマンドである。
【0178】
タイムスロットTSn,N-Mn+1は、時刻(t+(N-Mn))×Tnが経過してから時刻(t+(N-Mn+1))×Tnまでの時間範囲である。タイムスロットTSn,N-Mn+1に対応するコマンドは、EP(j+3,k)からEP(j+3,SIZEn-2)までの範囲に含まれるスロットに格納されたコマンドである。
【0179】
タイムスロットTSn,N-Mn+2は、時刻(t+(N-Mn+1))×Tnが経過してから時刻(t+(N-Mn+2))×Tnまでの時間範囲である。タイムスロットTSn,N-Mn+2に対応するコマンドのうち、最初に発行されたコマンドは、EP(j+3,SIZEn-1)が示すスロットに格納されたコマンドである。
【0180】
そして、タイムスロットTSn,K-9は、時刻(t+(K-10))×Tnが経過してから時刻(t+(K-9))×Tnまでの時間範囲である。タイムスロットTSn,K-9に対応するコマンドのうち、最後に発行されたコマンドは、EP(MAXCC-2,0)が示すスロットに格納されたコマンドである。
【0181】
タイムスロットTSn,K-8に対応する時間範囲では、コマンドが発行されていない。そのため、図17において、タイムスロットTSn,K-8に対応するEPは存在しない。
【0182】
タイムスロットTSn,K-7は、時刻(t+(K-8))×Tnが経過してから時刻(t+(K-7))×Tnまでの時間範囲である。タイムスロットTSn,K-7に対応するコマンドは、EP(MAXCC-2,1)からEP(MAXCC-2,k+1)までの範囲に含まれるスロットに格納されたコマンドである。
【0183】
タイムスロットTSn,K-6に対応する時間範囲では、コマンドが発行されていない。そのため、図17において、タイムスロットTSn,K-6に対応するEPは存在しない。
【0184】
タイムスロットTSn,K-5は、時刻(t+(K-6))×Tnが経過してから時刻(t+(K-5))×Tnまでの時間範囲である。タイムスロットTSn,K-5に対応するコマンドは、EP(MAXCC-2,k+2)からEP(MAXCC-1,1)までの範囲に含まれるスロットに格納されたコマンドである。
【0185】
タイムスロットTSn,K-4は、時刻(t+(K-5))×Tnが経過してから時刻(t+(K-4))×Tnまでの時間範囲である。タイムスロットTSn,K-4に対応するコマンドは、EP(MAXCC-1,2)からEP(MAXCC-1,k+3)までの範囲に含まれるスロットに格納されたコマンドである。
【0186】
タイムスロットTSn,K-3は、時刻(t+(K-4))×Tnが経過してから時刻(t+(K-3))×Tnまでの時間範囲である。タイムスロットTSn,K-3に対応するコマンドは、EP(MAXCC-1,SIZEn-3)からEP(0,k)までの範囲に含まれるスロットに格納されたコマンドである。
【0187】
タイムスロットTSn,K-2は、時刻(t+(K-3))×Tnが経過してから時刻(t+(K-2))×Tnまでの時間範囲である。タイムスロットTSn,K-2に対応するコマンドは、EP(0,k+1)からEP(1,0)までの範囲に含まれるスロットに格納されたコマンドである。
【0188】
タイムスロットTSn,K-1は、時刻(t+(K-2))×Tnが経過してから時刻(t+(K-1))×Tnまでの時間範囲である。タイムスロットTSn,K-1に対応するコマンドは、EP(1,1)からEP(1,SIZEn-3)までの範囲に含まれるスロットに格納されたコマンドである。
【0189】
タイムスロットTSn,Kは、時刻(t+(K-1))×Tnが経過してから時刻(t+K)×Tnまでの時間範囲である。タイムスロットTSn,Kに対応するコマンドのうち、最初に発行されたコマンドは、EP(1,SIZEn-2)が示すスロットに格納されたコマンドである。
【0190】
そして、タイムスロットTSn,N-2は、時刻(t+(N-3))×Tnが経過してから時刻(t+(N-2))×Tnまでの時間範囲である。タイムスロットTSn,N-2に対応するコマンドのうち、最後に発行されたコマンドは、EP(j,1)が示すスロットに格納されたコマンドである。
【0191】
タイムスロットTSn,N-1は、時刻(t+(N-2))×Tnが経過してから時刻(t+(N-1))×Tnまでの時間範囲である。タイムスロットTSn,N-1に対応するコマンドは、EP(j,2)からEP(j,SIZEn-1)までの範囲に含まれるスロットに格納されたコマンドである。
【0192】
タイムスロットTSn,Nは、時刻(t+(N-1))×Tnが経過してから時刻(t+N)×Tnまでの時間範囲である。タイムスロットTSn,Nに対応するコマンドは、EP(j+1,0)からEP(j+1,k-1)までの範囲に含まれるスロットに格納されたコマンドである。
【0193】
図示していないタイムスロットTSn,N+1は、時刻(t+N)×Tnが経過してから時刻(t+N+1)×Tnまでの時間範囲である。もし、ホスト2が、EP(j+1,k+1)にあるSQHTPの値をSQTPドアベルレジスタに時刻(t+N+1)×Tnまでに書きこむと、EP(j+1,k)が含むコマンドが、タイムスロットTSn,N+1に対応するコマンドとなる。ドアベルレジスタへの書き込みが遅れれば、その時刻に応じたタイムスロットに対応するコマンドになる。
【0194】
次に、タイムアウト処理におけるコマンドの探索について説明する。図18は、実施形態に係るメモリシステム3における、発行済みのコマンドの管理の例を示す図である。図18では説明のために、フェッチコマンド管理テーブル464-nの各エントリについて、タイムスロット管理テーブル471-nの行番号LNと、拡張ポインタEPとの両方が示されている。行番号LN(N)は、タイムスロットTSn,Nに対応するタイムスロット管理テーブル471-nのエントリを示す行番号である。フェッチコマンド管理テーブル464-nのエントリに格納されている拡張ポインタEP(X)は、仮想的なサブミッションキュー221-nのスロットSLT Xを示す拡張ポインタである。フェッチコマンド管理テーブル464-nのエントリは、行番号と、拡張ポインタとのいずれか一方を保持していればよい。また、図18で使用されている行番号の代わりに、タイムスロットを示すタイムスロット番号が使用されてもよいし、拡張ポインタの代わりに、仮想的なサブミッションキュー221-nのスロットを示すスロット番号が使用されてもよい。
【0195】
図18において、タイムスロット管理テーブル471-nは、Mn+1個のエントリを有する。タイムスロット管理テーブル471-nのエントリに格納されている拡張ポインタEP(N)は、タイムスロットTSn,Nの終端の時刻におけるSQETP463-nである。
【0196】
タイムスロット管理テーブル471-nの更新前の0行目のエントリは、タイムスロットTSn,N-1に対応する。更新前の0行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,N-1の終端の時刻におけるSQETP463-nを示すEP(N-1)である。EP(N-1)は、仮想的なサブミッションキュー221-nのスロットSLT X-3を示す。また、更新後の0行目のエントリは、タイムスロットTSn,N+Mnに対応する。更新後の0行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,N+Mnの終端の時刻におけるSQETP461-nを示すEP(N+Mn)である。EP(N+Mn)は、仮想的なサブミッションキュー221-nのスロットSLT Zを示す。
【0197】
1行目のエントリは、タイムスロットTSn,Nに対応する。1行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,Nの終端の時刻におけるSQETP461-nを示すEP(N)である。EP(N)は、仮想的なサブミッションキュー221-nのスロットSLT Xを示す。
【0198】
2行目のエントリは、タイムスロットTSn,N+1に対応する。2行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,N+1の終端の時刻におけるSQETP463-nを示すEP(N+1)である。3行目のエントリは、タイムスロットTSn,N+2に対応する。3行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,N+2の終端の時刻におけるSQETP463-nを示すEP(N+2)である。3行目のエントリは、タイムスロットTSn,N+2に対応する。
【0199】
そして、Mn行目のエントリは、タイムスロットTSn,N+Mn-1に対応する。Mn行目のエントリに格納されている拡張ポインタは、タイムスロットTSn,N+Mn-1の終端の時刻におけるSQETP463-nを示すEP(N+Mn-1)である。
【0200】
フェッチコマンド管理テーブル464-nは、サブミッションキュー221-nからフェッチ済みで且つ処理が未完了なコマンドに関する情報を保持する。ここでは、フェッチコマンド管理テーブル464-nのエントリに格納され得る、タイムスロット管理テーブル471-nの行番号と、拡張ポインタの両方について説明する。
【0201】
フェッチコマンド管理テーブル464-nの一つ目のエントリに対応するコマンドは、リードコマンドである。フェッチデータには、リードコマンドであることを示す情報と、LBA GからLBA HまでのLBA範囲とが含まれる。一つ目のエントリは、タイムスロットTSn,N+5に対応するタイムスロット管理テーブル471-nの行番号である行番号LN(N+5)、あるいは仮想的なサブミッションキュー221-nのスロットSLT X+3を示す拡張ポインタEP(X+3)のいずれかを保持する。
【0202】
フェッチコマンド管理テーブル464-nの二つ目のエントリに対応するコマンドは、リードコマンドである。フェッチデータには、リードコマンドであることを示す情報と、LBA AからLBA Bまでの論理アドレス範囲とが含まれる。二つ目のエントリは、タイムスロットTSn,Nに対応するタイムスロット管理テーブル471-nの行番号である行番号LN(N)、あるいは仮想的なサブミッションキュー221-nのスロットSLT X-3を示す拡張ポインタEP(X-3)のいずれかを保持する。
【0203】
フェッチコマンド管理テーブル464-nの三つ目のエントリに対応するコマンドは、ライトコマンドである。フェッチデータには、ライトコマンドであることを示す情報と、LBA CからLBA Dまでの論理アドレス範囲とが含まれる。三つ目のエントリは、タイムスロットTSn,Nに対応するタイムスロット管理テーブル471-nの行番号である行番号LN(N)、あるいは仮想的なサブミッションキュー221-nのスロットSLT X-1を示す拡張ポインタEP(X-1)のいずれかを保持する。
【0204】
フェッチコマンド管理テーブル464-nの四つ目のエントリに対応するコマンドは、ライトコマンドである。フェッチデータには、ライトコマンドであることを示す情報と、LBA EからLBA Fまでの論理アドレス範囲とが含まれる。四つ目のエントリは、タイムスロットTSn,N+2に対応するタイムスロット管理テーブル471-nの行番号である行番号LN(N+2)、あるいは仮想的なサブミッションキュー221-nのスロットSLT X+1を示す拡張ポインタEP(X+1)のいずれかを保持する。
【0205】
また、スロットSLT X-3からSLT Zまでの複数のスロットは、拡張ポインタによって示される仮想的なサブミッションキュー221-nのスロットである。
【0206】
スロットSLT X-3は、タイムスロットTSn,N-1に対応する拡張ポインタEP(N-1)によって示されるスロットであり、サブミッションキュー221-nからフェッチ済みで且つ処理が未完了なコマンドの先頭の仮想的スロットで、以後はフェッチ済みでかつ未完了なコマンドが対応する可能性がある仮想的なスロットである。つまり、以後には完了済みのコマンドが対応する可能性がある仮想的なスロットでもある。
【0207】
スロットSLT Xは、タイムスロットTSn,Nに対応する拡張ポインタEP(N)によって示されるスロットである。
【0208】
スロットSLT Yは、SQHP461-nによって示されるスロットである。
【0209】
スロットSLT Zは、SQTP4111-nおよびタイムスロットTSn,N+Mnに対応する拡張ポインタEP(N+Mn)によって示されるスロットである。この図の時点ではSQTPが指しているスロットであるため、まだメモリシステム3からみると空の状態である。
【0210】
タイムスロットTSn,N+Mnの終端の時刻において、コントローラ4は、タイムスロットTSn,Nをタイムアウト対象のタイムスロットに指定する。コントローラ4は、タイムスロットTSn,Nに対応するコマンドのうち、処理が未完了のコマンドに対してタイムアウト処理を実行する。
【0211】
まず、フェッチコマンド管理テーブル464-nに格納されている拡張ポインタを使用して、タイムアウト対象のコマンドを特定する場合について説明する。コントローラ4は、タイムアウト対象のタイムスロットTSn,Nよりも一つ前のタイムスロットTSn,N-1に対応する退避していた拡張ポインタEP(N-1)と、タイムアウト対象のタイムスロットTSn,Nに対応する拡張ポインタEP(N)とを取得する。そして、コントローラ4は、取得した拡張ポインタEP(N)および拡張ポインタEP(N-1)を用いて、タイムアウト対象のコマンドを特定する。
【0212】
コントローラ4は、処理が未完了なコマンドが対応している可能性がある仮想的なスロットの範囲を特定する。この範囲は、拡張ポインタEP(N-1)から、拡張ポインタEP(N)の一つ前のスロットまでである。つまり、スロットSLT X-3からスロットSLT X-1までである。
【0213】
次いで、コントローラ4は、フェッチコマンド管理テーブル464-nに格納されている拡張ポインタのうち、スロットSLT X-3からスロットSLT X-1までの範囲に含まれるスロットを示している拡張ポインタを特定する。これにより、コントローラ4は、スロットSLT X-3を示す拡張ポインタEP(X-3)を格納している二つ目のエントリと、スロットSLT X-1を示す拡張ポインタEP(X-1)を格納している三つ目のエントリと、に対応するコマンドがタイムアウト対象のコマンドであると特定する。なお、場合によっては、EP(N)がSQHPより後であることもある。この場合は、SQHPからEP(N)の一つ前までのスロットに対応するコマンドもタイムアウト対象のコマンドであり、フェッチしてただちにアボートする。これは、フェッチコマンド管理テーブル464-nがフルになった状態で、サブミッションキュー221-nにあるコマンドがフェッチできないままタイムアウトに達した場合に発生する。このとき、先にフェッチコマンド管理テーブル464-n中のコマンドをアボートしているので、フェッチコマンド管理テーブル464-nには空きが生じているため、アボート処理のため新たにフェッチすることが可能になっている。
【0214】
一方、コントローラ4は、タイムアウト対象のコマンドを特定する際に、フェッチコマンド管理テーブル464-nに格納されているタイムスロット番号管理テーブル471-nの行番号を使用してもよい。この場合、コントローラ4は、タイムアウト対象のタイムスロットがTSn,Nであると特定すると、フェッチコマンド管理テーブル464-nの複数のエントリのうち、タイムスロットTSn,Nに対応する行番号LN(N)を格納しているエントリを特定する。そして、コントローラ4は、特定したエントリに対応するコマンドに対して、タイムアウト処理を実行する。これにより、コントローラ4は、行番号LN(N)を格納している、二つ目のエントリと、三つ目のエントリとに対応するコマンドがタイムアウト対象のコマンドであると特定する。なお、この場合でもEP(N)がSQHPより後の場合は、SQHPからEP(N)の一つ前までのスロットに格納されているコマンドに対しては、前述同様、フェッチしてアボートすることが必要となる。
【0215】
次に、複数のサブミッションキューに対するタイムアウト処理のタイミングの制御について説明する。図19は、実施形態に係るメモリシステム3における、タイムアウト処理のタイミングの例を示す図である。ここで、サブミッションキュー221-0、およびサブミッションキュー221-1の二つのサブミッションキューそれぞれに対するタイムアウト処理が実行される場合を想定する。
【0216】
まず、コントローラ4は、時間T0が経過する毎に、サブミッションキュー221-0を介して発行されたコマンドのうち、タイムアウト対象のコマンドが存在するか否かを判定する。
【0217】
また、コントローラ4は、時間T1が経過する毎に、サブミッションキュー221-1を介して発行されたコマンドのうち、タイムアウト対象のコマンドが存在するか否かを判定する。
【0218】
時間T0およびT1のそれぞれは、タイマ43の刻み時間Tcの整数倍で設定される。例えば、コントローラ4は、時間T0を2×Tcとし、時間T1を4×Tcとする。この場合、コントローラ4は、サブミッションキュー221-0に対するタイムアウト処理が実行される頻度を、サブミッションキュー221-1に対するタイムアウト処理が実行される頻度の二倍にすることができる。またさらに、サブミッションキュー221-0におけるタイムスロットの長さは、サブミッションキュー221-1におけるタイムスロットの長さの半分になる。
【0219】
コントローラ4は、サブミッションキュー221-0を介して発行されたコマンドのタイムアウト時間TO0を、M0×T0とする。M0は、例えば、1以上の整数である。そのため、タイムアウト時間TO0も、刻み時間Tcの整数倍となる。また、コントローラ4は、サブミッションキュー221-1を介して発行されたコマンドのタイムアウト時間TO1を、M1×T1とする。M1は、例えば、1以上の整数である。そして、タイムアウト時間TO1も、刻み時間Tcの整数倍となる。
【0220】
また、コントローラ4は、時間T0およびT1の起算のタイミングをTcの単位でずらしてもよい。例えば、コントローラ4は、サブミッションキュー221-0における時間T0のカウントを開始してからTcが経過した後に、サブミッションキュー221-1における時間T1のカウントを開始する。これにより、コントローラ4は、サブミッションキュー221-0に対するタイムアウト処理と、サブミッションキュー221-1に対するタイムアウト処理とを異なる時刻に実行されるように設定することができる。
【0221】
図19では、時間T0を2×Tc、時間T1を4×Tcに設定し、時間T0を0×Tcで起算し、時間T1を1×Tcで起算する場合のタイムアウト処理のタイミングが示されている。
【0222】
サブミッションキュー221-0については、時刻0×Tcで時間T0のカウントが開始される。そして、コントローラ4は、時刻2×Tc、4×Tc、6×Tc、8×Tc、および10×Tcでタイムアウト処理を実行する。
【0223】
サブミッションキュー221-1については、時刻1×Tcで時間T1のカウントが開始される。そして、コントローラ4は、時刻5×Tc、および9×Tcでタイムアウト処理が実行される。
【0224】
このように、複数のサブミッションキュー221-0、…、221-vのそれぞれについて、異なる時間T0、…、Tvを設定することで、コントローラ4は、各サブミッションキューに対してタイムアウト処理を実行する時間間隔を設定することができる。これにより、コントローラ4は、設定される時間により、同じ時刻に複数のサブミッションキューに対するタイムアウト処理が集中する可能性を減らすことができる。
【0225】
次に、コマンド処理の流れについて説明する。図20は、実施形態に係るメモリシステム3とホスト2とにおいて実行される、コマンド処理の手順の例を示すシーケンス図である。ここでは、サブミッションキュー221-nと、コンプリーションキュー222-mとを介して、ホスト2とメモリシステム3とが、コマンドおよび完了応答を送受信する場合を想定する。ホスト2は、メモリシステム3に送信されるべきコマンドが準備できたことに応じて、コマンド処理を開始する。
【0226】
まず、ホスト2は、準備したコマンドをサブミッションキュー221-nに格納する(ステップS101)。このとき、ホスト2は、SQHTP224-nによって示されるスロットにコマンドを格納することによって、コマンドを発行する。
【0227】
ホスト2は、SQHTP224-nを更新する。(ステップS102)。これにより、ホスト2は、SQHTP224-nを、S101で発行されたコマンドの数だけインクリメントする。
【0228】
ホスト2は、サブミッションキューテールドアベルレジスタであるSQTP4111-nを更新する(ステップS103)。ホスト2は、SQTP4111-nを、S102で更新されたSQHTP224-nの値に設定する。
【0229】
メモリシステム3は、SQETP463-nを更新する(ステップS104)。S103で更新されたSQTP4111-nが更新前のSQTP4111-nよりも小さい値である場合、メモリシステム3は、SQETP463-nに含まれるサイクルカウンタを1だけインクリメントする。そして、メモリシステム3は、S103で更新されたSQTP4111-nを使用して、SQETP463-nを更新する。
【0230】
メモリシステム3は、サブミッションキュー221-nからコマンドをフェッチする(ステップS105)。具体的にはSQHP461-nが指すスロットの内容を読み出す。メモリシステム3は、S103で更新されたSQTP4111-nと、SQHP461-nとの差分から、サブミッションキュー221-nに格納されている未フェッチコマンドの数を特定する。またサブミッションキュー221-nに対応するフェッチコマンド管理テーブル464-nの無効なエントリの数を特定する。そして特定した未フェッチコマンドの数が無効なエントリの数より多い場合は、無効なエントリの数のコマンドを、そうでない場合は未フェッチコマンドの数のコマンドをフェッチする。この時フェッチできなかったコマンドは、無効なエントリが生じた後にフェッチする。
【0231】
メモリシステム3は、S105でフェッチされたコマンドに関する情報を格納するように、フェッチコマンド管理テーブル464-nを更新する(ステップS106)。メモリシステム3は、例えば、フェッチされたコマンドの内容と、フェッチされたコマンドが格納されていたサブミッションキュー221-nのIDと、のフェッチされたコマンドが格納されていたサブミッションキュー221-nのスロットに記載されていたCIDと、そのスロットを示す拡張ポインタとを、フェッチコマンド管理テーブル464-nに格納する。あるいは、フェッチされたコマンドが格納されていたサブミッションキュー221-nのスロットを示す拡張ポインタの代わりに、フェッチされたコマンドに対応するタイムスロットを示す情報がフェッチコマンド管理テーブル464-nに格納されてもよい。
【0232】
メモリシステム3は、SQHP461-nを更新する(ステップS107)。メモリシステム3は、S105でフェッチされたコマンドの数だけ、SQHP461-nをインクリメントする。
【0233】
メモリシステム3は、S105でフェッチされたコマンドの処理を実行する(ステップS108)。
【0234】
S108で実行されているコマンドの処理が完了すると、メモリシステム3は、処理が完了したコマンドに対応する完了応答をホスト2に発行する(ステップS109)。完了応答は、更新された後、未だホスト2に通知されていないSQHPと、そのSQHPに対応するSQを示すサブミッションキューID、完了していたコマンドが発行されたサブミッションキューのIDと、そのコマンドのCID、Phase Tag Bitを含む。メモリシステム3は、ホスト2のコンプリーションキュー222-mに完了応答を格納する。
【0235】
メモリシステム3は、CQTP462-mを更新する(ステップS110)。
【0236】
メモリシステム3は、フェッチコマンド管理テーブル464-nを更新する(ステップS111)。メモリシステム3は、処理が完了したコマンドに対応するフェッチコマンド管理テーブル464-nのエントリを無効化する。
【0237】
メモリシステム3は、完了応答を発行したことを通知するための割り込みをホスト2に通知する(ステップS112)。割り込みは、S111で完了応答が格納されたコンプリーションキュー222-mを示すコンプリーションキューIDを含んでもよい。
【0238】
ホスト2は、S112で割り込みが通知されたことに応じて、完了応答を処理する(ステップS113)。ホスト2は、割り込みに含まれているコンプリーションキューIDが示すコンプリーションキューに格納されている完了応答の処理を実行する。割り込みにコンプリーションキューIDが含まれていない場合は、Phase Tag Bitの値と、CQHHPの値から空でないコンプリーションキューを特定し、そのキューに含まれる更新されたエントリを処理し完了応答を実行する。応答完了中に含まれる、コマンドが発行井されたサブミッションキューIDとCIDより、ステップS101で準備したコマンドが特定でき、その準備したコマンドの完了処理をする。
【0239】
ホスト2は、S113で処理された完了応答に含まれるサブミッションキューIDおよびSQHPに基づいて、ホスト2で管理されているSQHHPを更新する(ステップS114)。ホスト2は、SQHHPを、完了応答に含まれるSQHPの値に更新する。
【0240】
ホスト2は、CQHHP225-mを更新する(ステップS115)。ホスト2は、S113で処理された完了応答の数に基づいて、CQHHP225-mをインクリメントする。
【0241】
ホスト2は、メモリシステム3のコンプリーションキューヘッドドアベルレジスタにライトアクセスして、CQHP4112-mを更新する(ステップS116)。ホスト2は、CQHP4112-mを、S115で更新されたCQHHP225-mに更新する。
【0242】
次に、サブミッションキュー拡張テールポインタ(SQETP)の更新処理について説明する。図21は、実施形態に係るメモリシステム3において実行されるサブミッションキュー拡張テールポインタの更新処理の手順の例を示すフローチャートである。ここでは、サブミッションキュー221-nを介して、ホスト2からメモリシステム3のコントローラ4にコマンドが発行される場合を想定する。コントローラ4は、ホスト2によってサブミッションキューテールドアベルレジスタに格納されているSQTP4111-nが新たな値に更新されたことに応じて、SQETP463-nの更新処理を開始する。
【0243】
コントローラ4は、SQテールドアベルレジスタからSQTP4111-n(以下、更新後のSQTP4111-nと称する)を取得する(ステップS201)。
【0244】
コントローラ4は、SQETP463-nのポインタフィールドからSQTP(以下、更新前のSQTPと称する)を取得する(ステップS202)。
【0245】
コントローラ4は、S201で取得した更新後のSQTP4111-nの値が、S202で取得された更新前のSQTPの値よりも小さい値であるか否かを判定する(ステップS203)。これにより、コントローラ4は、今回のSQTP4111-nの更新で、ポインタの値が、サブミッションキュー221-nの最後尾のスロットを示す値から先頭のスロットを示す値に周ったか否かを判定する。
【0246】
S201で取得した更新後のSQTP4111-nの値が、S202で取得された更新前のSQTPの値よりも小さい場合(S203でYes)、コントローラ4は、サイクルカウンタが上限値(MAXCC-1)に等しいか否かを判定する(ステップS204)。このサイクルカウンタは、SQETP463-nのサイクルカウンタフィールドに設定されている値である。
【0247】
サイクルカウンタが上限値ではない場合(S204でNo)、コントローラ4は、SQETP463-nのサイクルカウンタフィールドに設定された値を1だけインクリメントする(ステップS205)。
【0248】
サイクルカウンタが上限値である場合(S204でYes)、コントローラ4は、SQETP463-nのサイクルカウンタフィールドの値を初期値に設定する(ステップS206)。
【0249】
そして、コントローラ4は、SQETP463-nのポインタフィールドの値を更新後のSQTP4111-nの値に設定し(ステップS207)、SQETPの更新処理を終了する。
【0250】
また、S201で取得した更新後のSQTP4111-nの値が、S202で取得された更新前のSQTP4111-nの値以上である場合(S203でNo)、コントローラ4は、S204からS206までの手順をスキップし、SQETP463-nのポインタフィールドの値を更新後のSQTP4111-nの値に設定し(ステップS207)、SQETP463-nの更新処理を終了する。
【0251】
このように、コントローラ4は、ホスト2によって、SQTP4111-nが更新されたことに応じて、サイクルカウンタを含むSQETP463-nを更新する。
【0252】
次に、タイムアウト処理を含む、タイムスロット管理テーブルの更新処理について説明する。図22は、実施形態に係るメモリシステム3において実行されるサブミッションキュー拡張テールポインタを記録する処理の手順を示すフローチャートである。ここでは、サブミッションキュー221-nに対応するタイムスロット管理テーブル471-nの更新処理について説明する。このとき、現在の時刻が、タイムスロット管理テーブル471-nのエントリに最初のタイムスロットに関する情報が格納されてから、タイムアウト時間TOn以上の時間が経過している場合を想定する。また、タイムスロット管理テーブル471-nに含まれる複数のエントリの個数は、Mn+1個であり、タイムアウト時間TOnは、Tn×Mnである。ここで、コントローラ4は、Tnが経過する度に、タイムスロット管理テーブル471-nの更新動作を開始する。
【0253】
コントローラ4は、タイムアウト対象のタイムスロットよりも一つ古いタイムスロットに対応するエントリに格納されている拡張ポインタ(EP)をSRAM46の第1EP465-nに退避する(ステップS301)。タイムスロット管理テーブル471-nに含まれる複数のエントリの個数がMn+1個であるため、次に更新されるエントリが、タイムアウト対象のタイムスロットよりも一つ古いタイムスロットに対応するエントリである。つまり、コントローラ4は、次に更新されるエントリに格納されているEPをSRAM46の第1EP465-nに退避する。タイムアウト対象のタイムスロットが先頭のタイムスロットである場合、退避されるEPは、初期値を示す。
【0254】
コントローラ4は、現在のSQETP463-nをタイムスロット管理テーブル471-nに記録する(ステップS302)。コントローラ4は、S301でEPが退避されたエントリに現在のSQETP463-nを記録する。
【0255】
コントローラ4は、タイムアウト処理を実行する(ステップS303)。タイムアウト処理の具体的な手順の例については、図23および図24を参照して後述する。
【0256】
コントローラ4は、S301で退避されたEPを削除する(ステップS304)。
【0257】
このように、コントローラ4は、Tnが経過する度に、サブミッションキュー221-nに対応するSQETP461-nを、タイムスロット管理テーブル471-nに格納する。これにより、コントローラ4は、サブミッションキュー221-nに対応する各タイムスロットの終端の時刻におけるSQETP463-nを記録することができる。
【0258】
次に、フェッチコマンド管理テーブルに拡張ポインタが格納されている場合に図22のS303で実行されるタイムアウト処理について説明する。図23は、実施形態に係るメモリシステム3において実行されるタイムアウト処理の手順の第1の例を示すフローチャートである。
【0259】
コントローラ4は、図22のS301で退避されたEP(第1EP465-n)をSRAM46から取得する(ステップS401)。第1EP465-nは、タイムアウト対象のタイムスロットよりも一つ古いタイムスロットの終端の時刻におけるSQETP463-n、あるいは初期値である。
【0260】
コントローラ4は、タイムアウト対象のタイムスロットに対応するEP(第2EP)をタイムスロット管理テーブル471-nから取得する(ステップS402)。第2EPは、タイムアウト対象のタイムスロットの終端の時刻におけるSQETP463-nである。
【0261】
コントローラ4は、S401で取得された第1EP465-nと、S402で取得された第2EPとが一致するか否かを判定する(ステップS403)。
【0262】
第1EP465-nと第2EPとが一致している場合(S403でYes)、コントローラ4は、タイムアウト対象のタイムスロットに対応するコマンドが存在しないと判定し、タイムアウト処理を終了する。
【0263】
第1EP465-nと第2EPとが一致していない場合(S403でNo)、コントローラ4は、フェッチコマンド管理テーブル464-nに、第1EP465-nから第2EPの一つ前までの範囲に含まれるEPが関連付けられたコマンドがあるか否かを判定する(ステップS404)。
【0264】
フェッチコマンド管理テーブル464-nに、第1EP465-nから第2EPの一つ前までの範囲に含まれるEPが関連付けられたコマンドがある場合(S404でYes)、コントローラ4は、該当するコマンドをアボートする(ステップS405)。コントローラ4は、該当するコマンドに対応する処理を中断し、該当するコマンドに対応する完了応答をホスト2に発行する。発行される完了応答は、該当するコマンドがアボートされたことを示す情報を含む。
【0265】
コントローラ4は、S405でアボートされたコマンドに対応するエントリを無効化するように、フェッチコマンド管理テーブル464-nを更新する(ステップS406)。
【0266】
フェッチコマンド管理テーブル464-nに、第1EP465-nから第2EPの一つ前までの範囲に含まれるEPが関連付けられたコマンドがない場合(S404でNo)、コントローラ4は、S405およびS406の手順をスキップする。
【0267】
そして、コントローラ4は、第2EPが現在のSQHP461-nに対応するEPよりも大きい値であるか否かを判定する(ステップS407)。
【0268】
第2EPが現在のSQHP461-nに対応するEPよりも大きい場合(S407でYes)、コントローラ4は、サブミッションキュー221-nにタイムアウト対象のコマンドが格納されていると判定する。そして、コントローラ4は、タイムアウト対象のコマンドをサブミッションキュー221-nからフェッチする(ステップS408)。コントローラ4は、S408でフェッチしたコマンドをアボートする(ステップS409)。コントローラ4は、S408でフェッチしたコマンドに対応する完了応答をホスト2に発行する。発行される完了応答は、S408でフェッチされたコマンドがアボートされたことを示す情報を含む。
【0269】
また、第2EPが現在のSQHP461-nに対応するEP以下である場合(ステップS407でNo)、コントローラ4は、タイムアウト処理を終了する。
【0270】
このように、コントローラ4は、タイムスロット管理テーブル472-nに格納されている拡張ポインタと、フェッチコマンド管理テーブル464-nに格納されている拡張ポインタとを使用して、タイムアウト処理の対象のコマンドを特定することができる。そして、コントローラ4は、タイムアウト対象のタイムスロットに対応するコマンドをまとめてアボートすることができる。
【0271】
次に、フェッチコマンド管理テーブルにタイムスロットを示す情報が格納されている場合における、図22のS303で実行されるタイムアウト処理について説明する。図24は、実施形態に係るメモリシステム3において実行されるタイムアウト処理の手順の第2の例を示すフローチャートである。ここでは、フェッチコマンド管理テーブルにタイムスロットを示す情報として、タイムスロット管理テーブルの行番号が格納されている場合を想定する。
【0272】
コントローラ4は、図22のS301で退避された第1EP465-nをSRAM46から取得する(ステップS501)。第1EP465-nは、タイムアウト対象のタイムスロットよりも一つ古いタイムスロットの終端の時刻におけるSQETP463-n、あるいは初期値である。
【0273】
コントローラ4は、第2EPをタイムスロット管理テーブル471-nから取得する(ステップS502)。第2EPは、タイムアウト対象のタイムスロットの終端の時刻におけるSQETP463-nである。
【0274】
コントローラ4は、S501で取得された第1EP465-nと、S502で取得された第2EPとが一致するか否かを判定する(ステップS503)。
【0275】
第1EP465-nと第2EPとが一致している場合(S503でYes)、コントローラ4は、タイムアウト対象のタイムスロットに対応するコマンドが存在しないと判定し、タイムアウト処理を終了する。
【0276】
第1EP465-nと第2EPとが一致していない場合(S503でNo)、コントローラ4は、タイムアウト対象のタイムスロットに対応するタイムスロット管理テーブル471-nの行番号を取得する(ステップS504)。
【0277】
コントローラ4は、フェッチコマンド管理テーブル464-nにおいて、S504で取得された行番号に関連付けられたコマンドがあるか否かを判定する(ステップS505)。
【0278】
S504で取得された行番号に関連付けられたコマンドがある場合(S505でYes)、コントローラ4は、該当するコマンドをアボートする(ステップS506)。コントローラ4は、該当するコマンドに対応する処理を中断し、そのコマンドに対応する完了応答をホスト2に発行する。発行される完了応答は、該当するコマンドがアボートされたことを示す情報を含む。そして、コントローラ4は、S506でアボートされたコマンドに対応するエントリを無効化するように、フェッチコマンド管理テーブル464-nを更新する(ステップS507)。
【0279】
S504で取得された行番号に関連付けられたコマンドがない場合(S505でNo)、コントローラ4は、S506およびS507の手順をスキップする。
【0280】
そして、コントローラ4は、第2EPが現在のSQHP461-nに対応するEPよりも大きいか否かを判定する(ステップS508)。
【0281】
第2EPが現在のSQHP461-nに対応するEPよりも大きい場合(S508でYes)、コントローラ4は、サブミッションキュー221-nにタイムアウト対象のコマンドが格納されていると判定する。そして、コントローラ4は、タイムアウト対象のコマンドをサブミッションキュー221-nからフェッチする(ステップS509)。
【0282】
コントローラ4は、S408でフェッチしたコマンドをアボートする(ステップS510)。コントローラ4は、S408でフェッチしたコマンドに対応する完了応答をホスト2に発行する。発行される完了応答は、S408でフェッチされたコマンドがアボートされたことを示す情報を含む。
【0283】
また、第2EPが現在のSQHP4111-nに対応するEP以下である場合(ステップS508でNo)、コントローラ4は、タイムアウト処理を終了する。
【0284】
このように、コントローラ4は、フェッチコマンド管理テーブル464-nに格納されているタイムスロット管理テーブル471-nの行番号を使用して、タイムアウト処理の対象のコマンドを特定することができる。そして、コントローラ4は、タイムアウト対象のタイムスロットに対応するコマンドをまとめてアボートすることができる。
【0285】
以上説明したように、実施形態に係るメモリシステム3において、コントローラ4は、発行されたコマンドをタイムスロットの単位でグループ分けする。そして、コントローラ4は、タイムアウト対象のタイムスロットを特定し、特定されたタイムスロットの間にサブミッションキューに格納されたコマンドを特定し、特定されたコマンドをアボートするようにタイムアウト処理を実行する。
【0286】
これにより、コントローラ4は、発行されたコマンドそれぞれについて、サブミッションキューに格納されてから経過した時間を管理することを必要としない。
【0287】
また、コントローラ4は、タイムアウト対象のタイムスロットの間に発行されたコマンドそれぞれを特定するために、拡張ポインタを管理する。拡張ポインタは、タイムアウト時間が経過するまでの間に発行され得るコマンドそれぞれを特定することができるポインタである。
【0288】
拡張ポインタは、サブミッションキューに含まれる複数のスロットのうちの一つのスロットを示すポインタと、ポインタがサブミッションキューのスロットを周った回数に対応するサイクルカウンタとを含む。コントローラ4のサイクルカウンタ制御回路45は、更新されたSQTPが、更新前のSQTPよりも小さい値である場合に、サイクルカウンタを更新する。
【0289】
SQTPが、同じサブミッションキューに対応するSQHPの一つ前の値であるとき、このサブミッションキューがフル状態と判定される。そのため、ホスト2は、SQTPがSQHPを追い抜くように更新することはできない。
【0290】
また、ホスト2が管理しているSQHHPは、コントローラ4が発行する完了応答に含まれるSQHPの値に基づいて更新される。ホスト2は、この更新されたSQHPが示すスロットの一つ前のスロットをSQTPが示す値になるまで、コマンドをサブミッションキューのスロットに格納することができる。
【0291】
このことから、一度のライトアクセスで、ホスト2がSQTPをインクリメントすることができる最大の値は、サブミッションキューのサイズ-1である。従って、SQTPが更新された際にSQETPが更新されるケースにおいて、サイクルカウンタの更新漏れは、発生し得ない。
【0292】
コントローラ4は、発行された複数のコマンドそれぞれに対応するタイムスロットを管理する。例えば、発行された複数のコマンドそれぞれに対応するタイムスロットを直接的に記録した場合には、仮想的なサブミッションキューのスロットの個数分のタイムスロットを示す情報を記録する必要が生じるため、メモリシステム3の揮発性メモリ(例えばSRAM46)のリソースを大きく消費することになる。また、消費されるリソースの量は、サブミッションキューのサイズと、サイクルカウンタの上限値に依存し、サブミッションキューのサイズが大きいほど、消費されるリソースの量も増大する。
【0293】
しかし、実施形態に係るメモリシステム3のように、拡張ポインタ、およびタイムスロット管理テーブル471-nを使用して、発行された複数のコマンドに対応するタイムスロットを管理する場合には、タイムスロット管理テーブル471-nに必要とされるエントリの行数は、タイムスロットの数に対応する。タイムスロットの数は、仮想的なサブミッションキューのスロットの個数と比べて、とても小さい数になる。そのため、実施形態に係るメモリシステム3は、拡張ポインタ、およびタイムスロット管理テーブル471-nを使用することによって、タイムアウト処理に必要とされるメモリリソースを削減することができる。
【0294】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0295】
1…情報処理システム、2…ホスト、3…メモリシステム、4…コントローラ、5…不揮発性メモリ、10…バス、20…内部バス、21…CPU、22…RAM、23…メモリインターフェース、40…内部バス、41…ホストインターフェース、42…CPU、43…タイマ、44…NANDインターフェース、45…サイクルカウンタ制御回路、46…SRAM、47…DRAM、421…コマンドフェッチ部、422…タイムアウト処理部。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24