(57)【要約】【課題】ハードウェアとソフトウェアの協調動作のデバッグを効率的に行うこと。【解決手段】シミュレーション装置１００は、ソフトウェア１０１の実行中に、ハードウェアモデル１０２にアクセスする特定の関数が実行される場合、論理シミュレータ１０３側となるＣ−ＳＶインターフェース１０４にて特定の関数の関数名を取得する。次に、Ｃ−ＳＶインターフェース１０４は、関数名を記憶領域に格納する。また、論理シミュレータ１０３も、ハードウェアモデル１０２のシミュレーションの結果を記憶領域に格納する。波形ビューワ１１１は、記憶領域に格納されたシミュレーションの結果と関数名とを、時系列で対応付けて表示する。【選択図】図１
2013109673.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納する格納部と、
前記第１の実行部のシミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する表示部と、
を備えることを特徴とするシミュレーション装置。
【請求項２】
ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する検証部と、
を備えることを特徴とするシミュレーション装置。
【請求項３】
ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定する特定部と、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する前記特定部によって特定された組の数の割合を出力する出力部と、
を備えることを特徴とするシミュレーション装置。
【請求項４】
前記ソフトウェアで呼び出される関数が定義されたデータから、関数名を抽出する第１の抽出部と、
前記ハードウェアモデルから、前記ハードウェアモデルが遷移可能な状態を抽出する第２の抽出部と、
前記第１の抽出部によって抽出された関数名と前記第２の抽出部によって抽出されたハードウェアモデルが遷移可能な状態とから、前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せを生成する生成部と、をさらに備え、
前記出力部は、
前記生成部によって生成された組合せの数に対する前記特定部によって特定された組の数の割合を出力する、
ことを特徴とする請求項３に記載のシミュレーション装置。
【請求項５】
前記ソフトウェアの実行中に、前記特定の関数が実行される場合、前記ソフトウェア内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を、前記特定の関数に関する情報で更新する更新部をさらに備え、
前記取得部は、
前記更新部によって更新された前記他の記憶領域のうち、最上位に格納された情報を取得する、
ことを特徴とする請求項１〜４のいずれか一つに記載のシミュレーション装置。
【請求項６】
コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納し、
前記シミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する、
処理を実行することを特徴とするシミュレーション方法。
【請求項７】
コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記シミュレーションの結果と前記特定の関数に関する情報を時系列で対応付けて記憶領域に格納する、
処理を実行させることを特徴とするシミュレーションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムに関する。
【背景技術】
【０００２】
近年、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）組み込み型装置の開発期間の短縮に伴い、ハードウェア製造以前のシステム設計段階でのハードウェアとハードウェアで動作するソフトウェアを含む機能の検証が要求されている。
【０００３】
たとえば、ＣＰＵ以外の周辺デバイスの動作についてハードウェアの論理シミュレータで実行し、その他の部分を汎用の計算機上で実行して、ハードウェアとソフトウェアを含むシステムの検証を短時間で行うといった、協調シミュレーションを行う技術がある。また、ハードウェア記述言語を用いてハードウェアをシミュレーションし、ＣＰＵシミュレータを用いてハードウェアを制御するソフトウェアをシミュレーションし、ホストネイティブにてハードウェアを制御しないソフトウェアをシミュレーションする技術がある。
【０００４】
また、検証対象となるハードウェアの信号値の変化要因がソフトウェアによるものか否かを判断する技術がある。また、ソフトウェア側からハードウェア側への指示信号を用いて、協調検証におけるハードウェア側の途中状態を復元することで、途中状態までのシミュレーション時間を短縮する技術がある。また、メモリエリアの値の変化をグラフ出力し、アクチュエータの信号とセンサの信号に重ね合わせて表示する技術がある（たとえば、下記特許文献１〜５を参照。）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１０−２６０８６５号公報
【特許文献２】特開２０００−２５９４４５号公報
【特許文献３】特開２００１−２０９６６８号公報
【特許文献４】特開２００８−２８２３０８号公報
【特許文献５】特開２００５−１５７７０３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上述した従来技術において、協調シミュレーションでは、ハードウェアとソフトウェアでデバッグ環境が別々であるため、ユーザは、ハードウェアの動作の契機となった、ソフトウェア側で実行した関数を特定することが困難である。たとえば、ユーザは、どの関数が呼び出されると、ハードウェアモデルがどのように振る舞うのかを特定するのが困難である。したがって、従来技術にかかる協調シミュレーションでは、ユーザは、ハードウェアとソフトウェアの協調動作のデバッグを行うことが困難である。
【０００７】
本発明は、上述した従来技術による問題点を解消するため、ハードウェアとソフトウェアの協調動作のデバッグを効率的に行うことができるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、特定の関数に関する情報を記憶領域に格納し、シミュレーションの結果と記憶領域に格納された特定の関数に関する情報とを時系列で対応付けて表示するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【０００９】
また、本発明の他の側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、特定の関数に対応するハードウェアモデルが満たすべき条件を検証するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【００１０】
また、本発明の他の側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、取得時点におけるハードウェアモデルの状態と特定の関数との組を特定し、ハードウェアモデルが遷移可能な状態とソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【発明の効果】
【００１１】
本発明の一側面によれば、協調動作のデバッグを効率的に行うことができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施の形態１にかかるシミュレーション装置の動作例を示す説明図である。
【図２】図２は、実施の形態１にかかるシミュレーション装置のハードウェアの一例を示すブロック図である。
【図３】図３は、実施の形態１にかかるシミュレーション装置の機能例を示すブロック図である。
【図４】図４は、実施の形態１にかかるＣＰＵモデルの機能例を示す説明図である。
【図５】図５は、実施の形態１にかかるシミュレーション装置の動作例を示すシーケンス図である。
【図６】図６は、実施の形態１における入力データ群の一例を示す説明図である。
【図７】図７は、関数名スタック領域の記憶内容の変更例を示す説明図である。
【図８】図８は、Ｃ−ＳＶインターフェースのソースコードの一例である。
【図９】図９は、関数名格納部のソースコードの一例である。
【図１０】図１０は、ＣＰＵモデルでの関数名を時系列で表示した例を示す説明図である。
【図１１】図１１は、ｅｎｔｅｒ−ｈｏｏｋ関数の処理例を示すフローチャートである。
【図１２】図１２は、ｅｘｉｔ−ｈｏｏｋ関数の処理例を示すフローチャートである。
【図１３】図１３は、実施の形態１にかかるＣ−ＳＶインターフェースの処理の一例を示すフローチャートである。
【図１４】図１４は、実施の形態２にかかるシミュレーション装置の機能例を示すブロック図である。
【図１５】図１５は、実施の形態２にかかるＣＰＵモデルの機能例を示す説明図である。
【図１６】図１６は、実施の形態２にかかるシミュレーション装置の動作例を示すシーケンス図である。
【図１７】図１７は、実施の形態２における入力データの一例を示す説明図である。
【図１８】図１８は、事前事後条件チェックデータの記憶内容の一例を示す説明図である。
【図１９】図１９は、イベント発行部のソースコードの一例である。
【図２０】図２０は、チェッカファイルのソースコードの一例である。
【図２１】図２１は、実施の形態２にかかるＣ−ＳＶインターフェースの処理の一例を示すフローチャートである。
【図２２】図２２は、事前条件チェック処理の一例を示すフローチャートである。
【図２３】図２３は、事後条件チェック処理の一例を示すフローチャートである。
【図２４】図２４は、実施の形態３にかかるシミュレーション装置の機能例を示すブロック図である。
【図２５】図２５は、実施の形態３にかかるＣＰＵモデルの機能例を示す説明図である。
【図２６】図２６は、実施の形態３におけるシミュレーション装置の動作例を示すシーケンス図である。
【図２７】図２７は、実施の形態３における入力データの一例を示す説明図である。
【図２８】図２８は、関数名の抽出例を示す説明図である。
【図２９】図２９は、有限状態マシンの状態の抽出例を示す説明図である。
【図３０】図３０は、関数名と有限状態マシンの状態との組合せ例を示す説明図である。
【図３１】図３１は、カバレッジモデルファイルのソースコードの一例を示す説明図である。
【図３２】図３２は、カバレッジの出力例を示す説明図である。
【図３３】図３３は、カバレッジモデルファイルの生成処理の一例を示すフローチャートである。
【図３４】図３４は、カバレッジ計測処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、本実施の形態にかかるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムの実施の形態を詳細に説明する。
【００１４】
（実施の形態１）
図１は、実施の形態１にかかるシミュレーション装置の動作例を示す説明図である。シミュレーション装置１００は、ソフトウェア１０１を実行しつつ、ハードウェアモデル１０２を用いて論理シミュレータ１０３によるシミュレーションを実行している。具体的に、シミュレーション装置１００は、ソフトウェア１０１のコードのうちハードウェアモデル１０２にアクセスする場合にハードウェアモデル１０２を用いてシミュレーションする。
【００１５】
また、シミュレーション装置１００は、ハードウェアモデル１０２にアクセスしない場合にソフトウェア１０１を実行する。なお、ハードウェアモデル１０２にアクセスする処理としては、たとえば、デバイスドライバなどである。また、シミュレーション装置１００は、シミュレーションの結果を波形ビューワ１１１を用いて表示している。
【００１６】
実施の形態１にかかるシミュレーション装置１００では、ハードウェアモデル１０２のシミュレーションの結果とソフトウェア１０１が実行する関数名を時系列で対応付けて表示することで、協調動作のデバッグを効率的に行うことを目的としている。
【００１７】
なお、ソフトウェア１０１は、たとえば、Ｃ言語、またはＣ＋＋言語で記述されたソースコードがコンパイルされて生成された実行オブジェクトであることを想定している。ハードウェアモデル１０２は、ハードウェア記述言語（ＨＤＬ：Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）で記述されている。より詳細には、ハードウェアモデル１０２は、レジスタ転送レベル（ＲＴＬ：Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）で記述された、検証対象のハードウェアのＨＤＬデータである。論理シミュレータ１０３は、たとえば、ハードウェア記述言語とハードウェア検証言語を統合したＳｙｓｔｅｍＶｅｒｉｌｏｇで記述されたファイルを読み込んでシミュレーションを実行する。
【００１８】
このような動作を行うシミュレーション装置１００は、初めに、ソフトウェア１０１の実行中に、ハードウェアモデル１０２にアクセスする特定の関数が実行される場合、後述するｈｏｏｋ関数実行部４１１側にて特定の関数の関数名を取得する。図１の例であれば、シミュレーション装置１００は、ＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）を行うハードウェアのＤＭＡ設定を行う関数である“Ｃｏｎｆｉｇ＿ｄｍａ”が実行される場合、ソフトウェア１０１がＣ−ＳＶインターフェース１０４を呼び出す。
【００１９】
Ｃ−ＳＶ（ＳｙｓｔｅｍＶｅｒｉｌｏｇ）インターフェース１０４は、Ｃ言語で記述された処理系から、ＳｙｓｔｅｍＶｅｒｉｌｏｇで記述された処理を呼び出すことができる機構である。具体的に、Ｃ−ＳＶインターフェース１０４は、ＳｙｓｔｅｍＶｅｒｉｌｏｇの標準言語仕様であるＤＰＩ（Ｄｉｒｅｃｔ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）を用いて、Ｃ言語により実装された機能部との情報のやり取りを行う。
【００２０】
次に、Ｃ−ＳＶインターフェース１０４は、関数名を記憶領域に格納する。また、論理シミュレータ１０３も、ハードウェアモデル１０２のシミュレーションの結果を記憶領域に格納する。波形ビューワ１１１は、記憶領域に格納されたシミュレーションの結果と関数名とを、時系列で対応付けて表示する。たとえば、図１の例では、波形ビューワ１１１は、９００［ｎｓ］において、ハードウェアのレジスタが設定されている０ｘ００１００００４に０ｘ１１２２３３４４が書き込まれているというシミュレーションの結果と、“ｃｏｎｆｉｇ＿ｄｍａ”を表示している。
【００２１】
このように、シミュレーション装置１００は、ソフトウェア１０１にて実行中の関数名をハードウェアモデル１０２側が取得し、波形ビューワ１１１がハードウェアモデル１０２のシミュレーションの結果と関数名を時系列で表示する。これにより、ユーザは、ハードウェアへモデルの動作の契機となった関数を容易に特定でき、協調動作のデバッグを効率的に行える。以下、図２〜図１３にて、実施の形態１にかかるシミュレーション装置１００について説明を行う。
【００２２】
（シミュレーション装置１００のハードウェア）
図２は、実施の形態１にかかるシミュレーション装置のハードウェアの一例を示すブロック図である。図２において、シミュレーション装置１００は、ＣＰＵ２０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、を含む。また、シミュレーション装置１００は、磁気ディスクドライブ２０４と、磁気ディスク２０５と、光ディスクドライブ２０６と、光ディスク２０７と、を含む。また、ユーザやその他の機器との入出力装置としてシミュレーション装置１００は、ディスプレイ２０８と、インターフェース２０９と、キーボード２１０と、マウス２１１と、を含む。また、各部はバス２１２によってそれぞれ接続されている。
【００２３】
ここで、ＣＰＵ２０１は、シミュレーション装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。磁気ディスクドライブ２０４は、ＣＰＵ２０１の制御にしたがって磁気ディスク２０５に対するデータのリードおよびライトを制御する。磁気ディスク２０５は、磁気ディスクドライブ２０４の制御で書き込まれたデータを記憶する。
【００２４】
光ディスクドライブ２０６は、ＣＰＵ２０１の制御にしたがって光ディスク２０７に対するデータのリードおよびライトを制御する。光ディスク２０７は、光ディスクドライブ２０６の制御で書き込まれたデータを記憶したり、光ディスク２０７に記憶されたデータをコンピュータに読み取らせたりする。なお、ＲＯＭ２０２、磁気ディスク２０５、光ディスク２０７のいずれかの記憶装置に、本実施の形態にかかるシミュレーションプログラムが格納されていてもよい。
【００２５】
ディスプレイ２０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ２０８は、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００２６】
インターフェース２０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１３に接続され、ネットワーク２１３を介して他の装置に接続される。そして、インターフェース２０９は、ネットワーク２１３と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。インターフェース２０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２７】
キーボード２１０は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２１０は、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。また、シミュレーション装置１００は、マウス２１１の代わりとして、ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
【００２８】
（シミュレーション装置１００の機能）
次に、シミュレーション装置１００の機能について説明する。図３は、実施の形態１にかかるシミュレーション装置の機能例を示すブロック図である。シミュレーション装置１００は、実行部３０１と、実行部３０２と、取得部３０３と、格納部３０４と、表示部３０５と、更新部３０６と、を含む。この制御部となる機能（実行部３０１〜更新部３０６）は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。また制御部となる機能は、インターフェース２０９を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００２９】
また、シミュレーション装置１００は、関数名を格納する関数名スタック領域３１１にアクセス可能である。関数名スタック領域３１１は、ＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７等といったいずれかの記憶領域内に存在する。
【００３０】
実行部３０１は、ハードウェアモデル１０２を用いてシミュレーションする機能を有する。たとえば、実行部３０１は、ＣＰＵ以外の周辺デバイス等のハードウェアモデル１０２を用いてシミュレーションする。実行部３０１は、たとえば、論理シミュレータ１０３が有する機能である。なお、シミュレーションの結果は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００３１】
実行部３０２は、実行部３０１との協調動作によりソフトウェア１０１を実行する機能を有する。たとえば、実行部３０２は、シミュレーション装置１００向けにコンパイルされた実行オブジェクトを実行する。また、実行部３０２は、協調動作として、ソフトウェア１０１内にハードウェアモデル１０２にアクセスする場合、アクセス先のアドレス、データ等を実行部３０１に通知する。なお、実行結果は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００３２】
取得部３０３は、ソフトウェア１０１の実行中に、ハードウェアモデル１０２にアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得する機能を有する。特定の関数に関する情報としては、たとえば、デバイスドライバ内の関数である。取得部３０３は、たとえば、ハードウェアモデル１０２にアクセスするデバイスドライバ内の関数が実行される場合、関数名を取得する。具体的な取得方法として、取得部３０３は、特定の関数が開始された場合に、関数が格納されたアドレスを受け付け、アドレスから、関数名を取得する。
【００３３】
また、取得部３０３は、更新部３０６によって更新された他の記憶領域となる関数名スタック領域３１１のうち、最上位に格納された情報を取得してもよい。なお、取得した情報、または、情報が格納されているアドレスが、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００３４】
格納部３０４は、取得部３０３によって特定の関数に関する情報が取得された場合、特定の関数に関する情報を記憶領域に格納する機能を有する。たとえば、格納部３０４は、関数名を記憶領域に格納する。また、格納部３０４は、実行部３０１のシミュレーションの結果と併せて記憶領域に格納してもよい。たとえば、格納部３０４は、記憶領域に、”１、０、０、１、ｈ  ００１００００４、ｈ  ００００００００、ｈ  １１２２３３４４、１”、“ｃｏｎｆｉｇ＿ｄｍａ”と格納する。なお、記憶領域とは、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。
【００３５】
表示部３０５は、実行部３０１のシミュレーションの結果と記憶領域に格納された特定の関数に関する情報とを時系列で対応付けて表示する機能を有する。たとえば、記憶領域に、”１、０、０、１、ｈ  ００１００００４”、“ｃｏｎｆｉｇ＿ｄｍａ”と格納されている場合を想定する。このとき、表示部３０５は、１または０の値を、波形として表示し、ｈから始まる１６進数の値と、関数名を文字列としてそのまま表示する。さらに、表示部３０５は、格納された情報を時系列で対応付けて表示する方法として、たとえば、画面内の横方向の位置をそろえて、各情報を表示する。たとえば、９００［ｎｓ］での各情報の値を、横方向の位置をそろえて、縦に連なるように表示する。
【００３６】
なお、表示部３０５は、波形ビューワ１１１の機能であり、ディスプレイ２０８に対して表示してもよいし、画像データとして、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶してもよい。
【００３７】
更新部３０６は、ソフトウェア１０１の実行中に、特定の関数が実行される場合、ソフトウェア１０１内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を特定の関数に関する情報で更新する機能を有する。ここで、他の記憶領域とは、格納部３０４によって関数名が格納されている記憶領域とは別の領域であり、関数名スタック領域３１１である。たとえば、更新部３０６は、特定の関数が実行される場合、関数名スタック領域３１１を特定の関数の関数名で更新する。
【００３８】
また、更新部３０６は、ソフトウェア１０１の実行中に、特定の関数が開始される場合、他の記憶領域の最上位に特定の関数に関する情報を挿入してもよい。たとえば、更新部３０６は、ｃｏｎｆｉｇ＿ｄｍａ関数を開始する場合に、関数名スタック領域３１１に“ｃｏｎｆｉｇ＿ｄｍａ”を挿入する。
【００３９】
また、更新部３０６は、ソフトウェア１０１の実行中に、特定の関数が終了される場合、他の記憶領域の最上位に格納された情報を削除してもよい。たとえば、更新部３０６は、ｃｏｎｆｉｇ＿ｄｍａ関数を終了する場合に、関数名スタック領域３１１の最上位に格納されている“ｃｏｎｆｉｇ＿ｄｍａ”を削除する。
【００４０】
図４は、実施の形態１にかかるＣＰＵモデルの機能例を示す説明図である。ＣＰＵモデル４００は、Ｃ言語により実装される機能部と、ＳｙｓｔｅｍＶｅｒｉｌｏｇによる実装される機能部とがある。ＣＰＵモデル４００は、ソフトウェア実行部４０１とバスドライバ部４０２と、デバッグ情報格納部４０３を含む。ソフトウェア実行部４０１とバスドライバ部４０２は、Ｃ言語によって実装されており、デバッグ情報格納部４０３は、Ｃ言語とＳｙｓｔｅｍＶｅｒｉｌｏｇによって実装されている。
【００４１】
ソフトウェア実行部４０１は、シミュレーション開始時にソフトウェア１０１のメインルーチンを呼び出したり、割込発生時に割込ハンドラに処理を移したりする。バスドライバ部４０２は、ＣＰＵモデル４００以外となるハードウェアモデル１０２へのレジスタアクセスをＣＰＵインターフェースプロトコルに変換する。
【００４２】
デバッグ情報格納部４０３は、デバッグ情報の格納を行う。また、デバッグ情報格納部４０３は、ｈｏｏｋ関数実行部４１１と、関数名スタック領域３１１と、Ｃ−ＳＶ（ＳｙｓｔｅｍＶｅｒｉｌｏｇ）インターフェース１０４と、関数名格納部４１２と、を含む。ｈｏｏｋ関数実行部４１１は、Ｃ言語による実装であり、関数名スタック領域３１１は、記憶領域であり、関数名格納部４１２は、ＳｙｓｔｅｍＶｅｒｉｌｏｇによる実装である。
【００４３】
ｈｏｏｋ関数実行部４１１は、ソフトウェア１０１中で、特定の関数を開始する場合、または終了する場合に自動的に呼び出される関数である。具体的な実装方法の一例として、ソフトウェア１０１をコンパイルするソフトウェアとして、ＧＣＣ（ＧＮＵ  Ｃｏｍｐｉｌｅｒ  Ｃｏｌｌｅｃｔｉｏｎ）を用いた場合を想定する。ＧＣＣは、コンパイルオプションに−ｆｉｎｓｔｒｕｍｅｎｔ−ｆｕｎｃｔｉｏｎｓが設定された場合、特定の関数の先頭に＿＿ｃｙｇ＿ｐｒｏｆｉｌｅ＿ｆｕｎｃ＿ｅｎｔｅｒ（）関数を呼び出すコードをオブジェクトコードに追加する。また、ＧＣＣは、末尾に＿＿ｃｙｇ＿ｐｒｏｆｉｌｅ＿ｆｕｎｃ＿ｅｘｉｔ（）関数を呼び出すコードをオブジェクトコードに追加する。
【００４４】
このように、特定の関数の開始時に実行される関数を、以下の説明では、“ｅｎｔｅｒ−ｈｏｏｋ関数”、特定の関数の終了時に実行されるｈｏｏｋ関数を“ｅｘｉｔ−ｈｏｏｋ関数”と呼称する。ｅｎｔｅｒ−ｈｏｏｋ関数、ｅｘｉｔ−ｈｏｏｋ関数は、第１引数に特定の関数のアドレスが渡される。ｅｎｔｅｒ−ｈｏｏｋ関数の処理例については、図１１にてフローチャートを用いて説明し、ｅｘｉｔ−ｈｏｏｋ関数の処理例については、図１２にてフローチャートを用いて説明する。
【００４５】
なお、コンパイルオプションは、一般的に、ソースファイルごとに異なる設定にすることが可能である。したがって、−ｆｉｎｓｔｒｕｍｅｎｔ−ｆｕｎｃｔｉｏｎｓが設定されたソースファイル内の関数が、特定の関数となる。さらに、−ｆｉｎｓｔｒｕｍｅｎｔ−ｆｕｎｃｔｉｏｎｓが設定されたファイル内にて、ｎｏ＿ｉｎｓｔｒｕｍｅｎｔ＿ｆｕｎｃｔｉｏｎという関数属性を設定することで、一部の関数にて、ｈｏｏｋ関数の呼出を無効に設定することも可能である。
【００４６】
設定方法として、たとえば、デバイスドライバをコンパイルする場合、ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）の関数を記述したファイルにはｈｏｏｋ関数の呼出を無効に設定し、ハードウェアのレジスタにアクセスする関数を記述したファイルにはｈｏｏｋ関数の呼出を有効に設定してもよい。この場合、デバイスドライバのバイナリに関して、最小限の変更で協調動作のデバッグを行うことができる。また、デバイスドライバの全てのソースファイルにｈｏｏｋ関数の呼出を有効に設定してもよい。この場合、関数名スタック領域３１１に、デバイスドライバ内の関数の呼出履歴が格納されるため、ユーザに対してよりデバッグを容易にすることができる。
【００４７】
関数名スタック領域３１１は、関数の呼出履歴を記憶する領域である。関数名スタック領域３１１の具体的な記憶内容の変更例を図７に示す。Ｃ−ＳＶインターフェース１０４は、ｈｏｏｋ関数実行部４１１から実行可能なタスクを提供する。図１３にてＣ−ＳＶインターフェース１０４の処理の一例をフローチャートを用いて説明する。関数名格納部４１２は、現在実行中の関数名の文字列を波形表示するための信号を有し、関数名を波形ビューワ１１１に表示する。なお、関数名格納部４１２の具体的なソースコードの一例については、図９、図１３にて説明する。
【００４８】
図５は、実施の形態１にかかるシミュレーション装置の動作例を示すシーケンス図である。アプリ５０１、デバイスドライバ５０２は、ソフトウェア実行部４０１により実行されるソフトウェアである。アプリ５０１は、アプリケーションソフトウェアであり、たとえば、事務作業を支援するワードプロセッサ、表計算アプリ、映像や音声を再生する動画再生アプリ等である。デバイスドライバ５０２は、デバイスを制御するソフトウェアである。たとえば、アプリ５０１が動画再生アプリであれば、デバイスドライバ５０２は、音声の再生を行うサウンドモジュールを制御するドライバであったり、大量の映像データを高速に転送するＤＭＡＣ（ＤＭＡ  Ｃｏｎｔｒｏｌｌｅｒ）の動作を制御するドライバであったりする。
【００４９】
なお、アプリ５０１、デバイスドライバ５０２、ｈｏｏｋ関数実行部４１１、Ｃ−ＳＶインターフェース１０４、関数名格納部４１２はＣＰＵ２０１による実行によって各機能を実現する。
【００５０】
初めに、アプリ５０１は、デバイスドライバ５０２内の特定の関数を呼び出す（ステップＳ５１１）。特定の関数が呼び出されたデバイスドライバ５０２は、ｅｎｔｅｒ＿ｈｏｏｋ関数を呼び出す（ステップＳ５１２）。なお、ｅｎｔｅｒ＿ｈｏｏｋ関数の第１引数には、特定の関数のアドレスが格納されている。呼び出されたｈｏｏｋ関数実行部４１１は、ｅｎｔｅｒ＿ｈｏｏｋ関数の処理として、関数名を取得し（ステップＳ５１３）、ＤＰＩで実装されているｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅを実行する（ステップＳ５１４）。ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの第１引数には、取得した関数名が格納されており、第２引数には、ｅｎｔｅｒ＿ｆｌａｇ＝１が格納されている。ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの詳細は、図１３にて説明する。
【００５１】
ｅｎｔｅｒ＿ｆｌａｇ＝１が格納されたｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの呼出により、Ｃ−ＳＶインターフェース１０４は、関数名を記憶領域に格納する（ステップＳ５１５）。また、論理シミュレータ１０３は、ハードウェアモデル１０２を用いてシミュレーションを実行し（ステップＳ５１６）、結果を記憶領域に格納する（ステップＳ５１７）。表示部３０５は、格納された関数名とシミュレーションの結果をディスプレイ２０８の波形ビューワ１１１に表示する（ステップＳ５１８）。
【００５２】
次に、デバイスドライバ５０２が、特定の関数を終了し、呼出元へ復帰する場合（ステップＳ５２１）、ｅｘｉｔ＿ｈｏｏｋ関数を呼び出す（ステップＳ５２２）。なお、ｅｘｉｔ＿ｈｏｏｋ関数の第１引数には、特定の関数のアドレスが格納されている。呼び出されたｈｏｏｋ関数実行部４１１は、ｅｘｉｔ＿ｈｏｏｋ関数の処理として、関数名を取得し（ステップＳ５２３）、ＤＰＩで実装されているｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅを実行する（ステップＳ５２４）。ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの第１引数には、取得した関数名が格納されており、第２引数には、ｅｎｔｅｒ＿ｆｌａｇ＝０が格納されている。
【００５３】
ｅｎｔｅｒ＿ｆｌａｇ＝０が格納されたｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの呼出により、Ｃ−ＳＶインターフェース１０４は、関数名を記憶領域に格納する（ステップＳ５２５）。また、論理シミュレータ１０３は、シミュレーションの結果を記憶領域に格納する（ステップＳ５２６）。表示部３０５は、格納された関数名とシミュレーションの結果をディスプレイ２０８の波形ビューワ１１１に表示する（ステップＳ５２７）。
【００５４】
図６は、実施の形態１における入力データ群の一例を示す説明図である。論理シミュレータ１０３への入力データ、または入力データの元となるデータとして、ヘッダファイル６０１と、ソースコード６０２と、ハードウェアモデル１０２と、実行オブジェクト６１１がある。
【００５５】
ヘッダファイル６０１は、拡張子が“．ｈ”となるファイルであり、関数のプロトタイプ宣言等が記述されている。ソースコード６０２は、拡張子が“．ｃ”となるファイルであり、関数の処理内容が記載されている。
【００５６】
シミュレーション装置１００は、ソースコード６０２にヘッダファイル６０１を含め、さらにｈｏｏｋ関数が有効となるコンパイルオプションを設定して、シミュレーション装置１００向けにコンパイルを行う。結果、シミュレーション装置１００は、拡張子が“．ｏ”となる実行オブジェクト６１１を生成する。次に、シミュレーション装置１００は、論理シミュレータ１０３に、ＣＰＵモデル４００と実行オブジェクト６１１とハードウェアモデル１０２を入力し、ハードウェアモデル１０２の応答信号とＣＰＵモデル４００のソフトウェアデバッグ情報を波形ビューワ１１１にて表示する。具体的な表示例については、図１０にて説明を行う。
【００５７】
なお、従来例にかかるシミュレーション装置は、ハードウェアモデル１０２の応答信号を波形ビューワにて表示し、ＣＰＵモデル４００のソフトウェアデバッグ情報をソースコードデバッガで表示していた。従来例のようなハードウェアモデルとソフトウェアのデバッグ環境が異なる場合、たとえば「ある時刻でハードウェアのレジスタをアクセスしているのは、ソフトウェア中のどの関数か？」といった事象を調べることは困難であった。理由としては以下の２つが存在する。
【００５８】
１つ目の理由として、ソースコードデバッガは論理シミュレータのように時刻の概念を持たないため、ある時刻ではどの関数を処理しているか特定することが困難となるためである。また、２つ目の理由として、波形ビューワは信号値を時系列にトレースできるが、これはハードウェアをトレースしたものであり、ある時刻でソフトウェアのどの関数が動作していたかを判別することが難しいためである。
【００５９】
図７は、関数名スタック領域の記憶内容の変更例を示す説明図である。関数名スタック領域３１１は、関数の呼出履歴を記憶しており、最上部の要素は現在実行中の関数の関数名であり、最上部の要素より下の要素は、一つ上の要素が示す関数の呼出元の関数名である。図７では、実行オブジェクト６１１が実行された場合の関数名スタック領域３１１の変更例を示している。
【００６０】
初めに、ＣＰＵモデル４００がｍａｉｎ＿ｔｓｋ関数を呼び出し、ｍａｉｎ＿ｔｓｋ関数の中でｄｍａ＿ｔｒａｎｓｆｅｒ関数を呼び出し、ｄｍａ＿ｔｒａｎｓｆｅｒ関数の中でｃｏｎｆｉｇ＿ｄｍａ関数を呼び出した状態で、ラベルＡを実行する状態を想定する。この状態での関数名スタック領域３１１＿Ａは、最上位の要素として、“ｃｏｎｆｉｇ＿ｄｍａ”を格納しており、上から２番目の要素に“ｄｍａ＿ｔｒａｎｓｆｅｒ”を格納しており、上から３番目の要素に“ｍａｉｎ＿ｔｓｋ”を格納している。
【００６１】
次に、ＣＰＵモデル４００がｃｏｎｆｉｇ＿ｄｍａ関数を終了し、ｄｍａ＿ｔｒａｎｓｆｅｒ関数のラベルＢを実行する状態を想定する。この状態での関数名スタック領域３１１＿Ｂは、最上位の要素に“ｄｍａ＿ｔｒａｎｓｆｅｒ”を格納しており、上から２番目の要素に“ｍａｉｎ＿ｔｓｋ”を格納している。このように、関数名スタック領域３１１の最上位の要素は、現在実行中の関数を格納している。
【００６２】
図８は、Ｃ−ＳＶインターフェースのソースコードの一例である。ソースコード８０１は、ＤＰＩを用いて、ｈｏｏｋ関数実行部４１１から呼出可能なＳｙｓｔｅｍＶｅｒｉｌｏｇのタスクであるｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅを示している。ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの第１引数であるｆｎａｍｅには、取得した関数名が格納される。ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの第２引数であるｅｎｔｅｒ＿ｆｌａｇには、ｆｎａｍｅで示す関数が開始された場合に１が格納され、別の関数が終了し、ｆｎａｍｅで示す関数が復帰した場合に０が格納される。なお、具体的なｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの処理については、図１３にて後述する。
【００６３】
図９は、関数名格納部のソースコードの一例である。図９では、関数名格納部４１２のうち、変数定義部分を示している。表示の処理については、図１３にて後述する。ソースコード９０１で示す、文字列型変数ｃｕｒｒｅｎｔ＿ｆｎａｍｅは、現在実行中の関数名を表示する信号を格納する変数である。ｃｕｒｒｅｎｔ＿ｆｎａｍｅに格納された信号は、Ｃ−ＳＶインターフェース１０４の中でドライブされる。
【００６４】
図１０は、ＣＰＵモデルでの関数名を時系列で表示した例を示す説明図である。図１０では、波形ビューワ１１１の表示例を示している。波形ビューワ１１１は、記憶領域に格納されたシミュレーションの結果と関数名を表示する。記憶領域には、たとえば、”１、０、０、１、ｈ  ００１００００４、ｈ  ００００００００、ｈ  １１２２３３４４  １”、“ｃｏｎｆｉｇ＿ｄｍａ”、”０、０、０、１、ｈ  ００１００００４、ｈ  ００００００００、ｈ  １１２２３３４４”、“ｃｏｎｆｉｇ＿ｄｍａ”、…といったように格納している。
【００６５】
図１０で示す波形ビューワ１１１は、９００［ｎｓ］における各信号値を表示している。具体的に、ＣＰＵ＿ＣＬＫ信号は“１”を出力しており、関数名を示すｆｎａｍｅ信号は“ｃｏｎｆｉｇ＿ｄｍａ”を出力している。また、ＣＰＵ＿ＣＳ＿Ｎ信号は“０”を出力しており、ＣＰＵ＿ＷＲ＿Ｎ信号は“０”を出力しており、ＣＰＵ＿ＲＤ＿Ｎ信号は“１”を出力している。また、ＣＰＵ＿ＡＤＲ信号は“０ｘ００１００００４”を出力しており、ＣＰＵ＿ＲＤＡＴ信号は“０ｘ００００００００”を出力しており、ＣＰＵ＿ＷＤＡＴ信号は“０ｘ１１２２３３４４”を出力しており、ＣＰＵ＿ＲＤＶ信号は、“１”を出力している。
【００６６】
このように、波形ビューワ１１１は、ｃｏｎｆｉｇ＿ｄｍａ関数が０ｘ００１００００４番地への０ｘ１１２２３３４４の書込要求を発行したことをユーザに容易に特定させることができる。関数名を表示していなければ、たとえば、書込要求が不正であった場合、ユーザは、書込要求が発行されたことは特定できるが、どの関数で書込要求が行われたかを特定することができず、デバッグ作業を効率的に行えない。
【００６７】
図１１は、ｅｎｔｅｒ−ｈｏｏｋ関数の処理例を示すフローチャートである。初めに、シミュレーション装置１００は、第１引数のアドレスから、特定の関数の関数名を取得する（ステップＳ１１０１）。次に、シミュレーション装置１００は、ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの実行により、取得した関数名およびｅｎｔｅｒ＿ｆｌａｇ＝１をＣ−ＳＶインターフェース１０４に通知する（ステップＳ１１０２）。続けて、シミュレーション装置１００は、関数名スタック領域３１１に、取得した関数名をプッシュし（ステップＳ１１０３）、ｅｎｔｅｒ−ｈｏｏｋ関数の処理を終了する。
【００６８】
図１２は、ｅｘｉｔ−ｈｏｏｋ関数の処理例を示すフローチャートである。シミュレーション装置１００は、関数名スタック領域３１１から、最上部の関数名をポップする（ステップＳ１２０１）。次に、シミュレーション装置１００は、関数名スタック領域３１１の最上部から、関数名を取得する（ステップＳ１２０２）。続けて、シミュレーション装置１００は、ｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの実行により、取得した関数名およびｅｎｔｅｒ＿ｆｌａｇ＝０をＣ−ＳＶインターフェース１０４に通知し（ステップＳ１２０３）、ｅｘｉｔ−ｈｏｏｋ関数の処理を終了する。
【００６９】
図１３は、実施の形態１にかかるＣ−ＳＶインターフェースの処理の一例を示すフローチャートである。シミュレーション装置１００は、関数名格納部４１２にある文字列型信号に関数名を表示し（ステップＳ１３０１）、Ｃ−ＳＶインターフェース１０４の処理を終了する。なお、実施の形態１にかかるＣ−ＳＶインターフェース１０４では、ｅｎｔｅｒ＿ｆｌａｇを参照しないため、実施の形態１にかかるｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅは、第１引数だけでもよい。
【００７０】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、ソフトウェアにて実行中の関数名をハードウェアモデル側が取得して、ハードウェアモデルの波形と併せて関数名を表示する。これにより、ユーザは、ハードウェアの動作の契機となった関数を容易に特定でき、協調動作のデバッグを効率的に行える。
【００７１】
また、シミュレーション装置は、ソフトウェア内の関数に関する情報をスタック領域に格納してもよい。具体的に、シミュレーション装置は、特定の関数が開始する場合にスタック領域の最上位に挿入し、特定の関数が終了する場合にスタック領域の最上位の情報を削除する。これにより、スタック領域の最上位には、つねに実行中の関数に関する情報が格納されているため、シミュレーション装置は、容易に現在実行中の関数の情報を取得できる。
【００７２】
また、シミュレーション装置は、シミュレーションの実行に関する、論理シミュレータによる処理系とＣ言語による処理系の違いはそのままに、ハードウェアとソフトウェアの協調動作のデバッグ作業を論理シミュレータ側に持ち込んでいる。これにより、シミュレーション装置は、処理系の違いを軽減し、ユーザにデバッグしやすい環境を提供することができる。
【００７３】
また、実施の形態１にかかるシミュレーション装置は、ソフトウェアのソースコードやハードウェアモデルのソースコードの変更なしに、ソフトウェアの関数コールの情報を波形トレースできる。このように、ハードウェアもソフトウェアも同一のデバッグ環境になるため、ユーザは、協調動作を確認しやすくなる。また、波形ビューワは一般的な論理シミュレータにバンドルされている機能であるため、ユーザは、シミュレータの種類によらず、デバッグ情報を閲覧できる。
【００７４】
（実施の形態２）
実施の形態１にかかるシミュレーション装置１００は、ハードウェアモデル１０２のシミュレーションの結果と関数名を波形ビューワ１１１に表示することで、ユーザに対して協調動作のデバッグを効率的に行えるようにしていた。Ｃ言語の処理系とハードウェア記述言語の処理系との協調動作のデバッグの別の問題として、特定の関数を実行する際に、ハードウェアが満たすべき条件が満たされているのかを検証するのが困難である。具体的には、ハードウェアの動作を検証する仕組みであるアサーション言語は、ハードウェアの動作を検証することはできるが、ソフトウェア１０１がどのような状態にあるのかを検出することが困難である。
【００７５】
実施の形態２にかかるシミュレーション装置１００は、関数の実行に対してハードウェアの事前条件、事後条件が満たされているか否かを検証する。以下、図１４〜図２３を用いて実施の形態２にかかるシミュレーション装置１００の説明を行う。なお、実施の形態２にかかるシミュレーション装置１００のハードウェアは、実施の形態１にかかるシミュレーション装置１００のハードウェアと同一であるため、説明を省略する。
【００７６】
図１４は、実施の形態２にかかるシミュレーション装置の機能例を示すブロック図である。ここで、実施の形態１と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態２にかかるシミュレーション装置１００は、実行部３０１と、実行部３０２と、取得部３０３と、更新部３０６と、検証部１４０１と、表示部１４０２と、を含む。この制御部となる機能（実行部３０１〜表示部１４０２）は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。
【００７７】
また制御部となる機能は、インターフェース２０９を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。また、シミュレーション装置１００は、関数名を格納する関数名スタック領域３１１にアクセス可能である。
【００７８】
検証部１４０１は、取得部３０３によって特定の関数に関する情報が取得された場合、特定の関数に対応するハードウェアモデル１０２が満たすべき条件を検証する機能を有する。たとえば、検証部１４０１は、関数が開始される場合には事前条件をチェックし、関数が終了する場合には事後条件をチェックする。なお、検証結果は、ＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７に存在する。
【００７９】
表示部１４０２は、検証部１４０１による検証結果を表示する機能を有する。たとえば、表示部１４０２は、検証結果がＮＧである場合、対応する時刻にてＮＧであることを意味する情報を表示する。ＮＧであることを意味する情報は、たとえば、該当時刻の背景色が変化したり、または、ＮＧを示す文章を表示することであってもよい。
【００８０】
図１５は、実施の形態２にかかるＣＰＵモデルの機能例を示す説明図である。ここで、実施の形態１と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態２にかかるＣＰＵモデル１５００は、ソフトウェア実行部４０１とバスドライバ部４０２と、デバッグ情報格納部１５０１を含む。デバッグ情報格納部１５０１は、Ｃ言語とＳｙｓｔｅｍＶｅｒｉｌｏｇによって実装されている。また、ＣＰＵモデル１５００と連携して動作する機能部として、チェッカ生成部１５１１とチェッカ実行部１５１２がある。
【００８１】
デバッグ情報格納部１５０１は、デバッグ情報の格納を行う。また、デバッグ情報格納部１５０１は、ｈｏｏｋ関数実行部４１１と、関数名スタック領域３１１と、Ｃ−ＳＶインターフェース１５０２と、関数名格納部４１２と、イベント発行部１５０３を含む。
【００８２】
Ｃ−ＳＶインターフェース１５０２は、ｈｏｏｋ関数実行部４１１から実行可能なタスクを提供する。イベント発行部１５０３は、チェッカ実行部１５１２にイベントを発行する。チェッカ生成部１５１１は、事前条件および事後条件のチェックを行うＳｙｓｔｅｍＶｅｒｉｌｏｇのソースコードを生成する。チェッカ実行部１５１２は、イベントを受け付けた場合、チェッカ生成部１５１１が生成したＳｙｓｔｅｍＶｅｒｉｌｏｇのソースコードを用いて、受け付けたイベントに応じたチェックを実行する。
【００８３】
図１６は、実施の形態２にかかるシミュレーション装置の動作例を示すシーケンス図である。なお、ステップＳ１６０１〜ステップＳ１６０８、ステップＳ１６１１〜ステップＳ１６１４、ステップＳ１６１７〜ステップＳ１６１９は、ステップＳ５１１〜ステップＳ５１８、ステップＳ５２１〜ステップＳ５２７と同一の処理であるため、説明を省略する。
【００８４】
ｅｎｔｅｒ＿ｆｌａｇ＝１が格納されたｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの呼出により、Ｃ−ＳＶインターフェース１５０２は、ステップＳ１６０５の処理の後、イベント発行部１５０３によりチェッカ実行部１５１２にｅｎｔｅｒイベントを発行する（ステップＳ１６０９）。ｅｎｔｅｒイベントを受け付けたチェッカ実行部１５１２は、事前条件をチェックする（ステップＳ１６１０）。
【００８５】
ｅｎｔｅｒ＿ｆｌａｇ＝０が格納されたｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの呼出により、Ｃ−ＳＶインターフェース１５０２は、イベント発行部１５０３によりチェッカ実行部１５１２にｅｘｉｔイベントを発行する（ステップＳ１６１５）。ｅｘｉｔイベントを受け付けたチェッカ実行部１５１２は、事後条件をチェックする（ステップＳ１６１６）。なお、Ｃ−ＳＶインターフェース１５０２は、ステップＳ１６１５の処理後、ステップＳ１６１７を実行する。
【００８６】
図１７は、実施の形態２における入力データの一例を示す説明図である。論理シミュレータ１０３への入力データ、または入力データの元となるデータとして、ＣＰＵモデル１５００、ヘッダファイル６０１、ソースコード６０２、ハードウェアモデル１０２、実行オブジェクト６１１、事前事後条件チェックデータ１７０１、チェッカファイル１７０２がある。なお、入力データのうち、ヘッダファイル６０１、ソースコード６０２、ハードウェアモデル１０２、実行オブジェクト６１１については、実施の形態１と同様であるため、説明を省略する。
【００８７】
事前事後条件チェックデータ１７０１は、関数の開始時にハードウェアが満たしているべき事前条件と、関数の終了時にハードウェアが満たしているべき事後条件と、を記憶するデータである。事前事後条件チェックデータ１７０１の詳細については、図１８にて説明する。
【００８８】
チェッカファイル１７０２は、チェッカ生成部１５１１により事前事後条件チェックデータ１７０１に基づいて生成された、事前事後条件チェックデータ１７０１の事前条件と事後条件をチェックするファイルである。なお、チェッカファイル１７０２は、拡張子が“．ｓｖ”となるＳｙｓｔｅｍＶｅｒｉｌｏｇ用のソースコードである。チェッカファイル１７０２の詳細については、図２０にて説明する。
【００８９】
図１８は、事前事後条件チェックデータの記憶内容の一例を示す説明図である。表１８０１は、事前事後条件チェックデータ１７０１の元となるファイルとなる、ハードウェアのユースケース記述の一例である。
【００９０】
表１８０１には、ユースケース名、ハードウェアの概要、アクター、事前条件、基本フロー、事後条件という６つのフィールドが記述されている。たとえば、ハードウェアが転送する場合には、事前条件として、コントロールレジスタのｓｔａｒｔビットが０であるという条件が満たされていることが要求される。また、ハードウェアの転送が終了した場合には、事後条件として、コントロールレジスタのｓｔａｒｔビットが０にクリアされているという条件が満たされていることが要求される。
【００９１】
次に、シミュレーション装置１００は、機械的な文字列操作により、表１８０１から、事前条件フィールドと事後条件フィールドに基づいて、事前事後条件チェックデータ１７０１を生成する。図１８に示す事前事後条件チェックデータ１７０１は、レコード１７０１−１、レコード１７０１−２を登録している。
【００９２】
事前事後条件チェックデータ１７０１は、関数名、イベント種別、チェック内容という３つのフィールドを含む。関数名フィールドには、事前条件や事後条件をチェックする関数名が格納される。イベント種別フィールドには、事前条件であれば“ＯｎＥｎｔｅｒ”、事後条件であれば“ＯｎＥｘｉｔ”が格納される。チェック内容フィールドには、チェックを行う、時間記述を含まないＢＯＯＬ式が格納される。
【００９３】
たとえば、レコード１７０１−１は、＜関数名＞で示す関数を開始する事前条件として、ｓｔａｒｔビットが０であるか否かをチェックする内容であることを示している。同様に、レコード１７０１−２は、＜関数名＞を終了する事後条件として、ｓｔａｒｔビットが０であるか否かをチェックする内容であることを示している。
【００９４】
図１９は、イベント発行部のソースコードの一例である。図１９では、イベント発行部１５０３のうち、変数定義部分を示している。イベント発行の処理については、図２１にて後述する。ソースコード１９０１で示す、ｅｖｅｎｔ型変数ｅ＿ｅｎｔｅｒは、関数を開始するときに発行されるイベントであり、ｅｖｅｎｔ型変数ｅ＿ｅｘｉｔは、関数を終了するときに発行されるイベントである。
【００９５】
図２０は、チェッカファイルのソースコードの一例である。図２０では、チェッカ生成部１５１１によって事前事後条件チェックデータ１７０１から生成されたチェッカファイル１７０２の一例を示している。たとえば、チェッカファイル１７０２には、事前条件のチェッカとして、ｅｎｔｅｒイベントを受け付けた場合、開始する関数名で処理分岐を行い、事前事後条件チェックデータ１７０１のチェック内容フィールドにて示していたＢＯＯＬ式を実行する。なお、ＢＯＯＬ式で事前条件が満たされなかった場合、シミュレーション装置１００は、たとえば、波形ビューワ１１１に事前条件が満たされなかった旨を表示してもよい。
【００９６】
図２１は、実施の形態２にかかるＣ−ＳＶインターフェースの処理の一例を示すフローチャートである。シミュレーション装置１００は、ｅｎｔｅｒ＿ｆｌａｇの値を確認する（ステップＳ２１０１）。ｅｎｔｅｒ＿ｆｌａｇ＝１である場合（ステップＳ２１０１：１）、シミュレーション装置１００は、関数名格納部４１２の文字列型信号にある関数名を表示する（ステップＳ２１０２）。次に、シミュレーション装置１００は、イベント発行部１５０３により、ｅｎｔｅｒイベントをチェッカ実行部１５１２に発行し（ステップＳ２１０３）、Ｃ−ＳＶインターフェースの処理を終了する。
【００９７】
また、ｅｎｔｅｒ＿ｆｌａｇ＝０である場合（ステップＳ２１０１：０）、シミュレーション装置１００は、ｅｘｉｔイベントをチェッカ実行部１５１２に発行する（ステップＳ２１０４）。次に、シミュレーション装置１００は、関数名格納部４１２にある文字列型信号に格納された関数名を表示し（ステップＳ２１０５）、Ｃ−ＳＶインターフェースの処理を終了する。
【００９８】
図２２は、事前条件チェック処理の一例を示すフローチャートである。シミュレーション装置１００は、ＣＰＵモデル１５００からｅｎｔｅｒイベントを受け付ける（ステップＳ２２０１）。次に、シミュレーション装置１００は、関数名格納部４１２から関数名を取得し（ステップＳ２２０２）、関数名を確認する（ステップＳ２２０３）。関数名が関数１である場合（ステップＳ２２０３：関数１）、シミュレーション装置１００は、関数１のチェックを実行し（ステップＳ２２０４）、ステップＳ２２０１の処理に移行する。
【００９９】
関数名が関数２である場合（ステップＳ２２０３：関数２）、シミュレーション装置１００は、関数２のチェックを実行し（ステップＳ２２０５）、ステップＳ２２０１の処理に移行する。関数名が関数ｎである場合（ステップＳ２２０３：関数ｎ）、シミュレーション装置１００は、関数ｎのチェックを実行し（ステップＳ２２０３＋ｎ）、ステップＳ２２０１の処理に移行する。なお、ｎは１以上の整数である。
【０１００】
図２３は、事後条件チェック処理の一例を示すフローチャートである。図２３で示すフローチャートは、ステップＳ２３０１を除いて図２２で示したフローチャートと同一であるため、ステップＳ２３０２〜ステップＳ２３０３＋ｎの説明を省略する。シミュレーション装置１００は、ＣＰＵモデル１５００からｅｘｉｔイベントを受け付ける（ステップＳ２３０１）。次に、シミュレーション装置１００は、ステップＳ２３０２の処理に移行する。
【０１０１】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、関数の実行に対応する事前条件、事後条件をチェックするコードを実行する。これにより、ユーザは、ソフトウェアの動作に対してハードウェアの事前条件、事後条件が満たされているかを自動で得ることができるようになり、ユーザ自身が確認しなくてよくなり、協調動作のデバッグを効率的に行える。
【０１０２】
また、実施の形態２にかかるシミュレーション装置は、ソフトウェアのソースコードやハードウェアモデルのソースコードの変更なしに、ソフトウェアがハードウェアに対して特定の操作の事前条件や事後条件をハードウェアと一緒にチェックできる。また、シミュレーション装置は、Ｃ言語記述のソフトウェアの関数コールや復帰をＳｙｓｔｅｍＶｅｒｉｌｏｇのイベントに変換している。これにより、シミュレーション装置は、本来ハードウェアをチェックする機構であるＳＶＡ（ＳｙｓｔｅｍＶｅｒｉｌｏｇ  Ａｓｓｅｒｔｉｏｎ）やＰＳＬ（Ｐｒｏｐｅｒｔｙ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ  Ｌａｎｇｕａｇｅ）などのアサーション言語で記述したチェッカを用いて協調動作をチェックできるようになる。
【０１０３】
（実施の形態３）
実施の形態２にかかるシミュレーション装置１００は、関数の実行に対してハードウェアの事前条件、事後条件が満たされているか否かを検証していた。実施の形態３では、Ｃ言語の処理系とハードウェア記述言語の処理系とのデバッグの一つとして、協調動作の組合せカバレッジについて説明する。
【０１０４】
ハードウェアは、何もしていないＩＤＬＥ状態、データの書込中であるＷＲ＿ＤＡＴＡ状態などといった有限状態マシンで表現されることが多い。そして、ハードウェアの障害には、ハードウェアがある状態の時にソフトウェア１０１から特定の操作を行った場合には正常動作するものの、ハードウェアが別の状態の時にソフトウェア１０１から特定の操作を行った場合に誤動作するといった事例が多い。したがって、ハードウェアとソフトウェアの協調シミュレーションでは、ハードウェアの状態とソフトウェア１０１からの操作の組合せについて試験する、という要求が発生する。なお、実施の形態３の説明では、ソフトウェア１０１からの操作を特定の関数が担うことを想定する。
【０１０５】
また、ソフトウェア１０１のうちどの関数が実行されたかの割合は、ソフトウェア１０１向けのカバレッジツールやプロファイラを用いて測定することができる。同様に、ハードウェアが遷移した状態の割合は、論理シミュレータ１０３の機能により測定することができる。しかしながら、協調動作の組合せカバレッジは、ソフトウェア１０１とハードウェアモデルのデバッグ環境が別々であるために、ハードウェアの動作の契機となった、ソフトウェア側で実行した関数の特定が難しいため、計測するのが困難である。
【０１０６】
実施の形態３にかかるシミュレーション装置１００は、協調動作の組合せカバレッジを計測する。以下、図２５〜図３４を用いて実施の形態３にかかるシミュレーション装置１００の説明を行う。なお、実施の形態３にかかるシミュレーション装置１００のハードウェアは、実施の形態１にかかるシミュレーション装置１００のハードウェアと同一であるため、説明を省略する。
【０１０７】
図２４は、実施の形態３にかかるシミュレーション装置の機能例を示すブロック図である。ここで、実施の形態１と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態３にかかるシミュレーション装置１００は、実行部３０１と、実行部３０２と、取得部３０３と、更新部３０６と、特定部２４０１と、出力部２４０２と、抽出部２４０３と、抽出部２４０４と、生成部２４０５と、を含む。この制御部となる機能（実行部３０１〜生成部２４０５）は、記憶装置に記憶されたプログラムをＣＰＵ２０１が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などである。
【０１０８】
または、インターフェース２０９を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。また、シミュレーション装置１００は、関数名を格納する関数名スタック領域３１１にアクセス可能である。
【０１０９】
特定部２４０１は、取得部３０３によって特定の関数に関する情報が取得された場合、取得時点におけるハードウェアモデル１０２の状態と特定の関数との組を特定する機能を有する。たとえば、特定部２４０１は、取得部３０３が“＜関数１＞”という関数名を取得した場合、取得時点のハードウェアモデル１０２の状態と“＜関数１＞”との組を特定する。また、特定部２４０１は、ハードウェアモデル１０２が複数存在する場合、ハードウェアモデル１０２の識別情報とハードウェアモデル１０２の状態と特定の関数との組を特定する。なお、特定された組は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【０１１０】
出力部２４０２は、ハードウェアモデル１０２が遷移可能な状態とソフトウェア１０１が実行可能な関数との組合せの数に対する特定部２４０１によって特定された組の数の割合を出力する機能を有する。たとえば、状態の数が２つ、関数の数が２つあり、組合せの数が４つあり、特定された組の数が２つである場合、出力部２４０２は、２／４＝５０［％］を出力する。また、出力部２４０２は、組合せのうち、特定されていない組を出力してもよい。また、出力部２４０２は、生成部２４０５によって生成された組合せの数に対する特定部２４０１によって特定された組の数の割合を出力してもよい。
【０１１１】
出力形式としては、たとえば、ディスプレイ２０８への表示、インターフェース２０９による外部装置への送信がある。また、出力部２４０２は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶することとしてもよい。
【０１１２】
抽出部２４０３は、ソフトウェア１０１で呼び出される関数が定義されたデータから、関数名を抽出する機能を有する。たとえば、抽出部２４０３は、関数が定義されたヘッダファイル６０１から、“＜関数１＞”、“＜関数２＞”といった関数名を抽出する。具体的な抽出方法としては、図２８にて後述する。なお、抽出結果は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【０１１３】
抽出部２４０４は、ハードウェアモデル１０２から、ハードウェアモデル１０２が遷移可能な状態を抽出する機能を有する。たとえば、抽出部２４０４は、ＩＤＬＥ状態、ＷＲ＿ＤＡＴＡ状態といった状態を抽出する。具体的な抽出方法としては、図２９にて後述する。なお、抽出結果は、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【０１１４】
生成部２４０５は、抽出部２４０３によって抽出された関数名と抽出部２４０４によって抽出された状態とから、ハードウェアモデル１０２が遷移可能な状態とソフトウェア１０１が実行可能な関数との組合せを生成する機能を有する。たとえば、抽出部２４０３が“＜関数１＞”、“＜関数２＞”を抽出し、抽出部２４０４がＩＤＬＥ状態、ＷＲ＿ＤＡＴＡ状態を抽出した場合を想定する。このとき、生成部２４０５は、（“＜関数１＞”、ＩＤＬＥ状態）、（“＜関数１＞”、ＷＲ＿ＤＡＴＡ状態）、（“＜関数２＞”、ＩＤＬＥ状態）、（“＜関数２＞”、ＷＲ＿ＤＡＴＡ状態）という組合せを生成する。なお、生成した組合せは、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【０１１５】
図２５は、実施の形態３にかかるＣＰＵモデルの機能例を示す説明図である。ここで、実施の形態１または実施の形態２と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態３にかかるＣＰＵモデル２５００は、ソフトウェア実行部４０１とバスドライバ部４０２と、デバッグ情報格納部２５０１を含む。デバッグ情報格納部２５０１は、Ｃ言語とＳｙｓｔｅｍＶｅｒｉｌｏｇによって実装されている。また、ＣＰＵモデル２５００と連携して動作する機能部として、生成部２４０５とカバレッジ計測部２５１１がある。
【０１１６】
デバッグ情報格納部２５０１は、デバッグ情報の格納を行う。また、デバッグ情報格納部２５０１は、ｈｏｏｋ関数実行部４１１と、関数名スタック領域３１１と、Ｃ−ＳＶインターフェース１５０２と、関数名格納部４１２と、イベント発行部２５０２を含む。
【０１１７】
イベント発行部２５０２は、カバレッジ計測部２５１１にイベントを発行する。生成部２４０５は、カバレッジ計測を行うＳｙｓｔｅｍＶｅｒｉｌｏｇのソースコードを生成する。カバレッジ計測部２５１１は、イベントを受け付けた場合、生成部２４０５が生成したＳｙｓｔｅｍＶｅｒｉｌｏｇのソースコードを用いて、カバレッジの計測を行う。
【０１１８】
図２６は、実施の形態３におけるシミュレーション装置の動作例を示すシーケンス図である。なお、ステップＳ２６０１〜ステップＳ２６０８、ステップＳ２６１１〜ステップＳ２６１７は、ステップＳ５１１〜ステップＳ５１８、ステップＳ５２１〜ステップＳ５２７と同一の処理であるため、説明を省略する。
【０１１９】
ｅｎｔｅｒ＿ｆｌａｇ＝１が格納されたｓｅｔ＿ｃｕｒｒｅｎｔ＿ｆｎａｍｅの呼出により、Ｃ−ＳＶインターフェース１５０２は、ステップＳ２６０５の処理の後、イベント発行部２５０２によりカバレッジ計測部２５１１にｅｎｔｅｒイベントを発行する（ステップＳ２６０９）。ｅｎｔｅｒイベントを受け付けたカバレッジ計測部２５１１は、カバレッジ計測を実行する（ステップＳ２６１０）。
【０１２０】
図２７は、実施の形態３における入力データの一例を示す説明図である。論理シミュレータ１０３への入力データ、または入力データの元となるデータとして、ＣＰＵモデル２５００、ヘッダファイル６０１、ソースコード６０２、ハードウェアモデル１０２、実行オブジェクト６１１、カバレッジモデルファイル２７０１がある。なお、入力データのうち、ＣＰＵモデル２５００、ヘッダファイル６０１、ソースコード６０２、ハードウェアモデル１０２、実行オブジェクト６１１については、実施の形態１と同様であるため、説明を省略する。
【０１２１】
カバレッジモデルファイル２７０１は、生成部２４０５によりヘッダファイル６０１とハードウェアモデル１０２に基づいて生成された、カバレッジを計測するファイルである。なお、カバレッジモデルファイル２７０１は拡張子が“．ｓｖ”となるＳｙｓｔｅｍＶｅｒｉｌｏｇ用のソースコードである。カバレッジモデルファイル２７０１の詳細については、図３１にて説明する。
【０１２２】
図２８は、関数名の抽出例を示す説明図である。図２８では、ヘッダファイル６０１から、関数名の抽出例を示している。ヘッダファイル６０１には、関数のプロトタイプ宣言が記述されている。具体的に、図２８で示すヘッダファイル６０１では、関数１と、関数２とが、宣言されている。生成部２４０５は、関数名を抽出し、表２８０１を生成する。抽出方法として、たとえば、生成部２４０５は、“（”の左側に位置する単語を、関数名として抽出してよい。表２８０１は、関数名フィールドを有し、レコード２８０１−１、２８０１−２を有している。レコード２８０１−１は＜関数１＞を登録しており、レコード２８０１−２は＜関数２＞を登録している。
【０１２３】
図２９は、有限状態マシンの状態の抽出例を示す説明図である。図２９では、ハードウェアモデル１０２から有限状態マシンＩＤと、有限状態マシンの状態ＩＤの抽出例を示している。ハードウェアモデル１０２には、ハードウェアの動作が有限状態マシンで表現されている。具体的に、図２９で示すハードウェアモデル１０２では、有限状態マシンＦＳＭ１と有限状態マシンＦＳＭ２の動作が記述されている。生成部２４０５は、有限状態マシンＩＤと、有限状態マシンの状態ＩＤとを抽出し、表２９０１を生成する。
【０１２４】
抽出方法として、たとえば、生成部２４０５は、“ｃａｓｅ”ステートメントを検出し、“ｃａｓｅ”ステートメントの引数を有限状態マシンの状態ＩＤとして抽出し、引数と比較される値を状態ＩＤとして抽出してもよい。表２９０１は、有限状態マシンＩＤ、状態ＩＤという２つのフィールドを有し、レコード２９０１−１、２９０１−２を有している。レコード２９０１−１は、有限状態マシンＩＤ＜ＦＳＭ１＞について状態ＩＤが＜状態１＿１＞と＜状態１＿２＞とを登録しており、レコード２９０１−２は、有限状態マシンＩＤ＜ＦＳＭ２＞について状態ＩＤが＜状態２＿１＞と＜状態２＿２＞とを登録している。
【０１２５】
図３０は、関数名と有限状態マシンの状態との組合せ例を示す説明図である。図３０で示す表３００１は、表２８０１の項目と表２９０１の項目との全ての組合せを示している。表３００１は、関数名、有限状態マシンＩＤ、状態ＩＤという３つのフィールドを有する。具体的には、レコード３００１−１−１−１は、ソフトウェア１０１が＜関数１＞を開始するときに有限状態マシンＩＤ＜ＦＳＭ１＞が状態ＩＤ＜状態１＿１＞となる場合を示している。レコード３００１−１−１−２〜レコード３００１−２−２−２も、ソフトウェア１０１が関数名フィールドで示される関数を開始するときに有限状態マシンＩＤフィールドで示される有限状態マシンが状態ＩＤフィールドで示される状態となる場合を示している。
【０１２６】
図３１は、カバレッジモデルファイルのソースコードの一例を示す説明図である。図３１では、生成部２４０５が、表３００１から生成したカバレッジモデルファイル２７０１を示している。具体的に、生成部２４０５は、関数名と、各有限状態マシンの状態を列挙型変数で表現し、組合せをｃｏｖｅｒｇｒｏｕｐで表現している。
【０１２７】
図３２は、カバレッジの出力例を示す説明図である。図３２に示す表３２０１は、表３００１に、発生数フィールドを追加し、さらに、カバレッジ率フィールドを追加している。発生数フィールドには、関数名、有限状態マシンＩＤ、状態ＩＤの各フィールドの値で示す状態となった回数が格納される。カバレッジ率フィールドには、全レコードのうち、発生数が１以上となるレコードの割合が格納される。
【０１２８】
たとえば、ソフトウェア１０１が関数２を開始する場合に、有限状態マシンＩＤ＜ＦＳＭ１＞が状態ＩＤ＜状態１＿１＞となっていれば、カバレッジ計測部２５１１は、レコード３２０１−２−１−１の発生数フィールドの値を０から１に増加する。
【０１２９】
図３２で示す状態でカバレッジを出力する場合、シミュレーション装置１００は、たとえば、カバレッジ率フィールドに格納されている“５０％”を出力してもよい。または、シミュレーション装置１００は、発生数フィールドの値が０となっているレコードの関数名、有限状態マシンＩＤ、状態ＩＤの各フィールドの値を出力してもよい。具体的に、シミュレーション装置１００は、発生数フィールドの値が０となっている、レコード３２０１−１−１−１、レコード３２０１−１−１−２、レコード３２０１−１−２−２、レコード３２０１−２−２−２の各フィールドの値を出力する。
【０１３０】
図３３は、カバレッジモデルファイルの生成処理の一例を示すフローチャートである。シミュレーション装置１００は、ヘッダファイル６０１から、関数名を抽出する（ステップＳ３３０１）。次に、シミュレーション装置１００は、ハードウェアモデル１０２から、有限状態マシンＩＤと状態ＩＤを抽出する（ステップＳ３３０２）。続いて、シミュレーション装置１００は、関数名と有限状態マシンＩＤと状態ＩＤとから、カバレッジモデルファイル２７０１を生成し（ステップＳ３３０３）、カバレッジモデルファイル２７０１の生成処理を終了する。
【０１３１】
図３４は、カバレッジ計測処理の一例を示すフローチャートである。シミュレーション装置１００は、カバレッジ計測が終了したか否かを判断する（ステップＳ３４０１）。カバレッジ処理が終了していない場合（ステップＳ３４０１：Ｎｏ）、シミュレーション装置１００は、ＣＰＵモデル２５００からｅｎｔｅｒイベントを受け付ける（ステップＳ３４０２）。次に、シミュレーション装置１００は、関数名格納部４１２から関数名を取得し（ステップＳ３４０３）、ハードウェアモデル１０２の有限状態マシンＩＤ、状態ＩＤ、関数の組を特定する（ステップＳ３４０４）。続けて、シミュレーション装置１００は、関数名、有限状態マシンＩＤ、状態ＩＤの組合せの発生数を１増加し（ステップＳ３４０５）、ステップＳ３４０１の処理に移行する。
【０１３２】
カバレッジ処理が終了した場合（ステップＳ３４０１：Ｙｅｓ）、シミュレーション装置１００は、カバレッジ率を出力し（ステップＳ３４０６）、カバレッジ計測処理を終了する。
【０１３３】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、特定の関数が実行される場合、関数と取得時点のハードウェアの状態を特定してカバレッジを計測する。これにより、シミュレーション装置がソフトウェア１０１の操作とハードウェア動作の組合せカバレッジを実行できるため、ユーザは、未実行の組合せを特定し易くなり、不具合の存在する箇所を発見しやすくなるため、協調動作のデバッグを効率的に行える。
【０１３４】
また、実施の形態３にかかるシミュレーション装置は、ヘッダファイルと回路データから、カバレッジモデルを自動生成し、カバレッジ計測イベントもＣＰＵモデルが自動的に駆動する。これにより、シミュレーション装置は、漏れなく、時間をかけずにハードウェアの状態とソフトウェアの動作の組合せカバレッジを計測できる。
【０１３５】
なお、本実施の形態１〜３で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本シミュレーションプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１３６】
上述した実施の形態１〜３に関し、さらに以下の付記を開示する。
【０１３７】
（付記１）ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納する格納部と、
前記第１の実行部のシミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する表示部と、
を備えることを特徴とするシミュレーション装置。
【０１３８】
（付記２）ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する検証部と、
を備えることを特徴とするシミュレーション装置。
【０１３９】
（付記３）ハードウェアモデルを用いてシミュレーションする第１の実行部と、
前記第１の実行部との協調動作によりソフトウェアを実行する第２の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定する特定部と、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する前記特定部によって特定された組の数の割合を出力する出力部と、
を備えることを特徴とするシミュレーション装置。
【０１４０】
（付記４）前記ソフトウェアで呼び出される関数が定義されたデータから、関数名を抽出する第１の抽出部と、
前記ハードウェアモデルから、前記ハードウェアモデルが遷移可能な状態を抽出する第２の抽出部と、
前記第１の抽出部によって抽出された関数名と前記第２の抽出部によって抽出されたハードウェアモデルが遷移可能な状態とから、前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せを生成する生成部と、をさらに備え、
前記出力部は、
前記生成部によって生成された組合せの数に対する前記特定部によって特定された組の数の割合を出力する、
ことを特徴とする付記３に記載のシミュレーション装置。
【０１４１】
（付記５）前記ソフトウェアの実行中に、前記特定の関数が実行される場合、前記ソフトウェア内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を、前記特定の関数に関する情報で更新する更新部をさらに備え、
前記取得部は、
前記更新部によって更新された前記他の記憶領域のうち、最上位に格納された情報を取得する、
ことを特徴とする付記１〜４のいずれか一つに記載のシミュレーション装置。
【０１４２】
（付記６）前記更新部は、
前記ソフトウェアの実行中に、前記特定の関数が開始される場合、前記他の記憶領域の最上位に前記特定の関数に関する情報を挿入する、
ことを特徴とする付記５に記載のシミュレーション装置。
【０１４３】
（付記７）前記更新部は、
前記ソフトウェアの実行中に、前記特定の関数が終了される場合、前記他の記憶領域の最上位に格納された情報を削除する、
ことを特徴とする付記５に記載のシミュレーション装置。
【０１４４】
（付記８）コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納し、
前記シミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する、
処理を実行することを特徴とするシミュレーション方法。
【０１４５】
（付記９）コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する、
処理を実行することを特徴とするシミュレーション方法。
【０１４６】
（付記１０）コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定し、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力する、
処理を実行することを特徴とするシミュレーション方法。
【０１４７】
（付記１１）コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記シミュレーションの結果と前記特定の関数に関する情報を時系列で対応付けて記憶領域に格納する、
処理を実行させることを特徴とするシミュレーションプログラム。
【０１４８】
（付記１２）コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する、
処理を実行させることを特徴とするシミュレーションプログラム。
【０１４９】
（付記１３）コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定し、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力する、
処理を実行させることを特徴とするシミュレーションプログラム。
【符号の説明】
【０１５０】
１００  シミュレーション装置
１０１  ソフトウェア
１０２  ハードウェアモデル
１０３  論理シミュレータ
３０１  実行部
３０２  実行部
３０３  取得部
３０４  格納部
３０５  表示部
３０６  更新部
３１１  関数名スタック領域
１４０１  検証部
２４０１  特定部
２４０２  出力部
２４０３、２４０４  抽出部
２４０５  生成部
【図１】
2013109673.tif 000003
【図２】
2013109673.tif 000004
【図３】
2013109673.tif 000005
【図４】
2013109673.tif 000006
【図５】
2013109673.tif 000007
【図６】
2013109673.tif 000008
【図７】
2013109673.tif 000009
【図８】
2013109673.tif 000010
【図９】
2013109673.tif 000011
【図１０】
2013109673.tif 000012
【図１１】
2013109673.tif 000013
【図１２】
2013109673.tif 000014
【図１３】
2013109673.tif 000015
【図１４】
2013109673.tif 000016
【図１５】
2013109673.tif 000017
【図１６】
2013109673.tif 000018
【図１７】
2013109673.tif 000019
【図１８】
2013109673.tif 000020
【図１９】
2013109673.tif 000021
【図２０】
2013109673.tif 000022
【図２１】
2013109673.tif 000023
【図２２】
2013109673.tif 000024
【図２３】
2013109673.tif 000025
【図２４】
2013109673.tif 000026
【図２５】
2013109673.tif 000027
【図２６】
2013109673.tif 000028
【図２７】
2013109673.tif 000029
【図２８】
2013109673.tif 000030
【図２９】
2013109673.tif 000031
【図３０】
2013109673.tif 000032
【図３１】
2013109673.tif 000033
【図３２】
2013109673.tif 000034
【図３３】
2013109673.tif 000035
【図３４】
2013109673.tif 000036