(57)【要約】      （修正有）【課題】プログラムのデバッグ作業をより効率的に進めることができるロックステップ方式を用いた半導体装置を提供する。【解決手段】デバッグシステム１０００において、半導体装置（マイクロコンピュータ）１００は、メインコア１１とロックステップコア１２と、デバッグ制御回路２１、２２と、メインコアとロックステップコアによるプログラムの実行を停止させるエラー信号を出力可能なエラー制御回路５０とを含む。デバッグ制御回路（ロックステップ）は、ロックステップコアに対してメインコアとは異なるデバッグに関する設定を行なう。メインコアの処理結果とロックステップコアの処理結果とが不一致である場合であっても、デバッグに関する設定に基づいて、メインコアおよびロックステップコアのいずれかがプログラムの実行を停止している場合には、エラー制御回路は、エラー信号の出力を無効にする。【選択図】図１
2019204388.tif 000002
【特許請求の範囲】
【請求項１】
第１プロセッサコアと、
前記第１プロセッサコアと冗長な構成を有する第２プロセッサコアと、
前記第１プロセッサコアのための第１デバッグ回路と、
前記第２プロセッサコアのための第２デバッグ回路とを備え、
前記第２デバッグ回路は、前記第２プロセッサコアに対して前記第１プロセッサコアとは異なるデバッグに関する設定を行ない、
前記第１プロセッサコアの第１処理結果と前記第２プロセッサコアの第２処理結果とが一致しているか否かを判定する判定回路と、
前記第１および第２プロセッサコアによるプログラムの実行を停止させるエラー信号を出力可能なエラー制御回路とをさらに備え、
前記第１処理結果と前記第２処理結果とが不一致である場合であっても、前記デバッグに関する設定に基づいて、前記第１プロセッサコアが前記プログラムを実行しており前記第２プロセッサコアが前記プログラムの実行を停止している場合には、前記エラー制御回路は、前記エラー信号の出力を無効にする、半導体装置。
【請求項２】
前記第１および第２デバッグ回路の少なくとも一方を選択して、選択されたデバッグ回路にエミュレータからの指示を与える選択回路をさらに備え、
前記第１および第２デバッグ回路の各々は、前記エミュレータからの指示に従って、対応するプロセッサコアに対してデバッグに関する設定を行なう、請求項１に記載の半導体装置。
【請求項３】
前記エラー制御回路は、前記第１および第２プロセッサコアが前記プログラムを実行している状態であって、かつ前記第１処理結果と前記第２処理結果とが不一致である場合には、前記エラー信号の出力を有効にする、請求項１に記載の半導体装置。
【請求項４】
前記第２デバッグ回路は、前記第２プロセッサコアによる前記プログラムの実行を停止させるブレークポイントを設定し、
前記第２プロセッサコアによる前記プログラムの実行が前記ブレークポイントに到達した時点における前記第１処理結果および前記第２処理結果が一致している場合、前記第２プロセッサコアは、前記プログラムの実行を停止する、請求項１に記載の半導体装置。
【請求項５】
前記第２デバッグ回路は、前記プログラムの実行を停止している前記第２プロセッサコアの内部情報を取得する、請求項１に記載の半導体装置。
【請求項６】
前記第２プロセッサコアは、
前記プログラムに含まれる命令を実行する命令実行部と、
前記命令実行部の実行アドレスと、前記第２デバッグ回路により設定されたブレークポイントとに基づいて、前記ブレークポイントへの到達の有無を検出するブレークポイント検出回路と、
前記ブレークポイント検出回路の検出結果と、前記判定回路の判定結果とに基づいて、前記プログラムの実行を停止させるブレーク要求信号を前記命令実行部へ出力する要求出力回路とを含み、
前記要求出力回路は、前記ブレークポイントへの到達が検出され、かつ前記第１処理結果および前記第２処理結果が一致している場合に、前記ブレーク要求信号を前記命令実行部へ出力する、請求項４に記載の半導体装置。
【請求項７】
第１プロセッサコアと、
前記第１プロセッサコアと冗長な構成を有する第２プロセッサコアと、
前記第１プロセッサコアのための第１デバッグ回路と、
前記第２プロセッサコアのための第２デバッグ回路とを備え、
前記第２デバッグ回路は、前記第２プロセッサコアに対して前記第１プロセッサコアとは異なるデバッグに関する設定を行ない、
前記第１プロセッサコアの第１処理結果と前記第２プロセッサコアの第２処理結果とが一致しているか否かを判定する判定回路と、
前記判定回路の判定結果に基づいて、前記第１および第２プロセッサコアによるプログラムの実行を停止させるエラー信号を出力可能なエラー制御回路とをさらに備え、
前記第１プロセッサコアの初期化対象レジスタには第１の値が設定され、
前記第２プロセッサコアの初期化対象レジスタには前記第１の値とは異なる第２の値が設定され、
前記第１および第２プロセッサコアの各々は、前記第１の値および前記第２の値が設定された後に前記プログラムの実行を開始して、前記プログラムにより指定される初期化対象レジスタに前記プログラムに従う初期値を書き込む、半導体装置。
【請求項８】
前記第１および第２プロセッサコアが前記プログラムを実行している状態であって、かつ前記第１処理結果と前記第２処理結果とが不一致である場合に前記エラー制御回路から出力される前記エラー信号に基づいて、前記第１プロセッサコアおよび前記第２プロセッサコアの各々は、前記プログラムの実行を停止する、請求項７に記載の半導体装置。
【請求項９】
前記第１デバッグ回路は、停止した前記第１プロセッサコアの内部情報を取得し、前記第２デバッグ回路は、停止した前記第２プロセッサコアの内部情報を取得する、請求項８に記載の半導体装置。
【請求項１０】
前記エラー制御回路による前記エラー信号の出力機能は無効化されており、
前記第２デバッグ回路は、所定サイクル分の命令を前記第２プロセッサコアの命令バッファに注入し、
前記第２プロセッサコアは、前記第１プロセッサコアに対して前記所定サイクル分だけ遅れて前記プログラムを実行し、
前記第１プロセッサコアによる前記プログラムの実行が停止した場合、前記第２プロセッサコアは前記プログラムの実行を停止する、請求項１に記載の半導体装置。
【請求項１１】
前記第１デバッグ回路は、停止した前記第１プロセッサコアの内部情報を取得し、前記第２デバッグ回路は、停止した前記第２プロセッサコアの内部情報を取得する、請求項１０に記載の半導体装置。
【請求項１２】
第１プロセッサコアと、前記第１プロセッサコアと冗長な構成を有する第２プロセッサコアとを備えるコンピュータにより実行されるデバッグ方法であって、
前記第２プロセッサコアに対して前記第１プロセッサコアとは異なるデバッグに関する設定を実行するステップと、
前記第１プロセッサコアの第１処理結果と前記第２プロセッサコアの第２処理結果とが一致しているか否かを判定するステップと、
前記第１および第２プロセッサコアによるプログラムの実行を停止させるエラー信号を出力するステップとを含み、
前記出力するステップは、前記第１処理結果と前記第２処理結果とが不一致である場合であっても、前記デバッグに関する設定に基づいて、前記第１プロセッサコアが前記プログラムを実行しており前記第２プロセッサコアが前記プログラムの実行を停止している場合には、前記エラー信号の出力を無効にするステップを含む、デバッグ方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、半導体装置、およびデバッグ方法に関し、例えば、ロックステップ方式を用いた装置に好適に利用できるものである。
【背景技術】
【０００２】
従来、車載用の制御装置等においては、その構成要素であるマイクロコンピュータに故障が発生したとしても、機能的な工夫を施すことによって最低限の許容可能な安全を確保する機能が求められている。例えば、故障が発生したとしても、故障が発生してから予め定められた期間内で故障を検出することが求められる。
【０００３】
機能的な工夫の一例として、複数のプロセッサコアを用いたロックステップ方式が知られている。この技術に関連し、特許文献１（特開２０１４−１３２３８４号公報）には、ロックステップ方式を用いたマイクロコンピュータに関する技術が開示されている。
【０００４】
特許文献１に係るマイクロコンピュータは、第１及び第２ＣＰＵコアと、複数のフリップフロップと複数の機能ブロックとの情報が格納されたテーブルを記憶する記憶部と、制御部とを含む。制御部は、通常動作モードにおいて、第１および第２ＣＰＵコアの出力の不一致が検出された場合に通常動作モードから不一致箇所特定モードにモードを切り替える。制御部は、不一致箇所特定モードにおいて、第１および第２ＣＰＵコアのそれぞれのスキャンチェーンの出力の比較結果に基づき特定されたフリップフロップに対応する機能ブロックをテーブルの中から抽出し、当該機能ブロックの機能を停止させる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１４−１３２３８４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
車載用の制御装置等に用いられるプログラムの開発段階において、プロセッサコアの内部情報を取得するデバッグを実行する際には、事前準備が必要であったり、電子部品（例えば、モータ）の破損等に留意する必要があるため、デバッグ作業を効率よく進めるのが難しい場合がある。そのため、プログラム開発段階において、デバッグ作業をより効率的に進めることが求められている。特許文献１によると、ロックステップ動作するマイクロコンピュータを開示しているものの、効率的なデバッグ作業を実現するためのデバッグ方式については何ら教示ないし示唆されていない。
【０００７】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００８】
一実施の形態に従う半導体装置は、第１および第２プロセッサコアと、第１および第２デバッグ回路と、第１および第２プロセッサコアによるプログラムの実行を停止させるエラー信号を出力可能なエラー制御回路とを含む。第２デバッグ回路は、第２プロセッサコアに対して第１プロセッサコアとは異なるデバッグに関する設定を行なう。第１プロセッサコアの第１処理結果と第２プロセッサコアの第２処理結果とが不一致である場合であっても、デバッグに関する設定に基づいて、第１プロセッサコアがプログラムを実行しており第２プロセッサコアがプログラムの実行を停止している場合には、エラー制御回路は、エラー信号の出力を無効にする。
【０００９】
一実施の形態に従うデバッグ方法は、第１および第２プロセッサコアを含むコンピュータにより実行される。デバッグ方法は、第２プロセッサコアに対して第１プロセッサコアとは異なるデバッグに関する設定を実行するステップと、第１および第２プロセッサコアによるプログラムの実行を停止させるエラー信号を出力するステップとを含む。出力するステップは、第１プロセッサコアの第１処理結果と第２プロセッサコアの第２処理結果とが不一致である場合であっても、デバッグに関する設定に基づいて、第１プロセッサコアがプログラムを実行しており第２プロセッサコアがプログラムの実行を停止している場合には、エラー信号の出力を無効にするステップを含む。
【発明の効果】
【００１０】
一実施の形態によれば、ロックステップ方式を用いた装置において、プログラムのデバッグ作業をより効率的に進めることができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１に従うデバッグシステムの構成例を示す模式図である。
【図２】実施の形態１に従うエラー制御回路の構成例を示す図である。
【図３】実施の形態１に従うエラー信号の出力機能を説明するための情報テーブルである。
【図４】実施の形態１に従うプロセッサコアの構成例を示す図である。
【図５】実施の形態１に従うブレーク要求信号の出力機能を説明するための情報テーブルである。
【図６】実施の形態１に従うデバッグシステムが実行する処理手順を説明するための図である。
【図７】実施の形態２に従うプロセッサコアの構成例を示す図である。
【図８】実施の形態２に従うデバッグシステムが実行する処理手順を説明するための図である。
【図９】実施の形態３に従うプロセッサコアの構成例を示す図である。
【図１０】実施の形態３に従うデバッグシステムが実行する処理手順を説明するための図である。
【発明を実施するための形態】
【００１２】
以下、各実施形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰返さない。
【００１３】
［実施の形態１］
＜全体構成＞
図１は、実施の形態１に従うデバッグシステム１０００の構成例を示す模式図である。図１を参照して、デバッグシステム１０００は、マイクロコンピュータ１００と、エミュレータ２００と、ホストマシン３００とを含む。
【００１４】
ホストマシン３００は、ＰＣ（Personal  Computer）などのコンピュータ装置であり、マイクロコンピュータ１００のデバッグを支援するためのプログラム（例えば、デバッガ）を実行する。デバッガは、ユーザが対話的にマイクロコンピュータ１００内のプログラムの実行を制御したり、レジスタの値、メモリの内容等を画面に表示したり変更したりする機能を提供する。ホストマシン３００は、ＵＳＢ（Universal  Serial  Bus）インターフェース（Ｉ／Ｆ）などの通信インターフェイスを通じてエミュレータ２００と通信を行ない、エミュレータ２００と連携して動作する。
【００１５】
エミュレータ２００は、マイクロコンピュータ１００上のＣＰＵ（Central  Processing  Unit）で実行されるプログラムのデバッグ作業において用いられる装置である。エミュレータ２００は、例えば、ＪＴＡＧ（Joint  Test  Action  Group）の規格に従った通信インターフェイスを通じて、セレクタ３０を介してデバッグ制御回路２０と通信を行ない、デバッグ機能を制御する。デバッグ機能とは、例えば、プロセッサコア１０の実行制御、プロセッサコア１０内部のレジスタ値の取得ならびに変更、およびマイクロコンピュータ１００上の内部メモリの内容の取得ならびに変更等である。
【００１６】
マイクロコンピュータ１００は、メインのプロセッサコア（以下、「メインコア」とも称する。）１１と、サブのプロセッサコア（以下、「ロックステップコア」とも称する。）１２と、デバッグ制御回路２０と、セレクタ３０と、一致判定回路４０と、エラー制御回路５０とを含む。以下では、メインコア１１およびロックステップコア１２の各々に共通の構成や機能を説明する際には、それらをプロセッサコア１０と総称する。
【００１７】
なお、マイクロコンピュータ１００は、ＲＡＭ（Random  Access  Memory）およびフラッシュメモリ等の内部メモリ（図示しない）をさらに含む。内部メモリは、例えば、メインコア１１およびロックステップコア１２によって実行されるデバッグ対象のプログラムを格納している。
【００１８】
マイクロコンピュータ１００は、メインコア１１とロックステップコア１２とからなるロックステップデュアルコア構成を採用している。ロックステップデュアルコア構成とは、２つのプロセッサコアに同じ処理を実行させてそれぞれの処理結果の差を比較することで不具合の有無を検出する構成である。
【００１９】
典型的には、メインコア１１は、命令メモリに格納された複数の命令（すなわち、プログラム）を読み出して（すなわち、フェッチして）、当該読み出された複数の命令を順次処理する。例えば、メインコア１１は、命令に従った処理を実行することにより生成されたデータを内部メモリに書き込んだり、命令に従った処理を実行することで必要になったデータを内部メモリから読み出したりする。また、メインコア１１は、命令に従った処理の処理結果をペリフェラルバスを介して周辺回路に出力する。
【００２０】
ロックステップコア１２は、メインコア１１と冗長な構成を有している。すなわち、ロックステップコア１２は、メインコア１１と同等の性能及び機能を有している。ロックステップコア１２は、ロックステップ動作を行なうことにより、メインコア１１とほぼ同時に同じ処理を実行する。
【００２１】
ただし、ロックステップコア１２は、メインコア１１と全く同一の構成を有している必要はなく、メインコア１１と同等の性能及び機能を実現可能であればクロックタイミングあるいは遅延量等を変更してもよい。以下では、説明の容易化のため、メインコア１１およびロックステップコア１２が同一の構成を有しているものとする。
【００２２】
メインコア１１およびロックステップコア１２の各々は、処理結果を一致判定回路４０に出力する。また、メインコア１１およびロックステップコア１２の各々は、プログラムを実行している状態であるのか、当該プログラムの実行を停止している状態であるのかを示す状態信号をエラー制御回路５０に出力する。以下の説明では、メインコア１１の状態信号を「メイン状態信号」とも称し、ロックステップコア１２の状態信号を「ロックステップ状態信号」とも称する。
【００２３】
デバッグ制御回路２０は、セレクタ３０を介したエミュレータ２００からの指示に従って動作する。具体的には、デバッグ制御回路２０は、メインコア１１のためのデバッグ制御回路２１と、ロックステップコア１２にアクセスするためのデバッグ制御回路２２とを含む。
【００２４】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、メインコア１１に対してデバッグに関する設定を行なう。具体的には、デバッグ制御回路２１は、メインコア１１の実行制御、メインコア１１内部のレジスタ値の取得ならびに変更、内部メモリの内容の取得ならびに変更等のデバッグ機能を実現する。
【００２５】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２に対してデバッグに関する設定を行なう。具体的には、デバッグ制御回路２２は、ロックステップコア１２の実行制御、ロックステップコア１２内部のレジスタ値の取得ならびに変更、内部メモリ内容の取得ならびに変更、指定されたアドレスでプログラムの実行を停止させるブレークポイント等のデバッグ機能を実現する。
【００２６】
セレクタ３０は、デバッグ制御回路２１およびデバッグ制御回路２２の少なくとも一方を選択して、選択されたデバッグ制御回路にエミュレータ２００からの指示を与える回路である。例えば、セレクタ３０は、エミュレータ２００から、デバッグ制御回路の選択指示およびデバッグに関する設定指示を受け付ける。セレクタ３０は、当該選択指示に従うデバッグ制御回路に対して当該設定指示を出力する。
【００２７】
エミュレータ２００は、セレクタ３０を介して、デバッグ制御回路２１およびデバッグ制御回路２２にそれぞれ異なる設定指示を与えることができる。すなわち、エミュレータ２００は、ロックステップコア１２に対しメインコア１１とは異なるデバッグ設定を行なうことができる。
【００２８】
一致判定回路４０は、メインコア１１の処理結果（以下、「メイン処理結果」とも称する。）と、ロックステップコア１２の処理結果（以下、「ロックステップ処理結果」とも称する。）とが一致しているか否かを判定する。一致判定回路４０は、判定結果を一致判定信号としてエラー制御回路５０に出力する。
【００２９】
エラー制御回路５０は、予め定められた条件を満たした場合に、マイクロコンピュータ１００の動作を停止（すなわち、メインコア１１およびロックステップコア１２によるプログラムの実行を停止）させるエラー信号を出力する。具体的には、エラー制御回路５０は、図２に示すように構成される。
【００３０】
図２は、実施の形態１に従うエラー制御回路５０の構成例を示す図である。図２を参照して、エラー制御回路５０は、エラー出力設定レジスタ５１と、エラー出力回路５２とを含む。
【００３１】
エラー出力設定レジスタ５１は、エラー制御回路５０によるエラー信号の出力機能を有効、または無効に設定するための設定値を格納する。具体的には、エラー信号の出力機能を無効にする場合、設定値“１”がエラー出力設定レジスタ５１に格納（設定）される。エラー信号の出力機能を有効にする場合、設定値“０”がエラー出力設定レジスタ５１に設定される。典型的には、デバッグ制御回路２０（例えば、デバッグ制御回路２１）は、エミュレータ２００の指示に従って、設定値“１”または設定値“０”をエラー出力設定レジスタ５１に設定する。
【００３２】
エラー出力回路５２は、例えば、ＮＯＲゲートにより構成される。エラー出力回路５２は、エラー出力設定レジスタ５１に格納された設定値と、一致判定回路４０から受けた一致判定信号と、メインコア１１から受けたメイン状態信号と、ロックステップコア１２から受けたロックステップ状態信号とに基づいて、エラー信号を出力する。具体的には、エラー出力回路５２は、図３に示す情報テーブル４０２に従って、エラー信号を出力する。
【００３３】
図３は、実施の形態１に従うエラー信号の出力機能を説明するための情報テーブル４０２である。図３を参照して、情報テーブル４０２において、エラー出力設定レジスタ５１に格納された設定値“１”は、エラー信号の出力機能が無効化されていることを示している。エラー出力設定レジスタ５１に格納された設定値“０”は、エラー信号の出力機能が有効化されていることを示している。一致判定信号の値“１”は、一致判定回路４０による判定結果が一致であることを示している。一致判定信号の値“０”は、当該判定結果が不一致であることを示している。
【００３４】
メイン状態信号の値“０”は、メインコア１１がプログラムを実行している状態（以下、「実行状態」とも称する。）であることを示し、メイン状態信号の値“１”は、メインコア１１がプログラムを停止している状態（以下、「ブレーク状態」とも称する。）であることを示している。同様に、ロックステップ状態信号の値“０”は、ロックステップコア１２が実行状態であることを示し、ロックステップ状態信号の値“１”は、ロックステップコア１２がブレーク状態であることを示している。また、エラー信号の値“１”は、エラー信号が出力されることを示し、エラー信号の値“０”は、エラー信号が出力されないことを示している。
【００３５】
まず、エラー出力設定レジスタ５１に格納された設定値が“０”である場合（すなわち、エラー信号の出力機能が有効である場合）のエラー信号の出力方式について説明する。
【００３６】
エラー出力回路５２は、メイン処理結果およびロックステップ処理結果が不一致であって、メインコア１１およびロックステップコア１２が実行状態である場合には、エラー信号の出力を有効にする（すなわち、エラー信号を出力する）。この場合、メインコア１１およびロックステップコア１２は、当該エラー信号によりブレーク状態に遷移する。
【００３７】
また、エラー出力回路５２は、メイン処理結果およびロックステップ処理結果が不一致である場合であっても、メインコア１１およびロックステップコア１２のいずれかがブレーク状態である場合には、エラー信号の出力を無効にする（すなわち、エラー信号を出力しない）。これにより、例えば、メインコア１１が実行状態であり、ロックステップコア１２がブレーク状態であることに起因してメイン処理結果およびロックステップ処理結果が不一致となる場合であっても、エラー信号が出力されない。そのため、メインコア１１は実行状態を継続できる。
【００３８】
なお、エラー出力回路５２は、メイン処理結果およびロックステップ処理結果が不一致である場合であって、メインコア１１およびロックステップコア１２の両方がブレーク状態である場合には、エラー信号を出力しない。
【００３９】
次に、エラー出力設定レジスタ５１に格納された設定値が“１”である場合（すなわち、エラー信号の出力機能が無効である場合）について説明する。この場合、エラー出力回路５２は、エラー信号を出力しない。具体的には、エラー出力回路５２は、メイン処理結果およびロックステップ処理結果の一致判定結果、メインコア１１およびロックステップコア１２の状態に関わらず、常にエラー信号を出力しない。
【００４０】
＜プロセッサコアの構成＞
実施の形態１では、図３に示すエラー信号出力機能と、後述のプロセッサコア１０の機能とを利用して、メインコア１１のプログラム実行状態を継続しつつ、ブレークポイントの設定によりロックステップコア１２をブレークさせて、ロックステップコア１２の内部情報（例えば、汎用レジスタの値等）が取得される。また、メイン処理結果とロックステップ処理結果との一致判定機能を利用することで、ロックステップコア１２の内部情報がメインコア１１の内部情報と同一であることも保証される。以下、実施の形態１に従うプロセッサコア１０の構成等について具体的に説明する。
【００４１】
図４は、実施の形態１に従うプロセッサコア１０の構成例を示す図である。
図４を参照して、プロセッサコア１０は、命令実行部１０２と、ブレークポイント設定レジスタ１０４と、ブレークポイント検出部１０６と、不一致検出設定レジスタ１０８と、要求出力回路１１０とを含む。プロセッサコア１０は、汎用レジスタ、専用レジスタ等の各種レジスタを含む。以下では、代表的に、図４に示すプロセッサコア１０がロックステップコア１２であるとして説明する。
【００４２】
命令実行部１０２は、デバッグ制御回路２２からの制御指示（例えば、プログラムの実行指示）に従って処理を実行する。典型的には、命令実行部１０２は、内部メモリから読み出したプログラムに含まれる命令を命令バッファに格納し、命令バッファに格納された命令の内容を解析し、解析された命令の内容に応じた処理を実行する。命令実行部１０２は、プログラムの実行アドレスおよびアクセスアドレスをブレークポイント検出部１０６に出力する。また、命令実行部１０２は、処理結果を一致判定回路４０に出力し、状態信号をエラー制御回路５０に出力する。
【００４３】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２のブレークポイント設定レジスタ１０４に、ロックステップコア１２（命令実行部１０２）をブレークするためのブレークポイント（アドレス）を設定する。典型的には、ユーザは、ホストマシン３００を用いて、プログラムを解析したい箇所にブレークポイントを設定する。なお、メインコア１１のブレークポイント設定レジスタ１０４には、ブレークポイントは設定されない。このことから、デバッグ制御回路２２は、メインコア１１とは異なるデバッグに関する設定として、ロックステップコア１２に対してブレークポイントを設定する。
【００４４】
ブレークポイント検出部１０６は、命令実行部１０２の実行アドレス（あるいは、アクセスアドレス）と、デバッグ制御回路２２により設定されたブレークポイントとに基づいて、ブレークポイントへの到達の有無を検出する。具体的には、ブレークポイント検出部１０６は、ブレークポイント設定レジスタ１０４に設定されたブレークポイントが、命令実行部１０２の実行アドレス等と一致した場合に、ブレークポイントへの到達を検出し、ブレークポイント検出信号を要求出力回路１１０に出力する。
【００４５】
不一致検出設定レジスタ１０８は、メイン処理結果とロックステップ処理結果とが不一致である場合にブレーク要求信号を命令実行部１０２に与えるか否かを示す設定値を格納する。デバッグ制御回路２２は、エミュレータ２００の指示に従って、当該設定値を不一致検出設定レジスタ１０８に格納する。
【００４６】
要求出力回路１１０は、予め定められた条件を満たした場合に、命令実行部１０２をブレークさせるためのブレーク要求信号を出力する。要求出力回路１１０は、例えば、ＡＮＤゲート１１１，１１２と、ＯＲゲート１１４とにより構成される。要求出力回路１１０は、不一致検出設定レジスタ１０８に格納された設定値と、一致判定回路４０から受けた一致判定信号と、ブレークポイント検出部１０６から受けたブレーク検出信号とに基づいて、ブレーク要求信号を出力する。具体的には、要求出力回路１１０は、図５に示す情報テーブル４０６に従って、ブレーク要求信号を出力する。
【００４７】
図５は、実施の形態１に従うブレーク要求信号の出力機能を説明するための情報テーブル４０６である。図５を参照して、情報テーブル４０６において、不一致検出設定レジスタ１０８に格納された設定値“０”は、メイン処理結果とロックステップ処理結果とが不一致である場合におけるブレーク要求信号の出力機能が無効化されていることを示す。不一致検出設定レジスタ１０８に設定された値“１”は、これらの処理結果が不一致である場合におけるブレーク要求信号の出力機能が有効化されていることを示す。
【００４８】
ブレークポイント検出信号の値“０”は、ブレークポイントが検出されていないことを示している。ブレークポイント検出信号の値“１”は、ブレークポイントが検出されたことを示している。一致判定信号の値“１”は、一致判定回路４０による判定結果が一致であることを示している。一致判定信号の値“０”は、当該判定結果が不一致であることを示している。ブレーク要求信号の値“１”は、ブレーク要求信号が出力されることを示している。ブレーク要求信号の値“０”は、ブレーク要求信号が出力されないことを示している。
【００４９】
実施の形態１では、メインコア１１の実行状態を継続しつつロックステップコア１２をブレークする際に、ロックステップコア１２の内部情報がメインコア１１の内部情報と同一であることを保証する。そのため、メイン処理結果とロックステップ処理結果とが不一致である場合には、ロックステップコア１２はブレークしないように構成される。すなわち、不一致検出設定レジスタ１０８に格納された設定値は“０”に設定される。
【００５０】
不一致検出設定レジスタ１０８に格納された設定値が“０”である場合のブレーク要求信号の出力方式について説明する。
【００５１】
要求出力回路１１０は、ブレークポイントが検出されていない（すなわち、ブレークポイント検出信号の値が“０”）場合であって、メイン処理結果およびロックステップ処理結果が不一致（すなわち、一致判定信号の値が“０”）である場合には、ブレーク要求信号を出力しない。
【００５２】
また、要求出力回路１１０は、ブレークポイントが検出された（すなわち、ブレークポイント検出信号の値が“１”）場合であっても、メイン処理結果およびロックステップ処理結果が不一致である場合には、ブレーク要求信号を出力しない。これは、上述したように、ロックステップコア１２の内部情報が、メインコア１１の内部情報と同一であることを保証するためである。
【００５３】
なお、要求出力回路１１０は、ブレークポイントが検出されていない場合であって、メイン処理結果およびロックステップ処理結果が一致（すなわち、一致判定信号の値が“１”）である場合には、ブレーク要求信号を出力しない。これは、メインコア１１およびロックステップコア１２が、ロックステップ動作を正常に実行しているためである。
【００５４】
一方、要求出力回路１１０は、ブレークポイントが検出された（すなわち、ブレークポイント検出信号の値が“１”）場合であって、かつメイン処理結果およびロックステップ処理結果が一致（すなわち、一致判定信号の値が“１”）である場合には、ブレーク要求信号を命令実行部１０２に出力する。これにより、メインコア１１の内部情報がロックステップコア１２の内部情報と同一であることを保証した状態で、ロックステップコア１２（具体的には、命令実行部１０２）をブレークすることができる。
【００５５】
次に、不一致検出設定レジスタ１０８に設定された値が“１”である場合のブレーク要求信号の出力方式について説明する。
【００５６】
要求出力回路１１０は、ブレークポイントの検出の有無に関わらず（すなわち、ブレークポイント検出信号の値が“０”か“１”に関わらず）、メイン処理結果およびロックステップ処理結果が不一致（すなわち、一致判定信号の値が“０”）である場合には、ブレーク要求信号を出力する。これは、不一致検出設定レジスタ１０８に格納された設定値が“０”の場合の出力動作と異なる。
【００５７】
要求出力回路１１０は、ブレークポイントが検出されていない（すなわち、ブレークポイント検出信号の値が“０”）場合であって、メイン処理結果およびロックステップ処理結果が一致（すなわち、一致判定信号の値が“１”）である場合には、ブレーク要求信号を出力しない。これは、不一致検出設定レジスタ１０８に格納された設定値が“０”の場合の出力動作と同じである。
【００５８】
要求出力回路１１０は、ブレークポイントが検出された（すなわち、ブレークポイント検出信号の値が“１”）場合であって、かつメイン処理結果およびロックステップ処理結果が一致（すなわち、一致判定信号の値が“１”）である場合には、ブレーク要求信号を命令実行部１０２に出力する。これは、不一致検出設定レジスタ１０８に格納された設定値が“０”の場合の出力動作と同じである。
【００５９】
上記によると、不一致検出設定レジスタ１０８に設定値“０”を格納しておくことで、ロックステップコア１２のブレークポイントが検出され、かつメイン処理結果およびロックステップ処理結果が一致である場合にのみ、ブレーク要求信号が出力される。この場合、ロックステップコア１２（命令実行部１０２）は、メインコア１１の内部情報と同一の内部情報を有することが保証された状態でブレークされる。命令実行部１０２は、ブレーク状態であることを示す状態信号をエラー制御回路５０に出力する。
【００６０】
また、メインコア１１にはブレークポイントが設定されていない。そのため、メインコア１１は、ロックステップコア１２がブレーク状態に遷移しても実行状態を維持している。メインコア１１は、実行状態であることを示す状態信号をエラー制御回路５０に出力する。
【００６１】
このとき、一致判定回路４０は、メインコア１１が実行状態であり、ロックステップコア１２がブレーク状態であるため、メイン処理結果とロックステップ処理結果とが一致していないと判定する。一致判定回路４０は、これらの処理結果が不一致であることを示す一致判定信号をエラー制御回路５０に出力する。
【００６２】
エラー制御回路５０は、メイン処理結果とロックステップ処理結果とが不一致である場合であっても、メインコア１１が実行状態であり、ブレークポイントの設定によりロックステップコア１２がブレーク状態となっている場合には、エラー信号の出力を無効にする（図３参照）。したがって、メインコア１１は、エラー信号によりブレークされることなく実行状態を継続できる。
【００６３】
そして、デバッグ制御回路２２は、メインコア１１の内部情報と同一であることが保証されたロックステップコア１２の内部情報を取得し（読み出し）、エミュレータ２００に出力する。ホストマシン３００は、当該内部情報をメインコア１１の内部情報としてディスプレイ等に表示する。
【００６４】
＜処理手順＞
図６は、実施の形態１に従うデバッグシステム１０００が実行する処理手順を説明するための図である。
【００６５】
ここでは、エミュレータ２００は、ホストマシン３００に接続されており、セレクタ３０を介して、デバッグ制御回路２１，２２に指示可能な状態であるとする。また、一致判定回路４０は、予め定められた周期でメイン処理結果とロックステップ処理結果との一致判定を行ない、一致判定信号をエラー制御回路５０に出力する。さらに、ロックステップコア１２の不一致検出設定レジスタ１０８に格納された値は“０”に設定されており、メイン処理結果とロックステップ処理結果とが不一致である場合におけるブレーク要求信号の出力機能は無効化されているとする。
【００６６】
図６を参照して、デバッグ制御回路２１は、エミュレータ２００の指示に従って、起動指示をメインコア１１に与える（ステップＳ１０）。デバッグ制御回路２２は、エミュレータ２００の指示に従って、起動指示をロックステップコア１２に与える（ステップＳ１２）。具体的には、メインコア１１およびロックステップコア１２は、初期アドレスであるリセットベクタにて、プログラムが停止しているブレーク状態となる。これにより、メインコア１１およびロックステップコア１２は、デバッグ可能な状態となる。
【００６７】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２のブレークポイント設定レジスタにブレークポイントを設定する（ステップＳ１４）。
【００６８】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、エラー制御回路５０のエラー信号出力機能を“有効”に設定する（ステップＳ１６）。具体的には、デバッグ制御回路２１は、エラー信号の出力機能を有効にするために、エラー出力設定レジスタ５１に値“０”を設定する。なお、ステップＳ１６の処理は、デバッグ制御回路２２により実行されてもよい。
【００６９】
エミュレータ２００の指示に従って、デバッグ制御回路２１はメインコア１１にプログラムの実行開始を指示し（ステップＳ１８）、デバッグ制御回路２２はロックステップコア１２にプログラムの実行開始を指示する（ステップＳ２０）。メインコア１１およびロックステップコア１２は、当該指示に従って、同時にプログラムの実行を開始する（ステップＳ２２）。このとき、メインコア１１およびロックステップコア１２はプログラムの実行状態に遷移する。例えば、デバッグ制御回路２１がメインコア１１にプログラムの実行開始を指示した時点で、ロックステップコア１２も同時にプログラムの実行を開始するように構成されていてもよい。
【００７０】
ここで、メインコア１１およびロックステップコア１２が実行状態であって、一致判定結果が不一致である場合には、エラー制御回路５０からエラー信号が出力され、メインコア１１およびロックステップコア１２がブレーク状態となる。そのため、メインコア１１およびロックステップコア１２が実行状態を継続している期間においては、両者が同一の処理を実行していることが保証されている。
【００７１】
続いて、ロックステップコア１２によるプログラムの実行がブレークポイントに到達した時点における、メイン処理結果およびロックステップ処理結果が一致している場合、ロックステップコア１２はブレーク状態に遷移する（ステップＳ２４）。具体的には、要求出力回路１１０は、ブレークポイントが検出され、かつメイン処理結果およびロックステップ処理結果が一致している場合、ブレーク要求信号を出力する（図５参照）。そのため、ロックステップコア１２（命令実行部１０２）は、ブレーク状態に遷移する。
【００７２】
なお、ブレークポイントが検出されても、メイン処理結果およびロックステップ処理結果が不一致である場合にはブレーク要求信号は出力されない。しかし、この場合、メインコア１１およびロックステップコア１２が実行状態であって、かつ一致判定結果が不一致であるとの条件が成立するため、エラー制御回路５０からエラー信号が出力され、メインコア１１およびロックステップコア１２がブレーク状態となる。
【００７３】
ステップＳ２４において、ロックステップコア１２がブレーク状態に遷移すると、メインコア１１は実行状態であるため、一致判定結果は不一致となる。しかし、一致判定結果が不一致である場合であっても、メインコア１１が実行状態であって、かつロックステップコア１２がブレーク状態である場合には、エラー制御回路５０はエラー信号の出力を無効化する（ステップＳ２６）。すなわち、エラー信号は出力されず、メインコア１１の実行状態は継続される。
【００７４】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ブレーク状態に遷移したロックステップコア１２から内部情報を取得する（ステップＳ２６）。デバッグ制御回路２２は、読み出した内部情報をエミュレータ２００に出力する（ステップＳ２８）。
【００７５】
＜利点＞
実施の形態１によると、メインコアの実行状態を維持しつつロックステップコアをブレーク状態にすることで、ロックステップコアの内部情報を取得できる。また、ロックステップコアの内部情報は、メインコアの内部情報と同一であることも保証される。すなわち、メインコアの実行状態を維持したまま内部情報を取得するノンブレークデバッグを実現できる。これにより、メインコアの動作を停止する必要がないため、デバッグ作業を効率的に進めることができるとともに、動作停止に起因する電子部品（例えば、モータ）の破損等を防止することもできる。
【００７６】
＜実施の形態２＞
実施の形態２では、ロックステップコア１２を利用したデバッグ機能の他の例について説明する。
【００７７】
プログラミングミスとして、未初期化レジスタへのアクセス違反がしばしば発生する。未初期化レジスタとは、初期化すべきレジスタ（以下、「初期化対象レジスタ」とも称する。）であって、初期化漏れにより未だ初期化されていないレジスタである。コンパイラ等で静的な解析をすることで未初期化レジスタの検出は可能だが、絶対アドレスアクセスでの確認に限定される。
【００７８】
例えば、プログラムコード「ld.w 0x0[r10], r11」のように、ｒ１０番地のアドレスに格納されている値をｒ１１番地に読み出す場合、ｒ１０番地の値は、アクセス前のプログラムの流れにより変動する可能性がある。そのため、アクセス先が未初期化かどうか静的解析では検出することができない。
【００７９】
そこで、実施の形態２では、ロックステップコア１２を利用して、初期化対象レジスタの初期化漏れを適切に検出して、デバッグ作業を効率化する方式について説明する。なお、実施の形態２の＜全体構成＞は、実施の形態１のそれと同様である。
【００８０】
＜プロセッサコアの構成＞
実施の形態２において、ロックステップコア１２Ａにはメインコア１１Ａとは異なるデバッグ設定が行なわれる。具体的には、メインコア１１の初期化対象レジスタおよびロックステップコア１２の初期化対象レジスタにそれぞれ異なる値が設定された状態で、デバッグ対象のプログラムが実行される。ここで、初期化対象レジスタの初期化漏れが発生していた場合（すなわち、未初期化レジスタが存在していた場合）を想定する。
【００８１】
この場合、メインコア１１およびロックステップコア１２が未初期化レジスタにアクセスすると、それぞれ異なる値を読み出すことになる。そのため、メイン処理結果とロックステップ処理結果が不一致となり、エラー信号によりメインコア１１およびロックステップコア１２がブレークされる。このように、メインコア１１およびロックステップコア１２がブレークされることで、未初期化レジスタへのアクセス違反を検出することができる。以下、実施の形態２に従うプロセッサコア１０の構成等について具体的に説明する。
【００８２】
図７は、実施の形態２に従うプロセッサコア１０Ａの構成例を示す図である。プロセッサコア１０Ａ（メインコア１１Ａ，ロックステップコア１２Ａ）は、図１に示すプロセッサコア１０（メインコア１１，ロックステップコア１２）と対応するが、実施の形態１との区別のため、便宜上「Ａ」といった追加の符号を付している。
【００８３】
図７を参照して、プロセッサコア１０Ａは、命令実行部１０２Ａと、モニタコード格納部１２２と、レジスタ群１２４とを含む。レジスタ群１２４は、汎用レジスタ、専用レジスタ等の各種レジスタを含む。
【００８４】
デバッグ制御回路２０は、エミュレータ２００の指示に従って、モニタコード格納部１２２に初期化プログラムを転送する。モニタコード格納部１２２には、転送された初期化プログラムが格納される。
【００８５】
命令実行部１０２Ａは、デバッグ制御回路２０からの制御指示に従って処理を実行する。命令実行部１０２Ａは、モニタコード格納部１２２に格納されている初期化プログラムを実行して、レジスタ群１２４に含まれる各初期化対象レジスタに、初期化プログラムに従う値を格納する。
【００８６】
デバッグ制御回路２１からメインコア１１Ａに転送される初期化プログラムに従う値は、デバッグ制御回路２２からロックステップコア１２Ａに転送される初期化プログラムに従う値と異なる。そのため、メインコア１１Ａにおける初期化対象レジスタに設定される値は、ロックステップコア１２Ａにおける初期化対象レジスタに設定される値と異なる。
【００８７】
メインコア１１Ａおよびロックステップコア１２Ａの各々の命令実行部１０２Ａは、初期化プログラムに従う値が初期化対象レジスタに設定された後、デバッグ対象のプログラムの実行を開始する。各々の命令実行部１０２Ａは、デバッグ対象のプログラムの実行開始時に、当該プログラムにより指定される初期化対象レジスタに当該プログラムに従う初期値を書き込む。各々の命令実行部１０２Ａは、レジスタ群１２４にアクセスしながら処理結果を一致判定回路４０に出力する。
【００８８】
ここで、デバッグ対象のプログラムの実行により、すべての初期対象レジスタへ適切な初期値が書込まれた（すなわち、初期化漏れがない）場合には、未初期化レジスタは存在しない。そのため、メインコア１１Ａの初期化対象レジスタおよびロックステップコア１２Ａの初期化対象レジスタには同一の値が設定された状態となる。
【００８９】
一方、初期化対象レジスタへの初期値の書き込み漏れ（すなわち、初期化漏れ）が発生している場合には、未初期化レジスタが存在することになる。そのため、メインコア１１Ａの未初期化レジスタおよびロックステップコア１２Ａの未初期化レジスタには異なる値が設定された状態となる。この場合、メインコア１１Ａの命令実行部１０２Ａが当該未初期化レジスタにアクセスして実行した処理結果は、ロックステップコア１２Ａの命令実行部１０２Ａが当該未初期化レジスタにアクセスして実行した処理結果と異なる。
【００９０】
そのため、一致判定回路４０は、メイン処理結果とロックステップ処理結果とが不一致であることを示す一致判定信号をエラー制御回路５０に出力する。メインコア１１Ａおよびロックステップコア１２Ａは、プログラム実行状態であるため、当該実行状態であることを示す状態信号をエラー制御回路５０に出力する。
【００９１】
エラー制御回路５０は、メインコア１１Ａおよびロックステップコア１２Ａが実行状態であって、かつメイン処理結果とロックステップ処理結果とが不一致であるため、エラー信号を出力する（図３参照）。したがって、メインコア１１Ａおよびロックステップコア１２Ａは、エラー信号によりブレークされる。このように、メインコア１１Ａおよびロックステップコア１２Ａが未初期化レジスタにアクセスした場合、メインコア１１Ａおよびロックステップコア１２Ａはブレーク状態に遷移する。
【００９２】
デバッグ制御回路２１は、ブレーク状態に遷移したメインコア１１Ａの内部情報を取得し、エミュレータ２００に出力する。デバッグ制御回路２２は、ブレーク状態に遷移したロックステップコア１２Ａの内部情報を取得し、エミュレータ２００に出力する。ホストマシン３００は、これらの内部情報をディスプレイ等に表示する。
【００９３】
＜処理手順＞
図８は、実施の形態２に従うデバッグシステム１０００が実行する処理手順を説明するための図である。
【００９４】
ここでは、エミュレータ２００は、ホストマシン３００に接続されており、セレクタ３０を介して、デバッグ制御回路２１，２２に指示可能な状態であるとする。また、一致判定回路４０は、予め定められた周期でメイン処理結果とロックステップ処理結果との一致判定を行ない、一致判定信号をエラー制御回路５０に出力する。
【００９５】
図８を参照して、デバッグ制御回路２１は、エミュレータ２００の指示に従って、起動指示をメインコア１１Ａに与える（ステップＳ３０）。デバッグ制御回路２２は、エミュレータ２００の指示に従って、起動指示をロックステップコア１２Ａに与える（ステップＳ３２）。
【００９６】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、メインコア１１Ａのすべての初期化対象レジスタを、例えば、値“０ｈ”で初期化する（ステップＳ３４）。具体的には、デバッグ制御回路２１は、値“０ｈ”で初期化するための初期化プログラムをメインコア１１Ａに転送する。メインコア１１Ａにより当該初期化プログラムが実行されることで初期化対象レジスタに値“０ｈ”が設定される。
【００９７】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２Ａのすべての初期化対象レジスタを、例えば、値“Ｆｈ”で初期化する（ステップＳ３６）。具体的には、デバッグ制御回路２２は、値“Ｆｈ”で初期化するための初期化プログラムを転送する。ロックステップコア１２Ａにより当該初期化プログラムが実行されることで初期化対象レジスタに値“Ｆｈ”が設定される。なお、ロックステップコア１２Ａの初期化対象レジスタに設定される値は、メインコア１１Ａの初期化対象レジスタに設定される値と異なっていればよい。
【００９８】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、エラー制御回路５０のエラー信号出力機能を“有効”に設定する（ステップＳ３８）。エミュレータ２００の指示に従って、デバッグ制御回路２１はメインコア１１Ａにプログラムの実行開始を指示し（ステップＳ４０）、デバッグ制御回路２２はロックステップコア１２Ａにプログラムの実行開始を指示する（ステップＳ４２）。
【００９９】
続いて、メインコア１１Ａおよびロックステップコア１２Ａは、当該指示に従って、同時にデバッグ対象のプログラムの実行を開始する（ステップＳ４４）。このとき、メインコア１１Ａおよびロックステップコア１２Ａはプログラムの実行状態に遷移する。また、メインコア１１Ａおよびロックステップコア１２Ａの各々は、デバッグ対象のプログラムに従う初期値を、当該プログラムにより指定された初期化対象レジスタに書き込む。
【０１００】
ここで、本来であれば、各初期化対象レジスタに、対応する初期値が書込まれているはずである。しかし、特定の初期化対象レジスタに対して初期化漏れがある（すなわち、当該特定の初期化対象レジスタが未初期化レジスタである）場合には、メインコア１１Ａおよびロックステップコア１２Ａによる未初期化レジスタへのアクセスが発生する（ステップＳ４６）。このとき、メインコア１１Ａが当該未初期化レジスタにアクセスした際に読み出す値は“０ｈ”であり、ロックステップコア１２Ａが当該当該未初期化レジスタにアクセスした際に読み出す値は“Ｆｈ”であるため、メイン処理結果とロックステップ処理結果とは不一致となる。
【０１０１】
ステップＳ４４において、メインコア１１Ａおよびロックステップコア１２Ａは実行状態に遷移しており、ステップＳ４６におけるアクセス違反によりメイン処理結果とロックステップ処理結果とは不一致となる。そのため、エラー制御回路５０は、メインコア１１Ａおよびロックステップコア１２Ａにエラー信号を出力する（ステップＳ４８，Ｓ５０）。メインコア１１Ａおよびロックステップコア１２Ａは、エラー信号によりブレーク状態に遷移する（ステップＳ５２）。
【０１０２】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、ブレーク状態に遷移したメインコア１１Ａから内部情報を取得する（ステップＳ５４）。デバッグ制御回路２２は、エミュレータ２００の指示に従って、ブレーク状態に遷移したロックステップコア１２Ａから内部情報を取得する（ステップＳ５６）。デバッグ制御回路２１および２２は、読み出した内部情報をエミュレータ２００に出力する（ステップＳ５８）。
【０１０３】
＜利点＞
実施の形態２によると、プログラミングミスとして頻発する未初期化レジスタへのアクセス違反を動的に検出できる。これにより、コンパイラおよびコード解析による静的検出、あるいは大規模検出回路を搭載する必要がなく、デバッグ作業をより効率的に行なうことができる。
【０１０４】
［実施の形態３］
実施の形態３では、ロックステップコア１２を利用したデバッグ機能のさらに他の例について説明する。
【０１０５】
デバッグにおいてブレーク時点より過去の状態の内部情報を取得するためには、ブレークポイントを設定し直した後に、プログラムを再実行する必要があった。しかし、プログラムがブレークポイントに到達するまで多大な時間を要する場合も多く、また、特定条件下でのみブレークポイントに到達する場合には、再実行して特定条件を再現させるのも労力が必要であった。
【０１０６】
そこで、実施の形態３では、メインコア１１がブレークした際に、ブレーク時点の内部情報とブレーク時点よりも過去のある時点の内部情報とを同時に取得することで、デバッグ作業を効率化する方式について説明する。なお、実施の形態３の＜全体構成＞は、実施の形態１のそれと同様である。
【０１０７】
＜プロセッサコアの構成＞
実施の形態３において、ロックステップコア１２Ｂにはメインコア１１Ｂとは異なるデバッグ設定が行なわれる。具体的には、ロックステップコア１２の命令バッファのみに任意サイクル分の命令が注入（追加）され、ロックステップコア１２のプログラムの実行をメインコア１１のプログラムの実行よりも任意サイクル分遅らせる。
【０１０８】
そして、メインコア１１がブレーク状態に遷移した場合に、同時にロックステップコア１２をブレーク状態に遷移させる。ブレーク状態に遷移したメインコア１１とロックステップコア１２の各内部情報を取得することで、ブレーク時点での内部情報と、ブレーク時点よりも任意サイクル分前の時点での内部情報とを取得する。以下、実施の形態３に従うプロセッサコア１０の構成等について具体的に説明する。
【０１０９】
図９は、実施の形態３に従うプロセッサコア１０Ｂの構成例を示す図である。プロセッサコア１０Ａ（メインコア１１Ｂ，ロックステップコア１２Ｂ）は、図１に示すプロセッサコア１０（メインコア１１，ロックステップコア１２）と対応するが、実施の形態１および２との区別のため、便宜上「Ｂ」といった追加の符号を付している。
【０１１０】
図９を参照して、プロセッサコア１０Ｂは、命令実行部１０２Ｂと、命令バッファ１３２とを含む。図９では、実施の形態３に関するプロセッサコア１０Ｂの構成のみを示しているが、実施の形態１および実施の形態２のプロセッサコアの構成を含んでいてもよい。
【０１１１】
命令バッファ１３２は、内部メモリから読み出された命令を格納する。デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２Ｂの命令バッファ１３２にユーザにより指定された所定サイクル分の命令を注入する。ロックステップコア１２Ｂの命令実行部１０２Ｂは、命令バッファ１３２に注入された所定サイクル分の命令を実行した後に、デバッグ対象のプログラムにおける各命令を実行する。
【０１１２】
一方、メインコア１１Ｂの命令バッファ１３２には、所定サイクル分の命令が注入されない。そのため、ロックステップコア１２Ｂの命令実行部１０２Ｂは、メインコア１１Ｂの命令実行部１０２Ｂよりも所定サイクル分遅れて、デバッグ対象のプログラムを実行する。
【０１１３】
ここで、プログラムの実行中において、メイン処理結果およびロックステップ処理結果は不一致となるため、エラー出力機能が有効化されている場合にはエラー信号が出力されて、メインコア１１Ｂおよびロックステップコア１２Ｂがブレーク状態に遷移してしまう。そのため、デバッグ制御回路２１（あるいは、デバッグ制御回路２２）は、エミュレータ２００の指示に従って、エラー制御回路５０のエラー出力機能を無効化する。具体的には、エラー出力設定レジスタ５１に値“１”が設定される（図３参照）。
【０１１４】
そして、何らかの要因によりメインコア１１Ｂがブレーク状態に遷移した場合、同時にロックステップコア１２Ｂもブレーク状態に遷移する。例えば、メインコア１１Ｂがブレーク状態に遷移すると、メインコア１１Ｂは当該ブレーク状態に遷移したことを示す状態信号をロックステップコア１２Ｂに出力する。ロックステップコア１２Ｂは、当該状態信号を受けるとブレーク状態に遷移する。なお、上記構成に限られず、２つのプロセッサコア１０のうちの一方がブレーク状態に遷移した場合に、他方もブレーク状態に遷移させるように構成されていればよい。
【０１１５】
デバッグ制御回路２１は、ブレーク状態に遷移したメインコア１１Ｂの内部情報（すなわち、ブレーク時点の内部情報）を取得し、エミュレータ２００に出力する。デバッグ制御回路２２は、ブレーク状態に遷移したロックステップコア１２Ｂの内部情報（すなわち、ブレーク時点よりも所定サイクル分前の内部情報）を取得し、エミュレータ２００に出力する。ホストマシン３００は、これらの内部情報をディスプレイ等に表示する。
【０１１６】
＜処理手順＞
図１０は、実施の形態３に従うデバッグシステム１０００が実行する処理手順を説明するための図である。ここでは、エミュレータ２００は、ホストマシン３００に接続されており、セレクタ３０を介して、デバッグ制御回路２１，２２に指示可能な状態であるとする。
【０１１７】
図１０を参照して、デバッグ制御回路２１は、エミュレータ２００の指示に従って、起動指示をメインコア１１Ｂに与える（ステップＳ７０）。デバッグ制御回路２２は、エミュレータ２００の指示に従って、起動指示をロックステップコア１２Ｂに与える（ステップＳ７２）。
【０１１８】
デバッグ制御回路２２は、エミュレータ２００の指示に従って、ロックステップコア１２Ｂの命令バッファ１３２に所定サイクル分の命令を注入する（ステップＳ７４）。デバッグ制御回路２１は、エミュレータ２００の指示に従って、エラー制御回路５０のエラー信号出力機能を“無効”に設定する（ステップＳ７６）。
【０１１９】
エミュレータ２００の指示に従って、デバッグ制御回路２１はメインコア１１Ｂにプログラムの実行開始を指示し（ステップＳ７８）、デバッグ制御回路２２はロックステップコア１２Ｂにプログラムの実行開始を指示する（ステップＳ８０）。
【０１２０】
メインコア１１Ｂはデバッグ対象のプログラムの実行を開始し、ロックステップコア１２Ｂは、注入された所定サイクル分の命令を実行した後、デバッグ対象のプログラムの実行を開始する。すなわち、ロックステップコア１２Ｂは、メインコア１１Ｂよりも所定サイクル分遅れて、デバッグ対象のプログラムを実行する。なお、メイン処理結果およびロックステップ処理結果は不一致であるが、エラー制御回路５０の出力機能は無効化されているため、メインコア１１Ｂおよびロックステップコア１２Ｂの実行状態が継続される。
【０１２１】
続いて、メインコア１１Ｂがブレーク状態に遷移すると（ステップＳ８４）、ロックステップコア１２Ｂもブレーク状態に遷移する（ステップＳ８６）。例えば、ユーザは、ホストマシン３００を用いて、メインコア１１Ｂを強制的にブレーク状態に遷移させる。
【０１２２】
デバッグ制御回路２１は、エミュレータ２００の指示に従って、ブレーク状態に遷移したメインコア１１Ｂから内部情報を取得する（ステップＳ８８）。デバッグ制御回路２２は、エミュレータ２００の指示に従って、ブレーク状態に遷移したロックステップコア１２Ｂから内部情報を取得する（ステップＳ９０）。
【０１２３】
デバッグ制御回路２１および２２は、取得した内部情報をエミュレータ２００に出力する（ステップＳ９２）。デバッグ制御回路２１により取得された内部情報はブレーク時点の内部情報として利用され、デバッグ制御回路２２により取得された内部情報は、ブレーク時点よりも所定サイクル分前の内部情報として利用される。
【０１２４】
＜利点＞
実施の形態３によると、ブレーク時点の内部情報と、ブレーク時点よりも所定サイクル分前の時点での内部情報を同時に取得できる。また、ブレーク時点よりも所定サイクル分前の時点から、ステップ実行等を用いたデバッグを行ない、ブレーク時点までの動作を確認できる。これにより、ブレークした原因の究明が容易となりデバッグ作業をより効率化することができる。
【０１２５】
［その他］
上述した実施の形態において、その他の実施の形態で説明した処理や構成を適宜採用して実施する場合であってもよい。
【０１２６】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【符号の説明】
【０１２７】
１０，１０Ａ，１０Ｂ  プロセッサコア、１１，１１Ａ，１１Ｂ  メインコア、１２，１２Ａ，１２Ｂ  ロックステップコア、２０，２１，２２  デバッグ制御回路、３０  セレクタ、４０  一致判定回路、５０  エラー制御回路、５１  エラー出力設定レジスタ、５２  エラー出力回路、１００  マイクロコンピュータ、１０２，１０２Ａ，１０２Ｂ  命令実行部、１０４  ブレークポイント設定レジスタ、１０６  ブレークポイント検出部、１０８  不一致検出設定レジスタ、１１０  要求出力回路、１１１，１１２  ＡＮＤゲート、１１４  ＯＲゲート、１２２  モニタコード格納部、１２４  レジスタ群、１３２  命令バッファ、２００  エミュレータ、３００  ホストマシン、４０２，４０６  情報テーブル、１０００  デバッグシステム。
【図１】
2019204388.tif 000003
【図２】
2019204388.tif 000004
【図３】
2019204388.tif 000005
【図４】
2019204388.tif 000006
【図５】
2019204388.tif 000007
【図６】
2019204388.tif 000008
【図７】
2019204388.tif 000009
【図８】
2019204388.tif 000010
【図９】
2019204388.tif 000011
【図１０】
2019204388.tif 000012