(57)【特許請求の範囲】
【請求項１】
ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置で、システムバスを介することなく各ハードウェアブロックから直接入力されるレジスタデータのうち該デバッグ用記述文で指定されるレジスタアドレスのレジスタデータを選択するデータ選択部と、
前記選択されたレジスタデータを蓄積する出力情報記憶部と
を有することを特徴とするデバッグ回路。
【請求項２】
前記デバッグ用記述文の位置のプログラムカウンタ値と、該デバッグ用記述文で指定されるレジスタアドレスとを対応付けたシンボルテーブルと、
前記システムバスを介することなく前記ソフトウェアを実行する制御部から直接入力されるプログラムカウンタ値が前記シンボルテーブルに格納されているプログラムカウンタ値と一致する場合、該シンボルテーブルから対応するレジスタアドレスを選択するアドレス選択部と
を有することを特徴とする請求項１記載のデバッグ回路。
【請求項３】
前記出力情報記憶部に前記レジスタデータを書き込むアドレスを生成し、前記データ選択部内のレジスタ段数に応じて遅延させてライトイネーブル信号を生成し、該アドレスと該ライトイネーブル信号と実行中の前記ソフトウェアのプログラムカウンタ値とを該出力情報記憶部に出力する遅延アドレス生成部を有し、
前記ライトイネーブル信号によって、前記データ選択部から出力される前記レジスタデータの前記出力情報記憶部への書き込みが制御されることを特徴とする請求項１又は２記載のデバッグ回路。
【請求項４】
ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置のプログラムカウンタ値と該デバッグ用記述文で指定されるレジスタアドレスとを対応させたシンボルテーブルを参照して、該プログラムカウンタ値で、該レジスタアドレスからレジスタデータを取得し出力情報記憶部に蓄積するデバッグ回路を有するようにコンフィギュレーションされたハードウェア回路と、
前記ソフトウェアのプログラムバイナリを前記ハードウェア回路の制御部にロードし、また前記シンボルテーブルを前記デバッグ回路にロードして、該ハードウェア回路を評価するデバッガと、
を有することを特徴とするデバッグシステム。
【請求項５】
前記デバッガは、
前記ハードウェア回路の実行後、前記デバッグ回路から前記出力情報記憶部に蓄積された少なくとも実行中の前記ソフトウェアのプログラムカウンタ値と前記レジスタデータとを出力情報として読み出す手段と、
前記デバッグ用記述文で出力する文字列と該デバッグ用記述文の位置のプログラムカウンタ値とを対応付けて記憶領域に格納されるイベント情報と、前記出力情報とから、デバッグ用の出力テキストを生成する出力テキスト生成手段と
を有することを特徴とする請求項４記載のデバッグシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェア及びソフトウェアが混在するシステムにおけるソフトウェアテストに関する。
【背景技術】
【０００２】
ＣＰＵ（Central Processing Unit）コアやＤＳＰ（Digital Signal Processor）コアを集積したＳｏＣ（System-on-a-Chip）のようなハードウェア及びソフトウェアが混在するシステム（以下、ハードウェア／ソフトウェア混在システムと言う。）の開発を行う場合、ハードウェアとソフトウェアを組み合わせたシステムとしてのシステムレベル検証を行う必要がある。その際、ＦＰＧＡ（Field Programmable Gate Array）を用いたプロトタイピングシステムや、評価ボードを使用し、ＦＰＧＡ上に回路をマッピングしてソフトウェアも含めて実際に動作させて検証が行われる。
【０００３】
従来より、実機に近い環境でソフトウェアのデバッグの際に、Ｃ言語のprintf関数のようなテキスト出力によるデバッグが行われている。例えば、
#define reg_read(a) (*((volatile unsigned int *)(a)))
によって、どこを読み出すかを定義し、
printf (“Reg_XXX = %x”, reg_read(0x1f40));
このprintf関数の記述例では、“Reg_XXX = %x”は表示する文字の部分を示し、reg_read(0x1f40)は指定したアドレスのレジスタに格納されている値を読み出すことを示している。
【０００４】
しかし、printfを実行する場合、その処理に数百〜数千ステップ必要となるため、組み込み系に多いタイミング要求の厳しいアプリケーションを実行する場合、printfの挿入により動作が変わってしまい、目的の出力が得られず、デバッグが難しい場合があった。特にＳｏＣの場合、ＣＰＵのほかにハードウェアブロックが含まれており、さらにマルチＣＰＵ構成の場合もあるため、デバッグ対象のＣＰＵがprintf処理を行っている間に他のＣＰＵやハードウェアブロックが動作する事で同期が取れなくなり、デバッグができないだけでなく、誤動作を引き起こす場合もでてくる。
【０００５】
シングルＣＰＵを対象とした構成において、ＣＰＵはprintf処理を実際には行わず、printf部分のコードが実行されるタイミングでprintf出力するデータを読み出してデバッガに転送する事で、printfによる遅延を削減したり、ＣＰＵのＰＣ（プログラムカウンタ）の値が比較レジスタと一致した時点で予めアドレスレジスタに設定しておいたアドレスをアクセスし、外部デバッガに出力することなどが提案されている。（例えば、特許文献１、２などを参照）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００７−１７９２２１号公報
【特許文献２】特開２００８−５９１９１号公報
【特許文献３】特開２００７−１９３５７０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記従来技術では、デバッグの前処理としてソースコード中のprintf文の位置に相当するプログラムカウンタ（以下ＰＣ）の値を求め、そのprintfで参照するレジスタ・メモリを指定するアドレス等の情報とセットにして、ＣＰＵ側に保持し、ＣＰＵ内でＰＣが一致した際に対応するアドレスのレジスタ、メモリを読み出してデバッガに転送する事で、ＣＰＵ上では実際にprintf処理を実行せずに同等の処理を実現している。しかしながら、デバッグ用のアクセスも、システムで使用する共通バスを介して行うため、本来の処理でバスが使用中の場合は、使用完了まで待ってからアクセスを行うしかない。
【０００８】
また、シングルＣＰＵ構成に係る技術であるため、ＳｏＣに適用した場合、デバッグ用アクセスを共通バス経由で行うため、バスが使用中の場合は、その間待つ事になり、その分サイクルがずれてしまう。ＳｏＣの場合、ＣＰＵ以外にハードウェアブロックが含まれており、並行して動作しているため、バスを待っている間にもハードウェアブロックの動作は進んでしまい、もともとのprintf文位置のタイミングとは異なったタイミングでレジスタの読み出しを行う事になる。そのため、バスを待っている間にそのレジスタの値が変わった場合、正しくデバッグを行えなくなってしまう。
【０００９】
また、デバッグアクセスを行っている間、本来のＣＰＵとハードウェアブロック間のアクセスが待たされる事になるため、誤動作を引き起こしてしまうと言った問題も考えられる。
【００１０】
更に、マルチＣＰＵ構成において、それぞれのＣＰＵで実行するプログラムにprintfを挿入してデバッグを行う場合、それぞれのＣＰＵからの出力については、順序が確定しているが、両方の出力を組み合わせた場合、ＣＰＵ間の出力の順序がわからない等の問題がある。
【課題を解決するための手段】
【００１１】
開示の技術は、ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置で、システムバスを介することなく各ハードウェアブロックから直接入力されるレジスタデータのうち該デバッグ用記述文で指定されるレジスタアドレスのレジスタデータを選択するデータ選択部と、前記選択されたレジスタデータを蓄積する出力情報記憶部とを有するデバッグ回路のように構成される。
【００１２】
また、開示の技術は、ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置のプログラムカウンタ値と該デバッグ用記述文で指定される前記レジスタアドレスとを対応させたシンボルテーブルを参照して、該プログラムカウンタ値で、該レジスタアドレスからレジスタデータを取得し出力情報記憶部に蓄積するデバッグ回路を有するようにコンフィギュレーションされたハードウェア回路と、前記ソフトウェアのプログラムバイナリを前記ハードウェア回路の制御部にロードし、また前記シンボルテーブルを前記デバッグ回路にロードして、該ハードウェア回路を評価するデバッガとを有するデバッグシステムのように構成される。
【発明の効果】
【００１３】
開示の技術では、デバッグ用記述文（例えば、printf文）に係るデバッグ処理に関して、システムバスを介するアクセス制御を不要とすることができ、ソフトウェアの実行処理に影響を与えることがない。
【図面の簡単な説明】
【００１４】
【図１】シングルプロセッサにおける、自動生成したデバッグ回路追加後のＳｏＣ全体の構成例を示す図である。
【図２】シングルプロセッサの場合のデバッグ回路の構成概要を説明するための図である。
【図３】シングルプロセッサの場合のデバッグ回路の構成例を示す図である。
【図４】マルチＣＰＵにおける、自動生成したデバッグ回路追加後の全体構成例を示す図である。
【図５】マルチプロセッサの場合のデバッグ回路の構成例を示す図である。
【図６】レジスタデータを選択するためのマルチプレクサの回路構成例を示す図である。
【図７】複数のレジスタの同時読み出しに対応したデバッグ回路の構成例を示す図である。
【図８】デバッグ処理の全体フローを説明するための図である。
【図９】ハードウェア側の準備処理に係るフローを説明するための図である。
【図１０】デバッグ回路生成処理を説明するためのフローチャート図である。
【図１１】ソフトウェア側の準備処理に係るフローを説明するための図である。
【図１２】デバッグシステムの構成例を示す図である。
【図１３】デバッガのハードウェア構成を示すブロック図である。
【図１４】デバッグ時のデバッガでの処理を説明するためのフローチャート図である。
【図１５】シンボルテーブル及びレジスタマップの例を示す図である。
【図１６】図１５のシンボルテーブル及びレジスタマップに基づくデバッグ回路の構成例を示す図である。
【図１７】図１６に示すデバッグ回路の構成に対応したマルチプレクサ（レジスタデータ選択部）の構成例を示す図である。
【図１８】図１６及び図１７の構成例における信号の状態を示すタイミング図である。
【発明を実施するための形態】
【００１５】
以下、本発明の実施の形態を図面に基づいて説明する。本実施例では、検証対象のＲＴＬ（Register Transfer Level）によって設計したＳｏＣ又はマルチＣＰＵの構成におけるハードウェア回路をプログラム可能なＦＰＧＡ（Field Programmable Gate Array）で評価する際に、システムバスを介すことなくprintf出力の制御を可能とするデバッグ用回路を自動生成して追加する。
【００１６】
図１は、シングルプロセッサにおける、自動生成したデバッグ回路追加後のＳｏＣ全体の構成例を示す図である。図１では、本実施例に係る構成部分のみ示し、他を省略している。図１に示すＳｏＣ５０は、第１ＣＰＵ５１と、第１ＨＷ（ハードウェア）ブロック５３と、第２ＨＷ（ハードウェア）ブロック５４と、メモリ５５と、デバッグ回路５６とを有する。
【００１７】
第１ＣＰＵ５１は、プログラムカウンタ５１ａと、デバッグ対象プログラム５１ｂとを有する。プログラムカウンタ５１ａは、デバッグ回路５６にシステムバス５９を介することなく接続され、プログラムカウンタ値をデバッグ回路５６に直接通知する。デバッグ対象プログラム５１ｂは、第１ＣＰＵ５１に行わせるデバッグ対象のプログラムである。
【００１８】
第１ＨＷブロック５３は、第１ＣＰＵ５１によって制御されるハードウェアブロックであり、ＨＷ（ハードウェア）機能部５３０と、レジスタ５３ａ〜５３ｄとを有する。ＨＷ機能部５３０は、第１ＨＷブロック５３にて行う処理をハードウェア回路で構成した処理部である。レジスタ５３ａ〜５３ｄは、第１ＨＷブロック５３から出力されるデータを格納するレジスタであり、システムバス５９を介することなくデバッグ回路５６に接続され、レジスタ５３ａ〜５３ｄの内容がデバッグ回路５６へ直接通知される。
【００１９】
第２ＨＷブロック５４は、第１ＣＰＵ５１によって制御されるハードウェアブロックであり、ＨＷ機能部５４０と、レジスタ５４ａ〜５４ｄとを有する。ＨＷ機能部５４０は、第１ＨＷブロック５４にて行う処理をハードウェア回路で構成した処理部である。レジスタ５４ａ〜５４ｄは、第２ＨＷブロック５４から出力されるデータを格納するレジスタであり、システムバス５９を介することなくデバッグ回路５６に接続され、レジスタ５４ａ〜５４ｄの内容がデバッグ回路５６へ直接通知される。
【００２０】
メモリ５５は、第１ＣＰＵ５１によってシステムバス５９を介してアクセスされる。
【００２１】
デバッグ回路５６は、デバッグ対象プログラム５１ｂの実行中において、プログラムカウンタ値を用いてprintf文の位置に到達したと判断すると、printf文で指定されるレジスタデータを、第１ＨＷブロック５３又は第２ＨＷブロック５４からシステムバス５９を介さずに直接取得しておき、検証テストの終了時にデバッガへ出力制御する処理部である。デバッグ回路５６は、第１ＨＷブロック５３及び第２ＨＷブロック５４の全てのレジスタ出力が接続される。デバッグ回路５６で入力されたレジスタを選択して保存する構成とすることで、システムバス５９の競合で待たされることはなくなり、正確なタイミングの値を取り出せない問題や、本来の動作に影響を与える事はなくなる。
【００２２】
図２は、シングルプロセッサの場合のデバッグ回路の構成概要を説明するための図である。図２では、第１ＣＰＵ５１から通知されるプログラムカウンタ値に応じて、第１ＨＷブロック５３のレジスタを選択してレジスタデータを取得するためのデバッグ回路５６の基本構成を示している。図２において、デバッグ回路５６は、シンボルテーブル６０と、アドレス＆データ選択処理部７０と、出力情報記憶部８０と、時間カウンタ６３とを有する。
【００２３】
シンボルテーブル６０は、デバッグ対象プログラム５１ｂ内のprintf文の位置のプログラムカウンタ値と、printf文で出力するレジスタのアドレスとを保持している。
【００２４】
アドレス＆データ選択処理部７０は、シンボルテーブル６０から、レジスタ５３ａ〜５３ｄのうち、第１ＣＰＵ５１のプログラムカウンタ５１ａから通知されるプログラムカウンタ値に対応するレジスタのアドレスを選択して、そのアドレスで特定されるレジスタからレジスタデータを取得する。
【００２５】
出力情報記憶部８０は、printf文の位置のプログラムカウンタ値に対応させて、アドレス＆データ選択処理部７０が選択的に取得したレジスタデータと、レジスタデータの格納時間とを対応付けて、デバッグ対象プログラム５１ｂの実行単位で記憶するための記憶領域である。検証テストの終了時に、出力情報記憶部８０によって蓄積されたレジスタデータは、表示用文字列と併せてデバッガに出力される。
【００２６】
時間カウンタ６３は、ＦＰＧＡの動作開始からサイクル毎にカウントアップするカウンタで、printfデータ出力順序の整列に使用される。
【００２７】
図３は、シングルプロセッサの場合のデバッグ回路の構成例を示す図である。図３において、シンボルテーブル６０は、printf文の位置を示すプログラムカウンタ値と、レジスタデータを取得すべきレジスタアドレスとを対応付けて、所定記憶領域に予め格納される。出力情報記憶部８０では、検証テストの実行中でのprintf文の位置を示すプログラムカウンタ値と、アドレス＆データ選択処理部７０によって選択的に取得されたレジスタデータと、そのレジスタデータを格納した時間とを対応付けて記憶する。
【００２８】
アドレス＆データ選択処理部７０は、比較部７０１ａ、７０１ｂ、７０１ｃ、及び７０１ｄと、ＯＲ回路７０２と、遅延＆アドレス生成部７０３と、マルチプレクサ（レジスタアドレス選択部）７０４と、マルチプレクサ（レジスタデータ選択部）７０５とを有する。
【００２９】
第１ＣＰＵ５１のプログラムカウンタ５１ａからデバッグ回路５６へ入力されるプログラムカウンタ値は、デバッグ回路５６内において、比較部７０１ａ〜７０１ｄと、遅延＆アドレス生成部７０３とへ入力される。
【００３０】
比較部７０１ａ〜７０１ｄは、クロックサイクル毎に、プログラムカウンタ５１ａからのプログラムカウンタ値と対応するシンボルテーブル６０に格納されているＰＣ値とを比較し、一致した場合に「１」をＯＲ回路７０２とマルチプレクサ（レジスタアドレス選択部）７０４とに出力する。
【００３１】
ＯＲ回路７０２は、各比較部７０１ａ〜７０１ｄからの比較結果信号の論理和を遅延＆アドレス生成部７０２へと出力する。
【００３２】
遅延＆アドレス生成部７０３は、プログラムカウンタ５１ａからのプログラムカウンタ値とＯＲ回路７０２による比較結果信号の論理和とを入力し、ＰＣ（プログラムカウンタ）値と、出力情報記憶部８０へ書き込み用のアドレスと、書き込みを許可するためのライトイネーブル信号とを出力する。ライトイネーブル信号は、プログラムカウンタ値の比較結果信号の論理和により生成され、例えば、論理和が「１」のときに「１」を出力し、論理和が「０」のときに「０」を出力する。書き込み用のアドレスは、ライトイネーブル信号が「１」のときのクロックでインクリメントされる。ＰＣ値及びライトイネーブル信号は、データを選択するマルチプレクサ７０５内のレジスタ段数に合わせて遅延される。
【００３３】
マルチプレクサ（レジスタアドレス選択部）７０４は、各比較部７０１ａ〜７０１ｄからの比較結果信号と、シンボルテーブル６０に格納されている全てのレジスタアドレスとを入力し、比較結果信号が「１」となるレジスタアドレスを選択して、マルチプレクサ７０５へと出力する。
【００３４】
マルチプレクサ（レジスタデータ選択部）７０５は、マルチプレクサ７０４によって選択されたレジスタアドレスを入力し、第１ＨＷブロック５３のレジスタ５３ａ〜５３ｄのうちの選択されたレジスタアドレスで特定されるレジスタからレジスタデータを入力して、出力情報記憶部８０へ出力する。
【００３５】
上述したように、本実施例において、デバッグ回路５６は、ハードウェアブロック内のレジスタのレジスタデータを蓄積するものであり、printf文では以下のコード記述例のように、第１ＨＷブロック５３などのハードウェアブロック内のレジスタをリードした値を出力するものとする。
【００３６】
printf(“Reg_XXX = %x”,reg_read(0x1F40));
【００３７】
ここで、検証対象のＳｏＣ５０はメモリマップドＩ／Ｏを採用する場合には、reg_read()は以下の様に定義されているとする。
【００３８】
#define reg_read(a) (*((volatile unsigned int *)(a)))
【００３９】
図４は、マルチＣＰＵにおける、自動生成したデバッグ回路追加後の全体構成例を示す図である。図４では、本実施例に係る構成部分のみ示し、他を省略している。また、図１と同様の構成部分には同じ参照符号を付し、その説明を省略する。図４に示すマルチＣＰＵ５０ｍは、第１ＣＰＵ５１と、第２ＣＰＵ５２と、第１ＨＷブロック５３と、第２ＨＷブロック５４と、メモリ５５と、デバッグ回路５６とを有する。
【００４０】
第２ＣＰＵ５２は、第１ＣＰＵ５１と同様の構成を有し、ＰＣ（プログラムカウンタ）５２ａと、デバッグ対象プログラム５２ｂとを有する。ＰＣ（プログラムカウンタ）５２ａは、デバッグ回路５６にシステムバス５９を介することなく接続され、プログラムカウンタ値をデバッグ回路５６に直接通知する。デバッグ対象プログラム５２ｂは、第２ＣＰＵ５２に行わせるデバッグ対象のプログラムである。
【００４１】
マルチプロセッサの構成において、第１ＨＷブロック５３及び第２ＨＷブロック５４は、第１ＣＰＵ５１及び／又は第２ＣＰＵ５２によって制御される。メモリ５５は、第１ＣＰＵ５１及び第２ＣＰＵ５２によってシステムバス５９を介して共有される。
【００４２】
デバッグ回路５６は、デバッグ対象プログラム５１ｂ又はデバッグ対象プログラム５２ｂの実行中において、プログラムカウンタ値を用いてprintf文の位置に到達したと判断すると、printf文で指定されるレジスタデータを取得しておき、検証テストの終了時にデバッガへ出力制御する。デバッグ回路５６は、第１ＨＷブロック５３及び第２ＨＷブロック５４の全てのレジスタ出力が接続される。デバッグ回路５６で入力されたレジスタを選択して保存する構成とすることで、システムバス５９の競合で待たされることはなくなり、正確なタイミングの値を取り出せない問題や、本来の動作に影響を与える事はなくなる。
【００４３】
図５は、マルチプロセッサの場合のデバッグ回路の構成例を示す図である。図５に示すデバッグ回路５６は、第１ＣＰＵ５１に対して、第１シンボルテーブル６１と、第１アドレス＆データ選択処理部７１と、第１出力情報記憶部８１とを有し、第２ＣＰＵ５２に対して、第２シンボルテーブル６２と、第２アドレス＆データ選択処理部７２と、第２出力情報記憶部８２とを有する。デバッグ回路５６は、第１出力情報記憶部８１と第２出力情報記憶部８２とで使用される時間カウンタ６３を有する。
【００４４】
第１ＣＰＵ５１のプログラムカウンタ５１ａ及び第２ＣＰＵ５２のプログラムカウンタ５２ａからのプログラムカウンタ値は、バスを介さずにデバッグ回路５６に入力される。そして、デバッグ回路５６内で、プログラムカウンタ５１ａのプログラムカウンタ値は、第１シンボルテーブル６１と第１出力情報記憶部８１とに入力される。同様に、デバッグ回路５６内で、プログラムカウンタ５２ａのプログラムカウンタ値は、第２シンボルテーブル６２と第２出力情報記憶部８２とに入力される。
【００４５】
第１ＨＷブロック５３のレジスタ５３ａ〜５３ｄのレジスタデータは、第１シンボルテーブル６１と第２シンボルテーブル６２とへ同時に出力される。
【００４６】
第１ＣＰＵ５１及び第２ＣＰＵ５２の各々に対して、図３で説明した同等の動作を行う事で、個別に独立してレジスタデータを保存することができる。また、一つの時間カウンタ６３から同時に第１出力情報記憶部８１と第２出力情報記憶部８２とにカウンタ値が出力されることで、実行後にそれぞれの出力情報をマージして時間順にソートすることによって、一つの出力テキストを生成することができる。
【００４７】
一般的に、ＳｏＣ５０及びマルチＣＰＵ５０ｍ内には複数のハードウェアブロックが含まれ、レジスタの数は非常に多くなる。そのため、マルチプレクサ（レジスタデータ選択部）７５の遅延がボトルネックとなり、ＦＰＧＡの速度が目的を満たさなくなる場合がある。図６は、レジスタデータを選択するためのマルチプレクサの回路構成例を示す図である。
【００４８】
図６において、複数のハードウェアブロックのレジスタ８１ａ〜８１ｄ、８２ａ〜８２ｄ、８３ａ〜８３ｄ、及び８４ａ〜８４ｄからのレジスタデータがシステムバス５９を介すことなく直接マルチプレクサ７０５に出力され、その中から入力されるレジスタアドレスに基づいて選択されたレジスタデータが出力情報記憶部８０に出力され格納される。
【００４９】
マルチプレクサ（レジスタデータ選択部）７０５は、マルチプレクサ７６１〜７６４と、レジスタ７７１〜７７４と、マルチプレクサ７８０とを有する。
【００５０】
マルチプレクサ７６１は、入力されるレジスタアドレスに従って、レジスタ８１ａ〜８１ｄから選択したレジスタデータをレジスタ７７１へ出力する。マルチプレクサ７６２は、入力されるレジスタアドレスに従って、レジスタ８２ａ〜８２ｄから選択したレジスタデータをレジスタ７７２へ出力する。マルチプレクサ７６３は、入力されるレジスタアドレスに従って、レジスタ８３ａ〜８３ｄから選択したレジスタデータをレジスタ７７３へ出力する。マルチプレクサ７６４は、入力されるレジスタアドレスに従って、レジスタ８４ａ〜８４ｄから選択したレジスタデータをレジスタ７７４へ出力する。
【００５１】
更に、マルチプレクサ７８０において、入力されるレジスタアドレスに従って、レジスタ７７１〜７７４の１つが選択され、選択されたレジスタに格納されているレジスタデータが出力情報記憶部８０に格納される。
【００５２】
このように、マルチプレクサ（レジスタデータ選択部）７０５をパイプライン化し、1サイクル内にレジスタ値を取得しても速度の低下が発生しにくくなる。レジスタ７７１〜７７４を挿入し、マルチプレクサ７６１〜７６４、及び７８０で選択するレジスタの数を削減してパイプライン化する事で、高速化を実現できる。
【００５３】
次に、printf文によって複数のレジスタから同時に読み出す場合について説明する。以下の様に複数のレジスタを同時に読み出す場合、順番に読み出していると、２サイクル必要となる。
【００５４】
printf(“Reg_XXX = %x, Reg_YYY = %x”,
reg_read(0x1F40),reg_read(0x1F44));
【００５５】
デバッグ回路５６において、シンボルテーブル、出力情報記憶部を複数用意し、並列にデータを取得する構成とすることによって、高速に処理することができる。
【００５６】
図７は、複数のレジスタの同時読み出しに対応したデバッグ回路の構成例を示す図である。図７に示すデバッグ回路５６の構成は、図５の構成とほぼ同様である。異なる点は、第１ＣＰＵ５１のプログラムカウンタ５１ａからのプログラムカウンタ値が、第１シンボルテーブル６１及び第１出力情報記憶部８１と、第２シンボルテーブル６２及び第２出力情報記憶部８２とへと入力される点である。
【００５７】
上記printf文の場合、第１シンボルテーブル６１及び第１出力情報記憶部８１にアドレス0x1F40の情報、第２シンボルテーブル６２及び第２出力情報記憶部８２にアドレス0x1F44の情報を持つ事になる。１つだけレジスタを読み出す場合（printf文で指定されたレジスタが一つの場合）は、第１シンボルテーブル６１及び第１出力情報記憶部８１のみを使用すればよい。同様にして、同時に３以上のレジスタを読み出す場合にも、読み出すレジスタ毎に、シンボルテーブル、アドレス＆データ選択処理部、出力情報記憶部を備えることで高速処理を実現できる。
【００５８】
以下に、上述したようなデバッグ回路５６を有するＳｏＣ５０、マルチＣＰＵ等の評価対象のハードウェア回路をデバッグするためのデバッグ環境について説明する。先ず、評価対象のハードウェア回路をＦＰＧＡでデバッグするための処理の全体フローを図８で説明する。図８は、デバッグ処理の全体フローを説明するための図である。実際にデバッグ対象プログラムを動作させてprintf出力を取得するのは、後述される図１２のデバッグ環境で行い、その実行の前に、ハードウェア側、ソフトウェア側それぞれ準備が必要となる。
【００５９】
図８において、ハードウェア側及びソフトウェア側それぞれにおいて予め必要なデータを準備する（ステップＳ１０）。ハードウェア側の準備として、デバッグ回路５６を有するハードウェア回路のＦＰＧＡコンフィグデータ１を生成しておく。また、ソフトウェア側の準備として、デバッグ対象プログラムのシンボルテーブル６０と、実際のデバッグ対象プログラムの実行用のプログラムバイナリ３と、printf出力テキストを生成するためのイベント情報４とを出力しておく。
【００６０】
これら準備完了後、ＦＰＧＡコンフィグデータ１、シンボルテーブル６０、プログラムバイナリ３を図１２のＦＰＧＡボードに入力して、図１２のデバッグ環境におけるＦＰＧＡで処理を実行させる（ステップＳ１１）。
【００６１】
実行後、ＦＰＧＡ内の出力情報記憶部から取り出した情報と、イベント情報４を元にprintfテキストを生成するprintfテキスト生成処理がデバッガで行われ（ステップＳ１２）、デバッガで生成されたprintfテキストがprintf出力データ６として出力される。
【００６２】
ユーザは、そのprintf出力データ６と、デバッグ対象プログラムのソースコードを確認しながら、デバッグを行う。その結果、ハードウェア側、ソフトウェア側、どちらかにバグが見つかった場合は、修正して、最初に戻って準備ステップＳ１０からやり直す。この際、準備ステップＳ１０をやり直すのは、ハードウェア側、ソフトウェア側のうち修正を行ったほうのみとなる。また、ソフトウェア側でprintf文を追加、削除した場合にはソフトウェア側の準備からやり直す事になる。
【００６３】
図８の準備ステップＳ１０におけるハードウェア側での準備処理について図９で説明する。図９は、ハードウェア側の準備処理に係るフローを説明するための図である。ハードウェア側の準備処理は、ＣＰＵ、メモリなどを有するコンピュータ装置によって行われる。図９において、ハードウェア側のコンピュータ装置において、検証対象ハードウェアソースコード（以下、検証対象ＨＷソースコードと言う。）１ａと、レジスタネーミングルール１ｂとを入力し、デバッグ回路ＨＤＬ生成部９２でデバッグ回路５６の記述をＨＤＬ（Hardware Description Language）で生成し、この生成したデバッグ回路５６の記述を追加した検証対象ＨＷソースコード１ｃを記憶領域に出力する。
【００６４】
その後、ＦＰＧＡ用の論理合成ツール及び配置配線ツール９４を用いて、ＦＰＧＡコンフィグデータ１を生成して記憶領域に出力する。このフローは最初に行った後は、ハードウェアに修正が入った時のみ実行すればよい。
【００６５】
デバッグ回路ＨＤＬ生成部９２と、ＦＰＧＡ用の論理合成ツール及び配置配線ツール９４とは、ＣＰＵが、記憶媒体に格納されたプログラムをコンピュータ装置内の記憶装置などの記憶領域にロードして実行することにより実現される。
【００６６】
レジスタネーミングルール１ｂは、オリジナルの検証対象ＨＷソースコード１ａからレジスタ出力を引き出す記述を自動生成するために、機械的にレジスタのインスタンス名を見つけるためのルールを示している。デバッグ回路ＨＤＬ生成部９２において、レジスタネーミングルール１ｂを参照することにより、各レジスタは正規表現を用いて指定される。
【００６７】
次に、図９のデバッグ回路ＨＤＬ記述生成処理部９２によるデバッグ回路生成処理について図１０で説明する。図１０は、デバッグ回路生成処理を説明するためのフローチャート図である。
【００６８】
前提として入力するＨＤＬ記述４０の構成は、図１に示すＳｏＣ５０の構成を例とすると、最上位階層に第１ＣＰＵ５１、第１ＨＷブロック５３及び第２ＨＷブロック５４のモジュールが配置されており、第１及び第２ＨＷブロック内のレジスタは同じ階層にあり、レジスタ出力信号名は一定のネーミングルールに従っているものとする。
【００６９】
また、図３に示すマルチＣＰＵ５０ｍの構成を例とした場合、デバッグ回路５６で使用されるシンボルテーブル６０、出力情報記憶部８０、マルチプレクサ７０４及び７０５等の部分はパラメタライズ可能なライブラリとして用意しておく。
【００７０】
図１０において、ハードウェア側のコンピュータ装置において、デバッグ回路ＨＤＬ記述生成処理部９２として機能するＣＰＵは、開発中の評価対象のハードウェア回路のＣＰＵモジュールのファイルを読み込み、プログラムカウンタ値を出力するための出力ポートの記述を生成して追加する（ステップＳ４１）。
【００７１】
次に、ＣＰＵは、ハードウェアブロック毎にステップＳ４２からＳ４４での処理を行う。ＨＤＬ記述４０からＨＷブロックモジュールのファイルを順番に１つ読み込み、ＨＷブロックモジュールに記述されるレジスタ名を全て取得して、記憶領域に格納しておく（ステップＳ４２）。そして、ＣＰＵは、ＨＷブロックモジュールに対して、レジスタデータを出力するための出力ポートの記述を生成して追加する（ステップＳ４３）。そして、全ＨＷブロックに対して処理を完了したか否かを判断する（ステップＳ４４）。全ＨＷブロックに対して処理を完了している場合、ステップＳ４５へと進む。一方、まだ処理してないＨＷブロックが存在する場合、ステップＳ４２へと戻り、上述した同様の処理を繰り返す。
【００７２】
全てのＨＷブロックに対して出力ポートの追加が完了したら、ＣＰＵは、デバッグモジュール内の各処理部をインスタンスする記述を生成し、最後に最上位階層で信号を接続する記述を生成するために、ステップＳ４５からＳ５０での処理を行う。
【００７３】
ＣＰＵは、ＨＤＬ記述４０からデバッグモジュールのファイルを読み込んで、シンボルテーブルインスタンスの記述を生成して追加する（ステップＳ４５）。また、ＣＰＵは、デバッグモジュールに対して、比較回路インスタンスの記述を生成して追加する（ステップＳ４６）。
【００７４】
続けて、ＣＰＵは、デバッグモジュールに対して、マルチプレクサインスタンスの記述を生成して追加する（ステップＳ４７）。そして、ＣＰＵは、デバッグモジュールに対して、出力情報記憶部インスタンスの記述を生成して追加する（ステップＳ４８）。更に、ＣＰＵは、デバッグモジュールに対して、時間カウンタインスタンスの記述を生成して追加する（ステップＳ４９）。
【００７５】
各処理部のインスタンスの記述を生成し追加した後、ＣＰＵは、最上位階層のインスタンス間を接続するための記述を生成して追加する（ステップＳ５０）。
【００７６】
図８の準備ステップＳ１０におけるソフトウェア側での準備処理について図１１で説明する。図１１は、ソフトウェア側の準備処理に係るフローを説明するための図である。ソフトウェア側の準備処理は、ＦＰＧＡと接続可能なデバッガ１００として機能する、ＣＰＵ、メモリなどを有するコンピュータ装置によって行われる。図１１においてソフトウェア側のデバッガにおいて、検証対象ソフトウェアソースコード（以下、検証対象ＳＷソースコードと言う。）３ａを入力し、デバッガ１００による処理によって、シンボルテーブル６０、プログラムバイナリ３、イベント情報４を記憶領域に出力する。ここでは、簡単のため、検証対象ＳＷソースコード３ａにprintf文が埋め込まれている場合で説明している。
【００７７】
ソフトウェア側のフローは、検証対象ＳＷソースコード３ａを修正した際、printf文を追加、変更した場合に実行する。
【００７８】
デバッガ１００では検証対象ＳＷソースコード３ａからprintf文を取り除いてコンパイルを行い、プログラムバイナリ３を生成する。そして、リンク時に出力されるプログラムのリスト情報と、オリジナルソースコードからシンボルテーブル６０、イベント情報４を生成する。
【００７９】
シンボルテーブル６０はprintf文が挿入された位置のプログラムカウンタ値とそのprintfで読み出すレジスタのアドレスを含み、イベント情報４はprintfで出力する文字列とそれに対応するプログラムカウンタ値を含む。
【００８０】
次に、デバッグ環境について説明する。図１２は、デバッグシステムの構成例を示す図である。図１２に示すデバッグシステム１０００において、デバッガ１００は、ＦＰＧＡボード２００と接続され、ＦＰＧＡボード２００に搭載されたＦＰＧＡ２１０を制御することによって、ＦＰＧＡ２１０上に回路をマッピングしてソフトウェアも含めて動作させて検証する。
【００８１】
デバッガ１００は、ＦＰＧＡ制御部１５０を有し、予め用意されたプログラムバイナリ３、シンボルテーブル６０、イベント情報４はデバッガ１００内の記憶領域に格納されている。
【００８２】
ＦＰＧＡ制御部１５０は、ＦＰＧＡボード２００の実行開始、停止等を制御し、ＦＰＧＡ２１０へのファイル転送を制御するための制御部である。また、ＦＰＧＡ制御部１５０は、ＦＰＧＡ２１０の実行完了後、デバッグ回路内５６の出力情報記憶部８０に保存されている出力情報を読み出し、その出力情報からprintf出力のテキストを生成する。ユーザは、その内容を確認してデバッグを行う。
【００８３】
デバッガ１００は、例えば、図１３に示すようなハードウェア構成を有する。図１３は、デバッガのハードウェア構成を示すブロック図である。図１３において、デバッガ１００は、コンピュータ装置によって制御される装置であって、ＣＰＵ（Central Processing Unit）１１と、メモリユニット１２と、表示ユニット１３と、出力ユニット１４と、入力ユニット１５と、記憶装置１７と、ドライバ１８とを有し
、システムバスＢに接続される。
【００８４】
ＣＰＵ１１は、メモリユニット１２に格納されたプログラムに従ってデバッガ１００を制御する。メモリユニット１２には、ＲＡＭ（Random Access Memory）及びＲＯＭ（Read-Only Memory）等が用いられ、ＣＰＵ１１にて実行されるプログラム、ＣＰＵ１１での処理に必要なデータ、ＣＰＵ１１での処理にて得られたデータ等を格納する。また、メモリユニット１２の一部の領域が、ＣＰＵ１１での処理に利用されるワークエリアとして割り付けられている。
【００８５】
表示ユニット１３は、ＣＰＵ１１の制御のもとに必要な各種情報を表示する。出力ユニット１４は、プリンタ等を有し、利用者からの指示に応じて各種情報を出力するために用いられる。入力ユニット１５は、マウス、キーボード等を有し、ユーザがデバッガ１００が処理を行なうための必要な各種情報を入力するために用いられる。記憶装置１７には、例えば、ハードディスクユニットが用いられ、各種処理を実行するプログラム等のデータを格納する。
【００８６】
デバッガ１００によって行われる処理を実現するプログラムは、例えば、ＣＤ−ＲＯＭ（Compact Disc Read-Only Memory）等の記憶媒体１９によってデバッガ１００に提供される。即ち、プログラムが保存された記憶媒体１９がドライバ１８にセットされると、ドライバ１８が記憶媒体１９からプログラムを読み出し、その読み出されたプログラムがシステムバスＢを介して記憶装置１７にインストールされる。そして、プログラムが起動されると、記憶装置１７にインストールされたプログラムに従ってＣＰＵ１１がその処理を開始する。尚、プログラムを格納する媒体としてＣＤ−ＲＯＭに限定するものではなく、コンピュータが読み取り可能な媒体であればよい。本実施例に係る処理を実現するプログラムは、ＵＳＢ対応のデバッガ１００であれば、ＵＳＢ接続可能な外部記憶装置からインストールするようにしても良い。更に、ＳＤカード等のフラッシュメモリ対応のデバッガ１００であれば、そのようなメモリカードからインストールするようにしても良い。
【００８７】
図１４は、デバッグ時のデバッガでの処理を説明するためのフローチャート図である。図１４において、デバッガ１００は、ＦＰＧＡコンフィグデータ１によってコンフィギュレーションされたＦＰＧＡ２１０に対して、プログラムバイナリ３をＦＰＧＡ２１０内にマッピングされた第１ＣＰＵ５１及び第２ＣＰＵ５２へ転送し、シンボルテーブル６０をＦＰＧＡ２１０内にマッピングされたデバッグ回路５６へ転送する（ステップＳ６１）。第１ＣＰＵ５１及び第２ＣＰＵ５２の各々に対応するプログラムバイナリ３が転送される。そして、デバッガ１００は、ＦＰＧＡ２１０の実行を開始する（ステップＳ６２）。
【００８８】
その後、ＦＰＧＡ２１０での実行が完了すると（ステップＳ６３）、デバッガ１００は、ＦＰＧＡ２１０のデバッグ回路５６から実行中に出力情報記憶部８０に蓄積された出力情報８２を読み出す（ステップＳ６４）。
【００８９】
デバッガ１００は、出力情報８２とイベント情報４とからprintf出力テキストを生成し、時系列にソートする等の処理をした後、記憶領域にprintf出力データ６として格納する（ステップＳ６５）。
【００９０】
printf出力データ６は、表示ユニット１３に表示されたり、出力ユニット１４で出力されることにより、ユーザによるデバッグが行われる。ユーザがデバッグによって、検証対象ソフトウェア５１ｂ又は５２ｂ等のプログラムにバグを見つけ、ソースコードを修正したり、printf文の追加を行った場合は、図１０のフローでプログラムバイナリ３、シンボルテーブル６０を作り直して再度実行してprintf出力を確認することを繰り返しながらデバッグを進めていく。
【００９１】
次に、デバッグ回路５６の動作について詳述する。以下に説明するデバッグ回路５６の構成例は、図１５に示すようなシンボルテーブル６０とレジスタマップ６５とに基づくものとする。図１５は、シンボルテーブル及びレジスタマップの例を示す図である。図１５において、シンボルテーブル６０−２は、ＰＣ（プログラムカウンタ）値毎にレジスタアドレスを対応付けたテーブルである。シンボルテーブル６０−２では、ＰＣ値「０ｘ８３０６」のときのprintf文ではレジスタアドレス「０ｘ０００４」が指定され、ＰＣ値「０ｘ８Ａ００」のときのprintf文ではレジスタアドレス「０ｘ０００６」が指定され、ＰＣ値「０ｘ８Ａ０２」のときのprintf文ではレジスタアドレス「０ｘ０００Ａ」が指定されていることを示している。
【００９２】
レジスタマップ６５は、レジスタ名毎にレジスタアドレスを対応付けたレジスタ一覧テーブルである。レジスタマップ６５では、レジスタ名「REG_A」はレジスタアドレス「0x0000」のレジスタであり、レジスタ名「REG_B」はレジスタアドレス「0x0002」のレジスタであり、レジスタ名「REG_C」はレジスタアドレス「0x0004」のレジスタであり、レジスタ名「REG_D」はレジスタアドレス「0x0006」のレジスタである。
【００９３】
また、レジスタ名「REG_E」はレジスタアドレス「0x0008」のレジスタであり、レジスタ名「REG_F」はレジスタアドレス「0x000A」のレジスタであり、レジスタ名「REG_G」はレジスタアドレス「0x000C」のレジスタであり、レジスタ名「REG_H」はレジスタアドレス「0x000E」のレジスタである。
【００９４】
図１６は、図１５のシンボルテーブル及びレジスタマップに基づくデバッグ回路の構成例を示す図である。図３に示す構成例との違いのみについて説明し、他を省略する。また、図１６中において、括弧内の番号は、図１８に示す各信号に付された括弧内の番号に対応している。
【００９５】
図１６に示すデバッグ回路５６−２の構成例では、アドレス＆データ選択部７０は、図１５に示すシンボルテーブル６０−２の３つのＰＣ値に応じて、比較部７０１ａ、７０１ｂ、及び７０１ｃを有し、シンボルテーブル６０−２の３つのレジスタアドレスがマルチプレクサ（レジスタアドレス選択部）７０４に入力される。また、マルチプレクサ（レジスタデータ選択部）７０５は、図１５に示す、第１ＨＷブロック５３−２のレジスタ群５３８を一覧にしたレジスタマップ６５に従って、第１ＨＷブロック５３−２から入力される８個のレジスタデータの各レジスタアドレスを識別する。
【００９６】
上述したように、この構成例では、８個のレジスタから選択する場合を示している。この構成例におけるマルチプレクサ（レジスタデータ選択部）７０５の構成について説明する。図１７は、図１６に示すデバッグ回路の構成に対応したマルチプレクサ（レジスタデータ選択部）の構成例を示す図である。図１７中において、括弧内の番号は、図１８に示す各信号に付された括弧内の番号に対応している。
【００９７】
図１７において、マルチプレクサ７０５は、第１ＨＷブロック５３−２のレジスタ群５３８からレジスタデータが入力される１段目として２つのマルチプレクサ７６１及び７６２と、各マルチプレクサ７６１及び７６２によって選択されたレジスタデータを格納するためのレジスタであるＭＵＸ＿ＲＥＧ１及び２と、ＭＵＸ＿ＲＥＧ１及び２の２つのレジスタデータから１つを選択するための２段目としてのマルチプレクサ７８０と、マルチプレクサ７８０によって選択されたレジスタデータを格納するためのレジスタであるＭＵＸ＿ＲＥＧ３とを有する。
【００９８】
１段目のマルチプレクサ７６１及び７６２へのセレクト信号としてアドレスのbit2、bit1を入力する。２段目のマルチプレクサ７８０のセレクト信号としてアドレスのbit3を入力する。この例では２段レジスタが入っているため、レジスタの出力信号が２サイクル遅れることになり、図１６の遅延＆アドレス生成部７０３によって遅延制御される。
【００９９】
図１６及び図１７の構成例における動作を図１８に示すタイミング図で説明する。図１８は、図１６及び図１７の構成例における信号の状態を示すタイミング図である。
【０１００】
信号（１）のＣＬＫは、クロック信号を示す。
【０１０１】
信号（２）のＰＣは、ＣＰＵのプログラムカウンタ値を示す。信号（２）のＰＣの値は、0x8304、0x8306、0x8308、0x830A、0x8A00、0x8A02、0x8A04、0x8A06、0x8670、0x8672、0x8674・・・のように変化しているとします。この場合、プログラムカウンタ値が0x8306、0x8A00、0x8A02の時にシンボルテーブル６０−２の値と一致し、レジスタ値が保存される。
【０１０２】
信号（３）のDEBUG_EVENT_0は、ＣＰＵのプログラムカウンタ値とシンボルテーブル６０−２のＰＣ値（０番目）の比較結果を表す。ＰＣ値が0x8306の時に一致することを「１」で示している。
【０１０３】
信号（４）のDEBUG_EVENT_1は、ＣＰＵの信号（２）のＰＣの値とシンボルテーブル６０−２のＰＣ値（１番目）の比較結果を表す。ＰＣ値が0x8A00の時に一致することを「１」で示している。
【０１０４】
信号（５）のDEBUG_EVENT_2は、ＣＰＵの信号（２）のＰＣの値とシンボルテーブル６０−２のＰＣ値（２番目）の比較結果を表す。ＰＣ値が0x8A02の時に一致することを「１」で示している。
【０１０５】
信号（６）のREG_ADDRは、レジスタアドレス選択用のマルチプレクサ７０４で出力される、DEBUG_EVENT信号により選択されたシンボルテーブル６０−２のレジスタアドレスを示している。シンボルテーブル６０−２から出力される値の通り、信号（２）のＰＣの値が0x8306の時にアドレス0x0004、信号（２）のＰＣの値が0x8A00の時にアドレス0x0006、信号（２）のＰＣの値が0x8A02の時にアドレス0x000Aが出力される。
【０１０６】
信号（７）のREG_Cは、第１ＨＷブロック５３−２のレジスタ群５３８のうちレジスタREG_Cの値を示している。この例において、信号（２）のＰＣの値が0x8304となった以降、信号（７）のREG_Cのレジスタデータは0x0001を維持していることを示している。
【０１０７】
信号（８）のREG_Dは、第１ＨＷブロック５３−２のレジスタ群５３８のうちレジスタREG_Dの値を示している。この例において、信号（２）のＰＣの値が0x830Aとなるまで0x0701を示し、その後0x8A04となるまで0x0703を示し、0x8A04以降は0x0702を示を維持していることを示している。
【０１０８】
信号（９）のREG_Fは、第１ＨＷブロック５３−２のレジスタ群５３８のうちレジスタREG_Fの値を示している。この例において、信号（２）のＰＣの値が0x8304となると0xFDE0を示し、信号（２）のＰＣの値が0x8308となると0xF357を示し、信号（２）のＰＣの値が0x8A00となると0xFA05を示し、信号（２）のＰＣの値が0x8670となると0xFF00を維持していることを示している。
【０１０９】
信号（１０）のMUX_REG1は、レジスタデータ選択用のマルチプレクサ７０５内のレジスタMUX_REG1の値を示している。レジスタMUX_REG1は、第１ＨＷブロック５３−２のレジスタ群５３８のうちレジスタREG_AからREG_Dの値をREG_ADDR[2:1]で選択した結果を保持する。この例では左から、図１５のレジスタマップ６５に従って、レジスタアドレス「0x0004」で特定されるレジスタREG_Cの値「0x0001」、レジスタアドレス「0x0006」で特定されるレジスタREG_Dの値「0x0703」、レジスタアドレス「0x0002」で特定されるレジスタREG_Bの値「0x3300」が選択されている。
【０１１０】
信号（１１）のMUX_REG2は、レジスタデータ選択用のマルチプレクサ７０５内のレジスタMUX_REG2の値を示している。レジスタMUX_REG2は、第１ＨＷブロック５３−２のレジスタ群５３８のうちレジスタREG_EからREG_Hの値をREG_ADDR[2:1]で選択した結果を保持する。この例では左から、図１５のレジスタマップ６５に従って、レジスタアドレス「0x000C」で特定されるレジスタREG_Gの値「0x56D0」、レジスタアドレス「0x000E」で特定されるレジスタREG_Hの値「0x0003」、レジスタアドレス「0x000A」で特定されるレジスタREG_Fの値「0xFA05」が選択されている。
【０１１１】
信号（１２）のMUX_REG3は、レジスタデータ選択用のマルチプレクサ７０５内のレジスタMUX_REG3の値を示している。レジスタMUX_REG3は、レジスタMUX_REG1及びMUX_REG2の値をREG_ADDR[3]で選択した結果を保持する。この例では左から、信号（１０）のMUX_REG1の値「0x0001」、信号（１０）のMUX_REG1の値「0x0703」、信号（１１）のMUX_REG2の値「0xFA05」が選択され、最終的な結果として、信号（２）のＰＣがシンボルテーブル６０−２のＰＣ値と一致した時点における、レジスタアドレス「0x0004」で特定されるレジスタREG_Cの値「0x0001」、レジスタアドレス「0x0006」で特定されるレジスタREG_Dの値「0x0703」、レジスタアドレス「0x000A」で特定されるレジスタREG_Fの値「0xFA05」が得られる。
【０１１２】
信号（１３）のOUT_DATA_WEは、出力情報記憶部８０へのライトイネーブル信号を表している。信号（２）のＰＣとシンボルテーブル６０−２のＰＣ値との比較結果の論理和として求められる。また、マルチプレクサ７０５での遅延に合わせるため、遅延＆アドレス生成部７０３でタイミングを遅らせている。この場合は２サイクル遅延させている。
【０１１３】
信号（１４）のOUT_DATA_ADDRは、出力情報記憶部８０へのアドレス信号を表している。遅延＆アドレス生成部７０３で生成される。信号（１３）のOUT_DATA_WE信号が「１」の時にインクリメントすることで、書き込みの度にアドレスを１ずつ増加させている。
【０１１４】
信号（１５）のOUT_DATA_PC_INは、出力情報記憶部８０に書き込むＰＣ値を示している。マルチプレクサ７０５での遅延に合わせるため、遅延＆アドレス生成部７０３でタイミングを遅らせている。この場合は２サイクル遅延させている。
【０１１５】
信号（１６）のOUT_DATA_REG_INは、出力情報記憶部８０に書き込むレジスタ値を示している。
【０１１６】
信号（１７）のOUT_DATA_TIME_INは、出力情報記憶部８０に書き込む時間を示している。例えば、１サイクル毎に１カウントして、0x1285、、0x1286、0x1287・・・のようにカウントし、信号（１３）のOUT_DATA_WEに応じて出力情報記憶部８０に書き込んだ時間として格納される。
【０１１７】
信号（１８）のOUT_DATA[0]は、出力情報記憶部８０のアドレス0x0000に格納されているプログラムカウンタ（ＰＣ）値、レジスタデータ値、及び時間が示されている。
【０１１８】
信号（１９）のOUT_DATA[1]は、出力情報記憶部８０のアドレス0x0001に格納されているプログラムカウンタ（ＰＣ）値、レジスタデータ値、及び時間が示されている。
【０１１９】
信号（２０）のOUT_DATA[2]は、出力情報記憶部８０のアドレス0x0002に格納されているプログラムカウンタ（ＰＣ）値、レジスタデータ値、及び時間が示されている。
【０１２０】
信号（１８）のOUT_DATA[0]、信号（１９）のOUT_DATA[1]、及び信号（２０）のOUT_DATA[2]は、信号（１３）のOUT_DATA_WEに応じて、信号（１８）のOUT_DATA[0]には、信号（３）のDEBUG_EVENT_0での信号（１５）のOUT_DATA_PC_INの値、信号（１６）のOUT_DATA_REG_INの値、及び信号（１７）のOUT_DATA_TIME_INの値が格納される。
【０１２１】
図１８に示すタイミング図では、最初に、信号（２）のＰＣの値が「0x8306」の時に一致した後、２サイクル後に「0x8A00」で一致し、連続して次のサイクルの「0x8A02」で一致する。レジスタデータ選択用のマルチプレクサ７０５で２サイクル遅れているが、出力結果が一致した時点より２サイクルずれているだけで、連続して一致した場合でも、結果は正しく出力情報記憶部８０に出力され、見掛け上は1サイクルで読み出しできていることになる。
【０１２２】
上述したように、本実施例では、システムバスを使わずに各ハードウェアブロックの出力を直接取り出して保存する事で、1サイクルでのデータ読み出しを実現し、ＳｏＣやマルチＣＰＵの場合でもprintfによるレジスタ値の読み出しを正確なタイミングで行う事を可能にし、遅延による誤動作もなくす事を可能とした。また、デバッグ回路を自動生成する事で、非常にレジスタ数の多いＳｏＣやマルチＣＰＵへのデバッグ回路の追加を容易にした。
【０１２３】
本発明は、具体的に開示された実施例に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。
【０１２４】
以上の説明に関し、更に以下の項を開示する。
（付記１）
ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置で、システムバスを介することなく各ハードウェアブロックから直接入力されるレジスタデータのうち該デバッグ用記述文で指定されるレジスタアドレスのレジスタデータを選択するデータ選択部と、
前記選択されたレジスタデータを蓄積する出力情報記憶部と
を有することを特徴とするデバッグ回路。
（付記２）
前記デバッグ用記述文の位置のプログラムカウンタ値と、該デバッグ用記述文で指定されるレジスタアドレスとを対応付けたシンボルテーブルと、
前記システムバスを介することなく前記ソフトウェアを実行する制御部から直接入力されるプログラムカウンタ値が前記シンボルテーブルに格納されているプログラムカウンタ値と一致する場合、該シンボルテーブルから対応するレジスタアドレスを選択するアドレス選択部と
を有することを特徴とする付記１記載のデバッグ回路。
（付記３）
前記出力情報記憶部に前記レジスタデータを書き込むアドレスを生成し、前記データ選択部内のレジスタ段数に応じて遅延させてライトイネーブル信号を生成し、該アドレスと該ライトイネーブル信号と実行中の前記ソフトウェアのプログラムカウンタ値とを該出力情報記憶部に出力する遅延アドレス生成部を有し、
前記ライトイネーブル信号によって、前記データ選択部から出力される前記レジスタデータの前記出力情報記憶部への書き込みが制御されることを特徴とする付記１又は２記載のデバッグ回路。
（付記４）
複数の制御部の各々に対して、前記シンボルテーブルと前記アドレス選択部とを有することを特徴とする付記２又は３記載のデバッグ回路。
（付記５）
前記デバッグ用記述文で指定される複数のレジスタアドレスの各々に対して、前記シンボルテーブルと前記アドレス選択部とを有することを特徴とする付記２又は３記載のデバッグ回路。
（付記６）
前記出力情報記憶部には、前記選択されたレジスタデータと共に、前記プログラムカウンタ値及び時間情報が蓄積されることを特徴とする付記１乃至５のいずれか一項記載のデバッグ回路。
（付記７）
ソフトウェアのソースコードに含まれるデバッグ用にレジスタデータを出力させるデバッグ用記述文の位置のプログラムカウンタ値と該デバッグ用記述文で指定される前記レジスタアドレスとを対応させたシンボルテーブルを参照して、該プログラムカウンタ値で、該レジスタアドレスからレジスタデータを取得し出力情報記憶部に蓄積するデバッグ回路を有するようにコンフィギュレーションされたハードウェア回路と、
前記ソフトウェアのプログラムバイナリを前記ハードウェア回路の制御部にロードし、また前記シンボルテーブルを前記デバッグ回路にロードして、該ハードウェア回路を評価するデバッガと、
を有することを特徴とするデバッグシステム。
（付記８）
前記ハードウェア回路は、前記システムバスを介することなく、前記制御部から前記デバッグ回路へと実行中の前記ソフトウェアのプログラムカウンタ値を直接入力し、また、前記ハードウェア回路の複数のレジスタから該デバッグ回路へと前記レジスタデータを直接入力するようにコンフィギュレーションされたことを特徴とする付記７記載のデバッグシステム。
（付記９）
前記デバッグ回路は、
実行中の前記ソフトウェアのプログラムカウンタ値が前記シンボルテーブルに格納されているプログラムカウンタ値と一致する場合に、該シンボルテーブルから対応するレジスタアドレスを選択するアドレス選択部と、
前記複数のレジスタから前記選択されたレジスタアドレスで特定されるレジスタを選択して、該レジスタから入力されるレジスタデータを前記出力情報記憶部に蓄積するデータ選択部と、
を有することを特徴とする付記７又は８記載のデバッグシステム。
（付記１０）
前記デバッガは、
前記ハードウェア回路の実行後、前記デバッグ回路から前記出力情報記憶部に蓄積された少なくとも実行中の前記ソフトウェアのプログラムカウンタ値と前記レジスタデータとを出力情報として読み出す手段と、
前記デバッグ用記述文で出力する文字列と該デバッグ用記述文の位置のプログラムカウンタ値とを対応付けて記憶領域に格納されるイベント情報と、前記出力情報とから、デバッグ用の出力テキストを生成する出力テキスト生成手段と
を有することを特徴とする付記７乃至９のいずれか一項記載のデバッグシステム。
【符号の説明】
【０１２５】
５０          ＳｏＣ
５０ｍ        マルチＣＰＵ
５１          第１ＣＰＵ
５２          第２ＣＰＵ
５３          第１ＨＷブロック
５３ａ、５３ｂ、５３ｃ、５３ｄ      レジスタ
５４          第２ＨＷブロック
５４ａ、５４ｂ、５４ｃ、５４ｄ      レジスタ
５５          メモリ
５６          デバッグ回路
５９          バス
６０、６０−２    シンボルテーブル
６１          第１シンボルテーブル
６２          第２シンボルテーブル
６３          時間カウンタ
７０          アドレス＆データ選択処理部
７１          第１アドレス＆データ選択処理部
７２          第２アドレス＆データ選択処理部
７０１ａ、７０１ｂ、７０１ｃ、７０１ｄ      比較部
７０２        ＯＲ回路
７０３        遅延＆アドレス生成部
７０４        マルチプレクサ（レジスタアドレス選択部）
７０５        マルチプレクサ（レジスタデータ選択部）
７６１、７６２、７６３、７６４        マルチプレクサ
７７１、７７２、７７３、７７４        レジスタ
７８０        マルチプレクサ
８０          出力情報記憶部
８１          第１出力情報記憶部
８１ａ、８１ｂ、８１ｃ、８１ｄ      レジスタ
８２          第２出力情報記憶部
８２ａ、８２ｂ、８２ｃ、８２ｄ      レジスタ
８３ａ、８３ｂ、８３ｃ、８３ｄ      レジスタ
８４ａ、８４ｂ、８４ｃ、８４ｄ      レジスタ
１００        デバッガ
１５０        ＦＰＧＡ制御部
２００        ＦＰＧＡボード
２１０        ＦＰＧＡ
１０００      デバッグシステム
【図１】
0005545054.tif 000002
【図２】
0005545054.tif 000003
【図３】
0005545054.tif 000004
【図４】
0005545054.tif 000005
【図５】
0005545054.tif 000006
【図６】
0005545054.tif 000007
【図７】
0005545054.tif 000008
【図８】
0005545054.tif 000009
【図９】
0005545054.tif 000010
【図１０】
0005545054.tif 000011
【図１１】
0005545054.tif 000012
【図１２】
0005545054.tif 000013
【図１３】
0005545054.tif 000014
【図１４】
0005545054.tif 000015
【図１５】
0005545054.tif 000016
【図１６】
0005545054.tif 000017
【図１７】
0005545054.tif 000018
【図１８】
0005545054.tif 000019