(58)【調査した分野】(Int.Cl.,DB名)
前記エラー制御回路は、前記第1および第2プロセッサコアが前記プログラムを実行している状態であって、かつ前記第1処理結果と前記第2処理結果とが不一致である場合には、前記エラー信号の出力を有効にする、請求項1に記載の半導体装置。
前記第1および第2プロセッサコアが前記プログラムを実行している状態であって、かつ前記第1処理結果と前記第2処理結果とが不一致である場合に前記エラー制御回路から出力される前記エラー信号に基づいて、前記第1プロセッサコアおよび前記第2プロセッサコアの各々は、前記プログラムの実行を停止する、請求項7に記載の半導体装置。
前記第1デバッグ回路は、停止した前記第1プロセッサコアの内部情報を取得し、前記第2デバッグ回路は、停止した前記第2プロセッサコアの内部情報を取得する、請求項8に記載の半導体装置。
前記第1デバッグ回路は、停止した前記第1プロセッサコアの内部情報を取得し、前記第2デバッグ回路は、停止した前記第2プロセッサコアの内部情報を取得する、請求項10に記載の半導体装置。
【発明を実施するための形態】
【0012】
以下、各実施形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰返さない。
【0013】
[実施の形態1]
<全体構成>
図1は、実施の形態1に従うデバッグシステム1000の構成例を示す模式図である。
図1を参照して、デバッグシステム1000は、マイクロコンピュータ100と、エミュレータ200と、ホストマシン300とを含む。
【0014】
ホストマシン300は、PC(Personal Computer)などのコンピュータ装置であり、マイクロコンピュータ100のデバッグを支援するためのプログラム(例えば、デバッガ)を実行する。デバッガは、ユーザが対話的にマイクロコンピュータ100内のプログラムの実行を制御したり、レジスタの値、メモリの内容等を画面に表示したり変更したりする機能を提供する。ホストマシン300は、USB(Universal Serial Bus)インターフェース(I/F)などの通信インターフェイスを通じてエミュレータ200と通信を行ない、エミュレータ200と連携して動作する。
【0015】
エミュレータ200は、マイクロコンピュータ100上のCPU(Central Processing Unit)で実行されるプログラムのデバッグ作業において用いられる装置である。エミュレータ200は、例えば、JTAG(Joint Test Action Group)の規格に従った通信インターフェイスを通じて、セレクタ30を介してデバッグ制御回路20と通信を行ない、デバッグ機能を制御する。デバッグ機能とは、例えば、プロセッサコア10の実行制御、プロセッサコア10内部のレジスタ値の取得ならびに変更、およびマイクロコンピュータ100上の内部メモリの内容の取得ならびに変更等である。
【0016】
マイクロコンピュータ100は、メインのプロセッサコア(以下、「メインコア」とも称する。)11と、サブのプロセッサコア(以下、「ロックステップコア」とも称する。)12と、デバッグ制御回路20と、セレクタ30と、一致判定回路40と、エラー制御回路50とを含む。以下では、メインコア11およびロックステップコア12の各々に共通の構成や機能を説明する際には、それらをプロセッサコア10と総称する。
【0017】
なお、マイクロコンピュータ100は、RAM(Random Access Memory)およびフラッシュメモリ等の内部メモリ(図示しない)をさらに含む。内部メモリは、例えば、メインコア11およびロックステップコア12によって実行されるデバッグ対象のプログラムを格納している。
【0018】
マイクロコンピュータ100は、メインコア11とロックステップコア12とからなるロックステップデュアルコア構成を採用している。ロックステップデュアルコア構成とは、2つのプロセッサコアに同じ処理を実行させてそれぞれの処理結果の差を比較することで不具合の有無を検出する構成である。
【0019】
典型的には、メインコア11は、命令メモリに格納された複数の命令(すなわち、プログラム)を読み出して(すなわち、フェッチして)、当該読み出された複数の命令を順次処理する。例えば、メインコア11は、命令に従った処理を実行することにより生成されたデータを内部メモリに書き込んだり、命令に従った処理を実行することで必要になったデータを内部メモリから読み出したりする。また、メインコア11は、命令に従った処理の処理結果をペリフェラルバスを介して周辺回路に出力する。
【0020】
ロックステップコア12は、メインコア11と冗長な構成を有している。すなわち、ロックステップコア12は、メインコア11と同等の性能及び機能を有している。ロックステップコア12は、ロックステップ動作を行なうことにより、メインコア11とほぼ同時に同じ処理を実行する。
【0021】
ただし、ロックステップコア12は、メインコア11と全く同一の構成を有している必要はなく、メインコア11と同等の性能及び機能を実現可能であればクロックタイミングあるいは遅延量等を変更してもよい。以下では、説明の容易化のため、メインコア11およびロックステップコア12が同一の構成を有しているものとする。
【0022】
メインコア11およびロックステップコア12の各々は、処理結果を一致判定回路40に出力する。また、メインコア11およびロックステップコア12の各々は、プログラムを実行している状態であるのか、当該プログラムの実行を停止している状態であるのかを示す状態信号をエラー制御回路50に出力する。以下の説明では、メインコア11の状態信号を「メイン状態信号」とも称し、ロックステップコア12の状態信号を「ロックステップ状態信号」とも称する。
【0023】
デバッグ制御回路20は、セレクタ30を介したエミュレータ200からの指示に従って動作する。具体的には、デバッグ制御回路20は、メインコア11のためのデバッグ制御回路21と、ロックステップコア12にアクセスするためのデバッグ制御回路22とを含む。
【0024】
デバッグ制御回路21は、エミュレータ200の指示に従って、メインコア11に対してデバッグに関する設定を行なう。具体的には、デバッグ制御回路21は、メインコア11の実行制御、メインコア11内部のレジスタ値の取得ならびに変更、内部メモリの内容の取得ならびに変更等のデバッグ機能を実現する。
【0025】
デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12に対してデバッグに関する設定を行なう。具体的には、デバッグ制御回路22は、ロックステップコア12の実行制御、ロックステップコア12内部のレジスタ値の取得ならびに変更、内部メモリ内容の取得ならびに変更、指定されたアドレスでプログラムの実行を停止させるブレークポイント等のデバッグ機能を実現する。
【0026】
セレクタ30は、デバッグ制御回路21およびデバッグ制御回路22の少なくとも一方を選択して、選択されたデバッグ制御回路にエミュレータ200からの指示を与える回路である。例えば、セレクタ30は、エミュレータ200から、デバッグ制御回路の選択指示およびデバッグに関する設定指示を受け付ける。セレクタ30は、当該選択指示に従うデバッグ制御回路に対して当該設定指示を出力する。
【0027】
エミュレータ200は、セレクタ30を介して、デバッグ制御回路21およびデバッグ制御回路22にそれぞれ異なる設定指示を与えることができる。すなわち、エミュレータ200は、ロックステップコア12に対しメインコア11とは異なるデバッグ設定を行なうことができる。
【0028】
一致判定回路40は、メインコア11の処理結果(以下、「メイン処理結果」とも称する。)と、ロックステップコア12の処理結果(以下、「ロックステップ処理結果」とも称する。)とが一致しているか否かを判定する。一致判定回路40は、判定結果を一致判定信号としてエラー制御回路50に出力する。
【0029】
エラー制御回路50は、予め定められた条件を満たした場合に、マイクロコンピュータ100の動作を停止(すなわち、メインコア11およびロックステップコア12によるプログラムの実行を停止)させるエラー信号を出力する。具体的には、エラー制御回路50は、
図2に示すように構成される。
【0030】
図2は、実施の形態1に従うエラー制御回路50の構成例を示す図である。
図2を参照して、エラー制御回路50は、エラー出力設定レジスタ51と、エラー出力回路52とを含む。
【0031】
エラー出力設定レジスタ51は、エラー制御回路50によるエラー信号の出力機能を有効、または無効に設定するための設定値を格納する。具体的には、エラー信号の出力機能を無効にする場合、設定値“1”がエラー出力設定レジスタ51に格納(設定)される。エラー信号の出力機能を有効にする場合、設定値“0”がエラー出力設定レジスタ51に設定される。典型的には、デバッグ制御回路20(例えば、デバッグ制御回路21)は、エミュレータ200の指示に従って、設定値“1”または設定値“0”をエラー出力設定レジスタ51に設定する。
【0032】
エラー出力回路52は、例えば、NORゲートにより構成される。エラー出力回路52は、エラー出力設定レジスタ51に格納された設定値と、一致判定回路40から受けた一致判定信号と、メインコア11から受けたメイン状態信号と、ロックステップコア12から受けたロックステップ状態信号とに基づいて、エラー信号を出力する。具体的には、エラー出力回路52は、
図3に示す情報テーブル402に従って、エラー信号を出力する。
【0033】
図3は、実施の形態1に従うエラー信号の出力機能を説明するための情報テーブル402である。
図3を参照して、情報テーブル402において、エラー出力設定レジスタ51に格納された設定値“1”は、エラー信号の出力機能が無効化されていることを示している。エラー出力設定レジスタ51に格納された設定値“0”は、エラー信号の出力機能が有効化されていることを示している。一致判定信号の値“1”は、一致判定回路40による判定結果が一致であることを示している。一致判定信号の値“0”は、当該判定結果が不一致であることを示している。
【0034】
メイン状態信号の値“0”は、メインコア11がプログラムを実行している状態(以下、「実行状態」とも称する。)であることを示し、メイン状態信号の値“1”は、メインコア11がプログラムを停止している状態(以下、「ブレーク状態」とも称する。)であることを示している。同様に、ロックステップ状態信号の値“0”は、ロックステップコア12が実行状態であることを示し、ロックステップ状態信号の値“1”は、ロックステップコア12がブレーク状態であることを示している。また、エラー信号の値“1”は、エラー信号が出力されることを示し、エラー信号の値“0”は、エラー信号が出力されないことを示している。
【0035】
まず、エラー出力設定レジスタ51に格納された設定値が“0”である場合(すなわち、エラー信号の出力機能が有効である場合)のエラー信号の出力方式について説明する。
【0036】
エラー出力回路52は、メイン処理結果およびロックステップ処理結果が不一致であって、メインコア11およびロックステップコア12が実行状態である場合には、エラー信号の出力を有効にする(すなわち、エラー信号を出力する)。この場合、メインコア11およびロックステップコア12は、当該エラー信号によりブレーク状態に遷移する。
【0037】
また、エラー出力回路52は、メイン処理結果およびロックステップ処理結果が不一致である場合であっても、メインコア11およびロックステップコア12のいずれかがブレーク状態である場合には、エラー信号の出力を無効にする(すなわち、エラー信号を出力しない)。これにより、例えば、メインコア11が実行状態であり、ロックステップコア12がブレーク状態であることに起因してメイン処理結果およびロックステップ処理結果が不一致となる場合であっても、エラー信号が出力されない。そのため、メインコア11は実行状態を継続できる。
【0038】
なお、エラー出力回路52は、メイン処理結果およびロックステップ処理結果が不一致である場合であって、メインコア11およびロックステップコア12の両方がブレーク状態である場合には、エラー信号を出力しない。
【0039】
次に、エラー出力設定レジスタ51に格納された設定値が“1”である場合(すなわち、エラー信号の出力機能が無効である場合)について説明する。この場合、エラー出力回路52は、エラー信号を出力しない。具体的には、エラー出力回路52は、メイン処理結果およびロックステップ処理結果の一致判定結果、メインコア11およびロックステップコア12の状態に関わらず、常にエラー信号を出力しない。
【0040】
<プロセッサコアの構成>
実施の形態1では、
図3に示すエラー信号出力機能と、後述のプロセッサコア10の機能とを利用して、メインコア11のプログラム実行状態を継続しつつ、ブレークポイントの設定によりロックステップコア12をブレークさせて、ロックステップコア12の内部情報(例えば、汎用レジスタの値等)が取得される。また、メイン処理結果とロックステップ処理結果との一致判定機能を利用することで、ロックステップコア12の内部情報がメインコア11の内部情報と同一であることも保証される。以下、実施の形態1に従うプロセッサコア10の構成等について具体的に説明する。
【0041】
図4は、実施の形態1に従うプロセッサコア10の構成例を示す図である。
図4を参照して、プロセッサコア10は、命令実行部102と、ブレークポイント設定レジスタ104と、ブレークポイント検出部106と、不一致検出設定レジスタ108と、要求出力回路110とを含む。プロセッサコア10は、汎用レジスタ、専用レジスタ等の各種レジスタを含む。以下では、代表的に、
図4に示すプロセッサコア10がロックステップコア12であるとして説明する。
【0042】
命令実行部102は、デバッグ制御回路22からの制御指示(例えば、プログラムの実行指示)に従って処理を実行する。典型的には、命令実行部102は、内部メモリから読み出したプログラムに含まれる命令を命令バッファに格納し、命令バッファに格納された命令の内容を解析し、解析された命令の内容に応じた処理を実行する。命令実行部102は、プログラムの実行アドレスおよびアクセスアドレスをブレークポイント検出部106に出力する。また、命令実行部102は、処理結果を一致判定回路40に出力し、状態信号をエラー制御回路50に出力する。
【0043】
デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12のブレークポイント設定レジスタ104に、ロックステップコア12(命令実行部102)をブレークするためのブレークポイント(アドレス)を設定する。典型的には、ユーザは、ホストマシン300を用いて、プログラムを解析したい箇所にブレークポイントを設定する。なお、メインコア11のブレークポイント設定レジスタ104には、ブレークポイントは設定されない。このことから、デバッグ制御回路22は、メインコア11とは異なるデバッグに関する設定として、ロックステップコア12に対してブレークポイントを設定する。
【0044】
ブレークポイント検出部106は、命令実行部102の実行アドレス(あるいは、アクセスアドレス)と、デバッグ制御回路22により設定されたブレークポイントとに基づいて、ブレークポイントへの到達の有無を検出する。具体的には、ブレークポイント検出部106は、ブレークポイント設定レジスタ104に設定されたブレークポイントが、命令実行部102の実行アドレス等と一致した場合に、ブレークポイントへの到達を検出し、ブレークポイント検出信号を要求出力回路110に出力する。
【0045】
不一致検出設定レジスタ108は、メイン処理結果とロックステップ処理結果とが不一致である場合にブレーク要求信号を命令実行部102に与えるか否かを示す設定値を格納する。デバッグ制御回路22は、エミュレータ200の指示に従って、当該設定値を不一致検出設定レジスタ108に格納する。
【0046】
要求出力回路110は、予め定められた条件を満たした場合に、命令実行部102をブレークさせるためのブレーク要求信号を出力する。要求出力回路110は、例えば、ANDゲート111,112と、ORゲート114とにより構成される。要求出力回路110は、不一致検出設定レジスタ108に格納された設定値と、一致判定回路40から受けた一致判定信号と、ブレークポイント検出部106から受けたブレーク検出信号とに基づいて、ブレーク要求信号を出力する。具体的には、要求出力回路110は、
図5に示す情報テーブル406に従って、ブレーク要求信号を出力する。
【0047】
図5は、実施の形態1に従うブレーク要求信号の出力機能を説明するための情報テーブル406である。
図5を参照して、情報テーブル406において、不一致検出設定レジスタ108に格納された設定値“0”は、メイン処理結果とロックステップ処理結果とが不一致である場合におけるブレーク要求信号の出力機能が無効化されていることを示す。不一致検出設定レジスタ108に設定された値“1”は、これらの処理結果が不一致である場合におけるブレーク要求信号の出力機能が有効化されていることを示す。
【0048】
ブレークポイント検出信号の値“0”は、ブレークポイントが検出されていないことを示している。ブレークポイント検出信号の値“1”は、ブレークポイントが検出されたことを示している。一致判定信号の値“1”は、一致判定回路40による判定結果が一致であることを示している。一致判定信号の値“0”は、当該判定結果が不一致であることを示している。ブレーク要求信号の値“1”は、ブレーク要求信号が出力されることを示している。ブレーク要求信号の値“0”は、ブレーク要求信号が出力されないことを示している。
【0049】
実施の形態1では、メインコア11の実行状態を継続しつつロックステップコア12をブレークする際に、ロックステップコア12の内部情報がメインコア11の内部情報と同一であることを保証する。そのため、メイン処理結果とロックステップ処理結果とが不一致である場合には、ロックステップコア12はブレークしないように構成される。すなわち、不一致検出設定レジスタ108に格納された設定値は“0”に設定される。
【0050】
不一致検出設定レジスタ108に格納された設定値が“0”である場合のブレーク要求信号の出力方式について説明する。
【0051】
要求出力回路110は、ブレークポイントが検出されていない(すなわち、ブレークポイント検出信号の値が“0”)場合であって、メイン処理結果およびロックステップ処理結果が不一致(すなわち、一致判定信号の値が“0”)である場合には、ブレーク要求信号を出力しない。
【0052】
また、要求出力回路110は、ブレークポイントが検出された(すなわち、ブレークポイント検出信号の値が“1”)場合であっても、メイン処理結果およびロックステップ処理結果が不一致である場合には、ブレーク要求信号を出力しない。これは、上述したように、ロックステップコア12の内部情報が、メインコア11の内部情報と同一であることを保証するためである。
【0053】
なお、要求出力回路110は、ブレークポイントが検出されていない場合であって、メイン処理結果およびロックステップ処理結果が一致(すなわち、一致判定信号の値が“1”)である場合には、ブレーク要求信号を出力しない。これは、メインコア11およびロックステップコア12が、ロックステップ動作を正常に実行しているためである。
【0054】
一方、要求出力回路110は、ブレークポイントが検出された(すなわち、ブレークポイント検出信号の値が“1”)場合であって、かつメイン処理結果およびロックステップ処理結果が一致(すなわち、一致判定信号の値が“1”)である場合には、ブレーク要求信号を命令実行部102に出力する。これにより、メインコア11の内部情報がロックステップコア12の内部情報と同一であることを保証した状態で、ロックステップコア12(具体的には、命令実行部102)をブレークすることができる。
【0055】
次に、不一致検出設定レジスタ108に設定された値が“1”である場合のブレーク要求信号の出力方式について説明する。
【0056】
要求出力回路110は、ブレークポイントの検出の有無に関わらず(すなわち、ブレークポイント検出信号の値が“0”か“1”に関わらず)、メイン処理結果およびロックステップ処理結果が不一致(すなわち、一致判定信号の値が“0”)である場合には、ブレーク要求信号を出力する。これは、不一致検出設定レジスタ108に格納された設定値が“0”の場合の出力動作と異なる。
【0057】
要求出力回路110は、ブレークポイントが検出されていない(すなわち、ブレークポイント検出信号の値が“0”)場合であって、メイン処理結果およびロックステップ処理結果が一致(すなわち、一致判定信号の値が“1”)である場合には、ブレーク要求信号を出力しない。これは、不一致検出設定レジスタ108に格納された設定値が“0”の場合の出力動作と同じである。
【0058】
要求出力回路110は、ブレークポイントが検出された(すなわち、ブレークポイント検出信号の値が“1”)場合であって、かつメイン処理結果およびロックステップ処理結果が一致(すなわち、一致判定信号の値が“1”)である場合には、ブレーク要求信号を命令実行部102に出力する。これは、不一致検出設定レジスタ108に格納された設定値が“0”の場合の出力動作と同じである。
【0059】
上記によると、不一致検出設定レジスタ108に設定値“0”を格納しておくことで、ロックステップコア12のブレークポイントが検出され、かつメイン処理結果およびロックステップ処理結果が一致である場合にのみ、ブレーク要求信号が出力される。この場合、ロックステップコア12(命令実行部102)は、メインコア11の内部情報と同一の内部情報を有することが保証された状態でブレークされる。命令実行部102は、ブレーク状態であることを示す状態信号をエラー制御回路50に出力する。
【0060】
また、メインコア11にはブレークポイントが設定されていない。そのため、メインコア11は、ロックステップコア12がブレーク状態に遷移しても実行状態を維持している。メインコア11は、実行状態であることを示す状態信号をエラー制御回路50に出力する。
【0061】
このとき、一致判定回路40は、メインコア11が実行状態であり、ロックステップコア12がブレーク状態であるため、メイン処理結果とロックステップ処理結果とが一致していないと判定する。一致判定回路40は、これらの処理結果が不一致であることを示す一致判定信号をエラー制御回路50に出力する。
【0062】
エラー制御回路50は、メイン処理結果とロックステップ処理結果とが不一致である場合であっても、メインコア11が実行状態であり、ブレークポイントの設定によりロックステップコア12がブレーク状態となっている場合には、エラー信号の出力を無効にする(
図3参照)。したがって、メインコア11は、エラー信号によりブレークされることなく実行状態を継続できる。
【0063】
そして、デバッグ制御回路22は、メインコア11の内部情報と同一であることが保証されたロックステップコア12の内部情報を取得し(読み出し)、エミュレータ200に出力する。ホストマシン300は、当該内部情報をメインコア11の内部情報としてディスプレイ等に表示する。
【0064】
<処理手順>
図6は、実施の形態1に従うデバッグシステム1000が実行する処理手順を説明するための図である。
【0065】
ここでは、エミュレータ200は、ホストマシン300に接続されており、セレクタ30を介して、デバッグ制御回路21,22に指示可能な状態であるとする。また、一致判定回路40は、予め定められた周期でメイン処理結果とロックステップ処理結果との一致判定を行ない、一致判定信号をエラー制御回路50に出力する。さらに、ロックステップコア12の不一致検出設定レジスタ108に格納された値は“0”に設定されており、メイン処理結果とロックステップ処理結果とが不一致である場合におけるブレーク要求信号の出力機能は無効化されているとする。
【0066】
図6を参照して、デバッグ制御回路21は、エミュレータ200の指示に従って、起動指示をメインコア11に与える(ステップS10)。デバッグ制御回路22は、エミュレータ200の指示に従って、起動指示をロックステップコア12に与える(ステップS12)。具体的には、メインコア11およびロックステップコア12は、初期アドレスであるリセットベクタにて、プログラムが停止しているブレーク状態となる。これにより、メインコア11およびロックステップコア12は、デバッグ可能な状態となる。
【0067】
デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12のブレークポイント設定レジスタにブレークポイントを設定する(ステップS14)。
【0068】
デバッグ制御回路21は、エミュレータ200の指示に従って、エラー制御回路50のエラー信号出力機能を“有効”に設定する(ステップS16)。具体的には、デバッグ制御回路21は、エラー信号の出力機能を有効にするために、エラー出力設定レジスタ51に値“0”を設定する。なお、ステップS16の処理は、デバッグ制御回路22により実行されてもよい。
【0069】
エミュレータ200の指示に従って、デバッグ制御回路21はメインコア11にプログラムの実行開始を指示し(ステップS18)、デバッグ制御回路22はロックステップコア12にプログラムの実行開始を指示する(ステップS20)。メインコア11およびロックステップコア12は、当該指示に従って、同時にプログラムの実行を開始する(ステップS22)。このとき、メインコア11およびロックステップコア12はプログラムの実行状態に遷移する。例えば、デバッグ制御回路21がメインコア11にプログラムの実行開始を指示した時点で、ロックステップコア12も同時にプログラムの実行を開始するように構成されていてもよい。
【0070】
ここで、メインコア11およびロックステップコア12が実行状態であって、一致判定結果が不一致である場合には、エラー制御回路50からエラー信号が出力され、メインコア11およびロックステップコア12がブレーク状態となる。そのため、メインコア11およびロックステップコア12が実行状態を継続している期間においては、両者が同一の処理を実行していることが保証されている。
【0071】
続いて、ロックステップコア12によるプログラムの実行がブレークポイントに到達した時点における、メイン処理結果およびロックステップ処理結果が一致している場合、ロックステップコア12はブレーク状態に遷移する(ステップS24)。具体的には、要求出力回路110は、ブレークポイントが検出され、かつメイン処理結果およびロックステップ処理結果が一致している場合、ブレーク要求信号を出力する(
図5参照)。そのため、ロックステップコア12(命令実行部102)は、ブレーク状態に遷移する。
【0072】
なお、ブレークポイントが検出されても、メイン処理結果およびロックステップ処理結果が不一致である場合にはブレーク要求信号は出力されない。しかし、この場合、メインコア11およびロックステップコア12が実行状態であって、かつ一致判定結果が不一致であるとの条件が成立するため、エラー制御回路50からエラー信号が出力され、メインコア11およびロックステップコア12がブレーク状態となる。
【0073】
ステップS24において、ロックステップコア12がブレーク状態に遷移すると、メインコア11は実行状態であるため、一致判定結果は不一致となる。しかし、一致判定結果が不一致である場合であっても、メインコア11が実行状態であって、かつロックステップコア12がブレーク状態である場合には、エラー制御回路50はエラー信号の出力を無効化する(ステップS26)。すなわち、エラー信号は出力されず、メインコア11の実行状態は継続される。
【0074】
デバッグ制御回路22は、エミュレータ200の指示に従って、ブレーク状態に遷移したロックステップコア12から内部情報を取得する(ステップS26)。デバッグ制御回路22は、読み出した内部情報をエミュレータ200に出力する(ステップS28)。
【0075】
<利点>
実施の形態1によると、メインコアの実行状態を維持しつつロックステップコアをブレーク状態にすることで、ロックステップコアの内部情報を取得できる。また、ロックステップコアの内部情報は、メインコアの内部情報と同一であることも保証される。すなわち、メインコアの実行状態を維持したまま内部情報を取得するノンブレークデバッグを実現できる。これにより、メインコアの動作を停止する必要がないため、デバッグ作業を効率的に進めることができるとともに、動作停止に起因する電子部品(例えば、モータ)の破損等を防止することもできる。
【0076】
<実施の形態2>
実施の形態2では、ロックステップコア12を利用したデバッグ機能の他の例について説明する。
【0077】
プログラミングミスとして、未初期化レジスタへのアクセス違反がしばしば発生する。未初期化レジスタとは、初期化すべきレジスタ(以下、「初期化対象レジスタ」とも称する。)であって、初期化漏れにより未だ初期化されていないレジスタである。コンパイラ等で静的な解析をすることで未初期化レジスタの検出は可能だが、絶対アドレスアクセスでの確認に限定される。
【0078】
例えば、プログラムコード「ld.w 0x0[r10], r11」のように、r10番地のアドレスに格納されている値をr11番地に読み出す場合、r10番地の値は、アクセス前のプログラムの流れにより変動する可能性がある。そのため、アクセス先が未初期化かどうか静的解析では検出することができない。
【0079】
そこで、実施の形態2では、ロックステップコア12を利用して、初期化対象レジスタの初期化漏れを適切に検出して、デバッグ作業を効率化する方式について説明する。なお、実施の形態2の<全体構成>は、実施の形態1のそれと同様である。
【0080】
<プロセッサコアの構成>
実施の形態2において、ロックステップコア12Aにはメインコア11Aとは異なるデバッグ設定が行なわれる。具体的には、メインコア11の初期化対象レジスタおよびロックステップコア12の初期化対象レジスタにそれぞれ異なる値が設定された状態で、デバッグ対象のプログラムが実行される。ここで、初期化対象レジスタの初期化漏れが発生していた場合(すなわち、未初期化レジスタが存在していた場合)を想定する。
【0081】
この場合、メインコア11およびロックステップコア12が未初期化レジスタにアクセスすると、それぞれ異なる値を読み出すことになる。そのため、メイン処理結果とロックステップ処理結果が不一致となり、エラー信号によりメインコア11およびロックステップコア12がブレークされる。このように、メインコア11およびロックステップコア12がブレークされることで、未初期化レジスタへのアクセス違反を検出することができる。以下、実施の形態2に従うプロセッサコア10の構成等について具体的に説明する。
【0082】
図7は、実施の形態2に従うプロセッサコア10Aの構成例を示す図である。プロセッサコア10A(メインコア11A,ロックステップコア12A)は、
図1に示すプロセッサコア10(メインコア11,ロックステップコア12)と対応するが、実施の形態1との区別のため、便宜上「A」といった追加の符号を付している。
【0083】
図7を参照して、プロセッサコア10Aは、命令実行部102Aと、モニタコード格納部122と、レジスタ群124とを含む。レジスタ群124は、汎用レジスタ、専用レジスタ等の各種レジスタを含む。
【0084】
デバッグ制御回路20は、エミュレータ200の指示に従って、モニタコード格納部122に初期化プログラムを転送する。モニタコード格納部122には、転送された初期化プログラムが格納される。
【0085】
命令実行部102Aは、デバッグ制御回路20からの制御指示に従って処理を実行する。命令実行部102Aは、モニタコード格納部122に格納されている初期化プログラムを実行して、レジスタ群124に含まれる各初期化対象レジスタに、初期化プログラムに従う値を格納する。
【0086】
デバッグ制御回路21からメインコア11Aに転送される初期化プログラムに従う値は、デバッグ制御回路22からロックステップコア12Aに転送される初期化プログラムに従う値と異なる。そのため、メインコア11Aにおける初期化対象レジスタに設定される値は、ロックステップコア12Aにおける初期化対象レジスタに設定される値と異なる。
【0087】
メインコア11Aおよびロックステップコア12Aの各々の命令実行部102Aは、初期化プログラムに従う値が初期化対象レジスタに設定された後、デバッグ対象のプログラムの実行を開始する。各々の命令実行部102Aは、デバッグ対象のプログラムの実行開始時に、当該プログラムにより指定される初期化対象レジスタに当該プログラムに従う初期値を書き込む。各々の命令実行部102Aは、レジスタ群124にアクセスしながら処理結果を一致判定回路40に出力する。
【0088】
ここで、デバッグ対象のプログラムの実行により、すべての初期対象レジスタへ適切な初期値が書込まれた(すなわち、初期化漏れがない)場合には、未初期化レジスタは存在しない。そのため、メインコア11Aの初期化対象レジスタおよびロックステップコア12Aの初期化対象レジスタには同一の値が設定された状態となる。
【0089】
一方、初期化対象レジスタへの初期値の書き込み漏れ(すなわち、初期化漏れ)が発生している場合には、未初期化レジスタが存在することになる。そのため、メインコア11Aの未初期化レジスタおよびロックステップコア12Aの未初期化レジスタには異なる値が設定された状態となる。この場合、メインコア11Aの命令実行部102Aが当該未初期化レジスタにアクセスして実行した処理結果は、ロックステップコア12Aの命令実行部102Aが当該未初期化レジスタにアクセスして実行した処理結果と異なる。
【0090】
そのため、一致判定回路40は、メイン処理結果とロックステップ処理結果とが不一致であることを示す一致判定信号をエラー制御回路50に出力する。メインコア11Aおよびロックステップコア12Aは、プログラム実行状態であるため、当該実行状態であることを示す状態信号をエラー制御回路50に出力する。
【0091】
エラー制御回路50は、メインコア11Aおよびロックステップコア12Aが実行状態であって、かつメイン処理結果とロックステップ処理結果とが不一致であるため、エラー信号を出力する(
図3参照)。したがって、メインコア11Aおよびロックステップコア12Aは、エラー信号によりブレークされる。このように、メインコア11Aおよびロックステップコア12Aが未初期化レジスタにアクセスした場合、メインコア11Aおよびロックステップコア12Aはブレーク状態に遷移する。
【0092】
デバッグ制御回路21は、ブレーク状態に遷移したメインコア11Aの内部情報を取得し、エミュレータ200に出力する。デバッグ制御回路22は、ブレーク状態に遷移したロックステップコア12Aの内部情報を取得し、エミュレータ200に出力する。ホストマシン300は、これらの内部情報をディスプレイ等に表示する。
【0093】
<処理手順>
図8は、実施の形態2に従うデバッグシステム1000が実行する処理手順を説明するための図である。
【0094】
ここでは、エミュレータ200は、ホストマシン300に接続されており、セレクタ30を介して、デバッグ制御回路21,22に指示可能な状態であるとする。また、一致判定回路40は、予め定められた周期でメイン処理結果とロックステップ処理結果との一致判定を行ない、一致判定信号をエラー制御回路50に出力する。
【0095】
図8を参照して、デバッグ制御回路21は、エミュレータ200の指示に従って、起動指示をメインコア11Aに与える(ステップS30)。デバッグ制御回路22は、エミュレータ200の指示に従って、起動指示をロックステップコア12Aに与える(ステップS32)。
【0096】
デバッグ制御回路21は、エミュレータ200の指示に従って、メインコア11Aのすべての初期化対象レジスタを、例えば、値“0h”で初期化する(ステップS34)。具体的には、デバッグ制御回路21は、値“0h”で初期化するための初期化プログラムをメインコア11Aに転送する。メインコア11Aにより当該初期化プログラムが実行されることで初期化対象レジスタに値“0h”が設定される。
【0097】
デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12Aのすべての初期化対象レジスタを、例えば、値“Fh”で初期化する(ステップS36)。具体的には、デバッグ制御回路22は、値“Fh”で初期化するための初期化プログラムを転送する。ロックステップコア12Aにより当該初期化プログラムが実行されることで初期化対象レジスタに値“Fh”が設定される。なお、ロックステップコア12Aの初期化対象レジスタに設定される値は、メインコア11Aの初期化対象レジスタに設定される値と異なっていればよい。
【0098】
デバッグ制御回路21は、エミュレータ200の指示に従って、エラー制御回路50のエラー信号出力機能を“有効”に設定する(ステップS38)。エミュレータ200の指示に従って、デバッグ制御回路21はメインコア11Aにプログラムの実行開始を指示し(ステップS40)、デバッグ制御回路22はロックステップコア12Aにプログラムの実行開始を指示する(ステップS42)。
【0099】
続いて、メインコア11Aおよびロックステップコア12Aは、当該指示に従って、同時にデバッグ対象のプログラムの実行を開始する(ステップS44)。このとき、メインコア11Aおよびロックステップコア12Aはプログラムの実行状態に遷移する。また、メインコア11Aおよびロックステップコア12Aの各々は、デバッグ対象のプログラムに従う初期値を、当該プログラムにより指定された初期化対象レジスタに書き込む。
【0100】
ここで、本来であれば、各初期化対象レジスタに、対応する初期値が書込まれているはずである。しかし、特定の初期化対象レジスタに対して初期化漏れがある(すなわち、当該特定の初期化対象レジスタが未初期化レジスタである)場合には、メインコア11Aおよびロックステップコア12Aによる未初期化レジスタへのアクセスが発生する(ステップS46)。このとき、メインコア11Aが当該未初期化レジスタにアクセスした際に読み出す値は“0h”であり、ロックステップコア12Aが当該当該未初期化レジスタにアクセスした際に読み出す値は“Fh”であるため、メイン処理結果とロックステップ処理結果とは不一致となる。
【0101】
ステップS44において、メインコア11Aおよびロックステップコア12Aは実行状態に遷移しており、ステップS46におけるアクセス違反によりメイン処理結果とロックステップ処理結果とは不一致となる。そのため、エラー制御回路50は、メインコア11Aおよびロックステップコア12Aにエラー信号を出力する(ステップS48,S50)。メインコア11Aおよびロックステップコア12Aは、エラー信号によりブレーク状態に遷移する(ステップS52)。
【0102】
デバッグ制御回路21は、エミュレータ200の指示に従って、ブレーク状態に遷移したメインコア11Aから内部情報を取得する(ステップS54)。デバッグ制御回路22は、エミュレータ200の指示に従って、ブレーク状態に遷移したロックステップコア12Aから内部情報を取得する(ステップS56)。デバッグ制御回路21および22は、読み出した内部情報をエミュレータ200に出力する(ステップS58)。
【0103】
<利点>
実施の形態2によると、プログラミングミスとして頻発する未初期化レジスタへのアクセス違反を動的に検出できる。これにより、コンパイラおよびコード解析による静的検出、あるいは大規模検出回路を搭載する必要がなく、デバッグ作業をより効率的に行なうことができる。
【0104】
[実施の形態3]
実施の形態3では、ロックステップコア12を利用したデバッグ機能のさらに他の例について説明する。
【0105】
デバッグにおいてブレーク時点より過去の状態の内部情報を取得するためには、ブレークポイントを設定し直した後に、プログラムを再実行する必要があった。しかし、プログラムがブレークポイントに到達するまで多大な時間を要する場合も多く、また、特定条件下でのみブレークポイントに到達する場合には、再実行して特定条件を再現させるのも労力が必要であった。
【0106】
そこで、実施の形態3では、メインコア11がブレークした際に、ブレーク時点の内部情報とブレーク時点よりも過去のある時点の内部情報とを同時に取得することで、デバッグ作業を効率化する方式について説明する。なお、実施の形態3の<全体構成>は、実施の形態1のそれと同様である。
【0107】
<プロセッサコアの構成>
実施の形態3において、ロックステップコア12Bにはメインコア11Bとは異なるデバッグ設定が行なわれる。具体的には、ロックステップコア12の命令バッファのみに任意サイクル分の命令が注入(追加)され、ロックステップコア12のプログラムの実行をメインコア11のプログラムの実行よりも任意サイクル分遅らせる。
【0108】
そして、メインコア11がブレーク状態に遷移した場合に、同時にロックステップコア12をブレーク状態に遷移させる。ブレーク状態に遷移したメインコア11とロックステップコア12の各内部情報を取得することで、ブレーク時点での内部情報と、ブレーク時点よりも任意サイクル分前の時点での内部情報とを取得する。以下、実施の形態3に従うプロセッサコア10の構成等について具体的に説明する。
【0109】
図9は、実施の形態3に従うプロセッサコア10Bの構成例を示す図である。プロセッサコア10A(メインコア11B,ロックステップコア12B)は、
図1に示すプロセッサコア10(メインコア11,ロックステップコア12)と対応するが、実施の形態1および2との区別のため、便宜上「B」といった追加の符号を付している。
【0110】
図9を参照して、プロセッサコア10Bは、命令実行部102Bと、命令バッファ132とを含む。
図9では、実施の形態3に関するプロセッサコア10Bの構成のみを示しているが、実施の形態1および実施の形態2のプロセッサコアの構成を含んでいてもよい。
【0111】
命令バッファ132は、内部メモリから読み出された命令を格納する。デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12Bの命令バッファ132にユーザにより指定された所定サイクル分の命令を注入する。ロックステップコア12Bの命令実行部102Bは、命令バッファ132に注入された所定サイクル分の命令を実行した後に、デバッグ対象のプログラムにおける各命令を実行する。
【0112】
一方、メインコア11Bの命令バッファ132には、所定サイクル分の命令が注入されない。そのため、ロックステップコア12Bの命令実行部102Bは、メインコア11Bの命令実行部102Bよりも所定サイクル分遅れて、デバッグ対象のプログラムを実行する。
【0113】
ここで、プログラムの実行中において、メイン処理結果およびロックステップ処理結果は不一致となるため、エラー出力機能が有効化されている場合にはエラー信号が出力されて、メインコア11Bおよびロックステップコア12Bがブレーク状態に遷移してしまう。そのため、デバッグ制御回路21(あるいは、デバッグ制御回路22)は、エミュレータ200の指示に従って、エラー制御回路50のエラー出力機能を無効化する。具体的には、エラー出力設定レジスタ51に値“1”が設定される(
図3参照)。
【0114】
そして、何らかの要因によりメインコア11Bがブレーク状態に遷移した場合、同時にロックステップコア12Bもブレーク状態に遷移する。例えば、メインコア11Bがブレーク状態に遷移すると、メインコア11Bは当該ブレーク状態に遷移したことを示す状態信号をロックステップコア12Bに出力する。ロックステップコア12Bは、当該状態信号を受けるとブレーク状態に遷移する。なお、上記構成に限られず、2つのプロセッサコア10のうちの一方がブレーク状態に遷移した場合に、他方もブレーク状態に遷移させるように構成されていればよい。
【0115】
デバッグ制御回路21は、ブレーク状態に遷移したメインコア11Bの内部情報(すなわち、ブレーク時点の内部情報)を取得し、エミュレータ200に出力する。デバッグ制御回路22は、ブレーク状態に遷移したロックステップコア12Bの内部情報(すなわち、ブレーク時点よりも所定サイクル分前の内部情報)を取得し、エミュレータ200に出力する。ホストマシン300は、これらの内部情報をディスプレイ等に表示する。
【0116】
<処理手順>
図10は、実施の形態3に従うデバッグシステム1000が実行する処理手順を説明するための図である。ここでは、エミュレータ200は、ホストマシン300に接続されており、セレクタ30を介して、デバッグ制御回路21,22に指示可能な状態であるとする。
【0117】
図10を参照して、デバッグ制御回路21は、エミュレータ200の指示に従って、起動指示をメインコア11Bに与える(ステップS70)。デバッグ制御回路22は、エミュレータ200の指示に従って、起動指示をロックステップコア12Bに与える(ステップS72)。
【0118】
デバッグ制御回路22は、エミュレータ200の指示に従って、ロックステップコア12Bの命令バッファ132に所定サイクル分の命令を注入する(ステップS74)。デバッグ制御回路21は、エミュレータ200の指示に従って、エラー制御回路50のエラー信号出力機能を“無効”に設定する(ステップS76)。
【0119】
エミュレータ200の指示に従って、デバッグ制御回路21はメインコア11Bにプログラムの実行開始を指示し(ステップS78)、デバッグ制御回路22はロックステップコア12Bにプログラムの実行開始を指示する(ステップS80)。
【0120】
メインコア11Bはデバッグ対象のプログラムの実行を開始し、ロックステップコア12Bは、注入された所定サイクル分の命令を実行した後、デバッグ対象のプログラムの実行を開始する。すなわち、ロックステップコア12Bは、メインコア11Bよりも所定サイクル分遅れて、デバッグ対象のプログラムを実行する。なお、メイン処理結果およびロックステップ処理結果は不一致であるが、エラー制御回路50の出力機能は無効化されているため、メインコア11Bおよびロックステップコア12Bの実行状態が継続される。
【0121】
続いて、メインコア11Bがブレーク状態に遷移すると(ステップS84)、ロックステップコア12Bもブレーク状態に遷移する(ステップS86)。例えば、ユーザは、ホストマシン300を用いて、メインコア11Bを強制的にブレーク状態に遷移させる。
【0122】
デバッグ制御回路21は、エミュレータ200の指示に従って、ブレーク状態に遷移したメインコア11Bから内部情報を取得する(ステップS88)。デバッグ制御回路22は、エミュレータ200の指示に従って、ブレーク状態に遷移したロックステップコア12Bから内部情報を取得する(ステップS90)。
【0123】
デバッグ制御回路21および22は、取得した内部情報をエミュレータ200に出力する(ステップS92)。デバッグ制御回路21により取得された内部情報はブレーク時点の内部情報として利用され、デバッグ制御回路22により取得された内部情報は、ブレーク時点よりも所定サイクル分前の内部情報として利用される。
【0124】
<利点>
実施の形態3によると、ブレーク時点の内部情報と、ブレーク時点よりも所定サイクル分前の時点での内部情報を同時に取得できる。また、ブレーク時点よりも所定サイクル分前の時点から、ステップ実行等を用いたデバッグを行ない、ブレーク時点までの動作を確認できる。これにより、ブレークした原因の究明が容易となりデバッグ作業をより効率化することができる。
【0125】
[その他]
上述した実施の形態において、その他の実施の形態で説明した処理や構成を適宜採用して実施する場合であってもよい。
【0126】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。