(57)【特許請求の範囲】
【請求項１】
それぞれがソフトウエアの実行単位である複数のスレッドを、クロックに同期して切り替えながら実行する半導体集積回路装置であって、
上記複数のスレッドのうち、第１スレッドの実行において用いられる第１レジスタと、
上記複数のスレッドのうち、上記第１スレッドとは異なる第２スレッドの実行において用いられる第２レジスタと、
上記第１及び第２スレッドが、互いに同じ特定ソフトウエアの実行単位で有るとき、上記第１スレッドの実行の結果と上記第２スレッドの実行の結果とを比較する比較回路と
を具備し、上記第１レジスタは上記第２レジスタとは異なるレジスタである半導体集積回路装置。
【請求項２】
上記複数のスレッドから、上記第１及び第２スレッドを指定する第３レジスタを具備する請求項１の半導体集積回路装置。
【請求項３】
上記第１スレッドにおける命令の実行数と、上記第２スレッドにおける命令の実行数との差が所定の値になる様に、上記第１スレッド又は上記第２スレッドの実行を制限する第１制限回路を具備する請求項２の半導体集積回路装置。
【請求項４】
上記第１スレッドの実行において、例外が発生したとき、上記第２スレッドの実行を制限する第２制限回路を具備する請求項３の半導体集積回路装置。
【請求項５】
上記第１スレッドの実行において、割込要求が発生した場合、上記第１スレッドにおける命令の実行数と上記第２スレッドにおける命令の実行数とが所定の関係の場合に、上記割込要求を受け付ける請求項３又は４の半導体集積回路装置。
【請求項６】
上記第１スレッドと上記第２スレッドとを同一のＣＰＵコアで実行する請求項１の半導体集積回路装置。
【請求項７】
それぞれがソフトウエアの実行単位である複数のスレッドの切り替えながら動作する半導体集積回路装置であって、
上記複数のスレッドのうち、２つのスレッドが、メモリへアクセスする特定ソフトウエアとされ、
メモリアクセスに関するアドレスを記憶する第１バッファと、
メモリアクセスにより得られたリードデータを記憶する第２バッファと、
メモリアクセスのアドレスを上記第１バッファに記憶されているアドレスと比較する第１比較回路とを具備し、
上記２つのスレッドのうち、第１スレッドにおいてメモリへのリードアクセスが行われた場合、リードアクセスに関するアドレスを上記第１バッファに記憶し、
上記２つのスレッドのうち、第２スレッドにおいて上記メモリへリードアクセスが行われる場合、そのアドレスと上記第１バッファに記憶されているアドレスとを上記第１比較回路で比較し、
上記第１比較回路からの不一致に応答して、故障に対応した処理を発生する半導体集積回路装置。
【請求項８】
上記第１比較回路からの一致に応答して、上記第２バッファに記憶されているリードデータを、上記第２スレッドのリードアクセスに応じたリードデータとする請求項７の半導体集積回路装置。
【請求項９】
メモリへのライトすべきデータを記憶する第３バッファと、
メモリへのライトすべきデータを上記第３バッファに記憶されているデータと比較する第２比較回路と
を具備し、
上記第１スレッドにおいて上記メモリへのライトアクセスが行なわれる場合、上記ライトアクセスに関するアドレスを上記第１バッファに、ライトすべきデータを第３バッファに記憶し、
上記第２スレッドにおいて上記メモリへのライトアクセスが行なわれる場合、そのアドレスと上記第１バッファに記憶されているアドレスとを上記第１比較回路で比較し、ライトすべきデータと上記第３バッファに記憶されているデータとを第２比較回路で比較し、
上記第１比較回路及び上記第２比較回路のうちの少なくとも一つからの不一致に応答して故障に対応する処理を行う請求項８の半導体集積回路装置。
【請求項１０】
上記第１比較回路と上記第２比較回路からの一致に応答して、上記第１バッファに記憶されているアドレスに従った上記メモリのアドレスに、上記第３バッファに記憶されているデータがライトされる請求項９の半導体集積回路装置。
【請求項１１】
上記第１スレッドと上記第２スレッドとを１つのＣＰＵコアで実行する請求項７の半導体集積回路装置。
【請求項１２】
それぞれがソフトウエアの実行単位である複数のスレッドを切り替えながら動作する半導体集積回路装置であって、
上記複数のスレッドのうち、２つのスレッドがメモリへアクセスする同じソフトウエアとされ、
メモリアクセスに関するアドレスを記憶する第１バッファと、
メモリへライトすべきデータを記憶する第３バッファと、
メモリアクセスのアドレスを上記第１バッファに記憶されているアドレスと比較する第１比較回路と、
メモリへライトすべきデータを上記第３バッファに記憶されているデータと比較する第２比較回路と
を具備し、
上記２つのスレッドのうち、第１スレッドにおいて上記メモリへライトアクセスが行なわれる場合、上記ライトアクセスに関するアドレスを第１バッファに記憶し、ライトすべきデータを第３バッファに記憶し、
上記２つのスレッドのうち、第２スレッドにおいて上記メモリへライトアクセスが行なわれる場合、そのアドレスと上記第１バッファに記憶されているアドレスとを上記第１比較回路で比較し、そのライトすべきデータと上記第３バッファに記憶されているライトデータとを上記第２比較回路で比較し、
上記第１比較回路及び上記第２比較回路のうちの少なくとも一つからの不一致に応答して故障に対応する処理を行う半導体集積回路装置。
【請求項１３】
上記第１比較回路と上記第２比較回路とからの一致に応答して、上記第１バッファに記憶されているライトアドレスに従った上記メモリのアドレスに、上記第３バッファに記憶されているライトデータがライトされる請求項１２の半導体集積回路装置。
【請求項１４】
上記第１スレッドと上記第２スレッドとを同一のＣＰＵコアで実行する請求項１２の半導体集積回路装置。
【請求項１５】
上記請求項１、７又は１２の半導体集積回路装置を具備したシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体集積回路装置に関し、例えば自動車等のシステムに設けられ、そのシステムを制御するマイクロコントローラに適用して有効な技術に関する。
【背景技術】
【０００２】
マイクロプロセッサ（以下、マイコンとも称する）は、その動作を規定するところのプログラムを格納したメモリとともに、家電製品、ＡＶ機器、携帯電話、自動車、産業機械等のシステムに組み込まれ、それぞれのシステムの動作を制御する。システムとして自動車を考えた場合、その動作を制御するマイコン等の部品は、それの故障が自動車の事故につながる可能性があるため、高い信頼性が求められる。また、部品に故障が発生した場合には、自動車が危険な状態に陥らない様にすることが要求される。自動車を制御するための部品として、メモリ及びマイコンだけでなく、センサ、アクチュエータ等が、自動車に設けられる。マイコンには、これらの部品の故障の有無を診断することが要求されるだけでなく、マイコン自身の故障についても診断することが要求される。
【０００３】
マイコン自身の故障を診断する技術として、非特許文献１に、マイコンを２重化動作させて、同一の処理を２個のマイコンで実施させ、常時結果を比較することが示されている。
【０００４】
また、２個のマイコンを並列動作と２重化動作とを切り替えて実行させることが可能な技術が、非特許文献２に示されている。この非特許文献２においては、特殊な命令（ＳＷＩＴＣＨ命令）をマイコンがフェッチすると、そのマイコンは動作を停止し、モードを切り替えるための待機状態となる。２個のマイコンが待機状態になると、それぞれのマイコンは新しいモードで動作を開始する。開始するモードとしては、性能モードと安全モードを有し、性能モードでは、それぞれのマイコンが並列動作をし、性能の向上が図られる。一方、安全モードでは２個のマイコンが２重化動作をし、それぞれの結果を比較することにより、故障の診断が行われる。
【０００５】
特許文献１には、冗長マルチスレッドアーキテクチャが開示されており、２つのスレッドにおいて実行されたストア命令の結果を比較することが示されている。
【０００６】
また、特許文献２には、プログラムを２つのスレッドで実行し、内容が一致した場合、共有メモリへ書き込む様にしたマルチスレッデイングシステムが開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特表２００７−５１９１０１号公報
【特許文献２】特開２０１１−４４０７８号公報
【非特許文献】
【０００８】
【非特許文献１】「ＩＥＥＥ  ＭＩＣＲＯ  Ｄｅｃｅｍｂｅｒ  １９８４」誌、Ｆａｕｌｔ  Ｔｏｌｅｒａｎｃｅ  Ａｃｈｉｅｖｅｄ  ｉｎ  ＶＬＳＩ
【非特許文献２】「Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｄｅｐｅｎｄａｂｌｅ  Ｓｙｓｔｅｍｓ  ａｎｄ  Ｎｅｔｗｏｒｋｓ  ２００６」、ページ４５から５４、Ａ  Ｒｅｃｏｎｆｉｇｕｒａｂｌｅ  Ｇｅｎｅｒｉｃ  Ｄｕａｌ−Ｃｏｒｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ
【発明の概要】
【発明が解決しようとする課題】
【０００９】
非特許文献１に従えば、常に２重化動作が行われるため、安全性は高いが、性能が低い。非特許文献２に従えば、特殊な命令によりモードを切り替える前に、プログラムの実行に必要なデータを予めロードしておくことが要求され、性能の向上が制限される。
【００１０】
特許文献１において、その図２には同時冗長スレッドアーキテクチャのブロック図が示されている。この図２の実施例によれば、命令複製キュー（２３０）、ソースレジスタ値キュー（２４０）及びデスティネーションレジスタ値キュー（２５０）が、システムに設けられる。これらのキュー（２３０、２４０、２５０）を介してリーディングスレッド（２１０）の値が、トレイリングスレッド（２２０）へ渡される。値が渡されるため、トレイリングスレッド（２２０）は、独立したレジスタを有さずに、上記キューを介して渡された値を用いて、命令を実行することになる。そのため、命令フェッチ処理用のレジスタ、命令実行用のレジスタの故障を検出することが困難となり、共通因子故障（Ｃｏｍｍｏｎ  Ｃａｕｓｅ  Ｆａｉｌｕｒｅ）の検出が困難となる。すなわち、命令フェッチ処理用のレジスタ或いは／及び命令実行用のレジスタに故障が生じていても、リーディングスレッドの実行の結果とトレイリングスレッドの実行の結果とでは同じになり、故障の検出が困難となる。
【００１１】
特許文献２に従えば、同じプログラムが２つのスレッドで実行され、スレッドでの実行結果が一致した場合、共有メモリへの書き込みが行われる。この処理を行うために、プログラムのソースコードを変更することが開示されている。すなわち、実行結果のローカルメモリへのバッファリング処理、バッファリングした内容の比較処理及び一致する場合の共有メモリへの書き込み処理を指示するコードを、ソースコードに追加することが示されている。ソースコードの変更が要求されるため、プログラムの変更或いは作成に負担が増える。また、この特許文献２では、共通因子故障に対する認識もされていない。
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１２】
一実施の形態による半導体集積回路装置は、複数のスレッドをクロックに従って切り替えながら実行する。この半導体集積回路装置には、複数のスレッドの実行に使用されるレジスタが各スレッド毎に設けられ、故障を検出するためのプログラムが２つのスレッドで実行されたとき該２つのスレッドの実行の結果を比較する比較回路が設けられる。
【発明の効果】
【００１３】
前記一実施の形態によれば、性能低下を抑制しつつ、故障の検出を向上させることが可能である。
【図面の簡単な説明】
【００１４】
【図１】実施の形態１に係わるマイクロコントローラを示すブロック図である。
【図２】実施の形態１に係わるレジスタの構成を示す説明図である。
【図３】実施の形態１に係わるレジスタの構成を示す説明図である。
【図４】実施の形態１に係わるＣＰＵコアのパイプライン動作を示すタイミング図である。
【図５】実施の形態１に係わるマルチスレッドのパイプライン動作を示すタイミング図である。
【図６】実施の形態１に係わるマルチスレッドのパイプライン動作を示すタイミング図である。
【図７】実施の形態１に係わるマルチスレッドのパイプライン動作を示すタイミング図である。
【図８】実施の形態１に係わるマルチスレッドのパイプライン動作を示すタイミング図である。
【図９】実施の形態１に係わる非冗長スレッド実行の動作を示すタイミング図である。
【図１０】実施の形態１に係わる冗長スレッド実行の動作を示すタイミング図である。
【図１１】実施の形態１に係わる冗長スレッド実行制御回路の状態遷移を示す図である。
【図１２】実施の形態１に係わる冗長スレッド実行制御回路の状態遷移を示す図である。
【図１３】実施の形態１に係わる冗長スレッド実行制御回路の動作を示すタイミング図である。
【図１４】実施の形態１に係わる冗長スレッド実行制御回路の動作を示すタイミング図である。
【図１５】実施の形態１に係わる冗長スレッド実行制御回路の変形例の状態遷移を示す図である。
【図１６】実施の形態１に係わる冗長スレッド実行制御回路の変形例の動作を示すタイミング図である。
【図１７】実施の形態１に係わる冗長スレッド実行制御回路の変形例の動作を示すタイミング図である。
【図１８】実施の形態１に係わる冗長スレッド実行制御回路の例外発生時の動作を示すタイミング図である。
【図１９】実施の形態１に係わる冗長スレッド実行制御回路の割り込み発生時の動作を示すタイミング図である。
【図２０】実施の形態２に係わるシステムを示すブロック図である。
【図２１】実施の形態１に係わるレジスタの構成を示す説明図である。
【図２２】実施の形態の概要を示すブロック図である。
【発明を実施するための形態】
【００１５】
以下の説明において、互いに同じ機能を有するブロック或いは波形については、説明の簡略化を図るために、同じ符号を付して、その詳細な説明を省略することがある。説明が省略されている場合には、同じ符号が付されているブロック或いは波形の説明を参照されたい。
【００１６】
［一実施形態の概要］
まず、実施の形態の概要を示すブロック図である図２２を用いて、実施形態の概要を説明する。同図おいて、マイクロコントローラ（microcontroller、ＭＣＵ（Micro-Control Unit））１は、２個のマイクロプロセッサ（ＣＰＵ：Central Processing Unit）のコア（以下、「ＣＰＵコア」と称することもある。）２Ａ、２Ｂを有している。このＣＰＵコア２Ａ及びＣＰＵコア２Ｂは、互いに同一の構成を有しているので、以下の説明では、ＣＰＵコア２Ａについてのみ詳しく説明する。
【００１７】
ＣＰＵコア２Ａは、プログラムの実行に必要なレジスタをソフトウエアの実行単位であるスレッド毎に有している。この実施の形態において、ＣＰＵコア２Ａは、特に制限されないが、４つのスレッドを切り替えながら実行出来るように４組のレジスタセット（Ｔ０Ｒ、Ｔ１Ｒ、Ｔ２Ｒ、Ｔ３Ｒ）２１０、２１１、２１２、２１３が設けられている。レジスタセット２１０、２１１、２１２、２１３のそれぞれは、特に制限されないが互いに同じ構成にされており、スレッドを実行する際に使われる複数のレジスタを有している。この実施の形態においては、レジスタセット２１０、２１１、２１２、２１３のそれぞれは、実行すべき命令のアドレスを示すプログラムカウンタ、ＣＰＵコアの状態を示す状態レジスタ、演算処理等に用いられる汎用レジスタをレジスタとして含んでいる。
【００１８】
図２２において、命令メモリ３には、ＣＰＵコア２Ａ、２Ｂで実行されるべき命令が格納されている。命令メモリ３から読み出された命令は、特に制限されないがキャッシュメモリ（Ｉ＄）４Ａを介して、ＣＰＵコア２Ａに供給され、キャッシュメモリ（Ｉ＄）４Ｂを介してＣＰＵコア２Ｂに供給される。
【００１９】
キャッシュメモリ４Ａから供給された命令は、ＣＰＵコア２Ａにおいて、実行される。すなわち、ソフトウエアの実行単位であるスレッドに含まれる複数の命令は、キャッシュメモリ４Ａを介してＣＰＵコア２Ａに順次フェッチされ、そのスレッドに対応して設けられたレジスタセットを用いて、順次実行される。フェッチされた命令を含むスレッドに対応するところのレジスタセットが、例えばレジスタセット２１０であれば、このレジスタセット２１０に含まれている状態レジスタ及び汎用レジスタ等を用いて命令が実行される。また、このスレッドにおいて、次にフェッチされるべき命令は、このレジスタセット２１０に設けられているプログラムカウンタにより指示される。他のレジスタセット２１１、２１２、２１３についても、そのレジスタセットに対応したスレッドの実行において使われる。ＣＰＵコア２Ａについては、後の実施の形態１で詳細に説明するので、これ以上の説明はここでは省略する。
【００２０】
ＣＰＵコア２Ａで、４つのスレッドを実行できるので、４つのスレッドの内の１つのスレッドを冗長スレッドとして、ＣＰＵコア２Ａの故障を診断するためのソフトウエアに割り当て、残りの３つのスレッドを非冗長スレッドとして、通常の処理用に割り当てる。通常の処理としては、特に制限されないが自動車のエンジンを制御する処理が割り当てられる。ＣＰＵコア２Ｂについても同様に、４つのスレッドの内の１つを冗長スレッドとして、ＣＰＵコア２Ｂの故障を診断するためのソフトウエアに割り当て、残りを非冗長スレッドとして、通常の処理に割り当てる。
【００２１】
この様にスレッドを割り当てることにより、６つのスレッドを非冗長スレッドとして割り当てることが出来、通常の処理を実行することが可能となり、性能の低下を抑制することが可能となる。
【００２２】
一方、ＣＰＵコア２Ａ及びＣＰＵコア２Ｂのそれぞれは、冗長スレッドを実行すると、レジスタセットを用いた実行結果と、冗長スレッドである旨を示す情報とを、信号２５２Ａ及び信号２５２Ｂとしてシステムバス制御回路５に供給する。システムバス制御回路５は、冗長スレッドの実行結果を比較し、一致していない場合は故障が発生している旨の情報を形成する。システムバス制御回路５の詳細は、後で実施の形態１で詳細に説明するが、ＣＰＵコア２Ａ及びＣＰＵコア２Ｂが冗長スレッドを実行した際に、それぞれの実行結果を比較する比較回路の機能を有していると理解されたい。
【００２３】
この様に、スレッド毎にレジスタセットを割り当てることにより、スレッドを切り替える前に切り替え後のスレッドで使われるデータをレジスタセットにロードする処理を減らすことが出来、性能の低下を抑制できる。また、２つの冗長スレッドは、互いに異なるレジスタセットを用いて実行されるため、それぞれのレジスタセットを構成するプログラムカウンタ、状態レジスタ及び汎用レジスタ等の故障も検出することが可能となり、共通因子故障も検出が可能となる。
【００２４】
上述した例では、ＣＰＵコア２ＡとＣＰＵコア２Ｂのそれぞれで、冗長スレッドを実行することを説明したが、例えば一方のＣＰＵコア２Ａで、２本の冗長スレッドを実行する様にしても良い。この場合には、信号２５２ＢがＣＰＵコア２Ａからシステムバス制御回路５に供給される様にすれば良い。あるいは、システムバス制御回路５に信号２５２Ａの内容を保持するバッファを設けるようにしてもよい。いずれにしても、ＣＰＵコア２Ｂは必ずしも設けなくてもよいので、小型化を図ることが可能となり、安価にすることが可能となる。
【００２５】
上述したことから理解されるであろうが、冗長スレッドとは、マイクロコントローラ１或いはＣＰＵコアの故障を診断するためのソフトウエアの実行単位であり、非冗長スレッドとは、通常の処理を実行するためのソフトウエアの実行単位である。また、スレッドを実行する際に用いられる複数種類のレジスタ（プログラムカウンタ、状態レジスタ及び汎用レジスタ等）を、１つの単位として表すために、レジスタセットと言う表現を用いている。
【００２６】
図２２の実施形態では、キャッシュメモリ４Ａ及び４Ｂが設けられている例を説明したが、キャッシュメモリ４Ａ及び４Ｂは設けなくても良い。図２２に示したマイクロコントローラ１は、半導体集積回路技術により１つの半導体チップ（半導体基板）に形成されているが、キャッシュメモリを設けない様にすれば、半導体チップの小型化を図ることが可能となり、安価にすることが可能となる。また、図２２には示されていないが、マイクロコントローラ１にはクロック発生回路が設けられており、該クロック発生回路からのクロックに従って（同期して）各ＣＰＵコアは、スレッドを切り替えながらプログラムを実行する。なお、マイクロコントローラを、データ処理装置又は半導体集積回路装置ともいう。
【００２７】
≪実施の形態１≫
図１は、第１の実施形態で、プログラム実行に必要なレジスタセットをソフトウエアの実行単位であるスレッドごとに有し、クロックごとにスレッドを切り替えて実行するマルチスレッディング計算機能を持つデュアルコアのマイクロコントローラ（ＭＣＵ）１のブロック図である。以下の説明では、診断を実施するために、２つのＣＰＵコアのそれぞれにおいて実行される１つのスレッドで同じプログラムを実行する例を説明するが、実施形態はこれに限られるものではない。１つのＣＰＵコアにおいて実行される２つのスレッドで同じプログラムを実行する形態および２種類以上の同じプログラムを４つ以上のスレッドで実行する形態にも適用可能である。
【００２８】
１．ＣＰＵコア
同図において、ＣＰＵコア２ＡとＣＰＵコア２Ｂは同一機能を有する。各ＣＰＵコアはそれぞれ４つのスレッド（スレッド番号０、スレッド番号１、スレッド番号２、スレッド番号３）を並列処理できる。
【００２９】
同図において、命令バッファ（Ｔ０Ｉ、Ｔ１Ｉ、Ｔ２Ｉ、Ｔ３Ｉ）２００、２０１、２０２、２０３は、それぞれスレッド番号０，スレッド番号１，スレッド番号２，スレッド番号３において実行される命令を一時記憶する。また、レジスタセット（Ｔ０Ｒ、Ｔ１Ｒ、Ｔ２Ｒ、Ｔ３Ｒ）２１０、２１１、２１２、２１３は、それぞれスレッド番号０，スレッド番号１，スレッド番号２，スレッド番号３が処理を実行する際に用いる。レジスタセット２１０、２１１、２１２、２１３のそれぞれは、プログラムカウンタ、汎用レジスタ、状態レジスタ等を含んでいる。書き込み回路２２０は、フェッチした命令を対応するスレッドの命令バッファ２００，２０１，２０２，２０３に書き込む。命令バッファ選択回路２２１は、スレッドに対応した命令バッファを選択する。書き込み回路２３０は、スレッドに対応したレジスタセットを４組のレジスタセットの内から選択し、命令の実行結果を選択したレジスタセット内のレジスタに書き込む。レジスタ選択回路２３１は、４組のレジスタセットから、スレッドに対応したレジスタセットを選択する。選択回路２３２は、４組のレジスタセットから、スレッドに対応したレジスタセット内のプログラムカウンタを選択し、命令フェッチアドレスを出力する。
【００３０】
同図において、デコード回路（図１においては「デコード」と表示。）２４は、命令バッファ選択回路２２１により選択されたところの命令バッファから供給されたスレッドの命令を解読し、実行回路（図１においては「実行」と表示。）２５に指示を与える。実行回路２５は、デコード回路２４からの指示に従い、レジスタ選択回路２３１が選択したところのスレッドに対応したレジスタセットを用いて、命令の実行に必要なデータをレジスタセット内のレジスタから読み出して実行する。また、フェッチした命令が、実行回路２５の実行結果をレジスタに書き戻す命令の場合には、レジスタへ書き込むべきデータがライン２５０を介して、レジスタ書き込み回路２３０に供給され、スレッドに対応したレジスタセット内のレジスタに書き戻される。
【００３１】
ライン２５１は、後述するスレッドスケジューリングレジスタ（ＴＳＲ）２６とスレッドタイプレジスタ（ＴＴＲ）２７のデータを実行回路２５が読み出しおよび／或いは書き込みを行うためのものである。実行回路２５からＣＰＵコア２Ａの外部に出力される信号２５２Ａは、後述するデータメモリ７等へのメモリアクセスのコマンド、アドレス、ライトすべきデータ、後述するスレッドのタイプの情報を含む。ＣＰＵコア２Ｂからも信号２５２Ａと同様な信号２５２Ｂが出力される。ＣＰＵコア２Ａの外部から実行回路２５に入力される信号５４Ａは、データメモリ７等へのメモリアクセスがリードの場合に当該データメモリ７等から読み出されたリードデータである。ここで、メモリアクセスにはメモリのアクセスの他に周辺モジュール内のレジスタのアクセスを含む。ＣＰＵコア２Ｂへも同様な信号５４Ｂが入力される。
【００３２】
ＴＳＲ２６には、スレッドの実行スケジュールが設定される。詳細は図２を用いて後で説明する。ＴＴＲ２７には、スレッドのタイプが設定される。このＴＴＲ２７についても、詳細は図３を用いて後で説明する。
【００３３】
図１において、スレッド選択回路（図１においては「スレッド選択」と表示。）２８は、命令フェッチと命令実行を行うスレッドを選択する。スレッド選択回路２８は、ＴＳＲ２６に設定された内容に基づいた選択信号２８０を形成し、選択回路２２１、２３１、２３２、及び書き込み回路２２０、２３０に供給する。スレッド選択回路２８からＣＰＵコア２Ａの外部に出力される信号２８１Ａは冗長スレッドの実行を示す信号（以下、「冗長スレッド信号」という。）である。ＣＰＵコア２Ｂ内のスレッド選択回路（不図示）からも同様の信号２８１Ｂが出力される。ＣＰＵコア２Ａの外部からスレッド選択回路２８に入力される信号１１０Ａは，冗長スレッドの選択を禁止する信号（以下、「冗長スレッド選択禁止信号」という。）と割り込み禁止を示す信号（以下、「冗長スレッド割込禁止信号」という。）である。ＣＰＵコア２Ｂ内のスレッド選択回路（不図示）へも信号１１０Ａと同様の信号１１０Ｂが入力される。
【００３４】
２．命令メモリ及びキャッシュメモリ
命令メモリ３はＣＰＵコア２ＡおよびＣＰＵコア２Ｂが実行する命令を記憶する。図１に示したマイクロコントローラ１は、システム（自動車等）へ組み込まれ、システムを制御するマイクロコントローラを例としている。そのため、特に制限されないが、命令メモリ３としては、フラッシュメモリが用いられている。フラッシュメモリは電気的に一括消去及び書き替えが可能な読み出し用メモリで、制御の高度化に伴い大容量化が進んでいるが、ＣＰＵコアの動作クロックが高速になると１クロックサイクルでのリードが困難になる。そこで、特に制限されないが、フラッシュメモリ用のキャッシュをマイクロコントローラ１に搭載し、ＣＰＵコアからの１サイクルでのリードを可能している。キャッシュメモリ（Ｉ＄）４ＡはＣＰＵコア２Ａ用のものであり、キャッシュメモリ（Ｉ＄）４ＢはＣＰＵコア２Ｂ用のものである。
【００３５】
３．システム制御回路及びそれによって制御される回路
同図において、システムバス制御回路５は、ＣＰＵコア２ＡおよびＣＰＵコア２Ｂからシステムバス６へのアクセスの制御を行う。システムバス６には、データメモリ７、周辺モジュール（図１においては「『周辺Ａ』……『周辺Ｚ』」と表示。）８Ａ〜８Ｚ、外部バス制御回路（図１においては「外部バス制御」と表示。）９、割り込みコントローラ１０が接続されている。同図において、信号６０はシステムバス６におけるコマンド、アドレス、ライトデータを示しており、信号６１はリードデータを示している。特に制限されないが、データメモリ７としては、ＳＲＡＭ（Static Random Access Memory）が用いられている。ＳＲＡＭのメモリセルは１対のＣＭＯＳインバータと一対のアクセスのためのＮＭＯＳトランジスタを含む。なお、データメモリ７の他にデータを格納するフラッシュメモリを設けてもよい。
【００３６】
（１）システムバス制御回路
システムバス制御回路５は、アドレスバッファ（ＡＢ、第１バッファ）５０、リードデータバッファ（ＲＤＢ、第２バッファ）５１、ライトデータバッファ（ＷＤＢ、第３バッファ）５２、比較回路（図１においては「比較」と表示。）５３を有する。図示していないが、比較回路５３はアドレスを比較する第１比較回路とデータを比較する第２比較回路とを有する。これらは、冗長スレッドの実行によりシステムバス６へのアクセスが発生した場合に機能する。図１には示されていないが、システムバス制御回路５には、後で説明する様にこれらを制御する制御回路が設けられている。
【００３７】
上述した様に、実行されるスレッドのタイプを示す情報は、ＣＰＵコア２Ａから出力される信号２５２ＡおよびＣＰＵコア２Ｂから出力される信号２５２Ｂに含まれている。
【００３８】
（ａ）非スレッド冗長の実行
信号２５２Ａが、非冗長スレッドの実行に伴うシステムバス６へのアクセスを示している場合、システムバス制御回路５は、信号２５２Ａに含まれている情報（コマンドとアドレス）をシステムバス６に出力する。システムバス６へのアクセスが、ライトに関するアクセスの場合には、信号２５２Ａに含まれている情報（ライトデータ）が更にシステムバス６に出力される。一方、このアクセスがリードの場合には、システムバス６におけるリードデータが、ＣＰＵコア２Ａへの信号５４Ａとして出力される。
【００３９】
ＣＰＵコア２Ｂについても、ＣＰＵコア２Ａと同様に、信号２５２Ｂが、非冗長スレッドの実行に伴うアクセスの場合には、信号２５２Ｂのコマンドとアドレスが、システムバス６に出力される。このアクセスがライトの場合には、信号２５２Ｂに含まれているライトデータも更にシステムバス６へ出力される。一方、このアクセスがリードの場合はシステムバス６のデータが、信号５４ＢがリードデータとしてＣＰＵコア２Ｂへ出力される。
【００４０】
システムバス６への上述したアクセスは、時間的に先に実行した命令が、例えばメモリアクセス命令で、そのアクセスが実行中である場合、実行中のアクセスが完了するまで待たされる。この例は、後で図４を用いて説明するメモリアクセスウエイトが発生した場合に相当する。図４で述べるが、先に実行した命令で、メモリアクセスを実行するＭＡステージが１サイクルで完了することができず、ＭＡ１ステージ及びＭＡ２ステージの２サイクル分ステージが延長されると、次の命令がメモリアクセス命令の場合には、その命令のＭＡステージが上記ＭＡ１ステージと重なってしまう。そのため、次の命令によるシステムバス６へのアクセスが待たされる。また、ＣＰＵコア２ＡとＣＰＵコア２Ｂから同時にメモリアクセスが発生した場合には、ＭＡステージが重なるため、メモリアクセスは同時には実行されず、１つずつ順番に実行される。
【００４１】
（ｂ）冗長スレッドの実行
一方、上記信号２５２Ａまたは信号２５２Ｂが、冗長スレッドの実行に伴うアクセスを示している場合には、次のような処理が実行される。
【００４２】
（ｉ）リードアクセス
時間的に先に実行される冗長スレッド、すなわち先行する冗長スレッドが、システムバス６へのリードアクセスの場合、システムバス６へのアクセスを実行する。すなわち、先行する冗長スレッドの実行に伴い、アドレスが形成される。形成されたアドレスは、ＡＢ５０に登録される。形成されたアドレスに従って、例えばデータメモリ７から読み出されたリードデータは、システムバス６を介してＣＰＵコアに出力される。また、このリードデータは、ＲＤＢ５１に登録される。
【００４３】
時間的に、上記先行する冗長スレッドの後に実行される冗長スレッド、すなわち後行する冗長スレッドの実行に伴いリードアクセスが生じた場合、この後行する冗長スレッドの実行に伴うリードアクセスでは、システムバス６へのアクセスは実行しない。この場合には、システムバス制御回路５において、後行する冗長スレッドの実行に伴って発生したアクセスにおけるアドレスと、ＡＢ５０とを、比較回路５３の第１比較回路が比較する。
【００４４】
比較回路５３における比較において、アドレスの比較結果が一致する場合、システムバス制御回路５は、後行する冗長スレッドの実行に伴うリードアクセスに対しては、ＲＤＢ５１に予め登録されているデータを、リードアクセスデータとしてＣＰＵコア２Ａに供給する。比較回路５３における比較において、アドレスの比較結果が不一致の場合、システムバス制御回路５は、割り込みコントローラ１０にシステムバスアクセスエラー信号５５を出力する。
【００４５】
（ｉｉ）ライトアクセス
先行する冗長スレッドの実行に伴うシステムバス６へのアクセスが、ライトアクセスの場合、システムバス制御回路５は、システムバス６へのアクセスを実行せず、上記先行する冗長スレッドを実行したＣＰＵコアからの信号２５２Ａ又は信号２５２Ｂに含まれるアドレスをＡＢ５０に登録する。また、先行する冗長スレッドを実行したＣＰＵコアからの信号２５２Ａ又は信号２５２Ｂに含まれるライトすべきデータをＷＤＢ５２に登録する。
【００４６】
後行する冗長スレッドの実行に伴い生じるアクセスがライトアクセスの場合、システムバス制御回路５は、後行する冗長スレッドを実行したＣＰＵコアからの信号２５２Ａ又は信号２５２Ｂに含まれるアドレスと、ＡＢ５０に予め登録されているアドレスとの比較を、比較回路５３の第１比較回路で実行する。また、後行する冗長スレッドを実行したＣＰＵコアからの信号２５２Ａ又は信号２５２Ｂに含まれるライトデータと、ＷＤＢ５２に予め登録されているライトデータとの比較を、比較回路５３の第２比較回路で実行する。上記例では、比較回路５３は、第１比較回路と第２比較回路を有する様に説明したが、比較回路５３は、ライトアクセス時に用いられる比較回路と、リードアクセス時に用いられる比較回路とをそれぞれ別々に有するようにしても良い。この様にすれば、比較回路の制御の簡素化を図ることが可能となる。
【００４７】
比較回路５３により、アドレスおよびライトデータが、予め登録されているアドレスおよびライトデータと一致することが検出された場合、システムバス制御回路５は、（ＡＢ）５０とＷＤＢ５２に登録されているアドレスおよびライトデータをシステムバス６へ出力する。このシステムバス６へ出力されたアドレスとライトデータにより、データメモリ７等へのライトアクセスが行われる。
【００４８】
比較回路５３により、アドレスおよびライトデータが、予め登録されているアドレスおよびライトデータと一致するかの検出が行われ、アドレスまたはライトデータが不一致の場合、システムバス制御回路５は、割り込みコントローラ１０にシステムバスアクセスエラー信号５５を出力する。特に制限されないが、比較回路５３により、不一致が検出された場合、ライトアクセスは実行されない。
【００４９】
（２）周辺モジュール
周辺モジュール８Ａは例えばアナログ入力信号８０Ａをディジタル信号に変換するＡ／Ｄ変換器である。周辺モジュール８Ｚは例えばパルス出力信号８０Ｚを発生するタイマである。
【００５０】
（３）外部バス制御回路
外部バス制御回路（図１においては「外部バス制御」と表示。）９はシステムバス６へのアクセスが、マイクロコントローラ１の外部に割り当てられたアドレス空間へのアクセスである場合、外部端子（図示しない）を介して、コマンドとアドレスを信号９０として出力し、外部端子（図示しない）を介して、データを信号９１として入力（リードの場合）し、またはデータを信号９１として出力（ライトの場合）する。
【００５１】
（４）割り込みコントローラ
割り込みコントローラ１０は、割り込み端子（図示しない）を介して、外部からの割り込み要求を信号１０２として受け付け、その応答を信号１０２として返す。すなわち、信号１０２には割り込み要求信号と割り込み応答信号が含まれる。また、ＣＰＵコア２Ａと割り込みコントローラ１０との間の信号１００Ａは、ＣＰＵコア２Ａへの割り込み要求信号とＣＰＵコア２Ａからの応答信号を含む。ＣＰＵコア２Ｂと割り込みコントローラ１０との間の信号１００Ｂも、ＣＰＵコア２Ｂへ割り込み要求信号とＣＰＵコア２Ｂからの応答信号を含む。割り込みコントローラ１０から冗長スレッド実行制御回路（図１においては「冗長スレッド実行制御」と表示。）１１への信号１０１は、冗長スレッドへの割り込み要求信号である。
【００５２】
４．冗長スレッド実行制御回路（概要）
冗長スレッド実行制御回路１１は、ＣＰＵコア２Ａによる冗長スレッドの実行を示す冗長スレッド信号２８１Ａと、ＣＰＵコア２Ｂによる冗長スレッドの実行を示す冗長スレッド信号２８１Ｂを受け、冗長スレッドの実行数を管理する。冗長スレッドの実行数を管理するために、冗長スレッド実行制御回路１１は、ＣＰＵコア２Ａに対して冗長スレッド選択禁止信号と冗長スレッド割込禁止信号１１０Ａを出力する。同様に、ＣＰＵコア２Ｂに対して冗長スレッド選択禁止信号と冗長スレッド割込禁止信号１１０Ｂを出力する。
【００５３】
冗長スレッド実行制御回路１１は、図１には示されていないが制御回路を有している。この制御回路による制御については、後で説明する図１１等を用いた説明で理解されるであろう。また、図面が複雑になるのを避けるために、図１では、上記冗長スレッド選択禁止信号と冗長スレッド割込禁止信号は、１つの符号１１０Ａ（及び符号１１０Ｂ）で示されている。
【００５４】
５．クロック発生回路
また、クロック発生回路（ＣＬＫＧ）１０００は、各ブロックにクロック信号（ＣＬＫ）１００１を供給する。各ブロックのそれぞれは、フリップフロップなどを含む順序回路と組み合わせ回路とを有し、クロック信号１００１に従ったクロックが、例えば上記順序回路に供給される。これにより、各ブロックは、クロック信号１００１に同期して動作する。
【００５５】
６．スレッド制御レジスタ
（１）スレッドスケジューリングレジスタ（ＴＳＲ）
図２には、上記スレッドスケジューリングレジスタ（ＴＳＲ）２６の構成例が示されている。ＴＳＲ２６は１６ビットのレジスタで、上位ビットから２ビットずつＳ０〜Ｓ７の８つのビット名が付けられており、ここにスレッドの番号（以下、スレッド番号と称することもある）が設定される。スレッド番号は、２進数で表すと、“００”がスレッド番号０、“０１”がスレッド番号１、“１０”がスレッド番号２、“１１”がスレッド番号３を表す。
【００５６】
スレッドは、上記８つに割り当てられたビット名Ｓ０〜Ｓ７の順に選択され、実行される。例えば、ビット名Ｓ０の２ビットに“００”が設定され、ビット名Ｓ１に“１１”が設定されれば、２進数“００”に対応するスレッド番号０が実行され、次に２進数“１１”に対応するスレッド番号３が実行される。すなわち、ＴＳＲ２６のビット名Ｓ０〜Ｓ７のそれぞれに、スレッド番号が設定され、ビット名Ｓ０→Ｓ１→Ｓ２→Ｓ３→Ｓ４→Ｓ５→Ｓ６→Ｓ７の順に、そのビット名に格納されたスレッド番号が選択され、実行される。この場合、ビット名Ｓ７の次はビット名Ｓ０に戻り、これを繰り返す。
【００５７】
（２）スレッドタイプレジスタ（ＴＴＲ）
図３には、上記スレッドタイプレジスタ（ＴＴＲ）２７の構成例が示されている。ＴＴＲ２７は、１６ビットのレジスタで、上位ビットから４ビット毎に、Ｔ０〜Ｔ３の４つのビット名が付けられており、ここにスレッド番号０〜３のそれぞれのタイプが設定される。すなわち、ビット名Ｔ０にスレッド番号０のタイプが設定され、ビット名Ｔ１にスレッド番号１のタイプが設定され、ビット名Ｔ２にスレッド番号２のタイプが設定される。同様に、ビット名Ｔ３にスレッド番号３のタイプが設定される。
【００５８】
スレッドのタイプは、２進数で表して、“００００”〜“０１１１”が非冗長スレッド、“１０００”が冗長スレッド０、“１００１”が冗長スレッド１、“１０１０”が冗長スレッド２、“１０１１”が冗長スレッド３、“１１００”〜“１１１１”が予約である。非冗長スレッドは冗長実行をしないスレッドを意味する。冗長スレッドは複数のスレッドで同じプログラムを実行するスレッドを意味する。
【００５９】
例えば、ＣＰＵコア２ＡのＴＴＲ２７は、ビット名Ｔ０＝Ｔ１＝“００００”とし、ビット名Ｔ２＝“１０００”とし、ビット名Ｔ３＝“１００１”と設定される。このとき、ＣＰＵコア２ＢのＴＴＲ２７は、ビット名Ｔ０＝“１０００”、ビット名Ｔ１＝“１００１”、ビット名Ｔ２＝Ｔ３＝“００００”と設定されたとすると、ＣＰＵコア２Ａのスレッド番号２とＣＰＵコア２Ｂのスレッド番号０とで、冗長スレッド０として同じプログラムが実行される。冗長スレッドが選択されることにより、実行に伴い生じるシステムバスアクセスにおいて、上述した様に、システムバス制御回路５が実行した結果の比較を行う。また、ＣＰＵコア２Ａのスレッド番号３とＣＰＵコア２Ｂのスレッド番号１が冗長スレッド１として、同じプログラムを実行して、上記と同様に結果の比較を行う。あとのスレッドは非冗長スレッドとして実行され、結果の比較は行われない。
【００６０】
（３）レジスタの設定
ＴＳＲ２６及びＴＴＲ２７へのスレッド番号の設定及びスレッドタイプの設定は、それらを設定するためのプログラムを実行することにより行う。設定のプログラムは、例えば、レジスタセット２１０〜２１３のうちのいずれかのレジスタセットに含まれている汎用レジスタに、スレッドの番号とそのタイプを格納し、この汎用レジスタからＴＳＲ２６及びＴＴＲ２７へデータ転送を行うようなプログラムとすれば良い。この設定のプログラムで使われるデータ転送を指示する命令は、ＣＰＵコアの基本的な動作に影響するため、安全性の観点からも専用の命令にすることが望ましい。また、ＴＳＲ２６及びＴＴＲ２７は、それぞれのＣＰＵコアに設けられているため、それぞれのＣＰＵコアにおいて上記設定のプログラムは実行される。勿論、設定するために使われる上記汎用レジスタは、上記レジスタセットに設けられている汎用レジスタとは異なるレジスタを用いるようにしても良い。
【００６１】
７．ＣＰＵコアの命令パイプライン
図４には、ＣＰＵコア２Ａ、２Ｂの命令パイプラインのタイミング例が示されている。命令パイプラインとは、同じ回路で複数の命令をオーバラップさせて実行する方法で，回路は複数のステージに分割されており、クロック信号（ＣＬＫ）１００１に従って、各ステージでは一度に１つの命令を実行する。
【００６２】
図４において、（Ａ）は、基本パイプラインを表している。ＩＡ（Ｉｎｓｔｒｕｃｔｉｏｎ  Ａｄｄｒｅｓｓ）は命令アドレスを出力するステージ、ＩＦ（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｆｅｔｃｈ）は命令をフェッチするステージである。また、Ｄ（Ｄｅｃｏｄｅ）はフェッチした命令を解読するステージ、ＥＸ（ＥＸｅｃｕｔｅ）は命令を実行するステージである。さらに、ＭＡ（Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）はメモリアクセスを実行するステージ、ＷＢ（Ｗｒｉｔｅ  Ｂａｃｋ）は命令の実行結果やメモリアクセスの実行結果をレジスタに書き戻すステージである。
【００６３】
同図において、（Ｂ）〜（Ｄ）は、パイプラインが乱れた例を表している。（Ｂ）は、命令キャッシュミスで、ＩＦステージが１サイクルで完了することができずＩＦステージが、例えばＩＦ１ステージ及びＩＦ２ステージの２サイクル分ステージを延長して，ミスした命令が読み出されるのを待っていることを表している。（Ｃ）は、マルチステップ実行で、ＥＸステージが１サイクルで完了することができず、例えばＥＸ１ステージ及びＥＸ２ステージの２サイクル分ステージを延長して、命令を実行したことを表している。マルチステップ実行の例として、乗算命令や除算命令などがある。（Ｄ）は、メモリアクセスウエイトで、ＭＡステージが１サイクルで完了することができず、例えばＭＡ１ステージ及びＭＡ２ステージの２サイクル分ステージを延長して、メモリアクセスを実行した例が示されている。メモリアクセスウエイトの例としては、アクセスに時間のかかる周辺モジュールのレジスタをリードする場合や、システムバスに対して他のＣＰＵコアのアクセスと衝突し、アクセスが待たされる場合などがある。
【００６４】
８．マルチスレッドにおけるパイプライン動作
（１）パイプラインに乱れがない場合
図５には、クロック信号（ＣＬＫ）１００１に従ってスレッドを切り替えながらプログラムを実行するマルチスレッドにおけるパイプライン処理のタイミング例が示されている。ステージは、図４で示したパイプラインと同様に、ＩＡステージからＷＢステージの６ステージである。実行されるスレッドの順番としては、スレッド番号０から３の順に実行される例を示している。この実行スケジュールを実現するために、ＴＳＲ２６の各ビット名には、次の設定がされる。すなわち、ビット名Ｓ０＝Ｓ４＝スレッド番号０、ビット名Ｓ１＝Ｓ５＝スレッド番号１、ビット名Ｓ２＝Ｓ６＝スレッド番号２、ビット名Ｓ３＝Ｓ７＝スレッド番号３が設定される。
【００６５】
図５では、図１に示したブロック図との関係を分かり易くするために、各波形の左側に、パイプラインにおけるステージ名とそのステージに関連する図１の符号が並記されている。これ以降に説明する図面においても、同様に並記をするので、図５を用いて、並記の例を説明しておく。
【００６６】
図５において、記号ＩＡの右側に付されている括弧内の数字は、図１におけるプログラムカウンタ選択回路の符号２３２を表している。以下同様に、図５において記号ＩＦの括弧内の数字は、図１における命令バッファ書き込み回路の符号２２０を表している。記号Ｄの括弧内の数字は、図１における命令バッファ選択回路、レジスタ選択回路、デコード回路のそれぞれの符号２２１，２３１，２４を表している。記号ＥＸの括弧内の数字は、図１における実行回路の符号２５を表している。記号ＭＡの括弧内の英数字２５２Ａ／Ｂは、図１におけるＣＰＵコア２ＡおよびＣＰＵコア２Ｂからシステムバス制御回路５への信号の符号２５２Ａ，２５２Ｂを表しており、数字６０は図１におけるシステムバス６のコマンド、アドレス、ライトデータの符号６０を表している。記号ＷＢの括弧内の数字６１は、図１におけるシステムバス６のリードデータの符号６１を表し、英数字５４Ａと５４Ｂは、図１におけるシステムバス制御回路５からＣＰＵコア２ＡおよびＣＰＵコア２Ｂへのリードデータの符号５４Ａ及び５４Ｂを表している。また、数字２５０は、図１におけるレジスタ書き込みデータの符号２５０を表し、数字２３０は、図１における実行結果のレジスタ書き込み回路の符号２３０を表している。
【００６７】
また、上記パイプラインの各ステージに記載されている数字０から３は、そのステージに入っているスレッドの番号を示している。ＣＬＫ波形の上側にＣＬＫの立ち下がりごとに付されている数字はクロックサイクル番号（ＣＬＫＮＯ）を示している。
【００６８】
図５では、パイプラインの乱れが無い例を示しており、例えば、スレッド番号０における命令が、ＣＬＫＮＯが１から６へと変化するのに従って、ＩＡステージからＷＢステージへと順次移り、実行される。同様に、スレッド番号０における次命令が、ＣＬＫＮＯが５から１０へと順次変化するのに従って、ＩＡステージからＷＢステージへと順次移り、実行される。他のスレッド番号における命令も同様に実行される。
【００６９】
また、図５では、例えばＣＰＵコア２Ａのパイプラインのタイミングが示されているだけであるが、他のＣＰＵコア２Ｂについても、同様なパイプライン動作が行われる。パイプラインのタイミングに関する以下の説明で、特に２つのＣＰＵコアを分けて説明しない限り、タイミングは２つのＣＰＵコアにおいて同様であると理解して頂きたい。
【００７０】
（２）命令キャッシュミスが発生した場合
図６には、マルチスレッドのパイプライン処理において命令キャッシュミスが発生したときのタイミング例が示されている。ＣＬＫＮＯ＝３のクロックサイクルで、スレッド番号１における命令フェッチでキャッシュミスが発生したため、ＣＬＫＮＯ＝４及び５でＩＦステージが延長する。ＣＬＫＮＯ＝４ではスレッド番号１の命令をデコードするスケジュールであったが、命令バッファに命令が準備できていないため、デコードするＤステージを取り止める。次のＣＬＫＮＯ＝５でスレッド番号２の命令をデコードする例を示している。しかし、ＣＬＮＯＫ＝４でスレッド番号２の命令バッファ２０２に命令があれば、その命令を前倒ししてデコードするように回路を設計することは可能であり、その方がパイプライン処理の空きが減り性能が向上するので望ましい。スレッド番号１のキャッシュミスした命令はＣＬＫＮＯ＝５で命令バッファ２０１にフェッチされ、次にスレッド番号１の命令をデコードするスケジュールとなるＣＬＫＮＯ＝８でデコードが行われる。このように、命令キャッシュミスによって命令パイプライン処理が乱れることがある。
【００７１】
（３）マルチステップ実行が発生した場合
図７には、マルチスレッドのパイプライン処理においてマルチステップ実行が発生したときのタイミング例が示されている。ＣＬＫＮＯ＝４のクロックサイクルで、スレッド番号１の命令をデコードした結果、マルチステップ実行であることが分かり、ＣＬＫＮＯ＝５のＥＸステージの後に、２サイクルのＥＸステージが追加される。また、ＣＬＫＮＯ＝５及び６でのＤステージを取り止める。スレッド番号１のＥＸステージが延長すると、続くメモリアクセスとライトバックの実行が遅れる。このように、マルチステップ実行によって命令パイプライン処理が乱れることがある。
【００７２】
（４）メモリアクセスウエイトが発生した場合
図８には、マルチスレッドのパイプライン処理においてメモリアクセスウエイトが発生したときのタイミング例が示されている。ＣＬＫＮＯ＝６のクロックサイクルで、スレッド番号１のメモリアクセスでウエイトが発生し、ＣＬＫＮＯ＝７及び８にＭＡステージが追加される。リードアクセスのため、ＣＬＫＮＯ＝７で実行する予定だったレジスタへの書き戻しは、ＣＬＫＮＯ＝１１で行われる例を示している。ＣＬＫＮＯ＝１０ではスレッド番号１の次のメモリアクセスが実行されるが、ＣＬＫＮＯ＝１１でライトバックを実行できないため、ＣＬＫＮＯ＝１１のＤステージ、ＥＸステージ及びＭＡステージのパイプライン処理を取り止め、次のＣＬＫＮＯ＝１２でＷＢステージを実行する。このように，メモリアクセスウエイトによって命令パイプライン処理が乱れることがある。
【００７３】
９．非冗長スレッドの実行においてメモリアクセスする場合の動作
図９には、非冗長スレッドで、メモリにアクセスする場合のタイミング例が示されている。同図には、ＣＰＵコア２Ａ及びＣＰＵコア２Ｂのパイプラインに関するタイミングと、図１におけるシステムバス制御回路５のタイミングと、システムバス６のタイミングが示されている。ＣＰＵコア２Ａのパイプラインに関するタイミングは、図９において２Ａとして示されており、ＣＰＵコア２Ｂのパイプラインに関するタイミングは、２Ｂとして示されている。システムバス制御回路５のタイミングは、アドレスバッファ５０がＡＢ（５０）として、リードデータバッファ５１がＲＤＢ（５１）として、ライトバッファ５２がＷＤＢ（５２）として、比較回路５３が比較（５３）として示されている。また、これらのタイミングを纏めて、５として示してある。システムバス６のタイミングは、コマンド６０、アドレス６０、ライトデータ６０が「ＣＭＤ，Ａ，ＷＤ（６０）」として、リードデータ６１がＲＤ（６１）として示されている。また、これらのタイミングを纏めて、６として示してある。後で説明する図１０についても、同様の表示方法を採用している。
【００７４】
図９において、ＣＰＵコア２Ａのスレッド番号１とＣＰＵコア２Ｂのスレッド番号１はそれぞれ非冗長スレッドである。ＣＰＵコア２ＡのＣＬＫＮＯ＝２のデコードステージＤの命令は、上記スレッド番号１の非冗長スレッドにおける命令であり、メモリリードの命令であるとする。ＣＬＫＮＯ＝６のデコードステージＤの命令は、スレッド番号１の非冗長スレッドにおける命令であり、メモリライトの命令であるとする。一方、ＣＰＵコア２ＢのＣＬＫＮＯ＝４のデコードステージＤの命令は、スレッド番号１の非冗長スレッドにおける命令であり、メモリリードの命令であるとする。ＣＬＫＮＯ＝９のデコードステージＤの命令は、スレッド番号１の非冗長スレッドにおける命令であり、メモリライトの命令であるとする。
【００７５】
（ａ）ＣＰＵコア２Ａのメモリリード（図９では「ＣＰＵＡリード」と表示）
ＣＰＵコア２ＡがＣＬＫＮＯ＝４でメモリアクセス（リード）を実行すると、システムバス制御回路５を介して、システムバス６にコマンド６０、アドレス６０が出力される（期間Ａ１−１）。このメモリアクセス（リード）に応答して、ＣＬＫＮＯ＝５でシステムバス６のリードデータ６１がＣＰＵコア２Ａに読み込まれ、ＣＰＵコア２Ａ内のスレッド番号１に対応するレジスタセット内のレジスタ（例えば汎用レジスタ）にライトバックされる（期間Ａ１−１）。
【００７６】
（ｂ）ＣＰＵコア２Ｂのメモリリード（図９では「ＣＰＵＢリード」と表示）
ＣＰＵコア２ＢがＣＬＫＮＯ＝６でメモリアクセス（リード）を実行すると、システムバス６にコマンド６０、アドレス６０が出力される（期間Ｂ１−１）。ＣＬＫＮＯ＝７でシステムバス６のリードデータ６１がＣＰＵコア２Ｂに読み込まれ、ＣＰＵコア２Ｂ内のスレッド番号１に対応するレジスタセット内のレジスタ（例えば汎用レジスタ）にライトバックされる（期間Ｂ１−１）。
【００７７】
（ｃ）ＣＰＵコア２Ａのメモリライト（図９では「ＣＰＵＡライト」と表示）
次に、ＣＰＵコア２ＡがＣＬＫＮＯ＝８でメモリアクセス（ライト）を実行すると、システムバス制御回路５を介して、システムバス６にコマンド６０、アドレス６０、ライトデータ６０が出力される（期間Ａ１−２）。
【００７８】
（ｄ）ＣＰＵコア２Ｂのメモリライト（図９では「ＣＰＵＢライト」と表示）
ＣＰＵコア２ＢがＣＬＫＮＯ＝１１でメモリアクセス（ライト）を実行すると、システムバス６にコマンド６０、アドレス６０、ライトデータ６０が出力される（期間Ｂ１−２）。
【００７９】
１０．冗長スレッドの実行においてメモリアクセスをする場合の動作
図１０には、冗長スレッドの実行においてメモリアクセスが発生した場合のタイミング例が示されている。図面の表記方法については、図９を参照して頂きたい。
【００８０】
図１０に示されているタイミング例は、ＣＰＵコア２Ａのスレッド番号１とＣＰＵコア２Ｂのスレッド番号１が冗長スレッドである場合を示している。また、このとき、ＣＰＵコア２ＡのＣＬＫＮＯ＝２のＤステージの命令は、スレッド番号１の冗長スレッドにおける命令で、メモリリードの命令であるとする。また、ＣＬＫＮＯ＝６のＤステージの命令は、スレッド番号１の冗長スレッドにおける命令で、メモリライトの命令であるとする。一方、ＣＰＵコア２ＢのＣＬＫＮＯ＝４のＤステージの命令は、スレッド番号１の冗長スレッドにおける命令で、メモリリードの命令であるとする。ＣＬＫＮＯ＝９のＤステージの命令は、スレッド番号１の冗長スレッドにおける命令で、メモリライトの命令であるとする。
【００８１】
（ａ）ＣＰＵコア２Ａのメモリリード（図１０では「ＣＰＵＡリード」と表示）
図１０において、ＣＰＵコア２ＡがＣＬＫＮＯ＝４でメモリアクセス（リード）を実行すると、システムバス６にコマンド６０、アドレス６０を出力する（期間Ａ１−１）。冗長スレッドの実行であるため、システムバス制御回路５は、アドレスバッファ５０に、そのときのアドレスを登録する（期間Ａ１−１）。ＣＬＫＮＯ＝５でシステムバス６のリードデータ６１がＣＰＵコア２Ａに読み込まれ，スレッド番号１に対応するレジスタセット内のレジスタにライトバックされる（期間Ａ１−１）。また、このとき、システムバス制御回路５は、リードデータバッファ５１にリードデータを登録する（期間Ａ１−１）。
【００８２】
（ｂ）ＣＰＵコア２Ｂのメモリリード
ＣＰＵコア２ＢがＣＬＫＮＯ＝６でメモリアクセス（リード）を実行すると、冗長スレッドの実行であるため、システムバス制御回路５は、ＣＬＫＮＯ＝６において形成されるアドレスとアドレスバッファ５０（ＡＢ（５０））に格納されているアドレスとの比較を比較回路５３で実行する（期間１−１）。このとき、システムバス制御回路５は、システムバス６へのコマンド６０、アドレス６０の出力を行わない。ＣＬＫＮＯ＝７で、ライトデータバッファ５１からのデータがＣＰＵコア２Ｂに読み込まれ、スレッド番号１に対応するレジスタセット内のレジスタにライトバックされる。このように、冗長スレッドの実行において、メモリリードアクセスが発生した場合は、先行するスレッドのリードアクセスのみが実行され、そのリードデータを後行のスレッドに読み込ませることによりデータが同一となるようにできる。また、上記比較回路５３における比較において、アドレスの比較結果が不一致の場合、システムバス制御回路５は、割り込みコントローラ１０にシステムバスアクセスエラー信号５５を出力する。
【００８３】
（ｃ）ＣＰＵコア２Ａのメモリライト（図１０では「ＣＰＵＡライト」と表示）
次に、ＣＰＵコア２ＡがＣＬＫＮＯ＝８でメモリアクセス（ライト）を実行すると，冗長スレッドのため、システムバス制御回路５は、このときのアドレスをアドレスバッファ５０に登録する（期間Ａ１−２）。また、このとき、ライトすべきライトデータは、ライトデータバッファ５２に登録する（期間Ａ１−２）。
【００８４】
（ｄ）ＣＰＵコア２Ｂのメモリライト
ＣＰＵコア２ＢがＣＬＫＮＯ＝１１でメモリアクセス（ライト）を実行すると、冗長スレッドのため、システムバス制御回路５は、このときのライトアドレスとアドレスバッファ５０に格納されているアドレスとの比較を比較回路５３で実施する（期間１−２）。また、システムバス制御回路５は、このときのライトデータとライトバッファ５２に格納されているデータとの比較を比較回路５３で実施する（期間１−２）。比較回路５３による比較結果が一致の場合、次のＣＬＫＮＯ＝１２でシステムバス６にコマンド６０、アドレス６０、ライトデータ６０を出力する（期間Ａ１−２）。このように、冗長スレッドでのメモリライトは、先行するスレッドと後行のスレッドのアクセス情報（アドレス、ライトデータ）を比較した後で実行する。これにより、アドレスの不一致またはライトデータの不一致となるような不正なメモリライトを防ぐことができる。
【００８５】
１１．冗長スレッド実行制御回路
（１）状態遷移
図１１には、図１における冗長スレッド実行制御回路１１の状態遷移の例が示されている。同図において、―Ｎ、−１、０、＋１、＋Ｎ等の状態は、冗長スレッドにおける命令の実行数の差（ＣＰＵコア２Ａ―ＣＰＵコア２Ｂ）を意味する。同図において、ＣＰＵＡはＣＰＵコア２Ａを、ＣＰＵＢはＣＰＵコア２Ｂを示している。図３において、ＴＴＲ２７にはスレッド番号０〜３に、それぞれスレッドのタイプを設定する旨を説明した。この実施の形態では、４つのスレッドを切り替えながら実行出来る。４つのスレッドの全てに対して、スレッドのタイプを冗長スレッドとして設定することも可能である。図１１に示す遷移は、１つの冗長スレッドに対する遷移である。４つのスレッドに対して冗長スレッドを設定出来る様に、この実施の形態では、図１１に示す状態遷移が、各スレッド毎に実行出来る様に、冗長スレッド実行制御回路１１は構成されている。各スレッドにおいて、互いに異なる冗長スレッドを実行出来る様に、この状態遷移は互いに独立しているが、状態遷移の内容は互いに同じであるため、以下では１つの状態遷移について説明する。この実施の形態のように、スレッド毎に状態遷移を設けるのではなく、特定のスレッド（例えばスレッド番号０と１）に対してのみ冗長スレッドが設定出来る様に制限をすれば、状態遷移による管理を低減出来るので、小型化を図ることも可能である。
【００８６】
さて、図１０では、冗長スレッドの実行に際して発生するメモリアクセスについて、バッファを用いた動作の説明をした。図１０では述べていないが、バッファであるアドレスバッファ（ＡＢ）５０、リードデータバッファ（ＲＤＢ）５１、ライトデータバッファ（ＷＤＢ）５２は、２つのＣＰＵコアで冗長スレッドを実行する際に、該冗長スレッドにおける命令の実行数の差に応じた数だけ必要になる。
【００８７】
例えば、冗長スレッドにある第１のメモリアクセス命令をＣＰＵコア２Ａが実行し、続いて冗長スレッドにある別の第２のメモリアクセス命令をＣＰＵコア２Ａが実行し、その後で上記冗長スレッドにある上記第１のメモリアクセス命令をＣＰＵコア２Ｂが実行する場合、ＣＰＵコア２ＡとＣＰＵコア２Ｂとの間で命令の実行の数（命令実行数）に差が生じる。上記第１のメモリアクセス命令が、２つの冗長スレッドで同時に実行されれば、命令実行数が０であるが、上記の様に、第１のメモリアクセス命令が第１のスレッドで実行され、次に別の第２のメモリアクセス命令が第１のスレッドで実行され、その後で第１のメモリアクセス命令が第２のスレッドで実行される場合では、命令実行数の差が２となる。この様に命令実行数に差が生じると、上記第１の命令の実行結果の比較と、上記別の第２の命令の実行結果の比較とを実施出来る様にするためには、スレッド毎に、複数のアドレス及び複数のデータを格納しておくための、バッファが必要とされる。また、後の説明から理解されるであろうが、例えば上記第１のメモリアクセス命令が、ＣＰＵコア２ＡとＣＰＵコア２Ｂで交互に実行されれば、命令実行数の差は１となる。
【００８８】
ＣＰＵコアがリセットされると、ＣＰＵコア２ＡとＣＰＵコア２Ｂの冗長スレッドの実行数はいずれも０であり、実行数の差は０となる。これが図１１の状態＝０に相当する。図１において、ＣＰＵコア２Ａのスレッド選択回路２８から冗長スレッド実行信号２８１Ａが出力されると状態は１増加し、図１１の状態＋１となる。この後、ＣＰＵコア２Ｂのスレッド選択回路２８から冗長スレッド実行信号２８１Ｂが出力されると、状態は１減少し、図１１において、状態＋１から状態０へ変化する。すなわち、連続して冗長スレッド実行信号２８１Ａと冗長スレッド実行信号２８１Ｂが出力されると、状態は＋１へ変化した後、状態０へ戻り、変化しない。
【００８９】
同図において、状態の最小値−Ｎは、ＣＰＵコア２ＡがＣＰＵコア２Ｂより冗長スレッドにおける命令実行数がＮだけ少ないことを意味する。一方、状態の最大値＋Ｎは、ＣＰＵコア２ＡがＣＰＵコア２Ｂより冗長スレッドにおける命令実行がＮだけ多いことを意味する。
【００９０】
図１の冗長スレッド実行制御回路１１は、図１１の遷移図に示されている様に、冗長スレッドにおける命令実行数の差が、上記最大値＋Ｎ及び最小値−Ｎのいずれかに達したとき、冗長スレッド選択禁止信号１１０Ａ或いは冗長スレッド選択禁止信号１１０Ｂを形成する様に構成される。これにより、冗長スレッドの実行において、命令実行数差が、上記最小値−Ｎに達した場合、冗長スレッド実行制御回路１１はＣＰＵコア２Ｂに冗長スレッド選択禁止信号１１０Ｂを出力する。一方、命令実行数差が、上記最大値Ｎに達した場合、冗長スレッド実行制御回路１１はＣＰＵコア２Ａに冗長スレッド選択禁止信号１１０Ａを出力する。冗長スレッド選択禁止信号１１０Ａ、１１０Ｂが、ＣＰＵコア２Ａ、２Ｂに供給されると、それぞれのＣＰＵコア内のスレッド選択回路２８は、冗長スレッドに割り当てられたスレッドの選択をしないようにする。
【００９１】
（２）Ｎ＝１の場合の状態遷移
図１２には、図１１に示した状態遷移において、上記最大値＋Ｎと最小値−Ｎを、１とした例の状態遷移が示されている。この場合、冗長スレッドにおける命令の実行数差が、２に達すると、上記冗長スレッド選択禁止信号１１０Ａまたは冗長スレッド選択禁止信号１１０Ｂが、冗長スレッド実行制御回路１１から出力される。これにより、ＣＰＵコア２ＡとＣＰＵコア２Ｂの両者における冗長スレッドでの命令実行数は同じか、或いは１つだけ異なる様に制限される。すなわち、冗長スレッドにおける命令実行数の差は、１以内に制限される。
【００９２】
この様にすることにより、図１に示したシステムバス制御回路５内に設けるアドレスバッファ（ＡＢ）５０、リードデータバッファ（ＲＤＢ）５１、ライトデータバッファ（ＷＤＢ）５２は、スレッド当たり、それぞれ１段で良くなり、半導体チップにおける回路面積の増加を抑制することが出来る。また、スレッド当たり１段で済むため、それを制御する構成についても簡素化を図ることが可能となる。上記冗長スレッド実行制御回路１１は、冗長スレッドにおける命令実行数の差が所定値内になる様に、一方のＣＰＵコアによる冗長スレッドの命令実行を制限するため、制限回路と見なすことも出来る。
【００９３】
図１では、図面を分かり易くするために、システムバス制御回路５が、アドレスバッファ５０、リードデータバッファ５１、ライトデータバッファ５２、比較回路５３を含む様に示されているが、より詳細には図２１に示されている様に、それぞれが複数組のバッファ及び比較回路を含んでいる。すなわち、アドレスバッファ５０、リードデータバッファ５１、ライトデータバッファ５２、比較回路５３のそれぞれは、スレッドの数に対応した単位バッファ及び比較回路を含んでいる。例えば、スレッド番号０に対しては、単位アドレスバッファ（ＵＡＢ）５０Ａ、単位リードデータバッファ（ＵＲＤＢ）５１Ａ、単位ライトデータバッファ（ＵＷＤＢ）５２Ａ及び単位比較回路５３Ａが設けられており、他のスレッド番号１、２及び３に対しても単位バッファ及び単位比較回路が設けられている。
【００９４】
（３）Ｎ＝１の場合の動作例
図１３には、図１２に示した状態遷移を達成する機能を有する冗長スレッド実行制御回路１１の動作タイミングチャートが示されている。同図において、英数字２Ａ及び２Ｂは、ＣＰＵコア２Ａ及び２Ｂを示しており、数字１１は実行制御回路１１から出力される信号及び冗長スレッドにおける命令実行数を示している。また、同図において、Ｄはデコードステージを示しており、他の図面と同様に、デコードステージに入ったスレッドの番号も記載されている。この図からも理解される様に、スレッドは、スレッド番号０から３に順次実行される。
【００９５】
図１３に示したタイミングチャートは、ＣＰＵコア２Ａのスレッド番号１とＣＰＵコア２Ｂのスレッド番号１が冗長スレッドである場合を示している。また、冗長スレッドの実行数は、最初は０であるとする。ＣＬＫＮＯ＝２で、ＣＰＵコア２Ａが冗長スレッドの命令を実行すると、冗長スレッド実行信号（図１３、図１４、図１６、図１７、図１８において「冗長スレッドＡ」と表示。）２８１Ａが出力される。これにより、冗長スレッド実行制御回路１１において冗長スレッド実行数は０から１になり、冗長スレッド実行制御回路１１は、ＣＰＵコア２Ａに対して冗長スレッド選択禁止信号（図１３、図１４、図１６、図１７、図１８において「冗長スレッド選択禁止Ａ」と表示。）１１０Ａを出力する。ＣＬＫＮＯ＝６で、ＣＰＵコア２Ａにおいて実行されるべきスレッドとしてスレッド番号１（冗長スレッド）が選択される。しかしながら、このとき、ＣＰＵコア２Ａには冗長スレッド選択禁止信号１１０Ａが供給されているため、ＣＬＫＮＯ＝６でのスレッドの実行は禁止される。実行が禁止されるため、スレッドが削除されたと見なすこともできる。すなわち、冗長スレッド選択禁止信号１１０Ａにより、次のクロックサイクルで冗長スレッドが選択されるのが禁止される。同図では、ＣＬＫＮＯが２から６の間も、冗長スレッド選択禁止信号１１０Ａが出力されているが、ＣＬＫＮＯ＝３、４、５、７で実行される様に割り当てられているスレッド番号２、３、０、２（非冗長スレッド）の選択に影響しない。これは、上述したＴＴＲ２７に冗長スレッドを表す情報が設定されている場合のみ、冗長スレッド選択禁止信号１１０Ａにより、スレッドの選択を禁止する様にすれば良い。この様にして、冗長スレッドであるため、ＣＬＫＮＯ＝６でのスレッド番号１の選択は禁止される。
【００９６】
次に、ＣＬＫＮＯ＝７において、ＣＰＵコア２Ｂが冗長スレッドを選択すると、冗長スレッド実行信号（図１３、図１４、図１６、図１７、図１８において「冗長スレッドＢ」と表示。）２８１Ｂが、ＣＰＵコア２Ｂから出力される。この冗長スレッド実行信号２８１Ｂを受けて、冗長スレッド実行制御回路１１における冗長スレッドでの命令実行数の差は０となり、冗長スレッド選択禁止信号１１０Ａが取り下げられる。
【００９７】
次に、ＣＬＫＮＯ＝９でＣＰＵコア２Ｂが冗長スレッドを選択すると、冗長スレッドでの命令実行数の差が−１となり、冗長スレッド実行制御回路１１から冗長スレッド選択禁止信号（図１３、図１４、図１６、図１７、図１８において「冗長スレッド選択禁止Ｂ」と表示。）１１０Ｂ）が出力される。ＣＬＫＮＯ＝１１で、ＣＰＵコア２Ｂはスレッド番号１の冗長スレッドを選択しようとするが、冗長スレッド選択禁止信号１１０ＢによりＣＬＫＮＯ＝１１のスレッド番号１の選択が禁止される。この冗長スレッド禁止信号１１０Ｂによる冗長スレッドの禁止は、ＣＰＵコア２ＡがＣＬＫＮＯ＝１２でスレッド番号１を選択することにより、解除される。ＣＰＵコア２Ｂについても、ＣＰＵコア２Ａと同様に、冗長スレッド選択禁止信号１１０Ｂが、ＣＬＫＮＯ＝１０においても発行されているが、スレッド番号０は選択され、実行される。
【００９８】
（４）Ｎ＝１の場合の変形動作例
図１４には、上記冗長スレッド実行制御回路１１及びスレッド選択回路２８の他の動作タイミングチャートが示されている。冗長スレッド実行制御回路１１は、ＣＬＫＮＯ＝６でＣＰＵコア２Ａのスレッド番号１の選択を禁止する。この禁止を受けて、スレッド選択回路２８は、次に実行を予定しているスレッド番号２を前倒しして選択し、スレッド番号２を実行する。同様に、ＣＬＫＮＯ＝１１でＣＰＵコア２Ｂのスレッド番号１の選択を禁止し、次に実行を予定しているスレッド番号０を前倒しして実行する。この様にすれば、選択が禁止された冗長スレッドのパイプラインステージで、非冗長スレッドの命令を実行できるため、処理性能を向上させることができる。
【００９９】
（５）冗長スレッド選択禁止信号及び冗長スレッド実行信号の変形例
図１では、各ＣＰＵコアのそれぞれが４つのスレッドを実行出来、４つのスレッドに対して、１つの冗長スレッド選択禁止信号１１０Ａ（１１０Ｂ）と、１つの冗長スレッド実行信号２８１Ａ（２８１Ｂ）を用いる例が示されている。しかしながら、スレッドの１つに対して１つの冗長スレッド選択禁止信号１１０Ａ（１１０Ｂ）と、１つの冗長スレッド実行信号２８１Ａ（２８１Ｂ）を用いる様にしても良い。この場合には、４つのスレッドのそれぞれに対して、図１１或いは図１２に示した状態遷移を、独立に設け、独立に設けた状態遷移（図１１、図１２）に、そのスレッドに対応した１つの冗長スレッド実行信号が供給され、対応したスレッドに対して１つの冗長スレッド選択信号を供給する様にすれば良い。この様にすることにより、各スレッド毎の制御の簡略化を図ることが可能となる。例えば、１つの冗長スレッドを選択しないように、そのスレッドに対応する冗長スレッド選択信号が禁止を表しているとき、他のスレッドに対する冗長スレッド選択信号はスレッドの選択を許可する様に出来る。
【０１００】
（６）冗長スレッド実行制御回路の変形例
図１５には、冗長スレッド実行制御回路の変形例が示されている。同図には、図１１に示した状態遷移において、最大値＋Ｎ及び最小値−Ｎを２とした場合の状態遷移が示されている。ＣＰＵコア２ＡとＣＰＵコア２Ｂの冗長スレッドにおける命令の実行数は同じか、１或いは２だけ異なる。この場合、システムバス制御回路５内のアドレスバッファ５０（ＡＢ）、リードデータバッファ５１（ＲＤＢ）、ライトデータバッファ５２（ＷＤＢ）は、それぞれ２段必要になる。命令実行数の差が、最小値−２と最大値＋２だけでなく，−１と＋１の場合も冗長スレッドの選択禁止信号１１０Ａ、１１０Ｂを出力する。冗長スレッドの選択禁止信号１１０Ａ、１１０Ｂは２サイクル後における冗長スレッドの選択を禁止する。冗長スレッド実行信号２８１Ａ、２８１Ｂから冗長スレッド選択禁止までを２サイクルで実行すれば良いため、図１２の状態遷移に比べて、上記制御を行うために必要な回路を、２サイクルのステージに分けて持つことができ、動作周波数を下げる要因であるクリティカルパスとなるのを回避できる。
【０１０１】
図１６には、図１５に示した状態遷移を実現する冗長スレッド実行制御回路１１の動作タイミングチャートが示されている。図１３に示したタイミングチャートと比較することにより理解できるように、図１５及び図１６に示したこの例では、冗長スレッド選択禁止信号１１０Ａ、１１０Ｂにより２サイクル後の冗長スレッドの選択が禁止される。図１６では、冗長スレッドの選択禁止信号１１０Ａが出力されているＣＬＫＮＯ＝６においてもスレッドの実行は禁止されないことが示されている。
【０１０２】
図１７には、上記冗長スレッド実行制御回路１１及びスレッド選択回路２８の他の動作タイミングチャートが示されている。図１４に示した動作タイミングチャートの説明から理解される様に、冗長スレッドの選択を禁止したステージで、次に実行を予定しているスレッドが前倒しして実行される。
【０１０３】
（７）冗長スレッドで例外が発生した場合
図１８には、冗長スレッドで例外が発生した場合の冗長スレッド実行制御回路１１の動作タイミングチャートが示されている。例外としては、未定義命令、０除算（除算命令の実行において割る数が０）、メモリエラー（パリティまたはＥＣＣなどの検査情報が付加されたメモリで、リードの際の検査でエラーが発生）などがある。例外の発生は、ＣＰＵコアに依存する。そのため、冗長スレッドの実行中に例外が発生したとしても、その例外に対する例外処理は、例外が発生したＣＰＵコアのみで実行される。ここでは、ＣＰＵコア２Ａが、ＣＬＫＮＯ＝２のスレッド番号１（冗長スレッド）で例外が発生し、ＣＬＫＮＯ＝６のスレッド番号１は例外処理であるとする。ＣＬＫＮＯ＝２で冗長スレッドが選択されるため、冗長スレッドにおける命令実行数が＋１となり、ＣＰＵコア２Ａは冗長スレッドの選択が禁止となる（図１３の説明参照）。例外処理は、一方のＣＰＵコアで実行される処理であるため、複数のスレッドで同じ処理を行う冗長スレッドではなく、非冗長スレッドみなされ、実行される。すなわち、ＣＬＫＮＯ＝６のスレッドは非冗長スレッドとされて、ＣＬＫＮＯ＝６のスレッドで例外処理が実行される。例外処理であるため、ＴＴＲ２７の設定も変更せず、冗長スレッド実行信号２８１Ａも出力されない。例外処理が終了し，ＣＬＫＮＯ＝１２でスレッド番号１を冗長スレッドとして実行するため，冗長スレッド実行信号２８１Ａを出力する。このように、冗長スレッドの例外処理を実行することができる。例外が発生した際にも診断が可能となる。図１８では、例外処理が１サイクルで終了するように示されているが、その終了までに複数サイクルを要する場合もある。この場合には、ＣＬＫＮＯ＝１２のスレッドも非冗長スレッドとされ、例外処理が実行される。
【０１０４】
（８）冗長スレッドで割り込みが発生した場合
図１９には、冗長スレッドで割り込みが発生した場合の冗長スレッド実行制御回路１１の動作タイミングチャートが示されている。割り込みとしては、Ａ／Ｄ変換器（周辺モジュール８Ａ）やタイマ（周辺モジュール８Ｚ）などの周辺モジュールからの割り込み、マイクロコントローラ１の外部端子からの割り込みがある。割り込み処理をＣＰＵコア２Ａ及びＣＰＵコア２Ｂのそれぞれの冗長スレッドで実行させるために、割り込み要求は、ＣＰＵコア２ＡとＣＰＵコア２Ｂとが、同一命令となったときに、受け付ける様にする。この様な冗長スレッドの選択及び制御を実行するために、冗長スレッド実行制御回路１１には、次のような動作を実行する制御回路が設けられる。冗長スレッド実行制御回路１１から出力される冗長スレッド割込禁止信号（図１９においては「冗長スレッド割込禁止」と表示。）１１０Ａ、１１０Ｂは、冗長スレッドにおける命令の実行数差と冗長スレッド割込要求信号（図１９においては「冗長スレッド割込要求」と表示。）１０１に基づいて形成される。すなわち、命令の実行数差＝０で、冗長スレッド割込要求信号１０１＝０のとき、冗長スレッド割込禁止信号１１０Ａ、１１０Ｂが０となるようにし、命令の実行数差≠０で、冗長スレッド割込要求信号１０１＝０のときに、冗長スレッド割込禁止信号１１０Ａ、１１０Ｂが１になる様にする。また、命令の実行数差＝０で、冗長スレッド割込要求信号１０１＝１で、冗長スレッド割込禁止信号１１０Ａ、１１０Ｂが０になり、ここでＣＰＵコア２ＡとＣＰＵコア２Ｂが、冗長スレッドで、割り込みを受け付け可能になる様にする。この後、冗長スレッド割込禁止信号１１０Ａ、１１０Ｂは、冗長割込要求信号１０１が０になるまで、０の状態を維持する様にする。
【０１０５】
上述した構成により、ＣＬＫＮＯ＝２でＣＰＵコア２Ａが冗長スレッドを選択し、冗長スレッドにおける命令実行数が＋１になると、冗長スレッド割込禁止信号１１０Ａ，１１０Ｂが出力される（１となる）。次にＣＬＫＮＯ＝４において、冗長スレッドでの割込要求信号１０１が、割り込みコントローラ１０から出力されるが、命令実行数差が０でないため、この割り込みは受け付けられない。ＣＬＫＮＯ＝７でＣＰＵコア２Ｂが冗長スレッドを選択すると、冗長スレッドにおける命令の実行数差が０になり、冗長スレッド実行制御回路１１は、冗長スレッド割込禁止信号１１０Ａ，１１０Ｂを取り下げる（０にする）。冗長スレッド割込禁止信号１１０Ａ、１１０Ｂの取り下げにより、ＣＬＫＮＯ＝９でＣＰＵコア２Ｂが冗長スレッドを選択し，割り込みを受け付ける。一方、ＣＬＫＮＯ＝１２でＣＰＵコア２Ａが冗長スレッドを選択し、割り込みを受け付ける。このようにすることで、冗長スレッドが同一の命令で割り込みを受け付けできるようになる。割り込みが発生した際にも診断が可能となる。
【０１０６】
≪実施の形態２≫
図２０には、上記実施の形態１で説明したマイクロコントローラが用いられたシステムの例が示されている。この例は、故障検出機能を持つマルチスレッディングのマイクロコントローラを搭載した電子制御装置を使用した自動車である。自動車１２において、モータ１３を制御する電子制御装置１５内に上記図１に示したマイクロコントローラ１が搭載されている。マイクロコントローラ１に設けられた周辺モジュールであるタイマ（周辺モジュール８Ｚ）からの出力はドライバ１７で増幅され、インバータ１４を介してモータ１３を駆動する。マイクロコントローラ１の故障検出機能がＣＰＵコアの異常を検出すると、それをマイクロコントローラ１に設けられた外部端子から、電子制御装置１５に設けられた安全装置１８を動作させる。安全装置１８の構成は、システムである自動車に依存するが、例えばダッシュボードに故障を示すアラームを表示することが考えられる。あるいは、インバータ１４を駆動するマイクロコントローラ１の上記タイマを停止するという方法が考えられる。さらには、マイクロコントローラ１を更に２重化して同一の処理を実行させ、ドライバ１７へのタイマの出力を切り替えられるように電子制御装置１５を構成する方法も考えられる。特に制限されないが、同図において、バッテリ１６はインバータ１４へ電源を供給する。
【０１０７】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【符号の説明】
【０１０８】
１  マイクロコントローラ
２Ａ  ＣＰＵコア
２Ｂ  ＣＰＵコア
３  命令メモリ
５  システムバス制御回路
１１  冗長スレッド実行制御回路
２６  レジスタ
２７  レジスタ
【図１】
0005850774.tif 000002
【図２】
0005850774.tif 000003
【図３】
0005850774.tif 000004
【図４】
0005850774.tif 000005
【図５】
0005850774.tif 000006
【図６】
0005850774.tif 000007
【図７】
0005850774.tif 000008
【図８】
0005850774.tif 000009
【図９】
0005850774.tif 000010
【図１０】
0005850774.tif 000011
【図１１】
0005850774.tif 000012
【図１２】
0005850774.tif 000013
【図１３】
0005850774.tif 000014
【図１４】
0005850774.tif 000015
【図１５】
0005850774.tif 000016
【図１６】
0005850774.tif 000017
【図１７】
0005850774.tif 000018
【図１８】
0005850774.tif 000019
【図１９】
0005850774.tif 000020
【図２０】
0005850774.tif 000021
【図２１】
0005850774.tif 000022
【図２２】
0005850774.tif 000023