(57)【特許請求の範囲】
【請求項１】
連続的な時系列上で信号値が変化する回路部品間の通信が、関数呼び出しを用いて記述可能な高位の設計記述言語で記述された回路記述を、離散的な時系列上の各時刻に検証する検証装置であって、
低位のプロパティ記述言語で記述された拡張アサーションが分離可能に挿入された前記回路記述を入力する入力部と、
前記拡張アサーション中の、関数呼び出しに関するイベントを指示する構文に対して変数を割り当てる割当部と、
前記変数の割り当てを元に前記構文を変数の比較に変換することにより前記拡張アサーションを変換済アサーションに変換する変換部と、
前記連続的な時系列上の任意の時刻に前記イベントが発生したことを検知し、前記構文の意味に対応する値を前記変数に代入する値代入部と、
前記離散的な時系列上の各時刻における前記変数の値に基づいて、前記構文の意味に対応する条件が満たされるか否かを判定する判定部と、を具備することを特徴とする検証装置。
【請求項２】
前記値代入部は、
前記変数に前記構文の意味に対応する値を代入する記述を前記回路記述に挿入する挿入部と、
前記条件の判定が行われた直後に、前記変数の値を初期化する初期化部とを含むことを特徴とする請求項１に記載の検証装置。
【請求項３】
前記記述は、前記回路記述中の、前記イベントが発生する命令の箇所に挿入されることを特徴とする請求項２に記載の検証装置。
【請求項４】
前記変数を用いて前記条件を表す式に、前記構文を変換する変換部をさらに具備することを特徴とする請求項１に記載の検証装置。
【請求項５】
前記構文は、関数呼び出しの開始を指示する構文を含むことを特徴とする請求項１に記載の検証装置。
【請求項６】
前記構文は、関数呼び出しの終了を指示する構文を含むことを特徴とする請求項１に記載の検証装置。
【請求項７】
前記構文は、関数呼び出し中であることを指示する構文を含むことを特徴とする請求項１に記載の検証装置。
【請求項８】
前記回路記述をシミュレートし、前記変数の値の変化を表す信号変化履歴を出力するシミュレート部をさらに具備し、
前記条件は、前記信号変化履歴に基づいて判定されることを特徴とする請求項１に記載の検証装置。
【請求項９】
連続的な時系列上で信号値が変化する回路部品間の通信が、関数呼び出しを用いて記述可能な高位の設計記述言語で記述された回路記述を、離散的な時系列上の各時刻に検証する検証装置の検証方法であって、
低位のプロパティ記述言語で記述された拡張アサーションが分離可能に挿入された前記回路記述を前記検証装置の入力部が入力する入力ステップと、
前記拡張アサーション中の、関数呼び出しに関するイベントを指示する構文に対して前記検証装置の割当部が変数を割り当てる割当ステップと、
前記変数の割り当てを元に前記構文を変数の比較に変換することにより、前記検証装置の変換部が前記拡張アサーションを変換済アサーションに変換する変換ステップと、
前記連続的な時系列上の任意の時刻に前記イベントが発生したことを検知し、前記構文の意味に対応する値を前記検証装置の値代入部が前記変数に代入する代入ステップと、
前記離散的な時系列上の各時刻における前記変数の値に基づいて、前記構文の意味に対応する条件が満たされるか否かを前記検証装置の判定部が判定する判定ステップと、を具備することを特徴とする検証方法。
【請求項１０】
前記代入ステップは、
前記変数に前記構文の意味に対応する値を代入する記述を前記検証装置の挿入部が前記回路記述に挿入するステップと、
前記条件の判定が行われた直後に、前記変数の値を前記検証装置の初期化部が初期化するステップとを含むことを特徴とする請求項９に記載の検証方法。
【請求項１１】
前記記述は、前記回路記述中の、前記イベントが発生する命令の箇所に挿入されることを特徴とする請求項１０に記載の検証方法。
【請求項１２】
前記変数を用いて前記条件を表す式に、前記検証装置の変換部が前記構文を変換するステップをさらに具備することを特徴とする請求項９に記載の検証方法。
【請求項１３】
前記構文は、関数呼び出しの開始を指示する構文を含むことを特徴とする請求項９に記載の検証方法。
【請求項１４】
前記構文は、関数呼び出しの終了を指示する構文を含むことを特徴とする請求項９に記載の検証方法。
【請求項１５】
前記構文は、関数呼び出し中であることを指示する構文を含むことを特徴とする請求項９に記載の検証方法。
【請求項１６】
前記回路記述を前記検証装置のシミュレート部がシミュレートし、前記変数の値の変化を表す信号変化履歴を出力するステップをさらに具備し、
前記条件は、前記信号変化履歴に基づいて判定されることを特徴とする請求項９に記載の検証方法。
【請求項１７】
前記離散的な時系列上の各時刻は、前記アサーションが表す論理式の真偽を判定すべきタイミングに相当する検証単位時刻であることを特徴とする請求項９に記載の検証方法。
【請求項１８】
連続的な時系列上で信号値が変化する回路部品間の通信が、関数呼び出しを用いて記述可能な高位の設計記述言語で記述された回路記述を、離散的な時系列上の各時刻に検証するプログラムであって、
コンピュータを、
低位のプロパティ記述言語で記述された拡張アサーションが分離可能に挿入された前記回路記述を入力する入力手段、
前記拡張アサーション中の、関数呼び出しに関するイベントを指示する構文に対して変数を割り当てる割当手段、
前記変数の割り当てを元に前記構文を変数の比較に変換することにより前記拡張アサーションを変換済アサーションに変換する変換手段、
連続的な時系列上の任意の時刻に前記イベントが発生したことを検知し、前記構文の意味に対応する値を前記変数に代入する値代入手段、
離散的な時系列上の各時刻における前記変数の値に基づいて、前記構文の意味に対応する条件が満たされるか否かを判定する判定手段、として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デジタル回路を含む電子システムの設計において、プロパティ記述言語を用いて検証を行う装置および方法に関する。
【背景技術】
【０００２】
従来のデジタル回路を含む電子システムの設計は、ＨＤＬ（Hardware Description Language; ハードウェア記述言語）とよばれる低位記述（信号線やラッチなどハードウェアに近い記述）によって行われていた。この方法では、ＩＰ（Intellectual Property; 知識資産、回路部品）間の通信やＩＰの状態管理をすべて、信号線によって表現する。しかしこの方法は、設計の期間やコストがかかるという問題があった。
【０００３】
近年、ＥＳＬ設計と呼ばれる、Ｃ言語など高位記述が可能な設計記述言語を用いて回路設計を行う方法が使われ始めている。ＥＳＬ（Electronic System Level）設計では、ＩＰ間の通信を、信号線ではなく、関数呼び出しを使った抽象度の高い記述で表現することができる。これにより回路設計の期間やコストの効率化を図ることができる。
【０００４】
一方、ＨＤＬベースの設計において「アサーション」と呼ばれる表明記述を用いた手法が使われはじめている。アサーションはプロパティ記述言語と呼ばれる言語によって形式的に記述される。ＰＳＬ（Property Specification Language; プロパティ記述言語、ＩＥＥＥ  １８５０）はその一例である。アサーションによれば、ＩＰの性質を、抽象度の高い記述で厳密かつ部分的に表現することができる。シミュレーションや静的検証を用いて、アサーションが表現する事象とＩＰの設計記述が表現する事象とが一致することを判定することにより、ＩＰの検証を行うこともできる。
【０００５】
離散的な時相を考慮したプロパティ記述では、ＩＰ内で発生すべきイベントの発生順序や発生間隔を指示する。従来のプロパティ記述言語はＨＤＬに適用することを意図していたため、信号線の変化しかイベントとして指示できなかった。ＥＳＬ言語ではＩＰ間での通信を、信号線の変化ではなく、抽象度の高い記述である関数呼び出しとして表現することがある。従来のプロパティ記述言語では、関数呼び出しに関するイベントを指示できないため、関数呼び出しを利用した通信に関する性質が表現できなかった。
【０００６】
以下、実際の公知例を挙げて説明する。
【０００７】
ＨＤＬで記述されたＩＰの設計記述に対して記述されたアサーションを扱う公知例（下記特許文献１，２を参照）は、ＥＳＬ設計に特有の関数呼び出しに関するイベントを指示できないという問題は解決しない。
【０００８】
ＥＳＬ設計で使用されるＣ言語等の言語ではアサーションが古くから多数研究されているが、これらは通常のソフトウェアに対するアサーションを扱うものである。したがって、ＥＳＬ設計を含むハードウェアに特有のクロックなどの検証単位時刻に基づいたアサーションを扱う用途には適さない。
【０００９】
ＥＳＬ設計に対してアサーションを適用することに関し、ＪＥＤＡのＮＳＣａ（ＵＳ２００６／０２７７５３４）が公知である。この公知例は汎用プログラミング言語に対するアサーションを当該プログラミング言語に変換して検証を行う手法である。しかし、アサーションから当該プログラミング言語の関数の呼び出しを行い、返り値を参照して性質を記述することはできるものの、関数呼び出しに関するイベントの順序を指示できないという問題は解決されない。
【特許文献１】特開２００７−９４８９１号公報
【特許文献２】特開２００７−９４５９１号公報
【発明の開示】
【発明が解決しようとする課題】
【００１０】
本発明は上記事情を考慮してなされたものであり、アサーションをＥＳＬ設計に適用するために、ＥＳＬ設計に特有のイベントを指示する構文を追加したプロパティ記述言語を用いて、ＩＰの設計記述を検証する装置および方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の一観点に係る検証装置は、連続的な時系列上で信号値が変化する回路部品間の通信が、関数呼び出しを用いて記述可能な設計記述言語で記述された回路記述を、離散的な時系列上の各時刻に検証する検証装置である。プロパティ記述言語で記述されたアサーション中の、関数呼び出しに関するイベントを指示する構文に対して割当部が変数を割り当てる。次に、値代入部は、前記連続的な時系列上の任意の時刻に前記イベントが発生したことを検知し、前記構文の意味に対応する値を前記変数に代入する。そして、判定部は、前記離散的な時系列上の各時刻における前記変数の値に基づいて、前記構文の意味に対応する条件が満たされるか否かを判定する。
【発明の効果】
【００１２】
本発明によれば、ＥＳＬ設計でアサーションを使用可能になり、抽象度の高い記述能力とアサーションによる検証能力を備えた開発環境を提供できる。
【発明を実施するための最良の形態】
【００１３】
関数呼び出しに関するイベントを指示する構文が導入されたプロパティ記述言語を扱う検証装置および検証方法の実施形態を説明する。以下では、関数呼び出しに関するイベントを指示する構文の各々に対して新規変数を割り当てること、各構文が指示する関数呼び出しに関するイベントを検知すること、そして、イベントを検知した結果にしたがって各構文が表現する真偽値を解釈することについて説明する。
【００１４】
具体的には、関数呼び出しに関するイベントを指示する構文の各々に対して特別な新規変数を割り当て、各構文を「この変数がある値になる」というイベントの指示に置き換える。ＩＰの設計記述上で指示されたイベントが発生する箇所に、この変数への代入を行う代入文を挿入する。さらに、プロパティ記述言語の検証時に、各クロックにおいてプロパティが満たされるかどうかを検証した後、挿入された全ての変数の値を初期化する処理を行う。
【００１５】
（用語の定義）
各プロパティ記述（以下、「アサーション」）が表す論理式の真偽を判定すべきタイミングを「検証単位時刻」と称する。通常は、クロックが立ったタイミングを検証単位時刻として指示することが多い。
【００１６】
関数呼び出しに関するイベントを指示する構文を「拡張構文」と称する。本実施形態では、関数の呼び出しが発生したイベントを指示する構文「enter」、関数の呼び出しが終了したイベントを指示する構文「leave」、関数の呼び出し中に発生した任意のイベントを指示する構文「around」という３種の構文を導入する。これらenter、leave、aroundの名称はあくまで一例であり、別の名称を使ってもよい。
【００１７】
enterは指定した関数呼び出しが開始した直後の検証単位時刻で真になる構文である。例えば、enter(func)は関数funcの呼び出しが開始した直後の検証単位時刻で真になる。leaveは指定した関数呼び出しが終了した直後の検証単位時刻で真になる。例えば、leave(func)は関数funcの呼び出しが終了した直後の検証単位時刻で真になる。aroundは指定した関数が呼び出されてからその処理が終了するまでの任意の検証単位時刻で真になる。例えば、around(func)は関数funcが呼び出されてからその処理が終了するまでの任意の検証単位時刻で真になる。
【００１８】
拡張構文を含むアサーションを「拡張アサーション」と称する。本実施形態では拡張構文を通常の変数比較に置き換えることで通常のアサーションに変換するが、この通常のアサーションを「変換済アサーション」と称する。
【００１９】
本実施形態では、入力された拡張アサーション中の全ての拡張構文に対し、変数を割り当てる。ここで割り当てる変数を「新規変数」と称する。また、拡張構文とそれに割り当てられた新規変数の組を「変数割当」と称する。
【００２０】
ＥＳＬ言語で記述されたソースコードを「ＥＳＬ記述」と称する。本実施形態では代入文をＥＳＬ記述に挿入するが、挿入処理を終えたＥＳＬ記述を「挿入済ＥＳＬ記述」と称する。
【００２１】
（システムの基本構成）
図１は本発明に係る検証装置を示すブロック図である。本装置は、拡張アサーション付ＥＳＬ記述０１２１を入力し、ＥＳＬ記述０２２２と拡張アサーション０２２３とに分離して出力する入力部０２２１と、拡張アサーション０２２３中の拡張構文に新規変数を割り当てる新規変数割当部０３２１と、変数割当を元に拡張構文を変数比較に変換することにより拡張アサーション０２２３を変換済アサーション０４２２に変換する拡張構文変換部０４２１と、全ての拡張構文が指示する箇所に、拡張構文に割り当てられた変数に代入を行う代入文を挿入する変数代入挿入部０５２１と、挿入済ＥＳＬ記述０５２２をテストベンチ０６２１に対して実行するＥＳＬ記述シミュレート部０７２１と、ＥＳＬ記述シミュレート部０７２１の信号変化履歴０７２２に対して変換済アサーション０４２２の論理式の真偽を判定し、偽の時はエラー出力や統計計上など指示された動作を行うアサーション判定部０８２１と、新規変数の初期化を行う新規変数初期化部１０２１と、シミュレート結果０７２３を表示・記録するシミュレート結果表示・記録部１１２１と、アサーションの判定結果０８２２を表示・記録する検証結果表示・記録部１２２１とを有する。
【００２２】
図２は、図１に示した検証装置の動作手順を示すフローチャートである。図２に示すように、
先ず、入力部０２２１が拡張アサーション付ＥＳＬ記述を入力し（ステップ０１００）、拡張アサーション付ＥＳＬ記述から拡張アサーションとＥＳＬ記述とを分離して抽出し、それぞれを出力する（ステップ０２００）。
【００２３】
次に、新規変数割当部０３２１が、拡張アサーションに含まれる拡張構文に新規変数を割り当てる（ステップ０３００）。これにより得られた変数割当を元に、拡張構文変換部０４２１は拡張構文を変数比較に変換する（ステップ０４００）。一方、変数代入挿入部０５２１は、変数割当を元に、ＥＳＬ記述に変数代入を挿入する（ステップ０５００）。
【００２４】
次に、テストベンチがステップ０６００において入力され、ＥＳＬ記述シミュレート部０７２１はＥＳＬ記述を次の検証単位時刻までシミュレートする（ステップ０７００）。これによりＥＳＬ記述のシミュレート結果が得られる。
【００２５】
一方、アサーション判定部０８２１は、変換済アサーションを元に、アサーション判定を行う（ステップ０８００）。これによりアサーションの判定結果（すなわち検証結果）が得られる。
【００２６】
次に、シミュレートを終了するかがステップ０９００において判定される。シミュレートを終了せず続行する場合は新規変数初期化部１０２１が新規変数を初期化し（ステップ１０００）、ステップ０７００に戻る。シミュレートの終了時には、シミュレート結果表示・記録部１１２１がシミュレート結果を出力し（ステップ１１００）、検証結果表示・記録部１２２１が検証結果を出力する（ステップ１２００）。
【００２７】
尚、入出力データに依存関係のないステップの順序は入れ替えたり並列実行したりしてよい。具体的には、以下の３点の変更がありうる。
【００２８】
・ステップ０４００とステップ０５００は入れ替えたり並列実行したりしてもよい。
【００２９】
・ステップ０６００はステップ０１００の前、ステップ０２００の前、ステップ０３００の前、ステップ０４００の前、ステップ０５００の前のいずれかに順序を変えてもよいし、それらと並列実行してもよい。
【００３０】
・ステップ１１００とステップ１２００は入れ替えたり並列実行したりしてもよい。
【００３１】
（新規変数割当ステップ０３００の詳細）
新規変数割当ステップ０３００は、拡張アサーション中の全ての拡張構文に対し新規変数を割り当てるステップであって、図３に示すように、拡張アサーションを入力するステップ０３１１と、新規変数を割り当てていない拡張構文を探すステップ（０３１２と０３１３）と、新規変数を生成し拡張構文に割り当てるステップ０３１４と、変数割当を出力するステップ０３１５とを有する。上述したように、拡張構文とそれに割り当てられた新規変数の組は「変数割当」である。変数割当は、メモリやハードディスク等の記憶手段に一時的に記憶される（図示しないが「変数割当記憶部」という）。
【００３２】
（拡張構文変換ステップ０４００の詳細）
拡張構文変換ステップ０４００は、拡張アサーションを変換済アサーションに変換するステップであって、図４に示すように、拡張アサーションを入力するステップ０４１１と、変換していない拡張構文を探すステップ（０４１２と０４１３）と、拡張構文に対応する変数割当を入力するステップ０４１４と、拡張構文を、割り当てられた変数の比較に変換するステップ０４１５と、全ての拡張構文を変換した変換済アサーションを出力するステップ０４１６とを有する。出力された変換済アサーションは、メモリやハードディスク等の記憶手段に一時的に格納される（図示しないが「変換済アサーション記憶部」という）。
【００３３】
（変数代入挿入ステップ０５００の詳細）
変数代入挿入ステップ０５００は、ＥＳＬ記述に必要な代入文を挿入するステップであって、図５に示すように、ＥＳＬ記述を入力するステップ（０５１１）と、全ての変数割当を入力するステップ（０５１２）と、変数割当ごとに処理を繰り返すステップ（０５１３と０５１７）と、変数割当の拡張構文に対応するイベントを発生させる箇所で、挿入処理を行っていない箇所を探すステップ（０５１４と０５１５）と、その箇所に、変数割当に対応する変数に代入処理を行う代入文を挿入するステップ（０５１６）と、全ての変数割当に対して挿入処理を終えた挿入済ＥＳＬ記述を出力するステップ（０５１８）とを有する。
【００３４】
（拡張構文の意味）
図６は、３種類の拡張構文「enter」、「leave」、「around」の表す意味を図示したものである。図中では白い円が偽、黒い円が真を表す。enter(func)はfuncの呼び出しがあった直後の検証単位時刻でのみ真となる。leave(func)はfuncの実行が終了した直後の検証単位時刻でのみ真となる。around(func)はfuncの呼び出し中の全ての検証単位時刻で真となる。
【００３５】
（第１の実施形態）
以下、拡張アサーション付ＥＳＬ記述をシミュレート・検証する第１の実施形態を説明する。
【００３６】
図７は、二つのIP AとIP Bを組み合わせた回路を表現した、ＳｐｅｃＣを元にした言語で書かれたＥＳＬ記述である。尚、ＥＳＬ言語としてはＳｐｅｃＣに限定されないことは言うまでもない。１行目から６行目までのbehavior Aで始まるブロックがIP Aを表し、８行目から１５行目までのbehavior Bで始まるブロックがIP Bを表す。IP AからIP Bの関数funcを呼び出すことで、IP AはIP Bに値を伝達する。さらに、関数funcの実行の終了によって、IP BはIP Aに値を受け取ったことを通知する。
【００３７】
ここで、０クロック目にIP Bが値を受け取り、１クロック目に通知を返すという拡張アサーションは、既存のプロパティ記述言語であるＰＳＬ言語（Property Specification Language）に拡張構文を追加した言語によって{enter(func); leave(func)}と記述される。以下、このアサーションを検証する処理手順を説明する。
【００３８】
（第１の実施形態における新規変数割当ステップ０３００の動作）
新規変数割当ステップ０３００では、拡張アサーション{enter(func); leave(func)}を入力し、この中の二つの拡張構文enter(func)及びleave(func)のそれぞれに対して新規変数を割り当てる。ここでは、enter(func)に対して_enter_func_という新規変数を割り当て、leave(func)に対して_leave_func_という新規変数を割り当てることとする。これら新規変数は、falseで初期化されているものとする。尚、初期値がfalseであるのはあくまで一例であり、本発明を限定する事項ではない。また、これら新規変数の変数名についても一例であり、他の名前でもよい。また、他の新規変数や元からＥＳＬ記述内にある変数と実体を区別できれば、実際に名前を割り当てなくてもよい。
【００３９】
（第１の実施形態における拡張構文変換ステップ０４００の動作）
拡張構文変換ステップ０４００では、拡張アサーション{enter(func); leave(func)}を入力し、この中の二つの拡張構文enter(func)及びleave(func)のそれぞれを、変数比較の記述に変換する。ここでは、enter(func)を_enter_func_ == trueという比較の記述に変換し、leave(func)を_leave_func_ == trueという比較の記述に変換する。比較する値がtrueであるのはあくまで一例であり、本発明を限定する事項ではない。初期値であるfalseと区別できる値であればどのような値としてもよい。上記変数比較の記述は、変数とリテラル（直定数）との比較の記述、変数と変数との値の比較の記述を含む。拡張構文変換ステップ０４００により、拡張アサーション{enter(func); leave(func)}は変換済アサーション{_enter_func_ == true; _leave_func_ == true}に変換される。
【００４０】
（第１の実施形態における変数代入挿入ステップ０５００の動作）
変数代入挿入ステップ０５００において、図７に示すＥＳＬ記述を入力し、ステップ０３００において生成された二つの変数割当を元に変数代入の記述を挿入する。具体的には、一つ目の変数割当enter(func)と_enter_func_を元に、ＥＳＬ記述中の関数funcの呼び出しの直前に_enter_func_ = true;という代入文を挿入する。また、二つ目の変数割当leave(func)と_leave_func_を元に、ＥＳＬ記述中の関数funcの呼び出しの直後に_enter_func_ = false;という代入文を挿入する。以上により、図８に示すような挿入済ＥＳＬ記述を得る。ここで、変数代入の記述を挿入する処理は、連続的な時系列上の任意の時刻に、関数呼び出しに関するイベントが発生したことを検知し、そのイベント発生を拡張構文の意味に対応して反映することと等価的である。「反映する」とは、変数代入挿入部０５２１に相当する値代入部が、拡張構文の意味に対応して新規変数に値を代入することである。
【００４１】
（第１の実施形態におけるＥＳＬ記述シミュレートステップ０７００、アサーション判定ステップ０８００、シミュレートを終了するか判定するステップ０９００、新規変数初期化ステップ１０００の動作）
ＥＳＬ記述シミュレートステップ０７００では、図８に示した挿入済ＥＳＬ記述をシミュレートし、拡張構文変換ステップ０４００において生成された変換済アサーション{_enter_func_ == true; _leave_func_ == true}が満たされることを判定する。第１の実施形態では回路はテストベンチを一切入力しないため、テストベンチは存在しない。最初のＥＳＬ記述シミュレートステップ０７００では、IP Aの関数mainの実行が開始され、_enter_func_ = true;により_enter_func_がtrueになり、b.func(1);によりIP Bの関数funcが呼ばれ、waitfor(1)が呼ばれるところまでシミュレートが行われる。次にアサーション判定ステップ０８００では、０クロック目で満たされるべき条件_enter_func_ == trueが満たされていることを確認する。シミュレーションを終了すべきか判定するステップ０９００では、現在、次のクロックを待っている処理が存在するためシミュレート続行を判断する。新規変数初期化ステップ１０００において、新規変数_enter_func_と_leave_func_の両者にfalseを代入することで初期化を行う。これにより、各新規変数は、対応するイベントが発生した次の検証単位時刻でのみ真になる。
【００４２】
ＥＳＬ記述シミュレートステップ０７００では、waitfor(1)から実行が帰り、IP Aから受け取った値をIP B内の変数valueに保存した後、関数funcから帰り、_leave_func_ = true;により_leave_func_がtrueになり、IP Aの関数mainの実行を終えるところまでシミュレートが行われる。
【００４３】
アサーション判定ステップ０８００では、１クロック目で満たされるべき条件_leave_func_ == true が満たされていることを確認する。シミュレーションを終了すべきか判定するステップ０９００において、もはや実行中の関数が存在しないため、シミュレートを終了する。シミュレート結果出力ステップ１１００により、シミュレート結果が出力されるが、第１の実施形態に係るＥＳＬ記述は外部に一切出力を行わない回路であるため、何も出力せず、シミュレーションを終了する。また、検証結果出力ステップ１２００によりアサーションの検証結果が出力される。ここでは、全てのアサーションが満たされたことを出力する。
【００４４】
以上説明したステップにより、図７のＥＳＬ記述は拡張アサーション{enter(func); leave(func)}を満たしていることが検証された。
【００４５】
（第１の実施形態における新規変数の値の変動）
図９は、第１の実施形態において新規変数がどのような値を取るかを連続的な時系列上の図に表したものである。シミュレート開始から０クロック目の検証ステップに至るまでの間に_enter_func_=true;が実行され、０クロック目の検証ステップ時では_enter_func_がtrue、_leave_func_がfalseを取っている。すなわち、プロパティ記述言語において定められた離散的な時系列上の０クロック目の検証においては、enter(func)が成立、leave(func)が非成立であることを示している。０クロック目の検証が終わった後、新規変数の初期化が行われ、１クロック目の検証ステップまでの間に_leave_func_=true;が実行され、１クロック目の検証ステップ時では_enter_func_がfalse、_leave_func_がtrueを取っている。すなわち、プロパティ記述言語において定められた離散的な時系列上の１クロック目の検証においては、enter(func)が非成立、leave(func)が成立であることを示している。
【００４６】
（第１の実施形態に係る検証装置の動作）
入力部０２２１は図７に示すＥＳＬ記述を入力し、ＥＳＬ記述と拡張アサーションとに分離して両者の抽出を行う。
【００４７】
新規変数割当部０３２２は拡張アサーション{enter(func); leave(func)}に記述されている各拡張構文に新規変数_enter_func_と_leave_func_を割り当てる。拡張構文と新規変数の組、すなわち変数割当をメモリやハードディスク等の記憶手段に一時的に格納する。この変数割当を元に、拡張構文変換部０４２１は拡張アサーション{enter(func); leave(func)}を変換済アサーション{_enter_func_ == true; _leave_func_ == true}に変換する。変数代入挿入部０５２１は変数割当を元に、図７のＥＳＬ記述を図８に示す挿入済ＥＳＬ記述に変換する。ＥＳＬ記述シミュレート部０７２１は図８に示す挿入済ＥＳＬ記述を対象にしてシミュレートを行う。０クロック目のシミュレートでIP Aの関数mainの実行開始からIP Bの関数func内のwaitfor(1)の呼び出しまでシミュレートされ、この状態の信号変化履歴０７２２をアサーション判定部０８２１に伝える。信号変化履歴０７２２は、上記_enter_func_や_leave_func_の値がどのように変化したかを表している。アサーション判定部０８２１は現状（すなわち検証単位時刻）で変換済アサーション{_enter_func_ == true; _leave_func_ == true}が満たされていることを信号変化履歴０７２２に基づいて判定する。
【００４８】
次に、新規変数初期化部１０２１が_enter_func_と_leave_func_をfalseに初期化する。ＥＳＬ記述シミュレート部０７２１は１クロック目のシミュレートでwaitfor(1)の呼び出しから帰り、IP Aの関数mainの終了までがシミュレートされ、この状態の信号変化履歴０７２２をアサーション判定部０８２１に伝える。アサーション判定部０８２１は現状で変換済アサーション{_enter_func_ == true; _leave_func_ == true}が満たされていることを信号変化履歴０７２２に基づいて判定する。
【００４９】
次に、新規変数初期化部１０２１が_enter_func_と_leave_func_をfalseに初期化する。ここでシミュレーションが終了し、シミュレート結果表示・記録部１１２１によってシミュレート結果が出力・表示・記憶され、検証結果表示・記録部１２２１によってアサーションの検証結果の出力・表示・記憶が行われる。
【００５０】
（第２の実施形態）
以下、拡張アサーション付ＥＳＬ記述をシミュレート・検証する第２の実施形態を説明する。
【００５１】
図１０は、二つのIP AとBを組み合わせた回路を表現したＥＳＬ記述である。IP AからIP Bの関数func2や関数funcを呼び出すことで、IP AはIP Bに値を伝達する。IP B内の関数func2は自身の関数funcを呼び出す。関数funcは伝達された値が１の場合は１クロック後に、２の場合は２クロック後に処理を帰す。
【００５２】
このとき、二つの拡張アサーションalways (enter(func) -> next leave(func))と{around(func2) && enter(func); leave(func)}を検証する第２の実施形態を、第１の実施形態との相違点を中心に説明する。一つ目のアサーションは、関数funcが呼ばれたクロックの次のクロックで必ず関数funcの実行が終了することを表している。このアサーションは、IP Bの関数func2を経由して関数funcが呼ばれた場合は成立するが、IP Aの関数mainから直接b.func(2)として呼ばれた場合は２クロック後に関数の実行が終了するため、成立しない。二つ目のアサーションは、０クロック目にIP Aの関数mainが呼ばれている間に関数funcが呼び出され、１クロック目に関数funcの実行が終了することを表している。このアサーションは成立する。
【００５３】
（第２の実施形態における新規変数割当ステップ０３００の動作）
新規変数割当ステップ０３００では、enter(func)に対して_enter_func_を割り当て、leave(func)に対して_leave_func_を割り当て、around(func2)に対して_around_func2_を割り当てる。
【００５４】
（第２の実施形態における拡張構文変換ステップ０４００の動作）
拡張構文変換ステップ０４００では、一つ目の拡張アサーションalways (enter(func) -> next leave(func))をalways (_enter_func_ == true -> next _leave_func_ == true)に変換し、さらに二つ目のアサーション{around(func2) && enter(func); leave(func)}を{_around_func2_ == true && _enter_func_ == true; _leave_func_ == true}に変換する。第１の実施形態と同様に、ここでは拡張構文を変数比較の記述に変換している。
【００５５】
（第２の実施形態における変数代入挿入ステップ０５００の動作）
変数代入挿入ステップ０５００では、図１０に示すＥＳＬ記述を、図１１に示すような挿入済ＥＳＬ記述に変換する。ここでaround(func2)に対しては、関数の呼び出し開始時に_around_func2_ = true;を挿入し、呼び出し終了時に_around_func2_ = false;を挿入する。
【００５６】
（第２の実施形態におけるＥＳＬ記述シミュレートステップ０７００、アサーション判定ステップ０８００、シミュレートを終了するか判定するステップ０９００、新規変数初期化ステップ１０００の動作）
ＥＳＬ記述シミュレートステップ０７００では、図１１に示す挿入済ＥＳＬ記述をシミュレートする。ここで、enterやleaveに対しては、アサーションの判定後に対応する新規変数を初期化するが、aroundに対してはこの初期化を行わない。これにより、aroundで指示されている関数が実行中は常に新規変数が真になる。
【００５７】
０クロック目のシミュレートが終了した後、enter(func)とaround(func2)が真になっている。一つ目の拡張アサーションalways (enter(func) -> next leave(func))は、次のクロックでleave(func)になることを検証する。二つ目の拡張アサーション{around(func2) && enter(func); leave(func)}は、０クロック目で成立すべき事象が成立していることを検証する。１クロック目のシミュレートが終了した後、leave(func)が真になっている。一つ目の拡張アサーションは、leave(func)が成立しているため、この時点では偽にならない。二つ目のアサーションは１クロック目で成立すべき事象が成立していることを検証し、このアサーションが成立することが確定する。２クロック目ではenter(func)が真になる。一つ目の拡張アサーションにより、次のクロックでleave(func)になることを検証する。３クロック目で、このとき関数funcに渡されている値は２であるため、２クロック目の待ち状態になる。このため、関数funcはまだ帰らず、真になる拡張構文は存在しない。これにより一つ目の拡張アサーションalways (enter(func) -> next leave(func))が偽になる。当該アサーションの偽時動作であるassertはエラーを出力するという意味であり、エラー出力が実行される。
【００５８】
（第２の実施形態における新規変数の値の変動）
図１２は、第２の実施形態において新規変数がどのような値を取るかを連続的な時系列上の図に表したものである。
【００５９】
以上説明した本発明の実施形態によれば、ＥＳＬ設計でアサーションを使用可能になり、抽象度の高い記述能力とアサーションによる検証能力を備えた開発環境を提供できる。
【００６０】
上述した本発明の実施形態は、次のように変形することできる。
【００６１】
（変形例）
・拡張アサーションとＥＳＬ記述をあらかじめ個別に記述してもよい。この場合、拡張アサーション抽出ステップ０２００が不要になる。
【００６２】
・ＥＳＬ記述上、全く同じタイミングを指示する複数の拡張構文に対しては、新規変数をそれぞれに割り当てる必要はない。例えば、関数func1と関数func2が必ず連続して呼び出される場合、拡張アサーション中にleave(func1)とenter(func2)が出現しても、それぞれに新規変数を割り当てる必要はない。このような状況を検知し、leave(func1)とenter(func2)に同じ新規変数を割り当てるように機能拡張すれば、ＥＳＬ記述中に挿入する代入の数が減り、シミュレーションを高速化できる。
【００６３】
・図２では新規変数割当ステップ０３００、拡張構文変換ステップ０４００、変数代入挿入ステップ０５００をＥＳＬ記述シミュレートステップ０７００の前処理として行っているが、シミュレートを行いながら必要に応じて変換・判定するように処理手順を変更してもよい。例えば、関数呼び出しの意味を、通常の呼び出しの前に、その関数に対応する新規変数にtrueを代入する処理を追加するように拡張すれば、これによってシミュレートステップにおいて関数funcが呼び出されたとき、_enter_func_にtrueが代入されるため、変数代入挿入ステップ０５００を省略することができる。ただしこの方法はＥＳＬシミュレート部０７２１がＥＳＬ記述を逐次解釈実行する方式で実装されているときにだけ使用できる。
【００６４】
・新規変数初期化ステップ１０００をＥＳＬ記述シミュレートステップ０７００、アサーション判定ステップ０８００、シミュレートを終了すべきかどうかの判定ステップ０９００のループの中で行うものとして説明したが、ＥＳＬ記述シミュレートステップ０７００の前に、ＥＳＬ記述中で検証単位時刻直後に相当する位置を検出し、そこに新規変数を初期化する代入文を挿入するステップを行ってもよい。
【００６５】
・変数代入挿入ステップ０５００はＥＳＬ記述に対して変数代入を挿入するものとして説明したが、ＥＳＬ記述をオブジェクトコードにコンパイルした後で実行する方式でシミュレータが実装されている場合には、コンパイルと同時、またはコンパイル後のオブジェクトコードに対して変数代入に相当するオブジェクトコード断片を挿入してもよい。ただしコンパイラの最適化によって関数がインライン展開されている可能性があることに注意する必要がある。
【００６６】
指定した関数が呼び出されてからその処理が終了するまでの任意の検証単位時刻を表す拡張構文aroundの解釈には、明示的に新規変数を与えなくても、実行時の関数呼び出しスタックに同等の情報が記録されているので、これを利用してもよい。
【００６７】
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。
【図面の簡単な説明】
【００６８】
【図１】本発明に係る検証装置を示すブロック図
【図２】図１に示した検証装置の動作手順を示すフローチャート
【図３】新規変数割当ステップの詳細を示すフローチャート
【図４】拡張構文変換ステップの詳細を示すフローチャート
【図５】変数代入挿入ステップの詳細を示すフローチャート
【図６】拡張構文の意味を説明するための図
【図７】第１の実施形態に係る拡張アサーション付ＥＳＬ記述の一例を示す図
【図８】第１の実施形態に係る挿入済ＥＳＬ記述の一例を示す図
【図９】第１の実施形態に係る新規変数の値の変化を示すタイミングチャート
【図１０】第２の実施形態に係る拡張アサーション付ＥＳＬ記述の一例を示す図
【図１１】第２の実施形態に係る挿入済ＥＳＬ記述の一例を示す図
【図１２】第２の実施形態に係る新規変数の値の変化を示すタイミングチャート
【符号の説明】
【００６９】
０２２１…入力部、０３２１…新規変数割当部、０４２１…拡張構文変換部、０５２１…変数代入挿入部、０７２１…ＥＳＬ記述シミュレート部、０８２１…アサーション判定部、１１２１…シミュレート結果表示・記録部、１２２１…検証結果表示・記録部
【図１】
0005109143.tif 000002
【図２】
0005109143.tif 000003
【図３】
0005109143.tif 000004
【図４】
0005109143.tif 000005
【図５】
0005109143.tif 000006
【図６】
0005109143.tif 000007
【図７】
0005109143.tif 000008
【図８】
0005109143.tif 000009
【図９】
0005109143.tif 000010
【図１０】
0005109143.tif 000011
【図１１】
0005109143.tif 000012
【図１２】
0005109143.tif 000013