以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の検証装置を示す図である。検証装置1は、回路2の動作の検証を行う。回路2はIPと呼ばれるものでもよい。回路2は、例えば電子装置に組み込まれて、電子装置の所定の機能の一部(例えば、USB(Universal Serial Bus)などの規格による機能)を担う。回路2は、その提供元により仕様(例えば、USBなどの規格による仕様)に応じた動作の検証が行われている。一方、回路2を提供元から取得し、回路2を実装した電子装置を設計する開発者は、電子装置に実装された回路2が適切に動作するかを、検証装置1を用いて再度検証する。
検証装置1は、回路2の動作をコンピュータ上でシミュレートすることで回路2の動作検証を行える。例えば、検証装置1は、電子装置に実装された回路2のRTL(Register Transfer Level)記述を用いて、テスト用の入力ベクタを回路2に入力したときの出力信号をシミュレートする。ここで、入力ベクタは、回路2に対して与える入力信号の時系列変化を記述した情報である。検証装置1は、入力信号に対する出力信号の正否を判定することで、実装後も回路2が期待した動作を行うかを検証する。
検証装置1は、記憶部1aおよび演算部1bを有する。記憶部1aは、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。演算部1bは、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。演算部1bはプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。
記憶部1aは、回路2に入力する入力ベクタを記憶する。入力ベクタは、演算部1bにより所定の方法により生成(例えば、ランダム生成)されたものでもよい。
演算部1bは、記憶部1aに記憶された入力ベクタを用いた回路2の論理シミュレーションにより取得された回路2の出力信号を参照して出力信号の変化のパターンを検出する。演算部1bは、出力信号の変化のパターンの検出結果に応じて入力ベクタに対して発生した回路2の内部状態の遷移(状態遷移)を示す情報を生成する。演算部1bは生成した情報を記憶部1aに格納する。例えば、演算部1bは、論理シミュレーションによって得られた回路2の出力信号を統計的に解析することで、出力信号の変化のパターンを検出する。
ここで、出力信号の変化のパターンと、仕様から得られる回路2の状態遷移との対応を示す情報は予め作成され、記憶部1aに格納される。演算部1bは、記憶部1aに記憶された当該情報と出力信号の変化のパターンとを照合して、信号変化のパターンに対応する状態遷移を特定できる。
例えば、演算部1bは、記憶部1aに記憶された入力ベクタを用いて回路2に関する次のような状態遷移を特定する。状態S0−>状態S1。状態S1−>状態S2。状態S2−>状態S0。ここで、“−>”の表記は右向きの矢印を表し、当該表記の左側の状態から右側の状態へ遷移することを示す(以下同様)。例えば、“状態S0−>状態S1”の表記は、状態S0から状態S1への遷移を示している。これらの状態遷移は、現状の入力ベクタによる論理シミュレーションで検証可能な(カバー済の)状態遷移といえる。演算部1bは、回路2に対する制約を示す線形時相論理(LTL:Linear Temporal Logic)式を用いて、現状の論理シミュレーションで検証可能な状態遷移を記述し得る。
演算部1bは、入力ベクタに対して発生した回路2の状態遷移の情報に基づいて、回路2の仕様モデルを用いた形式的検証により特定される回路2の状態遷移のうち、現状の入力ベクタを用いた論理シミュレーションでは発生しない状態遷移の情報を出力する。
ここで、回路2の仕様モデルは、回路2の形式仕様記述(例えば、Promela(Process Meta Language)と呼ばれる言語による記述)である。例えば、Promelaで記述された仕様モデルは、SPIN(Simple Promela INterpreter)と呼ばれるモデル検証ツールによる形式的検証に用いられる。Promela記述の仕様モデルに対する制約式はNeverClaimと呼ばれる記述で表せる。
演算部1bは、仕様モデルを用いた形式的検証により、回路2の仕様上の動作に応じた状態遷移を再現する。例えば、次のような状態遷移を再現する。状態S0−>状態S1−>状態S2−>状態S0(状態S0を起点に状態S1,S2,S0と順に遷移することを示す)。状態S0−>状態S1−>状態S2−>状態S1(状態S0を起点に状態S1,S2,S1と順に遷移することを示す)。状態S0−>状態S1−>状態S3(状態S0を起点に状態S1,S3と順に遷移することを示す)。これらの状態遷移は、仕様モデルから得られる状態遷移といえる。
この場合、演算部1bは、記憶部1aに記憶された入力ベクタでは発生しない回路2の状態遷移として次のような遷移の情報を出力する。状態S2−>状態S1。状態S1−>状態S3。これらの状態遷移は、現状の入力ベクタによる論理シミュレーションでは検証できない(未カバーの)状態遷移である。
検証装置1によれば、入力ベクタを回路2に入力する論理シミュレーションにより取得された回路2の出力信号が参照されて、出力信号の変化のパターンが検出される。検出結果に応じて、入力ベクタに対して発生した回路2の内部状態の遷移を示す情報が生成される。生成された情報に基づいて、回路2の仕様モデルを示す仕様データを用いて特定される回路2の内部状態の遷移のうち、現状の入力ベクタを用いた論理シミュレーションでは発生しない遷移の情報が出力される。これにより、入力ベクタの効率的な作成を支援できる。
具体的には、演算部1bにより出力された状態遷移(「状態S2−>状態S1」の遷移や「状態S1−>状態S3」の遷移)は仕様上の動作では発生し得る。しかし、論理シミュレーションによりこれらの状態遷移が発生しないということは、入力ベクタの内容が現状では不足していることを意味する。したがって、電子装置の開発者は、出力された情報を参照して、「状態S2−>状態S1」の遷移や「状態S1−>状態S3」の遷移を論理シミュレーションでカバーできるよう、不足している入力ベクタの内容を補完し得る。未カバーの状態遷移が発生するように入力ベクタの内容を補完していけば、仕様で規定された機能に対する検証の網羅率(カバレッジ)を向上していくことができる。
このように、入力ベクタの作成の目標を「仕様上の動作をカバーできる」点にすることで、実装に対して起こり得る回路2の全ての内部状態を実現するよう入力ベクタを作成するよりも、入力ベクタの作成作業の効率化(例えば、作成作業の短縮化)を図れる。また、仕様上の動作をカバーするように検証を行えるので、基準を定めずに作成した入力ベクタを用いて検証を行うよりも、より現実的で有意義なテスト内容に絞り込めることになる。よって、回路2の動作検証の効率化(例えば、動作検証の短縮化)を図れる。
[第2の実施の形態]
図2は、第2の実施の形態の検証装置のハードウェア例を示す図である。検証装置100は、電子装置に実装するIPの動作検証を行うコンピュータである。検証装置100は、IPの提供元からIPを取得して、電子装置を開発する開発者によって利用される。検証装置100は、提供元から取得したIPが電子装置に組み込んで適正に動作することの検証に用いられる。
検証装置100は、プロセッサ101、RAM102、HDD103、画像信号処理部104、入力処理部105、読み取り装置106および通信インタフェース107を有する。各ユニットが検証装置100のバスに接続されている。
プロセッサ101は、検証装置100の情報処理を制御する。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、DSP、ASICまたはFPGAなどである。プロセッサ101は、CPU、DSP、ASIC、FPGAなどのうちの2以上の要素の組み合わせであってもよい。
RAM102は、検証装置100の主記憶装置である。RAM102は、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、RAM102は、プロセッサ101による処理に用いる各種データを記憶する。
HDD103は、検証装置100の補助記憶装置である。HDD103は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。検証装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
画像信号処理部104は、プロセッサ101からの命令に従って、検証装置100に接続されたディスプレイ11に画像を出力する。ディスプレイ11としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、有機EL(Electro-Luminescence)ディスプレイなど各種のディスプレイを用いることができる。
入力処理部105は、検証装置100に接続された入力デバイス12から入力信号を取得し、プロセッサ101に出力する。入力デバイス12としては、マウスやタッチパネルなどのポインティングデバイス、キーボード、ボタンスイッチなど各種の入力デバイスを用いることができる。また、検証装置100には複数の種類の入力デバイスが接続されてもよい。
読み取り装置106は、記録媒体13に記録されたプログラムやデータを読み取る装置である。記録媒体13として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)を使用できる。また、記録媒体13として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。読み取り装置106は、例えば、プロセッサ101からの命令に従って、記録媒体13から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク10を介して他のコンピュータ(例えば、サーバコンピュータ)と通信を行う。
図3は、検証装置の機能例を示すブロック図である。検証装置100は、記憶部110,120、入力ベクタ生成部130、制約生成部140および検証部150を有する。記憶部110,120は、RAM102やHDD103に確保された記憶領域を用いて実現できる。入力ベクタ生成部130、制約生成部140および検証部150は、プロセッサ101によって実行されるプログラムのモジュールであってもよい。
記憶部110は、形式的検証に用いられるデータや形式的検証の結果を示すデータを記憶する。具体的には、記憶部110は、仕様データ111、制約データ112およびFailパターンデータ113を記憶する。
仕様データ111は、IPの仕様モデルを示すデータである。例えば、仕様データ111は、IPの仕様書から開発者(ユーザということがある)により予め作成され、記憶部110に格納される。仕様データ111は、Promelaと呼ばれるモデル記述言語を用いて作成される。すなわち、仕様データ111は、自然言語で表されたIPの仕様からユーザにより作成された仕様モデルのPromela記述である。
制約データ112は、実装されたIP(実装IPということがある)の動作を記述したデータである。制約データ112は、実装されたIPの論理シミュレーションの結果に基づいて、制約生成部140によりLTL式や手続き型プログラミング言語を用いて生成される。なお、論理シミュレーションには、例えば所定のEDA(Electronic Design Automation)ツールを利用し得る。また、「制約データ」という名称は、後述するモデル検証ツールにおいて、LTL式や手続き型プログラミング言語による記述が仕様モデルに対する制約として扱われる点を考慮したものである。
Failパターンデータ113は、仕様データ111と制約データ112とを用いた形式的検証の結果、仕様データ111からは導かれるが、制約データ112で規定された条件に合致しない状態遷移(反例の状態遷移)を示すデータである。
記憶部120は、論理シミュレーションに用いられるデータを記憶する。具体的には、記憶部120は、実装IPデータ121、入力ベクタ122および状態チェックテーブル123を記憶する。実装IPデータ121は、論理シミュレーションによる検証対象の回路を記述したデータである。具体的には、実装IPデータ121は、所定のハードウェア記述言語(HDL:Hardware Description Language)を用いた実装IPのRTL記述である。HDLでは、例えば、入出力信号などに対応する変数を用いて検証対象の回路が記述される。信号の入出力用のポートは、IPの仕様で規定されるインタフェースに予め対応付けられる。入力ベクタ122は、実装IPの論理シミュレーションに用いられる入力ベクタである。入力ベクタ122は、1つ以上用意されることになる。
状態チェックテーブル123は、IPの仕様モデルにおける状態遷移と実装IPデータ121上の出力信号に対応する変数値の組の変化との対応関係を示す情報である。当該対応関係は、仕様データ111および実装IPデータ121に基づいてユーザにより予め特定され、状態チェックテーブル123に登録される。ただし、仕様データ111および実装IPデータ121の記述ルールに基づいて、検証装置100が状態チェックテーブル123を生成することも考えられる。後述するように、状態チェックテーブル123に登録される対応関係では少なくとも2状態間の遷移に対する変数値の組の変化が登録されていればよい。
入力ベクタ生成部130は、入力ベクタをランダムに生成する。入力ベクタ生成部130は、生成した入力ベクタを用いて実装IPの論理シミュレーションを実行する。入力ベクタ生成部130は、論理シミュレーションにより得られる実装IPからの出力信号に対応する変数値の組の変化を検出し、生成した入力ベクタにより状態チェックテーブル123の何れの状態遷移が発生したかを記録する。
制約生成部140は、入力ベクタ生成部130が生成した入力ベクタによる論理シミュレーションの結果に基づいて、制約データ112を生成する。具体的には、制約生成部140は、論理シミュレーションの結果として得られた出力信号を解析し、出力信号の因果関係の定型のパターン(例えば、コマンド“A”が発生した後に、コマンド“B”が発生するという事象が頻繁に起こる、など)を抽出する。制約生成部140は、定型のパターンの抽出結果を基に制約データ112を生成する。
検証部150は、仕様データ111および制約データ112を用いて形式的手法による検証(形式的検証)を行い、検証結果を出力する。具体的には、検証部150は、検証に失敗した状態遷移の情報をFailパターンデータ113として出力する。形式的検証を行うツールとして、SPINを想定する。制約データ112は、Promela記述の仕様データ111に対するNeverClaimである。
ここで、SPINによるモデル検証の方法としては、文献“吉岡信和、外2名、「SPINによる設計モデル検証」、2008年9月、近代科学社、85頁−95頁”を参考にできる。この文献には、交差点に設けられた2つの信号機の例により、Promela、NeverClaimおよび反例出力の具体例が示されている。
図4は、状態チェックテーブルの例を示す図である。状態チェックテーブル123は、状態遷移、変数、変数と条件および生成チェックフラグの項目を含む。状態遷移の項目には、仕様から特定されるIPの状態遷移の情報が登録される。変数の項目には、複数の出力信号に対応する実装IPデータ121上の変数の組を示す情報が登録される。変数と条件の項目には、状態遷移に対応する変数値の組の変化を示す情報が登録される。生成チェックフラグの項目には、変数値の組の変化(すなわち、状態遷移)に対応する入力ベクタを生成済か否かを示すフラグが登録される(“true”なら生成済であり、“false”なら未生成である)。生成チェックフラグの初期値は“false”である。
例えば、状態チェックテーブル123には、状態遷移が“S0−>S1”、変数が“(x,y)”、変数と条件が“(0,0)−>(1,0)”、生成チェックフラグが“true”という情報が登録されている。この情報は、IPの仕様上の状態遷移“S0−>S1”(状態S0から状態S1への遷移)が実装IPデータ121における変数“(x,y)”の値の変化“(0,0)−>(1,0)”に対応しており、当該変化を発生させる入力ベクタを生成済であることを示す。
図5は、状態遷移と出力信号の変化との対応関係の例を示す図である。図5では、論理シミュレーションにより得られた3つの信号(変数CLK,x,yに相当する3つの信号)の波形を例示している。例えば、変数(x,y)の値の組(0,0)が、IPの状態S0に相当する。変数(x,y)の値の組(1,1)が、IPの状態S2に相当する。変数(x,y)の値の組(1,0)が、IPの状態S1に相当する。
例えば、変数(x,y)について、信号(または、変数)の因果関係から“(0,0)の後に(1,1)へ変化”するという変化パターンを抽出できれば、状態S0から状態S1への遷移が実現されたことになる。同様に、変数(x,y)について、信号(または、変数)の因果関係から“(1,0)の後に(0,0)へ変化”するという変化パターンを抽出できれば、状態S1から状態S0への遷移が実現されたことになる。
次に、検証装置100の処理手順を説明する。まず、入力ベクタの生成処理を説明する。
図6は、入力ベクタの生成処理の例を示すフローチャートである。以下、図6に示す処理をステップ番号に沿って説明する。
(S11)入力ベクタ生成部130は、回数閾値n(nは1以上の整数)、回数k=0を設定する。回数閾値nとしては、開発する装置のテスト規模に応じた値がユーザにより予め設定される。回数kは、入力ベクタの生成回数を示す変数である。
(S12)入力ベクタ生成部130は、回数kが回数閾値nよりも小さい(k<n)か否かを判定する。回数kが回数閾値nよりも小さい場合、処理をステップS13に進める。回数kが回数閾値nよりも小さくない場合(すなわち、回数kが回数閾値nと等しい場合)、処理を終了する。
(S13)入力ベクタ生成部130は、回数kにk+1を代入する。
(S14)入力ベクタ生成部130は、実装IPの論理シミュレーションを行うための入力ベクタをランダム生成する。なお、入力ベクタの生成方法としては種々の方法が考えられる。例えば、ステップS14を繰り返し実行するたびに、1つの入力ベクタのファイル内に、複数の入力信号の時系列の変化のパターンを順次追加していってもよい(何れかの入力信号を固定して他の入力信号を変更するなど)。また、例えば、ステップS14を繰り返し実行するたびに、新しい入力ベクタのファイルを生成していってもよい。
(S15)入力ベクタ生成部130は、ステップS14で生成した入力ベクタを用いて、実装IPの論理シミュレーションを実行する。入力ベクタ生成部130は、論理シミュレーションの結果(実装IPの出力信号のデータを含む)を記憶部120に格納する。
(S16)入力ベクタ生成部130は、状態チェックテーブル123を参照して、実装IPデータ121における変数値の組の変化から、論理シミュレーションにより実現された状態遷移を特定する。ここで、入力ベクタ生成部130は、状態チェックテーブル123のレコードうち、生成チェックフラグが“false”のレコードを順番に走査していけばよい。
(S17)入力ベクタ生成部130は、ステップS16で特定した状態遷移に対応する入力ベクタを生成済であることを状態チェックテーブル123に記録する。具体的には、入力ベクタ生成部130は、ステップS16で特定された状態遷移(変数値の組の変化)に対し、状態チェックテーブル123の生成チェックフラグを“false”から“true”に変更する。
(S18)入力ベクタ生成部130は、状態チェックテーブル123に登録された全ての状態遷移に対して、入力ベクタを生成済である旨が記録されたか否かを判定する。全ての状態遷移に対して入力ベクタを生成済である場合、処理を終了する。全ての状態遷移に対して入力ベクタを生成済でない場合、処理をステップS12に進める。
このようにして、検証装置100は、状態チェックテーブル123に登録された各状態遷移を実現する入力ベクタを生成していく。図6の手順の直後では、状態チェックテーブル123に登録された全ての状態遷移を網羅する入力ベクタが生成されていなくてもよい。すなわち、状態チェックテーブル123に登録された全ての状態遷移に対応する入力ベクタが生成されていなくても、入力ベクタの生成を終えることを許容する。後述するモデル検証の結果から、不足の入力ベクタを事後的に補完できるためである。このため、上記入力ベクタの生成処理を高速化できる。
また、例えば、ステップS16では少なくとも2状態間での1回の状態遷移が特定されていればよい。連続した状態遷移については、後述する検証部150によるモデル検証で特定できるためである。このため、例えば、ステップS16で2状態間での1回の状態遷移に限定して特定するよう制御すれば、状態遷移の特定を高速に行える。その結果、上記入力ベクタの生成処理を高速化できる。
なお、ステップS16で、状態チェックテーブル123に登録された状態遷移を特定できない場合も考えられる。この場合、入力ベクタ生成部130は、ステップS17をスキップしてステップS18を実行する。
上記の手順の結果、状態チェックテーブル123には、各状態遷移に対して入力ベクタを生成済か否かのフラグが設定されることになる。ユーザは、以下に示す検証処理の結果と、状態チェックテーブル123の内容とを参照することで、不足している入力ベクタを効率的に把握し得る。
図7は、検証処理の例を示すフローチャートである。以下、図7に示す処理をステップ番号に沿って説明する。
(S21)制約生成部140は、図6のステップS15における論理シミュレーションにより得られた出力信号を解析し、コマンドのシーケンスを生成する。具体的には、ビットパターン(実装IPデータ121における変数値の組に相当)とコマンドとの対応を示すテーブルを記憶部120に予め格納しておく。すると、制約生成部140は、論理シミュレーションの結果と記憶部120に記憶されたテーブルとに基づいて、出力信号で示されるビットパターンから実装IPにより出力されたコマンド(または、実装IPに入力されたコマンド)を特定し得る。コマンドは、実装IPデータ121における変数値の組に対応付けられるので、コマンドの変化は状態遷移に対応付けることができる。
(S22)制約生成部140は、生成したシーケンスから定型のパターンを抽出する。例えば、制約生成部140は、ある特定のコマンド(第1のコマンドとする)に対して、特定の別のコマンド(第2のコマンドとする)が頻繁に発生する(例えば、所定の頻度を上回る)ことを検出する。すると、制約生成部140は、第1のコマンドの後に第2のコマンドが発生するという定型のパターンを抽出する。
(S23)制約生成部140は、抽出した定型のパターンにより制約データ112を生成する。また、検証部150ではSPINによるモデル検証を行うため、制約生成部140は、SPINに入力するための制約データ112を生成する。制約データ112は、SPINにおけるNeverClaimである。例えば、制約生成部140は、抽出した定型のパターンで特定される状態遷移以外の状態遷移が発生した場合に、NeverClaimが受理(accept)されるよう、制約データ112を生成する。
(S24)検証部150は、仕様データ111および制約データ112を用いた形式的検証を実行する。検証部150は、形式的検証を行うツールとして、SPINを利用できる。検証部150は、SPINを用いた検証により、IPの仕様と設計(実装IP)との間の状態遷移の不整合を検出する。具体的には、検証部150は、Promela記述の仕様データ111に、制約データ112のNeverClaimを追加したデータを生成し、SPINに入力する。検証部150は、仕様モデルにおける状態遷移の検証時、NeverClaimで規定された所定の条件が成立すると、成立に至るまでの状態遷移の情報を反例として生成する。
(S25)検証部150は、ステップS24の検証結果を出力する。例えば、検証部150は、仕様上は発生し得る状態遷移のうち、実装IPに対する論理シミュレーションでは発生しなかった状態遷移の情報をディスプレイ11に表示させる。
このようにして、検証装置100は、仕様モデルに対して、論理シミュレーションでは成立しない状態遷移の情報を出力する。制約データ112は、現状生成済である入力ベクタを用いた論理シミュレーションの結果から作成された情報である。このため、出力された状態遷移は、現状の入力ベクタでは発生しない状態遷移と考えることができる。出力された状態遷移は、論理シミュレーションでは未カバーである仕様上の動作シーケンスであるということもできる。
したがって、検証装置100により出力された状態遷移を、不足している入力ベクタを補完する際の制約条件として利用できる。更に、状態チェックテーブル123から入力ベクタが未生成である状態遷移を特定し、不足している入力ベクタの補完に利用することもできる。このように、形式的検証の結果と、状態チェックテーブル123との両方を活用することで、論理シミュレーションにおける入力ベクタの効率的な作成を支援できる。
図8は、制約データの生成例を示す図である。図8では、USB(Universal Serial Bus)3.0で用いられるコマンドを例示している。例えば、制約生成部140は、実装IPの論理シミュレーションにより得られた出力信号の波形を解析することで、出力信号のビットパターンを取得する。ここで、当該ビットパターンは、状態チェックテーブル123における変数値の組に対応する。例えば、ビットパターンとコマンドとの対応関係を示すテーブルを、記憶部120に予め格納しておき、制約生成部140によるコマンドの特定に利用する。例えば、出力信号が4つ(対応する変数も4つ)であれば、そのビットパターンの1つ(例えば“0110”など)を1つのコマンドに対応付けることができる。
シーケンス201は、このようにして得られたコマンドの時系列を例示している。シーケンス201では下側のコマンドほど後の時間に発生したコマンドを示す。ここで、LGOOD_N(Nはシーケンス番号であり、0〜4の整数)は、相手側の装置にフレームの受信成功を通知するためのメッセージである。また、LCRD_X(Xはバッファ番号であり、A,B,C,Dの何れか)は、相手側の装置にバッファの準備を通知するためのメッセージである。なお、実装IPに対して何らかのコマンドが入力される場合も、論理シミュレーションにより得られた出力信号のビットパターンから入力されたコマンドを特定し得る。
制約生成部140は、統計的手法によりシーケンス201から比較的高頻度で発生する定型のパターン(時系列に発生するコマンドの発生ルール)を抽出し、パターンセット202を生成する。例えば、パターンセット202は、次のような定型のパターンを含む。
(1)LGOOD_NにLCRD_Xが対応する。(2)LGOODの直後にLCRDが返らなくてもよい。(3)LGOODのシーケンス番号Xは0〜4で、順番は入れ替わらない。(4)LCRDのバッファ番号NはA,B,C,Dで、順番は入れ替わらない。
例えば、制約生成部140は、LGOOD_Nの後にLCRD_Xが発生していること、LGOOD_N後のLCRD_Xの発生が比較的高頻度であること、をシーケンス201から抽出することで、(1)のパターンを抽出できる。制約生成部140は、パターンセット202をLTL式で記述することで、制約データ112を生成する。制約データ112は、(1)のパターンのLTL式での記述例を示している(他のパターンの記述例は図示を省略している)。
ここで、コマンドは、実装IPデータ121における変数値の組に対応付けられるので、コマンドの変化を状態遷移に対応付けることができる。したがって、制約データ112は、論理シミュレーションによる出力信号のパターンから得られた実装IPの状態遷移を示す情報であるといえる。検証部150は、制約データ112を利用して、SPINによる検証を行う。
図9は、SPINを用いた検証の例を示す図である。検証部150は、仕様データ111および制約データ112を用いてSPINによる検証を行う。ここでは、仕様データ111のファイル名を“test.pml”としている。図9では、仕様データ111の記述の一部も例示されている。また、制約データ112のファイル名を“never.pml”としている。
検証部150は、仕様データ111と制約データ112とを合わせたデータ(例えば、ファイル名を仕様データ111のファイル名とする)を生成し、SPINへの入力とする。SPINでは、仕様モデルにおける状態遷移の検証時、NeverClaimで規定された所定の条件が成立すると(図9では否定の受理と称している)、SPINにより再現可能であるエラーシーケンスの情報を含む反例データ113aを生成する。ここでは、反例データ113aのファイル名を“test.pml.trail”としている。
検証部150は、反例データ113aを用いてSPINを再度実行することで、仕様モデルで実現される状態遷移のうち、NeverClaimで規定された条件に合致しない状態遷移の情報を含むFailパターンデータ113を生成し、ユーザに提示する。
図10は、制約データ(NeverClaim)の例を示す図である。図10ではUSB3.0でのデータの送受信を想定している。ここで、実装IPを含むホストコントローラを“Tx”、ホストコントローラと接続されたUSBメモリなどのデバイスを“Rx”と表記している(以下、同様)。
例えば、論理シミュレーションの結果から、コマンドのパターンP1,P2,P3が得られているとする。パターンP1は、デバイス側へのACK(ACKnowledgement)送信に対してデバイス側からDP(Data Packet)が応答されるパターンである。パターンP2は、デバイス側へのACK送信に対して、デバイス側から(未準備を通知する)NRDY(Not ReaDY)が応答されるパターンである。パターンP3は、デバイス側へのACK送信に対して、デバイス側から(受信不可を通知する)STALLが応答されるパターンである。
例えば、制約生成部140は、パターンP1を表す記述として、“::p_tp==ACK_TP && c_tp==DP −> goto st;”を生成し、制約データ112に追加する。パターンP2を表す記述として、“::p_tp==ACK_TP && c_tp==NRDY_TP −> goto st;”を生成し、制約データ112に追加する。パターンP3を表す記述として、“::p_tp==ACK_TP && c_tp==STALL_TP −> goto st;”を生成し、制約データ112に追加する。更に、制約生成部140は、パターンP1,P2,P3以外のパターンに関する記述として、“::else −> accept;”を生成し、制約データ112に追加する。
すなわち、パターンP1,P2,P3に相当する状態が発生した場合は、“st”でラベルされた非受理状態へ遷移することになる。パターンP1,P2,P3以外のパターンに相当する状態が発生した場合は、“accept”でラベルされた受理状態へ遷移することになる。受理状態への遷移は、反例データ113aによりエラーとして通知される。
図11は、反例パターンの例(その1)を示す図である。例えば、SPINによる検証の結果、パターンP1,P2,P3とは異なる反例パターン(反例の状態遷移)として、デバイス側へのACK送信に対して、デバイス側からDPが連続して応答されるパターンが検出される。検出されたパターンは、仕様モデルにはあるが、実装IPの論理シミュレーションから導かれたNeverClaimにはないパターン(反例の状態遷移)である。なお、DPは、DPH(Data Packet Header)とDPP(Data Packet Payload)とを含むため、「DPを連続して応答する」ことを「DPPを連続して応答する」ことと考えてもよい。
検証部150は、仕様モデルにはあるがNeverClaimにはないパターンの情報を反例データ113aとして出力する。例えば、検証部150は、反例出力画面300をディスプレイ11に表示させることで、反例データ113aの出力をユーザに通知する。反例出力画面300では、反例データ113aのファイル名“test.pml.trail”が表示される。更に、検証部150は、反例データ113aをSPINに入力することで、反例の状態遷移を再現した内容を含むFailパターンデータ113を生成し、ディスプレイ11に表示させる。
図12は、反例パターンの例(その2)を示す図である。図12では、パターンP1,P2,P3で示される状態遷移および図11で示した反例の状態遷移を例示している。ACKの送信は、初期状態からデータの転送可能状態への状態遷移に相当する。例えば、ACK送信時の実装IPからの出力信号のビットパターン(変数値の組)を転送可能状態に対応付けることができる。DPの受信は、転送可能状態からデータの転送状態への状態遷移に相当する。例えば、DP受信時の実装IPからの出力信号のビットパターンを転送状態に対応付けることができる。NRDYまたはSTALLの受信は、データの転送可能状態から初期状態への状態遷移に相当する。例えば、NRDY受信時またはSTALL受信時の実装IPからの出力信号のビットパターンを初期状態に対応付けることができる。
図11で示した反例の状態遷移によれば、転送状態から転送状態への遷移(自己遷移)が論理シミュレーションではカバーされていないことになる。これは、現状の入力ベクタでは、仕様モデルで実現され得る状態を全て検証するには不十分であることを意味する。したがって、反例パターンで示される状態遷移を発生させることを入力ベクタの補完時の制約(または、要件)として利用できる。すなわち、デバイス側へのACK送信に対して、DPが連続して応答されるという動作を発生させる入力ベクタを作成することで、論理シミュレーションでも当該動作をカバーできることになる。
図13は、論理シミュレーションで未カバーである状態遷移の例を示す図である。前述のように、状態チェックテーブル123および初期の入力ベクタの作成時には、少なくとも2状態間の状態遷移が特定されていればよい。複数の状態遷移を経なければ発生しない状態遷移は、検証部150での形式的検証により検出可能だからである。図13の例において、仕様モデルでは、“状態S2−>状態S0”の遷移が“状態S0−>状態S1−>状態S2”という遷移を経なければ発生しないことも考えられる。例えば、SPINを用いることで、このように複数の状態遷移を経て初めて現れる状態遷移も抽出可能となる。Failパターンデータ113には、論理シミュレーションでカバーされていない状態遷移、および、その状態遷移に至るまでの他の状態遷移の情報が含まれる。
また、状態チェックテーブル123の作成段階では、2状態間の状態遷移が特定されていればよいので、3状態以上の間の状態遷移の発生を想定して状態チェックテーブル123を作成するよりもユーザの作業を簡略化できる。また、図6で例示した入力ベクタの生成も、2状態間の状態遷移がカバーされていればよいので、3状態以上の間の状態遷移の発生を想定して入力ベクタを生成するよりも処理を簡略化できる。前述のように、当初の入力ベクタでは未カバーである仕様モデル上の状態遷移は、検証部150による検証結果から把握できるので、未カバーの状態遷移が発生するよう事後的に入力ベクタの内容を補完できるためである。
図14は、検証範囲の例を示す図である。図14(A)では、比較例として、通常の形式的検証による検証範囲を例示している。具体的には、仕様と(IPの実装を含む)設計との包含関係をチェックし、仕様モデルでは発生し得ないが、設計モデルでは発生する状態遷移がバグとして検出される。
一方、図14(B)では、第2の実施の形態の検証方法における検証範囲の例を示している。具体的には、論理シミュレーションでは発生しないが仕様モデルでは発生し得る状態遷移が、論理シミュレーションでカバーされない状態遷移として検出される。上記のように、未カバーの状態遷移が発生するように入力ベクタの内容を補完していけば、仕様上の機能に対する検証の網羅率(カバレッジ)を向上していくことができる。
特に、IPの仕様モデルで実現され得る状態遷移を論理シミュレーションでもカバーしておくことは重要である。品質向上の観点からは、IPで仕様上実現される全ての動作に対して、IPを電子装置に組み込んだ場合に不具合がないことを検証しておくことが好ましいからである。
以上のように、検証装置100は、論理シミュレーションと形式的検証とを組み合わせて利用することで、仕様上の機能に対する論理シミュレーションでの検証の網羅性を確認する。入力ベクタの作成の目標を「仕様上の動作をカバーできる」点にすることで、実装に対して起こり得るIPの全ての内部状態を実現するよう入力ベクタを作成するよりも、入力ベクタの作成作業の効率化(例えば、作成作業の短縮化)を図れる。
また、仕様上の動作をカバーするように検証を行えるので、基準を定めずに作成した入力ベクタを用いて論理シミュレーションによる検証を行うよりも、より現実的で有意義なテスト内容に絞り込める。よって、実装IPの動作検証の効率化(例えば、動作検証の短縮化)を図れる。
更に、状態チェックテーブル123の内容を参照することで、何れの変数値の組(すなわち、コマンド)に対して入力ベクタを作成済であり、何れの変数値の組に対して入力ベクタを未作成であるかを把握できる。このため、状態チェックテーブル123を入力ベクタの内容の補完に用いることができる。例えば、状態チェックテーブル123で生成チェックフラグが“false”である状態遷移をカバーする入力ベクタの内容を優先的に補完することが考えられる。
また、論理シミュレーションにおいて、実装IPが仕様通りに動作するかを検証するためのアサーションを用意する手間を省くこともできる。実装IPと仕様モデルとの不整合は、検証部150による形式的検証により検出されるからである。このため、論理シミュレーションによる検証におけるユーザの作業の省力化を図れるという利点もある。
なお、第1の実施の形態の情報処理は、演算部1bにプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、プロセッサ101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体13に記録できる。
例えば、プログラムを記録した記録媒体13を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体13に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。