(57)【要約】【課題】  パイプラインを有するプロセッサの動作サイクル数を正しく見積もることができるエミュレータを提供する。【解決手段】    ＭＩＰＳコアに対応するＭＩＰＳオブジェクト１０２と、パイプラインに対応してその前後が関連付けられ、ＭＩＰＳオブジェクト１０２の制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロック１０３〜１０６と、入力されたインストラクションのステップ毎に、複数段の処理ブロック１０３〜１０６のうち最も動作した処理ブロックの動作サイクル数を保持するステップサイクル数保持用レジスタ１０１とを備えてエミュレータを構成する。ＭＩＰＳオブジェクト１０２は、ステップサイクル数保持用レジスタ１０１に保持されている動作サイクル数を当該ステップにおけるパイプラインの実行ステップサイクル数として出力する。【選択図】      図７
2007048020.tif 000002
【特許請求の範囲】
【請求項１】
インストラクションをパイプラインにより実行するプロセッサの機能をエミュレートする方法であって、
その前後が関連付けられた複数段の処理ブロックにより前記パイプラインを構成し、各処理ブロックを、前記プロセッサに対応するプロセッサオブジェクトが並列かつ独立に動作可能にする過程と、
前記プロセッサオブジェクトが、前記インストラクションを前記複数段の処理ブロックに入力する過程と、
前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち動作した処理ブロックが、動作する度に増加する動作サイクル数を保持する過程と、
前記保持されている動作サイクル数の最大値を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力する過程とを含む、
エミュレーション方法。
【請求項２】
前記複数段の処理ブロックがアクセス可能なレジスタを設け、いずれかの処理ブロックが前記レジスタに自己の動作サイクル数を保持するとともに、既に保持されている動作サイクル数よりも多く動作した処理ブロックが、前記レジスタに保持されている動作サイクル数を自己の動作サイクル数に更新する、
請求項１記載のエミュレーション方法。
【請求項３】
インストラクションをパイプラインにより実行するプロセッサの動作をエミュレートするエミュレータであって、
前記プロセッサに対応するプロセッサオブジェクトと、
前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロックと、
入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段とを備えており、
前記プロセッサオブジェクトは、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力する、
エミュレータ。
【請求項４】
前記プロセッサオブジェクトは、前記インストラクションの最初のステップでは前記サイクル数保持手段に保持される動作サイクル数を初期値にセットするとともに、各段の処理ブロックが動作する度に、動作した処理ブロックの動作サイクル数が既に前記サイクル数保持手段に保持されている動作サイクル数よりも大きいかどうかを判定し、大きいときに前記サイクル数保持手段に保持されている動作サイクル数を更新可能にする、
請求項３記載のエミュレータ。
【請求項５】
前記複数段の処理ブロックは、動作サイクル数が前記インストラクションに関わらず固定となる処理ブロックを含む、
請求項３記載のエミュレータ。
【請求項６】
インストラクションをパイプラインにより実行するプロセッサの機能を前記プロセッサが搭載されたものと異なる装置においてエミュレートするためのデバイスであって、
前記装置に組み込まれたときに当該装置のハードウエア資源との協働により、
当該装置に、
前記プロセッサに対応するプロセッサオブジェクトと、
前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロックと、
入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段とを形成し、
前記プロセッサオブジェクトに、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力させる、
コンピュータ組込型デバイス。
【請求項７】
コンピュータを、インストラクションをパイプラインにより実行するプロセッサの動作をエミュレートするエミュレータとして動作させるためのプログラムであって、
前記コンピュータを、
前記プロセッサに対応するプロセッサオブジェクト；
前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロック；
入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段；として動作させ、
前記プロセッサオブジェクトに、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力させる、
エミュレータ用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はエミュレータに係り、特に、あるコンピュータシステムが有する複数のハードウエア資源の機能を、性能等が異なる他のコンピュータシステム上で実現する際の各ハードウエア資源同士の動作タイミングを正しく合わせるための手法に関する。
【背景技術】
【０００２】
あるコンピュータシステム向けに作成されたプログラムを、処理性能等の異なる他のコンピュータシステムで動作させるために、エミュレータが用いられている。このエミュレータを用いて汎用的なプログラムが動くコンピュータシステムをエミュレートする場合、プログラムによっては、ハードウエア資源との動作タイミングが非常にシビアなものがある。これをエミュレートするためには、何らかの方法でハードウエア資源の動作タイミングとプログラムの動作タイミングとを同期させる必要がある。この場合、従来は、エミュレータで、各ハードウエア資源の仮想動作サイクル数を見積もり、この仮想動作サイクル数と各ハードウエア資源の動作サイクル数とを比較することにより、エミュレート後のプログラムの動作タイミングを調節していた。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
従来のエミュレータのうち、最も単純なものは、一つ々の命令をシリアルに処理する。つまり、ひとつの命令が完了するまで、後ろの命令は実行しない。しかし、最近のプロセッサ、例えばＲＩＳＣ（Reduced Instruction Set Computer）  ＣＰＵは、インストラクションをパイプラインで処理している。パイプラインの場合、各段階の動作サイクル数は一定ではなく、前後の状態に左右される。少なくともキャッシュヒットしない限り、一般命令が１サイクルで完了することはない。
そのため、パイプライン動作するプロセッサを有するコンピュータをエミュレートしたときに、エミュレート後のプログラムの動作タイミングの調節が非常に難しいという問題があった。
【０００４】
本発明の主たる課題は、インストラクションをパイプラインで処理するプロセッサを有するコンピュータをエミュレートした後のプログラムの動作タイミングの調節を容易にする、エミュレーション方法を提供することにある。
本発明の他の課題は、エミュレーション方法を好適に実施することができるエミュレータ、コンピュータ組込型のデバイス、ならびに、このエミュレータをコンピュータ上で実行させるためのエミュレータ用プログラムを提供することにある。
【課題を解決するための手段】
【０００５】
本発明のエミュレーション方法は、インストラクションをパイプラインにより実行するプロセッサの機能をエミュレートする方法であって、その前後が関連付けられた複数段の処理ブロックにより前記パイプラインを構成し、各処理ブロックを、前記プロセッサに対応するプロセッサオブジェクトが並列かつ独立に動作可能にする過程と、前記プロセッサオブジェクトが、前記インストラクションを前記複数段の処理ブロックに入力する過程と、前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち動作した処理ブロックが、動作する度に増加する動作サイクル数を保持する過程と、前記保持されている動作サイクル数の最大値を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力する過程とを含む方法である。
【０００６】
前記複数段の処理ブロックがアクセス可能なレジスタを設け、いずれかの処理ブロックが前記レジスタに自己の動作サイクル数を保持するとともに、既に保持されている動作サイクル数よりも多く動作した処理ブロックが、前記レジスタに保持されている動作サイクル数を自己の動作サイクル数に更新するようにしてもよい。
【０００７】
本発明のエミュレータは、インストラクションをパイプラインにより実行するプロセッサの動作をエミュレートするエミュレータであって、前記プロセッサに対応するプロセッサオブジェクトと、前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロックと、入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段とを備えており、前記プロセッサオブジェクトは、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力するものである。
【０００８】
ある実施の態様では、前記プロセッサオブジェクトは、前記インストラクションの最初のステップでは前記サイクル数保持手段に保持される動作サイクル数を初期値にセットするとともに、各段の処理ブロックが動作する度に、動作した処理ブロックの動作サイクル数が既に前記サイクル数保持手段に保持されている動作サイクル数よりも大きいかどうかを判定し、大きいときに前記サイクル数保持手段に保持されている動作サイクル数を更新可能にする。なお、前記複数段の処理ブロックは、動作サイクル数が前記インストラクションに関わらず固定となる処理ブロックを含むものであってもよい。
【０００９】
本発明の組込型のデバイスは、インストラクションをパイプラインにより実行するプロセッサの機能を前記プロセッサが搭載されたものと異なる装置においてエミュレートするためのデバイスであって、前記装置に組み込まれたときに当該装置のハードウエア資源との協働により、当該装置に、前記プロセッサに対応するプロセッサオブジェクトと、前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロックと、入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段とを形成し、前記プロセッサオブジェクトに、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力させるものである。
【００１０】
本発明のエミュレータ用プログラムは、コンピュータを、インストラクションをパイプラインにより実行するプロセッサの動作をエミュレートするエミュレータとして動作させるためのプログラムであって、前記コンピュータを、前記プロセッサに対応するプロセッサオブジェクト；前記パイプラインに対応してその前後が関連付けられ、前記プロセッサオブジェクトの制御に従ってそれぞれ並列かつ独立に動作可能な複数段の処理ブロック；入力された前記インストラクションのステップ毎に、前記複数段の処理ブロックのうち最も動作した処理ブロックの動作サイクル数を保持するサイクル数保持手段；として動作させ、前記プロセッサオブジェクトに、前記サイクル数保持手段に保持されている動作サイクル数を当該ステップにおける前記パイプラインの実行ステップサイクル数として出力させるプログラムである。
【発明の効果】
【００１１】
本発明によれば、複数段の処理ブロックによりパイプラインを構成し、各処理ブロックを、プロセッサに対応するプロセッサオブジェクトが並列かつ独立に動作可能にするとともに、入力されたインストラクションのステップ毎に、複数段の処理ブロックのうち動作した処理ブロックの動作サイクル数の最大値を特定し、その最大値を当該ステップにおけるパイプラインの実行ステップサイクル数として出力するようにしたので、前後の処理が関連するパイプラインによりインストラクションを実行するプロセッサであっても、エミュレート先においてその動作サイクル数を見積もることができるので、エミュレート先における動作サイクル数の同期が容易になる、という優れた効果がある。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施の形態例を説明する。まず、エミュレート対象となるコンピュータシステム（以下、「対象システム」について説明する。対象システムは、図１にその構成例が示されるように、システムＬＳＩ１０、すなわち、多数の機能を１つのチップ上に集積した超多機能ＬＳＩ（Large Scale Integration）と、ＲＡＭ（Random Access Memory）により構成されるシステムメモリ２０とを含んで構成されたものである。
【００１３】
システムＬＳＩ１０には、バスブリッジ１１を介してＧＰＵ（Graphics Processing Unit）３０が接続されている。また、バスブリッジ１２および外部バスＢ２を介して外部ペリフェラルＩＣ４０，５０等が接続される。２つのバスブリッジ１１，１２の間は、内部バスＢ１が接続されている。この内部バスＢ１には、ＣＰＵ１３、ＤＭＡ（ダイレクト・メモリ・アクセス）コントローラ１５、および複数の内部ペリフェラルブロック１６〜１９が接続されている。
【００１４】
この例では、ＣＰＵ１３は、ＭＩＰＳコア（ＭＩＰＳ社が設計したＣＰＵコア）であるものとする。ＭＩＰＳコアなので、ＣＰＵ１３は、ベクトル演算用のコプロセッサ１４を備えている。また、命令セットを簡略化することで高速処理を可能にするＲＩＳＣプロセッサである。ＤＭＡコントローラ１５は、ＣＰＵ１３からのＤＭＡを可能にするとともにバスアービタ（調停）の機能をも有するものである。システムメモリ２０は、このＤＭＡコントローラ１５に接続される。内部ペリフェラルブロック１６〜１９は、それぞれＣＰＵ１３と連携して特有のハードウェア機能を実行するものである。
【００１５】
ＣＰＵ１３とＤＭＡコントローラ１５は、それぞれバスマスタとして動作する。従って、内部バスＢ１のアクセス権を、ＣＰＵ１３とＤＭＡコントローラ１５とでとり合う。外部ペリフェラルＩＣ４０，５０は、外部バスＢ２およびバスブリッジ１２を介して内部バスＢ１に接続されると、システムメモリ２０のメモリマップ上に、それらの外部ペリフェラルＩＣ４０，５０についてのレジスタ群がマップされる。
【００１６】
ＣＰＵ１３が内部バスＢ１を介してシステムメモリ２０等のブロックにアクセスする場合、ＣＰＵ１３は、まず、バス・アービトレーションによって、バスアクセス権を取得しなければならない。ＣＰＵ１３によるバスアクセス権を取得するためのアクセスを「マスターアクセス」という。その際、内部バスＢ１が、ＤＭＡコントローラ１５によって使用されている最中であった場合、ＣＰＵ１３からのアクセスは待たされる。ＣＰＵ１３がアクセス権を取得すると、アクセス対象のブロックにアクセスが通知される。ＣＰＵ１３がアクセス権を取得した後のアクセスを「スレーブアクセス」という。このとき、アクセス対象となるブロックの状態に応じて、そのアクセスサイクル数が異なる。また、アクセス対象となるブロックが外部バスＢ２にある場合、バスブリッジ１２のレイテンシも必要になる。
【００１７】
以上のことから、ＣＰＵ１３の動作タイミング、例えばバスアクセスサイクル数は、内部バスＢ１のアクセス権取得までのサイクル数、バスアクセスを行うためのサイクル数、そして、アクセス対象となるブロックの応答サイクル数の３つの要素によって決定される。
【００１８】
［エミュレータの構成例］
次に、対象システムをエミュレートする本発明のエミュレータの構成例を説明する。
本発明のエミュレータは、エミュレータ用プログラムと、メモリを有するコンピュータないしコンピュータシステムとの協働により実現される。すなわち、エミュレートしようとするコンピュータ等（以下、「第２コンピュータ」という）のプロセッサがエミュレータ用プログラムを読み込んで実行することにより、あるいは、第２コンピュータに組込型デバイスが装着されることにより、当該第２コンピュータがエミュレータとして動作する。本発明のエミュレータは、また、組込型デバイスを第２コンピュータの内部バスあるいは外部バスに接続することにより、あるいは、第２コンピュータのプロセッサにつながる所定のスロットに装着することによっても実現が可能である。
【００１９】
エミュレータは、図１の対象システムのＣＰＵ１３およびバス接続構成を含むハードウエア資源並びにその動きを、それぞれ独自の役割を持ったオブジェクトの集合として表すことができる。図２は、このエミュレータのオブジェクト図である。図２において、矢線は継承関係、線分は関連関係、起点付線分は起点に所属する所有関係を表している。
【００２０】
図２のオブジェクト図を参照すると、ＣＰＵ１３に対応して形成されるＭＩＰＳオブジェクトは、他のオブジェクト間の関連接続のための接続端子として、Ｃｏｐ０，Ｃｏｐ２、Ｉ−ＢＵＳ、Ｄ−ＢＵＳおよびＩＮＳＴを有する。
【００２１】
Ｃｏｐ０は、ＭＩＰＳのシステムコプロセッサ（System Co-Processer）として設けられる。システムコプロセッサは、ＭＩＰＳコアと密接な関連があるため、ＭＩＰＳオブジェクト自身でその機能を担う。そのため、Ｃｏｐ０は、図２に示されるようにＭＩＰＳオブジェクト自体が接続される。対象システムでは、コプロセッサにベクトル演算ユニットが接続される。これをエミュレートするための接続端子が、もう一つのコプロセッサ（Co-Processer：Ｃｏｐ２）である。Ｃｏｐ２には、図１のコプロセッサ１４に相当するベクトル演算コプロセッサオブジェクトが接続される。
【００２２】
良く知られているように、ＭＩＰＳはハーバードアーキテクチャを採用している。そのため、対象システムでは、外部バスＢ２に、インストラクションバス（Ｉ−ＢＵＳ）とデータバス（Ｄ−ＢＵＳ）の２つのバス（Bus）が介在する。これをエミュレートするため、図２に示されるように、ＭＩＰＳオブジェクトには、Ｉ−ＢＵＳ接続端子およびＤ−ＢＵＳ接続端子が存在し、それぞれ、Ｉ−ＢＵＳ接続端子はＩ−ＢＵＳオブジェクト、Ｄ−ＢＵＳ接続端子はＤ−ＢＵＳオブジェクトに接続される。
【００２３】
ＭＩＰＳオブジェクトのＩＮＳＴ接続端子は、外部割込をエミュレートするために、外部の割込コントローラとのインタフェースを行うためのもので、INT Controllerオブジェクトに接続される。
【００２４】
Ｉ−ＢＵＳオブジェクトは、インストラクションバス（Ｉ−ＢＵＳ）のＭＭＵ(Memory Management Unit)をエミュレートするものである。Ｉ−ＢＵＳオブジェクトは、インストラクションバスからのアドレス変換（物理アドレス／論理アドレス変換）、および、インストラクションキャッシュ（図２のCache オブジェクト）のヒット・ミスヒットを判断する。Ｉ−ＢＵＳオブジェクトには、バスマスタ（BusMaster）としての機能をエミュレートするために、Master接続端子が存在し、ここにBusArbiterオブジェクトが接続される。
【００２５】
Ｄ−ＢＵＳオブジェクトは、データバス（Ｄ−ＢＵＳ）のＭＭＵをエミュレートするものであり、データバスからのアドレス変換（物理アドレス／論理アドレス変換）、および、４段のライトバッファを管理する。Ｄ−ＢＵＳオブジェクトには、バスマスタ（BusMaster）としての機能をエミュレートするために、Master接続端子が存在し、ここにBusArbiterオブジェクトが接続される。
【００２６】
BusArbiterオブジェクトは、Ｉ−ＢＵＳオブジェクトもしくはＤ−ＢＵＳオブジェクトからのバスアクセス要求があったときに、DMA_Controllerの状態に応じて、バスアクセス権を取得するまでのバスアクセスサイクル数を見積もる。そのため、ＤＭＡＣ接続端子を持ち、DMA_Controllerオブジェクトに接続される。
【００２７】
BusArbiterオブジェクトは、また、複数のPeripheralオブジェクトに接続するために、Slaves接続端子を持つ。このSlaves接続端子は、１対多接続のものである。BusArbiterオブジェクトは、各Peripheralオブジェクトを、例えばメモリマップにマッピングすることで管理する。例えばＩ−ＢＵＳオブジェクトもしくはＤ−ＢＵＳオブジェクトからバスアクセスがあると、このメモリマップに従って、適切なPeripheralオブジェクトを割り出し、バスアクセスを行う。
【００２８】
Peripheralオブジェクトのうち、本発明のエミュレータで特別な機能を担うのが、DMA_ControllerオブジェクトとINT Controllerオブジェクトである。
DMA_Controllerオブジェクトは、対象システムのＤＭＡコントローラのエミュレートを行うもので、現時点で起動中のＤＭＡの状態を監視している。そのため、バス・アービトレーションのサイクル数を見積もるために、BusArbiterオブジェクトからＤＭＡ状態取得のリクエストが来る。
【００２９】
INT Controllerオブジェクトは、割込を管理するオブジェクトである。より具体的には、各ペリフェラルブロックからの割込要求に応じてＭＩＰＳオブジェクトへの割込フラグを管理する。このため、図２のPeripheralクラスから派生した各Peripheral#1〜#nオブジェクトは、割り込み要求のためのＩＮＴＣ接続端子を持ち、それぞれがINT Controllerオブジェクトに接続されている。また、INT Controllerオブジェクトは、ＭＩＰＳオブジェクトのＩＮＴＣ接続端子にも接続される。ＭＩＰＳオブジェクトは、割込受付タイミングが来ると、INT Controllerオブジェクトに対して割り込みフラグの状態取得を要求する。
【００３０】
［仮想動作サイクル数の見積もり］
次に、上記のように構成されるエミュレータにおいて、エミュレート後のバスアクセスサイクル数の見積もり方法について説明する。バスアクセスサイクル数とは、バスマスタ（BusMaster）が、バスアクセスを要求してからそのバスアクセスが完了するまでの動作サイクル数である。ここでは、インストラクションバス・リードアクセス、データバス・リードアクセス、データバス・ライトアクセスの３種類のアクセスが起きた場合の動作と、バス・レイテンシの見積もり方法を説明する。
【００３１】
＜インストラクションバス・リードアクセス＞
図３は、インストラクションバス・リードアクセスのシーケンス図である。上段はオブジェクト名を示している。図３を参照すると、ＭＩＰＳオブジェクトは、インストラクションリードアクセスをＩ−ＢＵＳオブジェクトに向けて発行する（ｉＲＡ１）。このときＩ−ＢＵＳオブジェクトへ送出される要求コマンドは「ReadBus()」である。Ｉ−ＢＵＳオブジェクトは、所定のアドレス変換を行った後、インストラクション要求、例えばデータ要求をBusArbiterオブジェクトに向けて送出する（ｉＲＡ２）。このときBusArbiterオブジェクトへ送出される要求コマンドは「ReadBus()」である。
【００３２】
BusArbiterオブジェクトは、アドレスマップ照合対象となるペリフェラルブロック（オブジェクト）へデータを要求する（ｉＲＡ３）。このとき、各ペリフェラルブロック＃１〜＃ｎへ送出される要求コマンドは「ReadBus()」である。該当するペリフェラルブロックは、要求された番地の読出データおよび読み出しにかかったアクセスサイクル数のデータ（ＡＳ１１）を要求元であるBusArbiterオブジェクトに返す（ｉＲＡ４）。
BusArbiterオブジェクトは、また、DMA_ControllerオブジェクトにＤＭＡの状態を表すデータを要求する（ｉＲＡ５）。このときDMA_Controllerオブジェクトへ送出される要求コマンドは「GetDMAStatus()」である。DMA_Controllerオブジェクトは、ＤＭＡの状態を表すＤＭＡステータス（ＳＴ１１）をBusArbiterオブジェクトへ返す（ｉＲＡ５）。これにより、BusArbiterオブジェクトは、現在のＤＭＡの状態を把握することができる（ｉＲＡ６）。そこで、BusArbiterオブジェクトは、ＤＭＡの状態からアービトレーションのサイクル数を決定し、これを読み出しにかかったアクセスサイクル数に上乗せし、読出データおよび上乗せ後のアクセスサイクル数のデータ（ＡＳ１２）をＩ−ＢＵＳオブジェクトへ送出する（ｉＲＡ７）。
【００３３】
Ｉ−ＢＵＳオブジェクトは、キャッシュ判定を行い、ＭＩＰＳオブジェクトに返すアクセスサイクル数の算定を開始する（ｉＲＡ８）。このとき、ミスキャッシュであれば読出データと共に得たサイクル数、ヒットであれば１サイクルを、それぞれＭＩＰＳオブジェクトに返すアクセスサイクル数として決定する。そして、読出データおよび決定したアクセスサイクル数のデータ（ＡＳ１３）をＭＩＰＳオブジェクトへ送出する（ｉＲＡ９）。  これにより、ＭＩＰＳオブジェクトは、現在のＤＭＡの状態およびキャッシュの状態を反映した正確なバスアクセスサイクル数を得るので、自己の仮想動作サイクル数をそれに合わせて調整することができる。
【００３４】
＜データバス・リードアクセス＞
図４は、データバス・リードアクセスのシーケンス図である。上段はオブジェクト名を示している。図４を参照すると、ＭＩＰＳオブジェクトは、データリードアクセスをＤ−ＢＵＳオブジェクトに向けて発行する（ｄＲＡ１）。このときＤ−ＢＵＳオブジェクトへ送出される要求コマンドは「ReadBus()」である。Ｄ−ＢＵＳオブジェクトは、所定のアドレス変換を行った後、データ読出要求をBusArbiterオブジェクトに向けて送出する（ｄＲＡ２）。このときBusArbiterオブジェクトへ送出される要求コマンドは「ReadBus()」である。
【００３５】
BusArbiterオブジェクトは、アドレスマップ照合対象となるペリフェラルブロック（オブジェクト）へデータを要求する（ｄＲＡ３）。このとき、各ペリフェラルブロック＃１〜＃ｎへ送出される要求コマンドは「ReadBus()」である。該当するペリフェラルブロックは、要求された番地の読出データおよび読み出しにかかったアクセスサイクル数のデータ（ＡＳ２１）を要求元であるBusArbiterオブジェクトに返す（ｄＲＡ４）。BusArbiterオブジェクトは、また、DMA_ControllerオブジェクトにＤＭＡの状態を表すデータを要求する（ｄＲＡ５）。このときDMA_Controllerオブジェクトへ送出される要求コマンドは「GetDMAStatus()」である。DMA_Controllerオブジェクトは、ＤＭＡの状態を表すＤＭＡステータス（ＳＴ２１）をBusArbiterオブジェクトへ返す（ｄＲＡ５）。BusArbiterオブジェクトは、ＤＭＡの状態からアービトレーションのサイクル数を決定し、これを読み出しにかかったアクセスサイクル数に上乗せし、読出データおよび上乗せ後のアクセスサイクル数のデータ（ＡＳ２２）をＤ−ＢＵＳオブジェクトへ送出する（ｄＲＡ６）。
【００３６】
Ｄ−ＢＵＳオブジェクトは、読出データおよび上乗せ後のアクセスサイクル数のデータ（ＡＳ２２）をそのまま（ＡＳ２３）ＭＩＰＳオブジェクトへ送出する（ｄＲＡ７）。これにより、ＭＩＰＳオブジェクトは、現在のＤＭＡの状態およびキャッシュの状態を反映した正確なバスアクセスサイクル数を把握することができる。
なお、データバス・リードアクセスにおいても、インストラクションバス・リードアクセスと同様、キャッシュ管理機能を考慮してアクセスサイクル数を上乗せするようにしてもよい。
【００３７】
＜データバス・ライトアクセス＞
図５は、データバス・ライトアクセスのシーケンス図である。上段はオブジェクト名を示している。図５を参照すると、ＭＩＰＳオブジェクトは、データライトアクセスをＤ−ＢＵＳオブジェクトに向けて発行する（ｄＷＡ１）。このときＤ−ＢＵＳオブジェクトへ送出される要求コマンドは「WriteBus()」である。Ｄ−ＢＵＳオブジェクトは、所定のアドレス変換を行った後、データ書込要求をBusArbiterオブジェクトに向けて送出する（ｄＷＡ２）。このときBusArbiterオブジェクトへ送出される要求コマンドは「WriteBus()」である。
【００３８】
BusArbiterオブジェクトは、アドレスマップ照合対象となるペリフェラルブロック（オブジェクト）へデータ書込を要求する（ｄＷＡ３）。このとき、各ペリフェラルブロック＃１〜＃ｎへ送出される要求コマンドは「WriteBus()」である。該当するペリフェラルブロックは、要求された番地のデータ書込およびアクセスにかかったアクセスサイクル数のデータ（ＡＳ３１）を要求元であるBusArbiterオブジェクトに返す（ｄＷＡ４）。BusArbiterオブジェクトは、また、DMA_ControllerオブジェクトにＤＭＡの状態を表すデータを要求する（ｄＷＡ５）。このときDMA_Controllerオブジェクトへ送出される要求コマンドは「GetDMAStatus()」である。DMA_Controllerオブジェクトは、ＤＭＡの状態を表すＤＭＡステータス（ＳＴ３１）をBusArbiterオブジェクトへ返す（ｄＷＡ５）。BusArbiterオブジェクトは、ＤＭＡの状態からアービトレーションのサイクル数を決定し、これを書き込みにかかったアクセスサイクル数に上乗せし、上乗せ後のアクセスサイクル数のデータ（ＡＳ３２）をＤ−ＢＵＳオブジェクトへ送出する（ｄＷＡ６）。
【００３９】
Ｄ−ＢＵＳオブジェクトは、WriteBufferに空きがあれば、サイクル数を１とし、そうでない場合に返ってきたサイクル数のデータ（ＡＳ３３）をＭＩＰＳオブジェクトへ送出する（ｄＷＡ７）。これにより、ＭＩＰＳオブジェクトは、現在のＤＭＡの状態およびWriteBufferの状態を反映した正確なバスアクセスサイクル数を見積もることができる。
【００４０】
このように、本実施形態のエミュレータでは、対象システムが有する複数のハードウエア資源の機能を実現するために、対象システムのＣＰＵ１３に対応して形成されるＭＩＰＳオブジェクト、対象システムのペリフェラルに対応して形成されるペリフェラルオブジェクト、内部バスＢ１および外部バスＢ２に対応して形成されるＩ−ＢＵＳバスオブジェクトおよびＤ−ＢＵＳオブジェクト、ＤＭＡコントローラ１５に対応して形成されるDMA_contrllerオブジェクトを備えるようにし、さらに、バスアクセス調停機能を有するBusArbterオブジェクトとキャッシュ管理を行うオブジェクトとを備えるようにしたので、エミュレート後のコンピュータにおいて、対象システムで動くプログラムを動作させたときの仮想動作サイクル数を正確に見積もることができる。そのため、エミュレート後のＭＩＰＳの仮想動作タイミングを容易に制御することができる。
また、バスアクセスにかかるサイクル数の要因ごとにブロックを分割し、それぞれのブロックでかかるサイクル数の総和として、そのバスアクセスサイクル数を見積もるようにしたので、見積もり精度が高まるという効果がある。
【００４１】
［パイプラインを考慮した動作タイミングの見積もり］
ＭＩＰＳのようなＲＩＳＣプロセッサでは、動作の並列性を高め、見かけ上のインストラクションの実行サイクル数を減らすために、上述したハーバードアーキテクチャのほか、パイプラインをも採用している。パイプラインは、インストラクション動作を適当な段数のフェーズに分け、それぞれフェーズを並列に動作させることで、インストラクションの動作を高速にするものである。ＭＩＰＳコアの動作をエミュレートするにあたり、このパイプラインの動作をも考慮することで、より確度の高いインストラクション実行の動作サイクル数を見積もり、それを外部に出力することが可能となる。
そこで、ここでは、ＭＩＰＳオブジェクトのパイプラインをエミュレートし、Ｉ−ＢＵＳ、Ｄ−ＢＵＳそれぞれのアクセスを独立させ、インストラクションの動作クロック数をより正確に見積もる場合の動作例を説明する。
【００４２】
パイプラインの一般的な動作フェーズは、Ｆ（fetch）フェーズ、Ｄ（Decode）フェーズ、Ｅ（Execute）フェーズ、Ｍ（MemoryAccess）フェーズ、Ｗ（WriteBack）フェーズの５段フェーズである。このうち、Ｆフェーズと、Ｍフェーズを独立のバスにしたものが、上述したハーバードアーキテクチャとなる。
これらのフェーズはそれぞれ並行に動作するが、前後が関連付けられる。そのため、独走することができない。歩調を合わせる必要がある。つまり、それぞれのフェーズでかかったサイクル数のうち最大のものが、そのときにかかったサイクル数となる。この様子を図６に示す。
【００４３】
図６において、横軸は時間（ｔ）、縦軸は処理オーダである。処理オーダは、Ｆフェーズ、Ｄフェーズ、Ｅフェーズ、Ｍフェーズ、Ｗフェーズである。すべてのフェーズが並列に動作し、命令を順次流して実行する。図６の最下段の数値は、当該時点での動作サイクル数である。図６において、ｉ１０１で示される部分は、命令＃４でメモリアクセスが起き、アクセスサイクル数が１でなかった場合に、すべてのフェーズがアクセス完了まで待たされる様子を示している。
また、図６において、ｉ１０２は、命令＃９のインストラクションフェッチが遅れたために、すべてのフェーズがフェッチ完了まで待たされる様子を示している。同じくｉ１０３は、命令＃９の実行が２サイクル必要となるため、他のフェーズが実行完了まで待たされる様子を示している。
【００４４】
５段フェーズのうち、ＤフェーズとＷフェーズは、１サイクル固定の時間しかかからない。従って、図１のＣＰＵ１３に対応するＭＩＰＳオブジェクトの実行サイクル数を決定付けるのは、Ｆフェーズにかかったサイクル数（Ｉバスアクセスレイテンシ）、Ｅフェーズにかかったサイクル数（通常の命令は１サイクルであるが、まれに数サイクルかかる場合がある）、Ｍフェーズにかかったサイクル数（Ｄバスアクセスレイテンシ）の３つの要素である。
つまり、パイプラインにおけるこれら３つの要素のサイクル数を独立に見積もり、それらのうちサイクル数の最大値をそのときの実行ステップサイクル数とすることで、より確度の高い動作サイクル数を見積もることが可能となる。
【００４５】
このパイプラインの動作を説明するために、上述したＭＩＰＳオブジェクトについて、詳しく説明する。図７は、このＭＩＰＳオブジェクトの内部構成例を示す図である。
ＭＩＰＳオブジェクト１００の内部には、ステップサイクル数保持用レジスタ１０１、ＭＩＰＳレジスタブロック１０２、Fetch処理ブロック１０３、Decode・Execute処理ブロック１０４、MemoryAccess処理ブロック１０５、WriteBack処理ブロック１０６および各処理ブロック１０３〜１０６の処理結果を動作時に一時的に保持するための３つのExecDataオブジェクト１１３，１１４，１１５が存在する。これらのブロック１０１〜１０６の動作は、図示しないＭＩＰＳオブジェクト１００の制御機構により制御される。
【００４６】
ステップサイクル数保持用レジスタ１０１は、ステップ実行開始時に０になり、各フェーズの処理ブロックが自己のフェーズにかかった処理サイクル数の更新要求によって、最大値を保持するためのレジスタ（変数）である。
ＭＩＰＳレジスタブロック１０２は、ＭＩＰＳのハードウエアレジスタをエミュレートするブロックである。ＭＩＰＳオブジェクトの「ＰＣ」、「Ｈｉ」、「Ｌｏｗ」および３２本の「ＧＰＲ（汎用レジスタ）」を持つ。「ＰＣ」はプログラムカウンタの値、「Ｈｉ」および「Ｌｏｗ」は固有の値である。
３つのExecDataオブジェクト１１３，１１４，１１５には、それぞれ「PC」、「Inst」、「Decode」、「TReg」、「Result」、「AccessType」のようなメンバが存在する。
「PC」は「Inst」を読み込んだときのアドレスである。「Inst」はインストラクションコードである。「Decode」はインストラクションの解析結果である。Load・Store命令、ターゲットレジスタのブロックは何か（ＭＩＰＳレジスタ又はコプロセッサレジスタ）、分岐命令か等の判別に用いられる。「TReg」には、Store命令の場合、書き込むデータが格納される。それ以外の場合は、ターゲットレジスタ番号が格納される。「Result」には、Load・Store命令の場合、アクセス対象アドレスが格納される。それ以外の場合は、演算結果データが格納される。「AccessType」には、Load・Store命令の場合、アクセスデータ長もしくはアクセス対象となるコプロセッサの番号が格納される。コプロセッサ命令の場合、アクセス対象となるコプロセッサの番号が格納される。それ以外の場合は、未使用となる。
【００４７】
Fetch処理ブロック１０３は、ＭＩＰＳレジスタブロック１０２の「PC」を参照し、その「PC」が示すアドレスのデータをＩ−ＢＵＳオブジェクトを利用して取得し、読み出したデータを「PC」の値と共にExecDataオブジェクト１１３の「PC」と「Inst」に格納する。この際、Ｉ−ＢＵＳブロックから得られるデータ読み出しサイクル数を用いて、ステップサイクル数保持用レジスタ１０１を更新する。
【００４８】
Decode・Execute処理ブロック１０４は、ExecDataオブジェクト１１４の「Inst」に格納されているインストラクションを参照し、どのようなインストラクションかを判別し、必要に応じてＭＩＰＳレジスタブロック１０２、各コプロセッサオブジェクト１２１のコプロレジスタを参照し、ExecDataオブジェクト１１４の「Decode」、「TReg」、「Result」および「AccessType」の値を更新する。その際、実行にかかったサイクル数を見積もり、ステップサイクル数保持用レジスタ１０１を更新する。
【００４９】
MemoryAccess処理ブロック１０５は、まず、ExecDataオブジェクト１１５の「Decode」を参照し、メモリアクセス命令かどうかを判別する。メモリアクセス命令でない場合、何もせずに終了する。メモリアクセス命令であった場合、「Decode」のLoad/Storeを判別する。また、「Result」に格納されているアクセス対象アドレスを参照し、Read・Writeアクセス要求をＤ−Ｂｕｓオブジェクトに発行する。Storeの場合、Writeされるデータは「TReg」に格納されている。Loadの場合、Writeしたデータは、「AccessType」と「TReg」を参照して格納先ブロックとレジスタ番号を識別し、指定のレジスタに格納される。この際、Ｄ−Ｂｕｓブロックから得られるデータ読み出しサイクル数を用いて、ステップサイクル数保持用レジスタ１０１を更新する。
【００５０】
WriteBack処理ブロック１０６は、ＭＩＰＳのディレイスロットを実現するために存在する。このブロックは、Decode・Execute処理ブロック１０４との間で、ExecDataオブジェクト１１４を共有しており、MemoryAccess処理ブロック１０５の実行後にメモリアクセス命令以外の実行結果をレジスタに更新することで、ＭＩＰＳのディレイスロットをエミュレートする。
このWriteBack処理ブロック１０６は、まず、ＭＩＰＳレジスタブロック１０２の「PC」のインクリメントを行う。次に、ExecDataオブジェクト１１４の「Decode」を参照し、メモリアクセス命令かどうかを判別する。メモリアクセス命令の場合、何も処理をせず、終了する。メモリアクセス命令でない場合、「AccessType」と「TReg」を参照し、どのブロックのどのレジスタを更新するかを判別する。そして、「Result」の値を対象レジスタに更新する。この処理は、ＭＩＰＳでは、必ず１サイクルで処理が完了するため、特にステップサイクル数保持用レジスタ１０１を更新する必要はない。
【００５１】
Fetch処理ブロック１０３による処理をＦ処理、Decode・Execute処理ブロック１０４による処理をＤ・Ｅ処理、MemoryAccess処理ブロック１０５による処理をＭ処理、WriteBack処理ブロック１０６による処理をＷ処理とすると、この実施形態のエミュレータによりＦ処理、Ｄ・Ｅ処理、Ｍ処理そしてＷ処理という順に実行することで、ステップサイクル数保持用レジスタ１０１のデータから、最終的にそのステップにかかったサイクル数を得ることが可能となる。
【００５２】
また、一つのステップの実行が完了した後、ExecDataオブジェクトと各フェーズとの対比を、図８のようにシフトさせることにより、順次、命令が実行されることになる。図８は、左側がシフト前、右側がシフト後のExecDataオブジェクトである。
【００５３】
なお、図７に示したＭＩＰＳオブジェクトでは、Ｄ・Ｅ処理のようにＤフェーズでの処理とＥフェーズでの処理を１つにするとともに、Ｗ処理専用のExecDataオブジェクトを設けていない。これは、以下の理由による。
＝第１の理由＝
パイプライン段数を考慮したものである。パイプラインは、その段数が深いと処理が重くなる。例えば、データハザードを回避するためのフォワーディングなども考慮しなければならなくなる。そのため、なるべく浅い段数で処理した方が得策である。ＭＩＰＳは、１段の遅延分岐と、１段のロード遅延とを取り入れている。遅延分岐とは、分岐がＴａｋｅｎ（分岐が成立）した場合であっても、分岐命令の次の命令は、分岐先の命令ではなく、分岐命令の後ろの命令が実行されるというものである。ＭＩＰＳでは、後ろの１つの命令が実行される（１段）。また、ロード遅延とは、ロード命令を実行した場合、ロード命令の次の命令では、ロードしてきた値を使用できないが、そのケアはソフトウエアに任せるというものである。この２つを取り入れることのメリットは、ハードウエアの実装がシンプルになり、動作周波数をあげることが可能というものである。
【００５４】
＝第２の理由＝
データハザードとフォワーディングを考慮したものである。
例えば以下のような２つの命令があったとする。
＄１＝＄２＋＄３  （命令１  ）  
＄４＝＄１＋＄１  （命令２  ）  
最初の条件として、＄１＝０、＄２＝１、＄３＝２となっていた場合、＄４には、結果として６が入らなければならない。ハードウエアでは、これらの命令が上述の５段のパイプラインを通るが、レジスタファイルに書き出されるのは、Ｗフェーズである。  
命令２がＤフェーズに入り、レジスタファイルにアクセスして＄１の値を読み出そうとしたとき、命令１はまだＥフェーズにあり、Ｗフェーズにない。そのため、レジスタファイルにある＄１は、まだ、０のままである。このまま処理を行うと、＄４には０が入る。つまり、この処理を正確に行うためには、命令１がＷフェーズに来るまで命令２はＤフェーズで待たなければならなくなる。この現象が、データハザードである。このデータハザードを避けるための技術がフォワーディングである。  
【００５５】
フォワーディングは、Ｄフェーズでの結果をＥフェーズに渡す箇所に、Ｅフェーズ内の演算器出力と、Ｍフェーズに入力されるラッチ、Ｗフェーズの入力をループバックさせる。このようにして、まだレジスタファイルに書かれていない最新のレジスタの値をＤフェーズで使用することができるようにする。このフォワーディングを実装することで、Ｄフェーズにある命令２は、Ｅフェーズにある命令３の結果（つまり、３）を＄１レジスタの値として持ってくることができる。そのため、何らかの待ち状態になることなく、つまりストールすることなく、＄４レジスタには、正しく６が格納される。  
エミュレータでパイプラインをエミュレートする際、ＤフェーズとＥフェーズとＷフェーズを分割、すなわちExecDataオブジェクトを分けて実行すると、同様の問題が発生し、それに対する処理を行う必要が出てくる。
つまり、エミュレータでは、ＥフェーズとＤフェーズとＷフェーズを一つの処理として行いたい。これによって、データハザードを考慮する必要がなくなる。
【００５６】
＝第３の理由＝
遅延分岐を考慮したものである。遅延分岐をエミュレートするためには、Ｆフェーズの次のフェーズで分岐の実行が行われればよい。分岐命令の実行は、ＰＣに分岐先のアドレスを書き込むことであり、Ｗフェーズで実行されるのがシンプルな実装となる。レジスタの値を書き換えるのは、Ｗフェーズのみというポリシーを維持できるためである。
第２の理由で示したように、ＤフェーズとＥフェーズとＷフェーズが一つになれば、Ｆフェーズの次のサイクルでＷフェーズが実行されるため、遅延分岐に関しては、第２の理由と利害が一致する。
【００５７】
＝第４の理由＝
ロード遅延を考慮したものである。ロード遅延は、ロード命令の次の命令でのロード対象レジスタのアクセスをハードウエアで保障しないというものである。つまり、ソフトウエアで保障しなければならない。仮に、ロード命令の次の命令に、ロード対象レジスタを参照するような命令がきた場合、ロード命令が実行される前の値が読み出される。このエミュレートは、Ｄフェーズ及びＥフェーズとＭフェーズとを分けることで、実装が可能である。ロード命令の次の命令でのロード対象レジスタの上書き命令を考慮したものである。
このような場合、命令の順序は守られなければならない。そのためには、ＷフェーズはＭフェーズの実行後に実行される必要がある。  
【００５８】
＝総括＝
ＭＩＰＳオブジェクトで行いたいのは、サイクル数の見積もりである。サイクル数を見積もる上で必要になるのがＦフェーズ、Ｅフェーズ、Ｍフェーズであることは、前述のとおりである。これらのフェーズは、それぞれが独立に動く必要がある。一方で、ＤフェーズとＷフェーズは、Ｅフェーズと同時に動くことが望ましい。更に、Ｗフェーズは、Ｍフェーズの後に実行されなければならない。そのため、ＤフェーズはＥフェーズと同時に実行させる。また、ＷフェーズはＭフェーズの実行後に実行させなければならないが、仮想ステップとしては、Ｅフェーズと同時に行う。これにより、ＤフェーズとＥフェーズは一つになり、Ｗフェーズ用のExecDataオブジェクトは、Ｄ／Ｅフェーズ共通に使用するという方式を採用したものである。以上の各理由から、本実施形態では、Ｄ／Ｅフェーズの処理を一つにまとめ、ＷフェーズのExecDataオブジェクトは、Ｄ／Ｅフェーズのものと共有することとした。
【実施例】
【００５９】
次に、本実施形態のエミュレータにおいて、パイプラインをエミュレートする場合の例を具体的に説明する。ここでは、便宜上、図９のような単純な計算例を、ＭＩＰＳ命令を用いて説明する。
【００６０】
各パイプラインフェーズのうち、Ｆフェーズでは、「PC」が示すアドレスから命令を読み出してくる。Ｄフェーズでは、読み出した命令を解釈し、次のフェーズで必要となる、元データを選択する。このＤフェーズのデコード結果は、この後ろのフェーズでも使用される。Ｅフェーズでは、Ｄフェーズで選択されたデータに対して、演算を行う。演算の種類等は、順次送られてくるＤフェーズの処理結果によって選択される。Ｍフェーズでは、演算結果に対して、メモリアクセスを行う。アクセスの種類およびアクセスを行うかどうかという情報は、順次送られてくるＤフェーズの処理結果によって選択される。メモリアクセスが行われない場合は、Ｅフェーズの結果がそのまま次に送られる。Ｗフェーズでは、最終結果をもとに、汎用レジスタファイルを更新する。更新対象のレジスタファイルは、順次送られてくるＤフェーズの処理結果によって選択される。Ｄフェーズの処理結果によっては、更新されずに終了する場合もある。なお、「PC」は、ジャンプ命令でない限り、＋１され、更新され続ける。
【００６１】
上記の５つのフェーズのうち、ＤフェーズとＭフェーズは、それぞれ１サイクル固定となる。そのため、ステップ実行サイクル数に影響するのは、Ｆフェーズ、ＥフェーズおよびＭフェーズの３つとなる。
命令の順番は、当然、ハードウエアと同様にしなければならないため、以下の４つのステップでパイプラインをエミュレートすることになる。
Fetch→Decode&Execute→Memory→WriteBackおよびPCの更新
【００６２】
このような前提のもと、図９に示したＭＩＰＳ命令をエミュレータで動作させた場合の動作サイクル数を見てみる。命令は、以下の４つとなる。
ＯＲＩ      ＄ｒ１，  ＄ｒ０，  ０ｘ３００
ＬＷ        ＄ｒ２，  ０（＄ｒ１）
ＡＤＤＩ    ＄ｒ１，  ＄ｒ１，  ４
ＬＷ        ＄ｒ３，  ０（＄ｒ１）
【００６３】
キャッシュのライン数を「４」とすると、上記の４つの命令のうち、最初の命令以外の３つの命令はキャッシュヒットする確率がかなり高い。但し、ＭＩＰＳでは、＄ｒ０の値は０固定という仕様になっている。
【００６４】
図１０（ａ）は、ステップサイクル数保持用レジスタ１０１、ＭＩＰＳレジスタブロック１０２、Ｆフェーズ用のExecDataオブジェクト１１３、Ｄ・Ｅ／Ｗフェーズ用のExecDataオブジェクト１１４、Ｍフェーズ用のExecDataオブジェクト１１５の構造例が示されている。ＭＩＰＳレジスタブロック１０２は、実際には図７左上に示したように、多くのレジスタブロックが存在するが、ここでは、必要な箇所だけを示してある。ステップサイクル数時用レジスタ１０１には、ステップ実行サイクル数が保持される。
【００６５】
ステップ実行の最初は、ＭＩＰＳレジスタブロック１０２の「PC」は０、ステップカウンタを「１」に初期化する。ステップカウンタの値「１」はステップサイクル数保持用レジスタ１０１に格納される。Ｆフェーズでは、これらのＰＣ値０，１を参照し、インストラクションコードを取得する。そして、Ｆ関連されているExecDataブロック１１３に格納する（図１０（ｂ））。
その後、バスアクセスにかかったサイクル数をステップ実行サイクル数とする（ここでは、仮に「５」であったとする）。その結果、ステップ実行サイクル数は「１」から「５」に更新される（図１１（ａ））。
Ｄフェーズでは、Ｄ・Ｅ／Ｗフェーズ用のExecDataオブジェクト１１４の「Inst」を読み込み、デコードする。現時点では「Inst」は空なので、無処理、実行サイクル数は「１」とする。ステップ実行サイクル数「５」と比較して小さいので、更新しない。
Ｍフェーズでは、Ｍフェーズ用のExecDataオブジェクト１１５の「Decode」を読み込み、メモリアクセスの有無を確認する。現時点では「Decord」は空なので無処理、実行サイクル数は「１」とする。ステップ実行サイクル数「５」と比較して小さいので、更新しない。Ｗフェーズでは、ＭＩＰＳレジスタブロック１０２の「PC」に「４」を加算し、結果を更新する（図１１（ｂ））。この処理では、メモリアクセス以外の命令かどうかをチェックする。現時点では「Inst」は空なので無処理となる。ここで、次のステップに進むために、各ExecDataオブジェクト１１３〜１１５の関連をシフトさせる。つまり、Ｆフェーズ用のExecDataオブジェクト１１３の内容がＤ・Ｅ／Ｗフェーズ用のExecDataオブジェクト１１４にシフトする（図１２（ａ））。
以上のエミュレート動作の結果、各フェーズでの実行サイクル数は、図２０（ａ）に示されるように、Ｆフェーズの処理に引っ張られ、動作サイクル数は「５」、つまりステップサイクル数保持レジスタ１０１に格納されている値となる。
【００６６】
次のステップでは、まず、Ｆフェーズにおいて、ＰＣ値「５」を参照し、インストラクションコードを取得する。そして、ExecDataブロック１１３に格納する（図１２（ｂ））。その後、バスアクセスにかかったサイクル数をステップサイクル数保持用レジスタ１０１に書き込む（キャッシュヒットとして「１」とする：図１３（ａ））。Ｄフェーズでは、ExecDataブロック１１４の「Inst」を読み込み、「ＯＲＩ  ＄ｒ１，＄ｒ０，０×３００」を解釈する。そして、「Decode」に通常命令という情報（normal）、「Treg」に更新対象レジスタである「１」、「Result」に＄ｒ０（＝０）、論理和「０×３００」の結果をそれぞれ格納する（図１３（ｂ））。ＯＲＩ命令は、１サイクルでDecordExecを終了するため、「１」としてカウンタ値「１」と比較する。この例の場合、カウンタ値以下なので無更新とする。Ｍフェーズでは無処理のため状態の変化はない。Ｗフェーズでは、まず、「PC」を更新する（図１４（ａ））。次いで、ExecDataブロック１１４から「Decord」を読み込み、メモリアクセスでないことを確認する。「Decord」が「normal」なので、「TReg」の値が示すレジスタを「Result」の値で更新する。つまり、ＭＩＰＳレジスタブロック１０２の＄ｒ１に「０×３００」を入れる（図１５（ｂ））。次のステップに進むために、各ExecDataオブジェクト１１３〜１１５の関連をシフトさせる（図１５（ａ））。
以上のエミュレート動作の結果、各フェーズでの実行サイクル数は、図２１（ｂ）に示されるように、すべてのフェーズの処理が「１」で完了したため、この場合のステップサイクル数保持レジスタ１０１に格納される値は「１」となる。
【００６７】
３番目のステップでは、まず、Ｆフェーズにおいて、ＰＣ値「８」を参照し、インストラクションコードを取得する。そして、ExecDataブロック１１３に格納する（図１５（ｂ））。バスアクセスサイクル数は、今回もキャッシュヒットとして「１」とし、カウンタ値を書き換える。Ｄフェーズでは、ExecDataブロック１１４から「Inst」を読み込み、ＬＷ  ＄２，０（＄ｒ１）を解釈する。そして「Decord」に「Load」、「TReg」に「２」、「Result」に０＋＄ｒ１で「０×３００」、「accessType」に「Word」をそれぞれ格納する（図１６（ａ））。ＬＷのＤフェーズの処理は１サイクルで完了するため、「１」としてカウント値と比較する。カウント値以下なので、無更新とする。Ｍフェーズでは、ExecDataブロック１１５の「Decord」を読み込む。「normal」なので、メモリアクセスなしと判断する。Ｗフェーズでは、「PC」を「１２」に更新した後、ExecDataブロック１１４の「Decord」を読み込む（図１６（ｂ））。「Load」なので、メモリアクセス命令と判断する。処理としては何も行わない。次のステップに進むために、各ExecDataオブジェクト１１３〜１１５の関連をシフトさせる（図１７（ａ））。
以上のエミュレート動作の結果、各フェーズでの実行サイクル数は、図２０（ｃ）に示されるように、すべてのフェーズの処理が「１」で完了したため、この場合のステップサイクル数保持レジスタ１０１に格納される値は「１」となる。
【００６８】
最後のステップでは、まず、Ｆフェーズにおいて、これまでと同様、「PC」と「Inst」を書き込む。バスアクセスは、再度キャッシュヒットとし、１サイクルとしてカウンタ値を「１」に更新する（図１７（ｂ））。Ｄフェーズでは、ExecDataブロック１１４から「Inst」を読み込み、「＄１＋４」を演算し、その結果を「Result」に格納する。「TReg」に「１」、「Decord」に「normal」を格納する。サイクル数は「１」である（図１８（ａ））。Ｍフェーズでは、ExecDataブロック１１５の「Decord」を読み込み、「Load」であることを確認する。そして、「Result」の示すアドレスに、「AccessType」が示すサイズ（Word＝４Byte）でバスアクセスを行う。そして、その結果を「TReg」が示すレジスタに書き出す。０×３００番地へのバスアクセスには５サイクルかかったとする。この場合、カウンタ値よりも大きいため、カウンタ値を「５」に更新する（図１８（ｂ））。Ｗフェーズでは、「PC」を「１６」に更新した後、ExecDataブロック１１４の「Decord」を読み込む。「normal」なので、「TReg」が示すレジスタに、「Result」の値を書き込む（図１９）。
以上のエミュレート動作の結果、各フェーズでの実行サイクル数は、図２０（ｄ）に示されるように、Ｍフェーズの処理に引っ張られ、動作サイクル数は「５」となる。
【００６９】
このように、ＭＩＰＳコアをエミュレートする場合、ＲＩＳＣプロセッサの持つパイプラインもエミュレートすることで、確度の高いサイクル数を算出することが可能になる。パイプラインをエミュレートするということは、つまり、命令の実行を１命令ごとにやるのではなく、パイプラインフェーズごとに処理を切って、順次実行するということであり、その際、各フェーズにかかった時間の大小関係から、一番大きいものを選択し、それがそのステップにかかった実行サイクル数とすることで、他のハードウエア資源との動作サイクル数の同期が確実になされるようになる。
なお、本実施形態および実施例では、オブジェクト指向ツールを用いてエミュレータを構成した場合の例を示したが、本発明は、必ずしもこのようなツールによってのみ実施されるものではない。例えば、ソフトウエアエミュレータとして実施する場合のほか、エミュレータの一部の機能をソフトウエアとし、残部をハードウエアにより構成することもできる。
【産業上の利用可能性】
【００７０】
本発明は、エンタテインメント装置、通信装置等、性能等が異なる他のコンピュータ用のプログラムを正しい動作タイミングで動作させる装置おいて広く利用が可能である。
【図面の簡単な説明】
【００７１】
【図１】エミュレート対象となる対象システムの構成図。
【図２】本発明のエミュレータのオブジェクト図。
【図３】インストラクションバス・リードアクセスのシーケンス図。
【図４】データバス・リードアクセスのシーケンス図。
【図５】データバス・ライトアクセスのシーケンス図。
【図６】パイプラインの動作が歩調を合わせる必要があることを示した図。
【図７】ＭＩＰＳオブジェクト（クラス）の内部構成例を示す図。
【図８】ExecDataオブジェクトとフェーズとの対比をシフトさせた図。
【図９】パイプラインをエミュレートする場合の命令の例を示した図。
【図１０】（ａ），（ｂ）は実際にエミュレートした場合の、ステップサイクル数保持用レジスタの値、ＭＩＰＳレジスタブロックに格納される値、ExecDataオブジェクトに格納されるデータ等の内容説明図。
【図１１】同上
【図１２】同上
【図１３】同上
【図１４】同上
【図１５】同上
【図１６】同上
【図１７】同上
【図１８】同上
【図１９】実際にエミュレートした場合の、ステップサイクル数保持用レジスタの値、ＭＩＰＳレジスタブロックに格納される値、ExecDataオブジェクトに格納されるデータ等の内容説明図。
【図２０】（ａ）は図９の命令をパイプライン動作するときの最初のステップの動作サイクル数、（ｂ）は２番目のステップの動作サイクル数、（ｃ）は３番目のステップの動作サイクル数、（ｄ）は最後のステップの動作サイクル数を示した図。
【符号の説明】
【００７２】
１０  システムＬＳＩ
１１  バスブリッジ
１２  バスブリッジ
１３  ＣＰＵ
１４  コプロセッサ
１５  ＤＭＡコントローラ
１６〜１９  内部ペリフェラルブロック
２０  システムメモリ
３０  ＧＰＵ
４０，５０外部ペリフェラルＩＣ
Ｂ１  内部バス
Ｂ２  外部バス
１００  ＭＩＰＳオブジェクト
１０１  ステップサイクル数保持用レジスタ
１０２  ＭＩＰＳレジスタブロック
１０３  Fetch処理ブロック
１０４  Decode・Execute処理ブロック
１０５  MemoryAccess処理ブロック
１０６  WriteBack処理ブロック
１１３，１１４，１１５  ExecDataオブジェクト
【図１】
2007048020.tif 000003
【図２】
2007048020.tif 000004
【図３】
2007048020.tif 000005
【図４】
2007048020.tif 000006
【図５】
2007048020.tif 000007
【図６】
2007048020.tif 000008
【図７】
2007048020.tif 000009
【図８】
2007048020.tif 000010
【図９】
2007048020.tif 000011
【図１０】
2007048020.tif 000012
【図１１】
2007048020.tif 000013
【図１２】
2007048020.tif 000014
【図１３】
2007048020.tif 000015
【図１４】
2007048020.tif 000016
【図１５】
2007048020.tif 000017
【図１６】
2007048020.tif 000018
【図１７】
2007048020.tif 000019
【図１８】
2007048020.tif 000020
【図１９】
2007048020.tif 000021
【図２０】
2007048020.tif 000022