(57)【特許請求の範囲】
【請求項１】
メモリデバイスであって、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記メモリデバイスに供給される電力の異常を検出すると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
メモリデバイス。
【請求項２】
前記コントローラは、前記電源から前記メモリデバイスに供給される電力の異常を検出すると、前記書き込み要求の受け取りを停止する、
請求項１のメモリデバイス。
【請求項３】
前記コントローラは、複数のクロックサイクルで前記書き込み要求を受け取る、
請求項１のメモリデバイス。
【請求項４】
情報を一時的に記憶するバッファメモリをさらに備え、
前記コントローラは、
前記ホスト装置から受け取った前記書き込み要求に含まれる書き込み対象のデータを前記バッファメモリに記憶した後、前記バッファメモリに記憶した前記書き込み対象のデータに基づいてデータの書き込みを行う、
請求項１のメモリデバイス。
【請求項５】
前記電力保持部はキャパシタであり、
前記キャパシタの容量は、少なくとも、前記電源から前記メモリデバイスに供給される電力に異常が発生した際に、既に受け取った前記書き込み要求に基づくデータの書き込みを行うのに必要な電力量を蓄えることができる値に設定される、
請求項１のメモリデバイス。
【請求項６】
前記メモリデバイスは第２のメモリデバイスと接続され、
前記コントローラは、前記ホスト装置から、前記第２のメモリデバイスに対するデータの書き込みを要求する第２の書き込み要求を受け取ると、該第２の書き込み要求を前記第２のメモリデバイスに転送する、
請求項１のメモリデバイス。
【請求項７】
前記コントローラは、前記電源から前記メモリデバイスに供給される電力の異常を検出すると、前記電力保持部から供給される電力を用いて、既に受け取った前記第２の書き込み要求を前記第２のメモリデバイスに転送する、
請求項６のメモリデバイス。
【請求項８】
前記メモリデバイスは第２のメモリデバイスと接続され、
前記コントローラは、
前記第２のメモリデバイスから、前記ホスト装置とは異なる第２のホスト装置が前記不揮発メモリに対するデータの書き込みを要求する第３の書き込み要求を受け取った後に、該第３の書き込み要求に基づくデータの書き込みを行い、
前記電源から前記メモリデバイスに供給される電力の異常を検出すると、前記第２のメモリデバイスから受け取っている途中の前記第３の書き込み要求があれば、前記電力保持部から供給される電力を用いて、前記第２のメモリデバイスからの前記第３の書き込み要求の受け取りを継続する、
請求項１のメモリデバイス。
【請求項９】
前記コントローラは、前記電力保持部から供給される電力を用いて、受け取りが完了した前記第３の書き込み要求に基づくデータの書き込みを行う、
請求項８のメモリデバイス。
【請求項１０】
前記コントローラは、前記電源から前記メモリデバイスに供給される電力の電圧が閾値以下になると、前記電源から前記メモリデバイスに供給される電力に異常が発生したと判断する、
請求項１のメモリデバイス。
【請求項１１】
メモリデバイスであって、
不揮発メモリと、
前記メモリデバイスと接続された第２のメモリデバイスから、ホスト装置が前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記メモリデバイスに供給される電力の異常を検出すると、前記電力保持部から供給される電力を用いて、既に受け取った前記書き込み要求に基づくデータの書き込みを行い、前記第２のメモリデバイスから受け取っている途中の前記書き込み要求があれば、前記電力保持部から供給される電力を用いて、前記第２のメモリデバイスからの前記書き込み要求の受け取りを継続する、
メモリデバイス。
【請求項１２】
メモリデバイスであって、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、を備え、
前記コントローラは、
電源から前記メモリデバイスに供給される電力の異常を検出すると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電源から供給される電力を保持する電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
メモリデバイス。
【請求項１３】
メモリデバイスであって、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記メモリデバイスに供給される電力の電圧が閾値以下になると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
メモリデバイス。
【請求項１４】
メモリデバイスであって、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、を備え、
前記コントローラは、
電源から前記メモリデバイスに供給される電力の電圧が閾値以下になると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電源から供給される電力を保持する電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
メモリデバイス。
【請求項１５】
メモリデバイスであって、
不揮発キャッシュメモリと、
不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込むコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記メモリデバイスに供給される電力の異常を検出すると、前記電力保持部から供給される電力を用いて、既に受け取った前記書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込む、
メモリデバイス。
【請求項１６】
メモリデバイスであって、
不揮発キャッシュメモリと、
不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込むコントローラと、を備え、
前記コントローラは、
電源から前記メモリデバイスに供給される電力の異常を検出すると、前記電源から供給される電力を保持する電力保持部から供給される電力を用いて、既に受け取った前記書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込む、
メモリデバイス。
【請求項１７】
メモリデバイスであって、
不揮発キャッシュメモリと、
不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込むコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記メモリデバイスに供給される電力の電圧が閾値以下になると、前記電力保持部から供給される電力を用いて、既に受け取った前記書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込む、
メモリデバイス。
【請求項１８】
メモリデバイスであって、
不揮発キャッシュメモリと、
不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込むコントローラと、を備え、
前記コントローラは、
電源から前記メモリデバイスに供給される電力の電圧が閾値以下になると、前記電源から供給される電力を保持する電力保持部から供給される電力を用いて、既に受け取った前記書き込み要求に対応する書き込み情報を前記不揮発キャッシュメモリに書き込む、
メモリデバイス。
【請求項１９】
半導体装置であって、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記半導体装置に供給される電力の異常を検出すると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
半導体装置。
【請求項２０】
情報処理装置であって、
プロセッサと、
不揮発メモリと、
前記不揮発メモリに対するデータの書き込みを要求する書き込み要求を、前記プロセッサから受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、
電源から供給される電力を保持する電力保持部と、を備え、
前記コントローラは、
前記電源から前記情報処理装置に供給される電力の異常を検出すると、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、前記電力保持部から供給される電力を用いて、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの前記書き込み要求に対応するリクエスト情報群のトータルのサイズが前記予め定められたサイズに到達していない場合は、既に受け取り済みの前記書き込み要求に基づくデータの書き込みを行わない、
情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、メモリデバイス、半導体装置および情報処理装置に関する。
【背景技術】
【０００２】
ＭＲＡＭやＰＣＭやＭｅｍｒｉｓｔｏｒのような、プロセッサのメモリバスに直結できるバイトアドレッサブルな不揮発メモリを、メインメモリとして使用するコンピュータシステムにおいて、障害が発生してもその直前の一貫性のある状態から処理を継続できるようにするためには、プロセッサ上で実行するプログラムによる不揮発メモリへの書き込みのオーダリング（順序性）やアトミシティ（書き込み途中の状態で終わらない性質）を保証する必要がある。
【０００３】
例えばアトミシティを保証する技術として、電源が喪失しても、ＣＰＵに接続されたメモリコントローラ（見方を変えれば、ホスト装置のメモリコントローラ）が不揮発メモリへのデータの書き込みを完了することを保証するためにキャパシタを設ける技術が知られている。
【０００４】
また、近年では、メモリの動作速度の高速化とともに、メモリデバイス側に、メモリに対するデータの書き込みを制御するコントローラが搭載されたメモリデバイスが開発されている（例えば、ＨＭＣ（Ｈｙｂｒｉｄ  Ｍｅｍｏｒｙ  Ｃｕｂｅ）、ＱＰＩ（ＱｕｉｃｋＰａｔｈ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）接続メモリデバイス等）。このようなメモリデバイスに接続されたプロセッサのメモリコントローラ（ホスト装置のメモリコントローラ）は、メモリデバイスに対するデータの送信（書き込み対象のデータの送信）が完了すれば、データの書き込みが完了したものと認識する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第８５３３４０４号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、メモリデバイスに送信された書き込み対象のデータは、さらにメモリデバイス側のコントローラを経由してメモリに書き込まれるため、プロセッサのメモリコントローラがデータの書き込みが完了したと認識した時点では、書き込み対象のデータがメモリ内のメモリセルまで到達している保証は無い。このタイミングで電源異常が発生（電源から供給される電力の異常が発生）すると、書き込み途中のデータを失ってしまうという問題や、不完全なデータが書き込まれてしまうといった問題が起こり、アトミシティを保証することができない。
【課題を解決するための手段】
【０００７】
実施形態のメモリデバイスは、不揮発メモリと、不揮発メモリに対するデータの書き込みを要求する書き込み要求を、ホスト装置から受け取った後に、該書き込み要求に基づくデータの書き込みを行うコントローラと、電源から供給される電力を保持する電力保持部と、を備える。コントローラは、既に受け取り済みの書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達している場合は、電力保持部から供給される電力を用いて、既に受け取り済みの書き込み要求に基づくデータの書き込みを行い、既に受け取り済みの書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたサイズに到達していない場合は、既に受け取り済みの書き込み要求に基づくデータの書き込みを行わない。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態の情報処理装置の構成の一例を示す図。
【図２】第１の不揮発メモリの構成の一例を示す図。
【図３】第１の実施形態のメモリデバイスの詳細な構成の一例を示す図。
【図４】第１の実施形態のコントローラの動作例を示す図。
【図５】第１の実施形態のコントローラの動作例を示す図。
【図６】第１の実施形態のコントローラの動作例を示す図。
【図７】変形例のメモリデバイスとプロセッサとの接続例を示す図。
【図８】変形例のメモリデバイスとプロセッサとの接続例を示す図。
【図９】変形例のメモリデバイスとプロセッサとの接続例を示す図。
【図１０】変形例のメモリデバイスとプロセッサとの接続例を示す図。
【図１１】変形例のメモリデバイスの詳細な構成の一例を示す図。
【図１２】変形例のコントローラの動作例を示す図。
【図１３】変形例のメモリデバイスとプロセッサとの接続例を示す図。
【図１４】変形例のメモリデバイスの構成の一例を示す図。
【図１５】変形例のメモリデバイスの詳細な構成の一例を示す図。
【図１６】変形例のメモリデバイスの実装方式の一例を示す模式図。
【図１７】変形例のメモリデバイスの実装方式の一例を示す模式図。
【図１８】変形例のメモリデバイスの実装方式の一例を示す模式図。
【図１９】変形例のメモリデバイスの実装方式の一例を示す模式図。
【図２０】第２の実施形態のメモリデバイスの詳細な構成の一例を示す図。
【図２１】変形例のメモリデバイスの構成の一例を示す図。
【図２２】変形例のメモリデバイスの構成の一例を示す図。
【図２３】変形例のメモリデバイスの構成の一例を示す図。
【図２４】第３の実施形態のメモリデバイスの詳細な構成の一例を示す図。
【図２５】第３の実施形態のリクエストの構成の一例を示す図。
【図２６】第３の実施形態のレスポンスの構成の一例を示す図。
【図２７】第３の実施形態の書き込み要求のリクエストの例を示す図。
【図２８】第３の実施形態の読み出し要求のリクエストの例を示す図。
【図２９】第３の実施形態のレスポンスの例を示す図。
【図３０】第３の実施形態の解析部の詳細な動作の一例を示す図。
【図３１】第３の実施形態の読み出し部の詳細な動作の一例を示す図。
【図３２】第３の実施形態の書き込み部の詳細な動作の一例を示す図。
【図３３】変形例のメモリデバイスの詳細な構成の一例を示す図。
【図３４】第４の実施形態のメモリデバイスの詳細な構成の一例を示す図。
【図３５】第４の実施形態のリクエストの構成の一例を示す図。
【図３６】第４の実施形態のレスポンスの構成の一例を示す図。
【図３７】第４の実施形態の書き込み要求のリクエストの例を示す図。
【図３８】第４の実施形態の読み出し要求のリクエストの例を示す図。
【図３９】第４の実施形態のレスポンスの例を示す図。
【図４０】第４の実施形態の解析部の詳細な動作の一例を示す図。
【図４１】第４の実施形態の読み出し部の詳細な動作の一例を示す図。
【図４２】第４の実施形態の書き込み部の詳細な動作の一例を示す図。
【発明を実施するための形態】
【０００９】
以下、添付図面を参照しながら、本発明に係るメモリデバイス、半導体装置および情報処理装置の実施形態を詳細に説明する。
【００１０】
（第１の実施形態）
具体的な内容を説明する前に、本実施形態の概要を説明する。上述したように、コントローラが搭載されたメモリデバイスに接続されたプロセッサのメモリコントローラ（ホスト装置のメモリコントローラ）は、メモリデバイスに対するデータの送信（書き込み対象のデータの送信）が完了すれば、データの書き込みが完了したものと認識する。しかしながら、メモリデバイスに送信された書き込み対象のデータは、さらにメモリデバイス側のコントローラを経由してメモリに書き込まれるため、プロセッサのメモリコントローラがデータの書き込みが完了したと認識した時点では、書き込み対象のデータがメモリ内のメモリセルまで到達している保証は無い。このタイミングで電源異常が発生すると、書き込み途中のデータを失ってしまうという問題や、不完全なデータが書き込まれてしまうといった問題が起こる。
【００１１】
さらに、例えばＨＭＣ（Ｈｙｂｒｉｄ  Ｍｅｍｏｒｙ  Ｃｕｂｅ）などの、最近のメモリデバイスをプロセッサ（ここでは、プロセッサコア（ＣＰＵ）とメモリコントローラとを含む）と接続するインタフェースは、例えば４バイト、８バイト、１６バイト、３２バイト、６４バイトなどの複数の異なるデータサイズの書き込み要求を用意しており、プロセッサの命令に応じて使い分けられる。これらの書き込み要求は、書き込みたいデータのサイズによって書き込み要求全体の長さが異なり、プロセッサからメモリデバイスに対して、複数のクロックサイクルにわたって書き込み要求を転送する。プロセッサによる１回の書き込み要求は、通常はキャッシュラインと同じサイズ（たとえば６４バイト）に設定される場合が多い。このように複数のクロックサイクルで書き込み要求（ライトリクエスト）を転送する場合、書き込み要求の転送途中で電源異常が発生すると、該書き込み要求の転送が途中で止まってしまう可能性や、送られる情報が正しい値ではなくなってしまう可能性がある。そのような場合は、コントローラ（メモリデバイスのコントローラ）は途中まで受け取った書き込み要求に基づくデータの書き込みを行うべきではない。さらに、例えば１クロックサイクルで、プロセッサからメモリデバイスに対して、書き込み要求を構成する情報をパラレルに転送する場合でも、電源異常が発生すれば情報が正しく伝わらない可能性がある。
【００１２】
本実施形態では、メモリデバイスのコントローラは、ホスト装置であるプロセッサのメモリコントローラからの書き込み要求を受信すると、その受信した書き込み要求を、一旦、揮発性のバッファメモリに記憶し、書き込み要求全体を正しく受信できたら、その後に不揮発メモリに書き込む。書き込み要求全体を正しく受信できたかどうかは、その書き込み要求に相当するサイズの情報を受け取ったかどうかで判断する。書き込み要求の先頭部分（ヘッダー）を見れば、その書き込み要求のデータのサイズが分かり、そのサイズに基づいて書き込み要求全体の長さは分かるので、その長さの書き込み要求が来ているかどうかで、正しく受信できたかどうかが分かる。さらに、例えば書き込み要求にＣＲＣなどの検査コードが含まれる場合には、その検査コードを使って、情報の誤り（エラー）が無いかどうかを確認してもよい。他にも様々なチェックの仕組みを組み合わせて、書き込み要求を正しく受信できたかどうかを判断してよい。
【００１３】
そして、本実施形態では、メモリデバイスのコントローラは、電源からメモリデバイスに供給される電力の異常を検出すると、プロセッサから受け取っている途中の書き込み要求に含まれるデータは不揮発メモリに書き込まず、既に受け取った書き込み要求（既に受け取りが完了した書き込み要求）がある場合は、電源から供給される電力を保持する電力保持部から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う。これにより、アトミシティを保証することが可能になる。
【００１４】
以下、添付図面を参照しながら、本実施形態の具体的な内容を詳細に説明する。
【００１５】
図１は、本実施形態の情報処理装置１のハードウェア構成の一例を示す図である。例えば情報処理装置１は、サーバ、ＰＣ（Personal  Computer）、携帯型情報端末（可搬型のタブレットも含む）、携帯電話端末などで構成され得る。図１に示すように、本実施形態の情報処理装置１は、プロセッサ１０と、メモリデバイス２０と、電源３０とを備える。図１の例では、メモリデバイス２０は、アクセス用のポートを１つ持ち、そこにプロセッサ１０を接続しているが、これに限られるものではない。電源３０は、情報処理装置１に対して電力を供給する装置であり、プロセッサ１０およびメモリデバイス２０の各々に対して電力を供給する。
【００１６】
ホスト装置の一例であるプロセッサ１０は、プロセッサコア（ＣＰＵ（Central  Processing  Unit）とも称する）１１と、キャッシュメモリ１２と、メモリコントローラ１３とを備える。
【００１７】
プロセッサコア１１が実行するプログラムによるメモリデバイス２０へのデータ書き込みの手順としては、まず、書き込み対象のデータがキャッシュメモリ１２に書き込まれる。メモリコントローラ１３は、キャッシュメモリ１２に書き込まれたデータをメモリデバイス２０に書き込むために、メモリデバイス２０に対して、適切なタイミングで書き込み要求を発行する。本実施形態における書き込み要求は、書き込み対象のデータと、メモリデバイス２０の不揮発メモリ２１のうち該書き込み対象のデータが書き込まれる位置を示すアドレス情報とを少なくとも含む。また、メモリデバイス２０からデータを読み出す場合は、メモリコントローラ１３は、プロセッサコア１１からの指示に従って、読み出し要求（リードリクエスト）を発行する。本実施形態における読み出し要求は、メモリデバイス２０の不揮発メモリ２１のうち読み出し対象のデータが格納されている位置を示すアドレス情報を少なくとも含む。以下の説明では、書き込み要求および読み出し要求を区別しない場合は、単に「リクエスト」と称する場合がある。
【００１８】
次に、メモリデバイス２０の構成を説明する。図１に示すように、メモリデバイス２０は、不揮発メモリ２１と、コントローラ２２と、電力保持部２３と、整流素子（この例ではダイオード）３１とを備える。メモリデバイス２０は、半導体装置の一例であると考えることができる。
【００１９】
本実施形態では、不揮発メモリ２１は、ＭＲＡＭ（Magnetoresistive  Random  Access  Memory）で構成されるが、これに限られるものではない。例えば不揮発メモリ２１は、ＰＣＭ（Phase  Change  Memory）、ＲｅＲＡＭ（Resistive  Random  Access  Memory）、ＦｅＲＡＭ（Ferroelectric  Random  Access  Memory）、Ｍｅｍｒｉｓｔｏｒでもよいし、ＤＲＡＭ（Dynamic  Random  Access  Memory）とＮＡＮＤ  Ｆｌａｓｈを組み合わせたＮＶＤＩＭＭであっても構わない。また、不揮発メモリ２１は、バッテリバックアップしたＤＲＡＭやＳＲＡＭでも構わない。
【００２０】
図２は、本実施形態における不揮発メモリ２１の概略構成の一例を示す図である。図２に示すように、不揮発メモリ２１は、不揮発メモリセルアレイ２０１と、揮発性のメモリであるロウバッファ（ページバッファ）２０２とを有する。
【００２１】
詳細な図示は省略するが、不揮発メモリセルアレイ２０１には、行方向（図２の左右方向）に延在する複数のワード線、および、列方向（図２の上下方向）に延在する複数のビット線が配置され、不揮発メモリセルアレイ２０１は、複数のワード線と複数のビット線との各交差に対応してマトリクス状に配置される複数のメモリセルを有する。また、詳細な図示は省略するが、不揮発メモリセルアレイ２０１は、コントローラ２２の制御の下、各ワード線の電圧を制御する回路や各ビット線の電圧を制御する回路などを備えている。以上の構成は、公知の様々な構成を利用することができる。なお、この例では１本のワード線に接続される複数のメモリセル分のデータサイズを「ページ」と称し、ロウバッファ２０２は、データの書き込み時またはデータの読み出し時において選択されたワード線に対応する１ページ分のデータを一時的に格納する。本実施形態では、不揮発メモリ２１へのデータの書き込みや不揮発メモリ２１からのデータの読み出しは、このロウバッファ２０２を経由して行われるが、これは、公知の方法と同様である。
【００２２】
図１に戻って説明を続ける。コントローラ２２は、不揮発メモリ２１に対するデータの書き込みを要求する書き込み要求を、プロセッサ１０のメモリコントローラ１３から受け取った後に、該書き込み要求に基づくデータの書き込みを行う。また、コントローラ２２は、不揮発メモリ２１に対するデータの読み出しを要求する読み出し要求を、プロセッサ１０のメモリコントローラ１３から受け取った後に、該読み出し要求に基づくデータの読み出しを行う。
【００２３】
本実施形態のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う。見方を変えれば、コントローラ２２は、電源３０から「半導体装置」に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行うと考えることもできる。また、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行うと考えることもできる。
【００２４】
また、本実施形態のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の電圧を監視し、電圧が閾値以下になると異常が発生したと判断（認識）する。つまり、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う。見方を変えれば、コントローラ２２は、電源３０から「半導体装置」に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行うと考えることもできる。また、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行うと考えることもできる。
【００２５】
また、本実施形態のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、書き込み要求の受け取りを停止する。さらに、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求に基づくデータの書き込みを行わない。本実施形態のコントローラ２２の詳細な内容については後述する。
【００２６】
電力保持部２３は、電源３０から供給される電力を保持する。電力保持部２３が保持する電力量は、少なくとも、電源３０からの電力の供給が停止した場合でも、メモリデバイス２０がホスト装置であるプロセッサ１０のメモリコントローラ１３から受け取った書き込み要求に基づく不揮発メモリ２１への書き込みをすべて完了させるのに必要な電力量である。本実施形態では、電力保持部２３はキャパシタで構成されるが、これに限られるものではない。例えば電力保持部２３は、蓄電池などで構成されてもよい。要するに、電源３０からの電力を保持可能なデバイスであればよい。図１の例では、電源３０からメモリデバイス２０に供給される電力は、整流素子３１を介して、不揮発メモリ２１、コントローラ２２および電力保持部２３の各々に供給される。整流素子３１の作用により、電圧降下時に、電力保持部２３に保持された電力がメモリデバイス２０の外に漏れることを防止できる。また、本実施形態では、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になると、電力保持部２３の出力電圧が、電源３０から供給される電力の電圧を上回り、電力保持部２３に保持された電力が、不揮発メモリ２１およびコントローラ２２の各々に供給される。電力保持部２３から不揮発メモリ２１およびコントローラ２２への電力の供給は、図１の例のように電源３０から供給される電力の電圧が下がれば電力保持部２３から電力を供給するように切り替えても良いし、電源３０からの電力の供給量が不足してくれば電力保持部２３から供給する電力を電源３０からの電力と合わせて不揮発メモリ２１およびコントローラ２２に供給するようにしても良い。
【００２７】
図３は、メモリデバイス２０の詳細なハードウェア構成の一例を示す図である。図３に示すように、コントローラ２２は、検出部２１０と、受信部２１１と、第１の判断部２１２と、第２の判断部２１３と、第１の書き込み部２１４と、バッファメモリ２１５と、書き込み指示部２１６と、第２の書き込み部２１７と、第３の判断部２１８と、読み出し部２１９とを備える。これらの各要素は、半導体回路で構成され、それぞれ独立して設けられてもよいし、任意の２以上の要素が集積されて設けられてもよい。
【００２８】
検出部２１０は、電源３０からメモリデバイス２０に供給される電力の異常を検出する。より具体的には、検出部２１０は、電源３０からメモリデバイス２０に供給される電力を監視し、電源３０から供給される電力の電圧が閾値以下になると、異常が発生したと判断する。検出部２１０は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、受信部２１１および第２の判断部２１３の各々に対して、異常が発生したことを通知する。なお、電源３０からメモリデバイス２０に供給される電力の異常を検出する方法は、検出部２１０が、電源３０からメモリデバイス２０に供給される電力の電圧を測定する方式に限られるものではなく、例えば検出部２１０が、電源３０やプロセッサ１０等の外部装置から、電力の異常を知らせる信号を受け取る方式でもよい。
【００２９】
受信部２１１は、プロセッサ１０のメモリコントローラ１３からリクエスト（書き込み要求または読み出し要求）を受け取る。本実施形態のコントローラ２２は、複数のクロックサイクルでリクエスト（書き込み要求または読み出し要求）を受け取るので、受信部２１１は、メモリコントローラ１３から、リクエストを構成する複数の情報（以下の説明では「リクエスト情報」と称する場合がある）を順次に受け取ると考えることができる。また、本実施形態では、受信部２１１は、検出部２１０から異常発生の通知を受けると、それ以降のリクエスト（リクエスト情報）の受け取りを停止する。
【００３０】
第１の判断部２１２は、受信部２１１が受け取ったリクエスト情報が、書き込み要求に対応するのか読み出し要求に対応するのかを判断する。この判断方法としては様々な方法が考えられるが、例えばリクエストのヘッダー部に対応するリクエスト情報は、命令の種類を識別する（書き込み要求か読み出し要求かを識別する）コマンド情報を含む形態の場合、第１の判断部２１２は、受信部２１１が受信したリクエストのヘッダー部に対応するリクエスト情報に含まれるコマンド情報を参照することで、該リクエスト情報、および、該リクエスト情報に続く所定数のリクエスト情報が、書き込み要求に対応するのか読み出し要求に対応するのかを判断することができる。
【００３１】
第２の判断部２１３は、書き込み要求全体を正しく受け取ったか否かを判断する。本実施形態では、書き込み要求全体を正しく受け取ったかどうかは、書き込み要求全体のデータサイズ（予め定められたデータサイズ）分のリクエスト情報群（書き込み要求を構成するリクエスト情報群）を受け取ったかどうかで判断することができる。すなわち、第２の判断部２１３は、受信部２１１が複数のクロックサイクルにわたって受け取った、書き込み要求に対応するリクエスト情報群のトータルのサイズが、予め定められたデータサイズに到達した場合は、書き込み要求全体を正しく受け取ったと判断することができる。さらに、例えば書き込み要求にＣＲＣなどの検査コードが含まれる場合には、その検査コードを使って、情報の誤り（エラー）が無いかどうかを確認してもよい。他にも様々なチェックの仕組みを組み合わせて、書き込み要求を正しく受け取ったかどうかを判断してよい。
【００３２】
第２の判断部２１３は、書き込み要求を受け取ったと判断すると（書き込み要求全体を正しく受け取ったと判断すると）、第１の書き込み部２１４に対して、その受け取った書き込み要求（言い換えれば、受け取りが完了した書き込み要求）に対応する書き込み情報をバッファメモリ２１５に書き込むことを指示する。
【００３３】
また、本実施形態では、第２の判断部２１３は、検出部２１０から異常発生の通知を受けると、プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求を廃棄する。つまり、第２の判断部２１３は、検出部２１０から異常発生の通知を受けとったときに、既に受け取り済みの、書き込み要求に対応するリクエスト情報群のトータルのサイズが予め定められたデータサイズに到達していない場合は、その既に受け取り済みのリクエスト情報群を廃棄する。これにより、書き込み対象のデータの一部だけが書き込まれてしまうような一貫性の無い状態（処理の途中で終わってしまう状態）に陥ることを防止する。
【００３４】
第２の判断部２１３からの指示を受けた第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込む。書き込み情報は、書き込み対象のデータと、不揮発メモリ２１のうち書き込み対象のデータが書き込まれる位置を示すアドレス情報とを少なくとも含む。この例では、第１の書き込み部２１４は、書き込み情報として書き込み要求そのものをバッファメモリ２１５に書き込むが、これに限られるものではない。
【００３５】
第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報（この例では書き込み要求そのもの）をバッファメモリ２１５に書き込んだ後、書き込み指示部２１６に対して、バッファメモリ２１５に書き込み情報を書き込んだことを、バッファメモリ２１５のうち書き込み情報を書き込んだ位置を示す情報（以下、「バッファ位置情報」と称する場合がある）と併せて通知する。この通知を受けた書き込み指示部２１６は、第２の書き込み部２１７に対して、バッファメモリ２１５のうち、第１の書き込み部２１４から通知されたバッファ位置情報が示す位置に書き込まれた書き込み情報に基づくデータの書き込みを指示する。
【００３６】
書き込み指示部２１６からの書き込み指示を受けた第２の書き込み部２１７は、バッファメモリ２１５のうち、書き込み指示部２１６から受け取ったバッファ位置情報（この例では書き込み指示に含まれている）が示す位置に書き込まれた書き込み情報を読み出し、読み出した書き込み情報に基づくデータの書き込みを行う。上述したように、書き込み情報には、不揮発メモリ２１のうち書き込み対象データを書き込む位置を示すアドレス情報が含まれている。この例では、アドレス情報の上位部分は、複数のワード線のうちの何れかを示すロウアドレスとして機能し、アドレス情報の下位部分は、複数のビット線のうちの何れかを示すカラムアドレスとして機能する。第２の書き込み部２１７は、バッファメモリ２１５から読み出した書き込み情報に含まれるアドレス情報の上位部分のロウアドレスが示すワード線に対応する１ページ分のデータ（ページデータ）をページバッファ２０２に読み出す制御を行った後、アドレス情報の下位部分のカラムアドレスが示すビット線に供給する電圧を制御することで、ページバッファ２０２内のページデータに対してデータ（書き込み要求に含まれる書き込み対象データに相当するデータ）を書き込む。そして、データを書き込んだページデータを、ロウアドレスが示すワード線に接続された複数のメモリセルに書き戻すことにより、不揮発メモリ２１への書き込みを完了する。
【００３７】
要するに、本実施形態のコントローラ２２は、情報を一時的に記憶するバッファメモリ２１５をさらに備え、コントローラ２２は、プロセッサ１０のメモリコントローラ１３から受け取った書き込み要求に含まれる書き込み対象のデータをバッファメモリ２１５に記憶した後、バッファメモリ２１５に記憶した書き込み対象のデータに基づいてデータの書き込みを行う。
【００３８】
図３の説明を続ける。第３の判断部２１８は、読み出し要求全体を正しく受け取ったか否かを判断する。この判断方法は、基本的には書き込み要求全体を正しく受け取ったか否かを判断する方法と同様である。第３の判断部２１８は、読み出し要求を受け取ったと判断すると、読み出し部２１９に対して、その受け取った読み出し要求（受け取りが完了した読み出し要求）に対応するデータの読み出しを指示する。
【００３９】
第３の判断部２１８からの読み出し指示を受けた読み出し部２１９は、不揮発メモリ２１のうち、第３の判断部２１８から受け取った読み出し要求（この例では読み出し指示に含まれている）に含まれるアドレス情報が示す位置に格納されたデータを読み出し、その読み出したデータを、プロセッサ１０のメモリコントローラ１３へ返信（リプライ）する。
【００４０】
図４は、プロセッサ１０のメモリコントローラ１３からリクエスト情報を受け取った場合のコントローラ２２の動作例を示すフローチャートである。まず、受信部２１１はリクエスト情報を受け取る（ステップＳ１）。次に、第１の判断部２１２は、ステップＳ１で受け取ったリクエスト情報が、書き込み要求に対応しているかどうかを判断する（ステップＳ２）。
【００４１】
上述のステップＳ１で受け取ったリクエスト情報が書き込み要求に対応している場合（ステップＳ２：Ｙｅｓ）、第２の判断部２１３は、書き込み要求全体を正しく受け取ったかどうかを判断する（ステップＳ３）。書き込み要求全体を正しく受け取った場合（ステップＳ３：Ｙｅｓ）、第２の判断部２１３は、第１の書き込み部２１４に対して、その受け取った書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込むことを指示する。第２の判断部２１３からの指示を受けた第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込む（ステップＳ４）。第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込んだ後、書き込み指示部２１６に対して、バッファメモリ２１５に書き込み情報を書き込んだことをバッファ位置情報と併せて通知する。この通知を受けた書き込み指示部２１６は、第２の書き込み部２１７に対して、バッファメモリ２１５のうち、第１の書き込み部２１４から通知されたバッファ位置情報が示す位置に書き込まれた書き込み情報に基づくデータの書き込みを指示する（ステップＳ５）。書き込み指示部２１６からの書き込み指示を受けた第２の書き込み部２１７は、不揮発メモリ２１へのデータの書き込みを行う（ステップＳ６）。
【００４２】
図５は、ステップＳ６の詳細な処理の一例を示すフローチャートである。図５に示すように、まず第２の書き込み部２１７は、書き込み指示部２１６からの書き込み指示を受信する（ステップＳ１１）。次に、第２の書き込み部２１７は、バッファメモリ２１５のうち、書き込み指示部２１６から受け取ったバッファ位置情報（この例では書き込み指示に含まれている）が示す位置に書き込まれた書き込み情報を読み出す（ステップＳ１２）。次に、第２の書き込み部２１７は、ステップＳ１２で読み出した書き込み情報に基づいてデータの書き込みを行う（ステップＳ１３）。
【００４３】
図４に戻って説明を続ける。上述のステップＳ２において、上述のステップＳ１で受け取ったリクエスト情報が書き込み要求に対応していない場合（ステップＳ２：Ｎｏ）、つまり、上述のステップＳ１で受け取ったリクエスト情報が読み出し要求に対応している場合、第３の判断部２１８は、読み出し要求全体を正しく受け取ったかどうかを判断する（ステップＳ７）。読み出し要求全体を正しく受け取った場合（ステップＳ７：Ｙｅｓ）、第３の判断部２１８は、読み出し部２１９に対して、その受け取った読み出し要求に対応するデータの読み出しを指示する（ステップＳ８）。第３の判断部２１８からの読み出し指示を受けた読み出し部２１９は、不揮発メモリ２１からのデータの読み出しを行う（ステップＳ９）。より具体的には、読み出し部２１９は、不揮発メモリ２１のうち、第３の判断部２１８から受け取った読み出し要求（この例では読み出し指示に含まれている）に含まれるアドレス情報が示す位置に格納されたデータを読み出し、その読み出したデータを、プロセッサ１０のメモリコントローラ１３へ返信（リプライ）する。
【００４４】
次に、図６を用いて、コントローラ２２（検出部２１０）が、電源３０からメモリデバイス２０へ供給される電力の異常を検出した場合のコントローラ２２の動作例を説明する。図６のフローチャートは、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になったために、検出部２１０が、電力の異常が発生したことを検出し、受信部２１１および第２の判断部２１３の各々に対して、異常が発生したことを通知していることを前提とする。なお、電源３０からメモリデバイス２０に供給される電力の電圧は閾値以下に低下しているので、メモリデバイス２０の電力状態は、電力保持部２３に保持された電力が、不揮発メモリ２１およびコントローラ２２の各々に供給される状態に切り替わっている。
【００４５】
検出部２１０から異常発生の通知を受けた受信部２１１は、それ以降のリクエスト（リクエスト情報）の受け取りを停止する（ステップＳ２１）。また、検出部２１０から異常発生の通知を受けた第２の判断部２１３は、プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求があるかどうかを判断する（ステップＳ２２）。プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求がある場合（ステップＳ２２：Ｙｅｓ）、第２の判断部２１３は、その受け取り途中の書き込み要求を廃棄する（ステップＳ２３）。
【００４６】
一方、検出部２１０が異常を検出した際に、既に受け取りが完了している書き込み要求については、電力保持部２３から供給される電力を用いて、その既に受け取りが完了している書き込み要求に基づくデータの書き込みが行われる。なお、本実施形態のように電力保持部２３がキャパシタで構成される場合、キャパシタの容量は、少なくとも、電源３０からメモリデバイス２０に供給される電力に異常が発生した際に、既に受け取った書き込み要求に基づくデータの書き込みを行うのに必要な電力量を蓄えることができる値に設定される。例えばキャパシタの容量は、バッファメモリ２１５が保持可能な数の書き込み要求を処理可能な電力量を蓄えることができる値に設定されてもよい。
【００４７】
以上に説明したように、メモリデバイス２０のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う。すなわち、電源３０からメモリデバイス２０に供給される電力の異常が発生しても、既に受け取りが完了している書き込み要求については、電力保持部２３から供給される電力を用いて書き込みを完了させることができる。したがって、本実施形態によれば、メモリデバイス２０にコントローラ２２が搭載される構成においてもアトミシティを保証することができる。
【００４８】
（第１の実施形態の変形例１）
例えばメモリデバイス２０は、複数のアクセスポートを有する形態であってもよい。
【００４９】
例えばメモリデバイス２０とプロセッサ１０とを、複数のアクセスポートで接続することで、データ転送能力を向上させることができる。例えば図７に示すように、メモリデバイス２０が、アクセスポートを２つ有してもよい。このように２つのアクセスポートを使ってメモリデバイス２０とプロセッサ１０とを接続することで、データ転送のバンド幅を２倍にすることができる。
【００５０】
また、例えばメモリデバイス２０を複数のプロセッサ１０と接続することもできる。例えば図８に示すように、アクセスポートを２つ有するメモリデバイス２０に対して、２つのプロセッサ１０ａおよび１０ｂを接続することもできる。この例では、プロセッサ１０ａとプロセッサ１０ｂがデータを共有することができる。
【００５１】
また、例えばメモリデバイス２０に対して、プロセッサ１０と、別のメモリデバイス（以下、「第２のメモリデバイス２００」と称する）とを接続し、プロセッサ１０からの書き込み要求を、必要に応じて第２のメモリデバイス２００に転送する構成であってもよい。図９に示すように、メモリデバイス２０は第２のメモリデバイス２００と接続され、メモリデバイス２０のコントローラ２２は、プロセッサ１０のメモリコントローラ１３から、第２のメモリデバイス２００に対するデータの書き込みを要求する第２の書き込み要求を受け取ると、該第２の書き込み要求を第２のメモリデバイス２００に転送する構成でもよい。
【００５２】
図９のようにカスケード接続した場合、プロセッサ１０は直接接続されているメモリデバイス２０に対する書き込み要求の送信が完了すると、書き込みが完了したと認識するので、第２のメモリデバイス２００に転送すべき第２の書き込み要求を受け取ったメモリデバイス２０は、電源３０からメモリデバイス２０に供給される電力の異常が発生しても、電力保持部２３からの電力を用いて、第２のメモリデバイス２００に対して第２の書き込み要求を転送する。
【００５３】
すなわち、図９の例では、メモリデバイス２０のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った第２の書き込み要求を第２のメモリデバイス２００に転送する。
【００５４】
また、例えば図１０に示すように、第２のメモリデバイス２００が、プロセッサ１０とは別の第２のプロセッサ１００（第２のホスト装置の一例）と接続される構成とすることもできる。第２のプロセッサ１００の基本的な構成はプロセッサ１０の構成と同様であるとする。この例では、メモリデバイス２０のコントローラ２２は、第２のメモリデバイス２００から、第２のプロセッサ１００が不揮発メモリ２１に対してデータの書き込みを要求する第３の書き込み要求を受け取った後に、該第３の書き込み要求に基づくデータの書き込みを行う。また、コントローラ２２は、第２のメモリデバイス２００から、第２のプロセッサ１００が不揮発メモリ２１からのデータの読み出しを要求する第２の読み出し要求を受け取った後に、該第２の読み出し要求に対応するデータの読み出しを行う。この例では、図１１に示すように、メモリデバイス２０は、アクセスポートを２つ（プロセッサ１０用のアクセスポートと第２のメモリデバイス２００用のアクセスポート）有している。図１１の例では、メモリデバイス２０は、プロセッサ１０と第２のメモリデバイス２００の両方からリクエストを受け付けることができる。
【００５５】
図１０および図１１の構成では、電源３０からメモリデバイス２０に供給される電力の異常を検出した際のメモリデバイス２０の動作が複雑になる。つまり、メモリデバイス２０は、電力の異常を検出した時点以降は、プロセッサ１０からの書き込み要求の受け取りを停止して、その時点で既に受け取っていたリクエストが、メモリデバイス２０に対するデータの書き込みを要求する書き込み要求であれば、該書き込み要求に基づくデータの書き込みを行うのに加えて、該リクエストが、他のメモリデバイス（第２のメモリデバイス２００）に対するデータの書き込みを要求する書き込み要求（第２の書き込み要求）であれば、確実に他のメモリデバイスへの転送を完了させる必要がある。また、メモリデバイス２０が電力の異常を検出すると、メモリデバイス２０に直結されているプロセッサ１０からのリクエストの受け取りは停止する必要があるが、その時点で他のメモリデバイス（この例では第２のメモリデバイス２００）が他のプロセッサ（この例では第２のプロセッサ１００）から既に受け取っていた、メモリデバイス２０に対するリクエスト（この例では第３の書き込み要求または第２の読み出し要求）が転送されてきた場合は、確実に受け取らなければならない。
【００５６】
したがって、この例では、メモリデバイス２０のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、第２のメモリデバイス２００から受け取っている途中の第３の書き込み要求があれば、電力保持部２３から供給される電力を用いて、第２のメモリデバイス２００からの第３の書き込み要求の受け取りを継続する。そして、コントローラ２２は、電力保持部２３から供給される電力を用いて、受け取りが完了した第３の書き込み要求に基づくデータの書き込みを行う。
【００５７】
図１２は、図１０および図１１の構成におけるコントローラ２２（検出部２１０）が、電源３０からメモリデバイス２０へ供給される電力の異常を検出した場合のコントローラ２２の動作例を示すフローチャートである。図１２のフローチャートは、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になったために、検出部２１０が、電力の異常が発生したことを検出していることを前提とする。なお、電源３０からメモリデバイス２０に供給される電力の電圧は閾値以下に低下しているので、メモリデバイス２０の電力状態は、電力保持部２３に保持された電力が、不揮発メモリ２１およびコントローラ２２の各々に供給される状態に切り替わっている。
【００５８】
まず、検出部２１０は、受信部２１１に対してプロセッサ１０からのリクエストの受け取りを停止することを指示する。この指示を受けた受信部２１１は、それ以降のプロセッサ１０からのリクエストの受け取りを停止する（ステップＳ３１）。次に、検出部２１０は、第２の判断部２１３に対して問い合わせを行い、第２のメモリデバイス２００から受け取っている途中のリクエストがあるかどうかを判断する（ステップＳ３２）。なお、受信部２１１で受け取ったリクエストが、プロセッサ１０から送られてきたリクエストなのか、第２のメモリデバイス２００から転送されてきたリクエストなのかを判断する方法としては、様々な方法が考えらえるが、例えばメモリデバイス２０の初期化時に各アクセスポートがプロセッサ１０に接続されているか第２のメモリデバイス２００に接続されているのかを設定しておき、リクエストを受信したアクセスポートに応じて、プロセッサ１０からのリクエストなのか第２のメモリデバイス２００からのリクエストなのかを判断することもできる。また、例えばリクエストの中に、プロセッサ１０が送ったリクエストなのか第２のメモリデバイス２００が転送したリクエストなのかを示すフラグ情報が含まれる形態であってもよい。
【００５９】
第２のメモリデバイス２００から受け取っている途中のリクエストがない場合（ステップＳ３２：Ｎｏ）、検出部２１０は、受信部２１１に対して第２のメモリデバイス２００からのリクエストの受け取りを停止することを指示する。この指示を受けた受信部２１１は、それ以降のプロセッサ１０からのリクエストの受け取りを停止する（ステップＳ３３）。
【００６０】
一方、第２のメモリデバイス２００から受け取っている途中のリクエストがある場合（ステップＳ３２：Ｙｅｓ）、検出部２１０は、受信部２１１に対して第２のメモリデバイス２００からのリクエストの受け取りを継続することを指示する。この指示を受けた受信部２１１は、第２のメモリデバイス２００からのリクエストの受け取りを継続する（ステップＳ３４）。そして、受信部２１１が第２のメモリデバイス２００からのリクエスト情報（リクエストを構成する情報）を受け取ると（ステップＳ３５）、第１の判断部２１２は、ステップＳ１で受け取ったリクエスト情報が、第３の書き込み要求に対応しているかどうかを判断する（ステップＳ３６）。この判断方法は、上述の第１の実施形態で説明した方法と同様である。以降のステップＳ３７〜ステップＳ４３の処理内容は、図４のステップＳ３〜ステップＳ９の処理内容と同様であるので、詳細な説明は省略する。なお、図１２のステップＳ３７において、第３の書き込み要求全体を正しく受け取ったと判断した場合（ステップＳ３７：Ｙｅｓ）、または、図１２のステップＳ４１において、第２の読み出し要求全体を正しく受け取ったと判断した場合（ステップＳ４１：Ｙｅｓ）、以降の第２のメモリデバイス２００からのリクエスト（リクエスト情報）の受け取りは停止してもよい。
【００６１】
また、例えば図１３に示すように、メモリデバイス２０がプロセッサ１０とは直結されず、第２のメモリデバイス２００を介してプロセッサ１０からのリクエスト（書き込み要求または読み出し要求）を受け取る構成においても、上記と同様の問題が存在する。すなわち、メモリデバイス２０は、電力の異常を検出した際に、第２のメモリデバイス２００がプロセッサ１０から既に受け取っていた、メモリデバイス２０に対するリクエスト（書き込み要求または読み出し要求）が転送されてきた場合は、確実に受け取らなければならない。
【００６２】
図１３の構成では、メモリデバイス２０のコントローラ２２は、メモリデバイス２０と接続された第２のメモリデバイス２００から、プロセッサ１０（ホスト装置の一例）が不揮発メモリ２１に対するデータの書き込みを要求する書き込み要求を受け取った後に、該書き込み要求に基づくデータの書き込みを行う。そして、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行い、第２のメモリデバイス２００から受け取っている途中の書き込み要求があれば、電力保持部２３から供給される電力を用いて、第２のメモリデバイスからの書き込み要求の受け取りを継続する。
【００６３】
以上のようにして、複数のメモリデバイスを組み合わせて用いる場合でも、何れかのメモリデバイスに接続される１または複数のプロセッサが、電力の異常が発生する前に何れかのメモリデバイスに対して送った書き込み要求（上述の第２の書き込み要求、第３の書き込み要求を含む）は、必ずターゲットのメモリデバイスに転送されて当該書き込み要求に基づくデータの書き込みが行われることを保証できる。
【００６４】
（第１の実施形態の変形例２）
例えば図１４に示すように、電力保持部２３および整流素子３１が、メモリデバイス２０の外部に設けられる構成であってもよい。要するに、メモリデバイス２０は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、上述のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であってもよい。見方を変えれば、半導体装置は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から半導体装置に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であってもよい。また、情報処理装置１は、上述のプロセッサ１０と、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から情報処理装置１に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であってもよい。
【００６５】
また、図１４の例では、メモリデバイス２０は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、上述のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であると考えることもできる。見方を変えれば、半導体装置は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から半導体装置に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であると考えることもできる。また、情報処理装置１は、上述のプロセッサ１０と、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から情報処理措置１に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う形態であると考えることもできる。
【００６６】
（第１の実施形態の変形例３）
例えばＨＭＣのように、メモリデバイス２０内に複数の不揮発メモリ２１のダイまたはチップを持たせる場合も考えられるので、図１５に示すように、メモリデバイス２０は、複数の不揮発メモリ２１を備える形態であってもよい。図１５の例では、レイアウトの便宜上、第３の判断部２１８および読み出し部２１９の記載を省略しているが、複数の不揮発メモリ２１が設けられる点、および、複数の不揮発メモリ２１と１対１に対応する複数の第２の書き込み部２１７が設けられる点以外の構成は、上述の第１の実施形態と同様である。
【００６７】
例えば第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報（この例では書き込み要求そのもの）をバッファメモリ２１５に書き込んだ後、バッファメモリ２１５のうち該書き込み情報を書き込んだ位置を示すバッファ位置情報、および、該書き込み要求に対応する不揮発メモリ２１（該書き込み要求に含まれるアドレス情報により特定される不揮発メモリ２１）を示す不揮発メモリ情報と併せて、バッファメモリ２１５に書き込み情報を書き込んだことを、書き込み指示部２１６に通知することができる。この通知を受けた書き込み指示部２１６は、第１の書き込み部２１４から通知された不揮発メモリ情報が示す不揮発メモリ２１に対応する第２の書き込み部２１７に対して、バッファメモリ２１５のうち、第１の書き込み部２１４から通知されたバッファ位置情報が示す位置に書き込まれた書き込み情報に基づくデータの書き込みを指示することができる。
【００６８】
また、共通のバッファメモリ２１５を設ける代わりに、複数の不揮発メモリ２１と１対１に対応（見方を変えれば複数の第２の書き込み部２１７と１対１に対応）する複数のバッファメモリ２１５を設けてもよい。この構成では、第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報（この例では書き込み要求そのもの）を、該書き込み要求に含まれるアドレス情報により特定される不揮発メモリ２１に対応するバッファメモリ２１５に書き込んだ後、該バッファメモリ２１５のうち書き込み情報を書き込んだ位置を示すバッファ位置情報と併せて、バッファメモリ２１５に書き込み情報を書き込んだことを、対応する書き込み指示部２１６に通知してもよい。
【００６９】
なお、図１５に示すメモリデバイス２０が有するアクセスポートの数は、１つでもよいし、２つ以上でもよいし、任意の本数に設定可能である。
【００７０】
図１６は、本変形例のメモリデバイス２０の実装方式の一例を示す模式図である。この実装方式は、ＨＭＣのように複数の不揮発メモリ２１のシリコンダイと、コントローラ２２のシリコンダイを、ＴＳＶ等の技術を用いて接続してパッケージに封印する方式である。また、この実装方式の変形例としては、不揮発メモリ２１のシリコンダイとコントローラ２２のシリコンダイをシリコンインタポーザ上で接続して２．５Ｄ実装のメモリデバイス２０として構成しても構わない。図１６の例は、メモリデバイス２０が電力保持部２３を内蔵している構成を示しているが、図１７のように電力保持部２３がメモリデバイス２０に外付けされる構成であっても構わない。
【００７１】
図１８は、メモリデバイス２０の別の実装方式の一例を示す模式図である。この実装方式は、ひとつのシリコンダイにコントローラ２２と不揮発メモリ２１（不揮発メモリ２１の数は、本変形例のように複数であってもよいし、上述の第１の実施形態のように１つであっても構わない）を集積し、それをパッケージに封印する方式である。図１８のシリコンダイは単体でパッケージに入れてメモリデバイス２０として実施することもできるし、図１９に示すように、シリコンダイと電力保持部２３をパッケージに入れてメモリデバイス２０として実施することもできる。
【００７２】
以上に限らず、メモリデバイス２０の実装方式としては様々な実装方式を用いることができる。たとえば、メモリデバイス２０の実装方式として、１つまたは複数の不揮発メモリ２１のチップと、コントローラ２２のチップを、プリント基板上に搭載する方式を用いることもできる。
【００７３】
（第２の実施形態）
次に、第２の実施形態について説明する。上述の第１の実施形態と共通する部分については適宜に説明を省略する。図２０は、本実施形態のメモリデバイス２０の詳細なハードウェア構成の一例を示す図である。図２０に示すように、コントローラ２２は、不揮発キャッシュメモリ２２２をさらに備え、上述の第２の書き込み部２１７の代わりに、第３の書き込み部２２１および第４の書き込み部２２３を備える点で上述の第１の実施形態と相違する。
【００７４】
コントローラ２２が受け取った書き込み要求は、不揮発メモリ２１ではなく、より高速の不揮発キャッシュメモリ２２２に書き込んだ時点で永続的になる。本実施形態では、第２の判断部２１３は、書き込み要求全体を正しく受信したと判断すると、第１の書き込み部２１４に対して、その受信した書き込み要求に対応する書き込み情報（この例では書き込み要求そのものであるが、これに限られるものではない）をバッファメモリ２１５に書き込むことを指示する。
【００７５】
第２の判断部２１３からの指示を受けた第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込む。第１の書き込み部２１４は、受け取りが完了した書き込み要求に対応する書き込み情報をバッファメモリ２１５に書き込んだ後、バッファメモリ２１５のうち該書き込み情報を書き込んだ位置を示すバッファ位置情報と併せて、バッファメモリ２１５に書き込み情報を書き込んだことを、書き込み指示部２１６に通知する。
【００７６】
第１の書き込み部２１４からの通知を受けた書き込み指示部２１６は、バッファメモリ２１５のうち、第１の書き込み部２１４から通知されたバッファ位置情報が示す位置に書き込まれた書き込み情報を、不揮発キャッシュメモリ２２２へ書き込むことを、第３の書き込み部２２１に対して指示する。
【００７７】
書き込み指示部２１６からの書き込み指示を受けた第３の書き込み部２２１は、バッファメモリ２１５のうち、書き込み指示部２１６から受け取ったバッファ位置情報（この例では書き込み指示に含まれている）が示す位置に書き込まれた書き込み情報を読み出す。そして、第３の書き込み部２２１は、その読み出した書き込み情報（この例では書き込み要求そのもの）を不揮発キャッシュメモリ２２２へ書き込む。
【００７８】
第４の書き込み部２２３は、適切なタイミングで、不揮発キャッシュメモリ２２２に書き込まれた書き込み情報に基づくデータの書き込み（不揮発メモリ２１への書き込み）を行う。
【００７９】
上述の第１の実施形態と同様に、検出部２１０から異常発生の通知を受けた受信部２１１は、それ以降のリクエストの受信を停止する。また、検出部２１０から異常発生の通知を受けた第２の判断部２１３は、プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求があるかどうかを判断し、プロセッサ１０のメモリコントローラ１３から受け取っている途中の書き込み要求がある場合は、その受け取り途中の書き込み要求を廃棄する。一方、検出部２１０が異常を検出した際に、既に受け取りが完了している書き込み要求については、電力保持部２３から供給される電力を用いて、その既に受け取りが完了している書き込み要求に対応する書き込み情報の不揮発キャッシュメモリ２２２への書き込みが行われる。
【００８０】
要するに、本実施形態のメモリデバイス２０は、上述の不揮発キャッシュメモリ２２２と、不揮発メモリ２１に対するデータの書き込みを要求する書き込み要求を、プロセッサ１０のメモリコントローラ１３から受け取った後に、該書き込み要求に対応する書き込み情報を不揮発キャッシュメモリに書き込むコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む。見方を変えれば、半導体装置は、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０から「半導体装置」に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることができる。また、情報処理装置１は、上述のプロセッサ１０と、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることができる。
【００８１】
また、本実施形態のメモリデバイス２０は、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることができる。見方を変えれば、半導体装置は、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０から「半導体装置」に供給される電力の電圧が閾値以下になると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることができる。また、情報処理装置１は、上述のプロセッサ１０と、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、電源３０から供給される電力を保持する電力保持部２３と、を備え、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の電圧が閾値以下になると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることができる。
【００８２】
本実施形態においても、メモリデバイス２０のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２へ書き込む。すなわち、電源３０からメモリデバイス２０に供給される電力の異常が発生しても、既に受け取りが完了している書き込み要求については、電力保持部２３から供給される電力を用いて、該書き込み要求に対応する書き込み情報の不揮発キャッシュメモリ２２２への書き込みを完了させることができるので、アトミシティを保証することができる。
【００８３】
（第２の実施形態の変形例）
例えば図２１に示すように、電力保持部２３および整流素子３１が、メモリデバイス２０の外部に設けられる構成であってもよい。要するに、メモリデバイス２０は、上述の不揮発キャッシュメモリ２２２と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であってもよい。見方を変えれば、半導体装置は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から「半導体装置」に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であってもよい。また、情報処理装置１は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の異常を検出すると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であってもよい。
【００８４】
また、図２１の例では、メモリデバイス２０は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、上述のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることもできる。見方を変えれば、半導体装置は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から「半導体装置」に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることもできる。また、情報処理装置１は、上述の不揮発メモリ２１と、上述のコントローラ２２と、を備え、コントローラ２２は、電源３０から「情報処理装置１」に供給される電力の電圧が閾値以下になると、電源３０から供給される電力を保持する電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に対応する書き込み情報を不揮発キャッシュメモリ２２２に書き込む形態であると考えることもできる。
【００８５】
また、例えば図２２に示すように、不揮発キャッシュメモリ２２２がコントローラ２２に外付けされる構成であってもよいし、図２３に示すようにコントローラ２２、電力保持部２３および整流素子３１の集積体が、不揮発メモリ２１とは別に独立して設けられる形態であってもよい。
【００８６】
（第３の実施形態）
次に、第３の実施形態を説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。
【００８７】
図２４は、本実施形態のメモリデバイス２０の詳細なハードウェア構成の一例を示す図である。図２４に示すように、コントローラ２２は、検出部２１０と、受信部２１１と、解析部２３１と、送信部２３２と、バッファメモリ２１５と、書き込み部２３３と、読み出し部２１９とを備える。これらの各要素は、半導体回路で構成され、それぞれ独立して設けられてもよいし、任意の２以上の要素が集積されて設けられてもよい。本実施形態のメモリデバイス３０は、図１のメモリデバイス２０のようにホスト装置としてプロセッサ１０に接続される場合もあるし、図９の第２のメモリデバイス２００のようにホスト装置として他のメモリデバイス（図９のメモリデバイス２０）に接続される場合もある。以下の本実施形態の説明では、ホスト装置としてプロセッサ１０に接続される場合の動作を説明するが、ホスト装置として他のメモリデバイスに接続される場合の動作も同じである。
【００８８】
検出部２１０は、電源３０からメモリデバイス２０に供給される電力の異常を検出する。より具体的には、検出部２１０は、電源３０からメモリデバイス２０に供給される電力を監視し、電源３０から供給される電力の電圧が閾値以下になると、異常が発生したと判断する。検出部２１０は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、異常を検出したことを知らせる信号線によって、異常が発生したことを解析部２３１に通知する。なお、電源３０からメモリデバイス２０に供給される電力の異常を検出する方法は、検出部２１０が、電源３０からメモリデバイス２０に供給される電力の電圧を測定する方式に限られるものではなく、例えば検出部２１０が、電源３０やプロセッサ１０等の外部装置から、電力の異常を知らせる信号を受け取る方式でもよい。検出部２１０が検出するのは、メモリデバイス２０が正常に動作を継続できない状況が発生したことであり、検出部２１０から解析部２３１への異常発生の通知は、メモリデバイス２０がプロセッサ１０からの新たな書き込み要求の受け取りを停止する指示であるとともに、既に受け取った書き込み要求に基づく不揮発メモリへのデータの書き込みを、電源３０から供給される電力だけでは行えない場合は電力保持部２３に保持した電力も使って行うことの指示である。
【００８９】
受信部２１１は、プロセッサ１０のメモリコントローラ１３からリクエスト（書き込み要求または読み出し要求）を受け取る。本実施形態のコントローラ２２は、複数のクロックサイクルでリクエスト（書き込み要求または読み出し要求）を受け取るので、受信部２１１は、メモリコントローラ１３から、リクエスト全体を１クロックで送信できる単位に分割した各々の断片情報（リクエスト情報）を順次受け取ると考えることができる。受信部２１１が受け取ったリクエスト（あるいはリクエストを構成する断片情報）は、解析部２３１が受け取り、解析部２３１が、リクエストの解析および必要な処理を行う。受信部２１１と解析部２３１の動作タイミングの違いを吸収するために、受信部２１１が受け取ったリクエスト（あるいはリクエストを構成する断片情報）を受け取った順に入れるＦＩＦＯ（Ｆｉｒｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）キューを設け、解析部２３１はＦＩＦＯキューからリクエスト（あるいはリクエストを構成する断片情報）を受け取るように実装することが望ましい。
【００９０】
送信部２３２は、読み出し要求に基づいて不揮発メモリ２１から読み出したデータを読み出し結果として、プロセッサ１０のメモリコントローラ１３に送り返す。読み出し要求にも４バイト、８バイト、１６バイト、３２バイト、６４バイトなどの複数種類のデータサイズの異なる読み出し要求があるので、それぞれに対応した長さのデータを読み出し結果としてホスト装置であるプロセッサ１０に送り返す。読み出し要求に対応する読み出し結果など、一般に、受け取ったリクエストを処理した結果の送り返しはレスポンスと呼ぶ。
【００９１】
本実施形態のリクエストとレスポンスの一般的な形式は、たとえば、図２５と図２６に示すような構成をしている。図２５はリクエストの構成の一例を示す図であり、図２５の例では、リクエストは、コマンドとタグとアドレスとデータとＣＲＣの各フィールドを持つ。コマンドは、このリクエストが書き込み要求なのか読み出し要求なのか、データ長は何バイトなのかを示す情報である。タグは、リクエストとレスポンスの対応をとるための番号で、ある番号のタグを持つ読み出し要求に対応する読み出し結果は、読み出し要求と同じ番号のタグを持つ。アドレスは、データを読み書きしたい不揮発メモリ２１内のデータの位置を示す情報である。データフィールドは、書き込み要求で書き込みたいデータを保持するフィールドである。データフィールドの長さは、コマンドに指定される書き込み要求のデータサイズによって決まる。読み出し要求のリクエストにはデータフィールドは存在しない。ＣＲＣ（Ｃｙｃｌｉｃ  Ｒｅｄｕｎｄａｎｃｙ  Ｃｏｄｅ）は、リクエスト全体が正しく送られたかどうか検査するための情報である。
【００９２】
図２６はレスポンスの構成の一例を示す図であり、図２６の例では、レスポンスは、コマンドとタグとデータとＣＲＣの各フィールドを持つ。コマンドは、このレスポンスが何バイトの読み出し要求に対応する読み出し結果であるかを示す情報である。タグは、このレスポンスがどのリクエストに対応するものかを示す情報である。データは読み出したデータを保持するフィールドである。ＣＲＣはレスポンス全体が正しく送られたかどうかを検査するための情報である。
【００９３】
図２７は、６４バイトの書き込み要求のリクエストの例である。コマンドフィールドに、６４バイトの書き込み要求であることを示す情報を持ち、この書き込み要求はレスポンスを返す必要が無いのでタグフィールドは無指定（この例では「−」と表記）で、データを書き込みたいアドレスは「１０８Ａ０」、書き込みたいデータは「８Ｆ  ４２  …  ０Ｂ  ９Ｄ」である。
【００９４】
図２８は、６４バイトの読み出し要求のリクエストの例である。コマンドフィールドに、６４バイトの読み出し要求であることを示す情報を持ち、タグフィールドは「７」で、データを読み出したいアドレスは「２１Ｂ４９８」である。この読み出し要求に対応する読み出し結果のレスポンスの例が図２９である。コマンドフィールドは、６４バイトの書き込み要求に対応する読み出し結果であることを示す情報を持ち、タグフィールドは対応する読み出し要求と同じ「７」で、データフィールドには読み出したデータである「４８  ＢＤ  …  ５３  Ａ４」を持つ。
【００９５】
なお、ここに示した例では、書き込み要求は対応する書き込み結果のレスポンスを持たない場合を示したが、読み出し要求と同様に、書き込み要求に対しても書き込みが終わったこと（あるいは書き込み要求を受け取ったこと）を知らせる書き込み結果のレスポンスを返すようにすることは容易である。
【００９６】
図２４の解析部２３１は、受信部２１１がプロセッサ１０から受け取ったリクエストを解析して、それが読み出し要求なのか書き込み要求なのか判断し、読み出し要求なら読み出し部２１９に読み出し処理を行うように指示し、書き込み要求なら書き込み要求に含まれるデータ（書き込み対象のデータ）をバッファメモリ２１５に保管した後に、書き込み部２３３に対して該データの書き込みを指示する。
【００９７】
図３０は、解析部２３１の詳細な動作の一例を示すフローチャートである。以下、図３０に基づいて解析部２３１の動作を説明する。まず、解析部２３１は、受信部２１１がプロセッサ１０から受信したリクエストのコマンドフィールドを受け取る（ステップＳ５０）。このとき、受信部２１１が既に１以上のリクエストを受信していれば（そしてＦＩＦＯに入れていれば）、最初のリクエストのコマンドフィールドを取り出す。受信部２１１が、まだプロセッサ１０からリクエストを受け取っていない場合（ＦＩＦＯが空の場合）は、受信部２１１が新しいリクエストの受け取りを開始するのを待つ。受信部２１１がリクエストの受け取りを開始すれば、リクエスト全体を受け取り終わる前でも、少なくともコマンドフィールドさえ受け取っていれば、解析部２３１はそのコマンドフィールドを受け取って処理を進める。なお、解析部２３１は、コマンドフィールド単独でなく、他のフィールド（たとえばタグフィールドなど）も一緒に受信部２１１から受け取るようにしても構わない。
【００９８】
次に、解析部２３１は、検出部２１０から異常信号が送られて来ているかどうか調べる（ステップＳ５１）。検出部２１０から異常信号が送られて来ている場合（ステップＳ５１：ＹＥＳ）、これ以降は新しいリクエストの処理は行わないので、受信部２１１からリクエスト全体を受け取って、何もせず読み飛ばして（ステップＳ５２）、ステップＳ５０に戻る。検出部２１０から異常信号が送られて来ていない場合（ステップＳ５１：Ｎｏ）は、解析部２３１は、受信部２１１からリクエストのタグフィールドとアドレスフィールドを受け取る（ステップＳ５３）。このときも、受信部２１１がこのリクエスト全体の受け取りを完了している必要は無く、少なくともタグフィールドおよびアドレスフィールドの各々に対応する断片情報を受け取っていれば良い。次に、先に受け取ったコマンドフィールドのコマンドが書き込み要求なのか読み出し要求なのかを判定する（ステップＳ５４）。読み出し要求である場合（ステップＳ５４：ＮＯ）は、ＣＲＣチェックが成功したかどうかを判定し（ステップＳ５５）、リクエストが正しく受信できていない場合（ステップＳ５５：Ｎｏ）は、このリクエストを無視してステップＳ５０に戻る。ＣＲＣチェックでリクエストが正しく受信できていることが分かれば（ステップＳ５５：ＹＥＳ）、読み出し部２１９に対してリクエストのコマンドフィールドとタグフィールドとアドレスフィールドの各フィールドの情報を渡して読み出し処理を指示する（ステップＳ５６）。なお、ＣＲＣチェックの実施方法は、解析部２３１が受信部２１１からＣＲＣフィールドを受け取って、解析部２３１内でリクエストの他のフィールドの情報に基づいて計算してチェックを行うように実施できる。また、望ましくは、受信部２１１内で受信しながらＣＲＣの計算を行っておき、最後のＣＲＣフィールドと比べてチェックし、その結果を解析部２３１に知らせるように実施すると良い。
【００９９】
上述のステップＳ５４において、コマンドは書き込み要求であった場合（ステップＳ５４：Ｙｅｓ）は、まずバッファメモリ２１５内にデータ保管領域を確保する（ステップＳ５７）。データ保管領域は、書き込み要求のデータフィールドのデータをバッファメモリ２１５内に一時的に記憶しておくための領域である。コマンドをみれば何バイトのデータが送られてくるか分かるので、その大きさのデータを記憶できる領域を確保する。次に受信部２１１からリクエストのデータフィールドを受け取る（ステップＳ５８）。そして、そのデータフィールドに保持されているデータを、ステップＳ５７で確保したバッファメモリ２１５内のデータ保管領域に書き込む（ステップＳ５９）。このとき、受信部２１１が、プロセッサ１０から、リクエストのデータフィールド全体の受け取りを完了していれば、解析部２３１は一度にデータフィールド全体を受け取ることができるが、受信部２１１がリクエストの受け取りを進行中であれば、その時点で受け取っているデータフィールドの一部分だけを解析部２３１は受け取ることになる。そのため、リクエストのデータフィールド全体を受信部２１１から受け取ったかどうかを判断して（ステップＳ６０）、まだ全体を受け取っていない場合（ステップＳ６０：Ｎｏ）は、ステップＳ５８に戻って、データフィールドの残りの部分の受け取りとデータ保管領域への書き込みを続ける。データフィールド全体の受け取りを完了すれば（ステップＳ６０：ＹＥＳ）、次にＣＲＣチェックを行ってＣＲＣチェックが成功したかどうかを判定し（ステップＳ６１）、リクエスト全体を正しく受け取ったことを確認できれば（ステップＳ６１：ＹＥＳ）、書き込み部２３３に対して、リクエストのコマンドフィールドとアドレスフィールドの各フィールドの情報およびデータ保管領域の情報（バッファメモリ２１５内に確保したデータ保管領域のアドレス）を渡して、書き込み処理を指示する（ステップＳ６２）。ＣＲＣチェックの結果、リクエスト全体を正しく受信できていない場合（ステップＳ６１：ＮＯ）は、このリクエストを無視してステップＳ５０に戻る。
【０１００】
なお、電源異常などの障害が発生すると、受信部２１１がリクエストを途中までしか受け取っていない状態で、リクエストの残りの部分が送られて来ない状態になる可能性がある。そのため、図３０に示した解析部２３１のフローチャートに基づいて動作している途中で電源異常が発生すると、解析部２３１が受信部２１１からリクエストのいずれかのフィールドを受け取ろうとして停止することになる。これにより、電源等の異常が発生すれば、それ以降の新しいリクエストを受け取って処理することを抑えることができる。
【０１０１】
図２４に戻って説明を続ける。図２４の読み出し部２１９は、解析部２３１からの指示に基づき、不揮発メモリ２１からデータを読み出してプロセッサ１０に送り返す。読み出し部２１９の詳細な動作の一例を図３１のフローチャートに示す。以下、図３１に基づいて、読み出し部２１９の動作を説明する。図３１に示すように、まず、読み出し部２１９は、解析部２３１から、読み出し要求のリクエストに含まれているコマンドフィールとタグフィールドとアドレスフィールドの各フィールドの情報を受け取る（ステップＳ７０）。次に、コマンドに指定されている長さ（サイズ）のデータを、アドレスに指定されている不揮発メモリ２１中の位置から読み出す（ステップＳ７１）。そして、読み出したデータを読み出し結果のレスポンスとして送り返すことを、送信部２３２に指示する（ステップＳ７２）。このとき、解析部２３１から受け取ったコマンドフィールドの情報に基づいて、送り返すレスポンスのコマンドを選択し、そのレスポンスのコマンドと、解析部２３１から受け取ったタグフィールドの情報と、不揮発メモリ２１から読み出したデータを、レスポンスを構成する情報として送信部２３２に渡す。読み出し結果のレスポンスを返した後は、ステップＳ７０に戻る。
【０１０２】
再び図２４に戻って説明を続ける。図２４の書き込み部２３３は、解析部２３１からの指示に基づき、不揮発メモリ２１にデータを書き込む。書き込み部２３３の詳細な動作の一例を図３２のフローチャートに示す。以下、図３２に基づいて、書き込み部２３３の動作を説明する。図３２に示すように、まず、書き込み部２３３は、解析部２３１から、書き込み要求のリクエストに含まれているコマンドフィールドとアドレスフィールドの各フィールドの情報およびデータ保管領域の情報（バッファメモリ２１５中のデータ保管領域のアドレス）を受け取る（ステップＳ８０）。次に、コマンドに指定されている書き込みデータ長（サイズ）のデータを、バッファメモリ２１５中のデータ保管領域から読み出し、アドレスで指定されている不揮発メモリ２１中の位置に書き込む（ステップＳ８１）。その後、ステップＳ８０に戻る。
【０１０３】
図２４において、受信部２１１がプロセッサ１０からリクエストを受信する信号線と、送信部２３２がレスポンスをプロセッサ１０へ送信する信号線は、それぞれ別の信号線を使う場合を示している。高速にデータを送受信するためには、このように送信用と受信用の信号線を独立に設けることが多い。別の実施法としては、送信用と受信用の信号線を共用し、送信時と受信時で信号の流れる方向を切り替えるようにしても良い。
【０１０４】
以上に説明したように、本実施形態においても、メモリデバイス２０のコントローラ２２は、電源３０からメモリデバイス２０に供給される電力の異常を検出すると、電力保持部２３から供給される電力を用いて、既に受け取った書き込み要求に基づくデータの書き込みを行う。すなわち、電源３０からメモリデバイス２０に供給される電力の異常が発生しても、既に受け取りが完了している書き込み要求については、電力保持部２３から供給される電力を用いて書き込みを完了させることができる。また、受け取りが完了していない書き込み要求に基づく不完全なデータの書き込みを防止できる。したがって、本実施形態によれば、メモリデバイス２０にコントローラ２２が搭載される構成においてもアトミシティを保証することができる。
【０１０５】
（第３の実施形態の変形例）
例えばバッファメモリ２１５として、不揮発性のメモリを用いても良い。上述の第３の実施形態の構成では、バッファメモリ２１５に揮発性のメモリを用いていたが、例えば図３３に示すように、不揮発性のメモリ（この例では「不揮発バッファメモリ２３４」と称する）を用いるように実施しても良い。このように不揮発バッファメモリ２３４を使うことで、一旦不揮発バッファメモリ２３４に記録された書き込みデータは、電源障害が発生しても失われないようにできる。その結果、メモリデバイス２０が受け取った書き込み要求に対応する不揮発メモリ２１への書き込みが完了する前に電源障害が発生しても、書き込むべきデータは不揮発バッファメモリ２３４中のデータ保管領域に記録されているので、失われない。次に電源が入った時に、不揮発バッファメモリ２３４中のデータ保管領域に記録されているデータを不揮発メモリ２１に書き込めばよい。なお、この例のデータ保管領域には、書き込み要求のリクエストのデータフィールドの情報だけでなく、少なくともアドレスフィールドの情報を合わせて記録しておく必要がある。これは、障害からのリカバリ時に、データ保管領域のデータを不揮発メモリ２１のどの位置（アドレス）に書き込めばよいか分かる必要があるためである。書き込むデータの長さ（サイズ）は、データ保管領域の管理データを見れば分かるようになっていれば、さらにデータ保管領域に記録する必要はないが、そうでない場合には、データ長あるいはそれが分かる情報（例えばコマンドフィールドの情報）をデータ保管領域に合わせて記録しておく。
【０１０６】
（第４の実施形態）
次に、第４の実施形態を説明する。上述の各実施形態と共通する部分については適宜に説明を省略する。
【０１０７】
図３４は、本実施形態のメモリデバイス２０の詳細なハードウェア構成の一例を示す図である。基本的な構成は上述の第３の実施形態と同じであるが、２つの送信部２３２と２つの受信部２１１を持つ２ポートの構成になっている。それに合わせて、２つの解析部２３１と２つの読み出し部２１９を持つ。本実施形態のメモリデバイス２０は、図７のように複数のチャネルでホスト装置であるプロセッサ１０と接続してもよいし、図８のようにホスト装置である複数のプロセッサ（図８のプロセッサ１０ａとプロセッサ１０ｂ）と接続して用いてもよい。また、図９のメモリデバイス２０のように、一方のポートをホスト装置であるプロセッサ１０と接続し、もう一方のポートには自分がホスト装置となって他のメモリデバイス（図９の第２のメモリデバイス２００）と接続することもできる。さらに、図１０のメモリデバイス２０ように、一方のポートをホスト装置であるプロセッサ１０と接続し、もう一方のポートには他のメモリデバイス（図９の第２のメモリデバイス２００）と接続し、接続した他のメモリデバイスと互いにホスト装置として動作するようにもできる。
【０１０８】
図３４に示す本実施形態のメモリデバイス２０のハードウェア構成において、検出部２１０、バッファメモリ２１５、書き込み部２３３の動作は、図２４に示す第３の実施形態と同様である。第３の実施形態と異なるところは、送信部２３２と受信部２１１と解析部２３１と読み出し部２１９が２つあることで、それぞれ第１送信部２３２ａと第２送信部２３２ｂ、第１受信部２１１ａと第２受信部２１１ｂ、第１解析部２３１ａと第２解析部２３１ｂ、第１読み出し部２１９ａと第２読み出し部２１９ｂである。また、それに関連して、解析部２３１の動作が一部異なる。なお、これらの各要素は、半導体回路で構成され、それぞれ独立して設けられてもよいし、任意の２以上の要素が集積されて設けられてもよい。
【０１０９】
本実施形態のリクエストとレスポンスの一般的な形式は、たとえば、図３５と図３６に示すような構成をしている。図２５と図２６に示した第３の実施形態のリクエストとレスポンスの構成との違いは、ルーティング情報のフィールドを持つことである。ルーティング情報は、このリクエストあるいはレスポンスが、どのメモリデバイス２０あるいはホスト装置（プロセッサ１０）に対して送られたのかを判断するための情報である。例えば、接続されているホスト装置やメモリデバイス２０に対して一意の番号を付け、その番号をルーティング情報として使うことができる。たとえばＨＭＣではリクエストの持つキューブＩＤやレスポンスの持つソースリンクＩＤが、本実施形態のルーティング情報に相当する。
【０１１０】
図３７は、６４バイトの書き込み要求のリクエストの例である。図２７の例に加えて、ルーティング情報として「１」を持っている。図３８は、６４バイトの読み出し要求のリクエストの例である。図２８の例に加えて、ルーティング情報として「１」を持っている。ルーティング情報「１」は、たとえばあるメモリデバイスを示す。この読み出し要求に対応する読み出し結果のレスポンスの例が図３９である。図２９の例に加えて、ルーティング情報として「０」を持っている。ルーティング情報「０」は、例えば、あるメモリデバイス２０に接続されているホスト装置を示す。
【０１１１】
なお、ここに示した例では、書き込み要求は対応する書き込み結果のレスポンスを持たない場合を示したが、読み出し要求と同様に、書き込み要求に対しても書き込みが終わったこと（あるいは書き込み要求を受け取ったこと）を知らせる書き込み結果のレスポンスを返すようにすることは容易である。
【０１１２】
図３４の解析部２３１は、受信部２１１がホスト装置から受け取ったリクエストを解析して、それが読み出し要求なのか書き込み要求なのか判断し、読み出し要求なら読み出し部に読み出し処理を行うように指示し、書き込み要求なら書き込み要求に含まれるデータをバッファメモリ２１５に保管した後に書き込み部２３３にデータの書き込みを指示する。
【０１１３】
図４０は、第１解析部２３１ａおよび第２解析部２３１ｂの詳細な動作の一例を示すフローチャートである。以下、図４０に基づいて第１解析部２３１ａ（第２解析部２３１ｂ）の動作を説明する。まず、第１解析部２３１ａ（第２解析部２３１ｂ）は、第１受信部２１１ａ（第２受信部２１１ｂ）がホスト装置であるプロセッサ１０あるいは他のメモリデバイス２０から受信したリクエストまたはレスポンスのルーティング情報フィールドを受け取る（ステップＳ９０）。このとき、第１受信部２１１ａ（第２受信部２１１ｂ）が既に１以上のリクエストまたはレスポンスを受信していれば（そしてＦＩＦＯに入れていれば）、最初のリクエストまたはレスポンスのルーティング情報フィールドを取り出す。第１受信部２１１ａ（第２受信部２１１ｂ）がまだホスト装置あるいは他のメモリデバイス２０からリクエストまたはレスポンスを受け取っていない場合（ＦＩＦＯが空の場合）は、第１受信部２１１ａ（第２受信部２１１ｂ）が新しいリクエストまたはレスポンスの受け取りを開始するのを待つ。第１受信部２１１ａ（第２受信部２１１ｂ）がリクエストまたはレスポンスの受け取りを開始すれば、リクエストまたはレスポンス全体を受け取り終わる前でも、少なくともルーティング情報フィールドさえ受け取っていれば、第１解析部２３１ａ（第２解析部２３１ｂ）はそのルーティング情報フィールドを受け取って処理を進める。なお、第１解析部（第２解析部）は、ルーティング情報フィールド単独でなく、他のフィールド（たとえばコマンドフィールドなど）も一緒に第１受信部２１１ａ（第２受信部２１１ｂ）から受け取るようにしても構わない。
【０１１４】
次に、第１解析部２３１ａ（第２解析部２３１ｂ）は、ステップＳ９０で受け取ったルーティング情報フィールドのルーティング情報で指定されている送信先が自メモリデバイス２０であるかどうかを調べる（ステップＳ９１）。自メモリデバイス２０を指定するルーティング情報は、予め固定の値を決めておくこともできるし、制御用のレジスタに値を設定できるようにしておくこともできる。その値とルーティング情報フィールドを比べることで、自メモリデバイス２０宛かどうかを判断できる。ルーティング情報に他のメモリデバイス２０が指定されていた場合（ステップＳ９１：Ｎｏ）は、第１解析部２３１ａ（第２解析部２３１ｂ）からリクエストまたはレスポンスの全体を受け取り、その転送を第２送信部２３２ｂ（第１送信部２３２ａ）に指示する（ステップＳ９２）。そしてステップＳ９０に戻る。
【０１１５】
ルーティング情報に指定されている送信先が自メモリデバイスであれば（ステップＳ９１でＹＥＳ）、第１解析部２３１ａ（第２解析部２３１ｂ）は第１受信部２１１ａ（第２受信部２１１ｂ）からコマンドフィールドを受け取る（ステップＳ９３）。このときも、第１受信部２１１ａ（第２受信部２１１ｂ）がこのリクエスト全体を受け取り完了している必要は無く、少なくともコマンドフィールドに対応する断片情報を受け取っていれば良い。まだ第１受信部２１１ａ（第２受信部２１１ｂ）がコマンドフィールドに対応する断片情報を受け取っていなければ、第１受信部２１１ａ（第２受信部２１１ｂ）がコマンドフィールドに対応する断片情報を受け取るまで待つ。
【０１１６】
次に、第１解析部２３１ａ（第２解析部２３１ｂ）は、検出部２１０から異常信号が送られてきているかどうか調べる（ステップＳ９４）。検出部から異常信号が送られて来ている場合（ステップＳ９４：ＹＥＳ）、これ以降は新しいリクエストの処理は行わないので、第１受信部２１１ａ（第２受信部２１１ｂ）からリクエスト全体を受け取って、何もせず読み飛ばして、ステップＳ９０に戻る。検出部２１０から異常信号が送られて来ていない場合（ステップＳ９４：ＮＯ）は、第１解析部２３１ａ（第２解析部２３１ｂ）は第１受信部２１１ａ（第２受信部２１１ｂ）からリクエストのタグフィールドとアドレスフィールドを受け取る（ステップＳ９６）。このときも、第１受信部２１１ａ（第２受信部２１１ｂ）がこのリクエスト全体を受け取り完了している必要は無く、少なくともタグフィールドとアドレスフィールドに対応する断片情報を受け取っていれば良い。まだ第１受信部２１１ａ（第２受信部２１１ｂ）がタグフィールドとアドレスフィールドに対応する断片情報を受け取っていなければ、第１受信部２１１ａ（第２受信部２１１ｂ）がタグフィールドとアドレスフィールドに対応する断片情報を受け取るまで待つ。次に、先に受け取ったコマンドフィールドのコマンドが書き込み要求なのか読み出し要求なのかを判定する（ステップ９７）。読み出し要求である場合（ステップＳ９７：Ｎｏ）は、ＣＲＣチェックが成功したかどうかを判定し（ステップＳ９８）、リクエストが正しく受信できていない場合（ステップＳ９８：Ｎｏ）は、このリクエストを無視してステップＳ９０に戻る。ＣＲＣチェックでリクエストが正しく受信できていることが分かれば（ステップＳ９８：Ｙｅｓ）、第１読み出し部２１９ａ（第２読み出し部２１９ｂ）に対してリクエストのコマンドフィールドとタグフィールドとアドレスフィールドの各フィールドの情報を渡して読み出し処理を指示する（ステップＳ９９）。なお、ＣＲＣチェックの実施方法は、第１解析部２３１ａ（第２解析部２３１ｂ）が第１受信部（第２受信部）からＣＲＣフィールドを受け取って、第１解析部２３１ａ（第２解析部２３２ｂ）内でリクエストの他のフィールドの情報に基づいて計算してチェックを行うように実施できる。また、望ましくは、第１受信部２１１ａ（第２受信部２１１ｂ）内で受信しながらＣＲＣの計算を行っておき、最後のＣＲＣフィールドと比べてチェックし、その結果を第１解析部２３１ａ（第２解析部２３１ｂ）に知らせるように実施すると良い。
【０１１７】
上述のステップＳ９７において、コマンドは書き込み要求であった場合（ステップＳ９７：Ｙｅｓ）は、まずバッファメモリ２１５内にデータ保管領域を確保する（ステップＳ１００）。データ保管領域は、書き込み要求のデータフィールドのデータをバッファメモリ２１５内に一時的に記憶しておくための領域である。コマンドをみれば何バイトのデータが送られてくるか分かるので、その大きさのデータを記憶できる領域を確保する。次に第１受信部２１１ａ（第２受信部２１１ｂ）からリクエストのデータフィールドを受け取る（ステップＳ１０１）。そして、そのデータフィールドに保持されているデータを、ステップＳ１００で確保したバッファメモリ２１５内のデータ保管領域に書き込む（ステップＳ１０２）。このとき、第１受信部２１１ａ（第２受信部２１１ｂ）が、ホスト装置または他のメモリデバイス２０から、リクエストのデータフィールド全体の受け取りを完了していれば、第１解析部２３１ａ（第２解析部２３１ｂ）は一度にデータフィールド全体を受け取ることができるが、第１受信部２１１ａ（第２受信部２１１ｂ）がリクエストの受け取りを進行中であれば、その時点で受け取っているデータフィールドの一部分だけを第１解析部２３１ａ（第２解析部２３１ｂ）は受け取ることになる。そのため、リクエストのデータフィールド全体を第１受信部２１１ａ（第２受信部２１１ｂ）から受け取ったかどうかを判断して（ステップＳ１０３）、まだ全体を受け取っていない場合（ステップＳ１０３：Ｎｏ）は、ステップＳ１０１に戻って、データフィールドの残りの部分の受け取りとデータ保管領域への書き込みを続ける。データフィールド全体を受け取り完了すれば（ステップＳ１０３：Ｙｅｓ）、次にＣＲＣチェックを行ってＣＲＣチェックが成功したかどうかを判定し（ステップＳ１０４）、リクエスト全体を正しく受け取ったことを確認できれば（ステップＳ１０４：Ｙｅｓ）、書き込み部２３３に対して、リクエストのコマンドフィールドとアドレスフィールドの各フィールドの情報およびデータ保管領域の情報（バッファメモリ内に確保したデータ保管領域のアドレス）を渡して、書き込み処理を指示する（ステップＳ１０５）。ＣＲＣチェックの結果、リクエスト全体を正しく受信できていない場合（ステップＳ１０４：Ｎｏ）は、このリクエストを無視してステップＳ９０に戻る。
【０１１８】
なお、電源異常などの障害が発生すると、第１受信部２１１ａ（第２受信部２１１ｂ）がリクエストやレスポンスを途中までしか受け取っていない状態で、リクエストの残りの部分が送られてこない状態になる可能性がある。そのため、図４０に示した第１解析部２３１ａ（第２解析部２３１ｂ）のフローチャートに基づいて動作している途中で電源異常が発生すると、第１解析部２３１ａ（第２解析部２３１ｂ）が第１受信部２１１ａ（第２受信部２１１ｂ）からリクエストのいずれかのフィールドを受け取ろうとして停止することになる。これにより、電源等の異常が発生すれば、それ以降のホスト装置からの新しいリクエストを受け取って処理することを抑えることができる。
【０１１９】
図３４の第１読み出し部２１９ａと第２読み出し部２１９ｂは、それぞれ第１解析部２３１ａと第２解析部２３１ｂからの指示に基づき、不揮発メモリ２１からデータを読み出してホスト装置あるいは他のメモリデバイス２０に送り返す。第１読み出し部２１９ａ（第２読み出し部２１９ｂ）の詳細な動作の一例を図４１のフローチャートに示す。以下、図４１に基づいて、第１読み出し部２１９ａ（第２読み出し部２１９ｂ）の動作を説明する。まず、第１読み出し部２１９ａ（第２読み出し部２１９ｂ）は、第１解析部２３１ａ（第２解析部２３１ｂ）から、読み出し要求のリクエストに含まれているコマンドフィールドとタグフィールドとアドレスフィールドの各フィールドの情報を受け取る（ステップＳ１１０）。次に、コマンドに指定されている長さ（サイズ）のデータを、アドレスに指定されている不揮発メモリ２１中の位置から読み出す（ステップＳ１１１）。そして、読み出したデータを読み出し結果のレスポンスとして送り返すことを、第１送信部２３２ａ（第２送信部２３２ｂ）に指示する（ステップＳ１１２）。このとき、第１解析部２３１ａ（第２解析部２３１ｂ）から受け取ったコマンドフィールドの情報に基づいて、送り返すレスポンスのコマンドを選択し、そのレスポンスのコマンドと、第１解析部２３１ａ（第２解析部２３１ｂ）から受け取ったタグフィールドの情報と、不揮発メモリ２１から読み出したデータを、レスポンスを構成する情報として第１送信部２３３ａ（第２送信部２３３ｂ）に渡す。読み出し結果のレスポンスを返した後は、ステップＳ１１０に戻る。
【０１２０】
図３４の書き込み部２３３は、解析部２３１からの指示に基づき、不揮発メモリ２１にデータを書き込む。書き込み部２３３の詳細な動作の一例を図４２のフローチャートに示す。図４２に基づいて、書き込み部２３３の動作を説明する。書き込み部２３３は、まず、第１解析部２３１ａ（第２解析部２３１ｂ）から、書き込み要求のリクエストに含まれているコマンドフィールドとアドレスフィールドの各フィールドの情報およびデータ保管領域の情報（バッファメモリ中のデータ保管領域のアドレス）を受け取る（ステップＳ１２０）。次に、コマンドに指定されている書き込みデータ長（サイズ）のデータを、バッファメモリ中のデータ保管領域から読み出し、アドレスで指定されている不揮発メモリ中の位置に書き込む（ステップＳ１２１）。その後、ステップＳ１２０に戻る。
【０１２１】
図３４において、第１受信部２１１ａ（第２受信部２１１ｂ）がホスト装置または他のメモリデバイス２０からリクエストを受信する信号線と、第１送信部２３２ａ（第２送信部２３２ｂ）がレスポンスをホスト装置または他のメモリデバイス２０へ送信する信号線は、それぞれ別の信号線を使う場合を示している。高速にデータを送受信するためには、このように送信用と受信用の信号線を独立に設けることが多い。別の実施法としては、送信用と受信用の信号線を共用し、送信時と受信時で信号の流れる方向を切り替えるようにしても良い。
【０１２２】
なお、図３４に示した構成は２つのポート（送信および受信を行う信号線）を持つが、ポートの数を３つ以上に拡張するのは容易である。その場合、いずれかの受信部２１１が受け取ったリクエストあるいはレスポンスのルーティング情報の番号を見て、それが自メモリデバイス２０宛ではない場合に、どの送信部２３２から送信すれば良いかが分かる情報を、コントローラ２２内に管理しておく。それぞれの解析部２３１は、その情報を参照して、適切な送信部２３２からリクエストあるいはレスポンスを転送する。
【０１２３】
以上のようにして、複数のメモリデバイス２０やプロセッサ１０を組み合わせて用いる場合でも、何れかのメモリデバイス２０に接続される１または複数のプロセッサ１０（ホスト装置）が、電力の異常が発生する前に何れかのメモリデバイス２０に対して送った書き込み要求は、必ずターゲットのメモリデバイス２０に転送されて当該書き込み要求に基づくデータの書き込みが行われることを保証できる。また、受け取りが完了していない書き込み要求に基づく不完全なデータの書き込みを防止でき、他のメモリデバイスへのリクエストの転送や他のメモリデバイスからのレスポンスの転送を継続できる。
【０１２４】
（第４の実施形態の変形例）
図３４に示した第４の実施形態では、第１読み出し部２１９ａと第２読み出し部２１９ｂを別に設けているが、読み出し部２１９を一つにして、第１解析部２３１ａと第２解析部２３１ｂの両方からの読み出し処理の指示を受けるように構成することもできる。この場合、読み出し部２１９は第１送信部２３２ａと第２送信部２３２ｂの両方に接続し、読み出し結果のレスポンスを第１送信部２３２ａと第２送信部２３２ｂのどちらから送り返せば良いか判断するための情報を、第１解析部２３１ａと第２解析部２３１ｂからの読み出しの指示の際に渡すようにする。
【０１２５】
以上、本発明の実施形態を説明したが、上述の各実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【０１２６】
なお、上述した各実施形態および各変形例は任意に組み合わせることができる。
【符号の説明】
【０１２７】
１      情報処理装置
１０    プロセッサ
１１    プロセッサコア
１２    キャッシュメモリ
１３    メモリコントローラ
２０    メモリデバイス
２１    不揮発メモリ
２２    コントローラ
２３    電力保持部
３０    電源
３１    整流素子
２１０  検出部
２１１  受信部
２１２  第１の判断部
２１３  第２の判断部
２１４  第１の書き込み部
２１５  バッファメモリ
２１６  書き込み指示部
２１７  第２の書き込み部
２１８  第３の判断部
２１９  読み出し部
２２１  第３の書き込み部
２２２  不揮発キャッシュメモリ
２２３  第４の書き込み部
２３１  解析部
２３２  送信部
２３３  書き込み部
２３４  不揮発バッファメモリ
【図１】
0006541998.tif 000002
【図２】
0006541998.tif 000003
【図３】
0006541998.tif 000004
【図４】
0006541998.tif 000005
【図５】
0006541998.tif 000006
【図６】
0006541998.tif 000007
【図７】
0006541998.tif 000008
【図８】
0006541998.tif 000009
【図９】
0006541998.tif 000010
【図１０】
0006541998.tif 000011
【図１１】
0006541998.tif 000012
【図１２】
0006541998.tif 000013
【図１３】
0006541998.tif 000014
【図１４】
0006541998.tif 000015
【図１５】
0006541998.tif 000016
【図１６】
0006541998.tif 000017
【図１７】
0006541998.tif 000018
【図１８】
0006541998.tif 000019
【図１９】
0006541998.tif 000020
【図２０】
0006541998.tif 000021
【図２１】
0006541998.tif 000022
【図２２】
0006541998.tif 000023
【図２３】
0006541998.tif 000024
【図２４】
0006541998.tif 000025
【図２５】
0006541998.tif 000026
【図２６】
0006541998.tif 000027
【図２７】
0006541998.tif 000028
【図２８】
0006541998.tif 000029
【図２９】
0006541998.tif 000030
【図３０】
0006541998.tif 000031
【図３１】
0006541998.tif 000032
【図３２】
0006541998.tif 000033
【図３３】
0006541998.tif 000034
【図３４】
0006541998.tif 000035
【図３５】
0006541998.tif 000036
【図３６】
0006541998.tif 000037
【図３７】
0006541998.tif 000038
【図３８】
0006541998.tif 000039
【図３９】
0006541998.tif 000040
【図４０】
0006541998.tif 000041
【図４１】
0006541998.tif 000042
【図４２】
0006541998.tif 000043