説明

シミュレーション装置、シミュレーション方法、およびシミュレーションプログラム

【課題】ハードウェアとソフトウェアの協調動作のデバッグを効率的に行うこと。
【解決手段】シミュレーション装置100は、ソフトウェア101の実行中に、ハードウェアモデル102にアクセスする特定の関数が実行される場合、論理シミュレータ103側となるC−SVインターフェース104にて特定の関数の関数名を取得する。次に、C−SVインターフェース104は、関数名を記憶領域に格納する。また、論理シミュレータ103も、ハードウェアモデル102のシミュレーションの結果を記憶領域に格納する。波形ビューワ111は、記憶領域に格納されたシミュレーションの結果と関数名とを、時系列で対応付けて表示する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムに関する。
【背景技術】
【0002】
近年、CPU(Central Processing Unit)組み込み型装置の開発期間の短縮に伴い、ハードウェア製造以前のシステム設計段階でのハードウェアとハードウェアで動作するソフトウェアを含む機能の検証が要求されている。
【0003】
たとえば、CPU以外の周辺デバイスの動作についてハードウェアの論理シミュレータで実行し、その他の部分を汎用の計算機上で実行して、ハードウェアとソフトウェアを含むシステムの検証を短時間で行うといった、協調シミュレーションを行う技術がある。また、ハードウェア記述言語を用いてハードウェアをシミュレーションし、CPUシミュレータを用いてハードウェアを制御するソフトウェアをシミュレーションし、ホストネイティブにてハードウェアを制御しないソフトウェアをシミュレーションする技術がある。
【0004】
また、検証対象となるハードウェアの信号値の変化要因がソフトウェアによるものか否かを判断する技術がある。また、ソフトウェア側からハードウェア側への指示信号を用いて、協調検証におけるハードウェア側の途中状態を復元することで、途中状態までのシミュレーション時間を短縮する技術がある。また、メモリエリアの値の変化をグラフ出力し、アクチュエータの信号とセンサの信号に重ね合わせて表示する技術がある(たとえば、下記特許文献1〜5を参照。)。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開平10−260865号公報
【特許文献2】特開2000−259445号公報
【特許文献3】特開2001−209668号公報
【特許文献4】特開2008−282308号公報
【特許文献5】特開2005−157703号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
しかしながら、上述した従来技術において、協調シミュレーションでは、ハードウェアとソフトウェアでデバッグ環境が別々であるため、ユーザは、ハードウェアの動作の契機となった、ソフトウェア側で実行した関数を特定することが困難である。たとえば、ユーザは、どの関数が呼び出されると、ハードウェアモデルがどのように振る舞うのかを特定するのが困難である。したがって、従来技術にかかる協調シミュレーションでは、ユーザは、ハードウェアとソフトウェアの協調動作のデバッグを行うことが困難である。
【0007】
本発明は、上述した従来技術による問題点を解消するため、ハードウェアとソフトウェアの協調動作のデバッグを効率的に行うことができるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、特定の関数に関する情報を記憶領域に格納し、シミュレーションの結果と記憶領域に格納された特定の関数に関する情報とを時系列で対応付けて表示するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【0009】
また、本発明の他の側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、特定の関数に対応するハードウェアモデルが満たすべき条件を検証するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【0010】
また、本発明の他の側面によれば、ハードウェアモデルを用いてシミュレーションし、ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、ソフトウェアの実行中に、ハードウェアモデルにアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得し、特定の関数に関する情報が取得された場合、取得時点におけるハードウェアモデルの状態と特定の関数との組を特定し、ハードウェアモデルが遷移可能な状態とソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【発明の効果】
【0011】
本発明の一側面によれば、協調動作のデバッグを効率的に行うことができるという効果を奏する。
【図面の簡単な説明】
【0012】
【図1】図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。
【図2】図2は、実施の形態1にかかるシミュレーション装置のハードウェアの一例を示すブロック図である。
【図3】図3は、実施の形態1にかかるシミュレーション装置の機能例を示すブロック図である。
【図4】図4は、実施の形態1にかかるCPUモデルの機能例を示す説明図である。
【図5】図5は、実施の形態1にかかるシミュレーション装置の動作例を示すシーケンス図である。
【図6】図6は、実施の形態1における入力データ群の一例を示す説明図である。
【図7】図7は、関数名スタック領域の記憶内容の変更例を示す説明図である。
【図8】図8は、C−SVインターフェースのソースコードの一例である。
【図9】図9は、関数名格納部のソースコードの一例である。
【図10】図10は、CPUモデルでの関数名を時系列で表示した例を示す説明図である。
【図11】図11は、enter−hook関数の処理例を示すフローチャートである。
【図12】図12は、exit−hook関数の処理例を示すフローチャートである。
【図13】図13は、実施の形態1にかかるC−SVインターフェースの処理の一例を示すフローチャートである。
【図14】図14は、実施の形態2にかかるシミュレーション装置の機能例を示すブロック図である。
【図15】図15は、実施の形態2にかかるCPUモデルの機能例を示す説明図である。
【図16】図16は、実施の形態2にかかるシミュレーション装置の動作例を示すシーケンス図である。
【図17】図17は、実施の形態2における入力データの一例を示す説明図である。
【図18】図18は、事前事後条件チェックデータの記憶内容の一例を示す説明図である。
【図19】図19は、イベント発行部のソースコードの一例である。
【図20】図20は、チェッカファイルのソースコードの一例である。
【図21】図21は、実施の形態2にかかるC−SVインターフェースの処理の一例を示すフローチャートである。
【図22】図22は、事前条件チェック処理の一例を示すフローチャートである。
【図23】図23は、事後条件チェック処理の一例を示すフローチャートである。
【図24】図24は、実施の形態3にかかるシミュレーション装置の機能例を示すブロック図である。
【図25】図25は、実施の形態3にかかるCPUモデルの機能例を示す説明図である。
【図26】図26は、実施の形態3におけるシミュレーション装置の動作例を示すシーケンス図である。
【図27】図27は、実施の形態3における入力データの一例を示す説明図である。
【図28】図28は、関数名の抽出例を示す説明図である。
【図29】図29は、有限状態マシンの状態の抽出例を示す説明図である。
【図30】図30は、関数名と有限状態マシンの状態との組合せ例を示す説明図である。
【図31】図31は、カバレッジモデルファイルのソースコードの一例を示す説明図である。
【図32】図32は、カバレッジの出力例を示す説明図である。
【図33】図33は、カバレッジモデルファイルの生成処理の一例を示すフローチャートである。
【図34】図34は、カバレッジ計測処理の一例を示すフローチャートである。
【発明を実施するための形態】
【0013】
以下に添付図面を参照して、本実施の形態にかかるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムの実施の形態を詳細に説明する。
【0014】
(実施の形態1)
図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。シミュレーション装置100は、ソフトウェア101を実行しつつ、ハードウェアモデル102を用いて論理シミュレータ103によるシミュレーションを実行している。具体的に、シミュレーション装置100は、ソフトウェア101のコードのうちハードウェアモデル102にアクセスする場合にハードウェアモデル102を用いてシミュレーションする。
【0015】
また、シミュレーション装置100は、ハードウェアモデル102にアクセスしない場合にソフトウェア101を実行する。なお、ハードウェアモデル102にアクセスする処理としては、たとえば、デバイスドライバなどである。また、シミュレーション装置100は、シミュレーションの結果を波形ビューワ111を用いて表示している。
【0016】
実施の形態1にかかるシミュレーション装置100では、ハードウェアモデル102のシミュレーションの結果とソフトウェア101が実行する関数名を時系列で対応付けて表示することで、協調動作のデバッグを効率的に行うことを目的としている。
【0017】
なお、ソフトウェア101は、たとえば、C言語、またはC++言語で記述されたソースコードがコンパイルされて生成された実行オブジェクトであることを想定している。ハードウェアモデル102は、ハードウェア記述言語(HDL:Hardware Description Language)で記述されている。より詳細には、ハードウェアモデル102は、レジスタ転送レベル(RTL:Register Transfer Level)で記述された、検証対象のハードウェアのHDLデータである。論理シミュレータ103は、たとえば、ハードウェア記述言語とハードウェア検証言語を統合したSystemVerilogで記述されたファイルを読み込んでシミュレーションを実行する。
【0018】
このような動作を行うシミュレーション装置100は、初めに、ソフトウェア101の実行中に、ハードウェアモデル102にアクセスする特定の関数が実行される場合、後述するhook関数実行部411側にて特定の関数の関数名を取得する。図1の例であれば、シミュレーション装置100は、DMA(Direct Memory Access)を行うハードウェアのDMA設定を行う関数である“Config_dma”が実行される場合、ソフトウェア101がC−SVインターフェース104を呼び出す。
【0019】
C−SV(SystemVerilog)インターフェース104は、C言語で記述された処理系から、SystemVerilogで記述された処理を呼び出すことができる機構である。具体的に、C−SVインターフェース104は、SystemVerilogの標準言語仕様であるDPI(Direct Programming Interface)を用いて、C言語により実装された機能部との情報のやり取りを行う。
【0020】
次に、C−SVインターフェース104は、関数名を記憶領域に格納する。また、論理シミュレータ103も、ハードウェアモデル102のシミュレーションの結果を記憶領域に格納する。波形ビューワ111は、記憶領域に格納されたシミュレーションの結果と関数名とを、時系列で対応付けて表示する。たとえば、図1の例では、波形ビューワ111は、900[ns]において、ハードウェアのレジスタが設定されている0x00100004に0x11223344が書き込まれているというシミュレーションの結果と、“config_dma”を表示している。
【0021】
このように、シミュレーション装置100は、ソフトウェア101にて実行中の関数名をハードウェアモデル102側が取得し、波形ビューワ111がハードウェアモデル102のシミュレーションの結果と関数名を時系列で表示する。これにより、ユーザは、ハードウェアへモデルの動作の契機となった関数を容易に特定でき、協調動作のデバッグを効率的に行える。以下、図2〜図13にて、実施の形態1にかかるシミュレーション装置100について説明を行う。
【0022】
(シミュレーション装置100のハードウェア)
図2は、実施の形態1にかかるシミュレーション装置のハードウェアの一例を示すブロック図である。図2において、シミュレーション装置100は、CPU201と、ROM(Read‐Only Memory)202と、RAM(Random Access Memory)203と、を含む。また、シミュレーション装置100は、磁気ディスクドライブ204と、磁気ディスク205と、光ディスクドライブ206と、光ディスク207と、を含む。また、ユーザやその他の機器との入出力装置としてシミュレーション装置100は、ディスプレイ208と、インターフェース209と、キーボード210と、マウス211と、を含む。また、各部はバス212によってそれぞれ接続されている。
【0023】
ここで、CPU201は、シミュレーション装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶している。RAM203は、CPU201のワークエリアとして使用される。磁気ディスクドライブ204は、CPU201の制御にしたがって磁気ディスク205に対するデータのリードおよびライトを制御する。磁気ディスク205は、磁気ディスクドライブ204の制御で書き込まれたデータを記憶する。
【0024】
光ディスクドライブ206は、CPU201の制御にしたがって光ディスク207に対するデータのリードおよびライトを制御する。光ディスク207は、光ディスクドライブ206の制御で書き込まれたデータを記憶したり、光ディスク207に記憶されたデータをコンピュータに読み取らせたりする。なお、ROM202、磁気ディスク205、光ディスク207のいずれかの記憶装置に、本実施の形態にかかるシミュレーションプログラムが格納されていてもよい。
【0025】
ディスプレイ208は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ208は、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【0026】
インターフェース209は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク213に接続され、ネットワーク213を介して他の装置に接続される。そして、インターフェース209は、ネットワーク213と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。インターフェース209には、たとえばモデムやLANアダプタなどを採用することができる。
【0027】
キーボード210は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード210は、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス211は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。また、シミュレーション装置100は、マウス211の代わりとして、ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
【0028】
(シミュレーション装置100の機能)
次に、シミュレーション装置100の機能について説明する。図3は、実施の形態1にかかるシミュレーション装置の機能例を示すブロック図である。シミュレーション装置100は、実行部301と、実行部302と、取得部303と、格納部304と、表示部305と、更新部306と、を含む。この制御部となる機能(実行部301〜更新部306)は、記憶装置に記憶されたプログラムをCPU201が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などである。また制御部となる機能は、インターフェース209を経由して他のCPUが実行することにより、その機能を実現してもよい。
【0029】
また、シミュレーション装置100は、関数名を格納する関数名スタック領域311にアクセス可能である。関数名スタック領域311は、ROM202、RAM203、磁気ディスク205、光ディスク207等といったいずれかの記憶領域内に存在する。
【0030】
実行部301は、ハードウェアモデル102を用いてシミュレーションする機能を有する。たとえば、実行部301は、CPU以外の周辺デバイス等のハードウェアモデル102を用いてシミュレーションする。実行部301は、たとえば、論理シミュレータ103が有する機能である。なお、シミュレーションの結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0031】
実行部302は、実行部301との協調動作によりソフトウェア101を実行する機能を有する。たとえば、実行部302は、シミュレーション装置100向けにコンパイルされた実行オブジェクトを実行する。また、実行部302は、協調動作として、ソフトウェア101内にハードウェアモデル102にアクセスする場合、アクセス先のアドレス、データ等を実行部301に通知する。なお、実行結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0032】
取得部303は、ソフトウェア101の実行中に、ハードウェアモデル102にアクセスする特定の関数が実行される場合、特定の関数に関する情報を取得する機能を有する。特定の関数に関する情報としては、たとえば、デバイスドライバ内の関数である。取得部303は、たとえば、ハードウェアモデル102にアクセスするデバイスドライバ内の関数が実行される場合、関数名を取得する。具体的な取得方法として、取得部303は、特定の関数が開始された場合に、関数が格納されたアドレスを受け付け、アドレスから、関数名を取得する。
【0033】
また、取得部303は、更新部306によって更新された他の記憶領域となる関数名スタック領域311のうち、最上位に格納された情報を取得してもよい。なお、取得した情報、または、情報が格納されているアドレスが、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0034】
格納部304は、取得部303によって特定の関数に関する情報が取得された場合、特定の関数に関する情報を記憶領域に格納する機能を有する。たとえば、格納部304は、関数名を記憶領域に格納する。また、格納部304は、実行部301のシミュレーションの結果と併せて記憶領域に格納してもよい。たとえば、格納部304は、記憶領域に、”1、0、0、1、h 00100004、h 00000000、h 11223344、1”、“config_dma”と格納する。なお、記憶領域とは、RAM203、磁気ディスク205、光ディスク207などである。
【0035】
表示部305は、実行部301のシミュレーションの結果と記憶領域に格納された特定の関数に関する情報とを時系列で対応付けて表示する機能を有する。たとえば、記憶領域に、”1、0、0、1、h 00100004”、“config_dma”と格納されている場合を想定する。このとき、表示部305は、1または0の値を、波形として表示し、hから始まる16進数の値と、関数名を文字列としてそのまま表示する。さらに、表示部305は、格納された情報を時系列で対応付けて表示する方法として、たとえば、画面内の横方向の位置をそろえて、各情報を表示する。たとえば、900[ns]での各情報の値を、横方向の位置をそろえて、縦に連なるように表示する。
【0036】
なお、表示部305は、波形ビューワ111の機能であり、ディスプレイ208に対して表示してもよいし、画像データとして、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶してもよい。
【0037】
更新部306は、ソフトウェア101の実行中に、特定の関数が実行される場合、ソフトウェア101内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を特定の関数に関する情報で更新する機能を有する。ここで、他の記憶領域とは、格納部304によって関数名が格納されている記憶領域とは別の領域であり、関数名スタック領域311である。たとえば、更新部306は、特定の関数が実行される場合、関数名スタック領域311を特定の関数の関数名で更新する。
【0038】
また、更新部306は、ソフトウェア101の実行中に、特定の関数が開始される場合、他の記憶領域の最上位に特定の関数に関する情報を挿入してもよい。たとえば、更新部306は、config_dma関数を開始する場合に、関数名スタック領域311に“config_dma”を挿入する。
【0039】
また、更新部306は、ソフトウェア101の実行中に、特定の関数が終了される場合、他の記憶領域の最上位に格納された情報を削除してもよい。たとえば、更新部306は、config_dma関数を終了する場合に、関数名スタック領域311の最上位に格納されている“config_dma”を削除する。
【0040】
図4は、実施の形態1にかかるCPUモデルの機能例を示す説明図である。CPUモデル400は、C言語により実装される機能部と、SystemVerilogによる実装される機能部とがある。CPUモデル400は、ソフトウェア実行部401とバスドライバ部402と、デバッグ情報格納部403を含む。ソフトウェア実行部401とバスドライバ部402は、C言語によって実装されており、デバッグ情報格納部403は、C言語とSystemVerilogによって実装されている。
【0041】
ソフトウェア実行部401は、シミュレーション開始時にソフトウェア101のメインルーチンを呼び出したり、割込発生時に割込ハンドラに処理を移したりする。バスドライバ部402は、CPUモデル400以外となるハードウェアモデル102へのレジスタアクセスをCPUインターフェースプロトコルに変換する。
【0042】
デバッグ情報格納部403は、デバッグ情報の格納を行う。また、デバッグ情報格納部403は、hook関数実行部411と、関数名スタック領域311と、C−SV(SystemVerilog)インターフェース104と、関数名格納部412と、を含む。hook関数実行部411は、C言語による実装であり、関数名スタック領域311は、記憶領域であり、関数名格納部412は、SystemVerilogによる実装である。
【0043】
hook関数実行部411は、ソフトウェア101中で、特定の関数を開始する場合、または終了する場合に自動的に呼び出される関数である。具体的な実装方法の一例として、ソフトウェア101をコンパイルするソフトウェアとして、GCC(GNU Compiler Collection)を用いた場合を想定する。GCCは、コンパイルオプションに−finstrument−functionsが設定された場合、特定の関数の先頭に__cyg_profile_func_enter()関数を呼び出すコードをオブジェクトコードに追加する。また、GCCは、末尾に__cyg_profile_func_exit()関数を呼び出すコードをオブジェクトコードに追加する。
【0044】
このように、特定の関数の開始時に実行される関数を、以下の説明では、“enter−hook関数”、特定の関数の終了時に実行されるhook関数を“exit−hook関数”と呼称する。enter−hook関数、exit−hook関数は、第1引数に特定の関数のアドレスが渡される。enter−hook関数の処理例については、図11にてフローチャートを用いて説明し、exit−hook関数の処理例については、図12にてフローチャートを用いて説明する。
【0045】
なお、コンパイルオプションは、一般的に、ソースファイルごとに異なる設定にすることが可能である。したがって、−finstrument−functionsが設定されたソースファイル内の関数が、特定の関数となる。さらに、−finstrument−functionsが設定されたファイル内にて、no_instrument_functionという関数属性を設定することで、一部の関数にて、hook関数の呼出を無効に設定することも可能である。
【0046】
設定方法として、たとえば、デバイスドライバをコンパイルする場合、API(Application Program Interface)の関数を記述したファイルにはhook関数の呼出を無効に設定し、ハードウェアのレジスタにアクセスする関数を記述したファイルにはhook関数の呼出を有効に設定してもよい。この場合、デバイスドライバのバイナリに関して、最小限の変更で協調動作のデバッグを行うことができる。また、デバイスドライバの全てのソースファイルにhook関数の呼出を有効に設定してもよい。この場合、関数名スタック領域311に、デバイスドライバ内の関数の呼出履歴が格納されるため、ユーザに対してよりデバッグを容易にすることができる。
【0047】
関数名スタック領域311は、関数の呼出履歴を記憶する領域である。関数名スタック領域311の具体的な記憶内容の変更例を図7に示す。C−SVインターフェース104は、hook関数実行部411から実行可能なタスクを提供する。図13にてC−SVインターフェース104の処理の一例をフローチャートを用いて説明する。関数名格納部412は、現在実行中の関数名の文字列を波形表示するための信号を有し、関数名を波形ビューワ111に表示する。なお、関数名格納部412の具体的なソースコードの一例については、図9、図13にて説明する。
【0048】
図5は、実施の形態1にかかるシミュレーション装置の動作例を示すシーケンス図である。アプリ501、デバイスドライバ502は、ソフトウェア実行部401により実行されるソフトウェアである。アプリ501は、アプリケーションソフトウェアであり、たとえば、事務作業を支援するワードプロセッサ、表計算アプリ、映像や音声を再生する動画再生アプリ等である。デバイスドライバ502は、デバイスを制御するソフトウェアである。たとえば、アプリ501が動画再生アプリであれば、デバイスドライバ502は、音声の再生を行うサウンドモジュールを制御するドライバであったり、大量の映像データを高速に転送するDMAC(DMA Controller)の動作を制御するドライバであったりする。
【0049】
なお、アプリ501、デバイスドライバ502、hook関数実行部411、C−SVインターフェース104、関数名格納部412はCPU201による実行によって各機能を実現する。
【0050】
初めに、アプリ501は、デバイスドライバ502内の特定の関数を呼び出す(ステップS511)。特定の関数が呼び出されたデバイスドライバ502は、enter_hook関数を呼び出す(ステップS512)。なお、enter_hook関数の第1引数には、特定の関数のアドレスが格納されている。呼び出されたhook関数実行部411は、enter_hook関数の処理として、関数名を取得し(ステップS513)、DPIで実装されているset_current_fnameを実行する(ステップS514)。set_current_fnameの第1引数には、取得した関数名が格納されており、第2引数には、enter_flag=1が格納されている。set_current_fnameの詳細は、図13にて説明する。
【0051】
enter_flag=1が格納されたset_current_fnameの呼出により、C−SVインターフェース104は、関数名を記憶領域に格納する(ステップS515)。また、論理シミュレータ103は、ハードウェアモデル102を用いてシミュレーションを実行し(ステップS516)、結果を記憶領域に格納する(ステップS517)。表示部305は、格納された関数名とシミュレーションの結果をディスプレイ208の波形ビューワ111に表示する(ステップS518)。
【0052】
次に、デバイスドライバ502が、特定の関数を終了し、呼出元へ復帰する場合(ステップS521)、exit_hook関数を呼び出す(ステップS522)。なお、exit_hook関数の第1引数には、特定の関数のアドレスが格納されている。呼び出されたhook関数実行部411は、exit_hook関数の処理として、関数名を取得し(ステップS523)、DPIで実装されているset_current_fnameを実行する(ステップS524)。set_current_fnameの第1引数には、取得した関数名が格納されており、第2引数には、enter_flag=0が格納されている。
【0053】
enter_flag=0が格納されたset_current_fnameの呼出により、C−SVインターフェース104は、関数名を記憶領域に格納する(ステップS525)。また、論理シミュレータ103は、シミュレーションの結果を記憶領域に格納する(ステップS526)。表示部305は、格納された関数名とシミュレーションの結果をディスプレイ208の波形ビューワ111に表示する(ステップS527)。
【0054】
図6は、実施の形態1における入力データ群の一例を示す説明図である。論理シミュレータ103への入力データ、または入力データの元となるデータとして、ヘッダファイル601と、ソースコード602と、ハードウェアモデル102と、実行オブジェクト611がある。
【0055】
ヘッダファイル601は、拡張子が“.h”となるファイルであり、関数のプロトタイプ宣言等が記述されている。ソースコード602は、拡張子が“.c”となるファイルであり、関数の処理内容が記載されている。
【0056】
シミュレーション装置100は、ソースコード602にヘッダファイル601を含め、さらにhook関数が有効となるコンパイルオプションを設定して、シミュレーション装置100向けにコンパイルを行う。結果、シミュレーション装置100は、拡張子が“.o”となる実行オブジェクト611を生成する。次に、シミュレーション装置100は、論理シミュレータ103に、CPUモデル400と実行オブジェクト611とハードウェアモデル102を入力し、ハードウェアモデル102の応答信号とCPUモデル400のソフトウェアデバッグ情報を波形ビューワ111にて表示する。具体的な表示例については、図10にて説明を行う。
【0057】
なお、従来例にかかるシミュレーション装置は、ハードウェアモデル102の応答信号を波形ビューワにて表示し、CPUモデル400のソフトウェアデバッグ情報をソースコードデバッガで表示していた。従来例のようなハードウェアモデルとソフトウェアのデバッグ環境が異なる場合、たとえば「ある時刻でハードウェアのレジスタをアクセスしているのは、ソフトウェア中のどの関数か?」といった事象を調べることは困難であった。理由としては以下の2つが存在する。
【0058】
1つ目の理由として、ソースコードデバッガは論理シミュレータのように時刻の概念を持たないため、ある時刻ではどの関数を処理しているか特定することが困難となるためである。また、2つ目の理由として、波形ビューワは信号値を時系列にトレースできるが、これはハードウェアをトレースしたものであり、ある時刻でソフトウェアのどの関数が動作していたかを判別することが難しいためである。
【0059】
図7は、関数名スタック領域の記憶内容の変更例を示す説明図である。関数名スタック領域311は、関数の呼出履歴を記憶しており、最上部の要素は現在実行中の関数の関数名であり、最上部の要素より下の要素は、一つ上の要素が示す関数の呼出元の関数名である。図7では、実行オブジェクト611が実行された場合の関数名スタック領域311の変更例を示している。
【0060】
初めに、CPUモデル400がmain_tsk関数を呼び出し、main_tsk関数の中でdma_transfer関数を呼び出し、dma_transfer関数の中でconfig_dma関数を呼び出した状態で、ラベルAを実行する状態を想定する。この状態での関数名スタック領域311_Aは、最上位の要素として、“config_dma”を格納しており、上から2番目の要素に“dma_transfer”を格納しており、上から3番目の要素に“main_tsk”を格納している。
【0061】
次に、CPUモデル400がconfig_dma関数を終了し、dma_transfer関数のラベルBを実行する状態を想定する。この状態での関数名スタック領域311_Bは、最上位の要素に“dma_transfer”を格納しており、上から2番目の要素に“main_tsk”を格納している。このように、関数名スタック領域311の最上位の要素は、現在実行中の関数を格納している。
【0062】
図8は、C−SVインターフェースのソースコードの一例である。ソースコード801は、DPIを用いて、hook関数実行部411から呼出可能なSystemVerilogのタスクであるset_current_fnameを示している。set_current_fnameの第1引数であるfnameには、取得した関数名が格納される。set_current_fnameの第2引数であるenter_flagには、fnameで示す関数が開始された場合に1が格納され、別の関数が終了し、fnameで示す関数が復帰した場合に0が格納される。なお、具体的なset_current_fnameの処理については、図13にて後述する。
【0063】
図9は、関数名格納部のソースコードの一例である。図9では、関数名格納部412のうち、変数定義部分を示している。表示の処理については、図13にて後述する。ソースコード901で示す、文字列型変数current_fnameは、現在実行中の関数名を表示する信号を格納する変数である。current_fnameに格納された信号は、C−SVインターフェース104の中でドライブされる。
【0064】
図10は、CPUモデルでの関数名を時系列で表示した例を示す説明図である。図10では、波形ビューワ111の表示例を示している。波形ビューワ111は、記憶領域に格納されたシミュレーションの結果と関数名を表示する。記憶領域には、たとえば、”1、0、0、1、h 00100004、h 00000000、h 11223344 1”、“config_dma”、”0、0、0、1、h 00100004、h 00000000、h 11223344”、“config_dma”、…といったように格納している。
【0065】
図10で示す波形ビューワ111は、900[ns]における各信号値を表示している。具体的に、CPU_CLK信号は“1”を出力しており、関数名を示すfname信号は“config_dma”を出力している。また、CPU_CS_N信号は“0”を出力しており、CPU_WR_N信号は“0”を出力しており、CPU_RD_N信号は“1”を出力している。また、CPU_ADR信号は“0x00100004”を出力しており、CPU_RDAT信号は“0x00000000”を出力しており、CPU_WDAT信号は“0x11223344”を出力しており、CPU_RDV信号は、“1”を出力している。
【0066】
このように、波形ビューワ111は、config_dma関数が0x00100004番地への0x11223344の書込要求を発行したことをユーザに容易に特定させることができる。関数名を表示していなければ、たとえば、書込要求が不正であった場合、ユーザは、書込要求が発行されたことは特定できるが、どの関数で書込要求が行われたかを特定することができず、デバッグ作業を効率的に行えない。
【0067】
図11は、enter−hook関数の処理例を示すフローチャートである。初めに、シミュレーション装置100は、第1引数のアドレスから、特定の関数の関数名を取得する(ステップS1101)。次に、シミュレーション装置100は、set_current_fnameの実行により、取得した関数名およびenter_flag=1をC−SVインターフェース104に通知する(ステップS1102)。続けて、シミュレーション装置100は、関数名スタック領域311に、取得した関数名をプッシュし(ステップS1103)、enter−hook関数の処理を終了する。
【0068】
図12は、exit−hook関数の処理例を示すフローチャートである。シミュレーション装置100は、関数名スタック領域311から、最上部の関数名をポップする(ステップS1201)。次に、シミュレーション装置100は、関数名スタック領域311の最上部から、関数名を取得する(ステップS1202)。続けて、シミュレーション装置100は、set_current_fnameの実行により、取得した関数名およびenter_flag=0をC−SVインターフェース104に通知し(ステップS1203)、exit−hook関数の処理を終了する。
【0069】
図13は、実施の形態1にかかるC−SVインターフェースの処理の一例を示すフローチャートである。シミュレーション装置100は、関数名格納部412にある文字列型信号に関数名を表示し(ステップS1301)、C−SVインターフェース104の処理を終了する。なお、実施の形態1にかかるC−SVインターフェース104では、enter_flagを参照しないため、実施の形態1にかかるset_current_fnameは、第1引数だけでもよい。
【0070】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、ソフトウェアにて実行中の関数名をハードウェアモデル側が取得して、ハードウェアモデルの波形と併せて関数名を表示する。これにより、ユーザは、ハードウェアの動作の契機となった関数を容易に特定でき、協調動作のデバッグを効率的に行える。
【0071】
また、シミュレーション装置は、ソフトウェア内の関数に関する情報をスタック領域に格納してもよい。具体的に、シミュレーション装置は、特定の関数が開始する場合にスタック領域の最上位に挿入し、特定の関数が終了する場合にスタック領域の最上位の情報を削除する。これにより、スタック領域の最上位には、つねに実行中の関数に関する情報が格納されているため、シミュレーション装置は、容易に現在実行中の関数の情報を取得できる。
【0072】
また、シミュレーション装置は、シミュレーションの実行に関する、論理シミュレータによる処理系とC言語による処理系の違いはそのままに、ハードウェアとソフトウェアの協調動作のデバッグ作業を論理シミュレータ側に持ち込んでいる。これにより、シミュレーション装置は、処理系の違いを軽減し、ユーザにデバッグしやすい環境を提供することができる。
【0073】
また、実施の形態1にかかるシミュレーション装置は、ソフトウェアのソースコードやハードウェアモデルのソースコードの変更なしに、ソフトウェアの関数コールの情報を波形トレースできる。このように、ハードウェアもソフトウェアも同一のデバッグ環境になるため、ユーザは、協調動作を確認しやすくなる。また、波形ビューワは一般的な論理シミュレータにバンドルされている機能であるため、ユーザは、シミュレータの種類によらず、デバッグ情報を閲覧できる。
【0074】
(実施の形態2)
実施の形態1にかかるシミュレーション装置100は、ハードウェアモデル102のシミュレーションの結果と関数名を波形ビューワ111に表示することで、ユーザに対して協調動作のデバッグを効率的に行えるようにしていた。C言語の処理系とハードウェア記述言語の処理系との協調動作のデバッグの別の問題として、特定の関数を実行する際に、ハードウェアが満たすべき条件が満たされているのかを検証するのが困難である。具体的には、ハードウェアの動作を検証する仕組みであるアサーション言語は、ハードウェアの動作を検証することはできるが、ソフトウェア101がどのような状態にあるのかを検出することが困難である。
【0075】
実施の形態2にかかるシミュレーション装置100は、関数の実行に対してハードウェアの事前条件、事後条件が満たされているか否かを検証する。以下、図14〜図23を用いて実施の形態2にかかるシミュレーション装置100の説明を行う。なお、実施の形態2にかかるシミュレーション装置100のハードウェアは、実施の形態1にかかるシミュレーション装置100のハードウェアと同一であるため、説明を省略する。
【0076】
図14は、実施の形態2にかかるシミュレーション装置の機能例を示すブロック図である。ここで、実施の形態1と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態2にかかるシミュレーション装置100は、実行部301と、実行部302と、取得部303と、更新部306と、検証部1401と、表示部1402と、を含む。この制御部となる機能(実行部301〜表示部1402)は、記憶装置に記憶されたプログラムをCPU201が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などである。
【0077】
また制御部となる機能は、インターフェース209を経由して他のCPUが実行することにより、その機能を実現してもよい。また、シミュレーション装置100は、関数名を格納する関数名スタック領域311にアクセス可能である。
【0078】
検証部1401は、取得部303によって特定の関数に関する情報が取得された場合、特定の関数に対応するハードウェアモデル102が満たすべき条件を検証する機能を有する。たとえば、検証部1401は、関数が開始される場合には事前条件をチェックし、関数が終了する場合には事後条件をチェックする。なお、検証結果は、ROM202、RAM203、磁気ディスク205、光ディスク207に存在する。
【0079】
表示部1402は、検証部1401による検証結果を表示する機能を有する。たとえば、表示部1402は、検証結果がNGである場合、対応する時刻にてNGであることを意味する情報を表示する。NGであることを意味する情報は、たとえば、該当時刻の背景色が変化したり、または、NGを示す文章を表示することであってもよい。
【0080】
図15は、実施の形態2にかかるCPUモデルの機能例を示す説明図である。ここで、実施の形態1と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態2にかかるCPUモデル1500は、ソフトウェア実行部401とバスドライバ部402と、デバッグ情報格納部1501を含む。デバッグ情報格納部1501は、C言語とSystemVerilogによって実装されている。また、CPUモデル1500と連携して動作する機能部として、チェッカ生成部1511とチェッカ実行部1512がある。
【0081】
デバッグ情報格納部1501は、デバッグ情報の格納を行う。また、デバッグ情報格納部1501は、hook関数実行部411と、関数名スタック領域311と、C−SVインターフェース1502と、関数名格納部412と、イベント発行部1503を含む。
【0082】
C−SVインターフェース1502は、hook関数実行部411から実行可能なタスクを提供する。イベント発行部1503は、チェッカ実行部1512にイベントを発行する。チェッカ生成部1511は、事前条件および事後条件のチェックを行うSystemVerilogのソースコードを生成する。チェッカ実行部1512は、イベントを受け付けた場合、チェッカ生成部1511が生成したSystemVerilogのソースコードを用いて、受け付けたイベントに応じたチェックを実行する。
【0083】
図16は、実施の形態2にかかるシミュレーション装置の動作例を示すシーケンス図である。なお、ステップS1601〜ステップS1608、ステップS1611〜ステップS1614、ステップS1617〜ステップS1619は、ステップS511〜ステップS518、ステップS521〜ステップS527と同一の処理であるため、説明を省略する。
【0084】
enter_flag=1が格納されたset_current_fnameの呼出により、C−SVインターフェース1502は、ステップS1605の処理の後、イベント発行部1503によりチェッカ実行部1512にenterイベントを発行する(ステップS1609)。enterイベントを受け付けたチェッカ実行部1512は、事前条件をチェックする(ステップS1610)。
【0085】
enter_flag=0が格納されたset_current_fnameの呼出により、C−SVインターフェース1502は、イベント発行部1503によりチェッカ実行部1512にexitイベントを発行する(ステップS1615)。exitイベントを受け付けたチェッカ実行部1512は、事後条件をチェックする(ステップS1616)。なお、C−SVインターフェース1502は、ステップS1615の処理後、ステップS1617を実行する。
【0086】
図17は、実施の形態2における入力データの一例を示す説明図である。論理シミュレータ103への入力データ、または入力データの元となるデータとして、CPUモデル1500、ヘッダファイル601、ソースコード602、ハードウェアモデル102、実行オブジェクト611、事前事後条件チェックデータ1701、チェッカファイル1702がある。なお、入力データのうち、ヘッダファイル601、ソースコード602、ハードウェアモデル102、実行オブジェクト611については、実施の形態1と同様であるため、説明を省略する。
【0087】
事前事後条件チェックデータ1701は、関数の開始時にハードウェアが満たしているべき事前条件と、関数の終了時にハードウェアが満たしているべき事後条件と、を記憶するデータである。事前事後条件チェックデータ1701の詳細については、図18にて説明する。
【0088】
チェッカファイル1702は、チェッカ生成部1511により事前事後条件チェックデータ1701に基づいて生成された、事前事後条件チェックデータ1701の事前条件と事後条件をチェックするファイルである。なお、チェッカファイル1702は、拡張子が“.sv”となるSystemVerilog用のソースコードである。チェッカファイル1702の詳細については、図20にて説明する。
【0089】
図18は、事前事後条件チェックデータの記憶内容の一例を示す説明図である。表1801は、事前事後条件チェックデータ1701の元となるファイルとなる、ハードウェアのユースケース記述の一例である。
【0090】
表1801には、ユースケース名、ハードウェアの概要、アクター、事前条件、基本フロー、事後条件という6つのフィールドが記述されている。たとえば、ハードウェアが転送する場合には、事前条件として、コントロールレジスタのstartビットが0であるという条件が満たされていることが要求される。また、ハードウェアの転送が終了した場合には、事後条件として、コントロールレジスタのstartビットが0にクリアされているという条件が満たされていることが要求される。
【0091】
次に、シミュレーション装置100は、機械的な文字列操作により、表1801から、事前条件フィールドと事後条件フィールドに基づいて、事前事後条件チェックデータ1701を生成する。図18に示す事前事後条件チェックデータ1701は、レコード1701−1、レコード1701−2を登録している。
【0092】
事前事後条件チェックデータ1701は、関数名、イベント種別、チェック内容という3つのフィールドを含む。関数名フィールドには、事前条件や事後条件をチェックする関数名が格納される。イベント種別フィールドには、事前条件であれば“OnEnter”、事後条件であれば“OnExit”が格納される。チェック内容フィールドには、チェックを行う、時間記述を含まないBOOL式が格納される。
【0093】
たとえば、レコード1701−1は、<関数名>で示す関数を開始する事前条件として、startビットが0であるか否かをチェックする内容であることを示している。同様に、レコード1701−2は、<関数名>を終了する事後条件として、startビットが0であるか否かをチェックする内容であることを示している。
【0094】
図19は、イベント発行部のソースコードの一例である。図19では、イベント発行部1503のうち、変数定義部分を示している。イベント発行の処理については、図21にて後述する。ソースコード1901で示す、event型変数e_enterは、関数を開始するときに発行されるイベントであり、event型変数e_exitは、関数を終了するときに発行されるイベントである。
【0095】
図20は、チェッカファイルのソースコードの一例である。図20では、チェッカ生成部1511によって事前事後条件チェックデータ1701から生成されたチェッカファイル1702の一例を示している。たとえば、チェッカファイル1702には、事前条件のチェッカとして、enterイベントを受け付けた場合、開始する関数名で処理分岐を行い、事前事後条件チェックデータ1701のチェック内容フィールドにて示していたBOOL式を実行する。なお、BOOL式で事前条件が満たされなかった場合、シミュレーション装置100は、たとえば、波形ビューワ111に事前条件が満たされなかった旨を表示してもよい。
【0096】
図21は、実施の形態2にかかるC−SVインターフェースの処理の一例を示すフローチャートである。シミュレーション装置100は、enter_flagの値を確認する(ステップS2101)。enter_flag=1である場合(ステップS2101:1)、シミュレーション装置100は、関数名格納部412の文字列型信号にある関数名を表示する(ステップS2102)。次に、シミュレーション装置100は、イベント発行部1503により、enterイベントをチェッカ実行部1512に発行し(ステップS2103)、C−SVインターフェースの処理を終了する。
【0097】
また、enter_flag=0である場合(ステップS2101:0)、シミュレーション装置100は、exitイベントをチェッカ実行部1512に発行する(ステップS2104)。次に、シミュレーション装置100は、関数名格納部412にある文字列型信号に格納された関数名を表示し(ステップS2105)、C−SVインターフェースの処理を終了する。
【0098】
図22は、事前条件チェック処理の一例を示すフローチャートである。シミュレーション装置100は、CPUモデル1500からenterイベントを受け付ける(ステップS2201)。次に、シミュレーション装置100は、関数名格納部412から関数名を取得し(ステップS2202)、関数名を確認する(ステップS2203)。関数名が関数1である場合(ステップS2203:関数1)、シミュレーション装置100は、関数1のチェックを実行し(ステップS2204)、ステップS2201の処理に移行する。
【0099】
関数名が関数2である場合(ステップS2203:関数2)、シミュレーション装置100は、関数2のチェックを実行し(ステップS2205)、ステップS2201の処理に移行する。関数名が関数nである場合(ステップS2203:関数n)、シミュレーション装置100は、関数nのチェックを実行し(ステップS2203+n)、ステップS2201の処理に移行する。なお、nは1以上の整数である。
【0100】
図23は、事後条件チェック処理の一例を示すフローチャートである。図23で示すフローチャートは、ステップS2301を除いて図22で示したフローチャートと同一であるため、ステップS2302〜ステップS2303+nの説明を省略する。シミュレーション装置100は、CPUモデル1500からexitイベントを受け付ける(ステップS2301)。次に、シミュレーション装置100は、ステップS2302の処理に移行する。
【0101】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、関数の実行に対応する事前条件、事後条件をチェックするコードを実行する。これにより、ユーザは、ソフトウェアの動作に対してハードウェアの事前条件、事後条件が満たされているかを自動で得ることができるようになり、ユーザ自身が確認しなくてよくなり、協調動作のデバッグを効率的に行える。
【0102】
また、実施の形態2にかかるシミュレーション装置は、ソフトウェアのソースコードやハードウェアモデルのソースコードの変更なしに、ソフトウェアがハードウェアに対して特定の操作の事前条件や事後条件をハードウェアと一緒にチェックできる。また、シミュレーション装置は、C言語記述のソフトウェアの関数コールや復帰をSystemVerilogのイベントに変換している。これにより、シミュレーション装置は、本来ハードウェアをチェックする機構であるSVA(SystemVerilog Assertion)やPSL(Property Specification Language)などのアサーション言語で記述したチェッカを用いて協調動作をチェックできるようになる。
【0103】
(実施の形態3)
実施の形態2にかかるシミュレーション装置100は、関数の実行に対してハードウェアの事前条件、事後条件が満たされているか否かを検証していた。実施の形態3では、C言語の処理系とハードウェア記述言語の処理系とのデバッグの一つとして、協調動作の組合せカバレッジについて説明する。
【0104】
ハードウェアは、何もしていないIDLE状態、データの書込中であるWR_DATA状態などといった有限状態マシンで表現されることが多い。そして、ハードウェアの障害には、ハードウェアがある状態の時にソフトウェア101から特定の操作を行った場合には正常動作するものの、ハードウェアが別の状態の時にソフトウェア101から特定の操作を行った場合に誤動作するといった事例が多い。したがって、ハードウェアとソフトウェアの協調シミュレーションでは、ハードウェアの状態とソフトウェア101からの操作の組合せについて試験する、という要求が発生する。なお、実施の形態3の説明では、ソフトウェア101からの操作を特定の関数が担うことを想定する。
【0105】
また、ソフトウェア101のうちどの関数が実行されたかの割合は、ソフトウェア101向けのカバレッジツールやプロファイラを用いて測定することができる。同様に、ハードウェアが遷移した状態の割合は、論理シミュレータ103の機能により測定することができる。しかしながら、協調動作の組合せカバレッジは、ソフトウェア101とハードウェアモデルのデバッグ環境が別々であるために、ハードウェアの動作の契機となった、ソフトウェア側で実行した関数の特定が難しいため、計測するのが困難である。
【0106】
実施の形態3にかかるシミュレーション装置100は、協調動作の組合せカバレッジを計測する。以下、図25〜図34を用いて実施の形態3にかかるシミュレーション装置100の説明を行う。なお、実施の形態3にかかるシミュレーション装置100のハードウェアは、実施の形態1にかかるシミュレーション装置100のハードウェアと同一であるため、説明を省略する。
【0107】
図24は、実施の形態3にかかるシミュレーション装置の機能例を示すブロック図である。ここで、実施の形態1と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態3にかかるシミュレーション装置100は、実行部301と、実行部302と、取得部303と、更新部306と、特定部2401と、出力部2402と、抽出部2403と、抽出部2404と、生成部2405と、を含む。この制御部となる機能(実行部301〜生成部2405)は、記憶装置に記憶されたプログラムをCPU201が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などである。
【0108】
または、インターフェース209を経由して他のCPUが実行することにより、その機能を実現してもよい。また、シミュレーション装置100は、関数名を格納する関数名スタック領域311にアクセス可能である。
【0109】
特定部2401は、取得部303によって特定の関数に関する情報が取得された場合、取得時点におけるハードウェアモデル102の状態と特定の関数との組を特定する機能を有する。たとえば、特定部2401は、取得部303が“<関数1>”という関数名を取得した場合、取得時点のハードウェアモデル102の状態と“<関数1>”との組を特定する。また、特定部2401は、ハードウェアモデル102が複数存在する場合、ハードウェアモデル102の識別情報とハードウェアモデル102の状態と特定の関数との組を特定する。なお、特定された組は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0110】
出力部2402は、ハードウェアモデル102が遷移可能な状態とソフトウェア101が実行可能な関数との組合せの数に対する特定部2401によって特定された組の数の割合を出力する機能を有する。たとえば、状態の数が2つ、関数の数が2つあり、組合せの数が4つあり、特定された組の数が2つである場合、出力部2402は、2/4=50[%]を出力する。また、出力部2402は、組合せのうち、特定されていない組を出力してもよい。また、出力部2402は、生成部2405によって生成された組合せの数に対する特定部2401によって特定された組の数の割合を出力してもよい。
【0111】
出力形式としては、たとえば、ディスプレイ208への表示、インターフェース209による外部装置への送信がある。また、出力部2402は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶することとしてもよい。
【0112】
抽出部2403は、ソフトウェア101で呼び出される関数が定義されたデータから、関数名を抽出する機能を有する。たとえば、抽出部2403は、関数が定義されたヘッダファイル601から、“<関数1>”、“<関数2>”といった関数名を抽出する。具体的な抽出方法としては、図28にて後述する。なお、抽出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0113】
抽出部2404は、ハードウェアモデル102から、ハードウェアモデル102が遷移可能な状態を抽出する機能を有する。たとえば、抽出部2404は、IDLE状態、WR_DATA状態といった状態を抽出する。具体的な抽出方法としては、図29にて後述する。なお、抽出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0114】
生成部2405は、抽出部2403によって抽出された関数名と抽出部2404によって抽出された状態とから、ハードウェアモデル102が遷移可能な状態とソフトウェア101が実行可能な関数との組合せを生成する機能を有する。たとえば、抽出部2403が“<関数1>”、“<関数2>”を抽出し、抽出部2404がIDLE状態、WR_DATA状態を抽出した場合を想定する。このとき、生成部2405は、(“<関数1>”、IDLE状態)、(“<関数1>”、WR_DATA状態)、(“<関数2>”、IDLE状態)、(“<関数2>”、WR_DATA状態)という組合せを生成する。なお、生成した組合せは、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0115】
図25は、実施の形態3にかかるCPUモデルの機能例を示す説明図である。ここで、実施の形態1または実施の形態2と同一の符号となる機能部については、同一の機能を有するため、説明を省略する。実施の形態3にかかるCPUモデル2500は、ソフトウェア実行部401とバスドライバ部402と、デバッグ情報格納部2501を含む。デバッグ情報格納部2501は、C言語とSystemVerilogによって実装されている。また、CPUモデル2500と連携して動作する機能部として、生成部2405とカバレッジ計測部2511がある。
【0116】
デバッグ情報格納部2501は、デバッグ情報の格納を行う。また、デバッグ情報格納部2501は、hook関数実行部411と、関数名スタック領域311と、C−SVインターフェース1502と、関数名格納部412と、イベント発行部2502を含む。
【0117】
イベント発行部2502は、カバレッジ計測部2511にイベントを発行する。生成部2405は、カバレッジ計測を行うSystemVerilogのソースコードを生成する。カバレッジ計測部2511は、イベントを受け付けた場合、生成部2405が生成したSystemVerilogのソースコードを用いて、カバレッジの計測を行う。
【0118】
図26は、実施の形態3におけるシミュレーション装置の動作例を示すシーケンス図である。なお、ステップS2601〜ステップS2608、ステップS2611〜ステップS2617は、ステップS511〜ステップS518、ステップS521〜ステップS527と同一の処理であるため、説明を省略する。
【0119】
enter_flag=1が格納されたset_current_fnameの呼出により、C−SVインターフェース1502は、ステップS2605の処理の後、イベント発行部2502によりカバレッジ計測部2511にenterイベントを発行する(ステップS2609)。enterイベントを受け付けたカバレッジ計測部2511は、カバレッジ計測を実行する(ステップS2610)。
【0120】
図27は、実施の形態3における入力データの一例を示す説明図である。論理シミュレータ103への入力データ、または入力データの元となるデータとして、CPUモデル2500、ヘッダファイル601、ソースコード602、ハードウェアモデル102、実行オブジェクト611、カバレッジモデルファイル2701がある。なお、入力データのうち、CPUモデル2500、ヘッダファイル601、ソースコード602、ハードウェアモデル102、実行オブジェクト611については、実施の形態1と同様であるため、説明を省略する。
【0121】
カバレッジモデルファイル2701は、生成部2405によりヘッダファイル601とハードウェアモデル102に基づいて生成された、カバレッジを計測するファイルである。なお、カバレッジモデルファイル2701は拡張子が“.sv”となるSystemVerilog用のソースコードである。カバレッジモデルファイル2701の詳細については、図31にて説明する。
【0122】
図28は、関数名の抽出例を示す説明図である。図28では、ヘッダファイル601から、関数名の抽出例を示している。ヘッダファイル601には、関数のプロトタイプ宣言が記述されている。具体的に、図28で示すヘッダファイル601では、関数1と、関数2とが、宣言されている。生成部2405は、関数名を抽出し、表2801を生成する。抽出方法として、たとえば、生成部2405は、“(”の左側に位置する単語を、関数名として抽出してよい。表2801は、関数名フィールドを有し、レコード2801−1、2801−2を有している。レコード2801−1は<関数1>を登録しており、レコード2801−2は<関数2>を登録している。
【0123】
図29は、有限状態マシンの状態の抽出例を示す説明図である。図29では、ハードウェアモデル102から有限状態マシンIDと、有限状態マシンの状態IDの抽出例を示している。ハードウェアモデル102には、ハードウェアの動作が有限状態マシンで表現されている。具体的に、図29で示すハードウェアモデル102では、有限状態マシンFSM1と有限状態マシンFSM2の動作が記述されている。生成部2405は、有限状態マシンIDと、有限状態マシンの状態IDとを抽出し、表2901を生成する。
【0124】
抽出方法として、たとえば、生成部2405は、“case”ステートメントを検出し、“case”ステートメントの引数を有限状態マシンの状態IDとして抽出し、引数と比較される値を状態IDとして抽出してもよい。表2901は、有限状態マシンID、状態IDという2つのフィールドを有し、レコード2901−1、2901−2を有している。レコード2901−1は、有限状態マシンID<FSM1>について状態IDが<状態1_1>と<状態1_2>とを登録しており、レコード2901−2は、有限状態マシンID<FSM2>について状態IDが<状態2_1>と<状態2_2>とを登録している。
【0125】
図30は、関数名と有限状態マシンの状態との組合せ例を示す説明図である。図30で示す表3001は、表2801の項目と表2901の項目との全ての組合せを示している。表3001は、関数名、有限状態マシンID、状態IDという3つのフィールドを有する。具体的には、レコード3001−1−1−1は、ソフトウェア101が<関数1>を開始するときに有限状態マシンID<FSM1>が状態ID<状態1_1>となる場合を示している。レコード3001−1−1−2〜レコード3001−2−2−2も、ソフトウェア101が関数名フィールドで示される関数を開始するときに有限状態マシンIDフィールドで示される有限状態マシンが状態IDフィールドで示される状態となる場合を示している。
【0126】
図31は、カバレッジモデルファイルのソースコードの一例を示す説明図である。図31では、生成部2405が、表3001から生成したカバレッジモデルファイル2701を示している。具体的に、生成部2405は、関数名と、各有限状態マシンの状態を列挙型変数で表現し、組合せをcovergroupで表現している。
【0127】
図32は、カバレッジの出力例を示す説明図である。図32に示す表3201は、表3001に、発生数フィールドを追加し、さらに、カバレッジ率フィールドを追加している。発生数フィールドには、関数名、有限状態マシンID、状態IDの各フィールドの値で示す状態となった回数が格納される。カバレッジ率フィールドには、全レコードのうち、発生数が1以上となるレコードの割合が格納される。
【0128】
たとえば、ソフトウェア101が関数2を開始する場合に、有限状態マシンID<FSM1>が状態ID<状態1_1>となっていれば、カバレッジ計測部2511は、レコード3201−2−1−1の発生数フィールドの値を0から1に増加する。
【0129】
図32で示す状態でカバレッジを出力する場合、シミュレーション装置100は、たとえば、カバレッジ率フィールドに格納されている“50%”を出力してもよい。または、シミュレーション装置100は、発生数フィールドの値が0となっているレコードの関数名、有限状態マシンID、状態IDの各フィールドの値を出力してもよい。具体的に、シミュレーション装置100は、発生数フィールドの値が0となっている、レコード3201−1−1−1、レコード3201−1−1−2、レコード3201−1−2−2、レコード3201−2−2−2の各フィールドの値を出力する。
【0130】
図33は、カバレッジモデルファイルの生成処理の一例を示すフローチャートである。シミュレーション装置100は、ヘッダファイル601から、関数名を抽出する(ステップS3301)。次に、シミュレーション装置100は、ハードウェアモデル102から、有限状態マシンIDと状態IDを抽出する(ステップS3302)。続いて、シミュレーション装置100は、関数名と有限状態マシンIDと状態IDとから、カバレッジモデルファイル2701を生成し(ステップS3303)、カバレッジモデルファイル2701の生成処理を終了する。
【0131】
図34は、カバレッジ計測処理の一例を示すフローチャートである。シミュレーション装置100は、カバレッジ計測が終了したか否かを判断する(ステップS3401)。カバレッジ処理が終了していない場合(ステップS3401:No)、シミュレーション装置100は、CPUモデル2500からenterイベントを受け付ける(ステップS3402)。次に、シミュレーション装置100は、関数名格納部412から関数名を取得し(ステップS3403)、ハードウェアモデル102の有限状態マシンID、状態ID、関数の組を特定する(ステップS3404)。続けて、シミュレーション装置100は、関数名、有限状態マシンID、状態IDの組合せの発生数を1増加し(ステップS3405)、ステップS3401の処理に移行する。
【0132】
カバレッジ処理が終了した場合(ステップS3401:Yes)、シミュレーション装置100は、カバレッジ率を出力し(ステップS3406)、カバレッジ計測処理を終了する。
【0133】
以上説明したように、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムによれば、特定の関数が実行される場合、関数と取得時点のハードウェアの状態を特定してカバレッジを計測する。これにより、シミュレーション装置がソフトウェア101の操作とハードウェア動作の組合せカバレッジを実行できるため、ユーザは、未実行の組合せを特定し易くなり、不具合の存在する箇所を発見しやすくなるため、協調動作のデバッグを効率的に行える。
【0134】
また、実施の形態3にかかるシミュレーション装置は、ヘッダファイルと回路データから、カバレッジモデルを自動生成し、カバレッジ計測イベントもCPUモデルが自動的に駆動する。これにより、シミュレーション装置は、漏れなく、時間をかけずにハードウェアの状態とソフトウェアの動作の組合せカバレッジを計測できる。
【0135】
なお、本実施の形態1〜3で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本シミュレーションプログラムは、インターネット等のネットワークを介して配布してもよい。
【0136】
上述した実施の形態1〜3に関し、さらに以下の付記を開示する。
【0137】
(付記1)ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納する格納部と、
前記第1の実行部のシミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する表示部と、
を備えることを特徴とするシミュレーション装置。
【0138】
(付記2)ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する検証部と、
を備えることを特徴とするシミュレーション装置。
【0139】
(付記3)ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定する特定部と、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する前記特定部によって特定された組の数の割合を出力する出力部と、
を備えることを特徴とするシミュレーション装置。
【0140】
(付記4)前記ソフトウェアで呼び出される関数が定義されたデータから、関数名を抽出する第1の抽出部と、
前記ハードウェアモデルから、前記ハードウェアモデルが遷移可能な状態を抽出する第2の抽出部と、
前記第1の抽出部によって抽出された関数名と前記第2の抽出部によって抽出されたハードウェアモデルが遷移可能な状態とから、前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せを生成する生成部と、をさらに備え、
前記出力部は、
前記生成部によって生成された組合せの数に対する前記特定部によって特定された組の数の割合を出力する、
ことを特徴とする付記3に記載のシミュレーション装置。
【0141】
(付記5)前記ソフトウェアの実行中に、前記特定の関数が実行される場合、前記ソフトウェア内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を、前記特定の関数に関する情報で更新する更新部をさらに備え、
前記取得部は、
前記更新部によって更新された前記他の記憶領域のうち、最上位に格納された情報を取得する、
ことを特徴とする付記1〜4のいずれか一つに記載のシミュレーション装置。
【0142】
(付記6)前記更新部は、
前記ソフトウェアの実行中に、前記特定の関数が開始される場合、前記他の記憶領域の最上位に前記特定の関数に関する情報を挿入する、
ことを特徴とする付記5に記載のシミュレーション装置。
【0143】
(付記7)前記更新部は、
前記ソフトウェアの実行中に、前記特定の関数が終了される場合、前記他の記憶領域の最上位に格納された情報を削除する、
ことを特徴とする付記5に記載のシミュレーション装置。
【0144】
(付記8)コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納し、
前記シミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する、
処理を実行することを特徴とするシミュレーション方法。
【0145】
(付記9)コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する、
処理を実行することを特徴とするシミュレーション方法。
【0146】
(付記10)コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定し、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力する、
処理を実行することを特徴とするシミュレーション方法。
【0147】
(付記11)コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記シミュレーションの結果と前記特定の関数に関する情報を時系列で対応付けて記憶領域に格納する、
処理を実行させることを特徴とするシミュレーションプログラム。
【0148】
(付記12)コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する、
処理を実行させることを特徴とするシミュレーションプログラム。
【0149】
(付記13)コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定し、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する特定された組の数の割合を出力する、
処理を実行させることを特徴とするシミュレーションプログラム。
【符号の説明】
【0150】
100 シミュレーション装置
101 ソフトウェア
102 ハードウェアモデル
103 論理シミュレータ
301 実行部
302 実行部
303 取得部
304 格納部
305 表示部
306 更新部
311 関数名スタック領域
1401 検証部
2401 特定部
2402 出力部
2403、2404 抽出部
2405 生成部

【特許請求の範囲】
【請求項1】
ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納する格納部と、
前記第1の実行部のシミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する表示部と、
を備えることを特徴とするシミュレーション装置。
【請求項2】
ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、前記特定の関数に対応する前記ハードウェアモデルが満たすべき条件を検証する検証部と、
を備えることを特徴とするシミュレーション装置。
【請求項3】
ハードウェアモデルを用いてシミュレーションする第1の実行部と、
前記第1の実行部との協調動作によりソフトウェアを実行する第2の実行部と、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得する取得部と、
前記取得部によって前記特定の関数に関する情報が取得された場合、取得時点における前記ハードウェアモデルの状態と前記特定の関数との組を特定する特定部と、
前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せの数に対する前記特定部によって特定された組の数の割合を出力する出力部と、
を備えることを特徴とするシミュレーション装置。
【請求項4】
前記ソフトウェアで呼び出される関数が定義されたデータから、関数名を抽出する第1の抽出部と、
前記ハードウェアモデルから、前記ハードウェアモデルが遷移可能な状態を抽出する第2の抽出部と、
前記第1の抽出部によって抽出された関数名と前記第2の抽出部によって抽出されたハードウェアモデルが遷移可能な状態とから、前記ハードウェアモデルが遷移可能な状態と前記ソフトウェアが実行可能な関数との組合せを生成する生成部と、をさらに備え、
前記出力部は、
前記生成部によって生成された組合せの数に対する前記特定部によって特定された組の数の割合を出力する、
ことを特徴とする請求項3に記載のシミュレーション装置。
【請求項5】
前記ソフトウェアの実行中に、前記特定の関数が実行される場合、前記ソフトウェア内の関数に関する情報を後入れ先出し方式で記憶する他の記憶領域を、前記特定の関数に関する情報で更新する更新部をさらに備え、
前記取得部は、
前記更新部によって更新された前記他の記憶領域のうち、最上位に格納された情報を取得する、
ことを特徴とする請求項1〜4のいずれか一つに記載のシミュレーション装置。
【請求項6】
コンピュータが、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記特定の関数に関する情報を記憶領域に格納し、
前記シミュレーションの結果と前記記憶領域に格納された前記特定の関数に関する情報とを時系列で対応付けて表示する、
処理を実行することを特徴とするシミュレーション方法。
【請求項7】
コンピュータに、
ハードウェアモデルを用いてシミュレーションし、
前記ハードウェアモデルのシミュレーションとの協調動作によりソフトウェアを実行し、
前記ソフトウェアの実行中に、前記ハードウェアモデルにアクセスする特定の関数が実行される場合、前記特定の関数に関する情報を取得し、
前記特定の関数に関する情報が取得された場合、前記シミュレーションの結果と前記特定の関数に関する情報を時系列で対応付けて記憶領域に格納する、
処理を実行させることを特徴とするシミュレーションプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate

【図32】
image rotate

【図33】
image rotate

【図34】
image rotate


【公開番号】特開2013−109673(P2013−109673A)
【公開日】平成25年6月6日(2013.6.6)
【国際特許分類】
【出願番号】特願2011−255566(P2011−255566)
【出願日】平成23年11月22日(2011.11.22)
【出願人】(308014341)富士通セミコンダクター株式会社 (2,507)
【Fターム(参考)】