(58)【調査した分野】(Int.Cl.,DB名)
【背景技術】
【0002】
ソフトウェアの開発を効率化するために、中央処理装置(CPU:Central Processing Unit)には、JTAG(Joint Test Action Group)規格などに対応したオンチップデバッグ機能が搭載されるものが多い。オンチップデバッグ機能は、専用インターフェースを介して命令コードを入力することでCPUを動作させ、半導体チップ内のリソース情報を取り出すものである。オンチップデバッグ機能には、ユーザ・プログラムの実行を所望の箇所で停止可能なブレーク機能や、ユーザ・プログラム実行中の任意の時点での内部バスの情報を取得可能なトレース機能などがある。
【0003】
特開2001−350648号公報(特許文献1)に記載の技術では、上記のオンチップデバッグ機能を備えたマイクロコンピュータに、さらに、ユーザ・プログラム実行中に所定の内部状態情報を外部へ出力させる内部状態出力回路と、前記内部状態情報を出力するための端子とが設けられる。
【0004】
特開平6−214819号公報(特許文献2)にも、上記の文献と同様の記載がある。具体的に、この文献の記載のマイクロコンピュータには、プログラムカウンタの内容を外部に出力したり、CPUと機能モジュールとの間で入出力される信号などを選択して外部に出力したりする出力回路が設けられる。
【0005】
ところで、近年、低電力かつ高性能のシステムを実現するために、複数のCPUを同一のLSI(Large Scale Integration)に搭載したマルチプロセッサ(マルチコアプロセッサ)の開発が進められている。複数のCPUを搭載したシステムのデバッグでは、単一のCPUを搭載したシステムとは異なる新たな問題がある。
【0006】
たとえば、複数のCPUを搭載したシステムのデバッグでは、ブレーク、ステップ実行、およびトレースなどがCPU毎に実施される。このため、効率の良いデバッグを行なうには、各CPUのブレーク、ステップ実行を協調動作させること、および各CPUのトレースデータの時間関係を知ることが必要になる。特開2003−162426号公報(特許文献3)には、このための制御回路を備えたコンピュータシステムについて記載されている。
【0007】
デバッグ用の端子群と複数のCPUとの接続方法もマルチプロセッサに固有の問題である。植田等(非特許文献1)によれば、JTAGインターフェースを使ったデバッグを想定した場合、JTAGポートと制御対象のCPUコアとの接続方法は、4種類考えられる。すなわち、カスケード接続にするかパラレル・スイッチ接続にするかという選択肢と、CPUコア間の同期を取る機能などを備えるか否かという選択肢がある。たとえば、特開2004−164367号公報(特許文献4)は、レジスタを用いた簡単な構成のスイッチ回路(選択回路)によって、デバッグ用端子群と選択されたCPUとを接続する技術を開示する。
【0008】
特開2009−193305号公報(特許文献5)は、複数のCPUを同一のLSI上に搭載したマルチコアLSIにおいて、他のCPUが正常に動作するなかで、あるCPUが暴走して共有バスをハングアップした場合に対処可能な技術を開示する。具体的には、この文献のマルチコアLSIは、第1の共有バスに接続された複数のCPUと、第2の共有バスに接続された1個以上のモジュールと、第1の共有バスと第2の共有バスとの間に接続され、複数のCPUのモジュールへのアクセスを調停する共有バス制御部と、アクセス先のモジュールから、各CPUのアクセス要求信号に対する応答信号が出力されたか否かを監視するシステムコントローラとを備える。システムコントローラは、共有バス制御部から第2の共有バスにアクセス要求信号が出力されてから所定時間経過するまでに、アクセス先のモジュールから応答信号が出力されない場合は、共有バス制御部を介して第1の共有バスに疑似応答信号を出力して、アクセス中のCPUの当該アクセスを終了させる。
【発明を実施するための形態】
【0019】
以下、この発明の実施の形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰返さない。
【0020】
<実施の形態1>
[マイクロコンピュータチップの構成]
図1は、この発明の実施の形態1によるマイクロコンピュータチップ100の構成を示すブロック図である。
図1を参照して、マイクロコンピュータチップ100は、複数の中央処理装置(CPU)と、内部メモリ21と、マイクロコンピュータチップ100を周辺機器に接続するための入出力インターフェース(周辺IO)22と、外部バスインターフェース23とを含む。これらの要素は、内部バス20を介して相互に接続される。なお、
図1にはマイクロコンピュータチップ100に設けられた複数のCPUのうち、CPU0およびCPU3が代表として示されている。
【0021】
入出力インターフェース22は、入出力ポート26を介してマイクロコンピュータチップ100の外部に設けられた周辺機器と接続される。
【0022】
外部バスインターフェース23は、マイクロコンピュータチップ100の外部に設けられた外部メモリ(たとえば、DRAM(Dynamic Random Access Memory))やASIC(Application Specific Integrated Circuit)などと入出力ポート27を介して接続される。
【0023】
CPU0は、コア回路(CPUコア)10_0と、メモリ管理ユニット(MMU:Memory Management Unit)11_0と、一次キャッシュ(命令キャッシュ(icache)13_0およびデータキャッシュ(dcache)12_0)と、デバッグ回路14_0とを含む。コア回路10_0は、内部メモリ21または外部メモリに記憶されたプログラムを実行するCPUの中核部分である。メモリ管理ユニット11_0は、仮想アドレスと物理アドレスとの変換を行なう。一次キャッシュは、メモリの一部のデータが転送されることによってデータアクセスの高速化を図るものである。デバッグ回路14_0は、JTAG ICE(In-circuit Emulator)によるオンボードデバッグを実現するためにプロセッサ内部に設けられた専用回路である。
【0024】
CPU3も、CPU0と同様に、コア回路10_3と、MMU11_3と、一次キャッシュ(12_3,13_3)と、デバッグ回路14_3とを含む。ただし、後述するように、CPU3のコア回路10_3には、プログラムの実行中にCPU0の内部状態に関する情報が転送される監視用のレジスタ群が設けられる。監視用のレジスタ群は、CPU3のメモリ空間にマッピングされている。すなわち、監視用レジスタ群を構成する各レジスタにはアドレスが割当てられる。この割当てられたアドレスをオペランドアドレスとして記載した読出命令をCPU3に発行することによって、監視用レジスタ群に保持された内容を読み出すことができる。
【0025】
マイクロコンピュータチップ100は、さらに、複数のCPUにそれぞれ対応して設けられたJTAGインターフェース15と、スイッチ回路24と、JTAGポート28とを含む。
図1には、CPU0,3にそれぞれ対応するJTAGインターフェース15_0,15_3が代表的に示されている。
【0026】
各JTAGインターフェース15は、TAP(Test Access Port)16と呼ばれる専用のコントローラを有し、TAPを介して対応のCPUとJATGポート28に接続された外部のデバッグ装置との通信が行なわれる。JTAGインターフェース15は、特定のTAPだけが外部のデバッグ装置と通信できる仕様となっている。スイッチ回路24は、JTAGポート28と各JTAGインターフェース15との接続を切替える。
【0027】
図2は、
図1に示したCPU0の内部情報の転送に用いられるハードウェアの一例を示す回路図である。
【0028】
図2を参照して、プログラムの実行中にはCPU0の内部情報がCPU3のコア回路10_3に設けられた監視用レジスタ群60に転送される。監視用レジスタ群60は、CPU3のメモリ空間にマッピングされている。転送されるCPU0の内部状態は、たとえば、プログラム実行時に用いられるプログラムカウンタなどの特殊レジスタ群30の値であり、割込み動作時に退避されるCPUコンテキストに相当する情報である。
【0029】
実施の形態1の場合には、
図2に示されるように、プログラムカウンタ(EPC:Execute Program Counter、単にPCとも記載する)31の値、バックアッププログラムカウンタ(BPC:Backup Program Counter)32の値、プログラムステータスワード(PSW:Program Status Word)33の値、およびオペランドアクセス(OA:Operand Access)の情報34などが監視用レジスタ群60に転送される。オペランドアクセスの情報としては、オペランドアクセス要求(REQ)、ライトおよびリード属性(WR)、バスロック要求属性(LOCK)、バイトコントロール(BC)、オペランドアドレス情報(ADDR)、およびオペランドアクセス要求に対するバス受付(acknowledge)信号(DCC1HOAACK)などが挙げられる。この実施の形態の場合、バス構成上の理由で、バス受付信号(DCC1HOAACK)は、データキャッシュ12_0が出力する。なお、BPC32は、割り込み、トラップ、例外が発生したときにPCの値を退避する。
【0030】
図2には図示されていないが、
図1のメモリ管理ユニット11_0の内部情報、すなわち、TLB(Translation Look-aside Buffer)エントリ(仮想アドレスに対応付けられた物理アドレスの情報)も監視用レジスタ群60に転送するのが望ましい。
【0031】
転送されるCPU0の内部情報は、レイテンシ(遅延時間)を考慮して複数のフリップフロップ(保持回路)を介して監視用レジスタ群に転送される。
図2の場合には、フリップフロップ41〜45が情報の出力側であるCPU0に設けられ、フリップフロップ46〜54が情報の受け側であるCPU3に設けられる。
【0032】
監視用レジスタ群60を構成する各レジスタ61〜68の構成の詳細については、
図4および
図5を参照して後述する。ここで、レジスタ61,63,64,65,66の値は、クロックサイクル毎に更新されるのに対して、レジスタ62,67,68は必ずしもクロックサイクル毎に更新されない。
【0033】
レジスタ62は、プログラムカウンタ(PC)の値が更新されたときのみ、更新前のプログラムカウンタの値を保持する。この目的のため、レジスタ62の前段にフリップフロップ52が設けられるとともに、比較回路55が設けられる。比較回路55は、フリップフロップ51に保持されているプログラムカウンタの値と、クロックサイクル毎に入力される新たなプログラムカウンタの値とを比較し、両者が一致している場合に“0”を出力し、不一致の場合に“1”を出力する。フリップフロップ52は、クロックサイクル毎にプログラムカウンタの値を保持し、比較回路55の出力が“1”のときのみ(WE=“1”)、保持したプログラムカウンタの値をレジスタ62に出力することによってレジスタ62の値を更新する。
【0034】
レジスタ67,68は、オペランドアドレスおよびオペランドアクセスの属性が更新されたときのみ、更新前の値を保持する。この目的のため、レジスタ67,68の前段にフリップフロップ54が設けられる。フリップフロップ54は、クロックサイクル毎にオペランドアドレスおよびオペランドアクセスの属性を保持する。フリップフロップ54は、バス受付信号(DCC1HOAACK)が活性化されたときに、保持したオペランドアドレスおよびオペランドアクセスの属性をレジスタ67,68にそれぞれ出力することによってレジスタ67,68の内容を更新する。
【0035】
なお、監視用レジスタ群60は、必ずしもCPUコア10_3の内部に設けなくてもよいが、CPU0の内部情報を伝達するための信号経路を短くするためには、
図2に示すようにCPUコア10_3の内部に設けたほうが望ましい。もし、監視用レジスタ群60をCPU3の外部に設けて、監視用レジスタ群60とCPU3との間をバス20で接続すれば、バス20がハングアップしている場合にCPU3から監視用レジスタ群60にアクセスできなくなる。あるいはこの問題を回避するために、監視用レジスタ群60とCPU3との間を多数の専用信号線で接続することになる。
【0036】
図3は、4個のCPUを備えたマイクロコンピュータチップにおけるCPUコア間の信号伝送について説明するための概念図であり、各CPU内部状態の読出経路がツリー状に構成された例が示される。
【0037】
図3を参照して、CPU0,1,2の各内部情報がCPU3に設けられた監視用レジスタ群に転送される。さらに、CPU3自身の内部情報を保持するための監視用レジスタ群をCPU3の内部に設けるのが望ましい。CPU3に設けられた監視用レジスタ群はCPU3のメモリ空間にマッピングされているので、一般的なデバッガが搭載しているメモリダンプ機能を用いて、これらのCPU0〜3の内部情報を一括してCPUの外部に出力することができる。すなわち、所望の観測対象をCPU3のメモリ空間にマッピングするだけで、メモリダンプ機能を使ってこれらの観測対象をマイクロコンピュータチップの外部から観測することができる。エミュレータやエミュレータファームなどのデバッガ側の改変は不要である。
【0038】
なお、実際にプログラムをデバッグするときには、初期段階では、CPU3をモニタ専用としてCPU0〜CPU2のみでプログラムを動作させるのが望ましい。そして、ある程度デバッグが進んだ段階でCPU0〜3の全てを使ってプログラムを動作させるのが効率的である。
【0039】
[監視用レジスタ群の詳細]
図4は、CPU3に設けられた監視用レジスタ群の一覧表である。
図4に示すアドレスの上位ビット「XXXX_XX」は、メモリ空間内の特定アドレスを示す。
【0040】
図5は、
図4の各監視用レジスタについて説明するための図である。
図4、
図5を参照して、レジスタCRMCPU0PC〜CRMCPU3PC(
図2のレジスタ61)は、CPU0〜3のプログラムカウンタ(PC)の値(32ビット:ビットb0〜b31)をそれぞれ保持する。
【0041】
レジスタCRMCPU0BPC〜CRMCPU3BPC(
図2のレジスタ63)は、CPU0〜3のバックアッププログラムカウンタ(BPC)の値(32ビット)をそれぞれ保持する。
【0042】
レジスタCRMCPU0OLDPC〜CRMCPU3OLDPC(
図2のレジスタ62)は、CPU0〜3のプログラムカウンタが現在の値に変わる直前の値(OLDPC:32ビット)をそれぞれ保持する。CPUがハングアップする場合は、現在実行中の命令よりも1つ以上前の命令が原因となっていることが多く、またプログラムフロー取得のため、1段以上のプログラムカウンタ履歴を保持しておくことは重要である。
【0043】
レジスタCRMCPU0PSW〜CRMCPU3PSW(
図2のレジスタ64)は、CPU0〜3のプログラムステータスワード(PSW)の値(32ビット)をそれぞれ保持する。
【0044】
レジスタCRMCPU0OAADDR〜CRMCPU3OAADDR(
図2のレジスタ65)は、CPU0〜3が出力しているオペランドアクセスアドレス(OAADDR:32ビット)をそれぞれ保持する。
【0045】
レジスタCRMCPU0OAATTR〜CRMCPU3OAATTR(
図2のレジスタ66)は、CPU0〜3がそれぞれ出力しているオペランドアクセスの属性(リクエストR、ライトW、ロックL、バイトコントロールBC)を保持する。具体的には、R=0の場合がリクエスト無しを表わし、R=1の場合がリクエスト有りを表わす。W=0の場合がリードリクエストを表わし、W=1の場合がライトリクエストを表す。Wの値はR=1のときのみ有効である。L=0の場合がロック期間中ではない、もしくはアンロックリクエスト中であることを示し、L=1の場合がロック期間中、もしくはロックリクエスト中であることを示す。バイトコントロールBCは、4ビットのバイトコントロール信号であり、R=1のときのみ有効である。
【0046】
レジスタCRMCPU0OLDOAAD〜CRMCPU3OLDOAAD(
図2のレジスタ67)は、CPU0〜3がそれぞれ出力している現在のオペランドアクセスアドレスよりも1つ前のオペランドアクセスアドレス(OLDOAAD)の値(32ビット)を保持する。CPUがハングアップする場合は、現在実行中のオペランドアクセスよりも1つ以上前のオペランドアクセスが原因となっていることが多いので、1段以上のオペランドアクセスアドレスの履歴を保持しておくことは重要である。
【0047】
レジスタCRMCPU0OLDOAAT〜CRMCPU3OLDOAAT(
図2のレジスタ68)は、CPU0〜3がそれぞれ出力している現在のオペランドアクセスの属性(リクエストR、ライトW、ロックL、バイトコントロールBC)の1つ前のオペランドアクセスの属性を保持する。CPUがハングアップする場合は、現在実行中のオペランドアクセスよりも1つ以上前のオペランドアクセスが原因となっていることが多いので、1段以上のオペランドアクセスの属性の履歴を保持しておくことは重要である。
【0048】
図6は、
図1のCPU3のアドレスマップの一例を示す図である。
図6を参照して、H’0000_0000〜H’1FFF_FFFFの512Mバイトはブロックに分割される。各ブロックには16MBの外部領域が割当てられる。外部領域は、
図1の外部バスインターフェース23を通じてアクセスする。
図1の内部メモリ、周辺IO22は内部領域に割当てられる。
【0049】
H’FE00_00000〜H’FFFF_FFFFの32Mバイトはシステム領域に割当てられる。
【0050】
図4の監視用レジスタ群は、たとえば、システム領域内にある領域Aや内部領域2Mバイトの一部である、領域Bなど、他のリソースに割当てられていない空き領域に割当てることができる。
【0051】
[デバッグ方法の説明]
図7は、CPU0がハングアップしていない場合のオンチップデバッグ方法について説明するための図である。
【0052】
図7を参照して、CPUコア10_0自身と、CPUコア10_0からアクセス可能な内部メモリ21、入出力インターフェース22、および外部バスインターフェース23とをデバッグ対象70とする。
【0053】
まず、マイクロコンピュータチップ100の外部から制御コードがデバッグ回路14_0に到達する。この場合の制御コードがオペランドアクセスの場合、デバッグ回路14_0はロード、ストアなどの命令をCPUコア10_0に発行する(
図7の参照符号71)。CPUコア10_0は、デバッグ回路14_0からの命令を受けて、たとえば、観測対象である内部メモリ21にアクセスする(
図7の参照符号72)。CPUコア10_0によるメモリアクセスの結果は、デバッグ回路14_0、JTAGインターフェース15_0、およびJTAGポート28を介して外部に出力される(
図7の参照符号73)。
【0054】
図8は、CPU0がハングアップしている場合のオンチップデバッグ方法について説明するための図である。
【0055】
CPUコアが動作できない原因として、CPUに命令が供給されてもバスアクセス経路がふさがっていることが考えられる。この場合、CPUは先行するオペランドアクセス処理が完了できず、ハングアップする。他の原因として、CPUコア内のバグでハングアップする場合などが考えられる。CPU0がハングアップすると、デバッグ対象系70から情報を外部に出すことができなくなる。
【0056】
既に説明したように、実施の形態1のマイクロコンピュータチップ100では、CPU0の内部状態を表わす情報がCPUコア10_3内の監視用レジスタ群に転送される。そして、監視用レジスタ群はCPU3のメモリ空間にマッピングされている。したがって、デバッグ回路14_3は、監視用レジスタ群の内容をロードする命令をCPU3に発行する(
図8の参照符号74)ことによって、ハングアップしたCPU0の情報をJTAGインターフェース15_3およびJTAGポート28を介して外部に出力することができる(
図8の参照符号75)。この結果、従来よりも容易にデバッグを行なうことができる。
【0057】
<実施の形態2>
実施の形態1では、CPU0〜3の内部状態を表わす情報がCPU3に設けられた監視用レジスタ群に全て転送されるように、内部状態の読出経路がツリー状に構成される例を示した。実施の形態2では、各CPUの内部状態の読出経路の変形例を説明する。各CPUの内部状態の読出経路は、各CPUの結合網の形態(オンチップバス、ネットワークオンチップの各トポロジ)に左右されず、自由に決定することができるので、この発明によるオンチップデバッグ方法は、オンチップマルチプロセッサに適している。たとえば、結合網がネットワークオンチップでメッシュ構成をとっている場合でも、各CPUの内部状態の読出経路はツリー構造をとることで経路を簡単化することができる。
【0058】
図9は、4個のCPUを備えたマイクロコンピュータチップにおける各CPUの内部状態の読出経路がリング構成になっている例を示す図である。
図9に示す例では、CPU0の内部情報がCPU1に設けられた監視用レジスタ群に転送され、CPU1の内部情報がCPU3に設けられた監視用レジスタ群に転送され、CPU3の内部情報がCPU2に設けられた監視用レジスタ群に転送され、CPU2の内部情報がCPU0に設けられた監視用レジスタ群に転送される。すなわち、各CPUの内部状態の読出経路がリング構成になっている。
【0059】
図10は、4個のCPUを備えたマイクロコンピュータチップにおける各CPUの内部状態の読出経路がバス構成になっている例を示す図である。
図10に示す例では、CPU0〜3の各々の内部情報が、バス(BUS)を経由してCPU0〜3の少なくとも1つに設けられた監視用レジスタ群に転送される。
【0060】
図11は、7個のCPUを備えたマイクロコンピュータチップにおける各CPUの内部状態の読出経路がツリー構成になっている例を示す図である。
図11では、各CPUの内部状態の読出経路がツリー状に構成された例が示される。具体的には、CPU10,11の各内部情報がCPU1に設けられた監視用レジスタ群に転送され、CPU20,21の各内部情報がCPU2に設けられた監視用レジスタ群に転送され、CPU1,2の各内部情報がCPU0に設けられた監視用レジスタ群に転送される。
【0061】
今回開示された実施の形態はすべての点で例示であって制限的なものでないと考えられるべきである。この発明の範囲は上記した説明ではなくて請求の範囲によって示され、請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。