(57)【要約】【課題】プログラムの条件付き命令のジャンプ結果をＲＡＭに書き込みながらトレースし、未通過パスの検出を容易にすることにある。【解決手段】特開平５−２２４９９０号公報に開示された従来のマイクロプログラムトレーサを基に、ＲＡＭ１に、分岐命令の分岐が成立した場合にその命令の分岐先としてジャンプしてきたことを示すフラグ情報を格納するＲＡＭ１の１ｃを追加した。また、ブランチコントロール５から、分岐が成立して分岐先のアドレスが確定したことを示す信号２０をバッファレジスタ７に出力し、更にライトイネーブル信号としてＲＡＭ１の１ｃに接続した。また、バッファレジスタ７から信号線２１を出力してＲＭＡ１の１ｃに接続した。ＲＡＭ１の内容を読み出す信号線１８でＲＭＡ１に追加した１ｃを読み出せるようにした。更に、ＲＡＭ１に追加したＲＡＭも含むＲＡＭ１の情報から未通過パスの検出を行うようにした。【選択図】図４
2011257924.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのアドレスと同一のアドレス空間を持ち、３ビットの幅を有する第１のＲＡＭと、
前記プログラムを格納しておくための第２のＲＡＭと、
前記プログラムの条件付き分岐命令が実行されたことを検出するための実行検出手段と、
前記分岐命令が分岐したか否かの結果を保持するためのバッファレジスタと、
前記実行検出手段により送出された前記プログラムの分岐命令の実行状況を分析し、前記第１のＲＡＭへ分類して書き込むためのゲートと
を具備し、
前記実行検出手段は、
前記第２のＲＡＭからマイクロ命令レジスタへ読み出されたマイクロ命令をデコードし、分岐命令であるか否かを示す信号及び分岐条件を出力するためのデコーダと、
前記デコーダの出力により得られた分岐条件とステータスレジスタの内容とを比較し、分岐が成立したか否かを判定し、判定結果を前記バッファレジスタ及び前記ゲートに送出するためのブランチコントロールモジュールと
を具備し、
前記ブランチコントロールモジュールは、
分岐が成立して分岐先のアドレスが確定したことを示す信号を、前記バッファレジスタに出力する手段と、
分岐が成立して分岐先のアドレスが確定したことを示す信号を、ライトイネーブル信号として前記第１のＲＡＭに送る手段と、
前記ライトイネーブル信号に応じて、前記第１のＲＡＭのライトイネーブルをオンにして、前記マイクロ命令レジスタにセットされた分岐先アドレスに対応する前記第１のＲＡＭのビット位置に前記バッファレジスタ値を書き込む手段と
を具備する
テスト装置。
【請求項２】
請求項１に記載のテスト装置であって、
前記第１のＲＡＭは、
前記３ビットのうち、分岐成立をトレースする第１の１ビットと、
前記３ビットのうち、分岐不成立をトレースする第２の１ビットと、
前記３ビットのうち、分岐先を示す第３の１ビットと
を含み、
前記ゲートは、
前記第１のビットをイネーブルする信号を出力する手段と、
前記第２のビットをイネーブルする信号を出力する手段と
を具備し、
前記ブランチコントロールモジュールは、
前記ライトイネーブル信号を前記第１のＲＡＭに送る際に、前記第３のビットをイネーブルする信号を出力する手段と、
前記第１のＲＡＭのビット位置に前記バッファレジスタ値を書き込む際に、前記第３のビットに前記バッファレジスタ値を書き込む手段と
を更に具備する
テスト装置。
【請求項３】
請求項２に記載のテスト装置であって、
前記プログラムのテストを実行するテスト実行手段
を更に具備し、
前記テスト実行手段は、
前記プログラムのプログラムリストを静的に解析し、前記プログラムの配置された領域を保持する手段と、
前記プログラムの存在する領域の先頭に前記第１のＲＡＭのアドレスをセットする手段と、
前記第１のＲＡＭのアドレスの値を読み出す手段と、
前記読み出したアドレスの値について、前記第３の１ビットのイネーブルがオンであるか確認する手段と、
前記第３の１ビットのイネーブルがオンである場合、前記読み出したアドレスの命令から前記プログラムを開始したと判断し、前記読み出したアドレスを、実行開始アドレス及び分岐先アドレスのいずれかとして保持する手段と、
前記読み出したアドレスにおいて、前記第１の１ビットのイネーブルがオンで、前記第２の１ビットのイネーブルがオフであるかを確認する手段と、
前記読み出したアドレスにおいて、前記第１の１ビットのイネーブルがオンで、前記第２の１ビットのイネーブルがオフである場合、前記実行開始アドレス及び分岐先アドレスのいずれかとして保持したアドレスから前記読み出したアドレスまでを前記プログラムの実行履歴として保持する手段と、
前記読み出したアドレスが前記プログラムの配置された領域の終了であるか確認する手段と、
前記プログラムの配置された領域の終了でない場合、前記第１のＲＡＭの次のアドレスの値を読み出す手段と、
前記プログラムの配置された領域の終了である場合、前記プログラムの実行履歴とプログラム列を比較し、未通過パスを検出する手段と
を具備する
テスト装置。
【請求項４】
プログラムのアドレスと同一のアドレス空間を持ち、３ビットの幅を有する第１のＲＡＭを使用することと、
前記プログラムを格納しておくための第２のＲＡＭを使用することと、
前記プログラムの条件付き分岐命令が実行されたことを検出することと、
前記分岐命令が分岐したか否かの結果を保持するためのバッファレジスタを使用することと、
前記プログラムの分岐命令の実行状況を分析し、前記第１のＲＡＭへ分類して書き込むためのゲートを使用することと、
前記第２のＲＡＭからマイクロ命令レジスタへ読み出されたマイクロ命令をデコードし、分岐命令であるか否かを示す信号及び分岐条件を出力することと、
前記分岐条件とステータスレジスタの内容とを比較し、分岐が成立したか否かを判定することと、
分岐が成立した場合、分岐が成立して分岐先のアドレスが確定したことを示す信号を、前記バッファレジスタに出力し、ライトイネーブル信号として前記第１のＲＡＭに送ることと、
前記ライトイネーブル信号に応じて、前記第１のＲＡＭのライトイネーブルをオンにして、前記マイクロ命令レジスタにセットされた分岐先アドレスに対応する前記第１のＲＡＭのビット位置に前記バッファレジスタ値を書き込むことと
を含む
テスト方法。
【請求項５】
請求項４に記載のテスト方法であって、
前記第１のＲＡＭにおいて、前記３ビットのうち、第１の１ビットを、分岐成立をトレースする値とすることと、
前記第１のＲＡＭにおいて、前記３ビットのうち、第２の１ビットを、分岐不成立をトレースする値とすることと、
前記第１のＲＡＭにおいて、前記３ビットのうち、第３の１ビットを、分岐先を示す値とすることと、
前記ゲートから前記第１のビットをイネーブルする信号を出力することと、
前記ゲートから前記第２のビットをイネーブルする信号を出力することと、
前記ライトイネーブル信号を前記第１のＲＡＭに送る際に、前記第３のビットをイネーブルする信号を出力することと、
前記第１のＲＡＭのビット位置に前記バッファレジスタ値を書き込む際に、前記第３のビットに前記バッファレジスタ値を書き込むことと
を更に含む
テスト方法。
【請求項６】
請求項５に記載のテスト方法であって、
前記プログラムのプログラムリストを静的に解析し、前記プログラムの配置された領域を保持することと、
前記プログラムの存在する領域の先頭に前記第１のＲＡＭのアドレスをセットすることと、
前記第１のＲＡＭのアドレスの値を読み出すことと、
前記読み出したアドレスの値について、前記第３の１ビットのイネーブルがオンであるか確認することと、
前記第３の１ビットのイネーブルがオンである場合、前記読み出したアドレスの命令から前記プログラムを開始したと判断し、前記読み出したアドレスを、実行開始アドレス及び分岐先アドレスのいずれかとして保持することと、
前記読み出したアドレスにおいて、前記第１の１ビットのイネーブルがオンで、前記第２の１ビットのイネーブルがオフであるかを確認することと、
前記読み出したアドレスにおいて、前記第１の１ビットのイネーブルがオンで、前記第２の１ビットのイネーブルがオフである場合、前記実行開始アドレス及び分岐先アドレスのいずれかとして保持したアドレスから前記読み出したアドレスまでを前記プログラムの実行履歴として保持することと、
前記読み出したアドレスが前記プログラムの配置された領域の終了であるか確認することと、
前記プログラムの配置された領域の終了でない場合、前記第１のＲＡＭの次のアドレスの値を読み出すことと、
前記プログラムの配置された領域の終了である場合、前記プログラムの実行履歴とプログラム列を比較し、未通過パスを検出することと
を更に含む
テスト方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイコンのプログラム開発におけるプログラムのテスト装置、及びテスト方法に関する。
【背景技術】
【０００２】
近年、マイコンのプログラム開発において、様々な品質保証が求められているため、プログラムのテストを行なった際も、そのテストがどの程度行なわれているかの指標が必要となっている。その一つとして、Ｃ０カバレッジ（ｃｏｖｅｒａｇｅ）が用いられる。Ｃ０カバレッジとは、プログラムの命令や分岐がテスト中に少なくとも１回は実行されたかどうかを示す指標である。
【０００３】
Ｃ０カバレッジの実現方法としては、実行した命令のアドレス（番地）をトレース情報として取得し、その情報を解析することでＣ０カバレッジを取得する方法がある。
【０００４】
ところが、現在の高機能マイコンに見られる高速クロックでの並列処理を行う場合に、リアルタイムでのトレース取得を行うとトレースすべきアドレス情報が増え、転送速度も高速になる。しかし、トレース情報を出力する端子を増やそうとしても、マイコンのチップサイズ小型化やコスト低減の影響から端子を増やすことができない場合が多い。そのため、実行したアドレス情報をトレース情報として出力しきれない場合がある。そこで、分岐命令だけをトレースする分岐トレースを用いてトレース情報を削減し、Ｃ０カバレッジを測定する方法が提案されている。
【０００５】
トレース情報をそのまま残さずＣ０カバレッジを取得する方法として、特許文献１（特開平５−２２４９９０号公報）のような方法が提案されている。
【０００６】
図１に、従来のマイクロプログラムトレーサの構成を示す。従来のマイクロプログラムトレーサは、ＲＡＭ１と、ＲＡＭ２と、ＭＩＲ３と、命令デコーダ４と、ブランチコントロールモジュール５と、ＭＡＲ６と、バッファレジスタ７と、ＳＴＲ８と、論理ゲート１９を備えていた。
【０００７】
ＲＡＭ１は、プログラムの分岐命令の分岐が成立したか成立していないかを示す情報を格納するためのＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。ＲＡＭ２は、トレースの対象となるプログラムを格納するためのＲＡＭである。ＭＩＲ３は、実行する命令を保持するマクロ命令レジスタである。命令デコーダ４は、ＭＩＲ３の命令をデコードし、分岐命令かどうかを判定する。ブランチコントロールモジュール５は、実行する命令が分岐命令だった場合に分岐が成立したかどうかを判定し、次に実行するアドレス決定する。ＭＡＲ６は、現在実行している命令のアドレスを保持するマクロ命令アドレスレジスタである。バッファレジスタ７は、分岐命令が成立か不成立かの情報を保持する。ＳＴＲ８は、分岐命令の条件判定に必要な演算結果等を保持しているステータスレジスタである。論理ゲート１９は、論理ゲートである。
【０００８】
プログラムの実行アドレスを格納するＭＡＲ６が、ＲＡＭ２にアドレスを与える。ＭＩＲ３は、その内容（実行アドレス）を読み出す。命令デコーダ４は、ＭＩＲ３に読み出された命令（実行アドレス）をデコードする。そのデコード結果が分岐命令の場合、ブランチコントロールモジュール５は、分岐命令の分岐条件をＳＴＲ８の演算結果のステータスと比較判定し、分岐が成立した場合には、分岐先アドレスをＭＡＲ６へ送出する。また、分岐が成立すると、ブランチコントロールモジュール５は、分岐成立信号を信号線１４により分岐成立不成立の情報を保持するバッファレジスタ７及びＲＡＭ１の論理ゲート１９に送出する。なお、分岐成立信号は、分岐が成立したことを示す信号である。
【０００９】
図２は、ＲＡＭ１とＲＡＭ２の内容を説明するための図である。図２において、（ａ）は、トレース実施後のＲＡＭ１の内容である。また、（ｂ）は、ＲＡＭ２のプログラムのコーディングリストである。従来のマイクロプログラムトレーサは、プログラムアドレスを、ＭＡＲ６から信号線９を経由してＲＡＭ２に入力し、信号線１０を経由してプログラムをＲＡＭ２から読み出す。また、従来のマイクロプログラムトレーサは、読み出されたプログラムを、ＭＩＲ３へ格納し、デコーダ４へ送る。デコーダ４は、プログラムをデコードし、プログラムの内容に従ってプロセッサ内の各モジュールに指示を出す。デコードした命令が分岐命令でない場合には、ブランチコントロールモジュール５は、ＭＡＲ６のアドレスに１を加えたアドレスを生成し、ＭＡＲ６にセット（設定）する。
【００１０】
デコーダ４は、デコードしたプログラムが分岐命令であった場合、信号線１１を経由して分岐命令検出信号をＲＡＭ１に送り、信号線１２を経由して分岐命令の分岐条件をブランチコントロールモジュール５へ送る。
【００１１】
ブランチコントロールモジュール５は、分岐条件とＳＴＲ８の内容とを比較し、分岐が成立しているか否かを判定する。
【００１２】
分岐が成立していた場合、ブランチコントロールモジュール５は、信号線１４を経由して分岐成立信号を出力し、バッファレジスタ７とＲＡＭ１のゲート１９とに送る。信号線１１及び信号線１４を経由して出力された信号により、ゲート１９を介して信号線１７ａ上のライトイネーブル（ＷＥ：Ｗｒｉｔｅ  Ｅｎａｂｌｅ）がオン（有効）になる。信号線１３を経由してＭＡＲ６にセットされたアドレスに対応するＲＡＭ１の１ａのビット位置に、信号線１５を経由してバッファレジスタ７の内容が書き込まれる。その後、ブランチコントロールモジュール５は、分岐先のアドレスを、信号線１３を経由してＭＡＲ６にセットする。これにより、分岐成立時の動作が完了する。
【００１３】
分岐が不成立だった場合、ブランチコントロールモジュール５は、信号線１４を経由して分岐成立信号を出力しない。このため、ゲート１９を介して信号線１７ｂ上のライトイネーブル（ＷＥ）がオンになり、ＲＡＭ１の１ｂのビット位置にバッファレジスタ７の内容の反転が書き込まれる。その後、ブランチコントロールモジュール５は、ＭＡＲ６のアドレスに１を加えたアドレスを生成し、ＭＡＲ６にセットする。これにより、分岐未成立時の動作が完了する。
【００１４】
上記のようにして、分岐命令が実行される毎にＲＡＭ１への書き込みが行われ、分岐が成立した場合には、ＲＡＭ１の１ａのビットがオンになり、分岐が成立しなかった場合には、ＲＡＭ１の１ｂのビットがオンになる。
【００１５】
次に、マイコンその他のプロセッサが、実際にＲＡＭ１の内容を読み出して未通過パスの検出を行う動作について記載する。ＲＡＭ１の内容は、信号線１８を経由し、プロセッサの外に読み出すことが可能である。図２（ａ）は、ＲＡＭ１の内容を読み出した一例で、ＲＡＭ１の１ａは、Ｊ系（分岐成立フラグ）、１ｂは、ＮＪ系（分岐不成立フラグ）となっている。
【００１６】
このフラグの意味は、分岐成立フラグ（１ａ）が１であった場合、この分岐命令の次に実行された命令は、次のアドレスの命令ではなく分岐先の命令と解釈する。
【００１７】
分岐未成立フラグ（１ｂ）が１であった場合、この分岐命令の次に実行された命令は、次の番地の命令と解釈する。
【００１８】
分岐成立（１ａ）と分岐未成立（１ｂ）のフラグ両方が１であった場合は、次に実行された命令が分岐命令の次の番地の命令の場合と分岐先の命令の場合の両方があったと解釈し、以後、両方の実行命令を解析する。これを最後まで繰り返すことでプログラムの中で実行された命令、実行されなかった命令が明確になり、Ｃ０カバレッジが計算できる。
【００１９】
また、図２（ｂ）は、そのときに実行されたプログラムのリストである。Ａ番地〜Ｂ番地、Ｂ番地〜Ｃ番地までの間には、他の分岐命令はないものとする。
【００２０】
まず、Ａ番地のジャンプ命令（分岐命令）では、図２（ａ）を見ると分岐成立フラグも分岐不成立フラグも立っているため、分岐の成立と不成立どちらの動作も行ったことがわかる。同様に、Ｂ番地のジャンプ命令では、分岐成立のみが動作したことが分かり、Ｃ番地のジャンプ命令では、分岐不成立のみ動作したことが分かる。
【００２１】
この情報を基に未通過パスの検出を行うと、まずＡ番地は、分岐が不成立の場合があるため、Ａ番地の次の命令を実行し、Ｂ番地まで実行したと判断する。更に、Ａ番地の分岐先は、プログラムを解析するとＢ番地に分岐している。この場合、Ｂ番地までは、すでに実行したことが分かるため、解析を省略する。
【００２２】
次に、Ｂ番地は、分岐成立のみ動作しているため、Ｂ番地の分岐命令の分岐先は、プログラムリストを解析してＣ番地であると判断し、Ｂ番地からＣ番地までの命令は、実行されていないと判断する。
【００２３】
次に、Ｃ番地は、分岐不成立のみ動作しているため、Ｃ番地以降の命令が実行されたと判断する。
【００２４】
このように、プログラムリスト（ＲＡＭ２）と分岐成立不成立の情報（ＲＡＭ１）の静的解析を繰り返して未通過パスの検出を行う方法を提案している。
【００２５】
また、特許文献２（特開平７−２６２０４７号公報）では、分岐の成立、不成立のフラグではなく、分岐命令のアドレスと、その命令の分岐先アドレスを保持する記憶装置を用意し、その内容を読み出して、その情報を順番にたどっていくことで未通過パスの検出を行うことができる方法を提案している。
【００２６】
特許文献１では、分岐したか否かを動的に解析（記録）し、分岐先のアドレスは、プログラムを静的に解析することで得ている。しかし、マイコンの分岐命令には、レジスタに格納されているアドレスへジャンプするもの等、分岐命令実行時のレジスタの値によって分岐先が決定される分岐命令を使用する場合があり、プログラムを静的に解析しても分岐先アドレスが分からない場合がある。
【００２７】
図３に、プログラムの例を示す。この例では、アドレスＣの分岐命令の分岐先アドレスが命令実行の結果によってアドレスＤへ分岐するか、Ｅへ分岐するか変化する。
【００２８】
特許文献１のような従来例では、図３のようなプログラムを使った場合の未通過パスの検出方法については、述べられていない。実際にこのプログラムの未通過パスを検出しようとすると、アドレスＣの分岐命令がアドレスＤ、Ｅのどちらに分岐したのか判断できない場合が発生し、命令実行をトレースできず、未通過パスがあっても検出できない場合がある。
【００２９】
また、特許文献２では、分岐先アドレスを取得する方法を述べているが、分岐の不成立についての情報は、得ていないため、今回の図２に示すようなプログラムを例にした場合、Ａ番地からＢ番地へ分岐したことは、分かるが、Ａ番地〜Ｂ番地までが実行されたかどうかの判断ができない場合がある。
【００３０】
これら２つの特許文献のような従来例では、実際の実行結果と取得したＣ０カバレッジの結果が一致しない（正しくない）という問題が起こる場合がある。
【先行技術文献】
【特許文献】
【００３１】
【特許文献１】特開平５−２２４９９０号公報
【特許文献２】特開平７−２６２０４７号公報
【発明の概要】
【発明が解決しようとする課題】
【００３２】
本発明は、マイクロプログラムの分岐命令の分岐結果として、分岐成立・不成立、及び分岐先をプロセッサ内部に保持し、保持された分岐結果を読み出してマイクロプログラムの実行状況を観測することを特徴とする。
【課題を解決するための手段】
【００３３】
本発明のテスト装置は、プログラムのアドレスと同一のアドレス空間を持ち、３ビットの幅を有する第１のＲＡＭと、プログラムを格納しておくための第２のＲＡＭと、プログラムの条件付き分岐命令が実行されたことを検出するための実行検出手段と、分岐命令が分岐したか否かの結果を保持するためのバッファレジスタと、実行検出手段により送出されたプログラムの分岐命令の実行状況を分析し、第１のＲＡＭへ分類して書き込むためのゲートとを具備する。
【００３４】
実行検出手段は、第２のＲＡＭからマイクロ命令レジスタへ読み出されたマイクロ命令をデコードし、分岐命令であるか否かを示す信号及び分岐条件を出力するためのデコーダと、デコーダの出力により得られた分岐条件とステータスレジスタの内容とを比較し、分岐が成立したか否かを判定し、判定結果をバッファレジスタ及びゲートに送出するためのブランチコントロールモジュールとを具備する。
【００３５】
ブランチコントロールモジュールは、分岐が成立して分岐先のアドレスが確定したことを示す信号を、バッファレジスタに出力する手段と、分岐が成立して分岐先のアドレスが確定したことを示す信号を、ライトイネーブル信号として第１のＲＡＭに送る手段と、ライトイネーブル信号に応じて、第１のＲＡＭのライトイネーブルをオンにして、マイクロ命令レジスタにセットされた分岐先アドレスに対応する第１のＲＡＭのビット位置にバッファレジスタ値を書き込む手段とを具備する。
【発明の効果】
【００３６】
分岐先情報を記録することで、分岐命令実行時のレジスタの値によって分岐先が決定される分岐命令を含め、全ての分岐先を把握できる。
【図面の簡単な説明】
【００３７】
【図１】従来のマイクロプログラムトレーサの構成図である。
【図２】ＲＡＭの関係と内容を説明するための図である。
【図３】プログラム例を示す図である。
【図４】本発明のテスト装置の構成図である。
【図５】本発明において取得したＲＡＭの値の例である。
【図６】本発明における未通過パス検出処理のフローチャートである。
【発明を実施するための形態】
【００３８】
以下に、本発明の実施形態について添付図面を参照して説明する。
図４は、本発明のテスト装置の構成例である。図４に示す本発明のテスト装置は、ＲＡＭ１と、ＲＡＭ２と、ＭＩＲ３と、命令デコーダ４と、ブランチコントロールモジュール５と、ＭＡＲ６と、バッファレジスタ７と、ＳＴＲ８と、論理ゲート１９を備える。
【００３９】
ＲＡＭ１は、プログラムの分岐命令の分岐が成立したか成立していないかを示す情報を格納するためのＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。ＲＡＭ２は、トレースの対象となるプログラムを格納するためのＲＡＭである。ＭＩＲ３は、実行する命令を保持するマクロ命令レジスタである。命令デコーダ４は、ＭＩＲ３の命令をデコードし、分岐命令かどうかを判定する。ブランチコントロールモジュール５は、実行する命令が分岐命令だった場合に分岐が成立したかどうかを判定し、次に実行するアドレス決定する。ＭＡＲ６は、現在実行している命令のアドレスを保持するマクロ命令アドレスレジスタである。バッファレジスタ７は、分岐命令が成立か不成立かの情報を保持する。ＳＴＲ８は、分岐命令の条件判定に必要な演算結果等を保持しているステータスレジスタである。論理ゲート１９は、論理ゲートである。
【００４０】
プログラムの実行アドレスを格納するＭＡＲ６が、ＲＡＭ２にアドレスを与える。ＭＩＲ３は、その内容（実行アドレス）を読み出す。命令デコーダ４は、ＭＩＲ３に読み出された命令（実行アドレス）をデコードする。そのデコード結果が分岐命令の場合、ブランチコントロールモジュール５は、分岐命令の分岐条件をＳＴＲ８の演算結果のステータスと比較判定し、分岐が成立した場合には、分岐先アドレスをＭＡＲ６へ送出する。また、分岐が成立すると、ブランチコントロールモジュール５は、分岐成立信号を信号線１４により分岐成立不成立の情報を保持するバッファレジスタ７及びＲＡＭ１の論理ゲート１９に送出する。なお、分岐成立信号は、分岐が成立したことを示す信号である。
【００４１】
図４に示す本発明のテスト装置は、図１に示す従来のマイクロプログラムトレーサを基に、ＲＡＭ１の１ｃと、信号線２０と、信号線２１を追加し、信号線１８をＲＡＭ１の１ｃに接続したものである。なお、図４に示す本発明のテスト装置は、マイコン自体でも、マイコンに外部接続される情報処理装置でも良い。すなわち、本発明のテスト装置は、マイコン自体に搭載されたモジュールでも良いし、マイコンに外部接続された半導体装置でも良い。
【００４２】
本発明では、図１に示す従来のマイクロプログラムトレーサを基に、ＲＡＭ１に、分岐命令の分岐が成立した場合にその命令の分岐先としてジャンプしてきたことを示すフラグ情報を格納するＲＡＭ１の１ｃを追加した。
【００４３】
本発明では、図１に示す従来のマイクロプログラムトレーサを基に、ブランチコントロール５は、信号線２０を経由して、分岐が成立して分岐先のアドレスが確定したことを示す信号をバッファレジスタ７に出力し、更に、ライトイネーブル信号としてＲＡＭ１の１ｃに送る。図４では、信号線２０は、ブランチコントロールモジュール５とバッファレジスタ７を接続する信号線（信号線１４と並列に設けられた信号線）から分岐し、ＲＡＭ１の１ｃに接続されている。なお、信号線１４は、分岐が成立したことを示す信号（分岐成立信号）を出力するための信号線である。信号線２０は、分岐先のアドレスが確定したことを示す信号を出力するための信号線である。従って、信号線１４と信号線２０は、それぞれ独立している。
【００４４】
本発明では、図１に示す従来のマイクロプログラムトレーサを基に、バッファレジスタ７から信号線２１を経由して信号を出力してＲＡＭ１の１ｃに送る。
【００４５】
本発明では、図１に示す従来のマイクロプログラムトレーサを基に、ＲＡＭ１の内容を読み出すために信号線１８をＲＡＭ１の１ｃに接続し、信号線１８を経由して、ＲＡＭ１に追加した１ｃを読み出せるようにした。例えば、本発明のテスト装置と信号線１８を介して接続されたマイコンや計算機は、信号線１８を経由して、ＲＡＭ１に追加した１ｃを読み出すことが可能である。
【００４６】
本発明では、図１に示す従来のマイクロプログラムトレーサを基に、ＲＡＭ１に追加した１ｃも含むＲＡＭ１の情報から未通過パスの検出を行うようにした。
【００４７】
本発明のテスト装置は、プログラムアドレスを、ＭＡＲ６から信号線９を経由してＲＡＭ２に入力し、信号線１０を経由してプログラムをＲＡＭ２から読み出す。また、本発明のテスト装置は、読み出されたプログラムを、ＭＩＲ３へ格納し、デコーダ４へ送る。デコーダ４は、プログラムをデコードし、プログラムの内容に従ってプロセッサ内の各モジュールに指示を出す。デコードした命令が分岐命令でない場合には、ブランチコントロールモジュール５は、ＭＡＲ６のアドレスに１を加えたアドレスを生成し、ＭＡＲ６にセット（設定）する。
【００４８】
デコーダ４は、デコードしたプログラムが分岐命令であった場合、信号線１１を経由して分岐命令検出信号をＲＡＭ１に送り、信号線１２を経由して分岐命令の分岐条件をブランチコントロールモジュール５へ送る。
【００４９】
ブランチコントロールモジュール５は、分岐条件とＳＴＲ８の内容とを比較し、分岐が成立しているか否かを判定する。
【００５０】
以下の動作は、本発明のテスト装置の独自の動作である。
【００５１】
分岐が成立していた場合、ブランチコントロールモジュール５は、信号線１４を経由して分岐成立信号を出力し、バッファレジスタ７とゲート１９とに送る。信号線１１及び信号線１４を経由して出力された信号により、ゲート１９を介して信号線１７ａ上のライトイネーブル（ＷＥ）がオンになる。信号線１３を経由してＭＡＲ６にセットされたアドレスに対応するＲＡＭ１の１ａのビット位置に、信号線１５を経由してバッファレジスタ７の内容が書き込まれる。その後、ブランチコントロールモジュール５は、分岐先のアドレスを、信号線１３を経由してＭＡＲ６にセットする。
【００５２】
このとき、本発明において、ブランチコントロールモジュール５は、信号線２０を経由して、分岐が成立して分岐先のアドレスが確定したことを示す信号を出力し、ＲＡＭ１の１ｃに送る。
【００５３】
これにより、ＲＡＭ１の１ｃのライトイネーブル（ＷＥ）がオンになり、ＭＡＲ６にセットされた分岐先アドレス（信号線１６）に対応するＲＡＭ１の１ｃのビット位置に信号線２１を経由してバッファレジスタ７の値が書き込まれる。
【００５４】
また、プログラムの開始番地を示す情報として、本発明では、リセットベクタ等からのプログラムの実行を開始するときも分岐命令の分岐先と同様に判断し、開始番地がＭＡＲ６にセットされるとき、信号線２０を経由して、分岐が成立して分岐先のアドレスが確定したことを示す信号を出力し、ＲＡＭ１の１ｃに信号線２１を経由してバッファレジスタ７の値を保持する。
【００５５】
また、プログラムの終了位置に置かれる命令としては、無限ループの分岐命令かＨＡＬＴ命令がある。ＨＡＬＴ命令は、プロセッサ等を停止させる命令である。本発明では、デコーダ４は、ＨＡＬＴ命令も分岐命令と判断し、分岐命令と同様に、信号線１１を経由して、分岐命令を示す信号を出力する。それにより、ブランチコントロールモジュール５は、信号線１４を経由して分岐成立信号を出力し、バッファレジスタ７とゲート１９とに送る。信号線１１、信号線１４より出力された信号により、ゲート１９を介して信号線１７ａ上のライトイネーブル（ＷＥ）がオンになる。信号線１３を経由してＭＡＲ６にセットされたアドレスに対応するＲＡＭ１の１ａのビット位置に、信号線１５を経由してバッファレジスタ７の内容が書き込まれる。
【００５６】
本発明では、マイコンその他のプロセッサが、このＲＡＭ１の値を使用して、未通過パスの検出を行う。具体的な処理については、以下に説明する。なお、以下では、アドレスの値について、「０」はイネーブルがオフ（無効）の状態、「１」はイネーブルがオン（有効）の状態を示す。
【００５７】
プログラムの実行を開始した命令と分岐先（ジャンプした先）の命令の分岐先情報は、必ず「分岐先フラグ（１ｃ）＝１」となり、条件分岐命令の次の番地の命令が実行されない（分岐先への分岐のみ）場合の分岐先情報は、「分岐成立（１ａ）＝１」、「分岐未成立（１ｂ）＝０」であるため、プログラムの先頭から終わりまでの分岐情報において、「分岐先フラグ（１ｃ）＝１」で始まり「分岐成立（１ａ）＝１」、「分岐未成立（１ｂ）＝０」で終わる区間をプログラムが実行された区間として抽出できる。
【００５８】
分岐命令の分岐先が命令実行時のレジスタの値によって分岐先が決定されるような分岐命令を使用するプログラムに対して本発明を適用した場合の例について、図３に示すプログラムを用いて説明する。
【００５９】
図５は、図３に示すプログラムについて、アドレスＣの分岐命令の分岐先を決定するレジスタの値ｎが、アドレスＥに分岐して実行された場合に、本発明を用いて取得したＲＡＭ１の値を示している。
【００６０】
まず、アドレスＡは、プログラムの開始命令で、ＲＡＭ１のアドレスＡに対応する１ｃに、開始位置を示すフラグがセットされる。
【００６１】
その後、アドレスＡからアドレスＢまで実行し、アドレスＢの分岐命令で分岐が成立し、ＲＡＭ１のアドレスＢに対応する１ａに、分岐成立を示すフラグがセットされる。
【００６２】
続いて、分岐先がアドレスＣとなっているので、ＲＡＭ１のアドレスＣに対応する１ｃに、分岐先を示すフラグがセットされる。更に、アドレスＣには、分岐命令があり、分岐が成立して分岐成立フラグがＲＡＭ１のアドレスＣに対応する１ａにセットされる。
【００６３】
このとき、分岐先アドレスとしてｎがＥを指し示しているとすると、ＲＡＭ１のアドレスＥに対応する１ｃに値がセットされる。その後、アドレスＥからアドレスＧまで実行し、アドレスＧのＨＡＬＴ命令を実行する。本発明では、ＨＡＬＴ命令は、分岐命令と同様に扱われるため、分岐成立フラグがＲＡＭ１のアドレスＧに対応する１ａにセットされる。
【００６４】
［未通過パスの検出処理］
以下に、図６を用いて未通過パスの検出処理を説明する。なお、本発明のテスト装置がマイコン自体に搭載されたモジュールや、マイコンに外部接続された半導体装置であれば、そのマイコンが当該処理（未通過パスの検出処理）を実施する。また、本発明のテスト装置が計算機と外部接続されている場合、その計算機が当該処理を実施する。ここでは、上記のようなマイコンや計算機を、「マイコンその他のプロセッサ」と表記する。
【００６５】
（１）ステップＳ１０１
まず、マイコンその他のプロセッサは、プログラムリストを静的に解析し、プログラムの配置された領域を保持しておく。
【００６６】
（２）ステップＳ１０２
次に、プログラムの存在する領域の先頭にＲＡＭ１アドレスをセットする。
【００６７】
（３）ステップＳ１０３
その後、ＲＡＭ１アドレスの値を読み出す。
【００６８】
（４）ステップＳ１０４
ＲＡＭ１アドレスについて、「分岐先フラグ（１ｃ）＝１」の箇所を検索する。すなわち、読み出したＲＡＭ１アドレスが「分岐先フラグ（１ｃ）＝１」となっているか確認する。
【００６９】
（５）ステップＳ１０５
読み出したＲＡＭ１アドレスが「分岐先フラグ（１ｃ）＝１」となっていれば、このＲＡＭ１アドレスの命令からプログラムを開始したと判断し、このＲＡＭ１アドレスを、実行開始アドレス（又は分岐先アドレス）として保持する。なお、既に保持されているＲＡＭ１アドレスが存在する場合、保持されているＲＡＭ１アドレスを、新たに読み出したＲＡＭ１アドレスに更新（上書き）するようにしても良い。読み出したＲＡＭ１アドレスが「分岐先フラグ（１ｃ）＝１」となっていなければ、当該動作（ステップＳ１０５の動作）を行わない。
【００７０】
（６）ステップＳ１０６
続いて、このＲＡＭ１アドレスが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する。
【００７１】
（７）ステップＳ１０７
このＲＡＭ１アドレスが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であれば、最後に（直近に）実行開始アドレス（又は分岐先アドレス）として保持したＲＡＭ１アドレスから、当該読み出したＲＡＭ１アドレス（現時点でのＲＡＭ１アドレス）までを、プログラムの実行履歴として保持する。このとき、実行開始アドレス（又は分岐先アドレス）として保持したＲＡＭ１アドレスと、当該読み出したＲＡＭ１アドレスが、同じＲＡＭ１アドレスである場合もある。なお、プログラムの実行履歴として保持した後、実行開始アドレス（又は分岐先アドレス）として保持しているＲＡＭ１アドレスを削除・開放するようにしても良い。ＲＡＭ１アドレスが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」でなければ、当該動作（ステップＳ１０７の動作）を行わない。
【００７２】
（８）ステップＳ１０８
このＲＡＭ１アドレスがプログラムの配置された領域の終了（最終アドレス）であるか確認する。
【００７３】
（９）ステップＳ１０９
プログラムの配置された領域の終了でなければ、更に、ＲＡＭ１のアドレスをインクリメント（ｉｎｃｒｅｍｅｎｔ）して、ＲＡＭ１の次の内容を順番に読み出して検索する。インクリメントとは、整数型の変数の値を１増やす処理である。
【００７４】
（１０）ステップＳ１１０
プログラムの配置された領域の終了であれば、取得したプログラムの実行履歴とプログラム列を比較し、未通過パスを検出する。
【００７５】
［実施例］
図５に示すＲＡＭ１の値を用い、図６に示す本発明による未通過パスの検出処理を行うことで未通過パスを検出する事例について説明する。
【００７６】
まず、プログラムリストを静的に解析し、プログラムの配置された領域を保持しておく（ステップＳ１０１）。図５では、プログラムは、アドレスＡからアドレスＦまで存在する。次に、プログラムの存在する領域の先頭にＲＡＭ１アドレスをセットする（ステップＳ１０２）。その後、ＲＡＭ１アドレスの値を読み出す（ステップＳ１０３）。
【００７７】
ＲＡＭ１アドレスの値について、「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０４）。図５では、アドレスＡが「分岐先フラグ（１ｃ）＝１」となっているため、アドレスＡの命令からプログラムを開始したと判断し、このＲＡＭ１アドレスを、実行開始アドレス（又は分岐先アドレス）として保持する（ステップＳ１０５）。
【００７８】
続いて、アドレスＡが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。
【００７９】
図５では、アドレスＡが「分岐成立（１ａ）＝０」かつ「分岐未成立（１ｂ）＝０」のため、「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」の箇所が見つかるまでＲＡＭ１のアドレスをインクリメントして（ステップＳ１０８、ステップＳ１０９）、ＲＡＭ１の次の内容を順番に読み出す（ステップＳ１０３）。
【００８０】
次のＲＡＭ１アドレスの値について、「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０４）。図５では、アドレスＢが「分岐先フラグ（１ｃ）＝０」となっているため、アドレスＢが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。
【００８１】
図５では、アドレスＢが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」となっているため、アドレスＡからアドレスＢまで実行されたことを、プログラムの実行履歴として保持する（ステップＳ１０７）。
【００８２】
アドレスＢは、プログラムの配置された領域の最後ではないため（ステップＳ１０８）、ＲＡＭ１のアドレスをインクリメントして（ステップＳ１０９）、ＲＡＭ１の次の内容を順番に読み出す（ステップＳ１０３）。
【００８３】
次のＲＡＭ１アドレスの値について、再度「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０３）。図５では、アドレスＣが「分岐先フラグ（１ｃ）＝１」となっているため（ステップＳ１０４）、アドレスＣの命令からプログラムを開始したと判断し、このＲＡＭ１アドレスを、実行開始アドレス（又は分岐先アドレス）として保持する（ステップＳ１０５）。
【００８４】
続いて、アドレスＣが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。
【００８５】
図５では、アドレスＣが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」となっているため、アドレスＣが実行されたことを、プログラムの実行履歴として保持する（ステップＳ１０７）。
【００８６】
アドレスＣは、プログラムの配置された領域の最後ではないため（ステップＳ１０８）、ＲＡＭ１のアドレスをインクリメントして（ステップＳ１０９）、ＲＡＭ１の次の内容を順番に読み出す（ステップＳ１０３）。
【００８７】
次のＲＡＭ１アドレスの値について、「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０４）。図５では、アドレスＤが「分岐先フラグ（１ｃ）＝０」となっているため、アドレスＤが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。
【００８８】
図５では、アドレスＤが「分岐成立（１ａ）＝０」かつ「分岐未成立（１ｂ）＝０」のため、「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」の箇所が見つかるまでＲＡＭ１のアドレスをインクリメントして（ステップＳ１０８、ステップＳ１０９）、ＲＡＭ１の次の内容を順番に読み出す（ステップＳ１０３）。
【００８９】
次のＲＡＭ１アドレスの値について、再度「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０４）。図５では、アドレスＥが「分岐先フラグ（１ｃ）＝１」となっているため、アドレスＥの命令からプログラムを開始したと判断し、このＲＡＭ１アドレスを、実行開始アドレス（又は分岐先アドレス）として保持する（ステップＳ１０５）。
【００９０】
続いて、アドレスＥが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。図５では、「分岐成立（１ａ）＝０」かつ「分岐未成立（１ｂ）＝０」のため、「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」の箇所が見つかるまでＲＡＭ１のアドレスをインクリメントして（ステップＳ１０８、ステップＳ１０９）、ＲＡＭ１の次の内容を順番に読み出す（ステップＳ１０３）。
【００９１】
次のＲＡＭ１アドレスの値について、再度「分岐先フラグ（１ｃ）＝１」の箇所を検索する（ステップＳ１０４）。図５では、アドレスＦが「分岐先フラグ（１ｃ）＝０」となっているため、アドレスＦが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」であるかを確認する（ステップＳ１０６）。
【００９２】
図５では、アドレスＦが「分岐成立（１ａ）＝１」かつ「分岐未成立（１ｂ）＝０」となっているため、アドレスＥからアドレスＦまで実行されたことを、プログラムの実行履歴として保持する（ステップＳ１０７）。
【００９３】
以降、プログラムが置かれている領域の最後まで確認する（ステップＳ１０８）。図５のプログラム例では、プログラムの置かれている領域は、アドレスＦまでのため、ここでプログラムは、終了となる。
【００９４】
よって、アドレスＡ〜Ｂ、アドレスＣ、アドレスＥ〜Ｆまでが実際に実行された履歴となる。この実行履歴とプログラム列（実際にプログラムが配置されているアドレスＡ〜Ｆまでの領域）を比較することで、未通過パス（今回は、アドレスＢ〜ＣとアドレスＤ〜Ｅ）を検出することができる（ステップＳ１１０）。
【００９５】
このことから、従来技術による未通過パスの検出では、アドレスＤから実行されたのかアドレスＥから実行されたのか判断できなかったが、本発明では、アドレスＤが実行されていないことがわかり、アドレスＤからアドレスＥまでが未通過パスであると検出できる。
【００９６】
＜まとめ＞
以上のように、本発明では、従来技術と同様に、マイコンのプログラム開発において、プログラムのテストを行なった際に、容易に未通過パスに検出を行なえる。
【００９７】
更に、分岐成立、分岐未成立に加え、分岐先の結果を残しておくことにより、どのようなプログラム列であっても、未通過パスを検出することが可能となり、正確なＣ０カバレッジを取得できる。
【００９８】
以上、本発明の実施形態を詳述してきたが、実際には、上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の変更があっても本発明に含まれる。
【符号の説明】
【００９９】
１、２…  ＲＡＭ
３…  マイクロ命令レジスタ
４…  デコーダ
５…  ブランチコントロールモジュール
６…  マイクロ命令アドレスレジスタ
７…  バッファレジスタ
８…  ステータスレジスタ
９〜１８…  信号線
１９…  ゲート
２０…  信号線
２１…  信号線
【図１】
2011257924.tif 000003
【図２】
2011257924.tif 000004
【図３】
2011257924.tif 000005
【図４】
2011257924.tif 000006
【図５】
2011257924.tif 000007
【図６】
2011257924.tif 000008