(57)【要約】【課題】  高速にアプリケーションプログラムの動作と実行時間の検証を行うことが可能となるＩＳＳを生成する装置を提供する。【解決手段】  実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込み手段と、アプリケーションプログラムの中の命令の機能をホストＣＰＵでシミュレートする１以上の命令に変換する実行ステージ命令変換手段と、実行ステージ命令の前に、実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令を組み込むフェッチステージ命令生成手段と、実行ステージ命令とフェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力手段とを有し、実行ステージ変換手段またはフェッチステージ命令生成手段は、実ＣＰＵのクロックをシミュレートするカウンタ命令を出力する。【選択図】      図５
2006350686.tif 000002
【特許請求の範囲】
【請求項１】
実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する命令セット・シミュレータ生成装置であって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込み手段と、
前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換手段と、
前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を生成するフェッチステージ命令生成手段と、
前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力手段とを有し、
前記実行ステージ変換手段と前記フェッチステージ命令生成手段の少なくとも一方は、前記実ＣＰＵの実行時間をシミュレートするカウンタ命令を生成することを特徴とする命令セット・シミュレータ生成装置。
【請求項２】
請求項１に記載の命令セット・シミュレータ生成装置であって、
前記フェッチ命令生成手段は、前記実ＣＰＵのパイプラインステージにおけるフェッチステージの開始時間から実行ステージの開始時間までの間の時間に応じて前記フェッチステージ命令を実行するタイミングを決めることを特徴とする命令セット・シミュレータ生成装置。
【請求項３】
請求項１又は２に記載の命令セット・シミュレータ生成装置であって、
前記アプリケーションプログラムの命令を前記実行ステージ命令に対応づける命令変換情報を記憶する命令変換情報記憶手段を有し、
前記実行ステージ命令変換手段は、前記命令変換情報を参照して前記アプリケーションプログラムの中の命令から前記実行ステージ命令に変換することを特徴とする命令セット・シミュレータ生成装置。
【請求項４】
請求項３に記載の命令セット・シミュレータ生成装置であって、
前記命令変換情報は、前記実ＣＰＵにおける命令の実行サイクル数の情報を持ち、
前記実行ステージ命令変換手段は、前記実行サイクル数をカウントする前記カウンタ命令を生成することを特徴とする命令セット・シミュレータ生成装置。
【請求項５】
請求項４に記載の命令セット・シミュレータ生成装置であって、
前記フェッチステージ命令生成手段は、前記実ＣＰＵのパイプラインステージのフェッチサイクルをカウントする前記カウンタ命令を生成することを特徴とする命令セット・シミュレータ生成装置。
【請求項６】
請求項１〜５のいずれか一項に記載の命令セット・シミュレータ生成装置であって、
前記アプリケーションプログラムの開始アドレスと分岐時の呼出元アドレスと呼出先アドレスとを検索するアドレス検索手段と、
前記命令セット・シミュレータプログラムの中に、前記アプリケーションプログラムの前記開始アドレスと前記呼出元アドレスと前記呼出先アドレスとを特定するアドレス情報を設定するアドレス情報設定手段とを有することを特徴とする命令セット・シミュレータ生成装置。
【請求項７】
請求項６に記載の命令セット・シミュレータ生成装置であって、
前記呼出先アドレスを格納している特定場所を指定して呼出先アドレスを指定する間接アドレッシングを用いて前記呼出先アドレスが指定されているときに、前記アドレス検索手段は、分岐命令から後方方向に命令を検索して、前記特定場所の格納データから、呼出先アドレスを特定することを特徴とする命令セット・シミュレータ生成装置。
【請求項８】
請求項６又は７に記載の命令セット・シミュレータ生成装置であって、
前記アドレス検索手段は、前記アプリケーションプログラムを生成する際に出力される前記アドレス情報を使用して前記アプリケーションプログラムの前記開始アドレスと分岐時の前記呼出元アドレスと前記呼出先アドレスとを検索することを特徴とする命令セット・シミュレータ生成装置。
【請求項９】
請求項１〜８のいずれか一項に記載の命令セット・シミュレータ生成装置であって、
前記実行ステージ命令変換手段は、前記アプリケーションプログラムの中の命令で変更された前記ステータスレジスタのフラグが後の処理で不要であるか否かを判断し、不要であれば、当該フラグを変更する命令を生成しないことを特徴とする命令セット・シミュレータ生成装置。
【請求項１０】
請求項１〜９のいずれか一項に記載の命令セット・シミュレータ生成装置であって、
前記実行ステージ命令変換手段は、前記アプリケーションプログラムの中の連続した１以上の命令を、該命令より少ない命令数の同じ機能を持つ命令に置き換えることを特徴とする命令セット・シミュレータ生成装置。
【請求項１１】
請求項１〜１０のいずれか一項に記載の命令セット・シミュレータ生成装置であって、
前記実ＣＰＵのスタックの状態をシミュレートする命令と、前記実ＣＰＵのプログラムカウンタの値をシミュレートする命令との少なくとも一つを生成する手段をさらに有することを特徴とする命令セット・シミュレータ生成装置。
【請求項１２】
請求項１１に記載の命令セット・シミュレータ生成装置であって、
前記実ＣＰＵのステータスレジスタのフラグを出力する命令と、前記スタックの状態を出力する命令と、前記実ＣＰＵのプログラムカウンタの値を出力する命令との少なくとも一つを生成する手段をさらに有することを特徴とする命令セット・シミュレータ生成装置。
【請求項１３】
請求項１１又は１２に記載の命令セット・シミュレータ生成装置であって、
前記実ＣＰＵのステータスレジスタのフラグの状態を出力する命令と、前記実ＣＰＵのスタックの状態を出力する命令と、前記実ＣＰＵのプログラムカウンタの値を出力する命令とのうち生成させるべき命令を選択する選択手段を有することを特徴とする命令セット・シミュレータ生成装置。
【請求項１４】
実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する命令セット・シミュレータ生成方法であって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込みステップと、
前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換ステップと、
前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を生成するフェッチステージ命令生成ステップと、
前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力ステップとを有し、
前記実行ステージ変換ステップと前記フェッチステージ命令生成ステップの少なくとも一方は、前記実ＣＰＵの実行時間をシミュレートするカウンタ命令を生成することを特徴とする命令セット・シミュレータ生成方法。
【請求項１５】
コンピュータに、実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する機能を実現させる命令セット・シミュレータ生成プログラムであって、
コンピュータを、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込み手段と、
前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換手段と、
前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を組み込むフェッチステージ命令生成手段と、
前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力手段として機能させるためのプログラムであって、
前記実行ステージ変換手段または前記フェッチステージ命令生成手段は、前記実ＣＰＵのクロックをシミュレートするカウンタ命令を生成することを特徴とする命令セット・シミュレータ生成プログラム。
【請求項１６】
請求項１５に記載の命令セット・シミュレータ生成プログラムであって、
前記フェッチ命令生成手段は、前記実ＣＰＵのパイプラインステージにおけるフェッチステージの開始時間から実行ステージの開始時間までの間の時間に応じて前記フェッチステージ命令を実行するタイミングを決めることを特徴とする命令セット・シミュレータ生成プログラム。
【請求項１７】
請求項１５又は１６に記載の命令セット・シミュレータ生成プログラムであって、
コンピュータを、
前記アプリケーションプログラムの命令を前記実行ステージ命令に対応づける命令変換情報を記憶する命令変換情報記憶手段として機能させるためのプログラムであって、
前記実行ステージ命令変換手段は、前記命令変換情報を参照して前記アプリケーションプログラムの中の命令から前記実行ステージ命令に変換することを特徴とする命令セット・シミュレータ生成プログラム。
【請求項１８】
請求項１７に記載の命令セット・シミュレータ生成プログラムであって、
前記命令変換情報は、前記実ＣＰＵにおける命令の実行サイクル数の情報を持ち、
前記実行ステージ命令変換手段は、前記実行サイクル数をカウントする前記カウンタ命令を生成することを特徴とする命令セット・シミュレータ生成プログラム。
【請求項１９】
請求項１８に記載の命令セット・シミュレータ生成プログラムであって、
前記フェッチステージ命令生成手段は、前記実ＣＰＵのパイプラインステージのフェッチサイクルをカウントする前記カウンタ命令を生成することを特徴とする命令セット・シミュレータ生成プログラム。
【請求項２０】
請求項１５〜１９のいずれか一項に記載の命令セット・シミュレータ生成プログラムであって、
コンピュータを、
前記アプリケーションプログラムの開始アドレスと分岐時の呼出元アドレスと呼出先アドレスとを検索するアドレス検索手段と、
前記命令セット・シミュレータプログラムの中に、前記アプリケーションプログラムの前記開始アドレスと前記呼出元アドレスと前記呼出先アドレスを特定するアドレス情報を設定するアドレス情報設定手段として機能させるための命令セット・シミュレータ生成プログラム。
【請求項２１】
請求項１５〜２０のいずれか一項に記載の命令セット・シミュレータ生成プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項２２】
請求項１〜１３のいずれか一項に記載の命令セット・シミュレータ生成装置で生成した命令セット・シミュレータプログラムであって、
コンピュータに、
前記アプリケーションプログラムを前記実ＣＰＵで実行させたときのパイプラインステージのうちフェッチステージの実行タイミングをシミュレートする機能と、
前記アプリケーションプログラムを前記実ＣＰＵで実行させたときのパイプラインステージのうち実行ステージの機能をシミュレートする機能と、
前記アプリケーションプログラムの実ＣＰＵにおける実行サイクル数をシミュレートする機能とを実現するための命令セット・シミュレータプログラム。
【請求項２３】
実ＣＰＵとは異なるホストＣＰＵ上でアプリケーションプログラムの命令実行過程をシミュレーションする命令セット・シミュレータ・システムであって、
請求項１〜１３のいずれか一項に記載の命令セット・シミュレータ生成装置と、
当該命令セット・シミュレータ生成装置が生成した前記命令セット・シミュレータプログラムをコンパイルし、ホストＣＰＵで実行可能な命令セット・シミュレータ・実行プログラムを生成するコンパイル装置と、
当該命令セット・シミュレータ・実行プログラムを記憶した命令セット・シミュレータ装置とを有し、
当該命令セット・シミュレータは、ホストＣＰＵで当該命令セット・シミュレータ・実行プログラムを実行することを特徴とする命令セット・シミュレータ・システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサにおける動作をシミュレーションするプログラムを生成する装置、及び該プログラムの生成方法に関するものである。
【背景技術】
【０００２】
従来、組み込み機器用のアプリケーションプログラムを開発する場合は、開発対象であるターゲットとホストが異なった種類のＣＰＵからなるクロス開発環境において、ターゲットの機能やタイミングを検証するシミュレーション方法がよく用いられる。このような方法には、ターゲットを構成するＣＰＵ（以下、実ＣＰＵと略称する）と同等な処理を行う命令セット・シミュレータ（以下、ＩＳＳと略称する。）に、アプリケーションプログラムを読み込ませて処理を行う方法がある（例えば、特許文献１）。特許文献１には、アプリケーションプログラムの命令セットを読込み、この命令セットを実ＣＰＵのパイプラインステージに分解し、パイプラインステージごとに動作をシミュレートする方法が開示されている。
【０００３】
図１９は、ＩＳＳを用いて組み込み機器用のアプリケーションプログラムの開発をする方法を説明するための説明図である。まず最初に、ホストＣＰＵを搭載する汎用のコンピュータ上で動作する組み込みソフトウェア開発ツール９００を用いて、アプリケーションプログラムの実行ファイルが作成される。具体的には、アプリケーションプログラムのソースコード９３０を作成し、実ＣＰＵ用のクロスコンパイラ９２０でコンパイルして組み込み機器で実行可能なバイナリ形式の実行ファイル９１０を作成する。そして、ホストＣＰＵで実ＣＰＵの動作をシミュレートするＩＳＳ９５０を用いて動作の検証をする。ＩＳＳ９５０は、実行ファイル９１０を読込んで、メモリ９４０に格納する。そして、ＩＳＳ９５０は、１命令づつ命令を読み取り、実ＣＰＵのパイプラインのフェッチ９６０、デコード９７０、実行９８０のステージをシミュレートして、アプリケーションプログラムを動作させる。
【０００４】
【特許文献１】特開２００３−２１６６７８号公報（１３〜１４頁、図１１）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
特許文献１の方法では、ＩＳＳが、実行時にアプリケーションプログラムの命令を読み込み、命令を解析し、パイプラインステージに分解することが必要である。特に命令の解析、パイプラインステージへの分解は、非常に時間がかかる作業である。このため、ＩＳＳの実行速度が遅くなってしまい、アプリケーションプログラムの検証に時間がかかり、開発期間、開発費の増大を招いてしまうという課題であった。
【０００６】
本発明は、このような従来の問題点に着目してなされたもので、その目的は、高速にアプリケーションプログラムの動作と実行時間の検証を行うことが可能となるＩＳＳを生成する装置を提供することにある。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明では実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する命令セット・シミュレータ生成装置であって、前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込み手段と、前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換手段と、前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を生成するフェッチステージ命令生成手段と、前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力手段とを有し、前記実行ステージ変換手段と前記フェッチステージ命令生成手段の少なくとも一方は、前記実ＣＰＵの実行時間をシミュレートするカウンタ命令を生成することを要旨とする。
【０００８】
これによれば、命令セット・シミュレータ生成装置は、アプリケーションプログラムを読込み、アプリケーションプログラムと同じ機能を実行するホストＣＰＵの命令（実行ステージ命令）に変換する。また、実ＣＰＵのフェッチステージと同じタイミングで動作するフェッチステージ命令も生成される。そして、実行ステージ命令又はフェッチステージ命令には、実ＣＰＵのクロックをシミュレートすることができるカウンタ命令が備えられる。そのため、生成された命令セット・シミュレータプログラムは、実ＣＰＵのパイプラインで動作時間に与える影響の大きいフェッチステージと実行ステージをクロックを考慮してシミュレートできる。また、命令はホストＣＰＵが直接実行できる命令に変換されており、しかも実行時間の遅くなるデコードステージが省かれているので、高速に動作させることができる。
【０００９】
また、前記フェッチ命令生成手段は、前記実ＣＰＵのパイプラインステージにおけるフェッチステージの開始時間から実行ステージの開始時間までの間の時間に応じて前記フェッチステージ命令を実行するタイミングを決める。こうすれば、パイプラインの段数が多くなり実行ステージの前に２回以上フェッチステージが実行される場合でも、アプリケーションプログラムの実行時におけるフェッチステージの実行回数と実行時間を正確にシミュレートすることができる。
【００１０】
また、前記アプリケーションプログラムの命令を前記実行ステージ命令に対応づける命令変換情報を記憶する命令変換情報記憶手段を有し、前記実行ステージ命令変換手段は、前記命令変換情報を参照して前記アプリケーションプログラムの中の命令から前記実行ステージ命令に変換する。こうすれば、命令変換情報を変えるだけで他のＣＰＵへ簡単に対応することができる。
【００１１】
また、前記命令変換情報は、前記実ＣＰＵにおける命令の実行サイクル数の情報を持ち、前記実行ステージ命令変換手段は、前記実行サイクル数をカウントする前記カウンタ命令を生成する。こうすれば、他のＣＰＵへ対応する場合でも、命令変換情報を変えるだけで済み簡単に対応できる。また、命令変換情報の実行サイクル数を元にして実行ステージ単位に実行サイクル数をカウントできるので、アプリケーションプログラムの実行サイクル数をより正確に測定できる。
【００１２】
また、前記フェッチステージ命令生成手段は、前記実ＣＰＵのパイプラインステージのフェッチサイクルをカウントする前記カウンタ命令を生成する。こうすれば、フェッチサイクル単位にカウントできるので、フェッチサイクルと実行サイクルが平行して動作している場合でも、より正確に実行サイクル数を測定できる。
【００１３】
また、前記アプリケーションプログラムの開始アドレスと分岐時の呼出元アドレスと呼出先アドレスとを検索するアドレス検索手段と、前記命令セット・シミュレータプログラムの中に、前記アプリケーションプログラムの前記開始アドレスと前記呼出元アドレスと前記呼出先アドレスとを特定するアドレス情報を設定するアドレス情報設定手段とを有する。こうすれば、アプリケーションプログラムの開始アドレスと呼出先アドレスと呼出元アドレスが明確になる。この情報を命令セット・シミュレータ生成装置が生成する命令セット・シミュレータの中にラベルとして入れれば、命令セット・シミュレータの実行時に実行位置とアプリケーションプログラムの位置との対応が簡単に取れ、アプリケーションプログラムの検証が容易に出来るようになる。
【００１４】
また、前記呼出先アドレスを格納している特定場所を指定して呼出先アドレスを指定する間接アドレッシングを用いて前記呼出先アドレスが指定されているときに、前記アドレス検索手段は、分岐命令から後方方向に命令を検索して、前記特定場所の格納データから、呼出先アドレスを特定する。こうすれば、アプリケーションプログラムが間接アドレッシングを使用しているときでも、呼出先を明確にすることができる。
【００１５】
また、前記アドレス検索手段は、前記アプリケーションプログラムを生成する際に出力される前記アドレス情報を使用して前記アプリケーションプログラムの前記開始アドレスと分岐時の前記呼出元アドレスと前記呼出先アドレスとを検索する。通常、アプリケーションプログラムは、Ｃ言語などで記述されたソースプログラムをコンパイルすることで生成される。また、コンパイルしたときには、アプリケーションプログラムのアドレス、命令、呼出先のラベルの情報が格納されたファイルが出力される。このファイルを利用すれば、呼出先アドレスの特定がさらに容易になる。
【００１６】
また、前記実行ステージ命令変換手段は、前記アプリケーションプログラムの中の命令で変更された前記ステータスレジスタのフラグが後の処理で不要であるか否かを判断し、不要であれば、当該フラグを変更する命令を生成しない。こうすれば、アプリケーションプログラムの動作を変えることなく、不要なステータスレジスタのセットする命令を省くことができるので、命令セット・シミュレータの実行速度を上げることができる。
【００１７】
また、前記実行ステージ命令変換手段は、前記アプリケーションプログラムの中の連続した１以上の命令を、該命令より少ない命令数の同じ機能を持つ命令に置き換える。こうすれば、アプリケーションプログラムの機能を変えることなく、命令数を減らすことができる。その結果、命令セット・シミュレータプログラムの実行ステージ命令の数も減らすことができるので、命令セット・シミュレータプログラムをより高速に実行することができる。
【００１８】
また、前記実ＣＰＵのスタックの状態をシミュレートする命令と、前記実ＣＰＵのプログラムカウンタの値をシミュレートする命令との少なくとも一つを生成する手段をさらに有する。こうすれば、命令セット・シミュレータ実行時に実ＣＰＵのスタックの状態又はプログラムカウンタの値を知ることができるので、アプリケーションプログラムの検証がさらに容易になる。
【００１９】
また、前記実ＣＰＵのステータスレジスタのフラグを出力する命令と、前記スタックの状態を出力する命令と、前記実ＣＰＵのプログラムカウンタの値を出力する命令との少なくとも一つを生成する手段をさらに有する。こうすれば、命令セット・シミュレータの実行時に実ＣＰＵのステータスレジスタの内容、スタックの状態、プログラムカウンタの値をログとして出力することができるので、アプリケーションプログラムの実行時の状態の把握が早く簡単にできる。
【００２０】
また、前記実ＣＰＵのステータスレジスタのフラグの状態を出力する命令と、前記実ＣＰＵのスタックの状態を出力する命令と、前記実ＣＰＵのプログラムカウンタの値を出力する命令とのうち生成させるべき命令を選択する選択手段を有する。こうすれば、実ＣＰＵのステータスレジスタの内容、スタックの状態、プログラムカウンタの値のうち、必要のない情報の出力を止めることができるので、高速に命令セット・シミュレータを実行することができる。
【００２１】
また、本発明を命令セット・シミュレータ生成方法としても捉えることができる。すなわち、実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する命令セット・シミュレータ生成方法であって、前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込みステップと、前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換ステップと、前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を生成するフェッチステージ命令生成ステップと、前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力ステップとを有し、前記実行ステージ変換ステップと前記フェッチステージ命令生成ステップの少なくとも一方は、前記実ＣＰＵの実行時間をシミュレートするカウンタ命令を生成する。
【００２２】
この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２３】
また、本発明を命令セット・シミュレータ生成プログラムとしても捉えることができる。すなわち、コンピュータに、実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程をシミュレーションする命令セット・シミュレータプログラムを生成する機能を実現させる命令セット・シミュレータ生成プログラムであって、コンピュータを、前記実ＣＰＵ上で動作可能なアプリケーションプログラムを読込むアプリケーションプログラム読込み手段と、前記アプリケーションプログラムの中の命令の機能を前記ホストＣＰＵでシミュレートする１以上の命令（実行ステージ命令）に変換する実行ステージ命令変換手段と、前記実行ステージ命令の前に、前記実ＣＰＵのパイプラインステージのうち命令フェッチステージの動作タイミングをシミュレートする１以上の命令（フェッチステージ命令）を組み込むフェッチステージ命令生成手段と、前記実行ステージ命令と前記フェッチステージ命令に基づいて命令セット・シミュレータプログラムを生成するＩＳＳプログラム出力手段として機能させるためのプログラムであって、前記実行ステージ変換手段または前記フェッチステージ命令生成手段は、前記実ＣＰＵのクロックをシミュレートするカウンタ命令を生成する。
【００２４】
この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２５】
また、前記フェッチ命令生成手段は、前記実ＣＰＵのパイプラインステージにおけるフェッチステージの開始時間から実行ステージの開始時間までの間の時間に応じて前記フェッチステージ命令を実行するタイミングを決める。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２６】
また、コンピュータを、前記アプリケーションプログラムの命令を前記実行ステージ命令に対応づける命令変換情報を記憶する命令変換情報記憶手段として機能させるためのプログラムであって、前記実行ステージ命令変換手段は、前記命令変換情報を参照して前記アプリケーションプログラムの中の命令から前記実行ステージ命令に変換する。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２７】
また、前記命令変換情報は、前記実ＣＰＵにおける命令の実行サイクル数の情報を持ち、前記実行ステージ命令変換手段は、前記実行サイクル数をカウントする前記カウンタ命令を生成する。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２８】
また、前記フェッチステージ命令生成手段は、前記実ＣＰＵのパイプラインステージのフェッチサイクルをカウントする前記カウンタ命令を生成する。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００２９】
また、コンピュータを、前記アプリケーションプログラムの開始アドレスと分岐時の呼出元アドレスと呼出先アドレスとを検索するアドレス検索手段と、前記命令セット・シミュレータプログラムの中に、前記アプリケーションプログラムの前記開始アドレスと前記呼出元アドレスと前記呼出先アドレスを特定するアドレス情報を設定するアドレス情報設定手段として機能させる。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００３０】
また、本発明を命令セット・シミュレータ生成プログラムを記録したコンピュータ読み取り可能な記録媒体としても捉えることができる。この構成によれば、本発明の命令セット・シミュレータ生成装置と同等の効果が得られる。
【００３１】
また、本発明を命令セット・シミュレータプログラムとしても捉えることができる。すなわち、命令セット・シミュレータ生成装置で生成した命令セット・シミュレータプログラムであって、コンピュータに、前記アプリケーションプログラムを前記実ＣＰＵで実行させたときのパイプラインステージのうちフェッチステージの実行タイミングをシミュレートする機能と、前記アプリケーションプログラムを前記実ＣＰＵで実行させたときのパイプラインステージのうち実行ステージの機能をシミュレートする機能と、前記アプリケーションプログラムの実ＣＰＵにおける実行サイクル数をシミュレートする機能とを実現する。
【００３２】
これによれば、命令セット・シミュレータプログラムは、実ＣＰＵのパイプラインで動作時間に与える影響の大きいフェッチステージと実行ステージをクロックを考慮してシミュレートする。また、命令はホストＣＰＵが直接実行できる命令に変換されており、しかも実行時間の遅くなるデコードステージが省かれているので、高速に動作することができる。
【００３３】
また、本発明を命令セット・シミュレータ・システムとしても捉えることができる。すなわち、実ＣＰＵとは異なるホストＣＰＵ上でアプリケーションプログラムの命令実行過程をシミュレーションする命令セット・シミュレータ・システムであって、請求項１〜１３のいずれか一項に記載の命令セット・シミュレータ生成装置と、当該命令セット・シミュレータ生成装置が生成した前記命令セット・シミュレータプログラムをコンパイルし、ホストＣＰＵで実行可能な命令セット・シミュレータ・実行プログラムを生成するコンパイル装置と、当該命令セット・シミュレータ・実行プログラムを記憶し命令セット・シミュレータ装置とを有し、当該命令セット・シミュレータは、ホストＣＰＵで当該命令セット・シミュレータ・実行プログラムを実行する。
【００３４】
これによれば、命令セット・シミュレータ生成装置は、アプリケーションプログラムから早く命令セット・シミュレータプログラムを生成する。コンパイル装置は、この命令セット・シミュレータプログラムをコンパイルして、ホストＣＰＵで実行できる命令セット・シミュレータ・実行プログラムを生成する。そして、ホストＣＰＵを持つ命令セット・シミュレータ装置は、命令セット・シミュレータ・実行プログラムを記憶域に格納し実行することで、アプリケーションプログラムのシミュレーションを行う。また、命令セット・シミュレータ生成装置によって生成された命令セット・シミュレータプログラムは、実ＣＰＵのクロックを考慮して実ＣＰＵのパイプラインで動作時間に与える影響の大きいフェッチステージと実行ステージをシミュレートする。また、命令はホストＣＰＵが直接実行できる命令に変換されており、しかも実行時間の遅くなるデコードステージが省かれているので、高速に動作することができる。その結果、アプリケーションプログラムが出来てからシミュレーションが終わるまでの時間が早くなり、アプリケーション開発期間を短縮することができる。
【発明を実施するための最良の形態】
【００３５】
以下、本発明の実施の形態を説明する。図１は本発明の一実施形態としての命令セット・シミュレータ生成装置（以下、ＩＳＳ生成装置と略称する。）の概略構成を示す説明図である。このＩＳＳ生成装置は汎用のコンピュータであり、ＣＰＵ１１０、ＲＯＭ１２０、ＲＡＭ１３０、ハードディスク１４０、Ｉ／Ｆ１５０とから構成され、それらはバス１６０を介して互いに接続されている。Ｉ／Ｆ１５０には、ＩＳＳ生成装置に対する指示を行う入力装置としてのキーボード１８０、及びＩＳＳ生成装置の動作状況を表示する表示装置としてのディスプレイ１７０とが接続されている。その他、必要に応じてプログラム、データをコンピュータ１００に入力するためのネットワークなどの通信装置や記録装置を接続することもできる。
【００３６】
本実施形態では、実ＣＰＵ用のクロスコンパイラでコンパイルして作成されたアプリケーションプログラムのバイナリ形式の実行ファイルは、ＲＡＭ１３０又はハードディスク１４０に格納され、ＩＳＳ生成装置によって処理される。
【００３７】
ＣＰＵ１１０は、ＲＡＭ１３０又はハードディスク１４０に格納されたアプリケーションプログラムに対して所定の処理を実行し、アプリケーションプログラムを実ＣＰＵで動作させたときの動きをシミュレートするＩＳＳプログラムとして再びＲＡＭ１３０又はハードディスク１４０に格納する。
【００３８】
所定のＩＳＳ生成処理を記録したプログラムは、予めハードディスク１４０やＲＡＭ１３０に格納されていることとしてもよいし、例えばＣＤ−ＲＯＭなどのコンピュータが読み取り可能な記録媒体によって外部から供給され、図示しないＣＤ−Ｒ／ＲＷドライブを介してハードディスク１４０に記憶することによって格納されるものとしてもよい。もとより、インターネットなどのネットワーク手段を介して、プログラムを供給するサーバー等にアクセスし、データをダウンロードすることによってハードディスク１４０に格納されるものとしてもよい。
【００３９】
ＣＰＵ１１０は、バス１６０を介してハードディスク１４０またはＲＯＭ１２０に格納されたＩＳＳ生成プログラムを読み出し、この読み出したＩＳＳ生成プログラムを所定のオペレーティングシステムのもとで実行することによって、ＩＳＳ生成装置として機能する。特に図１の（Ｂ）に示したように、このＩＳＳ生成プログラムが実行されることにより、アプリケーションプログラム読み込み手段２００、実行ステージ命令変換手段２１０、フェッチステージ命令生成手段２２０、ＩＳＳプログラム出力手段２３０として機能する。
【００４０】
各部はそれぞれ以下の処理を司る。アプリケーションプログラム読み込み手段２００は、ＲＡＭ１３０又はハードディスク１４０に格納されているアプリケーションプログラムを読み込み、アプリケーションプログラムの開始アドレスとアドレスと命令との情報を取得し、ＲＡＭ１３０又はハードディスク１４０に格納する。
【００４１】
実行ステージ命令変換手段２１０は、最初に、アドレスと命令の情報を用いて、アプリケーションプログラムの中の分岐命令を調べ、呼出先にラベルを設定する。次に、アプリケーションプログラムの命令を、ホストＣＰＵで実行可能な命令（実行ステージ命令）に変換していく。実行ステージ命令には、実ＣＰＵと同じ機能を実現する命令のほかに、実ＣＰＵのレジスタ、ステータスレジスタ、スタック、プログラムカウンタ、実行時間とをシミュレートする命令が含まれる。
【００４２】
次に、フェッチステージ命令生成手段２２０は、実ＣＰＵのパイプラインのフェッチステージに相当する命令（フェッチステージ命令）を作成し、実行ステージ命令の前に挿入していく。また、ＩＳＳプログラム出力手段２３０は、こうして出来上がった実行ステージ命令とフェッチステージ命令とをもとにして、ホストＣＰＵでコンパイル可能なＣ言語のソースコードを出力する。このＣ言語のソースコードをホストＣＰＵのコンパイラでコンパイルして実行することで、アプリケーションプログラムの実ＣＰＵにおける動作を検証することができるＩＳＳを実行することができる。
【００４３】
実行ステージ命令とフェッチステージ命令を作成することで、実ＣＰＵのパイプラインのフェッチステージと実行ステージの動作タイミングと動作時間をシミュレートすることができる。
【００４４】
図２は４段のパイプラインを持つＣＰＵのパイプラインの動作を説明するための説明図である。４段のパイプラインでは、一つの命令は、フェッチ３００、デコード３１０、実行３２０、ライトバック３３０の４つのステージに分けて実行される。フェッチ３００はプログラム命令にアクセスして命令を読込む。デコード３１０は命令を解析し命令実行に必要な各種内部信号を生成する。実行３２０は命令で指定されている演算を実際に実行し、ライトバック３３０は演算の結果をメモリ又はレジスタに書き込む。図２からあきらかなように命令１、命令２、命令３は、パイプラインの１ステージ分づつずらして実行される。したがって、命令１、命令２、命令３の実行時間は、フェッチステージの実行時間×２  ＋  実行ステージの実行時間×３  ＋  ライトバックの実行時間  ×  １となる。ただし、ライトバックの実行時間を考慮しなければならないのは、アプリケーションプログラムの終了時だけであるので、本実施形態では、フェッチステージと実行ステージをシミュレートして、アプリケーションプログラムの動作タイミング、動作時間をシミュレートする。
【００４５】
図３は、３段のパイプラインを持つ実ＣＰＵを対象にした本実施形態のＩＳＳ生成装置が生成したＩＳＳにおけるフェッチステージと実行ステージの動作タイミングを示した図である。図３では、１番目に実行する命令のフェッチステージを［１］Ｆｅｔｃｈ、実行ステージを［１］Ｅｘｅｃと表現している。２番目の命令のフェッチステージは［２］Ｆｅｔｃｈ、実行ステージは［２］Ｅｘｅｃであり、Ｎ番目の命令のフェッチステージは［Ｎ］Ｆｅｔｃｈ、実行ステージは［Ｎ］Ｅｘｅｃとなる。また、命令の中でパイプラインの動きに大きな影響を与える分岐命令の実行ステージの例として、２番目の命令から４番目の命令にジャンプする命令をあげている。これは、［２］ｊｐ［４］で表してあり、２番目の命令の実行ステージであり、実行後４番目の命令に分岐することを意味している。
【００４６】
３段のパイプラインのフェッチステージは、実行ステージのひとつ前のサイクルに実行される。そのため、本実施形態のＩＳＳ生成装置が出力するＩＳＳプログラムにおける実行順は、図３（Ａ）に示したように［１］Ｆｅｔｃｈ、［２］Ｆｅｔｃｈ、［１］Ｅｘｅｃ、［３］Ｆｅｔｃｈ、［２］Ｅｘｅｃとなる。このときの実行時間は、実行ステージの実行時間の合計に最初の命令のフェッチステージの実行時間を足したものになる。
【００４７】
図３（Ｂ）は、２番目の命令が４番目の命令に分岐する命令になっている場合の動作を示している。この場合は、実行ステージ［２］ｊｐ［４］から［４］Ｆｅｔｃｈ、［５］Ｆｅｔｃｈ、［４］Ｅｘｅｃ、［６］Ｆｅｔｃｈと実行され、実行ステージ［３］Ｅｘｅｃは実施されない。この場合の実行時間は、実行ステージの合計の時間に［１］Ｆｅｔｃｈと［４］Ｆｅｔｃｈの時間を合計したものである。
【００４８】
図４は、４段のパイプラインを持つ実ＣＰＵを対象にした本実施形態におけるＩＳＳ生成装置の生成したＩＳＳにおけるフェッチステージと実行ステージの動作タイミングを示した図である。４段のパイプラインのフェッチステージは実行ステージの２サイクル前に実行される。そのため、アプリケーションプログラムの開始時と分岐命令の実行時にフェッチステージが２回連続して実行されることになる。
【００４９】
本実施形態で、これらのことを考慮して、フェッチステージと実行ステージの実行タイミングを再現できるようにフェッチステージ命令と実行ステージ命令の実行順を調整する。また、フェッチステージ命令と実行ステージ命令とでそれぞれカウンタを持ち、正確な実行時間をシミュレートできるようにする。具体的には、実行ステージ命令の中には、命令ごとに決まっている実行サイクル数をカウントする命令が入る。フェッチステージ命令には、フェッチステージ命令の実行サイクル数をカウントする命令と、前の実行ステージの命令が分岐命令だったときに次の実行ステージ命令を飛ばし呼出先の命令に対応するフェッチステージ命令を実行する処理を行う命令が入る。この結果、アプリケーションプログラムの実行サイクル数を正確に測定できるようになる。
【００５０】
図５は、本実施形態のＩＳＳ生成装置を使ったアプリケーションプログラムの命令セット・シミュレータ・システムを説明した図である。本実施形態の命令セット・シミュレータ・システムは、ＩＳＳ生成装置４００（命令セット・シミュレータ生成装置）、コンパイル装置４９０、命令セット・シミュレータ装置５３０とで構成される。ＩＳＳ生成装置４００、コンパイル装置４９０、命令セット・シミュレータ装置５３０は、いずれも汎用のコンピュータで構成される。また、命令セット・シミュレータ装置５３０には、命令セット・シミュレータプログラムを実行するためのホストＣＰＵが搭載される。
【００５１】
アプリケーションプログラムの開発では、まず最初に、アプリケーションプログラムはホストコンピュータ上で動作する組み込みソフトウェア開発ツール４４０を用いて開発される。実ＣＰＵ用のクロスコンパイラ４６０は、アプリケーションプログラムのソースコード４７０をコンパイルして実ＣＰＵで実行可能なバイナリ形式の実行ファイル（バイナリーコード４５０）を作成する。次にＩＳＳ生成装置４００の中のＩＳＳ生成４２０がバイナリーコード４５０を読込む。そして、ＩＳＳ生成４２０は、実ＣＰＵの命令とホストＣＰＵの命令の対応情報（命令変換情報）が格納されているテクノロジーファイル４１０を参照してバイナリーコード４５０をホストＣＰＵで動作可能なＩＳＳソースコード４８０に変換する。このとき、選択手段４３０によってＩＳＳ実行時に出力するログ出力情報の種類を選択する。選択手段は４３０は、ステータスレジスタの状態、スタックの状態、プログラムカウンタの値のいずれをログとして出力するかを利用者にキーボード１８０で指示させる。
【００５２】
次に、コンパイル装置４９０は、ホストＣＰＵ用のコンパイラを用いてＩＳＳソースコード４８０をコンパイルして、ホストコンピュータで実行可能なＩＳＳプログラムを生成する。そして、命令セット・シミュレータ装置５３０でＩＳＳプログラムを実行することで、実ＣＰＵにおけるパイプラインの動作をシミュレートできるのである。この結果、アプリケーションプログラムの作成、コンパイル、ＩＳＳ生成、ＩＳＳによる動作検証を高速に行うことができ、アプリケーションプログラムの開発期間を短縮し、開発費を削減することができる。
【００５３】
次に本実施形態のＩＳＳ生成装置について各部が行う処理を、図６の処理フローチャートにより説明する。図６に示した処理が開始されると、まずステップＳ１００にて、アプリケーションプログラムを読込み、アプリケーションプログラムの情報を命令データベースと呼出先情報に格納する処理を行う。命令データベースとは、図１２の（Ａ）に示した項目を格納する作業用のメモリであり、アプリケーションプログラムのすべての命令が格納される。呼出先情報は、図１２の（Ｃ）に示した項目を格納する作業用メモリであり、アプリケーションプログラムの開始アドレスと分岐時の呼出先アドレスが格納される。
【００５４】
ここでの処理について、図７のフローチャートを用いて詳しく説明する。図７に示した処理が開始されると、まずステップＳ２００にて、バイナリ形式のアプリケーションプログラムを読込み、個々の命令について実ＣＰＵ上のアドレスと命令とを命令データベースに格納する。次にステップＳ２１０にて、アプリケーションプログラムの開始アドレスであるベクタアドレスの情報を取得して呼出先情報に格納する。また、命令データベースには、開始アドレスのところにラベルがつけられる。このラベルは、アドレスをテキストで表現したもので、ＩＳＳ生成装置が出力するＣ言語のＩＳＳプログラムソースファイルに挿入されるものである。
【００５５】
次にステップＳ１１０（図６）にて、アドレス検索とアドレス情報設定処理が行われる。アプリケーションプログラムの開始アドレス、呼出先アドレス、呼出元アドレスを明確にして、開始アドレスから呼出元アドレス、又は呼出先アドレスから呼出元アドレスの単位で命令を見ていくと、アプリケーションプログラムの命令を実行順に、かつ途中に分岐がない状態で命令を解析していくことができる。また、ＩＳＳ生成装置はＣ言語のＩＳＳプログラムソースファイルを出力する。このＩＳＳプログラムソースファイルの中に開始アドレスと呼出先アドレスに対応するラベルをつけると、ＩＳＳの実行時にアプリケーションプログラムの中の位置との対応をつけやすくなり、動作の検証が容易になる。そこで、アドレス検索とアドレス情報設定処理は、命令データベースを調査して分岐命令を見つけ、呼出先アドレスと呼出元アドレスとを明確にし、それらの情報を格納する処理を行う。ここでの処理について、図８のフローチャートを用いて詳しく説明する。
【００５６】
アドレス検索とアドレス情報設定処理が開始されると、まずステップＳ３００にて、呼出先情報より、ベクタアドレスである起点をリストアップし、サーチＱＵＥに格納する。組み込み機器向けのアプリケーションプログラムの開始アドレスは、Ｒｅｓｅｔベクタなどベクタアドレスから始まる。したがって、ベクタアドレスから命令を検索していけばすべての命令について処理される順で命令を調査していけるのである。
【００５７】
次にステップＳ３１０にて、サーチＱＵＥの中にアドレスが存在するかどうか判定し、アドレスが存在しなければ、すべての命令に対する処理が終了したと判断し、アドレス検索とアドレス情報設定の処理を終了する。一方、アドレスが存在していればまだ処理が残っていると判断しステップＳ３２０に進む。
【００５８】
次にステップＳ３２０にて、サーチＱＵＥからアドレスを取り出し、解析アドレスとする。サーチＱＵＥの中から解析アドレスを取り出すことで、サーチＱＵＥの中からこの解析アドレスが削除されることになる。
【００５９】
ステップＳ３３０では、解析アドレスの指している命令が解析済みかどうか判定する。すでに解析されていれば、解析アドレスの後に続く命令も解析が終了していると判断し、ステップＳ３１０に進む。一方、解析済みでなければ、Ｓ３４０に進み解析アドレスから始まる命令の解析を始める。また、解析済みかどうかは、命令データベースの分岐点解析済みフラグの内容を見て判断する。分岐点解析済みフラグは、アプリケーションプログラムのすべての命令に対して、アドレス検索とアドレス情報設定処理がしてあるかを示すフラグである。ステップＳ３４０にて、解析アドレスの指している命令に分岐点解析済みフラグをセットする。
【００６０】
次にステップＳ３５０にて、解析アドレスの指している命令が、関数又は割り込み処理からのＲｅｔｕｒｎ命令であるかどうかを判定する。Ｒｅｔｕｒｎ命令であれば、この後に続く命令はないと判断し、ステップＳ３１０に進む。一方、Ｒｅｔｕｒｎ命令でない場合は、ステップＳ３６０に進み、命令が直接アドレッシングを使用した分岐命令であるかどうかを判定する。なお、本実施形態では分岐命令とは、ジャンプ命令、条件付ジャンプ命令、関数呼出し命令、関数からのＲｅｔｕｒｎ命令、割り込みからのＲｅｔｕｅｎ命令を意味する。分岐命令かどうかを判断するのは、ベクタアドレスから順に命令をたどっていくだけでは、到達できない命令を解析するために呼出先アドレスをサーチＱＵＥに追加するためである。ステップＳ３６０では、命令が直接アドレッシングを使用した分岐命令であれば、ステップＳ３７０に進む。一方、直接アドレッシングを使用した分岐命令でなければ、ステップＳ３８０に進む。
【００６１】
次に、ステップＳ３７０にて、直接アドレッシングで指定されている呼出先アドレスを命令から取り出す。そして、呼出先アドレスに対する処理をするためにステップＳ４００に進む。また、ステップＳ３８０では、命令が間接アドレッシングを使用した分岐命令であるかどうかを判定する。間接アドレッシングを使用した分岐命令でなければ、次の命令の解析をするために、ステップＳ４４０に進む。一方、間接アドレッシングを使用した分岐命令である場合は、ステップＳ３９０に進む。ステップＳ３９０では、解析済みアドレスから命令を後に検索して、分岐命令で指定されている呼出先アドレスを格納している命令を探し、呼出先アドレスを特定する。そして、ステップＳ４００にて、直接アドレッシングの呼出先アドレス又は間接アドレッシングの呼出先アドレスを呼出先情報と呼出元情報にセットする。また、呼出先アドレスに対応するラベルを命令データベースの中にセットする。このラベルは、呼出先アドレスをテキストで表現したものとなる。呼出先情報と呼出元情報は、図１２の（Ｂ）、（Ｃ）で示されているデータで、その後の解析で使用したり、ＩＳＳ生成装置が出力するＣソースにラベルをセットするのに使用される。Ｃソースにアプリケーションプログラムの呼出先と対応づけられたラベルがセットされているので、アプリケーションプログラムの開発者がＩＳＳを実際に動かし動作を検証するときにＩＳＳの実行位置とアプリケーションプログラムの中の位置との関係を容易につかむ事ができ開発の効率を上げることができる。
【００６２】
次に、ステップＳ４１０にて、命令が条件付分岐命令であるかどうかを判定する。条件付分岐命令であれば、ステップＳ４２０に進む。一方、条件付分岐命令でなければ、ステップＳ４３０に進む。条件付分岐命令の場合は、次に、条件付分岐命令の次の命令を解析し、呼出先はサーチＱＵＥに格納して後で解析することになる。条件付分岐命令でない場合は、次に解析する命令は呼出先の命令になる。
【００６３】
ステップＳ４２０では、条件付分岐命令の呼出先アドレスをサーチＱＵＥに格納する。そして、ステップＳ４４０にて、次の命令のアドレスを解析アドレスにセットして、ステップＳ３３０に戻り、次の命令の解析を続けるのである。また、ステップＳ４３０では、呼出先アドレスを解析アドレスとしてセットし、ステップＳ３３０に進み、呼出先アドレスの命令の解析をする。
【００６４】
アドレス検索とアドレス情報設定の処理が終わると、ステップＳ１２０（図６）にて、冗長コードの削除処理が行われる。ここでの処理について、図９のフローチャートを用いて詳しく説明する。冗長コードの削除処理は、アプリケーションプログラムの中の複数の命令を同じ機能を持つ少ない数のホストＣＰＵの命令に変換して、ＩＳＳで実行する命令数を減らして動作速度を上げるためのものである。例えば、図１５の冗長コードの例にあるように、Ｌｏａｄ命令とＯｒ命令の組み合わせは、１個のＬｏａｄ命令と同じ結果をもたらす。そこで、ホストＣＰＵでＩＳＳを動かすときは、Ｌｏａｄ命令とＯｒ命令を実行するのではなく、１個のＬｏａｄ命令だけを動かすようにする。また、プログラムカウンタと実行サイクル数がずれないようにするため、この１個のＬｏａｄ命令は、実行サイクル数及び命令長を実際のＬｏａｄ命令とＯｒ命令の合計の実行サイクル数及び命令長にする。このような処理を行うために、予め、命令データベースの中の命令を解析して冗長コードを探し、より短い冗長コードを解消した命令に置き換えていくのである。
【００６５】
冗長コードの削除処理が始まると、ステップＳ５００にて、すべてのラベルを調査済みかどうか判定する。冗長コードの削除処理では、アドレス検索とアドレス情報設定処理でセットしたラベルを起点にしてコードを調査する。こうすれば、命令を調査しているときに条件分岐の処理をしなくてもよく、解析が簡単になる。すべてのラベルの調査が終了していれば、すべての命令に対して削除処理を実施済みであると判断して、冗長コードの削除処理を終了する。一方、調査していないラベルが残っているときは、ステップＳ５１０に進む。
【００６６】
次に、ステップＳ５１０にて、命令データベースから調査していないラベルに冗長コード調査ポインタをセットする。そして、ステップＳ５２０にて、冗長コード調査ポインタから始まる命令が、冗長コードであるかどうかを調べる。この処理は、図１５の（Ａ）の冗長コードパターンと、冗長コード調査ポインタからはじめる命令とが一致するかどうか調べることで実施される。次に、ステップＳ５３０にて、冗長コードパターンと一致した命令があるならば、ステップＳ５４０に進む。一方、冗長コードパターンと一致する命令がない場合は、ステップＳ５８０に進む。
【００６７】
次に、ステップＳ５４０にて、冗長コードパターンと一致した命令に対応する命令データベースの冗長コードフラグをセットする。このとき、冗長コードフラグは、冗長コード調査ポインタが指している命令だけでなく。冗長コードパターンと一致している命令すべてにつけられる。ステップＳ５５０では、図１５の（Ａ）に示されている冗長コードパターンと冗長コード解消命令のデータから、冗長コードに対応する冗長コードを解消する命令を取り出し、命令データベースの冗長コード解消命令のところに登録する。ステップＳ５６０にて、冗長コードパターンと一致した命令の命令長の合計と実行サイクル数の合計を計算し、命令データベースに登録する。冗長コードパターンと一致した命令の命令長の合計と実行サイクル数の合計は、ホストＣＰＵ上で実行するＩＳＳで使用されることになる。そのため、ホストＣＰＵ上で実行するＩＳＳは命令数を少なくして実行速度を上げることが出来ると共に、プログラムカウンタに影響する命令長と実行サイクル数は元のアプリケーションプログラムと同じ値を出すことが可能になる。
【００６８】
次に、ステップＳ５７０にて、冗長コード調査ポインタを冗長コードパターンと一致した命令の次の命令を指すように変更する。また、冗長コードパターンと一致しなかった場合は、ステップＳ５８０にて、冗長コード調査ポインタが次の命令を指すように変更される。そして、ステップＳ５９０にて、冗長コードポインタが指している命令にラベルがつけられているかを判定し、ラベルがつけられている場合は、ステップＳ５００に進む。一方、ラベルがつけられていない場合は、ステップＳ５２０に進み、次の命令の調査をするのである。このようにして、すべての命令に対して、冗長コードの調査が進められる。
【００６９】
冗長コードの削除処理が終わると、ステップＳ１３０（図６）にて、実行ステージ命令変換処理が行われる。ここでの処理について、図１０のフローチャートを用いて詳しく説明する。
【００７０】
実行ステージ命令変換処理が開始されると、ステップＳ６００にて、すべての命令の変換が終了しているかを判定する。すべての命令の変換が終了していれば、実行ステージ命令変換処理を終了する。変換していない命令があれば、ステップＳ６１０に進む。次に、ステップＳ６１０にて、命令データベースから命令を一つ取り出す。そして、ステップＳ６２０で、取り出してある命令をキーにしてテクノロジーファイル（命令変換情報記憶手段）を検索して関数識別子を抽出する。
【００７１】
ここで、図１３を用いてテクノロジーファイルの内容について説明しておく。テクノロジーファイルは、実ＣＰＵの命令、ステータスレジスタの状態遷移、実行サイクル数とホストＣＰＵの命令とを対応付けるものである。図１３の左から、命令とオペランドの書式、命令のオペコードとオペランドのビットパターン、ホストＣＰＵの命令を識別する関数識別子、ホストＣＰＵの命令、実行サイクル数、ステータスレジスタの状態遷移が格納される。また、関数識別子には、別に定義されたホストＣＰＵの関数が割り当てられる。このホストＣＰＵの関数は、関数内でステータスレジスタのセットも実行する。また、図１３のｏｐｅｃｏｄｅがｐｏｐｎの行の関数に、ｒｅｐｅａｔ  ”ｍ＜−Ｗ［ｓｐ］，ｓｐ＜−ｓｐ＋４”  ｍ＝ｒ０  ｔｏ  ｒｄが定義されている。これは、スタックの状態をシミュレートする命令である。この命令を実行することでスタックの命令をシミュレートすることが出来る。
【００７２】
次に、ステップＳ６３０にて、検索した関数識別子を命令データベースに登録する。そして、ステップＳ６００に戻り、次の命令の変換をしていくのである。
【００７３】
実行ステージ命令の変換処理が終わると、ステップＳ１４０（図６）にて、ＩＳＳ  Ｃソースファイル出力処理が行われる。ここでの処理について、図１１のフローチャートを用いて詳しく説明する。
【００７４】
ＩＳＳ  Ｃソースファイル出力処理では、最初にステップＳ７００からステップＳ７５０までの処理で不要なステータスレジスタのセットを検出する。図１８は、不要なステータスレジスタのセットの例である。この例では、アドレスｃ００１０２からアドレスｃ００１０６にかけて、ａｄｄ、ｃｍｐ、ｊｒｅｑの命令が並んでいる。ｊｒｅｑ命令は、ステータスレジスタの中のＺフラグの値を見て、分岐するかどうかを判断する命令である。ステータスレジスタのＺフラグは、ａｄｄ命令、ｃｍｐ命令の２箇所でセットされているが、実際に使用されるのは、後でセットされるｃｍｐ命令でセットされたＺフラグである。したがって、ａｄｄ命令でＺフラグをセットしなくても動作には関係ないことになる。このように、同じフラグを２回続けてセットしている場合は、最初のセットは、動作にまったく関係のない不要なステータスレジスタのセットであるといえる。ホストＣＰＵで動作させるＩＳＳで、このような不要なフラグをセットするコードを削除すれば、ＩＳＳの動作を変えることなく実行速度を上げることが可能になる。
【００７５】
ステップＳ７００にて、アドレス検索とアドレス情報設定でセットされたラベルについて、調査が済んでいるか判定する。すべてのラベルの調査が済んでいる場合は、不要フラグのセットの処理が終了したと判断してステップＳ７６０に進む。一方、すべてのラベルの調査が終了していない場合は、ステップＳ７１０に進み、不要フラグの調査を継続する。
【００７６】
次に、ステップＳ７１０にて、命令データベースからラベルがついていて、かつ調査の済んでいない命令を一つ取り出し、命令Ａとする。次に、ステップＳ７２０にて、テクノロジーファイルを参照して命令Ａでセットされるフラグを調べる。そして、この命令Ａから後方に命令を調べていく。ステップＳ７３０にて、命令Ａでセットされるフラグを使う命令又は分岐命令に達する前に、このフラグを再びセットする命令を発見したときは、命令Ａに命令データベースの中のフラグ不要情報（図１２（Ａ））をセットする。フラグ不要情報には、命令Ａと、その後方の命令で再びセットされたフラグの種類が保存される。
【００７７】
次に、ステップＳ７４０にて、命令Ａの次の命令を取り出し新しい命令Ａとする。そして、ステップＳ７５０にて、新しい命令Ａにラベルが設定されているかどうかを判断し、ラベルがなければ、ステップＳ７２０に進み、新しい命令Ａに対して処理を続行する。一方、ラベルがついていれば、ステップＳ７００に進む。
【００７８】
このようにして、すべての命令に対して不要なステータスレジスタのセットの検出処理が終わると、ステップＳ７６０からＩＳＳのＣソースを出力する処理（ＩＳＳプログラム出力手段）が開始される。この処理の中で、Ｓ８００からＳ８２０でフェッチステージ命令を生成する処理（フェッチステージ命令生成手段）が実行されることになる。また、このフローチャートのうち、ステップＳ８３０、Ｓ８４０、Ｓ８７０、Ｓ８８０を実行することで、実行ステージ命令変換手段の処理が完了することになる。ＩＳＳのＣソースを出力する処理が開始されると、ステップＳ７６０にて、すべての命令データベースのラベルの処理が終わっているかどうかを判断する。すべてのラベルの処理が終わっていれば、ＩＳＳ  Ｃソースファイル出力の処理を終了して、ＩＳＳ生成装置での処理が終了する。一方、処理していないラベルが残っている場合は、ステップＳ７７０に進む。
【００７９】
次に、ステップＳ７７０にて、命令データベースからラベルがついていて、そのラベルの処理が終わっていない命令を一つ取り出す。次に、ステップＳ７８０にて、変数ＣＮに０をセットする。そして、ステップＳ７９０にて、命令データベースのラベルに対応するＣ言語のラベルを生成する。このラベルは、命令データベースのアドレスを含んだ文字列であり、Ｃ言語からＩＳＳを生成した際に元のアプリケーションプログラムのアドレスとの対応をとるためのものである。
【００８０】
次に、ステップＳ８００にて、フェッチステージ用の命令を取得してメモリ中にフェッチステージ命令を生成する。フェッチステージ用の命令は、予めＣ言語で用意してあるので、ここでの処理は用意してあるフェッチ命令のＣ言語のソースコードを取り出すだけになる。また、予め用意してあるフェッチステージ命令には、フェッチステージの実行サイクル数をカウントするカウンタ命令が組み込まれている。そのため、フェッチステージ命令とフェッチステージのカウンタ命令との生成は、予め用意してあるフェッチステージ命令を取得して適切な位置に組み込むことで実現できる。
【００８１】
ここで、生成したフェッチ命令のＣ言語のソースコードについて、図１４のフローチャートを用いて説明しておく。フェッチ命令が開始されると、Ｓ１０にて、フェッチサイクルをカウントしフェッチサイクルカウンタ１に格納するカウンタ命令が実行される。次に、ステップＳ２０にて、前回実行した命令が分岐命令かどうかを判定する。分岐命令である場合は、ステップＳ３０に進む。一方、分岐命令でない場合は、処理を終了する。ステップＳ３０では、実ＣＰＵのフェッチステージと実行ステージの間のパイプラインの段数分数のフェッチサイクルをフェッチステージカウンタ２に加算するカウンタ命令が実行される。これは、図３（Ｂ）、図４（Ｂ）において分岐命令が実行された直後にフェッチ命令が連続する場合をシミュレートする処理である。また、図１４のフローチャートをＣ言語のソースコードにしたものが、図１７の下に示されているフェッチステージ命令ライブラリｆｅｔｃｈ（）関数である。本実施形態では、ＩＳＳ生成装置は、このｆｅｔｃｈ（）関数を取得して適切な位置に組み込む。
【００８２】
次に、ステップＳ８１０にて、命令のアドレスがアプリケーションプログラムの先頭、すなわち、ベクタアドレスであるかどうかを判定する。アプリケーションプログラムの先頭である場合は、ステップＳ８２０に進む。一方、アプリケーションプログラムの先頭でない場合は、ステップＳ８３０に進む。ステップＳ８２０では、実ＣＰＵにおけるフェッチステージと実行ステージの間のパイプラインの段数分のカウンタ命令を含むフェッチステージ命令を生成する。この処理で、アプリケーションプログラムの先頭では、最初に実行されるフェッチステージと最初に実行される実行ステージとの間の時間が、実ＣＰＵのパイプラインにおけるフェッチステージと実行ステージの実行タイミングと一致する。これは、図３、図４において最初の実行ステージ［１］Ｅｘｅｃの前に実行されるフェッチステージをシミュレートする処理である。
【００８３】
次にステップＳ８３０にて、実ＣＰＵのプログラムカウンタの状態をシミュレートするために、プログラムカウンタＰＣに命令の命令長を加算する命令を作成する。ステップＳ８４０では、命令の実行サイクル数をＣＮに加算する。そして、ステップＳ８５０で、命令が分岐命令であるかどうか判定し分岐命令であるならば、ステップＳ８６０に進み、ＣＮとフェッチステージカウンタ２を実行サイクル数のカウンタに加算した後フェッチステージカウンタ２をクリアする命令を作成する。これで、実行サイクルカウンタには、ラベルの先頭から分岐命令までの間のフェッチステージを含めた実行サイクル数が格納され、実ＣＰＵの実行サイクル数をカウントする命令が作成される。一方、分岐命令でない場合は、ステップＳ８７０に進む。
【００８４】
次に、ステップＳ８７０にて、命令データベースから関数識別子フラグ不要フラグを取り出す。そして、ステップＳ８８０で、関数識別子とフラグ不要フラグに対応する命令を作成する。
【００８５】
ステップＳ８９０からステップＳ９４０までは、ステータスレジスタ、スタック、プログラムカウンタの状態をログ出力する命令を作成する。ステップＳ８９０、ステップＳ９１０、ステップＳ９３０は、ＩＳＳ生成装置の利用者がキーボード１８０で指示した内容を読み取る選択手段によって選択されたとおりに、ステータスレジスタ、スタック、プログラムカウンタとの状態を出力するかどうかを判断する。
【００８６】
ステップＳ８９０では、命令が分岐命令であり、選択手段でステータスレジスタの状態を出力するように指示されているかどうかを判断する。命令が分岐命令であり、ステータスレジスタの内容を出力するように指示されている場合は、ステップＳ９００に進み、ステータスレジスタの内容を出力する命令、すなわち、Ｃ言語のｐｒｉｎｔｆ命令を用いてステータスレジスタの内容をディスプレイ上に文字を表示する命令を作成する。一方、命令が分岐命令でないか、又はステータスレジスタの内容を出力するように指示されていない場合は、ステップＳ９１０に進む。
【００８７】
次に、ステップＳ９１０では、命令が分岐命令であり、選択手段でスタックの状態を出力するように指示されているかどうかを判断する。命令が分岐命令であり、スタックの内容を出力するように指示されている場合は、ステップＳ９２０に進み、スタックの内容を出力する命令、すなわち、Ｃ言語のｐｒｉｎｔｆ命令を用いてスタックポインタの値及びスタックの内容をディスプレイ上に文字を表示する命令を作成する。一方、命令が分岐命令でないか、又はスタックの内容を出力するように指示されていない場合は、ステップＳ９３０に進む。
【００８８】
次に、ステップＳ９３０では、命令が分岐命令であり、選択手段でプログラムカウンタＰＣの値を出力するように指示されているかどうかを判断する。命令が分岐命令であり、プログラムカウンタＰＣの値を出力するように指示されている場合は、ステップＳ９４０に進み、プログラムカウンタＰＣの値を出力する命令、すなわち、Ｃ言語のｐｒｉｎｔｆ命令を用いてプログラムカウンタＰＣの値をディスプレイ上に文字を表示する命令を作成する。一方、命令が分岐命令でないか、又はプログラムカウンタＰＣの値を出力するように指示されていない場合は、ステップＳ９５０に進む。
【００８９】
次に、ステップＳ９５０にて、作成してある命令をファイルに書き出す。そして、ステップＳ９６０で次の命令を取り出し、ステップＳ９７０でその命令にラベルかついているかどうかを判定し、ラベルがついていなければ、ステップＳ８００に進み、その命令のＣソースを作成していく。一方、ラベルがついている場合は、ステップＳ７６０に戻り、Ｃソースを出力していないラベルの処理を進める。このようにして、全ての命令の不要フラグの処理、フェッチ命令の生成、ログ出力の選択と生成、Ｃソースファイルの出力の処理がされる。
【００９０】
図１６は、実ＣＰＵ８００の内部構造を説明するための説明図である。メモリ８７０或いはＰｏｒｔＩ／Ｏ８８０は、バス８６０を介してレジスタ８１０に接続されることで、メモリ８７０或いはＰｏｒｔＩ／Ｏ８８０にデータを書き込んだり、データを読み込んだりする。また、メモリ８７０とＰｏｒｔＩ／Ｏ８８０は、実ＣＰＵの内部に組み込まれている場合と実ＣＰＵ８００の外部にある場合がある。そして、レジスタ８１０に格納されているデータは、演算回路８２０に送られ、演算回路８２０によって演算され、その結果が再びレジスタ８１０に格納される。プログラムカウンタＰＣ８３０は、実行している命令のアドレスを示し、スタックポインタＳＰ８４０はスタックのアドレスを示す。ステータスレジスタＰＳＲ８５０はゼロフラグなど演算の結果によって変わるフラグやＣＰＵの状態を示すデータが格納される。本実施形態のＩＳＳ生成装置が生成するＣソースは、実ＣＰＵ８００の内部をもシミュレートするため、レジスタ８１０、プログラムカウンタＰＣ８３０、ステータスレジスタＰＳＲ８５０に対応する変数を持つ。
【００９１】
ステータスレジスタＰＳＲ８５０及びスタックポインタＳＰ８４０はテクノロジーファイル内の関数識別子で指定されたホストＣＰＵの命令でシミュレートされる。また、プログラムカウンタＰＣ８３０は、ステップＳ８３０でプログラムカウンタＰＣ８３０をシミュレートする命令を生成する。
【００９２】
図１７は、本実施形態のＩＳＳ生成装置が生成したＣソースファイルの例である。生成されるＣソースには、呼出先には、実ＣＰＵのアドレスがわかるラベルがつけられ、アプリケーションプログラムの命令に対応したホストＣＰＵで動作するフェッチステージ命令（ｆｅｔｃｈ（））と実行ステージ命令が作成されている。このＣソースは命令の動作を再現し、かつ実行サイクル数も計算できるようになっている。
【００９３】
このように、本実施形態のＩＳＳ生成装置によれば、高速にアプリケーションプログラムの動作と実行時間の検証を行うことが可能となるＩＳＳを生成することが可能にある。また、テクノロジーファイルの内容及びフェッチステージ命令の組み込み位置を調整するだけで様々なＣＰＵに簡単に対応することができる。
【００９４】
以上、本発明の一実施形態を説明したが、本発明はこうした実施の形態に何ら限定されるものではなく、本発明の趣旨を逸脱しない範囲内において様々な形態で実施し得ることは勿論である。
【００９５】
（変形例１）一般的な組み込みソフトウェア開発ツールを使って、アプリケーションプログラムを生成すると、アプリケーションプログラムのアドレス、命令、呼出先ラベルとの情報が格納された中間ファイルが一緒に生成される。この中間ファイルと命令データベースを使用してアドレス検索とアドレス情報設定の処理を行うことができる。具体的には、図８のフローチャートで説明したアドレス検索とアドレス情報設定において、ステップＳ３７０で中間ファイルを参照して分岐命令と同じアドレスの命令を検索する。そこには、呼出先のラベルが書かれているので、そのラベルから呼出先アドレスを特定することができる。また、ステップＳ３９０では、中間ファイルを参照して分岐命令と同じアドレスの命令を検索する。そこから、中間ファイル内の命令をバックトレースすると、呼出先を格納している命令には、呼出先アドレスが使われているので、より正確に呼出先アドレスがわかる。
【００９６】
（変形例２）本実施形態では、分岐時にフェッチステージが連続する処理をフェッチステージ命令で行ったが、これを分岐命令の実行ステージ命令の最後にフェッチステージ命令と同じ処理を追加してもよい。こうすると、フェッチステージ命令内の条件分岐が不要になり、ホストＣＰＵで生成されたＩＳＳを動作させるときに実行される条件分岐が大幅に減り、より高速に動作させることができる。
【００９７】
（変形例３）本実施形態では、ステータスレジスタの状態、スタックの状態、プログラムカウンタの値をシミュレートし、ログとして出力する手段をもっているが、ステータスレジスタの状態とプログラムカウンタの値のみをシミュレートしてログとして出力しても良い。こうすれば、スタックの状態をシミュレートする命令を作成しなくても良くなり、ＩＳＳを生成する速度が速くなる。
【００９８】
（変形例４）ステータスレジスタの状態のみをシミュレートしてログとして出力しても良い。こうすれば、よりＩＳＳプログラムを生成する速度が速くなり、しかもＩＳＳプログラムの実行速度が速くなる。
【図面の簡単な説明】
【００９９】
【図１】本発明の一実施形態としての命令セット・シミュレータ生成装置の概略構成を示す説明図。
【図２】４段のパイプラインを持つＣＰＵのパイプラインの動作を説明するための説明図。
【図３】３段のパイプラインにおける動作タイミングを説明するための説明図。
【図４】４段のパイプラインにおける動作タイミングを説明するための説明図。
【図５】アプリケーションプログラムの開発の手順を説明するための説明図。
【図６】命令セット・シミュレータ生成装置全体の処理を説明するフローチャート。
【図７】アプリケーションの読み込み処理を説明するためのフローチャート。
【図８】アドレス検索とアドレス情報設定処理を説明するためのフローチャート。
【図９】冗長コードの削除処理を説明するためのフローチャート。
【図１０】実行命令変換処理を説明するためのフローチャート。
【図１１】ＩＳＳ  Ｃソース出力処理を説明するためのフローチャート。
【図１２】（Ａ）は、命令データベース、（Ｂ）は、呼出元情報、（Ｃ）は、呼出先情報を説明するための説明図。
【図１３】テクノロジーファイルを説明するための説明図。
【図１４】フェッチ命令の処理を説明するためのフローチャート。
【図１５】冗長コードパターン、冗長コード解消命令を説明するための説明図。
【図１６】実ＣＰＵの内部構造を説明するための説明図。
【図１７】命令セット・シミュレータ生成装置で生成したＣソースファイルの例。
【図１８】不要なフラグの削除の例。
【図１９】従来の命令セット・シミュレータの動作を説明するための説明図。
【符号の説明】
【０１００】
１００…コンピュータ、１１０…ＣＰＵ、１２０…ＲＯＭ、１３０…ＲＡＭ、１４０…ハードディスク、１５０…Ｉ／Ｆ、１６０…バス、１７０…ディスプレイ、１８０…キーボード、２００…アプリケーション読み込み手段、２２０…フェッチステージ命令生成手段、２１０…実行ステージ命令変換手段、２３０…ＩＳＳプログラム出力手段、３００…フェッチステージ、３１０…デコードステージ、３２０…実行ステージ、３３０…ライトバックステージ、４００…命令セット・シミュレータ生成装置、４１０…テクノロジーファイル、４２０…ＩＳＳ生成、４３０…選択手段、４４０…組み込みソフトウェア開発ツール、４５０…バイナリーコード、４６０…実ＣＰＵのクロスコンパイラ、４７０…アプリケーションプログラムのソースコード、４８０…ＩＳＳソースコード、４９０…ホストＣＰＵ用のコンパイラ、５００…フェッチステージ、５１０…デコードステージ、５２０…実行ステージ、５３０…命令セット・シミュレータ、８００…ＣＰＵ、８１０…レジスタ、８２０…演算回路、８３０…プログラムカウンタＰＣ、８４０…スタックポインタＳＰ、８５０…ステータスレジスタＰＳＲ、８６０…バス、８７０…メモリ、８８０…ＰｏｒｔＩ／Ｏ。
【図１】
2006350686.tif 000003
【図２】
2006350686.tif 000004
【図３】
2006350686.tif 000005
【図４】
2006350686.tif 000006
【図５】
2006350686.tif 000007
【図６】
2006350686.tif 000008
【図７】
2006350686.tif 000009
【図８】
2006350686.tif 000010
【図９】
2006350686.tif 000011
【図１０】
2006350686.tif 000012
【図１１】
2006350686.tif 000013
【図１２】
2006350686.tif 000014
【図１３】
2006350686.tif 000015
【図１４】
2006350686.tif 000016
【図１５】
2006350686.tif 000017
【図１６】
2006350686.tif 000018
【図１７】
2006350686.tif 000019
【図１８】
2006350686.tif 000020
【図１９】
2006350686.tif 000021