(57)【要約】【課題】メモリコントローラがメモリにアクセスする際のアクセス速度を向上させる。【解決手段】保持部は、種類の異なる２つのコマンドのいずれかが入力されるたびに、その入力されたコマンドを保持する。優先モード切替部は、２つのコマンドのうち優先すべき優先コマンドを２つのコマンドの一方から他方に切り替える。コマンド処理部は、優先コマンドを優先して保持部から順に取り出してから優先コマンドに該当しない方のコマンドを前記保持部から順に取り出す。【選択図】図４
2017054483.tif 000002
【特許請求の範囲】
【請求項１】
種類の異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替部と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理部と
を具備するメモリコントローラ。
【請求項２】
前記コマンド処理部は、前記優先コマンドの全てを前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出す
請求項１記載のメモリコントローラ。
【請求項３】
前記２つのコマンドのそれぞれの数を計数して計数値を生成する計数部をさらに具備し、
前記切替部は、前記２つのコマンドのそれぞれの計数値が所定の閾値を超えたか否かに基づいて前記優先コマンドを切り替える
請求項１記載のメモリコントローラ。
【請求項４】
前記計数部は、前記保持部に保持された前記コマンドの数を計数する
請求項３記載のメモリコントローラ。
【請求項５】
前記計数部は、前記保持部から取り出された前記コマンドの数を計数する
請求項３記載のメモリコントローラ。
【請求項６】
前記コマンドの指定する論理アドレスを物理アドレスに変換する論物アドレス変換を行うアドレス変換部をさらに具備し、
前記保持部は、
前記論物アドレス変換が行われた後の前記コマンドをメモリコマンドとして保持するメモリコマンド保持部と、
前記アドレス変換が行われる前の前記コマンドをホストコマンドとして保持するホストコマンド保持部と
を備える請求項３記載のメモリコントローラ。
【請求項７】
前記計数部は、前記ホストコマンド保持部に保持された前記ホストコマンドの数を計数する
請求項６記載のメモリコントローラ。
【請求項８】
前記計数部は、前記メモリコマンド保持部に保持された前記メモリコマンドの数を待機中コマンド数として計数し、前記メモリコマンド保持部から取り出された前記メモリコマンドの数を処理コマンド数として計数し、
前記閾値は、前記優先コマンドを切り替えたときの前記待機中コマンド数であり、
前記切替部は、前記処理コマンド数が前記閾値を超えるか否かに基づいて前記優先コマンドを切り替える
請求項６記載のメモリコントローラ。
【請求項９】
前記優先モード切替部は、一定時間が経過するたびに前記優先コマンドを切り替える
請求項１記載のメモリコントローラ。
【請求項１０】
前記切替部は、前記優先コマンドの切り替えを指示する特定のコマンドに従って前記優先コマンドを切り替える
請求項１記載のメモリコントローラ。
【請求項１１】
前記２つのコマンドの一方は、データの読出しを指示するリードコマンドであり、
前記２つのコマンドの他方は、データの書込みを指示するライトコマンドであり、
前記保持部は、
前記リードコマンドを保持するリードコマンド保持部と、
前記ライトコマンドを保持するライトコマンド保持部と
を備える請求項１記載のメモリコントローラ。
【請求項１２】
メモリセルと、
前記メモリセルにアクセスするための互いに異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替部と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理部と
を具備するメモリシステム。
【請求項１３】
種類の異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持部に保持する保持手順と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替手順と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理手順と
を具備するメモリコントローラの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、メモリコントローラ、メモリシステム、および、メモリコントローラの制御方法に関する。詳しくは、コマンドをキューに保持するメモリコントローラ、メモリシステム、および、メモリコントローラの制御方法に関する。
【背景技術】
【０００２】
近年の情報処理システムにおいては、補助記憶装置やストレージとして、不揮発性メモリ（ＮＶＭ：Non-Volatile memory）が用いられることがある。この不揮発性メモリは、大きなサイズを単位としたデータアクセスに対応したフラッシュメモリと、小さな単位での高速なランダムアクセスが可能な不揮発性ランダムアクセスメモリ（ＮＶＲＡＭ：Non-Volatile RAM）とに大別される。ここで、フラッシュメモリの代表例としては、ＮＡＮＤ型フラッシュメモリが挙げられる。一方、不揮発性ランダムアクセスメモリの例としては、ＲｅＲＡＭ（Resistive RAM）、ＰＣＲＡＭ（Phase-Change RAM）、ＭＲＡＭ（Magnetoresistive RAM）などが挙げられる。
【０００３】
これらの不揮発性メモリにアクセスする際に、ライトコマンドやリードコマンドをキューに保持し、それらのコマンドを到着順に取り出して処理するメモリコントローラが提案されている（例えば、特許文献１参照。）。このようにキューにコマンドをバッファリングするのは、それらのコマンドを発行するホストコンピュータと、メモリコントローラとの処理速度や転送速度の差を緩和するためである。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−４７２７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述の従来技術では、ライトコマンドおよびリードコマンドが混在して発行された際に、非効率的なアクセスが行われてアクセス速度が低下するおそれがある。例えば、リードコマンドの次にライトコマンドを処理する際にメモリコントローラは、リードデータとライトデータとがデータ線で衝突するのを避けるために、リードデータの読出しが完了してからライトコマンドを処理する必要がある。このため、リードコマンドとライトコマンドが交互に発行された回数が多いほど、リードデータの読出し完了までライトコマンドの処理を待たせる時間の累積時間が長くなり、アクセス速度が低下するという問題がある。
【０００６】
本技術はこのような状況に鑑みて生み出されたものであり、メモリコントローラがメモリにアクセスする際のアクセス速度を向上させることを目的とする。
【課題を解決するための手段】
【０００７】
本技術は、上述の問題点を解消するためになされたものであり、その第１の側面は、種類の異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、上記２つのコマンドのうち優先すべき優先コマンドを上記２つのコマンドの一方から他方に切り替える切替部と、上記優先コマンドを優先して上記保持部から順に取り出してから上記優先コマンドに該当しない方のコマンドを上記保持部から順に取り出すコマンド処理部とを具備するメモリコントローラ、および、その制御方法である。これにより、２つのコマンドの一方から他方に優先コマンドが切り替えられるという作用をもたらす。
【０００８】
前記コマンド処理部は、前記優先コマンドの全てを前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出してもよい。これにより、優先コマンドの全てが取り出されてから、優先コマンドに該当しない方のコマンドが取り出されるという作用をもたらす。
【０００９】
また、この第１の側面において、上記２つのコマンドのそれぞれの数を計数して計数値を生成する計数部をさらに具備し、上記切替部は、上記２つのコマンドのそれぞれの計数値が所定の閾値を超えたか否かに基づいて上記優先コマンドを切り替えてもよい。これにより、コマンドのそれぞれの計数値が閾値を超えたか否かに基づいて優先コマンドが切り替えられるという作用をもたらす。
【００１０】
また、この第１の側面において、上記計数部は、上記保持部に保持された上記コマンドの数を計数してもよい。これにより、保持部に保持されたコマンドの数に基づいて優先コマンドが切り替えられるという作用をもたらす。
【００１１】
また、この第１の側面において、上記計数部は、上記保持部から取り出された上記コマンドの数を計数してもよい。これにより、保持部から取り出されたコマンドの数に基づいて優先コマンドが切り替えられるという作用をもたらす。
【００１２】
また、この第１の側面において、前記コマンドの指定する論理アドレスを物理アドレスに変換する論物アドレス変換を行うアドレス変換部をさらに具備し、前記保持部は、前記論物アドレス変換が行われた後の前記コマンドをメモリコマンドとして保持するメモリコマンド保持部と、前記アドレス変換が行われる前の前記コマンドをホストコマンドとして保持するホストコマンド保持部とを備えてもよい。これにより、ホストコマンドまたはメモリコマンドの数に基づいて優先コマンドが切り替えられるという作用をもたらす。
【００１３】
また、この第１の側面において、前記計数部は、前記ホストコマンド保持部に保持された前記ホストコマンドの数を計数してもよい。これにより、保持されたホストコマンド数に基づいて優先モードが切り替えられるという作用をもたらす。
【００１４】
また、この第１の側面において、前記計数部は、前記メモリコマンド保持部に保持された前記メモリコマンドの数を待機中コマンド数として計数し、前記メモリコマンド保持部から取り出された前記メモリコマンドの数を処理コマンド数として計数し、前記閾値は、前記優先コマンドを切り替えたときの前記待機中コマンド数であり、前記切替部は、前記処理コマンド数が前記閾値を超えるか否かに基づいて前記優先コマンドを切り替えてもよい。これにより、優先コマンドを切り替えたときの前記待機中コマンド数を処理コマンド数が超えるか否かに基づいて優先コマンドが切り替えられるという作用をもたらす。
【００１５】
また、この第１の側面において、上記優先モード切替部は、一定時間が経過するたびに上記優先コマンドを切り替えてもよい。これにより、一定時間が経過するたびに優先コマンドが切り替えられるという作用をもたらす。
【００１６】
また、この第１の側面において、上記切替部は、上記優先コマンドの切り替えを指示する特定のコマンドに従って上記優先コマンドを切り替えてもよい。これにより、特定のコマンドにより優先コマンドが切り替えられるという作用をもたらす。
【００１７】
また、この第１の側面において、上記２つのコマンドの一方は、データの読出しを指示するリードコマンドであり、上記２つのコマンドの他方は、データの書込みを指示するライトコマンドであり、上記保持部は、上記リードコマンドを保持するリードコマンド保持部と、上記ライトコマンドを保持するライトコマンド保持部とを備えてもよい。これにより、リードコマンド保持部とライトコマンド保持部とにコマンドが保持されるという作用をもたらす。
【００１８】
また、本技術の第２の側面は、メモリセルと、上記メモリセルにアクセスするための互いに異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、上記２つのコマンドのうち優先すべき優先コマンドを上記２つのコマンドの一方から他方に切り替える切替部と、上記優先コマンドを優先して上記保持部から順に取り出してから上記優先コマンドに該当しない方のコマンドを上記保持部から順に取り出すコマンド処理部とを具備するメモリシステムである。これにより、２つのコマンドの一方から他方に優先コマンドが切り替えられるという作用をもたらす。
【発明の効果】
【００１９】
本技術によれば、メモリコントローラがメモリにアクセスする際のアクセス速度を向上させることができるという優れた効果を奏し得る。なお、ここに記載された効果は必ずしも限定されるものではなく、本開示中に記載されたいずれかの効果であってもよい。
【図面の簡単な説明】
【００２０】
【図１】第１の実施の形態におけるメモリシステムの一構成例を示すブロック図である。
【図２】第１の実施の形態におけるメモリコントローラの一構成例を示すブロック図である。
【図３】第１の実施の形態におけるメモリコントローラの機能構成例を示すブロック図である。
【図４】第１の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図５】第１の実施の形態におけるコマンドキューの一構成例を示す図である。
【図６】第１の実施の形態における優先モード切替部の動作の一例を示す図である。
【図７】第１の実施の形態におけるリクエスト発行管理部の一構成例を示すブロック図である。
【図８】第１の実施の形態における取り出しコマンド切替制御部の動作の一例を示す図である。
【図９】第１の実施の形態におけるリクエスト発行部の動作の一例を示す図である。
【図１０】第１の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図１１】第１の実施の形態における不揮発性メモリの一構成例を示すブロック図である。
【図１２】第１の実施の形態における可変抵抗素子の抵抗分布の一例を示す図である。
【図１３】第１の実施の形態におけるメモリコントローラの動作の一例を示すフローチャートである。
【図１４】第１の実施の形態におけるリクエスト発行処理の一例を示すフローチャートである。
【図１５】第１の実施の形態におけるリード優先モードのメモリコントローラの動作の一例を示すタイミングチャートである。
【図１６】第１の実施の形態におけるライト優先モードのメモリコントローラの動作の一例を示すタイミングチャートである。
【図１７】第２の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図１８】第２の実施の形態における優先モード切替部の動作の一例を示す図である。
【図１９】第２の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図２０】第２の実施の形態におけるメモリコントローラの動作の一例を示す図である。
【図２１】第２の実施の形態におけるキュー占有率の変化の一例を示すグラフである。
【図２２】第２の実施の形態における閾値を変えた場合のキュー占有率の変化の一例を示すグラフである。
【図２３】リード優先に固定した比較例におけるライトコマンドのキュー占有率の変化の一例を示すグラフである。
【図２４】ライト優先に固定した比較例におけるライトコマンドのキュー占有率の変化の一例を示すグラフである。
【図２５】第３の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図２６】第３の実施の形態における優先モード切替部の動作の一例を示す図である。
【図２７】第３の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図２８】第３の実施の形態におけるメモリコントローラの動作の一例を示す図である。
【図２９】第４の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図３０】第４の実施の形態における優先モード切替部の動作の一例を示す図である。
【図３１】第４の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図３２】第４の実施の形態におけるメモリコントローラの動作の一例を示す図である。
【図３３】第５の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図３４】第５の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図３５】第５の実施の形態におけるメモリコントローラの動作の一例を示すタイミングチャートである。
【図３６】比較例におけるメモリコントローラの動作の一例を示すタイミングチャートである。
【図３７】第５の実施の形態におけるメモリコントローラの動作の一例を示すフローチャートである。
【図３８】第６の実施の形態におけるリクエスト発行制御部の一構成例を示すブロック図である。
【図３９】第６の実施の形態における優先モード切替部の動作の一例を示す図である。
【図４０】第６の実施の形態におけるメモリコントローラの状態遷移図の一例である。
【図４１】第６の実施の形態におけるメモリコントローラの動作の一例を示すタイミングチャートである。
【図４２】第６の実施の形態におけるメモリコントローラの動作の一例を示すフローチャートである。
【発明を実施するための形態】
【００２１】
以下、本技術を実施するための形態（以下、実施の形態と称する）について説明する。説明は以下の順序により行う。
１．第１の実施の形態（待機中のコマンド数に基づいて優先モードを切り替える例）
２．第２の実施の形態（処理したコマンド数に基づいて優先モードを切り替える例）
３．第３の実施の形態（一定時間が経過するたびに優先モードを切り替える例）
４．第４の実施の形態（処理したコマンド数または切替コマンドに基づいて優先モードを切り替える例）
５．第５の実施の形態（ホストコマンド数に基づいて優先モードを切り替える例）
６．第６の実施の形態（動的に変更される閾値に基づいて優先モードを切り替える例）
【００２２】
＜１．第１の実施の形態＞
［メモリシステムの構成例］
図１は、実施の形態におけるメモリシステムの一構成例を示すブロック図である。このメモリシステムは、ホストコンピュータ１００およびストレージ２００を備える。
【００２３】
ホストコンピュータ１００は、メモリシステム全体を制御するものである。具体的には、ホストコンピュータ１００は、コマンドおよびデータを生成してストレージ２００に信号線１０９を介して供給する。また、ホストコンピュータ１００は、ストレージ２００から、読み出されたデータを受け取る。ここで、コマンドは、ストレージ２００を制御するためのものであり、例えば、論理アドレスを指定してデータの書込みを指示するライトコマンドや、論理アドレスを指定してデータの読出しを指示するリードコマンドを含む。ここで、論理アドレスは、ホストコンピュータ１００がストレージ２００にアクセスする際のアクセス単位ごとに割り振られたアドレスである。
【００２４】
ストレージ２００は、メモリコントローラ３００と複数のメモリバンク４００とを備える。メモリバンク４００のそれぞれは、複数の不揮発性メモリ４１０を備える。メモリコントローラ３００は、ストレージ２００全体を制御するものである。このメモリコントローラ３００は、ホストコンピュータ１００からライトコマンドおよびデータを受け取った場合に、そのデータから誤り検出訂正符号（ＥＣＣ：Error detection and Correction Code）を生成する。メモリコントローラ３００は、メモリバンク４００のそれぞれに信号線３０８や信号線３０９を介してアクセスして符号化したデータを書き込む。
【００２５】
また、ホストコンピュータ１００からリードコマンドを受け取った場合、メモリコントローラ３００は、メモリバンク４００に信号線３０８等を介してアクセスして符号化されたデータを読み出す。そして、メモリコントローラ３００は、符号化されたデータを、符号化前の元のデータに変換（すなわち、復号）する。復号の際に、メモリコントローラ３００は、ＥＣＣに基づいてデータにおける誤りの検出および訂正を行う。メモリコントローラ３００は、訂正したデータをホストコンピュータ１００に供給する。
【００２６】
不揮発性メモリ４１０は、メモリコントローラ３００の制御に従って、データを記憶するものである。例えば、ＲｅＲＡＭが不揮発性メモリ４１０として用いられる。この不揮発性メモリ４１０は、複数のメモリセルを備え、これらのメモリセルは、複数のブロックに分けられている。ここで、ブロックは、不揮発性メモリ４１０のアクセス単位であり、セクタとも呼ばれる。ブロックのそれぞれにはメモリアドレスが割り当てられている。なお、ＲｅＲＡＭの代わりに、フラッシュメモリ、ＰＣＲＡＭ、および、ＭＲＡＭなどを不揮発性メモリ４１０として用いてもよい。
【００２７】
なお、メモリシステムに複数のメモリバンク４００を設けているが、メモリバンク４００を１つのみ設ける構成であってもよい。
【００２８】
［メモリコントローラの構成例］
図２は、第１の実施の形態におけるメモリコントローラ３００の一構成例を示すブロック図である。このメモリコントローラ３００は、ＲＡＭ（Random Access Memory）３１２、ＣＰＵ（Central Processing Unit）３１３、ＥＣＣ処理部３１４およびＲＯＭ（Read Only Memory）３１５を備える。また、メモリコントローラ３００は、ホストインターフェース３１１、バス３１６およびメモリインターフェース３１７を備える。
【００２９】
ＲＡＭ３１２は、ＣＰＵ３１３が実行する処理において必要となるデータを一時的に保持するものである。ＣＰＵ３１３は、メモリコントローラ３００全体を制御するものである。ＲＯＭ３１５は、ＣＰＵ３１３が実行するプログラム等を記憶するものである。ホストインターフェース３１１は、ホストコンピュータ１００との間でデータやコマンドを相互に交換するものである。バス３１６は、ＲＡＭ３１２、ＣＰＵ３１３、ＥＣＣ処理部３１４、ＲＯＭ３１５、ホストインターフェース３１１およびメモリインターフェース３１７が相互にデータを交換するための共通の経路である。メモリインターフェース３１７は、不揮発性メモリ４１０との間でデータやコマンドを相互に交換するものである。
【００３０】
メモリインターフェース３１７と不揮発性メモリ４１０との間には、データ線やコマンドアドレス線が配線されている。メモリインターフェース３１７は、データ線を介して不揮発性メモリ４００との間でリードデータまたはライトデータを転送し、コマンドアドレス線を介してコマンドを転送する。また、メモリインターフェース３１７は、データ線およびコマンドアドレス線のそれぞれにおいて、送信および受信を同時に行うことのできない半二重通信方式で通信を行っている。このため、メモリインターフェース３１７は、リクエストごとにライトデータおよびリードデータの一方しか転送することができない。仮に、リードデータおよびライトデータの両方を同時に転送すると、メモリコントローラ３００および不揮発性メモリ４１０の双方は、データの受け取りに失敗してしまう。言い換えれば、ライトデータとリードデータとがデータ線上で衝突してしまう。そこで、この第１の実施の形態では、メモリコントローラ３００は、データが衝突しないように、リードリクエストとライトリクエストの発行タイミングを制御している。
【００３１】
ＥＣＣ処理部３１４は、符号化対象のデータを符号化し、また、符号化されたデータを復号するものである。データの符号化においてＥＣＣ処理部３１４は、データにパリティを付加することにより一定の単位で符号化する。また、データの復号において、ＥＣＣ処理部３１４は、パリティを使用してデータの誤りを検出および訂正する。ＥＣＣ処理部３１４は、復号した元のデータをホストコンピュータ１００にバス３１６を介して供給する。
【００３２】
図３は、第１の実施の形態におけるメモリコントローラ３００の機能構成例を示すブロック図である。このメモリコントローラ３００は、ホストインターフェース３１１、ＥＣＣ処理部３１４、メモリインターフェース３１７およびリクエスト発行制御部３２０を備える。このリクエスト発行制御部３２０は、図２におけるＲＡＭ３１２やＣＰＵ３１３により実現される。
【００３３】
リクエスト発行制御部３２０は、コマンドに基づいてリクエストを発行するものである。ここで、リクエストは、メモリアドレスを指定して不揮発性メモリ４１０にアクセスを要求するものであり、読出しを要求するリードリクエストや書込みを要求するライトリクエストを含む。このリクエスト発行制御部３２０は、発行したリクエストをメモリインターフェース３１７を介して不揮発性メモリ４１０に供給する。このリクエストによりリクエスト発行制御部３２０が不揮発性メモリ４１０にアクセスするアクセス単位は、レジスタ（不図示）などにより予め設定することができる。例えば、アクセス単位は、２キロバイト（ＫＢ）や４キロバイト（ＫＢ）などに設定される。
【００３４】
［リクエスト発行制御部の構成例］
図４は、第１の実施の形態におけるリクエスト発行制御部３２０の一構成例を示すブロック図である。このリクエスト発行制御部３２０は、待機中リードコマンド数計数部３２１、コマンドデコーダ３２２、待機中ライトコマンド数計数部３２３、優先モード切替部３２４、コマンドキュー３４０およびリクエスト発行管理部３５０を備える。
【００３５】
コマンドデコーダ３２２は、コマンドをデコードするものである。このコマンドデコーダ３２２は、コマンドをデコードするたびに、そのデコードしたコマンドをコマンドキュー３４０に追加する。
【００３６】
コマンドキュー３４０は、コマンドデコーダ３２２からのコマンドを保持するものである。このコマンドキュー３４０は、例えば、先入れ先出し（ＦＩＦＯ:First In, First Out）方式で、到着順にコマンドを保持する。これらのコマンドは、リクエスト発行管理部３５０により、到着順に取り出される。なお、コマンドキュー３４０は、特許請求の範囲に記載の保持部の一例である。
【００３７】
待機中リードコマンド数計数部３２１は、コマンドキュー３４０が保持している（言い換えれば、待機中の）リードコマンドの数を計数するものである。ここで、コマンドには、そのコマンドがライトコマンドであるか否かを示すＲＷフラグと、アクセス先のメモリアドレスとが格納されるものとする。このＲＷフラグには、例えば、ライトコマンドである場合に「１」が設定され、リードコマンドである場合に「０」が設定される。
【００３８】
待機中リードコマンド数計数部３２１は、待機中のコマンドのそれぞれのＲＷフラグを参照し、それらの値からライトコマンドの数を求める。例えば、待機中リードコマンド数計数部３２１は、待機中のコマンドのそれぞれのＲＷフラグの反転値を全て加算し、その加算値をカウンタ値ＲＣＮＴとして優先モード切替部３２４およびリクエスト発行管理部３５０に供給する。
【００３９】
待機中ライトコマンド数計数部３２３は、待機中のライトコマンドの数を計数するものである。この待機中ライトコマンド数計数部３２３は、例えば、待機中のコマンドのそれぞれのＲＷフラグの値を全て加算し、その加算値をカウンタ値ＷＣＮＴとして優先モード切替部３２４およびリクエスト発行管理部３５０に供給する。なお、待機中リードコマンド数計数部３２１および待機中ライトコマンド数計数部３２３からなる回路は、特許請求の範囲に記載の計数部の一例である。
【００４０】
なお、待機中リードコマンド数計数部３２１は、ＲＷフラグの反転値の加算によりコマンド数を計数しているが、他の方法によりコマンド数を計数してもよい。例えば、待機中リードコマンド数計数部３２１は、コマンドデコーダ３２２によりリードコマンドが追加されるたびにカウンタ値ＲＣＮＴを増分してもよい。この場合には、リクエスト発行管理部３５０によりリードコマンドが取り出されるたびに待機中リードコマンド数計数部３２１は、カウンタ値ＲＣＮＴを減分すればよい。待機中ライトコマンド数計数部３２３についても同様に、ライトコマンドの追加のたびにカウンタ値ＷＣＮＴを増分し、ライトコマンドの取り出しのたびに減分してもよい。
【００４１】
優先モード切替部３２４は、２つのコマンドの一方を優先するモードと、他方を優先するモードとのいずれかに優先モードを切り替えるものである。例えば、優先モード切替部３２４は、ライトコマンドを優先するライト優先モードと、リードコマンドを優先するリード優先モードとを排他的に切り替える。この優先モード切替部３２４は、カウンタ値ＲＣＮＴとカウンタ値ＷＣＮＴと所定の閾値Ｎ（Ｎは、２以上の整数）とを比較し、その比較結果に基づいて優先モードを切り替える。例えば、Ｎには、コマンドキュー３４０に保持することができるコマンドの総数（以下、「キューサイズ」と称する。）が設定される。優先モード切替部３２４は、カウンタ値ＲＣＮＴがＮ以上である場合にリード優先モードに切り替え、カウンタ値ＷＣＮＴがＮ以上である場合にライト優先モードに切り替える。初期状態においては、特定の優先モード（例えば、リード優先モード）が設定される。優先モード切替部３２４は、現在の優先モードＭＯＤＥをリクエスト発行管理部３５０に通知する。なお、優先モード切替部３２４は、特許請求の範囲に記載の切替部の一例である。
【００４２】
なお、メモリコントローラ３００は、ライトコマンドをおよびリードコマンドのそれぞれを優先するモードを切り替えているが、優先するコマンドの組合せは、ライトコマンドおよびリードコマンドに限定されない。例えば、メモリコントローラ３００は、アドレスの全ビットを特定の値（「０」など）にすることを指示する消去コマンドと、それ以外のコマンドとのそれぞれを優先するモードを切り替えてもよい。
【００４３】
また、閾値Ｎにキューサイズを設定しているが、優先モードを排他的に切り替えることができる値であれば、閾値Ｎは、キューサイズ未満の値であってもよい。例えば、キューサイズがｍ（ｍは整数）である場合、ｍ／２より大きな値をＮに設定すれば、優先モード切替部３２４は、優先モードを排他的に切り替えることができる。
【００４４】
リクエスト発行管理部３５０は、優先モードＭＯＤＥに従って、コマンドキュー３４０からコマンドを取り出して処理するものである。ライト優先モードである場合にリクエスト発行管理部３５０は、ライトコマンドの全てを到着順にコマンドキュー３４０から取り出し、それらのコマンドを処理してライトリクエストを発行する。そして、全てのライトコマンドを取り出してから、リクエスト発行管理部３５０は、リードコマンドを到着順にコマンドキュー３４０から取り出し、それらのコマンドを処理してリードリクエストを発行する。
【００４５】
一方、リード優先モードである場合にリクエスト発行管理部３５０は、リードコマンドの全てを到着順にコマンドキュー３４０から取り出し、それらのコマンドを処理してライトリクエストを発行する。そして、全てのリードコマンドを取り出してから、リクエスト発行管理部３５０は、ライトコマンドを到着順にコマンドキュー３４０から取り出し、それらのコマンドを処理してライトリクエストを発行する。なお、リクエスト発行管理部３５０は、特許請求の範囲に記載のコマンド処理部の一例である。
【００４６】
なお、上述のようにリクエスト発行管理部３５０が、ホストコンピュータ１００によるコマンドの発行順と異なる順でコマンドを処理しても、ホストコンピュータ１００により同じアドレスに対するアクセス順が管理されているため不都合は生じない。例えば、ホストコンピュータ１００は、ライトコマンドにより、あるアドレスに退避用のデータを書き込んだ際は、ライト応答を受け取るまで、そのアドレスを指定したリードコマンドを発行しない。
【００４７】
図５は、第１の実施の形態におけるコマンドキュー３４０の一構成例を示す図である。同図に例示するように、コマンドキュー３４０には、複数のエントリが設けられたコマンド保持部３４１が設けられる。それぞれのエントリには、エントリを識別するためのエントリ番号が割り当てられ、エントリごとに１つのコマンドが保持される。ここで、コマンドデコーダ３２２およびリクエスト発行制御部３２０が共通にアクセスすることができるレジスタ（不図示）には、リードポインタ、ライトポインタおよびコマンド数が保持される。リードポインタは、コマンドを取り出すエントリの位置を示し、ライトポインタは、コマンドを追加するエントリの位置を示す。コマンド数は、コマンドキュー３４０に保持されているコマンドの数を示す。
【００４８】
コマンドデコーダ３２２は、コマンドを追加する際にコマンド数がキューサイズである（すなわち、バッファフル）か否かを判断する。バッファフルであれば、コマンドデコーダ３２２は、例えば、コマンドを破棄し、バッファフルの通知をホストコンピュータ１００に返す。一方、バッファフルでない場合にコマンドデコーダ３２２は、ライトポインタの示すエントリにコマンドを書き込む。そして、コマンドデコーダ３２２は、ライトポインタを更新（例えば、インクリメント）し、コマンド数を増分する。
【００４９】
また、リクエスト発行制御部３２０は、コマンド数が「０」（すなわち、バッファエンプティ）でなければ、リードポインタの示すエントリのコマンドのＲＷフラグを参照し、そのコマンドが取り出す対象のコマンドであるか否かを判断する。例えば、リード優先モードにおいてリクエスト発行制御部３２０は、全てのリードコマンドを取り出す（すなわち、カウンタ値ＲＣＮＴが０になる）まではリードコマンドを取り出し対象とする。取り出す対象のコマンドでなければ、リードポインタのエントリ番号をデクリメントし、そのエントリ番号のコマンドのＲＷフラグを参照する。このようにして、リクエスト発行制御部３２０は、リードポインタから到着順と逆順にエントリを辿って取り出すコマンドを探索し、取り出し対象のコマンドを取り出す。
【００５０】
リクエスト発行制御部３２０は、リードポインタの示すエントリと異なるエントリからコマンドを取り出した場合に、その取り出したエントリの次のエントリ以降のコマンドのそれぞれをエントリ番号の若い方に１つずつ詰める。そして、リクエスト発行制御部３２０は、リードポインタを更新（例えば、インクリメント）し、コマンド数を減分する。
【００５１】
図６は、第１の実施の形態における優先モード切替部３２４の動作の一例を示す図である。リード優先モードにおいて、待機中のライトコマンド数ＷＣＮＴがｎ以上になると、優先モード切替部３２４は、ライト優先モードに切り替える。一方、ライト優先モードにおいて待機中のリードコマンド数ＲＣＮＴがＮ以上になると、優先モード切替部３２４は、リード優先モードに切り替える。
【００５２】
図７は、第１の実施の形態におけるリクエスト発行管理部３５０の一構成例を示すブロック図である。このリクエスト発行管理部３５０は、取り出しコマンド切替制御部３５１、取り出し部３５２およびリクエスト発行部３５３を備える。
【００５３】
取り出しコマンド切替制御部３５１は、コマンドキュー３４０から取り出すコマンドの種類を切替信号により切り替えるものである。ここで、切替信号は、コマンドキュー３４０から取り出すコマンドの種類を取り出し部３５２に指示する信号である。例えば、リードコマンドの取り出しを指示する場合に切替信号にハイレベルが設定され、ライトコマンドの取り出しを指示する場合に切替信号にローレベルが設定される。
【００５４】
取り出しコマンド切替制御部３５１は、リード優先モードにおいてカウンタ値ＲＣＮＴを参照し、コマンドキュー３４０に待機中のリードコマンドがあるか否かを判断する。待機中のリードコマンドが有る場合に取り出しコマンド切替制御部３５１は、切替信号をハイレベルにしてリードコマンドを取り出させる。一方、待機中のリードコマンドが無い場合に取り出しコマンド切替制御部３５１は、切替信号をローレベルにしてライトコマンドを取り出させる。
【００５５】
また、取り出しコマンド切替制御部３５１は、ライト優先モードにおいてカウンタ値ＷＣＮＴを参照し、コマンドキュー３４０に待機中のライトコマンドがあるか否かを判断する。待機中のライトコマンドが有る場合に取り出しコマンド切替制御部３５１は、切替信号をローレベルにしてライトコマンドを取り出させる。一方、待機中のライトコマンドが無い場合に取り出しコマンド切替制御部３５１は、切替信号をハイレベルにしてリードコマンドを取り出させる。
【００５６】
この制御により、ライト優先モードにおいて全てのライトコマンドが順にコマンドキュー３４０から連続して取り出され、ライトコマンドの全てが取り出されてからリードコマンドが順に取り出される。また、リード優先モードにおいて全てのリードコマンドが順にコマンドキュー３４０から連続して取り出され、リードコマンドの全てが取り出されてからライトコマンドが順に取り出される。
【００５７】
取り出し部３５２は、切替信号に従って、コマンドキュー３４０からコマンドを取り出すものである。この取り出し部３５２は、取り出したコマンドをリクエスト発行部３５３に供給する。
【００５８】
リクエスト発行部３５３は、取り出されたコマンドを処理してリクエストを発行するものである。リクエストを発行する際にリクエスト発行部３５３は、アクセスするメモリ領域（メモリバンクなど）について、完了していないアクセス制御が存在しないか否かを判断し、そのアクセス制御が完了してからリクエストを発行する。例えば、前回リードリクエストを発行したメモリ領域について、ライトリクエストを発行する場合にリクエスト発行部３５３は、前回のリードデータの読出しが完了してからライトリクエストを発行する。これにより、データ線におけるライトデータとリードデータとの衝突が防止される。また、前回ライトリクエストを発行したメモリ領域について、リクエストを発行する場合にリクエスト発行部３５３は、ライトリクエストに対するライト応答を受信してからリクエストを発行する。ここで、ライト応答は、不揮発性メモリ４１０が、ライトデータの書込みに成功したことを通知するものである。
【００５９】
図８は、第１の実施の形態における取出しコマンド切替制御部の３５１の動作の一例を示す図である。取り出しコマンド切替制御部３５１は、リード優先モードにおいて待機中のリードコマンドがあれば、切替信号をハイレベルにしてリードコマンドを取り出させる。一方、待機中のリードコマンドが無い場合に取り出しコマンド切替制御部３５１は、切替信号をローレベルにしてライトコマンドを取り出させる。
【００６０】
また、取り出しコマンド切替制御部３５１は、ライト優先モードにおいて待機中のライトコマンドがあれば、切替信号をローレベルにしてライトコマンドを取り出させる。一方、待機中のライトコマンドが無い場合に取り出しコマンド切替制御部３５１は、切替信号をハイレベルにしてリードコマンドを取り出させる。
【００６１】
図９は、第１の実施の形態におけるリクエスト発行部３５３の動作の一例を示す図である。あるメモリ領域について前回リードリクエストを発行し、今回のリクエストがライトリクエストである場合にはリクエスト発行部３５３は、リードデータの読出しが完了してから、そのライトリクエストを発行する。また、前回ライトリクエストを発行した場合にリクエスト発行部３５３は、そのライトリクエストに対するライト応答を受け取ってから、今回のリクエストを発行する。
【００６２】
図１０は、第１の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。メモリコントローラ３００の状態は、ライト優先モード５１０およびリード優先モード５２０を含む。また、ライト優先モード５１０は、ライトコマンド連続処理モード５１１と、ライト処理後リードコマンド連続処理モード５１２とを含む。リード優先モード５２０は、リード処理後ライトコマンド連続処理モード５２１と、リードコマンド連続処理モード５２２とを含む。
【００６３】
初期状態は、例えば、リードコマンド連続処理モード５２２に設定される。メモリコントローラ３００は、このリードコマンド連続処理モード５２２においてコマンドキュー３４０からリードコマンドのみを連続して到着順に取り出して処理する。リードコマンド連続処理モード５２２において待機中のリードコマンドが無くなると、メモリコントローラ３００は、リード処理後ライトコマンド連続処理モード５２１に移行する。
【００６４】
リード処理後ライトコマンド連続処理モード５２１においてメモリコントローラ３００は、コマンドキュー３４０からライトコマンドのみを連続して到着順に取り出して処理する。リード処理後ライトコマンド連続処理モード５２１においてリードコマンドがコマンドキュー３４０に追加されると、メモリコントローラ３００は、リードコマンド連続処理モード５２２に移行する。また、待機中のライトコマンド数がｎ以上となると、メモリコントローラ３００は、ライトコマンド連続処理モード５１１に移行する。ここで、ｎがバッファサイズである場合には、待機中のライトコマンド数がｎであるときの待機中のリードコマンド数は０である。
【００６５】
ライトコマンド連続処理モード５１１において、メモリコントローラ３００は、コマンドキュー３４０からライトコマンドのみを連続して到着順に取り出して処理する。このライトコマンド連続処理モード５１１において待機中のライトコマンドが無くなると、メモリコントローラ３００は、ライト処理後リードコマンド連続処理モード５１２に移行する。
【００６６】
ライト処理後リードコマンド連続処理モード５１２においてメモリコントローラ３００は、コマンドキュー３４０からリードコマンドのみを連続して到着順に取り出して処理する。このライト処理後リードコマンド連続処理モード５１２においてライトコマンドがコマンドキュー３４０に追加されると、メモリコントローラ３００は、ライトコマンド連続処理モード５１１に移行する。また、待機中のリードコマンド数がｎ以上となると、メモリコントローラ３００は、リードコマンド連続処理モード５２２に移行する。ここで、ｎがバッファサイズである場合には、待機中のリードコマンド数がｎであるときの待機中のライトコマンド数は０である。
【００６７】
［不揮発性メモリの構成例］
図１１は、第１の実施の形態における不揮発性メモリ４１０の一構成例を示すブロック図である。この不揮発性メモリ４１０は、データバッファ４１１、メモリセルアレイ４１２、ドライバ４１３、アドレスデコーダ４１４、バス４１５、制御インターフェース４１６、および、メモリ制御部４１７を備える。
【００６８】
データバッファ４１１は、メモリ制御部４１７の制御に従って、ライトデータやリードデータをアクセス単位で保持するものである。メモリセルアレイ４１２は、マトリックス
状に配列された複数のメモリセルを備える。各々のメモリセルとして、ＲｅＲＡＭなどの不揮発性の記憶素子が用いられる。
【００６９】
ドライバ４１３は、アドレスデコーダ４１４により選択されたメモリセルに対してデータの書込み、または、データの読出しを行うものである。アドレスデコーダ４１４は、リクエストにより指定されたアドレスを解析して、そのアドレスに対応するメモリセルを選択するものである。バス４１５は、データバッファ４１１、メモリセルアレイ４１２、アドレスデコーダ４１４、メモリ制御部４１７および制御インターフェース４１６が相互にデータを交換するための共通の経路である。制御インターフェース４１６は、メモリコントローラ３００と不揮発性メモリ４１０とがデータやリクエストを相互に交換するためのインターフェースである。
【００７０】
メモリ制御部４１７は、ドライバ４１３およびアドレスデコーダ４１４を制御して、データの書込み、または、読出しを行わせるものである。メモリ制御部４１７は、ライトリクエストを受け取ると、ライトデータをデータバッファ４１１に保持させる。また、メモリ制御部４１７は、ライトリクエストにより指定されたメモリアドレスをアドレスデコーダ４１４に供給する。アドレスデコーダ４１４によりメモリセルが選択されると、メモリ制御部４１７は、ドライバ４１３を制御して、そのメモリセルにデータを書き込ませる。
【００７１】
そして、メモリ制御部４１７は、ドライバ４１３を制御して、データが書き込まれたメモリセルからデータを読み出させる。メモリ制御部４１７は、読み出されたデータと、データバッファ４１１に保持されたライトデータとを照合（ベリファイ）する。メモリ制御部４１７は、ベリファイに成功した際にライト応答を生成し、制御インターフェース４１６を介してメモリコントローラ３００に供給する。
【００７２】
また、メモリ制御部４１７は、リードリクエストを受け取ると、アドレスデコーダ４１４およびドライバ４１３を制御してメモリコントローラ３００へリードデータを出力させる。
【００７３】
図１２は、第１の実施の形態におけるＲｅＲＡＭの可変抵抗素子の抵抗分布の一例を示す図である。同図における横軸は、抵抗値を示しており、縦軸は、セルの数の相対的な分布を相対値により示している。可変抵抗素子の抵抗状態は、所定の閾値Ｒ_readを境に、大きく２つの分布に分かれている。閾値Ｒ_readと比較して抵抗値が低い状態は、低抵抗状態（ＬＲＳ：Low-Resistance State）と呼ばれ、閾値Ｒ_readと比較して抵抗値が高い状態は、高抵抗状態（ＨＲＳ：High-Resistance State）と呼ばれる。不揮発性メモリ４１０は、可変抵抗素子に電圧を印加することにより、その抵抗状態を可逆的に変化させてメモリセルを書き換えることができる。このメモリセルへの電圧印加を止めても抵抗状態が保持されるため、ＲｅＲＡＭは不揮発メモリとして機能することができる。
【００７４】
また、可変抵抗素子のＬＲＳおよびＨＲＳのそれぞれには、論理値「０」および論理値「１」の何れかが対応付けられる。例えば、ＬＲＳに論理値「０」が対応付けられ、ＨＲＳに論理値「１」が対応付けられる。それぞれの状態に論理値「０」および論理値「１」の何れを対応付けるかは任意である。
【００７５】
ＨＲＳのメモリセルに対して、一定以上の電圧が印加されると、そのメモリセルはＬＲＳ（「０」）に遷移する。この動作を以下、「セット」動作と称する。一方、ＬＲＳのメモリセルに対して、逆方向の電圧が印加されると、そのメモリセルはＨＲＳ（「１」）に遷移する。この動作を以下、「リセット」動作と称する。
【００７６】
ベリファイにおいては、閾値Ｒ_readと異なる閾値が用いられる。例えば、セットしたメモリセルからデータを読み出す際にメモリ制御部４１７は、閾値Ｒ_readより低いＲ_verify_setを閾値に設定する。一方、リセットしたメモリセルからデータを読み出す際にメモリ制御部４１７は、閾値Ｒ_readより高いＲ_verify_resetを閾値に設定する。
【００７７】
［メモリコントローラの動作例］
図１３は、第１の実施の形態におけるメモリコントローラ３００の動作の一例を示すフローチャートである。この動作は、例えば、メモリコントローラ３００に電源が投入されたときに開始する。メモリコントローラ３００は、ホストコンピュータ１００からのコマンドをデコードし（ステップＳ９０１）、コマンドキュー３４０に追加する（ステップＳ９０２）。また、メモリコントローラ３００は、待機中のリードコマンド数およびライトコマンド数のそれぞれを計数する（ステップＳ９０３）。
【００７８】
そして、メモリコントローラ３００は、現在の優先モードがライト優先モードであるか否かを判断する（ステップＳ９０４）。ライト優先モードである場合に（ステップＳ９０４：Ｙｅｓ）、メモリコントローラ３００は、待機中のリードコマンド数がｎ以上であるか否かを判断する（ステップＳ９０５）。リードコマンド数がｎ以上である場合に（ステップＳ９０５：Ｙｅｓ）、メモリコントローラ３００は、リード優先モードに遷移する（ステップＳ９０６）。
【００７９】
現在の優先モードがリード優先モードである場合に（ステップＳ９０４：Ｎｏ）、メモリコントローラ３００は、待機中のライトコマンド数がｎ以上であるか否かを判断する（ステップＳ９０７）。ライトコマンド数がｎ以上である場合に（ステップＳ９０７：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードに遷移する（ステップＳ９０８）。
【００８０】
リードコマンド数がｎ未満である場合（ステップＳ９０５：Ｎｏ）、またはステップＳ９０６の後にメモリコントローラ３００は、リクエスト発行処理を実行する（ステップＳ９１０）。また、ライトコマンド数がｎ未満である場合（ステップＳ９０７：Ｎｏ）、またはステップＳ９０８の後にもメモリコントローラ３００は、リクエスト発行処理を実行する（ステップＳ９１０）。ステップＳ９１０の後に、メモリコントローラ３００は、ステップＳ９０１以降を繰り返す。
【００８１】
図１４は、第１の実施の形態におけるリクエスト発行処理の一例を示すフローチャートである。メモリコントローラ３００は、現在の優先モードがライト優先モードであるか否かを判断する（ステップＳ９１１）。ライト優先モードである場合に（ステップＳ９１１：Ｙｅｓ）、メモリコントローラ３００は、コマンドキュー３４０において取り出し可能なライトコマンドがあるか否かを判断する（ステップＳ９１２）。例えば、アクセスするメモリ領域において、リードデータの読出しが完了していない場合や、ライトデータの書込みが完了していない場合には、それらが完了してからライトコマンドが取り出される。
【００８２】
取り出し可能なライトコマンドが有る場合に（ステップＳ９１２：Ｙｅｓ）、メモリコントローラ３００は、ライトコマンドを取り出して処理し、ライトリクエストを発行する（ステップＳ９１６）。
【００８３】
一方、取り出し可能なライトコマンドが無い場合に（ステップＳ９１２：Ｎｏ）、メモリコントローラ３００は、コマンドキュー３４０において取り出し可能なリードコマンドがあるか否かを判断する（ステップＳ９１２）。例えば、アクセスするメモリ領域において、ライトデータの書込みが完了していない場合には、完了してからリードコマンドが取り出される。
【００８４】
取り出し可能なリードコマンドが有る場合に（ステップＳ９１３：Ｙｅｓ）、メモリコントローラ３００は、リードコマンドを取り出して処理し、リードリクエストを発行する（ステップＳ９１７）。
【００８５】
取り出し可能なリードコマンドが無い場合（ステップＳ９１３：Ｎｏ）、または、ステップＳ９１６またはＳ９１７の後にメモリコントローラ３００は、リクエスト発行処理を終了する。
【００８６】
また、リード優先モードである場合に（ステップＳ９１１：Ｎｏ）、メモリコントローラ３００は、コマンドキュー３４０において取り出し可能なリードコマンドがあるか否かを判断する（ステップＳ９１４）。取り出し可能なリードコマンドが有る場合に（ステップＳ９１４：Ｙｅｓ）、メモリコントローラ３００は、ステップＳ９１７を実行する。取り出し可能なリードコマンドが無い場合に（ステップＳ９１４：Ｎｏ）、メモリコントローラ３００は、取り出し可能なライトコマンドがあるか否かを判断する（ステップＳ９１５）。取り出し可能なライトコマンドが有る場合に（ステップＳ９１５：Ｙｅｓ）、メモリコントローラ３００は、ステップＳ９１６を実行する。取り出し可能なライトコマンドが無い場合に（ステップＳ９１５：Ｎｏ）、メモリコントローラ３００は、リクエスト発行処理を終了する。
【００８７】
図１５は、第１の実施の形態におけるメモリコントローラ３００の動作の一例を示すタイミングチャートである。同図におけるａは、リード優先モードにおけるタイミングチャートである。例えば、ホストコンピュータ１００が、メモリバンクｃｈ０乃至ｃｈ７に対応する論理アドレスを指定してリードコマンドを発行し、次に、それらのメモリバンクに対応する論理アドレスを指定してライトコマンドを発行したものとする。次いで、ホストコンピュータ１００が、再度メモリバンクｃｈ０乃至ｃｈ７に対応する論理アドレスを指定してリードコマンドを発行し、次に、それらのメモリバンクに対応する論理アドレスを指定してライトコマンドを発行したものとする。また、タイミングＴ１においてメモリコントローラ３００にリード優先モードが設定されたものとする。
【００８８】
メモリコントローラ３００は、まず、コマンドキュー３４０からリードコマンドを取り出す。そして、メモリコントローラ３００は、そのリードコマンドを処理し、メモリバンクｃｈ０乃至ｃｈ７のメモリアドレスを指定したリードリクエストＲｒ_ｃｈ０_０乃至Ｒｒ_ｃｈ７_０を発行する。それらの発行直後のタイミングＴ２においてコマンドキュー３４０内にリードコマンドが保持されているため、メモリコントローラ３００は、そのリードコマンドを処理可能か否かを判断する。タイミングＴ２においてメモリバンクｃｈ０についてリードデータの読出しが完了しているため、メモリコントローラ３００は、その時点でリードコマンドを処理することができる。メモリコントローラ３００は、メモリバンクｃｈ０のメモリアドレスを指定した次のリードリクエストＲｒ_ｃｈ０_１を発行する。続いて、メモリコントローラ３００は、メモリバンクｃｈ１乃至ｃｈ７のメモリアドレスを指定したリードリクエストＲｒ_ｃｈ１_１乃至Ｒｒ_ｃｈ７_１を順に発行する。
【００８９】
リードリクエストＲｒ_ｃｈ０_１乃至Ｒｒ_ｃｈ７_１の発行直後のタイミングＴ３において、処理可能なリードコマンドがコマンドキュー３４０に存在しない。このため、メモリコントローラ３００は、コマンドキュー３４０内のライトコマンドを処理可能か否かを判断する。リードデータの読出しが完了するタイミングＴ４において、ライトコマンドの処理が可能となる。このタイミングＴ４が経過するとメモリコントローラ３００は、ライトコマンドを取り出し、メモリバンクｃｈ０乃至ｃｈ７のメモリアドレスを指定したライトリクエストＷｒ_ｃｈ０_０乃至Ｗｒ_ｃｈ７_０を順に発行する。
【００９０】
それらのライトリクエストＷｒ_ｃｈ０_０乃至Ｗｒ_ｃｈ７_０の発行直後のタイミングＴ５において、処理可能なリードコマンドがコマンドキュー３４０に存在しない。このため、メモリコントローラ３００は、コマンドキュー３４０内のライトコマンドを処理可能か否かを判断する。メモリバンクｃｈ０についてのライト応答をメモリコントローラ３００が受け取ったタイミングＴ６において、ライトコマンドの処理が可能となる。このタイミングＴ６において、メモリコントローラ３００は、ライトコマンドを取り出し、メモリバンクｃｈ０のメモリアドレスを指定したライトリクエストＷｒ_ｃｈ０_１を発行する。続いて、メモリコントローラ３００は、メモリバンクｃｈ１乃至ｃｈ７のメモリアドレスを指定したライトリクエストＷｒ_ｃｈ１_１乃至Ｗｒ_ｃｈ７_１を順に発行する。これらのリクエストに対するライト応答の受け取りは、タイミングＴ８に完了する。
【００９１】
また、図１５において、リードグループ＃０は、リードリクエストＲｒ_ｃｈ０_０乃至Ｒｒ_ｃｈ７_０の集合を示し、リードグループ＃１は、リードリクエストＲｒ_ｃｈ０_１乃至Ｒｒ_ｃｈ７_１の集合を示す。ライトグループ＃０は、ライトリクエストＷｒ_ｃｈ０_０乃至Ｗｒ_ｃｈ７_０の集合を示し、ライトグループ＃１は、ライトリクエストＷｒ_ｃｈ０_１乃至Ｒｒ_ｃｈ７_１の集合を示す。
【００９２】
図１５におけるｂは、コマンドを到着順に処理する比較例におけるメモリコントローラの動作を示すタイミングチャートである。タイミングＴ１においてメモリコントローラ３００は、リードリクエストＲｒ_ｃｈ０_０乃至Ｒｒ_ｃｈ７_０を順に発行する。これらの発行完了直後のタイミングＴ２において、到着順では次にライトリクエストを発行する必要があるが、リードデータの読出しが完了するのはタイミングＴ３'である。このため、タイミングＴ３'が経過すると、メモリコントローラ３００は、ライトリクエストＷｒ_ｃｈ０_０乃至Ｗｒ_ｃｈ７_０を順に発行する。このように、リードデータの読出しが完了してからライトリクエストを発行することにより、リードデータとライトデータとの衝突を回避することができる。逆に言えば、リードリクエストの次にライトリクエストを発行する際にメモリコントローラ３００は、リードデータの読出し完了まで、ライトリクエストの発行を待たせる必要がある。
【００９３】
ライトリクエストＷｒ_ｃｈ０_０乃至Ｗｒ_ｃｈ７_０の発行直後のタイミングＴ４'において、到着順では次にリードリクエストを発行する必要があるが、メモリバンクｃｈ０のライト応答をメモリコントローラ３００が受け取るのはタイミングＴ５'である。このため、タイミングＴ５'が経過すると、メモリコントローラ３００は、リードリクエストＲｒ_ｃｈ０_１乃至Ｒｒ_ｃｈ７_１を順に発行する。これらの発行完了直後のタイミングＴ６'において、到着順では次にライトリクエストを発行する必要があるが、リードデータの読出しが完了するのはタイミングＴ７'である。このため、タイミングＴ７'が経過すると、メモリコントローラ３００は、ライトリクエストＷｒ_ｃｈ０_１乃至Ｗｒ_ｃｈ７_１を順に発行する。これらのリクエストに対するライト応答の受け取りは、タイミングＴ９'に完了する。
【００９４】
図１５におけるａおよびｂを比較すると、ａでは、リードリクエストの次に発行されるライトリクエストは１つのみである。例えば、メモリコントローラ３００は、タイミングＴ３でリードリクエストを発行した後、ｄＴが経過したタイミングＴ４で次のライトリクエストを発行している。一方、同図におけるｂでは、リードリクエストの次に発行されるライトリクエストは２つである。例えば、メモリコントローラ３００は、タイミングＴ２'でリードリクエストを発行した後、ｄＴが経過したタイミングＴ３'で次のライトリクエストを発行している。また、メモリコントローラ３００は、タイミングＴ６'でリードリクエストを発行した後、ｄＴが経過したタイミングＴ７'で次のライトリクエストを発行している。したがって、同図におけるａで一連のコマンドの処理が完了するタイミングＴ８は、同図におけるｂで処理が完了するタイミングＴ９'よりもｄＴだけ早くなる。
【００９５】
このように、リード優先モードでは、リードコマンドがコマンドキュー３４０から無くなるまで連続して処理されるため、リードデータの読出し完了までライトリクエストの発行が待たされることが少なくなる。したがって、コマンドを到着順に処理する場合と比較して、アクセス速度を向上させることができる。
【００９６】
図１６は、第１の実施の形態におけるメモリコントローラの動作の一例を示すタイミングチャートである。同図におけるａは、ライト優先モードにおけるタイミングチャートである。タイミングＴ１１において、ライト優先モードに切り替えられると、メモリコントローラ３００は、ライトグループ＃０乃至＃３内のライトリクエストを順に発行する。これらのライトリクエストの発行により、待機中のライトコマンドが無くなると、メモリコントローラ３００は、リードグループ＃０乃至＃３内のリードリクエストを順に発行する。
【００９７】
図１６におけるｂは、コマンドを到着順に処理する比較例におけるメモリコントローラの動作を示すタイミングチャートである。タイミングＴ１１において、メモリコントローラ３００はリードグループ＃０内のリードリクエストを順に発行し、次にライトグループ＃０内のライトリクエストを順に発行する。そして、ライトグループ＃１、リードグループ＃２、ライトグループ＃２、リードグループ＃３およびライトグループ＃３の順で、それらにおけるリクエストが順に発行される。
【００９８】
図１６におけるａおよびｂを比較すると、ａでは、リードリクエストの次に発行されるライトリクエストは無い。一方、同図におけるｂでは、リードリクエストの次に発行されるライトリクエストは４つある。このため、同図におけるａにおいて一連のコマンドの処理が完了するタイミングＴ１２は、同図において一連の処理が完了するタイミングＴ１３よりも早くなる。
【００９９】
図１５および図１６に例示したように、リード優先モードおよびライト優先モードのいずれにおいても、アクセス速度が向上する。
【０１００】
このように、本技術の第１の実施の形態によれば、待機中のコマンド数に基づいて優先モードを切り替えて、優先するコマンドをキューから全て取り出すため、メモリコントローラ３００は同じ種類のリクエストを連続して発行することができる。これにより、リードリクエストの次にライトリクエストを発行する際にリードデータの読出し完了までライトリクエストを待たせる時間の合計が短くなり、アクセス速度を向上させることができる。
【０１０１】
＜２．第２の実施の形態＞
上述の第１の実施の形態では、メモリコントローラ３００は、コマンドキュー３４０に保持されているコマンドの数を計数していたが、コマンドキュー３４０から取り出されたコマンド数を計数して、閾値と比較することもできる。この第２の実施の形態のメモリコントローラ３００は、コマンドキュー３４０から取り出されたコマンド数を計数する点において第１の実施の形態と異なる。
【０１０２】
図１７は、第２の実施の形態におけるリクエスト発行制御部３２０の一構成例を示すブロック図である。この第２の実施の形態のリクエスト発行制御部３２０は、待機中リードコマンド数計数部３２１および待機中ライトコマンド数計数部３２３および優先モード切替部３２４の代わりにコマンド処理数計数部３２５を備える点において第１の実施の形態と異なる。また、第２の実施の形態のリクエスト発行制御部３２０は、優先モード切替部３２４の代わりに優先モード切替部３２６を備える点において第１の実施の形態と異なる。また、第２の実施の形態のコマンドキュー３４０は、ライトコマンドキュー３４５およびリードコマンドキュー３４６を備える。これらのコマンドキューのキューサイズは、同じ値であってもよいし、異なる値であってもよい。
【０１０３】
ライトコマンドキュー３４５は、ライトコマンドをＦＩＦＯ方式で保持するものである。リードコマンドキュー３４６は、リードコマンドをＦＩＦＯ方式で保持するものである。ライトポインタ、リードポインタおよびコマンド数は、ライトコマンドキュー３４５およびリードコマンドキュー３４６のそれぞれについてレジスタ（不図示）に保持される。第２の実施の形態のコマンドデコーダ３２２およびリクエスト発行管理部３５０は、コマンドの追加および取り出しにおいて、コマンドキューごとのライトポインタ、リードポインタおよびコマンド数を第１の実施の形態と同様の方法で制御する。なお、ライトコマンドキュー３４５は、特許請求の範囲に記載のライトコマンド保持部の一例であり、リードコマンドキュー３４６は、特許請求の範囲に記載のリードコマンド保持部の一例である。
【０１０４】
コマンド処理数計数部３２５は、優先モードが切り替えられたときから取り出されたリードコマンドおよびライトコマンドのそれぞれの数を計数するものである。このコマンド処理数計数部３２５は、リードコマンドキュー３４６からリードコマンドが取り出されるたびにカウンタ値ＲＣＮＴを増分し、ライトコマンドキュー３４５からライトコマンドが取り出されるたびにカウンタ値ＷＣＮＴを増分する。そして、コマンド処理数計数部３２５は、それらのカウンタ値を優先モード切替部３２６に供給する。なお、コマンド処理数計数部３２５は、特許請求の範囲に記載の計数部の一例である。
【０１０５】
優先モード切替部３２６は、優先モードを切り替えるたびにカウンタ値ＲＣＮＴおよびＷＣＮＴをリセット信号ＲＳＴにより初期値にする。また、優先モード切替部３２６は、リード優先モードにおいて、カウンタ値ＲＣＮＴが所定の閾値Ｎｒ以上になると、ライト優先モードに切り替える。一方、ライト優先モードにおいて、カウンタ値ＷＣＮＴが所定の閾値Ｎｗ以上になると、優先モード切替部３２６は、リード優先モードに切り替える。閾値ＮｒおよびＮｗは、同じ値であってもよいし、異なる値であってもよい。
【０１０６】
図１８は、第２の実施の形態における優先モード切替部３２６の動作の一例を示す図である。優先モード切替部３２６は、リード優先モードにおいて、処理されたリードコマンド数（ＲＣＮＴ）が閾値Ｎｒ以上になると、ライト優先モードに切り替え、カウンタ値をリセットする。一方、ライト優先モードにおいて優先モード切替部３２６は、処理されたライトコマンド数（ＷＣＮＴ）が閾値Ｎｗ以上になると、リード優先モードに切り替え、カウンタ値をリセットする。
【０１０７】
図１９は、第２の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。メモリコントローラ３００は、リード優先モード５２０において、リードコマンドの処理数（ＲＣＮＴ）が閾値Ｎｒ以上になると、ライト優先モード５１０に遷移し、カウンタ値をリセットする。一方、ライト優先モード５１０においてメモリコントローラ３００は、ライトコマンドの処理数（ＷＣＮＴ）が閾値Ｎｗ以上になると、リード優先モード５２０に遷移し、カウンタ値をリセットする。
【０１０８】
図２０は、第２の実施の形態におけるメモリコントローラ３００の動作の一例を示す図である。この第３の実施の形態のメモリコントローラ３００の動作は、ステップＳ９０３乃至Ｓ９０８の代わりにステップＳ９２１乃至Ｓ９２７を実行する点において第１の実施の形態と異なる。
【０１０９】
メモリコントローラ３００は、コマンドをコマンドキュー３４０に追加し（ステップＳ９０２）、リクエスト発行処理を行う（ステップＳ９１０）。また、メモリコントローラ３００は、処理したコマンドの数を計数する（ステップＳ９２１）。そして、メモリコントローラ３００は、現在の優先モードがライト優先モードであるか否かを判断する（ステップＳ９２２）。
【０１１０】
ライト優先モードである場合に（ステップＳ９２２：Ｙｅｓ）、メモリコントローラ３００は、ライトコマンドの処理数ＷＣＮＴがＮｗ以上であるか否かを判断する（ステップＳ９２３）。ＷＣＮＴがＮｗ以上である場合に（ステップＳ９２３：Ｙｅｓ）、メモリコントローラ３００は、リード優先モードに遷移する（ステップＳ９２４）。
【０１１１】
一方、リード優先モードである場合に（ステップＳ９２２：Ｎｏ）、メモリコントローラ３００は、リードコマンドの処理数ＲＣＮＴがＮｒ以上であるか否かを判断する（ステップＳ９２６）。ＲＣＮＴがＮｒ以上である場合に（ステップＳ９２６：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードに遷移する（ステップＳ９２７）。ステップＳ９２４またはＳ９２７の後、メモリコントローラ３００は、カウンタ値をリセットする（ステップＳ９２５）。ＷＣＮＴがＮｗ未満の場合（ステップＳ９２３：Ｎｏ）、ＲＣＮＴがＮｒ未満の場合（ステップＳ９２６：Ｎｏ）、または、ステップＳ９２５の後、メモリコントローラ３００は、ステップＳ９０１以降を繰り返す。
【０１１２】
図２１は、第２の実施の形態におけるキュー占有率の変化の一例を示すグラフである。同図における縦軸は、コマンドキュー３４０全体におけるライトコマンドの比率を示す。同図における横軸は、処理したコマンドの数を示す。
【０１１３】
また、リードコマンドの処理数ＲＣＮＴと比較する閾値Ｎｒは４５であり、ライトコマンドの処理数ＷＣＮＴと比較する閾値Ｎｒは、４０である。また、コマンドのサイズはキロバイト（ＫＢ）である。これにより、メモリコントローラ３００は、リードコマンドを９０キロバイト（ＫＢ）処理したときにライト優先に切り替え、ライトコマンドを８０キロバイト（ＫＢ）処理したときにリード優先に切り替える。
【０１１４】
上述の条件の下で、メモリコントローラ３００が、リードコマンドおよびライトコマンドのそれぞれをランダムに繰り返し発行し、リードデータおよびライトデータのそれぞれを１０２４キロバイト（ＫＢ）転送した。転送時間を計測したところ、これらの合計２０４８キロバイト（ＫＢ）のデータ転送完了までに２６９７８２４ナノ秒（ｎｓ）を要した。したがって、スループットの測定値は、約７５９．１３０メガバイト毎秒（ＭＢ／ｓ）である。
【０１１５】
図２２は、第２の実施の形態における閾値を変えた場合のキュー占有率の変化の一例を示すグラフである。同図における縦軸は、コマンドキュー３４０全体におけるライトコマンドの比率を示す。同図における横軸は、処理したコマンドの数を示す。
【０１１６】
また、閾値Ｎｒおよび閾値Ｎｒをいずれも４０に変更された。これにより、メモリコントローラ３００は、リードコマンドを８０キロバイト（ＫＢ）処理したときにライト優先に切り替え、ライトコマンドを８０キロバイト（ＫＢ）処理したときにリード優先に切り替える。
【０１１７】
上述の条件の下で、メモリコントローラ３００が、同様にランダムアクセスを行ったところ、２０４８キロバイト（ＫＢ）のデータ転送完了までに２７４３４１６ナノ秒（ｎｓ）を要した。したがって、スループットの測定値は、約７４６・５１５メガバイト毎秒（ＭＢ／ｓ）である。
【０１１８】
これらの図２１および図２２に例示するように、ライトコマンドの占有率は、時間の経過に伴って増減する。これは、ライト優先モードとリード優先モードとに交互に優先モードが切り替えられたためである。
【０１１９】
図２３は、リード優先に固定した比較例におけるライトコマンドのキュー占有率の変化の一例を示すグラフである。スループット測定の際の諸条件は、図２１と同様であるものとする。
【０１２０】
図２３に例示するように、ライトコマンドの占有率は、時間の経過に伴って増加し、１００％付近のままで維持される。このため、ライトコマンドが長期間に亘ってコマンドキュー３４０内に滞留し、書込み速度が低下する。
【０１２１】
リード優先に固定してメモリコントローラ３００がランダムアクセスを行ったところ、２０４８キロバイト（ＫＢ）のサイズのデータ転送完了までに３０９１７６０ナノ秒（ｎｓ）を要した。したがって、スループットの測定値は、約６６２．４０６メガバイト毎秒（ＭＢ／ｓ）である。このように、スループットは、リード優先とライト優先とを切り替える場合よりも低下してしまう。
【０１２２】
図２４は、ライト優先に固定した比較例におけるライトコマンドのキュー占有率の変化の一例を示すグラフである。スループット測定の際の諸条件は、図２１と同様であるものとする。
【０１２３】
図２４に例示するように、ライトコマンドの占有率は、時間の経過に伴って低下し、０％付近のままで維持される。このため、リードコマンドが期間に亘ってコマンドキュー３４０内に滞留し、読出し速度が低下する。
【０１２４】
ライト優先に固定してメモリコントローラ３００がランダムアクセスを行ったところ、２０４８０００バイト（Ｂ）のサイズのデータ転送完了までに３７９０８８ナノ秒（ｎｓ）を要した。したがって、スループットの測定値は、約５３９．２１９メガバイト毎秒（ＭＢ／ｓ）である。このように、スループットは、リード優先とライト優先とを切り替える場合よりも低下してしまう。
【０１２５】
図２１乃至図２４に例示したように、ライト優先モードとリード優先モードとを切り替えることにより、モードを固定する場合よりもスループットが向上する。
【０１２６】
このように、本技術の第２の実施の形態によれば、処理したコマンド数に基づいて優先モードを切り替えて、優先するコマンドをキューから全て取り出すため、メモリコントローラ３００は同じ種類のリクエストを連続して発行することができる。これにより、リードリクエストの次にライトリクエストを発行する際にリードデータの読出し完了までライトリクエストを待たせる時間の合計が短くなり、アクセス速度を向上させることができる。
【０１２７】
＜３．第３の実施の形態＞
上述の第２の実施の形態では、メモリコントローラ３００は、コマンドキュー３４０から取り出されたコマンドの数に基づいて優先モードを切り替えていた。しかし、ホストコンピュータ１００によるリードコマンドおよびライトコマンドのそれそれの発行頻度が一方に偏っていると、優先モードの切り替えに時間がかかるおそれがある。例えば、リードコマンドの発行頻度がライトコマンドより高いと、ライト優先モードの継続時間が長くなる。この結果、書込み速度が速くなる一方で読出し速度が遅くなる。この第３の実施の形態におけるメモリコントローラ３００は、ライト優先モードおよびリード優先モードのそれぞれの継続時間を均等にする点において第１の実施の形態と異なる。
【０１２８】
図２５は、第３の実施の形態におけるメモリコントローラ３００の動作の一例を示す図である。この第３の実施の形態のメモリコントローラ３００は、コマンド処理数計数部３２５の代わりに、クロックサイクルカウンタ３２７を備える点において第２の実施の形態と異なる。また、第３の実施の形態のメモリコントローラ３００は、優先モード切替部３２６の代わりに優先モード切替部３２８を備える点において第２の実施の形態と異なる。
【０１２９】
クロックサイクルカウンタ３２７は、所定の周波数のクロック信号ＣＬＫに同期してカウンタ値ＣＣＮＴを計数するものである。このクロックサイクルカウンタ３２７は、カウンタ値ＣＣＮＴを優先モード切替部３２８に供給する。
【０１３０】
優先モード切替部３２８は、優先モードを切り替えてから経過した時間ＴＩＭをカウンタ値ＣＣＮＴに基づいて取得する。例えば、現在のカウンタ値ＣＣＮＴと優先モードを切り替えたときのカウンタ値ＣＣＮＴとの差分にクロック周期を乗じた値が経過時間ＴＩＭに該当する。そして、経過時間ＴＩＭが一定時間Ｎｔ以上である場合に優先モード切替部３２８は、優先モードを切り替える。この制御により、一定時間ごとに、優先モードが切り替わる。一定時間Ｎｔが長すぎると、書込み速度および読出し速度の一方が他方に対して著しく低下するおそれがある。このため、一定時間Ｎｔは、書込み速度および読出し速度のバランスが大きく崩れない程度の値であることが望ましい。
【０１３１】
図２６は、第３の実施の形態における優先モード切替部３２８の動作の一例を示す図である。リード優先モードにおいて、経過時間ＴＩＭが一定時間Ｎｔ以上である場合に、優先モード切替部３２８は、ライト優先モードに切り替える。一方、ライト優先モードにおいて、経過時間ＴＩＭが一定時間Ｎｔ以上である場合に、優先モード切替部３２８は、リード優先モードに切り替える。
【０１３２】
図２７は、第３の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。リード優先モード５２０に遷移してから一定時間が経過すると、メモリコントローラ３００は、ライト優先モード５１０に遷移する。また、ライト優先モード５１０に遷移してから一定時間が経過すると、メモリコントローラ３００は、リード優先モード５２０に遷移する。
【０１３３】
図２８は、第３の実施の形態におけるメモリコントローラ３００の動作の一例を示す図である。この第３の実施の形態のメモリコントローラ３００の動作は、ステップＳ９０５およびＳ９０７の代わりにステップＳ９３１およびＳ９３２を実行する点において第１の実施の形態と異なる。
【０１３４】
ライト優先モードである場合に（ステップＳ９０４：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードへの遷移から一定時間が経過したか否かを判断する（ステップＳ９３１）。一定時間が経過した場合に（ステップＳ９３１：Ｙｅｓ）、メモリコントローラ３００は、リード優先モードに遷移する（ステップＳ９０６）。
【０１３５】
現在の優先モードがリード優先モードである場合に（ステップＳ９０４：Ｎｏ）、メモリコントローラ３００は、リード優先モードへの遷移から一定時間が経過したか否かを判断する（ステップＳ９３２）。一定時間が経過した場合に（ステップＳ９３２：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードに遷移する（ステップＳ９０８）。
【０１３６】
遷移から一定時間が経過していない場合（ステップＳ９３１またはステップＳ９３２：Ｎｏ）、もしくは、ステップＳ９０６またはＳ９０８の後に、メモリコントローラ３００は、リクエスト発行処理を実行する（ステップＳ９１０）。
【０１３７】
このように、本技術の第３の実施の形態によれば、一定時間ごとに優先モードを切り替えて、優先するコマンドをキューから全て取り出すため、メモリコントローラ３００は同じ種類のリクエストを連続して発行することができる。これにより、リード優先モードおよびライト優先モードのそれぞれの継続時間を均等にして、書込み速度と読出し速度とを同程度にすることができる。
【０１３８】
＜４．第４の実施の形態＞
上述の第２の実施の形態では、メモリコントローラ３００は、コマンドキュー３４０から取り出されたコマンドの数に基づいて優先モードを切り替えていた。しかし、ホストコンピュータ１００によるリードコマンドおよびライトコマンドのそれぞれの発行頻度が一方に偏っていると、優先モードの切り替えに時間がかかるおそれがある。例えば、リードコマンドの発行頻度がライトコマンドより高いと、ライト優先モードの継続時間が長くなる。この結果、書込み速度が速くなる一方で読出し速度が遅くなる。この第４の実施の形態におけるメモリコントローラ３００は、書込み速度と読出し速度とを同程度にする点において第２の実施の形態と異なる。
【０１３９】
図２９は、第４の実施の形態におけるリクエスト発行制御部３２０の一構成例を示すブロック図である。この第４の実施の形態のリクエスト発行制御部３２０は、コマンドデコーダ３２２および優先モード切替部３２４の代わりに、コマンドデコーダ３２９および優先モード切替部３３０を備える点において第２の実施の形態と異なる。
【０１４０】
コマンドデコーダ３２９は、切替コマンドをデコードした場合に、そのデコードした切替コマンドを優先モード切替部３３０に供給する点において第２の実施の形態と異なる。ここで、切替コマンドは、ライト優先モードおよびリード優先モードのいずれかへの切り替えを指示するコマンドであり、ホストコンピュータ１００により必要に応じて発行される。例えば、書込み速度が比較的低い場合にホストコンピュータ１００は、ライト優先モードへの切り替えを指示する切替コマンドを発行する。一方、読出し速度が比較的低い場合にホストコンピュータ１００は、リード優先モードへの切り替えを指示する切替コマンドを発行する。
【０１４１】
優先モード切替部３３０は、取り出されたコマンド数ＷＣＮＴおよびＲＣＮＴのそれぞれに基づいて優先モードを切り替える。また、優先モード切替部３３０は、切替コマンドに従って優先モードを切り替える。
【０１４２】
図３０は、第４の実施の形態における優先モード切替部３３０の動作の一例を示す図である。リード優先モードにおいて、優先モード切替部３３０は、リードコマンド数ＲＣＮＴが閾値Ｎｒ以上の場合、または、切替コマンドがライト優先を指示する場合にライト優先に切り替え、カウンタ値をリセットする。また、ライト優先モードにおいて、優先モード切替部３３０は、ライトコマンド数ＷＣＮＴが閾値Ｎｒ以上の場合、または、切替コマンドがリード優先を指示する場合にリード優先に切り替え、カウンタ値をリセットする。
【０１４３】
図３１は、第４の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。リード優先モード５２０において、メモリコントローラ３００は、リードコマンド数ＲＣＮＴが閾値Ｎｒ以上の場合、または、切替コマンドがライト優先を指示する場合にライト優先モード５１０に遷移し、カウンタ値をリセットする。また、ライト優先モード５１０において、メモリコントローラ３００は、ライトコマンド数ＷＣＮＴが閾値Ｎｗ以上の場合、または、切替コマンドがリード優先を指示する場合にリード優先モード５２０に遷移し、カウンタ値をリセットする。
【０１４４】
図３２は、第４の実施の形態におけるメモリコントローラ３００の動作の一例を示す図である。この第４の実施の形態のメモリコントローラ３００の動作は、ステップＳ９４１およびＳ９４２をさらに実行する点において第２の実施の形態と異なる。
【０１４５】
ライト優先モードにおいてライトコマンドの処理数がＮｗ未満である場合（ステップＳ９２３：Ｎｏ）、メモリコントローラ３００は、切替コマンドによりリード優先が指示されたか否かを判断する（ステップＳ９４１）。ライトコマンドの処理数がＮｗ以上である場合（ステップＳ９２３：Ｙｅｓ）、または、リード優先が指示された場合（ステップＳ９４１：Ｙｅｓ）、メモリコントローラ３００は、リード優先モードに遷移する（ステップＳ９２４）。
【０１４６】
また、リード優先モードにおいてリードコマンドの処理数がＮｒ未満である場合（ステップＳ９２６：Ｎｏ）、メモリコントローラ３００は、切替コマンドによりライト優先が指示されたか否かを判断する（ステップＳ９４２）。リードコマンドの処理数がＮｒ以上である場合（ステップＳ９２６：Ｙｅｓ）、または、ライト優先が指示された場合（ステップＳ９４２：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードに遷移する（ステップＳ９２７）。
【０１４７】
リード優先が指示されていない場合（ステップＳ９４１：Ｎｏ）、ライト優先が指示されていない場合（ステップＳ９４２：Ｎｏ）、または、ステップＳ９２５の後、メモリコントローラ３００は、ステップＳ９０１を繰り返す。
【０１４８】
なお、メモリコントローラ３００は、処理したコマンド数が閾値を超えるか否かを判断しているが、第１の実施の形態と同様に、待機中のコマンド数が閾値を超えるか否かを判断してもよい。この場合にメモリコントローラ３００は、待機中のコマンド数が閾値を超えた場合、または、切替コマンドにより切り替えが指示された場合に優先モードを切り替える。
【０１４９】
また、メモリコントローラ３００は、処理したコマンド数が閾値を超えるか否かを判断しているが、第３の実施の形態と同様に、一定時間が経過したか否かを判断してもよい。この場合にメモリコントローラ３００は、切り替えてから一定時間が経過した場合、または、切替コマンドにより切り替えが指示された場合に優先モードを切り替える。
【０１５０】
このように、本技術の第４の実施の形態によれば、メモリコントローラ３００は、切替コマンドに従って優先モードを切り替えるため、書込み速度と読出し速度とに偏りがある場合に切替コマンドを発行すれば、それらの速度を同程度にすることができる。
【０１５１】
＜５．第５の実施の形態＞
上述の第１の実施の形態では、メモリコントローラ３００は、コマンドキュー３４０内のデコード後のコマンド数を計数し、その計数値によりモードを切り替えていた。しかし、このモード制御では、デコード前のコマンドを保持するホストコマンドキューをさらに設けた場合にスループットが低下するおそれがある。例えば、デコード前はライトコマンドの方がリードコマンドより多く、デコード後はライトコマンドおよびホストコマンドの個数が同程度であると仮定する。このときには、ライト優先モードにおいて、ホストコマンドキュー内にデコード前のライトコマンドがまだ残っているのに、メモリコントローラ３００がデコード後のライトコマンドを全て実行してリード優先モードに遷移することがある。このようなときには、モードの切替えが煩雑に生じ、スループットが低下するおそれがある。この第５の実施の形態のメモリコントローラ３００は、ホストコマンドキューを設けた構成において、スループットを向上させる点において第１の実施の形態と異なる。
【０１５２】
図３３は、第５の実施の形態におけるリクエスト発行制御部３２０の一構成例を示すブロック図である。この第５の実施の形態のリクエスト発行制御部３２０は、コマンドキュー３４０の代わりに、ホストコマンドキュー３６１およびメモリコマンドキュー３６４を備える。また、第５の実施の形態のリクエスト発行制御部３２０は、待機中リードコマンド数計数部３２１、待機中ライトコマンド数計数部コマンドキュー３２３の代わりにホストリードコマンド数計数部３６２およびホストライトコマンド数計数部３６３を備える。
【０１５３】
ホストコマンドキュー３６１は、ホストインターフェース３１１からのコマンドをホストコマンドとして保持するものである。このホストコマンドは、前述したように論理アドレスを指定する。ホストコマンドのうち、リードコマンドを以下、「ホストリードコマンド」と称し、ライトコマンドを「ホストライトコマンド」と称する。ホストコマンドキュー３６１は、ＦＩＦＯ方式で、到着順にコマンドを保持する。これらのホストコマンドは、コマンドデコーダ３２２により、到着順に取り出される。なお、ホストコマンドキュー３６１は、特許請求の範囲に記載のホストコマンド保持部の一例である。
【０１５４】
コマンドデコーダ３２２は、ホストコマンドの論理アドレスを物理アドレスに変換する。ここで、物理アドレスは、不揮発性メモリ４１０内の記憶素子のそれぞれに割り当てられたアドレスである。また、コマンドデコーダ３２２は、ホストコンピュータ１００がアクセスする際のアクセス単位と、メモリコントローラ２００がアクセスする際のアクセス単位との相違に応じて、ホストコマンドを分割する。例えば、ホスト側のアクセス単位が４キロバイト（ｋＢ）で、メモリコントローラ側のアクセス単位が２キロバイト（ｋＢ）である場合には、コマンドデコーダ３２２は、ホストコマンドのそれぞれを２分割する。コマンドデコーダ３２２は、アドレス変換および分割を含むデコード処理を行ったコマンドをメモリコマンドキュー３６４に供給する。
【０１５５】
メモリコマンドキュー３６４は、デコード後のコマンドをメモリコマンドとして保持するものである。このメモリコマンドキュー３６４の構成は、コマンドキュー３４０と同様である。メモリコマンドのうち、リードコマンドを以下、「メモリリードコマンド」と称し、ライトコマンドを「メモリライトコマンド」と称する。なお、メモリコマンドキュー３６４は、特許請求の範囲に記載のメモリコマンド保持部の一例である。
【０１５６】
ホストリードコマンド数計数部３６２は、ホストコマンドキュー３６１が保持しているホストリードコマンドの数を計数するものである。ホストリードコマンド数計数部３６２は、カウンタ値をＲＣＮＴとして優先モード切替部３２４およびリクエスト発行管理部３５０に供給する。
【０１５７】
ホストライトコマンド数計数部３６３は、ホストコマンドキュー３６１が保持しているホストライトコマンドの数を計数するものである。ホストライトコマンド数計数部３６３は、カウンタ値をＷＣＮＴとして優先モード切替部３２４およびリクエスト発行管理部３５０に供給する。
【０１５８】
図３４は、第５の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。メモリコントローラ３００は、リード優先モード５２０において、待機中のホストライトコマンド数（ＷＣＮＴ）が閾値Ｎｗ以上になると、ライト優先モード５１０に遷移する。一方、ライト優先モード５１０においてメモリコントローラ３００は、待機中のホストリードコマンド数（ＷＣＮＴ）が閾値Ｎｒ以上になると、リード優先モード５２０に遷移する。
【０１５９】
図３５は、第５の実施の形態におけるメモリコントローラ３００の動作の一例を示すタイミングチャートである。ホストコマンドキュー３６１のエントリ数は、例えば、「４」であるものとする。また、例えば、ホストリードコマンドが２回連続して発行されるたびに、ホストライトコマンドが１回発行されるものとする。そして、初期状態のモードは、リード優先モードであるものとし、ＮｒおよびＮｗはいずれも「３」であるものとする。
【０１６０】
３回目にホストライトコマンドが発行されたＴ１のタイミングにおいて、ホストコマンドキュー３６１内のホストライトコマンド数ＷＣＮＴは「３」となり、Ｎｗ以上となる。このため、メモリコントローラ３００はライト優先モードに移行する。そして、メモリコントローラ３００は、タイミングＴ１から、オーバーヘッドｄＴが経過したタイミングにおいてメモリライトコマンドの連続的な実行を開始する。
【０１６１】
そして、タイミングＴ１から２回に亘ってホストリードコマンドが発行されたＴ２のタイミングにおいて、ホストコマンドキュー３６１内のホストリードコマンド数ＲＣＮＴは「３」となり、Ｎｒ以上となる。このため、メモリコントローラ３００はリード優先モードに移行する。そして、メモリコントローラ３００は、タイミングＴ２から、オーバーヘッドｄＴが経過したタイミングにおいてメモリリードコマンドの連続的な実行を開始する。
【０１６２】
図３６は、比較例におけるメモリコントローラの動作の一例を示すタイミングチャートである。この比較例のメモリコントローラは、ホストコマンドキュー３６１およびメモリコマンドキュー３６４を備え、また、第１の実施の形態と同様にメモリコマンドの計数値に基づいてモードを切り替えるものとする。また、ホストライトコマンドとホストリードコマンドとの発行比率は、図３５と同様であるものとする。メモリコマンドキュー３６４のエントリ数は「８」であり、ＮｒおよびＮｗはいずれも「４」であるものとする。
【０１６３】
２回目にホストライトコマンドが発行されたｔ１のタイミングにおいて、メモリコマンドキュー３６４内のメモリライトコマンド数ＷＣＮＴは「４」となり、Ｎｗ以上となる。このため、比較例のメモリコントローラはライト優先モードに移行する。そして、メモリコントローラは、タイミングｔ１から、オーバーヘッドｄＴが経過したタイミングにおいてメモリライトコマンドの連続的な実行を開始する。
【０１６４】
そして、タイミングｔ１から２回に亘ってホストリードコマンドが発行されたｔ２のタイミングにおいて、メモリコマンドキュー３６４内のメモリリードコマンド数ＲＣＮＴは「４」となり、Ｎｒ以上となる。このため、比較例のメモリコントローラはリード優先モードに移行する。そして、メモリコントローラ３００は、タイミングｔ２から、オーバーヘッドｄＴが経過したタイミングにおいてメモリリードコマンドの連続的な実行を開始する。
【０１６５】
図３４に例示するように、比較例のメモリコントローラは、３回目にホストライトコマンドが発行されたタイミングＴ１までの間に優先モードを３回切り替えている。この切り替え回数は、図３５に例示するようにタイミングＴ１までに２回のみ優先モードを切り替える第５の実施の形態よりも多い。これは、ホストコマンドキュー３６１内にライトコマンドが残っているにも関わらず、メモリコマンドキュー３６４内のライトコマンドが枯渇してリードコマンドを実行せざるを得なくなり、リード優先モードに切り替えているためである。
【０１６６】
この比較例に対して、メモリコントローラ３００は、ホストコマンドキュー３６１内のコマンド数に基づいて優先モードを切り替えるため、切替えの頻度を少なくしてスループットを向上させることができる。
【０１６７】
図３７は、第５の実施の形態におけるメモリコントローラ３００の動作の一例を示すフローチャートである。メモリコントローラ３００は、ホストコマンドキュー３６１にホストコマンドを追加し（ステップＳ９５１）、待機中のホストコマンド数を計数する（ステップＳ９５２）。また、メモリコントローラ３００は、ホストコマンドを到着順に取り出してデコードし（ステップＳ９０１）、メモリコマンドキュー３６４に追加する（ステップＳ９５３）。
【０１６８】
そして、メモリコントローラ３００は、現在の優先モードがライト優先モードであるか否かを判断する（ステップＳ９０４）。ライト優先モードである場合に（ステップＳ９０４：Ｙｅｓ）、メモリコントローラ３００は、待機中のホストリードコマンド数がＮｒ以上であるか否かを判断する（ステップＳ９５４）。リードコマンド数がＮｒ以上である場合に（ステップＳ９５４：Ｙｅｓ）、メモリコントローラ３００は、リード優先モードに遷移する（ステップＳ９０６）。
【０１６９】
一方、現在の優先モードがリード優先モードである場合に（ステップＳ９０４：Ｎｏ）、メモリコントローラ３００は、待機中のホストライトコマンド数がＮｗ以上であるか否かを判断する（ステップＳ９５５）。ライトコマンド数がＮｗ以上である場合に（ステップＳ９５５：Ｙｅｓ）、メモリコントローラ３００は、ライト優先モードに遷移する（ステップＳ９０８）。
【０１７０】
リードコマンド数がＮｒ未満である場合（ステップＳ９５４：Ｎｏ）、またはステップＳ９０６の後にメモリコントローラ３００は、リクエスト発行処理を実行する（ステップＳ９１０）。また、ライトコマンド数がＮｗ未満である場合（ステップＳ９５５：Ｎｏ）、またはステップＳ９０８の後にもメモリコントローラ３００は、リクエスト発行処理を実行する（ステップＳ９１０）。ステップＳ９１０の後に、メモリコントローラ３００は、ステップＳ９５１以降を繰り返す。
【０１７１】
このように、本技術の第５の実施の形態によれば、待機中のホストコマンド数に基づいて優先モードを切り替えるため、ホストコマンドキュー３６１が設けられた構成においてモードを切り替える頻度を少なくすることができる。これにより、スループットを向上させることができる。
【０１７２】
＜６．第６の実施の形態＞
上述の第２の実施の形態では、メモリコントローラ３００は、取り出して実行したコマンド数が固定の閾値を超えるか否かにより優先モードを切り替えていた。しかし、閾値が不適切であると、切替えが効率的に行われず、スループットが十分に向上しないことがある。この第６の実施の形態のメモリコントローラ３００は、適切な閾値を設定する点において第２の実施の形態と異なる。
【０１７３】
図３８は、第６の実施の形態におけるリクエスト発行制御部３２０の一構成例を示すブロック図である。第６の実施の形態のリクエスト発行制御部３２０は、コマンドキュー３４０および優先モード切替部３２６の代わりにホストコマンドキュー３６１、メモリコマンドキュー３６４および優先モード切替部３６７を備える点において第２の実施の形態と異なる。また、第６の実施の形態のリクエスト発行制御部３２０は、待機中リードコマンド数計数部３２１および待機中ライトコマンド数計数部３２３をさらに備える点において第２の実施の形態と異なる。
【０１７４】
第６の実施の形態のホストコマンドキュー３６１の構成は、第５の実施の形態と同様である。また、メモリコマンドキュー３６４は、ライトコマンドキュー３６５およびリードコマンドキュー３６６を備える。これらのキューの構成は、第２の実施の形態と同様である。
【０１７５】
第６の実施の形態の待機中リードコマンド数計数部３２１は、リードコマンドキュー３６６が保持しているメモリリードコマンドの数を待機中リードコマンド数ＲＣＮＴｑとして計数する。また、第６の実施の形態の待機中リードコマンド数計数部３２２は、ライトコマンドキュー３６５が保持しているメモリライトコマンドの数を待機中ライトコマンド数ＷＣＮＴｑとして計数する。また、第６の実施の形態のコマンド処理数計数部３２５は、メモリライトコマンドの処理数と、メモリリードコマンドの処理数とをＷＣＮＴｑおよびＲＣＮＴｑとして計数する。
【０１７６】
優先モード切替部３６７は、初期状態においてＮｗおよびＮｒに初期値を設定する。また、優先モード切替部３６７は、ライト優先モードにおいてライトコマンド処理数ＷＣＮＴｑがＮｗ以上であればリード優先モードに切り替える。そして、優先モード切替部３６７は、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅを初期値にリセットし、Ｎｗに待機中ライトコマンド数ＷＣＮＴｑを設定する。
【０１７７】
一方、優先モード切替部３６７は、リード優先モードにおいてリードコマンド処理数ＲＣＮＴｑがＮｒ以上であればライト優先モードに切り替える。そして、優先モード切替部３６７は、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅを初期値にリセットし、Ｎｒに待機中リードコマンド数ＷＣＮＴｑを設定する。このように、閾値Ｎｗには、ライト優先モードに切り替えたときの待機中ライトコマンド数ＷＣＮＴｑが設定され、閾値Ｎｒには、リード優先モードに切り替えたときの待機中リードコマンド数ＲＣＮＴｑが設定される。すなわち、閾値が動的に変更される。
【０１７８】
図３９は、第６の実施の形態における優先モード切替部３６７の動作の一例を示す図である。優先モード切替部３６７は、リード優先モードにおいて、リードコマンド処理数（ＲＣＮＴｅ）が閾値Ｎｒ以上になると、ライト優先モードに切り替え、カウンタ値をリセットする。このＮｒは、リード優先モードに切り替えたときの待機中リードコマンド数ＲＣＮＴｑである。
【０１７９】
一方、ライト優先モードにおいて優先モード切替部３６７は、ライトコマンド処理数（ＷＣＮＴｅ）が閾値Ｎｗ以上になると、リード優先モードに切り替え、カウンタ値をリセットする。このＮｗは、ライト優先モードに切り替えたときの待機中ライトコマンド数ＷＣＮＴｑである。
【０１８０】
図４０は、第２の実施の形態におけるメモリコントローラ３００の状態遷移図の一例である。メモリコントローラ３００は、リード優先モード５２０において、リードコマンド処理数（ＲＣＮＴｅ）が閾値Ｎｒ（＝ＲＣＮＴｑ）以上になると、ライト優先モード５１０に遷移し、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅをリセットする。また、メモリコントローラ３００は、閾値Ｎｗに待機中ライトコマンド数ＷＣＮＴｑを設定する。
【０１８１】
一方、ライト優先モード５１０においてメモリコントローラ３００は、ライトコマンド処理数（ＷＣＮＴｅ）が閾値Ｎｗ以上になると、リード優先モード５２０に遷移し、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅをリセットする。また、メモリコントローラ３００は、閾値Ｎｒに待機中リードコマンド数ＲＣＮＴｑを設定する。
【０１８２】
図４１は、第６の実施の形態におけるメモリコントローラ３００の動作の一例を示すタイミングチャートである。ライトコマンドキュー３６５およびリードコマンドキュー３６６のそれぞれのエントリ数は、例えば、「８」であるものとする。また、例えば、ホストリードコマンドが２回連続して発行されるたびに、ホストライトコマンドが１回発行されるものとする。そして、初期状態のモードは、リード優先モードであるものとし、ＮｒおよびＮｗの初期値は、いずれも「４」であるものとする。
【０１８３】
タイミングＴ１において、リードコマンド処理数は「４」となり、Ｎｒ以上となる。このため、メモリコントローラ３００は、ライト優先モードに切り替え、その切り替え時の待機中ライトコマンド数「４」をＮｗに設定する。そして、タイミングＴ１から４つのメモリライトコマンドが実行されたタイミングＴ２において、ライトコマンド処理数は「４」となり、Ｎｗ以上となる。このため、メモリコントローラ３００は、リード優先モードに切り替え、その切り替え時の待機中リードコマンド数「８」をＮｒに設定する。
【０１８４】
そして、タイミングＴ２から８つのメモリリードコマンドが実行されたタイミングＴ３において、リードコマンド処理数は「８」となり、Ｎｒ以上となる。このため、メモリコントローラ３００は、ライト優先モードに切り替え、その切り替え時の待機中リードコマンド数「４」をＮｗに設定する。このように、閾値ＮｗおよびＮｒは、メモリコマンドキュー３６４に保持されたコマンド数により動的に変更される。これにより、効率的にモードを切り替えることができる。例えば、タイミングＴ２においては、リードコマンドキュー３６６内に閾値Ｎｒの初期値「４」よりも多くのリードコマンドが保持されている。この場合に閾値Ｎｒが初期値のままだと、キュー内のメモリリードコマンドが全て取り出されていない状態でライト優先モードに切り替わるおそれがある。しかし、メモリコントローラ３００は、待機中リードコマンド数である「８」をＮｒに新たに設定するため、適切な閾値の設定によりモードを効率的に切り替えることができる。
【０１８５】
図４２は、第６の実施の形態におけるメモリコントローラ３００の動作の一例を示すフローチャートである。メモリコントローラ３００は、ステップＳ９２５の代わりにステップＳ９６１およびＳ９６２を実行する点において図２０に例示した第２の実施の形態と異なる。
【０１８６】
リード優先モードに遷移すると（ステップＳ９２４）、メモリコントローラ３００は、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅをリセットし、閾値Ｎｒに待機中リードコマンド数ＲＣＮＴｑを設定する（ステップＳ９６１）。また、ライト優先モードに遷移すると（ステップＳ９２７）、メモリコントローラ３００は、カウンタ値ＷＣＮＴｅおよびＲＣＮＴｅをリセットし、閾値Ｎｗに待機中ライトコマンド数ＷＣＮＴｑを設定する（ステップＳ９６２）。
【０１８７】
このように、本技術の第６の実施の形態によれば、優先モード切替え時の待機中コマンド数を閾値に設定するため、適切な閾値により優先モードを効率的に切り替えることができる。これにより、スループットを向上させることができる。
【０１８８】
なお、上述の各実施の形態において、メモリコントローラ３００は、優先コマンドの全てを取り出してから優先コマンドでないコマンドを取り出しているが、優先コマンドの全てを取り出す前に優先コマンドでない方を取り出すことがあってもよい。例えば、不揮発性メモリＡおよびＢが２つメモリコントローラ３００に接続される構成を想定する。この構成において不揮発性メモリＡがライト優先モードで処理中（ビジー）である等の理由により、その不揮発性メモリＡからメモリコントローラ３００がライトコマンドを全て取り出すことができないことがある。この場合であっても、メモリコントローラ３００は、アイドル中の不揮発性メモリＢ内に、非優先のリードコマンドがあれば、そのリードコマンドを取り出すことができる。つまり、メモリコントローラ３００は、優先コマンドを優先して不揮発性メモリから順に取り出してから、優先コマンドでないコマンドの取り出しを行えばよい。
【０１８９】
なお、上述の実施の形態は本技術を具現化するための一例を示したものであり、実施の形態における事項と、特許請求の範囲における発明特定事項とはそれぞれ対応関係を有する。同様に、特許請求の範囲における発明特定事項と、これと同一名称を付した本技術の実施の形態における事項とはそれぞれ対応関係を有する。ただし、本技術は実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において実施の形態に種々の変形を施すことにより具現化することができる。
【０１９０】
また、上述の実施の形態において説明した処理手順は、これら一連の手順を有する方法として捉えてもよく、また、これら一連の手順をコンピュータに実行させるためのプログラム乃至そのプログラムを記憶する記録媒体として捉えてもよい。この記録媒体として、例えば、ＣＤ（Compact Disc）、ＭＤ（MiniDisc）、ＤＶＤ（Digital Versatile Disc）、メモリカード、ブルーレイディスク（Blu-ray（登録商標）Disc）等を用いることができる。
【０１９１】
なお、ここに記載された効果は必ずしも限定されるものではなく、本開示中に記載されたいずれかの効果であってもよい。
なお、本技術は以下のような構成もとることができる。
（１）種類の異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替部と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理部と
を具備するメモリコントローラ。
（２）前記コマンド処理部は、前記優先コマンドの全てを前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出す
前記（１）記載のメモリコントローラ。
（３）前記２つのコマンドのそれぞれの数を計数して計数値を生成する計数部をさらに具備し、
前記切替部は、前記２つのコマンドのそれぞれの計数値が所定の閾値を超えたか否かに基づいて前記優先コマンドを切り替える
前記（１）記載のメモリコントローラ。
（４）前記計数部は、前記保持部に保持された前記コマンドの数を計数する
前記（３）記載のメモリコントローラ。
（５）前記計数部は、前記保持部から取り出された前記コマンドの数を計数する
前記（３）記載のメモリコントローラ。
（６）前記コマンドの指定する論理アドレスを物理アドレスに変換する論物アドレス変換を行うアドレス変換部をさらに具備し、
前記保持部は、
前記論物アドレス変換が行われた後の前記コマンドをメモリコマンドとして保持するメモリコマンド保持部と、
前記アドレス変換が行われる前の前記コマンドをホストコマンドとして保持するホストコマンド保持部と
を備える前記（３）記載のメモリコントローラ。
（７）前記計数部は、前記ホストコマンド保持部に保持された前記ホストコマンドの数を計数する
前記（６）記載のメモリコントローラ。
（８）前記計数部は、前記メモリコマンド保持部に保持された前記メモリコマンドの数を待機中コマンド数として計数し、前記メモリコマンド保持部から取り出された前記メモリコマンドの数を処理コマンド数として計数し、
前記閾値は、前記優先コマンドを切り替えたときの前記待機中コマンド数であり、
前記切替部は、前記処理コマンド数が前記閾値を超えるか否かに基づいて前記優先コマンドを切り替える
前記（６）記載のメモリコントローラ。
（９）前記優先モード切替部は、一定時間が経過するたびに前記優先コマンドを切り替える
前記（１）乃至（８）のいずれかに記載のメモリコントローラ。
（１０）前記切替部は、前記優先コマンドの切り替えを指示する特定のコマンドに従って前記優先コマンドを切り替える
前記（１）乃至（８）のいずれかに記載のメモリコントローラ。
（１１）前記２つのコマンドの一方は、データの読出しを指示するリードコマンドであり、
前記２つのコマンドの他方は、データの書込みを指示するライトコマンドであり、
前記保持部は、
前記リードコマンドを保持するリードコマンド保持部と、
前記ライトコマンドを保持するライトコマンド保持部と
を備える前記（１）乃至（１０）のいずれかに記載のメモリコントローラ。
（１２）メモリセルと、
前記メモリセルにアクセスするための互いに異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持する保持部と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替部と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理部と
を具備するメモリシステム。
（１３）種類の異なる２つのコマンドのいずれかが入力されるたびに当該入力されたコマンドを保持部に保持する保持手順と、
前記２つのコマンドのうち優先すべき優先コマンドを前記２つのコマンドの一方から他方に切り替える切替手順と、
前記優先コマンドを優先して前記保持部から順に取り出してから前記優先コマンドに該当しない方のコマンドを前記保持部から順に取り出すコマンド処理手順と
を具備するメモリコントローラの制御方法。
【符号の説明】
【０１９２】
１００  ホストコンピュータ
２００  ストレージ
３００  メモリコントローラ
３１１  ホストインターフェース
３１２  ＲＡＭ
３１３  ＣＰＵ
３１４  ＥＣＣ処理部
３１５  ＲＯＭ
３１６、４１５  バス
３１７  メモリインターフェース
３２０  リクエスト発行制御部
３２１  待機中リードコマンド数計数部
３２２、３２９  コマンドデコーダ
３２３  待機中ライトコマンド数計数部
３２４、３２６、３２８、３３０、３６７  優先モード切替部
３２５  コマンド処理数計数部
３２７  クロックサイクルカウンタ
３４０  コマンドキュー
３４１  コマンド保持部
３４５、３６５  ライトコマンドキュー
３４６、３６６  リードコマンドキュー
３５０  リクエスト発行管理部
３５１  取り出しコマンド切替制御部
３５２  取り出し部
３５３  リクエスト発行部
３６１  ホストコマンドキュー
３６２  ホストリードコマンド数計数部
３６３  ホストライトコマンド数計数部
３６４  メモリコマンドキュー
４００  メモリバンク
４１０  不揮発性メモリ
４１１  データバッファ
４１２  メモリセルアレイ
４１３  ドライバ
４１４  アドレスデコーダ
４１６  制御インターフェース
４１７  メモリ制御部
【図１】
2017054483.tif 000003
【図２】
2017054483.tif 000004
【図３】
2017054483.tif 000005
【図４】
2017054483.tif 000006
【図５】
2017054483.tif 000007
【図６】
2017054483.tif 000008
【図７】
2017054483.tif 000009
【図８】
2017054483.tif 000010
【図９】
2017054483.tif 000011
【図１０】
2017054483.tif 000012
【図１１】
2017054483.tif 000013
【図１２】
2017054483.tif 000014
【図１３】
2017054483.tif 000015
【図１４】
2017054483.tif 000016
【図１５】
2017054483.tif 000017
【図１６】
2017054483.tif 000018
【図１７】
2017054483.tif 000019
【図１８】
2017054483.tif 000020
【図１９】
2017054483.tif 000021
【図２０】
2017054483.tif 000022
【図２１】
2017054483.tif 000023
【図２２】
2017054483.tif 000024
【図２３】
2017054483.tif 000025
【図２４】
2017054483.tif 000026
【図２５】
2017054483.tif 000027
【図２６】
2017054483.tif 000028
【図２７】
2017054483.tif 000029
【図２８】
2017054483.tif 000030
【図２９】
2017054483.tif 000031
【図３０】
2017054483.tif 000032
【図３１】
2017054483.tif 000033
【図３２】
2017054483.tif 000034
【図３３】
2017054483.tif 000035
【図３４】
2017054483.tif 000036
【図３５】
2017054483.tif 000037
【図３６】
2017054483.tif 000038
【図３７】
2017054483.tif 000039
【図３８】
2017054483.tif 000040
【図３９】
2017054483.tif 000041
【図４０】
2017054483.tif 000042
【図４１】
2017054483.tif 000043
【図４２】
2017054483.tif 000044