(57)【特許請求の範囲】
【請求項１】
割込みに関する設定を行う割込み設定処理が含まれる検証対象プログラムを検証するプログラム検証装置であって、
前記検証対象プログラムを解析し、前記検証対象プログラムを実行する機器にて前記検証対象プログラムが実行された際に割込みが発生する可能性がある複数のタイミングをそれぞれ割込み候補タイミングとして指定する割込み候補タイミング指定部と、
前記検証対象プログラムを実行するプログラム実行部と、
前記プログラム実行部による前記検証対象プログラムの実行時に、前記割込み設定処理により前記割込み候補タイミングに割込みを禁止する設定が行われていれば、前記割込み候補タイミングに割込みを発生させず、前記割込み設定処理により前記割込み候補タイミングに割込みを許可する設定が行われていれば、前記割込み候補タイミングに割込みを発生させる割込み発生部と、
複数の前記割込み候補タイミングのうち、割込みを禁止することが適正であると想定される割込み候補タイミングを割込み禁止想定タイミングとして選択し、前記検証対象プログラムの実行結果を解析し、前記割込み禁止想定タイミングに前記割込み設定処理により割込みを禁止する設定が行われたか否かを判断する検証部とを有することを特徴とするプログラム検証装置。
【請求項２】
前記プログラム実行部は、
変数にアクセスする処理である変数アクセス処理が含まれる検証対象プログラムを実行し、
前記割込み候補タイミング指定部は、
前記変数アクセス処理によりアクセスされる変数であって前記割込み発生部が割込みを発生させる際に前記割込み発生部によりアクセスされる変数を競合変数として抽出し、
前記変数アクセス処理による前記競合変数へのアクセスの前後のタイミングをそれぞれ割込み候補タイミングとして指定することを特徴とする請求項１に記載のプログラム検証装置。
【請求項３】
前記検証部は、
前記複数の割込み候補タイミングのうち、前記変数アクセス処理による前記競合変数へのアクセスの合間にあたる割込み候補タイミングを前記割込み禁止想定タイミングとして選択し、前記割込み禁止想定タイミングに前記割込み設定処理により割込みを禁止する設定が行われたか否かを判断することを特徴とする請求項２に記載のプログラム検証装置。
【請求項４】
前記検証部は、
前記検証対象プログラムの実行結果として前記競合変数へのアクセス履歴を解析し、前記変数アクセス処理による前記競合変数へのアクセスの合間に割込みによる前記競合変数へのアクセスがあったことを検出した場合に、前記割込み設定処理により前記割込み禁止想定タイミングに割込みを禁止する設定が行われなかったと判断することを特徴とする請求項３に記載のプログラム検証装置。
【請求項５】
検証対象プログラムを検証するプログラム検証装置であって、
前記検証対象プログラムの実行により発生する複数のイベントのうち関連のある２以上のイベントがそれぞれ関連イベントとして相互に対応付けられて示され、前記検証対象プログラムが適正な場合の関連イベント間の発生回数の関係が示される関連イベント情報を記憶する関連イベント情報記憶部と、
前記検証対象プログラムを実行するプログラム実行部と、
前記プログラム実行部による前記検証対象プログラムの実行中の各関連イベントの発生回数を計数する計数部と、
前記計数部により計数された発生回数の関連イベント間の関係が前記関連イベント情報に示されている関係に合致するか否かを判断する検証部とを有することを特徴とするプログラム検証装置。
【請求項６】
前記関連イベント情報記憶部は、
関連イベント間の発生回数の関係として、関連イベント間で発生回数がつり合うことが示される関連イベント情報を記憶し、
前記検証部は、
前記計数部により計数された発生回数が関連イベント間でつり合っているか否かを判断することを特徴とする請求項５に記載のプログラム検証装置。
【請求項７】
前記関連イベント情報記憶部は、
前記検証対象プログラムに含まれる制御処理の実行により発生する、関連する２以上のイベント、
前記検証対象プログラムに含まれるＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）処理の実行により発生する、関連する２以上のイベント、
前記検証対象プログラムに含まれる割込み処理の実行により発生する、関連する２以上のイベント、
前記検証対象プログラムに含まれるタイマ処理の実行により発生する、関連する２以上のイベントのうちの少なくともいずれかが関連イベントとして示される関連イベント情報を記憶することを特徴とする請求項５又は６に記載のプログラム検証装置。
【請求項８】
前記プログラム実行部は、
Ｉ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）デバイスを制御する制御機器の動作アルゴリズムが記述された検証対象プログラムを、前記Ｉ／Ｏデバイスの動作及び前記制御機器の前記Ｉ／Ｏデバイスに対するインタフェースの動作を模擬するＩ／Ｏデバイス模擬プログラムとともに、実行することを特徴とする請求項１〜７のいずれかに記載のプログラム検証装置。
【請求項９】
前記プログラム実行部は、
複数の制御処理が含まれ、前記複数の制御処理のうちの特定の制御処理に対して起動イベントが定義されている検証対象プログラムを実行し、
前記検証対象プログラムの実行中に、前記特定の制御処理の起動イベントが発生した際に、前記特定の制御処理を起動することを特徴とする請求項１〜８のいずれかに記載のプログラム検証装置。
【請求項１０】
前記プログラム実行部は、
複数の制御処理が含まれ、前記複数の制御処理のうちの特定の制御処理に対して終了イベントが定義されている検証対象プログラムを実行し、
前記検証対象プログラムの実行中に、前記特定の制御処理の終了イベントが発生した際に、前記特定の制御処理を終了することを特徴とする請求項１〜９のいずれかに記載のプログラム検証装置。
【請求項１１】
前記プログラム実行部は、
複数の制御処理が含まれる検証対象プログラムを実行し、
前記計数部は、
前記プログラム実行部による前記検証対象プログラムの実行中の各関連イベントの発生回数を制御処理の単位で計数し、
前記検証部は、
２以上の制御処理にまたがって、前記計数部により計数された発生回数の関連イベント間の関係が前記関連イベント情報に示されている関係に合致するか否かを判断することを特徴とする請求項５に記載のプログラム検証装置。
【請求項１２】
コンピュータが、割込みに関する設定を行う割込み設定処理が含まれる検証対象プログラムを検証するプログラム検証方法であって、
前記コンピュータが、前記検証対象プログラムを解析し、前記検証対象プログラムを実行する機器にて前記検証対象プログラムが実行された際に割込みが発生する可能性がある複数のタイミングをそれぞれ割込み候補タイミングとして指定し、
前記コンピュータが、前記検証対象プログラムを実行し、
前記コンピュータが、前記検証対象プログラムの実行時に、前記割込み設定処理により前記割込み候補タイミングに割込みを禁止する設定が行われていれば、前記割込み候補タイミングに割込みを発生させず、前記割込み設定処理により前記割込み候補タイミングに割込みを許可する設定が行われていれば、前記割込み候補タイミングに割込みを発生させ、
前記コンピュータが、複数の前記割込み候補タイミングのうち、割込みを禁止することが適正であると想定される割込み候補タイミングを割込み禁止想定タイミングとして選択し、前記検証対象プログラムの実行結果を解析し、前記割込み禁止想定タイミングに前記割込み設定処理により割込みを禁止する設定が行われたか否かを判断することを特徴とするプログラム検証方法。
【請求項１３】
コンピュータが、検証対象プログラムを検証するプログラム検証方法であって、
前記検証対象プログラムの実行により発生する複数のイベントのうち関連のある２以上のイベントがそれぞれ関連イベントとして相互に対応付けられて示され、前記検証対象プログラムが適正な場合の関連イベント間の発生回数の関係が示される関連イベント情報を、前記コンピュータが、所定の記憶領域から読み出し、
前記コンピュータが、前記検証対象プログラムを実行し、
前記コンピュータが、前記検証対象プログラムの実行中の各関連イベントの発生回数を計数し、
前記コンピュータが、計数された発生回数の関連イベント間の関係が前記関連イベント情報に示されている関係に合致するか否かを判断することを特徴とするプログラム検証方法。
【請求項１４】
コンピュータを、請求項１又は５に記載されたプログラム検証装置として機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム（以下、ソフトウェアともいう）を検証する技術に関する。
【背景技術】
【０００２】
組込みソフトウェア（以下、Ｓ／Ｗとも表記する）の一種である制御Ｓ／Ｗは、多機能化・高付加価値化の要望に応えるために、大規模化・複雑化が急速に進んでいる。
また、ユーザの安全志向の高まりにより、製品の安全性を機能的に担保するための機能安全規格が様々な分野で策定されている。
一例として、自動車向けの機能安全規格ＩＳＯ２６２６２が２０１１年１１月に策定され、製品開発において、コストアップを伴わない規格への対応が要求されている。【０００３】
ＩＳＯ２６２６２では、ハードウェア（以下、Ｈ／Ｗとも表記する）のランダム故障だけではなくＳ／Ｗの系統故障のリスクの増加に対応すべく、安全性を達成するための開発プロセスと作業項目、各作業項目の成果物と推奨技法を規定している。【０００４】
ＩＳＯ２６２６２に適合させながら製品を開発するためには、安全要求を実現するのに必要十分な作業項目と推奨技法を取捨選択して成果物を作成し、ＩＳＯ２６２６２認証を取得している各種ツールを活用して成果物の妥当性を検証することが、品質・コスト面から必要である。【０００５】
また、近年の制御Ｓ／Ｗの開発プロジェクトでは、多機能化・高付加価値化の要望に応えるために、制御Ｓ／Ｗが制御対象とするＩ／Ｏ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）デバイスの点数及び種類が増加している。
Ｉ／Ｏデバイスの点数及び種類の増加により、処理順序や実行タイミングの全てを網羅した試験を行うことが困難になっている。
このため、Ｓ／Ｗ結合試験以降の実機動作時（制御Ｓ／Ｗが制御機器に実装されて実行される際）に、試験では想定されなかった特殊な条件下で制御Ｓ／Ｗが実行され、Ｈ／Ｗ−Ｓ／Ｗインタフェースに関する不具合が発生することが問題になっている。【０００６】
制御Ｓ／Ｗの単体試験で実施するＨ／Ｗ−Ｓ／Ｗインタフェース検証では、試験後の実機動作時にまれにしか起こらない条件を全て想定し、全ての条件に対応させた試験をもれなく行うことが要求される。
具体的には、以下の要求事項を実現することが求められる。
（１）検証結果を保証するため、可能な限り、検証対象のプログラムである実装コードを修正しないこと。
（２）Ｈ／ＷとＳ／Ｗの並行動作による処理のバリエーションをもれなく検証可能なこと。
（３）実装コードの有限時間動作を模擬可能なこと。
一般に、機器を止めずに無限時間動作を続ける状況は考えにくいため、有限時間動作の模擬でよい。【０００７】
Ｈ／Ｗ−Ｓ／Ｗインタフェース検証のための従来のソフトウェア並行動作検証技術としては、Ｉ／Ｏデバイスの動作を模擬する方法（例えば特許文献１）と、モデル検査による実装コード解析（例えば非特許文献１）とが用いられることが多い。【０００８】
Ｉ／Ｏデバイスの動作を模擬する方法（例えば特許文献１）では、手作業で設定したＩ／Ｏデバイスの動作条件に従って、Ｉ／Ｏデバイスの演算と割込み処理の有限時間動作を模擬することが可能である。
また、モデル検査による実装コード解析（例えば非特許文献１）では、実装コードをＳＭＴ（Ｓａｔｉｓｆｉａｂｉｌｉｔｙ  Ｍｏｄｕｌｏ  Ｔｈｅｏｒｉｅｓ）形式という専用記述に変換することで、有限時間での並行動作のバリエーションをもれなく検証可能である。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００７−２３３６７５号公報
【非特許文献】
【００１０】
【非特許文献１】Ｌｕｃａｓ  Ｃｏｒｄｅｉｒｏ，  Ｂｅｒｎｄ  Ｆｉｓｃｈｅｒ，  “Ｖｅｒｉｆｙｉｎｇ  Ｍｕｌｔｉ−ｔｈｒｅａｄｅｄ  Ｓｏｆｔｗａｒｅ  ｕｓｉｎｇ  ＳＭＴ−ｂａｓｅｄ  Ｃｏｎｔｅｘｔ−Ｂｏｕｎｄｅｄ  Ｍｏｄｅｌ  Ｃｈｅｃｋｉｎｇ，”  ＩＣＳＥ’１１，  Ｍａｙ  ２０１１．
【発明の概要】
【発明が解決しようとする課題】
【００１１】
従来のソフトウェア並行動作検証技術には以下に示す課題がある。【００１２】
Ｉ／Ｏデバイスの動作を模擬する方法では、実装コードを修正せずに有限時間動作を検証可能である（要求事項（１）および（３）を達成可能）。
しかし、試験実施者が手作業により検証の条件を設定すると、試験実施者が想定する条件内での試験しかできず、Ｈ／ＷとＳ／Ｗの並行動作による処理のバリエーションをもれなく検証できるとは限らない（要求事項（２）を達成できない）。【００１３】
モデル検査による実装コード解析では、Ｈ／ＷとＳ／Ｗの並行動作による処理のバリエーションを検証可能である（要求事項（２）および（３）を達成可能）。
しかし、実装コードと専用記述とが一致していることの保証が困難であり、実装コードと専用記述との間の一致性を保証するための追加工数が発生してしまう（要求事項（１）を達成できない）。【００１４】
この発明は、上記のような事情に鑑みたものであり、検証対象プログラムを修正することなく、実機動作時に発生する条件にて検証対象プログラムの検証を行うことを主な目的とする。
【課題を解決するための手段】
【００１５】
本発明に係るプログラム検証装置は、
割込みに関する設定を行う割込み設定処理が含まれる検証対象プログラムを検証するプログラム検証装置であって、
前記検証対象プログラムを解析し、前記検証対象プログラムを実行する機器にて前記検証対象プログラムが実行された際に割込みが発生する可能性がある複数のタイミングをそれぞれ割込み候補タイミングとして指定する割込み候補タイミング指定部と、
前記検証対象プログラムを実行するプログラム実行部と、
前記プログラム実行部による前記検証対象プログラムの実行時に、前記割込み設定処理により前記割込み候補タイミングに割込みを禁止する設定が行われていれば、前記割込み候補タイミングに割込みを発生させず、前記割込み設定処理により前記割込み候補タイミングに割込みを許可する設定が行われていれば、前記割込み候補タイミングに割込みを発生させる割込み発生部と、
前記複数の割込み候補タイミングのうち、割込みを禁止することが適正であると想定される割込み候補タイミングを割込み禁止想定タイミングとして選択し、前記検証対象プログラムの実行結果を解析し、前記割込み禁止想定タイミングに前記割込み設定処理により割込みを禁止する設定が行われたか否かを判断する検証部とを有することを特徴とする。
【発明の効果】
【００１６】
本発明では、検証対象プログラムを解析し、検証対象プログラムが機器で実行される際に割込みが発生する可能性がある割込み候補タイミングを指定し、割込み候補タイミングでの割込み設定処理の設定に従って割込みの発生有無を調整する。
このため、割込み制御について、実機動作時と同じ条件で検証対象プログラムの検証を行うことができる。
【図面の簡単な説明】
【００１７】
【図１】実施の形態１に係るシミュレータ装置の構成例を示す図。
【図２】実施の形態１に係るシミュレータ装置と実装コードとＩ／Ｏデバイス模擬プログラムとの関係を示す図。
【図３】実施の形態１に係る実装コードのＳ／Ｗアーキテクチャを示す図。
【図４】実施の形態１に係るシミュレータ装置の動作例を示すフローチャート図。
【図５】実施の形態１に係る検証シナリオの生成手順の例を示す図。
【図６】実施の形態１に係る割込みポイントの例を示す図。
【図７】実施の形態１に係る入力シーケンス情報の例を示す図。
【図８】実施の形態１に係る割込みポイント情報の例を示す図。
【図９】実施の形態１に係るスケジューラ設定の例を示す図。
【図１０】実施の形態１に係るＩ／Ｏデバイス状態情報（割込み）の例を示す図。
【図１１】実施の形態１に係るＩ／Ｏデバイス状態情報（タイマ）の例を示す図。
【図１２】実施の形態１に係る制御操作回数情報（連携操作）の例を示す図。
【図１３】実施の形態１に係る制御操作回数情報（Ｉ／Ｏ操作）の例を示す図。
【図１４】実施の形態１に係る制御操作回数情報（割込み操作）の例を示す図。
【図１５】実施の形態１に係る制御操作回数情報（タイマ操作）の例を示す図。
【図１６】実施の形態１に係る制御信号アクセスログの例を示す図。
【図１７】実施の形態２に係るスケジューラ設定の例を示す図。
【図１８】実施の形態３に係る制御操作回数情報（割込み操作）の例を示す図。
【図１９】実施の形態１に係る制御操作情報の例を示す図。
【図２０】実施の形態１〜３に係るシミュレータ装置のハードウェア構成例を示す図。
【発明を実施するための形態】
【００１８】
実施の形態１．
本実施の形態では、検証対象プログラムである実装コードを可能な限り修正せずに、Ｈ／ＷとＳ／Ｗの並行動作による処理のバリエーションを検証するシミュレータ装置を説明する。
より具体的には、本実施の形態では、単体試験においてＩ／Ｏデバイスの動作を模擬するＩ／Ｏデバイス模擬プログラムを用いて、実装コードを検証するシミュレータ装置を説明する。
本実施の形態に係るシミュレータ装置により、Ｓ／Ｗ結合試験以降からの手戻り工数を削減することが可能になる。
【００１９】
図２は、本実施の形態の形態に係るシミュレータ装置１００と、検証の対象となる実装コード５００と、Ｉ／Ｏデバイスを模擬するＩ／Ｏデバイス模擬プログラム６００との関係を示す。
なお、シミュレータ装置１００は、プログラム検証装置の例に相当する。
【００２０】
実装コード５００は、制御機器２００の動作アルゴリズムが記述されたプログラムである。
実装コード５００は、シミュレータ装置１００を用いた検証を含む試験後に、制御機器２００に実装され、制御機器２００で実行される。
実装コード５００は、シミュレータ装置１００による検証の対象となるプログラムであり、検証対象プログラムの例に相当する。
【００２１】
制御機器２００は、図２に示すように、制御対象であるセンサデバイス３００及び駆動デバイス４００を制御する。
制御機器２００には、ハードウェアとして、Ｉ／Ｏポート２０４、Ｉ／Ｏポート２０５、割込み２０６、タイマ２０７が含まれる。
また、図２には図示を省略しているが、制御機器２００にはＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）又はマイクロコンピュータ、メモリといったハードウェアが搭載される。
制御機器２００は、センサデバイス３００や駆動デバイス４００などの制御対象に、デジタル信号またはアナログ信号を送受信するためのＩ／Ｏポート２０４、２０５を介して接続され、Ｉ／Ｏポート２０４、２０５を介してセンサデバイス３００及び駆動デバイス４００を制御する。
Ｉ／Ｏデバイス模擬プログラム６００は、図２に示すように、センサデバイス３００、駆動デバイス４００、Ｉ／Ｏポート２０４、Ｉ／Ｏポート２０５、割込み２０６及びタイマ２０７を模擬するプログラムである。
シミュレータ装置１００は、実装コード５００及びＩ／Ｏデバイス模擬プログラム６００を実行して、制御機器２００の動作を模擬する。
【００２２】
実装コード５００に含まれるＳ／Ｗは、制御処理Ａ２０１、制御処理Ｂ２０２及びハードウェアドライバ２０３がある。
制御処理Ａ２０１及び制御処理Ｂ２０２は、制御対象に物理的な制御をかけるための制御ロジックを実現する。
ハードウェアドライバ２０３は、制御処理Ａ２０１及び制御処理Ｂ２０２とＨ／Ｗ（Ｉ／Ｏポート２０４、Ｉ／Ｏポート２０５、割込み２０６、タイマ２０７）との間を仲介するプログラムである。
ハードウェアドライバ２０３において、Ｉ／Ｏ処理２０３１は、制御処理Ａ２０１、制御処理Ｂ２０２のＩ／Ｏポート２０４、２０５へのレジスタアクセスを仲介する。
割込み処理２０３２は、Ｈ／Ｗからの割込み発生に対するハンドラとして機能する。
タイマ処理２０３３は、Ｈ／Ｗからのタイムアウト発生に対するハンドラとして機能する。
【００２３】
なお、図２に示した制御機器２００の構成及び制御機器２００に接続されるデバイスは一例であり、本実施の形態の適用範囲を図２の例に限定するものではない。
【００２４】
シミュレータ装置１００は、実装コード５００を、Ｉ／Ｏデバイス模擬プログラム６００とともに実行して、実装コード５００の検証を行う。
シミュレータ装置１００には、スケジューラ１０１、検証シナリオ作成部１０２、制御監視部１０３、検証項目解析部１０４、割込み模擬部１０５、タイマ模擬部１０６が含まれる。
各要素の詳細は、図２を参照して後述する。
【００２５】
シミュレータ装置１００は、主に、割込みについての検証と、イベント発生回数についての検証を行う。
以下にて、割込みについての検証とイベント発生回数についての検証を概説する。
また、以下では、説明の便宜上、割込みについての検証と、イベント発生回数についての検証を分けて説明するが、シミュレータ装置１００は、割り込みについての検証とイベント発生回数についての検証を並行して行うことができる。
【００２６】
実装コード５００の実行時に、制御処理またはハードウェアドライバ内の各処理が、複数の変数（後述する連携信号２５１、Ｉ／Ｏポート信号２５２、状態変数２５３、カウンタ変数２５４）に排他的に（割込みを介在させずに）連続してアクセスすべき局面がある。
このような局面では、制御処理またはハードウェアドライバ内の各処理は、割込みを禁止して当該複数の変数にアクセスすることが必要である。
割込みについての検証では、シミュレータ装置１００は、このような割込みを禁止することが適正と想定されるタイミング（割込み禁止想定タイミングという）で制御処理Ａ２０１が適切に割込みを禁止しているか否かを検証する。
【００２７】
制御処理及びハードウェアドライバ内の各処理は、上述のように、変数にアクセスする処理であり、変数アクセス処理の例に相当する。
また、制御処理及びハードウェアドライバ内の各処理は、割込みを許可する設定（以下、許可設定ともいう）及び割込みを禁止する設定（以下、禁止設定ともいう）を行っており、割込み設定処理の例にも相当する。
【００２８】
なお、以下では、制御処理Ａ２０１が割込みの制御を適切に行っているかを検証する例を説明するが、制御処理Ｂ２０２、ハードウェアドライバ内の各処理が割込みの制御を適切に行っているかを検証する場合も同様の手順による。
【００２９】
シミュレータ装置１００では、まず、検証シナリオ作成部１０２が実装コード５００を解析する。
検証シナリオ作成部１０２は、実装コード５００が制御機器２００に実装されて制御機器２００により実行される際に割込みが発生する可能性のある複数のタイミング（割込み候補タイミング又は割込みポイントという）を指定する。
次に、スケジューラ１０１が、検証のために実装コード５００を実行する。
実装コード５００の実行中に割込み候補タイミングが到来する度に、割込み模擬部１０５は、制御処理Ａ２０１が許可設定及び禁止設定のいずれを行っているかを調査する。
割込み模擬部１０５は、割込み候補タイミングにおいて許可設定が行われていれば、割込みを発生させる。
一方、割込み候補タイミングにおいて禁止設定が行われていれば、割込み模擬部１０５は、割込みを発生させない。
実装コード５００の実行が完了すると、検証項目解析部１０４が、複数の割込み候補タイミングのうち、割込みを禁止すること適正が想定される割込み候補タイミング（制御処理による禁止設定の適否をユーザに判断してもらうことが望ましいと考えられる割込み候補タイミング）を割込み禁止想定タイミングとして選択し、実装コード５００の実行結果に基づき、割込み禁止想定タイミングで制御処理Ａ２０１が適切に割込みを禁止しているか否かを検証する。
【００３０】
イベント発生回数の検証では、シミュレータ装置１００は、関連のある２以上のイベントの各々の発生回数が適正であるかを検証する。
【００３１】
シミュレータ装置１００は、実装コード５００の実行により発生する複数のイベントのうち関連のある２以上のイベントをそれぞれ関連イベントとして相互に対応付けて記憶している。
関連イベントは、例えば、要求イベントと応答イベントのように因果関係にある２つ以上のイベントである。
また、シミュレータ装置１００は、実装コード５００が適正な場合の関連イベント間の発生回数の関係を記憶している。
例えば、シミュレータ装置１００が、イベントＡとイベントＢとを関連イベントとして対応付けて記憶していると仮定する。
この場合に、シミュレータ装置１００は、関連イベントの発生回数の関係として、例えば、イベントＡの発生回数とイベントＢの発生回数とが等しいという関係を記憶している。
【００３２】
スケジューラ１０１が実装コード５００を実行し、実装コード５００の実行により発生するイベントの発生回数を制御監視部１０３が計数する。
そして、実装コード５００の実行が完了した後に、検証項目解析部１０４が、関連イベントの発生回数が適正であるか否かを検証する。
前出の例では、制御監視部１０３がイベントＡの発生回数とイベントＢの発生回数を計数し、検証項目解析部１０４が、計数されたイベントＡの発生回数とイベントＢの発生回数が等しいか否かを検証する。
【００３３】
図３は、実装コード５００のＳ／Ｗアーキテクチャを示す。
スケジューラ１０１は、制御処理Ａ２０１及び制御処理Ｂ２０２とハードウェアドライバ２０３内の各処理を周期的に起動する。
これらの処理間で制御信号と呼ぶ共有変数を介してデータが送受信され、また、制御操作が実行される。
なお、図３に示した処理と信号の関係は例示であり、本実施の形態の適用範囲を図３の例に限定するものではない。
制御操作と制御信号に関する説明を以下にて行う。
【００３４】
制御操作には、制御処理間での連携操作と、制御処理からハードウェアドライバに対して行われるＩ／Ｏ操作、割込み操作、タイマ操作が含まれる。
連携操作には、ある制御処理（例えば制御処理Ａ２０１）が他の制御処理（例えば制御処理Ｂ２０２）に所定の演算を要求する要求操作と、演算を要求された制御処理（例えば制御処理Ｂ２０２）が要求元の制御処理（例えば制御処理Ａ２０１）に演算結果を応答する応答操作が含まれる。
Ｉ／Ｏ操作には、制御処理がＩ／Ｏデバイスからデータを読み込む操作、制御処理がＩ／Ｏデバイスへデータを書き出す操作が含まれる。
割込み操作には、制御処理が割込み許可を設定する操作、制御処理が割込み禁止を設定する操作が含まれる。
タイマ操作には、制御処理がタイマ開始を通知する操作、制御処理がタイマ終了を通知する操作、制御処理がタイムアウトの通知を受け付ける操作が含まれる。
【００３５】
制御信号には、制御処理間で送受信する連携信号２５１と、制御処理とハードウェアドライバとの間で送受信するＩ／Ｏ信号が含まれる。
Ｉ／Ｏ信号には、制御処理とＩ／Ｏ処理２０３１との間の情報伝達のためのＩ／Ｏポート信号２５２、制御処理と割込み処理２０３２との間の情報伝達のための状態変数２５３、制御処理とタイマ処理２０３３との間の情報伝達のためのカウンタ信号２５４が含まれる。
なお、Ｉ／Ｏ信号として、図３に示していない信号を追加してもよい。
【００３６】
シミュレータ装置１００は、例えば、連携操作における要求操作と応答操作を関連イベントとして管理する。
また、シミュレータ装置１００は、例えば、Ｉ／Ｏ操作におけるＩ／Ｏ読み込み操作とＩ／Ｏ書出し操作も関連イベントとして管理する。
また、シミュレータ装置１００は、例えば、割り込み操作における割込み許可の設定操作と割込み禁止の設定操作も関連イベントとして管理する。
更に、シミュレータ装置１００は、例えば、タイマ操作におけるタイマ開始を通知する操作、タイマ終了の通知を受け付ける操作、タイムアウトの通知を受け付ける操作も関連イベントとして管理する。
【００３７】
ハードウェアドライバ２０３では、Ｉ／Ｏポートのレジスタアクセス、Ｈ／Ｗでの割込み発生、およびＨ／Ｗでのタイムアウト発生を処理するため、Ｉ／Ｏ処理２０３１、割込み処理２０３２、タイマ処理２０３３が制御処理と並行に動作する。
【００３８】
スケジューラ１０１は、制御処理Ａ２０１、制御処理Ｂ２０２、Ｉ／Ｏ処理２０３１、割込み処理２０３２、タイマ処理２０３３の実行を管理する。
例えば、スケジューラ１０１は、ハードウェアドライバ２０３の実行優先度が制御処理よりも高ければ、制御処理の実行を中断してハードウェアドライバ２０３の実行を開始し、ハードウェアドライバ２０３の実行が終了した後に制御処理の実行を再開する。
制御処理とハードウェアドライバ２０３は、制御信号の値に基づいて、それぞれの処理内容を変更する。
【００３９】
次に、本実施の形態に係るシミュレータ装置１００の構成を、図１を用いて説明する。
【００４０】
検証シナリオ作成部１０２は、プログラム記憶部１０８から実装コード５００を読み出し、また、連携変数記憶部１０７から連携変数を読み出し、実装コード５００と連携変数を解析して検証シナリオを作成する。
検証シナリオは、入力シーケンス情報と割込みポイント情報で構成される。
入力シーケンス情報は、実装コード５００に入力される入力値の変遷が示される情報である。
入力シーケンス情報は、例えば、図７に示す情報である。
割込みポイント情報は、割込みポイントが示される情報である。
割込みポイント情報は、例えば、図８に示す情報である。
なお、入力シーケンス情報及び割込みポイント情報の詳細は、後述する。
なお、検証シナリオ作成部１０２により生成された検証シナリオは、検証シナリオ記憶部１１０に格納される。
なお、検証シナリオ作成部１０２は、割込み候補タイミング指定部の例に相当する。
【００４１】
実装コード実行部１０１１は、プログラム記憶部１０８から実装コード５００を読み出し、また、スケジューラ設定記憶部１０９からスケジューラ設定を読み出し、スケジューラ設定に従って実装コード５００を実行する。
スケジューラ設定は、実装コード５００とＩ／Ｏデバイス模擬プログラム６００の起動周期及び起動順序が示されている情報である。
スケジューラ設定は、例えば、図９に示す情報である。
スケジューラ設定の詳細は後述する。
なお、実装コード実行部１０１１は、プログラム実行部の例に相当する。
【００４２】
Ｉ／Ｏデバイス模擬プログラム実行部１０１２は、プログラム記憶部１０８からＩ／Ｏデバイス模擬プログラム６００を読み出し、検証シナリオ記憶部１１０から検証シナリオを読み出し、スケジューラ設定記憶部１０９からスケジューラ設定を読み出す。
そして、Ｉ／Ｏデバイス模擬プログラム実行部１０１２は、検証シナリオ及びスケジューラ設定に従って、Ｉ／Ｏデバイス模擬プログラム６００を実行する。
Ｉ／Ｏデバイス模擬プログラム実行部１０１２は、Ｉ／Ｏデバイス模擬プログラム６００の実行にあたって、タイマ模擬部１０６からのタイマ通知も利用する。
また、Ｉ／Ｏデバイス模擬プログラム実行部１０１２は、割込み模擬部１０５からのＨ／Ｗ割込みに基づき、割込み２０６を模擬して、ハードウェアドライバ２０３内の割込み処理２０３２に対して割込みを要求する。
Ｉ／Ｏデバイス模擬プログラム実行部１０１２は、プログラム実行部の例に相当し、また、割込み発生部の例にも相当する。
【００４３】
なお、実装コード実行部１０１１とＩ／Ｏデバイス模擬プログラム実行部１０１２は、図２に示したスケジューラ１０１を詳細化したものである。
【００４４】
割込み模擬部１０５は、検証シナリオ記憶部１１０から検証シナリオを読み出し、Ｉ／Ｏデバイス状態記憶部１１１からＩ／Ｏデバイス状態情報（割込み）を読み出す。
そして、割込み模擬部１０５は、検証シナリオとＩ／Ｏデバイス状態情報（割込み）に従ってＨ／Ｗ割込みの動作を模擬する。
Ｉ／Ｏデバイス状態情報（割込み）には、割込みが許可されているか、割込みが禁止されているかが示される。
Ｉ／Ｏデバイス状態情報（割込み）は、例えば、図１０に示す情報である。
割込み模擬部１０５は、検証シナリオに示される割込みポイントが到来した際に、Ｉ／Ｏデバイス状態情報（割込み）を参照し、割込みが許可されている場合に、Ｈ／Ｗ割込みをＩ／Ｏデバイス模擬プログラム実行部１０１２に通知する。
Ｉ／Ｏデバイス状態情報（割込み）の詳細は後述する。
割込み模擬部１０５は、割込み発生部の例に相当する。
【００４５】
タイマ模擬部１０６は、Ｉ／Ｏデバイス状態記憶部１１１からＩ／  Ｏデバイス状態情報（タイマ）を読み出し、Ｉ／Ｏデバイス状態情報（タイマ）に従ってＨ／Ｗタイマの動作を模擬する。
Ｉ／Ｏデバイス状態情報（タイマ）には、タイマ設定の詳細が示される。
Ｉ／Ｏデバイス状態情報（タイマ）は、図１１に示す情報である。
Ｉ／Ｏデバイス状態情報（タイマ）の詳細は後述する。
【００４６】
制御監視部１０３は、制御操作情報記憶部１１５から制御操作情報を読み出し、実装コード５００の実行中に、制御操作情報に従って、イベント発生回数である制御操作回数を計数する。
また、制御監視部１０３は、実装コード５００の実行中に、制御処理Ａ２０１等による制御信号（変数）へのアクセス状況を監視する。
更に、制御監視部１０３は、制御操作回数を制御操作回数記憶部１１２に記録し、変数アクセス状況を制御信号アクセスログとして制御信号アクセスログ記憶部１１３に記録する。
制御操作回数は、例えば図１２〜図１５に示す形式で制御操作回数記憶部１１２に記録される。
また、制御信号アクセスログは、例えば図１６に示す情報である。
制御操作情報には、関連イベントである関連操作が示され、関連操作間の発生回数の関係についての条件が示される。
制御操作情報は、例えば、図１９に示す情報である。
【００４７】
図１９では、制御処理Ａ２０１と制御処理Ｂ２０２との間の連携操作での関連操作が示される。
図１９の例では、演算の種類が異なる連携操作Ｘと連携操作Ｙが示される。
連携操作Ｘでは、制御処理Ａ２０１からの要求操作と制御処理Ｂ２０２からの応答操作が関連操作として定義され、連携操作Ｙでは、制御処理Ｂ２０２からの要求操作と制御処理Ａ２０１からの応答操作が関連操作として定義されている。
また、図１９の例では、関係条件が「±０」となっており、要求操作の発生回数と応答操作の発生回数が等しいことが条件となっている。
関係条件は、実装コード５００が適正な場合の関連操作間の発生回数の関係が定義されており、図１９の例では、実装コード５００が適正な場合は、要求操作の発生回数と応答操作の発生回数が等しいことが定義されている。
図１９では図示を省略しているが、制御操作情報には、図１９と同様の内容がＩ／Ｏ操作、割込み操作、タイマ操作にも定義されている。
また、図１９の例では、要求操作の発生回数と応答操作の発生回数が等しいことが条件となっているが、これ以外の条件を定義してもよい。
例えば、［要求操作の回数］≧［応答操作の回数］であれば実装コード５００が適正と判断する旨の条件を定義してもよい。
なお、制御監視部１０３は、計数部の例に相当する。
また、制御操作情報は関連イベント情報の例に相当する。
また、制御操作情報記憶部１１５は関連イベント情報記憶部の例に相当する。
【００４８】
検証項目解析部１０４は、制御操作回数記憶部１１２から制御操作回数を読み出し、制御操作回数が制御操作情報に示す関係条件に合致するかを検証する。
また、検証項目解析部１０４は、制御信号アクセスログ記憶部１１３から制御信号アクセスログを読み出す。
そして、検証項目解析部１０４は、制御処理Ａ２０１等による制御信号（変数）へのアクセス状況を解析し、割込み禁止想定タイミングにおいて適切に割込みが禁止されているか否かを検証する。
また、検証項目解析部１０４は検証結果を示す検証レポートを作成し、作成した検証レポートを検証レポート記憶部１１４に格納する。
検証項目解析部１０４は、検証部の例に相当する。
【００４９】
次に、本実施の形態に係るシミュレータ装置１００の動作例を図４のフローチャートを用いて説明する。
図４のフローチャートの入力は、実装コード５００と連携変数を識別する情報である。
図４のフローチャートの出力は、実装コード５００の実行結果を検証項目解析部１０４が検証した結果である検証レポートである。
【００５０】
センサデバイス３００及び駆動デバイス４００といったＩ／Ｏデバイスの動作を模擬するには、Ｉ／Ｏデバイス模擬プログラム６００を実装コード５００とは異なる短い周期で実行する必要がある。
以降では、図４のフローチャートの各ステップを順に説明していくが、各ステップを説明順に実行するわけではない。
実装コード５００の実行（Ｓ１０２）から割込み処理の実行（Ｓ１０６）までの各ステップが逐次実行され、Ｉ／Ｏデバイス模擬プログラム６００の実行（Ｓ１０７）からタイマ処理の実行（Ｓ１０９）までの各ステップが逐次実行され、これら２つのフローが並行に実行される。
【００５１】
まず、検証シナリオ作成部１０２が、実装コード５００と連携変数を解析して、検証シナリオを作成する（Ｓ１０１）。
前述したように、検証シナリオは、入力シーケンス情報と割込みポイント情報から構成される。
入力シーケンス情報は、ハードウェアドライバ２０３を介して実装コード５００に与える入力値を時系列に並べた情報である。
割込みポイント情報は、Ｈ／Ｗでの割込み発生を模擬するタイミング（割込みポイント）を指定する情報である。
【００５２】
図５に示すように、検証シナリオ作成部１０２は、客先仕様書、制御仕様書、関数仕様書など実装コード５００を作成するための入力成果物に基づいて、例えば既存の方法を用いて入力シーケンス情報を作成する。
または、検証シナリオ作成部１０２は、実装コード５００のカバレッジ基準（例えばＣ０、Ｃ１、Ｃ２、ＭＣ／ＤＣ（Ｍｏｄｉｆｉｅｄ  Ｃｏｎｄｉｔｉｏｎ／Ｄｅｃｉｓｉｏｎ  Ｃｏｖｅｒａｇｅ）など）に基づいて、例えば既存の方法を用いて入力シーケンス情報を作成してもよい。
または、これら２つの方法を組み合わせて作成してもよい。
【００５３】
割込みポイント情報の作成では、検証シナリオ作成部１０２は、実装コード５００内で、複数の処理（複数の制御処理、制御処理とハードウェアドライバ内の処理）が同一の制御信号（変数）にアクセスしている箇所を特定し、複数の処理がアクセスする制御信号（変数）を競合制御信号（競合変数）として抽出する。
そして、検証シナリオ作成部１０２は、競合制御信号へのアクセスの前後をそれぞれ割込みポイントとして指定する。
図６は、競合制御信号及び割込みポイントを説明する。
図６では、制御処理Ａ２０１及び割込み処理２０３２が状態変数１〜３にアクセスし、タイマ処理２０３３が状態変数３にアクセスしている。
このように、状態変数１〜３は、複数の処理によりアクセスされており、検証シナリオ作成部１０２は、状態変数１〜３を競合制御信号として抽出する。
そして、検証シナリオ作成部１０２は、各状態変数へのアクセスの前後のタイミングを割込みポイントとして指定する。
図６の例では、検証シナリオ作成部１０２は、４つのタイミングを割込みポイントとして指定している。
【００５４】
図７は、入力シーケンス情報の例を示している。
図７の例では、実装コード５００の入力変数をｉ、ｊとし、入力変数ｉ、ｊに代入される値を時系列に示している。
図７の各行は、１つの試験での入力値のパターンを示している。
本実施の形態では、シミュレータ装置１００は有限時間動作を模擬するため、入力シーケンス情報では、最大ステップ数が指定されている。
最大ステップ数は、起動回数の最大値、すなわち動作終了時点を判定するための起動回数である。
図８は、割込みポイント情報の例を示している。
図８は、図６の例に対応させた割込みポイント情報である。
前述したように、状態変数１〜３へのアクセスの前後のタイミングが割込みポイントである。
シミュレータ装置１００は、図７の行数分の試験を行う。
つまり、入力シーケンス情報がｎ行で構成されていれば、割込み模擬部１０５は、入力シーケンス情報の各行の入力値のパターンを用いて、実装コード５００の実行をｎ回繰り返す。
そして、割込み模擬部１０５は、実装コード５００の各回の実行時に、図８に示す割込みポイントにて割込みが禁止されていなければ、Ｈ／Ｗ割込みを発生させる。
【００５５】
説明を図４のフローチャートに戻す。
検証シナリオが生成されると、スケジューラ設定で指定されている起動周期と起動順序に従って、実装コード５００中の制御処理とＩ／Ｏデバイス模擬プログラム６００が実行される（Ｓ１０２、Ｓ１０７）。
【００５６】
Ｉ／Ｏデバイス模擬プログラム６００の実行（Ｓ１０７）では、Ｉ／Ｏデバイス模擬プログラム実行部１０１２が、検証シナリオの入力シーケンス情報から該当するステップの入力値を読み取って、実装コード５００の入力変数に設定する。
スケジューラ設定を図９に示す。
【００５７】
図９では、シミュレータ装置１００において二種類のＩ／Ｏデバイス模擬プログラム６００が実行され、二種類のＩ／Ｏ処理２０３１が実行され、二種類の制御処理が実行される場合のスケジューラ設定を示している。
また、起動順序は、同じ起動周期を持つ処理が複数ある場合の実行優先度を表す。
起動順序が「１」の処理が優先して実行される。
【００５８】
実装コード５００の実行（Ｓ１０２）では、実装コード実行部１０１１が、実装コード５００に記述されている制御ロジックのとおりに、入力値の読込み、各制御信号の読込み・書出し、制御演算を実行し、演算結果である出力値を出力変数に書出す。
実装コード５００の実行中に、制御処理により割込みの許可又は割込みの禁止が設定される。
具体的には、Ｉ／Ｏデバイス状態記憶部１１１内のＩ／Ｏデバイス状態情報（割込み）に、割込みの許可又は割込みの禁止が設定される。
【００５９】
図１０は、Ｉ／Ｏデバイス状態情報（割込み）の例を示す。
図１０では、Ｘ及びＹという２つの割込み２０６が配置される場合のＩ／Ｏデバイス状態情報（割込み）が示されている。
また、制御処理の中でタイマ開始又はタイマ終了が発生すると、Ｉ／Ｏデバイス状態記憶部１１１内のＩ／Ｏデバイス状態情報（タイマ）にタイマ管理のための情報が記述される。
図１１は、Ｉ／Ｏデバイス状態情報（タイマ）の例を示す。
図１１では、Ｘ及びＹという２つのタイマ２０７が配置される場合のＩ／Ｏデバイス状態情報（タイマ）が示されている。
Ｉ／Ｏデバイス状態情報（タイマ）では、タイマ種別としてワンショット（１回タイムアウトしたらタイマが自動的に終了）又は継続（タイマ終了操作をするまで何度でもタイムアウトが発生）、タイマ状態として開始又は終了が設定される。
また、Ｉ／Ｏデバイス状態情報（タイマ）では、タイマ値やカウンタも設定される。
【００６０】
説明を図４のフローチャートに戻す。
制御監視部１０３は、実装コード５００の実行の間（Ｓ１０２）、制御操作と制御信号アクセスを監視する（Ｓ１０３）。
制御監視部１０３は、制御操作を検出した場合は、該当する制御操作の制御操作回数をインクリメントする（Ｓ１０４）。
また、制御監視部１０３は、制御信号アクセスを検出した場合は、制御信号アクセスログに制御信号名、アクセス種別、およびアクセス値を時間順に追加していく（Ｓ１０５）。
【００６１】
図１２〜図１５に制御操作回数情報を示す。
図１２は、連携操作での制御操作回数を示す制御操作回数情報（連携操作）である。
図１３は、Ｉ／Ｏ操作での制御操作回数を示す制御操作回数情報（Ｉ／Ｏ操作）である。
図１４は、割込み操作での制御操作回数を示す制御操作回数情報（割込み操作）である。
図１５は、タイマ操作での制御操作回数を示す制御操作回数情報（タイマ操作）である。
制御操作回数情報（連携操作）及び制御操作回数情報（Ｉ／Ｏ操作）では、「関係条件」が「ＹＥＳ」となっている２つの制御操作が関連操作である。
つまり、「関係条件」が「ＹＥＳ」となっている２つの制御操作は、図１９の制御操作情報で関連操作として定義されている。
また、制御操作回数情報（割込み操作）及び制御操作回数情報（タイマ操作）では、同じ行に記述されている制御操作の対が関連操作である。
【００６２】
図１６に制御信号アクセスログを示す。
制御信号アクセスログには、「処理名」、「制御信号名」、「アクセス種別」、「アクセス値」が記述される。
「処理名」の欄では、制御信号へのアクセスを行った処理の名称が記述される。
「制御信号名」の欄では、アクセスの対象となった制御信号の名称が記述される。
「アクセス種別」の欄では、実施されたアクセスの種別が記述される。
「アクセス値」の欄では、制御信号から読み出された又は制御信号に書き出された値が記述される。
【００６３】
説明を図４のフローチャートに戻す。
割込み模擬部１０５は、図８に示した割込みポイントの際に、図１０のＩ／Ｏデバイス状態情報（割込み）を参照し、割込み状態が「許可」の場合に、Ｈ／Ｗ割込みを発生させる（Ｓ１０６）。
割込み模擬部１０５がＨ／Ｗ割込みを発生させると、Ｉ／Ｏデバイス模擬プログラム実行部１０１２がＩ／Ｏポート２０５を模擬して、実装コード５００の割込み処理２０３２に対して割込みを発生させる。
割込み処理２０３２は、対象の制御信号（例えば、状態変数１）にアクセスする。
一方、割込みポイントの際の割込み状態が「禁止」であれば、割込み模擬部１０５はＨ／Ｗ割込みを発生させない。
【００６４】
また、タイマ模擬部１０６が、図１１のＩ／Ｏデバイス状態情報（タイマ）を参照し、タイマ状態が「開始」である場合は、該当するタイマをカウントアップする（Ｓ１０８）。
また、カウンタがタイマ値以上になってタイマが満了したら、実装コード実行部１０１１は、該当するタイマ処理２０３３を実行する。
【００６５】
そして、実装コード５００とＩ／Ｏデバイス模擬プログラム６００の起動回数が図７の最大ステップ数に到達したら、検証項目解析部１０４が制御捜査回数と制御信号アクセスログの検証を行い、検証レポートを作成する（Ｓ１１０）。
【００６６】
より具体的には、検証項目解析部１０４は、図１２〜図１５の制御操作回数情報を参照し、関連操作間の発生回数がつり合っていれば、制御操作回数が適正と判断する。
各制御操作の判定方法を以下に示す。
「要求操作」の発生回数＝「応答操作」の発生回数（関係条件がＹＥＳの場合）
「Ｉ／Ｏ読込み」の発生回数＝「Ｉ／Ｏ書出し」の発生回数（関係条件がＹＥＳの場合）
「割込み許可」の発生回数＝「割込み禁止」の発生回数
「タイマ開始」の発生回数＝「タイマ終了」の発生回数＋「タイムアウト」の発生回数（ワンショットの場合）
「タイマ開始」の発生回数＝「タイマ終了」の発生回数（継続の場合）
図１２〜図１５の例では、検証項目解析部１０４は、制御処理Ａの連携操作Ｘは適正と判断し、制御処理Ｂの連携操作Ｙも適正と判断する。
また、制御処理ＡのＩ／Ｏ操作Ｘは適正でないと判断する。
また、制御処理Ａの割込み操作Ｘは適正と判断し、制御処理Ｂの割込み操作Ｙは適正でないと判断する。
制御処理Ａのタイマ操作Ｘは適正と判断し、制御処理Ｂのタイマ操作Ｙは適正でないと判断する。
【００６７】
また、検証項目解析部１０４は、図１６の制御信号アクセスログを参照し、制御処理Ａ等による競合制御信号へのアクセスの間に他の処理による競合制御信号へのアクセスが混在していなければ、割込み制御が適正と判断する。
図１６の例では、検証項目解析部１０４は、競合制御信号である状態変数１、状態変数２、状態変数３に着目する。
図１６の例では、制御処理Ａからこれらの状態変数へのアクセス（Ｎｏ．２、Ｎｏ．４、Ｎｏ．５）の間に、割込み処理から状態変数１へのアクセス（Ｎｏ．３）が混在しているので、検証項目解析部１０４は、割込み禁止想定タイミングにおいて適正に割込みが禁止されなかったと判断する。
つまり、検証項目解析部１０４は、複数の割込み候補タイミングのうち、制御処理Ａから状態変数１、状態変数２、状態変数３へのアクセスの合間にあたるタイミングを割込み禁止想定タイミングとして選択し、割込み禁止想定タイミングに状態変数１、状態変数２、状態変数３のいずれかに対して他の処理からのアクセスがあったか否かを検査する。
そして、検証項目解析部１０４は、割込み禁止想定タイミングに状態変数１、状態変数２、状態変数３のいずれかに対して他の処理からのアクセスがあれば、適正に割込みが禁止されなかったと判断する。
【００６８】
また、検証項目解析部１０４は、制御信号アクセスログに示されるアクセス値が、客先仕様書、制御仕様書、関数仕様書など実装コード５００を作成するための入力成果物に照らして正しいかどうかを判断する。
【００６９】
そして、検証項目解析部１０４は、検証レポートを出力する。
検証レポートには、少なくとも、検証項目解析部１０４により適正と判断されなかった項目（制御操作回数、割込み制御）が記述される。
例えば、シミュレータ装置１００の利用者は、シミュレータ装置１００により生成された検証レポートを用いて、ＩＳＯ２６２６２認証取得のマイクロコンピュータ・エミュレータで実装コードの動作確認を行う。
このようにすると、実装コードを容易にＩＳＯ２６２６２規格に適合させることができる。
【００７０】
本実施の形態に係るシミュレータ装置１００によれば、以下の効果を得ることができる。
【００７１】
実装コードを計算機上で動作させて検証するため、従来技術のように専用記述を生成する必要がない。
このため、実装コードと専用記述との一致性保証が不要であり、検証結果の正しさの保証が容易である。
【００７２】
Ｉ／Ｏデバイス模擬プログラムの実行によりＳ／Ｗへの入力シーケンスと割込みポイントを網羅的に実行することで、Ｈ／ＷとＳ／Ｗの並行動作による処理のバリエーションをもれなく検証できる。
【００７３】
Ｈ／Ｗ−Ｓ／Ｗインタフェースに関する不具合を単体試験で検出することで、Ｓ／Ｗ結合試験以降からの手戻り工数を削減できる。
【００７４】
以上、本実施の形態では、
実装コードと連携変数を解析して入力シーケンスと割込みポイントからなる検証シナリオを作成する構成と、
スケジューラ設定で指定する起動周期と起動順序に従って実装コードを実行する構成と、
スケジューラ設定と検証シナリオに従って、Ｉ／Ｏデバイス模擬プログラムを実行する構成と、
Ｉ／Ｏデバイス状態情報で指定するタイマ種別、タイマ状態、およびタイマ値に従ってＨ／Ｗタイマの動作を模擬する構成と、
実装コードの実行中の制御操作を監視して制御操作回数を記録する構成と、
実装コードの実行中の制御信号へのアクセスを監視して制御信号アクセスログを記録する構成と、
検証シナリオとＩ／Ｏデバイス状態情報で指定する割込み状態に従ってＨ／Ｗ割込みの動作を模擬する構成と、
制御操作回数の記録において要求と応答が正しく対応するかチェックする構成と、
制御信号アクセスログの記録において競合制御信号に排他的にアクセスしているかを検証する構成と、
制御操作回数と制御信号アクセスログのチェック結果から検証レポートを作成する構成と、
を備えたソフトウェア並行動作検証装置を説明した。
【００７５】
実施の形態２．
実施の形態１では、検証対象の制御処理を常時動作させて実装コード５００を検証する方法を説明した。
本実施の形態では、検証対象の制御処理を動的に生成又は削除して実装コード５００を検証する方法を説明する。
【００７６】
本実施の形態では、図９のスケジューラ設定に代えて、図１７のスケジューラ設定を用いる。
図１７のスケジューラ設定では、図９のスケジューラ設定と比較して、起動トリガと起動状態の欄が追加されている。
起動トリガの欄には、制御処理を起動又は終了するためのイベントが示される。
図１７の例では、連携信号、Ｉ／Ｏポート、状態変数、カウンタが記述される。
図１７の例では、制御処理Ｃは、例えば、所定の連携信号２５１を入力するイベントが発生した際に、動作を開始する。
【００７７】
実装コード実行部１０１１は、起動状態が「常時」になっている制御処理とハードウェアドライバ２０３を周期的に実行する。
そして、ある制御処理の起動トリガに合致する状態が発生したら、起動状態が「開始」であれば、実装コード実行部１０１１は、その制御処理の周期的な実行を開始する。
また、ある制御処理の起動トリガに合致する状態が発生したら、起動状態が「終了」であれば、実装コード実行部１０１１は、その制御処理の周期的な実行を終了する。
【００７８】
以上のように、本実施の形態によれば、限られた時間の間だけ動作する制御処理が含まれる実装コードの検証も行うことができる。
【００７９】
以上、本実施の形態では、スケジューラ設定にあらかじめ起動トリガを設定しておき、実装コードを実行中に起動トリガに合致する状態が発生したら、該当する制御処理を動的に生成し、また、該当する制御処理を終了させるソフトウェア並行動作検証装置を説明した。
【００８０】
実施の形態３．
実施の形態１では、制御処理ごとに制御操作回数を検証する方法を説明した。
本実施の形態では、複数の制御処理をまとめたグループ単位で制御操作回数を検証する方法を説明する。
つまり、本実施の形態では、検証項目解析部１０４は、複数の制御処理にまたがって、制御操作回数間の関係が適正であるかを検証する。
【００８１】
ある制御処理が割込み許可し、他の制御処理が割込み禁止するというように、複数の制御処理の中で要求・応答の対応を取る場合がある。
このような場合に対応させるため、本実施の形態に係るシミュレータ装置１００では、制御処理のグループを作成して、グループ内で要求操作の回数と応答操作の回数が等しければ適正と判定する。
本実施の形態では、実施の形態１と同様に、割込み模擬部１０５は、制御処理の単位で制御操作回数を計数するが、検証項目解析部１０４による検証は、制御処理のグループ単位で行う。
本実施の形態では、例えば、図１８に示す制御操作回数情報を用いる。
図１８では、図１４の制御操作回数情報（割込み操作）に対して、「グループ名」の欄が追加されている。
つまり、図１８の例では、制御処理Ａと制御処理Ｂがグループ化されている。
図１８では、制御操作回数情報（割込み操作）だけを示すが、制御操作回数情報（連携操作）、制御操作回数情報（Ｉ／Ｏ操作）、制御操作回数情報（タイマ操作）でも同様にグループの情報を追加する。
図１８では、制御処理Ａ及び制御処理Ｂのそれぞれでは、割込み許可の回数≠割込み禁止の回数になっているが、グループαの単位で検証すると、割込み許可の回数＝割込み禁止の回数となっているので、検証項目解析部１０４は、制御操作回数が適正であると判断する。
【００８２】
このように、本実施の形態では、制御操作の発生状況に合わせて柔軟な検証を行うことができる。
【００８３】
以上、本実施の形態では、複数の制御処理をまとめたグループ単位で、複数の制御操作の回数が正しく対応するかを検証するソフトウェア並行動作検証装置を説明した。
【００８４】
最後に、実施の形態１〜３に示したシミュレータ装置１００のハードウェア構成例を図２０を参照して説明する。
シミュレータ装置１００はコンピュータであり、シミュレータ装置１００の各要素をプログラムで実現することができる。
シミュレータ装置１００のハードウェア構成としては、バスに、演算装置９０１、外部記憶装置９０２、主記憶装置９０３、通信装置９０４、入出力装置９０５が接続されている。
【００８５】
演算装置９０１は、プログラムを実行するＣＰＵである。
外部記憶装置９０２は、例えばＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）やフラッシュメモリ、ハードディスク装置である。
主記憶装置９０３は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
図１に示す「〜記憶部」は、外部記憶装置９０２又は主記憶装置９０３で実現される。
通信装置９０４は、例えばＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）である。
入出力装置９０５は、例えばマウス、キーボード、ディスプレイ装置である。
【００８６】
プログラムは、通常は外部記憶装置９０２に記憶されており、主記憶装置９０３にロードされた状態で、順次演算装置９０１に読み込まれ、実行される。
プログラムは、図１に示す「〜部」（「〜記憶部」を除く。以下でも同様）として説明している機能を実現するプログラムである。
更に、外部記憶装置９０２にはオペレーティングシステム（ＯＳ）も記憶されており、ＯＳの少なくとも一部が主記憶装置９０３にロードされ、演算装置９０１はＯＳを実行しながら、図１に示す「〜部」の機能を実現するプログラムを実行する。
また、実施の形態１〜３の説明において、「〜の判断」、「〜の判定」、「〜の検証」、「〜の抽出」、「〜の検出」、「〜の指定」、「〜の設定」、「〜の計数」、「〜の模擬」、「〜の実行」、「〜の選択」、「〜の生成」、「〜の入力」、「〜の出力」等として説明している処理の結果を示す情報やデータや信号値や変数値が主記憶装置９０３にファイルとして記憶されている。
また、暗号鍵・復号鍵や乱数値やパラメータが、主記憶装置９０３にファイルとして記憶されてもよい。
【００８７】
なお、図２０の構成は、あくまでもシミュレータ装置１００のハードウェア構成の一例を示すものであり、シミュレータ装置１００のハードウェア構成は図２０に記載の構成に限らず、他の構成であってもよい。
【００８８】
また、実施の形態１〜３に示す手順により、本発明に係るプログラム検証方法を実現可能である。
【００８９】
以上、本発明の実施の形態について説明したが、これらの実施の形態のうち、２つ以上を組み合わせて実施しても構わない。
あるいは、これらの実施の形態のうち、１つを部分的に実施しても構わない。
あるいは、これらの実施の形態のうち、２つ以上を部分的に組み合わせて実施しても構わない。
なお、本発明は、これらの実施の形態に限定されるものではなく、必要に応じて種々の変更が可能である。
【符号の説明】
【００９０】
１００  シミュレータ装置、１０１  スケジューラ、１０２  検証シナリオ作成部、１０３  制御監視部、１０４  検証項目解析部、１０５  割込み模擬部、１０６  タイマ模擬部、１０７  連携変数記憶部、１０８  プログラム記憶部、１０９  スケジューラ設定記憶部、１１０  検証シナリオ記憶部、１１１  Ｉ／Ｏデバイス状態記憶部、１１２  制御操作回数記憶部、１１３  制御信号アクセスログ記憶部、１１４  検証レポート記憶部、１１５  制御操作情報記憶部、１０１１  実装コード実行部、１０１２  Ｉ／Ｏデバイス模擬プログラム実行部、２００  制御機器、２０１  制御処理Ａ、２０２  制御処理Ｂ、２０３  ハードウェアドライバ、２０４  Ｉ／Ｏポート、２０５  Ｉ／Ｏポート、２０６  割込み、２０７  タイマ、２０３１  Ｉ／Ｏ処理、２０３２  割込み処理、２０３３  タイマ処理、２５１  連携信号、２５２  Ｉ／Ｏポート信号、２５３  状態変数、２５４  カウンタ信号、３００  センサデバイス、４００  駆動デバイス、５００  実装コード、６００  Ｉ／Ｏデバイス模擬プログラム。
【図１】
0005951130.tif 000002
【図２】
0005951130.tif 000003
【図３】
0005951130.tif 000004
【図４】
0005951130.tif 000005
【図５】
0005951130.tif 000006
【図６】
0005951130.tif 000007
【図７】
0005951130.tif 000008
【図８】
0005951130.tif 000009
【図９】
0005951130.tif 000010
【図１０】
0005951130.tif 000011
【図１１】
0005951130.tif 000012
【図１２】
0005951130.tif 000013
【図１３】
0005951130.tif 000014
【図１４】
0005951130.tif 000015
【図１５】
0005951130.tif 000016
【図１６】
0005951130.tif 000017
【図１７】
0005951130.tif 000018
【図１８】
0005951130.tif 000019
【図１９】
0005951130.tif 000020
【図２０】
0005951130.tif 000021