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