(57)【要約】【課題】検証対象回路と複製回路との間の命令実行間隔を常に所定命令数にすることのできるハードウェアエミュレータを用いるデバッグ装置およびデバッグ方法を提供する。【解決手段】ハードウェアエミュレータ１と、ハードウェアエミュレータ１を制御するソフトウェアデバッガ２と、ハードウェアエミュレータ１の出力を解析するハードウェアデバッガ３とを備える。ハードウェアエミュレータ１は、検証対象回路部１１と、検証対象回路部１１を複製した複製回路部１２を有する。検証対象回路部１１は、デバッグ制御部１３により動作の開始と停止が制御される。複製回路部１２は、実行開始遅延部１４の制御により、検証対象回路部１１より所定の遅延命令数遅れて動作を開始する。プログラムカウンタ制御部１５は、検証対象回路部１１と複製回路部１２との命令実行間隔が所定の遅延命令数を保つようにそれぞれのプログラムカウンタＰＣ１、ＰＣ２の更新を制御する。【選択図】図１
2009193165.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアエミュレータと、前記ハードウェアエミュレータを制御するソフトウェアデバッガと、前記ハードウェアエミュレータの出力を解析するハードウェアデバッガとを備えるデバッグ装置であって、
前記ハードウェアエミュレータは、
プログラムカウンタにより命令実行の進行が制御されるＣＰＵおよび前記ＣＰＵの命令実行に応じて動作する回路を含む検証対象回路部と、
前記検証対象回路部を複製した少なくとも１つの複製回路部と、
前記ソフトウェアデバッガから動作開始信号が出力されたときに前記検証対象回路部の動作を開始させ、前記ソフトウェアデバッガにより設定されたブレイクポイントに前記検証対象回路部の前記プログラムカウンタの値が達したときに前記検証対象回路部および前記複製回路部の動作を停止させるデバッグ制御手段と、
前記検証対象回路部で実行される命令と同じ命令を前記検証対象回路部における命令実行の開始から所定の命令数遅らせて前記複製回路部で実行開始させる実行開始遅延手段と、
前記検証対象回路部の前記プログラムカウンタの値の更新と前記複製回路部のプログラムカウンタの値の更新を、前記検証対象回路部および前記複製回路部において実行中の命令の実行がともに終了しているときに同時に行うよう制御するプログラムカウンタ制御手段と、
前記ハードウェアデバッガからの要求に応じて前記検証対象回路部または前記複製回路部の出力を前記ハードウェアデバッガへ送出する出力手段と
を有することを特徴とするデバッグ装置。
【請求項２】
前記デバッグ制御手段が、
前記ハードウェアデバッガからの要求に応じて、動作停止時点以降の前記複製回路部の動作を実行させる
ことを特徴とする請求項１に記載のデバッグ装置。
【請求項３】
プログラムカウンタにより命令実行の進行が制御されるＣＰＵおよび前記ＣＰＵの命令実行に応じて動作する回路を含む検証対象回路部および前記検証対象回路部を複製した少なくとも１つの複製回路部を搭載するハードウェアエミュレータと、前記ハードウェアエミュレータを制御するソフトウェアデバッガと、前記ハードウェアエミュレータの出力を解析するハードウェアデバッガとを用いるデバッグ方法であって、
前記ソフトウェアデバッガにより前記複製回路部における命令の実行開始を前記検証対象回路部における命令実行の開始から遅らせる命令数を設定するステップと、
前記ソフトウェアデバッガによりブレイクポイントを設定するステップと、
前記ソフトウェアデバッガから動作開始信号を出力して前記検証対象回路部に動作を開始させるステップと、
前記設定された命令数遅れて前記検証対象回路部で実行されている命令と同じ命令を前記複製回路部が実行開始するステップと、
前記ハードウェアエミュレータが、前記検証対象回路部の前記プログラムカウンタの値の更新と前記複製回路部のプログラムカウンタの値の更新を、前記検証対象回路部および前記複製回路部において実行中の命令の実行がともに終了しているときに同時に行うよう制御しながら、命令実行を進めるステップと、
前記ハードウェアエミュレータが、前記検証対象回路部の前記プログラムカウンタの値が前記ブレイクポイントに達したときに前記検証対象回路部および前記複製回路部の動作を停止させるステップと、
前記ハードウェアデバッガから前記ハードウェアエミュレータへ出力要求を送り、前記複製回路部の出力を前記ハードウェアデバッガへ送出させるステップと
を有することを特徴とするデバッグ方法。
【請求項４】
前記ハードウェアデバッガから指示して、前記複製回路部に動作停止時点以降の動作を実行させる
ことを特徴とする請求項３に記載のデバッグ方法。
【請求項５】
１回の実行で不具合箇所が特定できないときは、前記検証対象回路部の命令実行の開始を遅らせる命令数を増加させて前記ハードウェアエミュレータを再動作させる
ことを特徴とする請求項３または４に記載のデバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デバッグ装置およびデバッグ方法に関する。
【背景技術】
【０００２】
ＣＰＵを搭載するシステムＬＳＩの動作検証においては、ＣＰＵで実行されるプログラムを利用して検証を進めることが多い。そのとき、ＣＰＵに、実績のある既存のＣＰＵを使用する場合、不具合が発生するのは、ＣＰＵ以外の、新規に設計した回路部分、あるいはプログラムのいずれか、あるいは両方である。
【０００３】
そこで、不具合が発生したときのデバッグを行う場合、まず、ＬＳＩの回路とプログラムのどちらに不具合があるか、という切り分けを行い、次に、プログラムのどの命令を実行中に問題が表面化したかを特定し、その命令の数命令前からプログラムの再現実行をさせながら、そのときの回路の動作を解析することが、一般的に行われる。
【０００４】
このようなデバッグを進めときに、ＬＳＩの回路動作をシミュレーションで確認すると時間がかかる。特に、大規模ＬＳＩでは、その弊害が顕著である。そこで、シミュレータの代わりに、ＬＳＩの回路記述データをＦＰＧＡなどにマッピングしたハードウェアエミュレータを使用し、ＣＰＵ動作（ソフトウェア）とハードウェアの協調デバッグを行い、デバッグ時間の短縮を図ることが行われる。
【０００５】
この協調デバッグのために、例えばパーソナルコンピュータ上で動作する、ソフトウェアデバッガおよびハードウェアデバッガが使用される。
【０００６】
デバッグ実行の際は、ソフトウェアデバッガによりブレイクポイントを設定しながらプログラムの実行を徐々に進めて問題が起こったときの命令をプログラムのソースコード上で検出し、その後、ハードウェアエミュレータを再実行させ、問題発生の命令の１〜数命令前から、ハードウェアデバッガによるハードウェアエミュレータ出力の詳細な波形観測を行う、などの方法で問題の発生した回路の特定が行われる。
【０００７】
これにより、デバッグ時間が短縮されるが、それでも、まだ、ハードウェアエミュレータの再実行に時間を要するという問題がある。
【０００８】
これに対して、従来、ＦＰＧＡに検証対象回路と、これを複製した複製回路とをマッピングし、検証対象回路と複製回路を同時に動作させるときに、複製回路へは検証対象回路よりも遅延させた入力を与え、検証対象回路に不具合が発生したときに、複製回路の実行を停止して、そのときの複製回路の内部状態を取得することにより、不具合発生時点よりも前の時点の回路の状態を直ちに取得できるデバッグシステムが提案されている（例えば、特許文献１参照。）。
【０００９】
しかし、上述のデバッグシステムでは、複製回路の入力へ与えられる遅延が固定である。そのため、ＣＰＵにパイプライン処理方式のＣＰＵを使用している場合、ストールの発生などにより命令実行に要するクロック数が一定ではないため、検証対象回路に不具合が発生したときに複製回路で実行されている命令が、検証対象回路で実行された命令よりもいくつ前の命令か不明である、という問題が発生する。
【００１０】
また、場合によっては、不具合の原因となった命令が、複製回路で既に実行されていることもあり、不具合の特定が困難になる、という問題もあった。
【特許文献１】米国特許出願公開第２００６／０１９０８６０号明細書
【発明の開示】
【発明が解決しようとする課題】
【００１１】
そこで、本発明の目的は、検証対象回路と複製回路との間の命令実行間隔を常に所定命令数にすることのできるハードウェアエミュレータを用いるデバッグ装置およびデバッグ方法を提供することにある。
【課題を解決するための手段】
【００１２】
本発明の一態様によれば、ハードウェアエミュレータと、前記ハードウェアエミュレータを制御するソフトウェアデバッガと、前記ハードウェアエミュレータの出力を解析するハードウェアデバッガとを備えるデバッグ装置であって、前記ハードウェアエミュレータは、プログラムカウンタにより命令実行の進行が制御されるＣＰＵおよび前記ＣＰＵの命令実行に応じて動作する回路を含む検証対象回路部と、前記検証対象回路部を複製した少なくとも１つの複製回路部と、前記ソフトウェアデバッガから動作開始信号が出力されたときに前記検証対象回路部の動作を開始させ、前記ソフトウェアデバッガにより設定されたブレイクポイントに前記検証対象回路部の前記プログラムカウンタの値が達したときに前記検証対象回路部および前記複製回路部の動作を停止させるデバッグ制御手段と、前記検証対象回路部で実行される命令と同じ命令を前記検証対象回路部における命令実行の開始から所定の命令数遅らせて前記複製回路部で実行開始させる実行開始遅延手段と、前記検証対象回路部の前記プログラムカウンタの値の更新と前記複製回路部のプログラムカウンタの値の更新を、前記検証対象回路部および前記複製回路部において実行中の命令の実行がともに終了しているときに同時に行うよう制御するプログラムカウンタ制御手段と、前記ハードウェアデバッガからの要求に応じて前記検証対象回路部または前記複製回路部の出力を前記ハードウェアデバッガへ送出する出力手段とを有することを特徴とするデバッグ装置が提供される。
【００１３】
また、本発明の別の一態様によれば、プログラムカウンタにより命令実行の進行が制御されるＣＰＵおよび前記ＣＰＵの命令実行に応じて動作する回路を含む検証対象回路部および前記検証対象回路部を複製した少なくとも１つの複製回路部を搭載するハードウェアエミュレータと、前記ハードウェアエミュレータを制御するソフトウェアデバッガと、前記ハードウェアエミュレータの出力を解析するハードウェアデバッガとを用いるデバッグ方法であって、前記ソフトウェアデバッガにより前記複製回路部における命令の実行開始を前記検証対象回路部における命令実行の開始から遅らせる命令数を設定するステップと、前記ソフトウェアデバッガによりブレイクポイントを設定するステップと、前記ソフトウェアデバッガから動作開始信号を出力して前記検証対象回路部に動作を開始させるステップと、前記設定された命令数遅れて前記検証対象回路部で実行されている命令と同じ命令を前記複製回路部が実行開始するステップと、前記ハードウェアエミュレータが、前記検証対象回路部の前記プログラムカウンタの値の更新と前記複製回路部のプログラムカウンタの値の更新を、前記検証対象回路部および前記複製回路部において実行中の命令の実行がともに終了しているときに同時に行うよう制御しながら、命令実行を進めるステップと、前記ハードウェアエミュレータが、前記検証対象回路部の前記プログラムカウンタの値が前記ブレイクポイントに達したときに前記検証対象回路部および前記複製回路部の動作を停止させるステップと、前記ハードウェアデバッガから前記ハードウェアエミュレータへ出力要求を送り、前記複製回路部の出力を前記ハードウェアデバッガへ送出させるステップとを有することを特徴とするデバッグ方法が提供される。
【発明の効果】
【００１４】
本発明によれば、ハードウェアエミュレータに搭載される検証対象回路と複製回路との間の命令実行間隔を常に所定命令数にすることができるので、複製回路の状態を観測することにより検証対象回路に不具合が発生したときよりも所定命令数前の動作を解析することができる。
【発明を実施するための最良の形態】
【００１５】
以下、本発明の実施例を図面を参照して説明する。
【実施例１】
【００１６】
図１は、本発明の実施例１に係るデバッグ装置の構成の例を示すブロック図である。
【００１７】
本実施例のデバッグ装置は、ハードウェアエミュレータ１と、ハードウェアエミュレータ１を制御するソフトウェアデバッガ２と、ハードウェアエミュレータ１の出力を解析するハードウェアデバッガ３とを備える。
【００１８】
ハードウェアエミュレータ１は、プログラムカウンタＰＣ１により命令実行の進行が制御されるＣＰＵ１およびＣＰＵ１の命令実行に応じて動作する周辺回路を含む検証対象回路部１１と、検証対象回路部１１を複製した回路であり、プログラムカウンタＰＣ２により命令実行の進行が制御されるＣＰＵ２およびＣＰＵ２の命令実行に応じて動作する周辺回路を含む複製回路部１２と、ソフトウェアデバッガ２から動作開始信号が出力されたときに検証対象回路部１１の動作を開始させ、ソフトウェアデバッガ２により設定されたブレイクポイントに検証対象回路部１１のプログラムカウンタＰＣ１の値が達したときに検証対象回路部１１および複製回路部１２の動作を停止させるデバッグ制御部１３と、検証対象回路部１１で実行される命令と同じ命令を検証対象回路部１１における命令実行の開始からソフトウェアデバッガ２により設定された遅延命令数の分遅らせて複製回路部１２で実行開始させる実行開始遅延部１４と、検証対象回路部１１のプログラムカウンタＰＣ１の値の更新と複製回路部１２のプログラムカウンタＰＣ２の値の更新を、検証対象回路部１１および複製回路部１２において実行中の命令の実行がともに終了しているときに同時に行うよう制御するプログラムカウンタ制御部１５と、ハードウェアデバッガ３からの出力要求に応じて検証対象回路部１１または複製回路部１２の出力をハードウェアデバッガ３へ送出する出力手段１６と、を有する。
【００１９】
ソフトウェアデバッガ２は、複製回路部１２における命令の実行開始を検証対象回路部１１における命令実行の開始からどれだけ遅らせるかを指定する遅延命令数、および、検証対象回路部１１のプログラムカウンタＰＣ１に対するブレイクポイントを設定し、動作開始信号を出力することによりハードウェアエミュレータ１にプログラム動作を開始させる。
【００２０】
ハードウェアデバッガ３は、出力要求を出して、検証対象回路部１１または複製回路部１２の出力を受け取り、例えば波形表示などを行うことにより検証対象回路部１１または複製回路部１２の動作解析を行うツールである。
【００２１】
ここで、本実施例で用いられるＣＰＵ１およびＣＰＵ２は、命令実行をパイプライン方式で処理するプロセッサとする。
【００２２】
図２にパイプライン処理方式のＣＰＵにおける命令実行処理の例を示す。ここでは、パイプラインのステージとして、Ｆ（命令フェッチ）、Ｄ（デコード）、Ｅ（実行）、Ｍ（メモリアクセス）、Ｗ（レジスタライトバック）の５つのステージを備えるものとする。
【００２３】
パイプライン処理では、命令によってあるステージの処理が単位時間内に終わらないときは、パイプライン処理を停止（ストール）させて、その処理の終了を待つことが行われる。
【００２４】
図２では、このＣＰＵにおいて命令１、命令２、命令３、・・・が順次実行されるときに、命令２がＥステージを２サイクル、ストールさせ、命令３がＥステージを１サイクル、ストールさせたときの各ステージの処理状況を示している。
【００２５】
ここで、Ｅステージで実行中の命令を「実行命令」と称するものとすると、実行命令の処理時間は、命令１が１サイクル、命令２が３サイクル、命令３が２サイクルとなる。
【００２６】
なお、本実施例で用いるＣＰＵでは、実行命令を変更する際に、プログラムカウンタ変化トリガ信号ＴＧを出力するものとする。図２に示すように、プログラムカウンタ変化トリガ信号ＴＧに‘１’が出力されると、Ｅステージが次の命令の処理を開始する。
【００２７】
図２に示すように、パイプライン処理方式では、実行命令の処理時間は一定ではなく、命令によって変化する。したがって、ある命令の実行中に不具合が表面化し、デバッグのために、例えば１つ前の命令の実行状況を解析したいとしても、１つ前の命令が何サイクル前に実行されていたかは一概にはわからない。
【００２８】
そこで、本実施例では、複製回路部１２が、実行命令の処理サイクルの長短にかかわらず、検証対象回路部１１より常に所定の命令数遅れて命令を実行し、検証対象回路部１１の処理を停止したときに、所定の命令数前の命令が複製回路部１２で必ず実行されているようにする。
【００２９】
そのために、本実施例では、プログラムカウンタ制御部１５が、検証対象回路部１１のＣＰＵ１から出力されるプログラムカウンタ変化トリガ信号ＴＧ１と、複製回路部１２のＣＰＵ２から出力されるプログラムカウンタ変化トリガ信号ＴＧ２の出力レベルを監視し、検証対象回路部１１のプログラムカウンタＰＣ１の値の更新と複製回路部１２のプログラムカウンタＰＣ２の値の更新を、検証対象回路部１１および複製回路部１２において実行中の命令の実行がともに終了しているときに同時に行うよう制御する。
【００３０】
図３に、プログラムカウンタ制御部１５の具体的な回路例を示す。
【００３１】
ここで、まず、プログラムカウンタ制御部１５へ入力される各信号の信号レベルについて説明する。
【００３２】
デバッグ制御部１３から入力される開始信号は、デバッグ開始時に‘１’レベルのパルスが出力され、その他のときは‘０’レベル状態となっている。また、同じくデバッグ制御部１３から入力される停止信号は、通常動作時は‘０’レベルで、検証対象回路部１１のプログラムカウンタＰＣ１の値がブレイクポイントの値と一致したときに‘１’となる。
【００３３】
実行開始実行部１４から出力される信号は、ソフトウェアでバッガ２により設定された遅延命令数の期間‘１’レベルであり、その後‘０’レベルを保持する。
【００３４】
プログラムカウンタ変化トリガ信号ＴＧ１、ＴＧ２は、各ＣＰＵのＥステージで実行命令が実行中は‘０’レベルであり、実行命令を変更させるときに‘１’レベルとなる。
【００３５】
図３では、ＡＮＤゲートＡＮＤ１１とＡＮＤ２１により、プログラムカウンタ変化トリガ信号ＴＧ１、ＴＧ２の変化の状態を監視する。
【００３６】
ＡＮＤ１１の出力は、ＯＲゲートＯＲ１１、ＡＮＤゲートＡＮＤ１２を介して、検証対象回路部１１のＣＰＵ１のクロックＣＫ１を生成するＡＮＤゲートＡＮＤ１３へ入力される。ここで、ＡＮＤ１２の出力をクロック停止／動作信号ＳＴ１とすると、ＡＮＤ１３は、クロック停止／動作信号ＳＴ１が‘０’のとき、クロックパルス信号ＣＰをクロックＣＫ１として出力し、クロック停止／動作信号ＳＴ１が‘１’のとき、クロックＣＫ１を停止する。
【００３７】
また、ＡＮＤ２１の出力は、ＯＲゲートＯＲ２１、ＡＮＤゲートＡＮＤ２２、ＯＲゲートＯＲ２２を介して、複製回路部１２のＣＰＵ２のクロックＣＫ２を生成するＡＮＤゲートＡＮＤ２３へ入力される。ここで、ＯＲ２２の出力をクロック停止／動作信号ＳＴ２とすると、ＡＮＤ２３は、クロック停止／動作信号ＳＴ２が‘０’のとき、クロックパルス信号ＣＰをクロックＣＫ２として出力し、クロック停止／動作信号ＳＴ２が‘１’のとき、クロックＣＫ２を停止する。
【００３８】
この図３に示す回路で、開始信号が‘１’（デバッグ開始）になると、ＡＮＤ１２の出力であるクロック停止／動作信号ＳＴ１が‘０’となり、ＡＮＤ１３からクロックＣＫ１の出力が開始される。同時に、ＡＮＤ２２の出力も‘０’となるが、クロック停止／動作信号ＳＴ２は、ＯＲ２２へ入力される実行開始実行部１４からの信号により遅延命令数の期間‘１’レベルであり、その後‘０’レベルとなる。クロック停止／動作信号ＳＴ２が‘０’レベルになると、ＡＮＤ２３からクロックＣＫ２の出力が開始される。
【００３９】
その後、CＰＵ１、ＣＰＵ２での命令実行中は、プログラムカウンタ変化トリガ信号ＴＧ１、ＴＧ２の相互関係により、クロックＣＫ１、クロックＣＫ２が停止されることがある。
【００４０】
すなわち、プログラムカウンタ変化トリガ信号ＴＧ１が‘１’でプログラムカウンタ変化トリガ信号ＴＧ２が‘０’であるときは、ＡＮＤ１１が‘１’となり、クロック停止／動作信号ＳＴ１が‘１’ となってクロックＣＫ１が停止する。
【００４１】
一方、プログラムカウンタ変化トリガ信号ＴＧ１が‘０’でプログラムカウンタ変化トリガ信号ＴＧ２が‘１’であるときは、ＡＮＤ２１が‘１’となり、クロック停止／動作信号ＳＴ２が‘１’ となってクロックＣＫ２が停止する。
【００４２】
その後、検証対象回路部１１のプログラムカウンタＰＣ１の値がブレイクポイントの値と一致すると、デバッグ制御部１３から入力される停止信号が‘１’となり、ＯＲ１１、ＯＲ２１が‘１’となってプログラムカウンタ変化トリガ信号ＴＧ１、ＴＧ２がとなり、クロックＣＫ１、ＣＫ２が、ともに停止する。
【００４３】
図４に、本実施例のハードウェアエミュレータ１の動作の例を波形図で示す。ここでは、ソフトウェアデバッガ２で設定される遅延命令数が「１」、ブレイクポイントが「０ｘ１８」である例を示す。また、それぞれプログラムカウンタの値で示す命令は、Ｅステージの実行に、「０ｘ８」、「０ｘ１０」の命令は１サイクルかかり、「０ｘＣ」、「０ｘ１４」の命令は２サイクルかかるものとする。ここでは、「０ｘ８」、「０ｘ１０」の命令を１サイクル命令、「０ｘＣ」、「０ｘ１４」の命令を２サイクル命令と称する。
【００４４】
次に、各サイクルでの、検証対象回路部１１および複製回路部１２の動作について説明する。
【００４５】
（サイクルＣ１）
検証対象回路部１１は、２サイクル命令「０ｘＣ」の１サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ１がアサートされず、クロック停止／動作信号ＳＴ１をアサートせず、次のサイクルではクロックＣＫ１を出力する。
【００４６】
複製回路部１２は、１サイクル命令「０ｘ８」を実行しているため、プログラムカウンタ変化トリガ信号ＴＧ２がアサートされる。このとき、プログラムカウンタ変化トリガ信号ＴＧ１がアサートされていないため、クロック停止／動作信号ＳＴ２をアサートし、次のサイクルではクロックＣＫ２を停止する。
【００４７】
（サイクルＣ２）
検証対象回路部１１は、２サイクル命令「０ｘＣ」の２サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ１がアサートされ、プログラムカウンタ変化トリガ信号ＴＧ２もアサートされているので、クロック停止／動作信号ＳＴ１をアサートせず、次のサイクルではクロックＣＫ１を出力する。
【００４８】
複製回路部１２は、クロックＣＫ２が停止されているので前サイクルの状態を保持する。プログラムカウンタ変化トリガ信号ＴＧ１がアサートされたので、クロック停止／動作信号ＳＴ２をデアサートし、次のサイクルではクロックＣＫ２を出力する。
【００４９】
（サイクルＣ３）
検証対象回路部１１は、１サイクル命令「０ｘ１０」を実行しているため、プログラムカウンタ変化トリガ信号ＴＧ１がアサートされる。このとき、プログラムカウンタ変化トリガ信号ＴＧ２がアサートされていないため、クロック停止／動作信号ＳＴ１をアサートし、次のサイクルではクロックＣＫ１を停止する。
【００５０】
複製回路部１２は、２サイクル命令「０ｘＣ」の１サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ２がアサートされず、クロック停止／動作信号ＳＴ２をアサートせず、次のサイクルではクロックＣＫ２を出力する。
【００５１】
（サイクルＣ４）
検証対象回路部１１は、クロックＣＫ１が停止されているので前サイクルの状態を保持する。プログラムカウンタ変化トリガ信号ＴＧ２がアサートされたので、クロック停止／動作信号ＳＴ１をデアサートし、次のサイクルではクロックＣＫ１を出力する。
【００５２】
複製回路部１２は、２サイクル命令「０ｘＣ」の２サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ２がアサートされ、プログラムカウンタ変化トリガ信号ＴＧ１もアサートされているので、クロック停止／動作信号ＳＴ２をアサートせず、次のサイクルではクロックＣＫ２を出力する。
【００５３】
（サイクルＣ５）
検証対象回路部１１は、２サイクル命令「０ｘ１４」の１サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ１がアサートされず、クロック停止／動作信号ＳＴ１をアサートせず、次のサイクルではクロックＣＫ１を出力する。
【００５４】
複製回路部１２は、１サイクル命令「０ｘ１０」を実行しているため、プログラムカウンタ変化トリガ信号ＴＧ２がアサートされる。このとき、プログラムカウンタ変化トリガ信号ＴＧ１がアサートされていないため、クロック停止／動作信号ＳＴ２をアサートし、次のサイクルではクロックＣＫ２を停止する。
【００５５】
（サイクルＣ６）
検証対象回路部１１は、２サイクル命令「０ｘ１４」の２サイクル目であるのでプログラムカウンタ変化トリガ信号ＴＧ１がアサートされ、プログラムカウンタ変化トリガ信号ＴＧ２もアサートされているので、クロック停止／動作信号ＳＴ１をアサートせず、次のサイクルではクロックＣＫ１を出力する。
【００５６】
複製回路部１２は、クロックＣＫ２が停止されているので前サイクルの状態を保持する。プログラムカウンタ変化トリガ信号ＴＧ１がアサートされたので、クロック停止／動作信号ＳＴ２をデアサートし、次のサイクルではクロックＣＫ２を出力する。
【００５７】
（サイクルＣ７）
検証対象回路部１１は、プログラムカウンタＰＣ１の値がブレイクポイントの値（０ｘ１８）と一致したため、クロック停止／動作信号ＳＴ１をアサートする。同時に、複製回路部１２も、クロック停止／動作信号ＳＴ２をアサートする。
【００５８】
このような本実施例によれば、検証対象回路部１１と複製回路部１２が、互いに相手の命令の実行状況を監視し、自己の命令の実行が終了しても相手の命令が実行中であるときは、自己の命令実行を次に進めず、相手の命令実行終了を待つ。これにより、検証対象回路部１１と複製回路部１２の命令実行間隔を、常に、ソフトウェアデバッガ２で設定する遅延命令数の値に保つことができる。そのため、検証対象回路部１１のプログラムカウンタＰＣ１の値がブレイクポイントの値と一致したときに複製回路部１２で実行されている命令が、どの命令であるかを直ちに確定することができる。
【００５９】
このブレイクポイントに到達して動作が停止した複製回路部１２の内部状態をハードウェアデバッガ３で解析することにより、不具合の原因が、ソフトウェアデバッガ２で設定した遅延命令数前の命令の実行で発生したものかどうかがわかる。
【００６０】
そのとき、遅延命令数前の命令の実行では不具合が発生していないことがわかったときは、ハードウェアデバッガ３から要求を出して、複製回路部１２に動作停止時点以降の動作を実行させ、その内部状態を解析することにより、動作停止以降のどの時点で不具合が発生するかを確認することができる。
【実施例２】
【００６１】
本実施例では、実施例１のデバッグ装置を用いたデバッグ方法について示す。
【００６２】
図５は、本実施例のデバッグ方法の処理の流れの例を示すフロー図である。
【００６３】
デバッグの開始にあたっては、まず、ソフトウェアデバッガ２により、複製回路部１２に対する遅延命令数の設定（ステップＳ０１）、およびブレイクポイントの設定を行い（ステップＳ０２）、その後、ソフトウェアデバッガ２から動作開始信号を出力する（ステップＳ０３）。
【００６４】
この動作開始信号を受けて、ハードウェアエミュレータ１が動作を開始する。そのとき、ハードウェアエミュレータ１は、検証対象回路部１１が先に命令実行を開始し、ステップＳ０１で設定された遅延命令数遅れて、検証対象回路部１１で実行されている命令と同じ命令を複製回路部１２が実行開始する。
【００６５】
その後、ハードウェアエミュレータ１は、検証対象回路部１１のプログラムカウンタＰＣ１の値の更新と複製回路部１２のプログラムカウンタＰＣ２の値の更新を、検証対象回路部１１および複製回路部１２において実行中の命令の実行がともに終了しているときに同時に行うよう制御しながら、命令の実行を進める（ステップＳ０４）。
【００６６】
その後、検証対象回路部１１のプログラムカウンタＰＣ１の値が、ソフトウェアデバッガ２により設定されたブレイクポイントに到達すると、ハードウェアエミュレータ１は、検証対象回路部１１および複製回路部１２の動作を停止させる（ステップＳ０５）。
【００６７】
そこで、ハードウェアデバッガ３からハードウェアエミュレータ１へ出力要求を送り、複製回路部１２の出力をハードウェアデバッガ３へ送出させる（ステップＳ０６）。
【００６８】
送出された複製回路部１２の出力に対して、ハードウェアデバッガ３による動作解析を行う（ステップＳ０７）。
【００６９】
このハードウェアデバッガ３による動作解析により、検証対象回路部１１によるプログラム実行時にブレイクポイントで発生する不具合の原因を追究する。
【００７０】
そのとき、遅延命令数前の命令の実行では不具合が発生していないことがわかったときは、ハードウェアデバッガ３から要求を出して、複製回路部１２に動作停止時点以降の動作を実行させる。そして、ハードウェアデバッガ３により、そのときの複製回路部１２の内部状態を解析することにより、動作停止以降のどの時点で不具合が発生するかを確認することができる。
【００７１】
なお、この解析で、不具合発生の原因が、さらに以前の命令の実行にあると推察されることもある。そのような場合には、ステップＳ０１で設定する遅延命令数の数を増加させて、図５に示すフローの処理を再度行うようにすればよい。そうすれば、増加させた命令数分だけ遡って、不具合発生原因解析の範囲を広げることができる。
【００７２】
このような本実施例によれば、遅延命令数の設定を行うことにより、不具合の発生した命令から、その遅延命令数前の命令まで、の間の動作解析を直ちに行うことができ、デバッグ作業を効率的に進めることができる。
【００７３】
なお、上述の各実施例では、複製部の数が１個の場合を例にとって説明したが、複製部の数を２個以上としてもよい。その場合、それぞれの複数部に設定する遅延命令数の数を異ならせることにより、不具合が発生したときに解析を開始するポイントを複数用意することができる。これにより、不具合の発生した命令から前の命令へ、命令の実行を遡りながらデバッグするときに、ハードウェアエミュレータを再動作させなくとも複数の解析ポイントにおける複製部の動作状態を１度に得ることができ、デバッグ作業の効率をさらに向上させることができる。
【図面の簡単な説明】
【００７４】
【図１】本発明の実施例１に係るデバッグ装置の構成の例を示すブロック図。
【図２】パイプライン処理方式のＣＰＵにおける命令実行処理の例を示す図。
【図３】実施例１のプログラムカウンタ制御部の構成の例を示す回路図。
【図４】実施例１のハードウェアエミュレータの動作の例を示す波形図。
【図５】本発明の実施例２に係るデバッグ方法の処理の流れの例を示すフロー図。
【符号の説明】
【００７５】
１  ハードウェアエミュレータ
２  ソフトウェアデバッガ
３  ハードウェアデバッガ
１１  検証対象回路部
１２  複製回路部
１３  デバッグ制御部
１４  実行開始遅延部
１５  プログラムカウンタ制御部
１６  出力部
ＰＣ１、ＰＣ２  プログラムカウンタ
【図１】
2009193165.tif 000003
【図２】
2009193165.tif 000004
【図３】
2009193165.tif 000005
【図４】
2009193165.tif 000006
【図５】
2009193165.tif 000007