(57)【特許請求の範囲】
【請求項１】
コンピュータの処理により、シミュレーションを行なうシミュレーション・システムにおいて、
前記コンピュータ上で実行される複数のプロセッサ・エミュレータと、
前記コンピュータ上で実行される複数のプラント・シミュレータと、
前記コンピュータ上で実行される外部ペリフェラル・スケジューラと、
前記コンピュータ上で実行される相互ペリフェラル・スケジューラとを有し、
前記外部ペリフェラル・スケジューラは、前記プロセッサ・エミュレータの反応遅延時間を上限として、前記プラント・シミュレータを先行実行させ、次に、実際に前記プラント・シミュレータが停止した時間まで前記プロセッサ・エミュレータを実行するようにペリフェラル・エミュレータを介して通知し、
前記相互ペリフェラル・スケジューラは、前記プロセッサ・エミュレータ間の通信遅延時間だけ、前記プロセッサ・エミュレータに先行実行するように通知し、
前記プロセッサ・エミュレータの処理は、通知された２つの時間のうち最も早い時刻まで、保守的なイベント同期に従って進められる、シミュレーション・システム。
【請求項２】
前記コンピュータが、マルチタスク・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、個別のスレッドまたはプロセスとして実行される、請求項１に記載のシミュレーション・システム。
【請求項３】
前記コンピュータが、マルチコアまたはマルチプロセッサ・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、前記マルチプロセッサ・システムの異なるプロセッサまたはコアに個別に割り当てられて個別のスレッドまたはプロセスとして実行される、請求項２に記載のシミュレーション・システム。
【請求項４】
前記プラント・シミュレータと、該プラント・シミュレータと通信する前記ペリフェラル・エミュレータが、同一のコアまたはプロセッサに割りあてられている、請求項３に記載のシミュレーション・システム。
【請求項５】
前記複数のプラント・シミュレータは、自発的に状態を決定する能動的プラント・シミュレータと、タイミングを前記プロセッサ・エミュレータ側で決定する受動的プラント・シミュレータを有し、前記外部ペリフェラル・スケジューラは、前記能動的プラント・シミュレータと通信する能動的プラント用の外部ペリフェラル・スケジューラと、前記受動的プラント・シミュレータと通信する受動的プラント用の外部ペリフェラル・スケジューラからなる、請求項１に記載のシミュレーション・システム。
【請求項６】
ＣＡＮエミュレータをもち、該ＣＡＮエミュレータは、相互ペリフェラル・スケジューラによってスケジュールされる、請求項１に記載のシミュレーション・システム。
【請求項７】
前記プロセッサ・エミュレータはそれぞれ、キューをもつ内部ペリフェラル・スケジューラと協働し、該キューの書込みイベントの時間により、複数の前記プロセッサ・エミュレータによる共有メモリ・アクセスのデッドロックが回避される、請求項１に記載のシミュレーション・システム。
【請求項８】
コンピュータの処理により、シミュレーションを行なうシミュレーション方法において、
前記コンピュータ上で、複数のプロセッサ・エミュレータを実行させるステップと、
前記コンピュータ上で、複数のプラント・シミュレータを実行させるステップと、
前記コンピュータ上で、前記プロセッサ・エミュレータの反応遅延時間を上限として、前記プラント・シミュレータを先行実行させ、次に、実際に前記プラント・シミュレータが停止した時間まで前記プロセッサ・エミュレータを実行するようにペリフェラル・エミュレータを介して通知する、外部ペリフェラル・スケジューラを実行させるステップと、
前記コンピュータ上で、前記プロセッサ・エミュレータ間の通信遅延時間だけ、前記プロセッサ・エミュレータに先行実行するように通知する、相互ペリフェラル・スケジューラを実行させるステップとを有し、
前記プロセッサ・エミュレータの処理は、通知された２つの時間のうち最も早い時刻まで、保守的なイベント同期に従って進められる、シミュレーション方法。
【請求項９】
前記コンピュータが、マルチタスク・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、個別のスレッドまたはプロセスとして実行される、請求項８に記載のシミュレーション方法。
【請求項１０】
前記コンピュータが、マルチコアまたはマルチプロセッサ・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、前記マルチプロセッサ・システムの異なるプロセッサまたはコアに個別に割り当てられて個別のスレッドまたはプロセスとして実行される、請求項９に記載のシミュレーション方法。
【請求項１１】
前記プラント・シミュレータと、該プラント・シミュレータと通信する前記ペリフェラル・エミュレータが、同一のコアまたはプロセッサに割りあてられている、請求項１０に記載のシミュレーション方法。
【請求項１２】
前記複数のプラント・シミュレータは、自発的に状態を決定する能動的プラント・シミュレータと、タイミングを前記プロセッサ・エミュレータ側で決定する受動的プラント・シミュレータを有し、前記外部ペリフェラル・スケジューラは、前記能動的プラント・シミュレータと通信する能動的プラント用の外部ペリフェラル・スケジューラと、前記受動的プラント・シミュレータと通信する受動的プラント用の外部ペリフェラル・スケジューラからなる、請求項８に記載のシミュレーション方法。
【請求項１３】
ＣＡＮエミュレータを実行させるステップを有し、該ＣＡＮエミュレータは、相互ペリフェラル・スケジューラによってスケジュールされる、請求項８に記載のシミュレーション方法。
【請求項１４】
前記プロセッサ・エミュレータはそれぞれ、キューをもつ内部ペリフェラル・スケジューラと協働し、該キューの書込みイベントの時間により、複数の前記プロセッサ・エミュレータによる共有メモリ・アクセスのデッドロックが回避される、請求項８に記載のシミュレーション方法。
【請求項１５】
コンピュータの処理により、シミュレーションを行なうシミュレーション・プログラムにおいて、
前記コンピュータに、
複数のプロセッサ・エミュレータを実行させるステップと、
複数のプラント・シミュレータを実行させるステップと、
前記プロセッサ・エミュレータの反応遅延時間を上限として、前記プラント・シミュレータを先行実行させ、次に、実際に前記プラント・シミュレータが停止した時間まで前記プロセッサ・エミュレータを実行するようにペリフェラル・エミュレータを介して通知する、外部ペリフェラル・スケジューラを実行させるステップと、
前記プロセッサ・エミュレータ間の通信遅延時間だけ、前記プロセッサ・エミュレータに先行実行するように通知する、相互ペリフェラル・スケジューラを実行させるステップを実行させ、
前記プロセッサ・エミュレータの処理は、通知された２つの時間のうち最も早い時刻まで、保守的なイベント同期に従って進められる、シミュレーション・プログラム。
【請求項１６】
前記コンピュータが、マルチタスク・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、個別のスレッドまたはプロセスとして実行される、請求項１５に記載のシミュレーション・プログラム。
【請求項１７】
前記コンピュータが、マルチコアまたはマルチプロセッサ・システムであり、前記複数のプロセッサ・エミュレータと、前記複数のプラント・シミュレータと、前記外部ペリフェラル・スケジューラと、前記相互ペリフェラル・スケジューラは、前記マルチプロセッサ・システムの異なるプロセッサまたはコアに個別に割り当てられて個別のスレッドまたはプロセスとして実行される、請求項１６に記載のシミュレーション・プログラム。
【請求項１８】
前記プラント・シミュレータと、該プラント・シミュレータと通信する前記ペリフェラル・エミュレータが、同一のコアまたはプロセッサに割りあてられている、請求項１７に記載のシミュレーション・プログラム。
【請求項１９】
前記複数のプラント・シミュレータは、自発的に状態を決定する能動的プラント・シミュレータと、タイミングを前記プロセッサ・エミュレータ側で決定する受動的プラント・シミュレータを有し、前記外部ペリフェラル・スケジューラは、前記能動的プラント・シミュレータと通信する能動的プラント用の外部ペリフェラル・スケジューラと、前記受動的プラント・シミュレータと通信する受動的プラント用の外部ペリフェラル・スケジューラからなる、請求項１５に記載のシミュレーション・プログラム。
【請求項２０】
ＣＡＮエミュレータを実行させるステップを有し、該ＣＡＮエミュレータは、相互ペリフェラル・スケジューラによってスケジュールされる、請求項１５に記載のシミュレーション・プログラム。
【請求項２１】
前記プロセッサ・エミュレータはそれぞれ、キューをもつ内部ペリフェラル・スケジューラと協働し、該キューの書込みイベントの時間により、複数の前記プロセッサ・エミュレータによる共有メモリ・アクセスのデッドロックが回避される、請求項１５に記載のシミュレーション・プログラム
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自動車などの物理システムのシミュレーションに関し、より詳しくは、ソフトウェア・ベースでのシミュレーション・システムに関するものである。
【背景技術】
【０００２】
自動車は、その初期の時代の２０世紀初頭は、動力としてのエンジンと、ブレーキ、アクセル、ハンドル、トランスミッション、サスペンジョンを含む、機構部品からなっていたが、エンジンのプラグの点火、ヘッドライト以外は、電気的な仕組みはほとんど利用していなかった。【０００３】
ところが、１９７０年代頃から、大気汚染、石油危機などに備えて、エンジンを効率的に制御する必要性が生じ、このためエンジンの制御に、ＥＣＵが使用されるようになってきた。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成される。【０００４】
いまや、エンジンやトランスミッションなどの制御システム、Anti-lock Breaking System （ＡＢＳ）、Electronic Stability Control （ＥＳＣ）、パワーステアリングだけでなく、ワイパー制御やセキュリティ・モニタリング・システムなどに至るまで、最近の自動車では、機構部品だけでなく、エレクトロニクス部品やソフトウエアが重要な比率を占める。後者に関する開発費は全体の２５％とも４０％とも言われ、ハイブリッド型の自動車では７０％を占める。【０００５】
ところで、自動車は、エンジンなどの動力装置や動力伝達装置、ステアリングなどの走行装置、ブレーキ装置、その他ボディ系などの機械部品（プラント）で構成され、また、これらのプラントの動作は、３０〜７０以上の電子制御ユニット（ＥＣＵ）のプログラムがセンサ入力（速度など）や人間からの入力（アクセルなど）に応じて、動的に決定する。【０００６】
ＥＣＵは、基本的に各々が一つのプラントの動作を制御する。たとえば、エンジンへの燃料噴射（Fuel Injection）や点火（Ignition）は、エンジン・コントロール・ユニットがその量やタイミングをソフトウエアにより決定する。ソフトウエアなので、「スポーツ」モードを用意するような高級車では、モードに応じて燃料噴射量を増量・減量することもできる。また、シフトダウンのタイミングにあわせて、自動的にブリッピング（空ぶかし）してエンジンの回転数を合わせることもできる。この場合には、エンジンのＥＣＵとトランスミッションのＥＣＵが連携して動作する必要がある。自動車の横滑りなどを防止するための統合車両姿勢安定制御（ESC: Electronic Stability Control）システムでは、さらにブレーキなどの制動装置との連動も必要となり、ＥＣＵソフトウエアは複雑になる。なお、このような「介入」機能は、ソフトウエアであるがゆえに、容易にカットすることができる。【０００７】
さて、プラントの性能を十分に引き出し、かつ、安全に動作させるためには、ＥＣＵソフトウエアの設計開発の過程において、動作パラメータのチューニングとテストを十分に行うことが重要である。一般に、実車をプロトタイプしてから、チューニングとテストを繰り返すのではコストと時間がかかりすぎるので、プロトタイプする前にコントローラとプラントを計算機の中で仮想的に実現して、高速にかつ正確に動かして、その動作を確認する方法が強く望まれる。このようなＥＣＵシミュレーションは、（１）ステートマシンなどの表現形式を用いてコントローラの動作を論理的に表現する Model-in-the-Loop Simulation (ＭＩＬＳ)、（２）その論理動作に、データ精度などハードウエアの制約を一部導入した Software-in-the-Loop Simulation (ＳＩＬＳ)、（３）ソフトウエアを完全に実装してＥＣＵプロセッサをエミュレートするProcessor-in-the-Loop Simulation (ＰＩＬＳ)あるいは Virtual Hardware-in-the-Loop Simulation (Ｖ−HＩＬＳ)、そして、（４）ＥＣＵボードを完全に実装して、リアルタイム・プラント・シミュレーションと接続する Hardware-in-the-Loop Simulation (ＨＩＬＳ) の４種類の方式があり、 この順序で、よりプロトタイプに近くなる。【０００８】
ＭＩＬＳ／ＳＩＬＳは主に、プラントの基本的な性能を引き出すための試行錯誤フェーズに用いられている。しかし、実際にＥＣＵに搭載されるソフトウエアとは異なる動作をするので、製品の検証用途には利用することができない。一方、Ｖ−ＨＩＬＳは完成したＥＣＵソフトウエアを利用するので、ソフトウエアの期待しない動作（バグ）を発見して解決するための方式として非常に有望視されているが、再現性のある動作を達成するものとしては、まだ実現した例はない。ＨＩＬＳは、完成したＥＣＵボードの最終的な動作確認のために必ず実施されるが、障害が見つかっても再現性が保証されないのでデバッグ目的には利用できない。【０００９】
ＨＩＬＳにおいて動作が再現できない理由は、ＨＩＬＳの構成が不完全だからではなく、ＣＡＮなどのネットワークにより各ＥＣＵが相互に接続しているためである。一般に、ネットワークはモジュール間の疎な結合を実現しているため、モジュール動作の微妙なタイミングの違いでデータの到着順序が入れ替わり、結果として、システム全体の挙動が異なることがある。したがって、たとえ実車をプロトタイプしたとしても、動作の再現性は期待できない。並列分散システムのデバッグが非常に困難であることと同じ理由である。【００１０】
このように、ＨＩＬＳの構成のまま、すなわち、ＥＣＵボードとプラント・シミュレータとの疎結合という構成のままでは、それぞれのコンポーネントを高速化しても動作の一貫性は実現できない。コミュニケーションの順序の一貫性を実現することが、動作の再現性を実現するために必要である。Ｖ−ＨＩＬＳは特に、この問題を解消することが期待される。【００１１】
従来の概念に従う、典型的なＶ−ＨＩＬＳの構成は、複数のＥＣＵエミュレータと、複数のプラント・シミュレータと、全体の動作をスケジュールするグローバル・スケジューラからなる。【００１２】
ＥＣＵエミュレータは、プロセッサ・エミュレータと、ペリフェラル・エミュレータからなる。一方、プラント・シミュレータには、ブレーキ・シミュレータ、エンジン・シミュレータなどが含まれる。【００１３】
このとき、プロセッサ・エミュレータは例えば、80MHzという相対的に高解像度のクロックで動作する。一方、プラント・シミュレータは、物理機構のシミュレータであるため、例えば、10KHzという相対的に低解像度で動作する。一般に、低解像度のほうが高速にシミュレーションできるので、プラント・シミュレータのほうが高速である場合が多い。【００１４】
プラント・シミュレータは必ずしも、固定長の処理ステップ時間で繰り返して数値計算を行うわけではなく、計算誤差の影響を抑えたり、不連続な変化点のタイミングなどに応じて可変ステップが必要となるケースが多い。いずれにしても、各ステップにおいてコントローラから指示信号を受け取り、また、センサーに向けて内部状態を出力する。なお、指示信号は、スイッチのオンとオフを表現するためにパルス状であることが多い。【００１５】
ペリフェラル・エミュレータは、ＥＣＵエミュレータのI/O のインターフェイス部にあたり、プラント・シミュレータとプロセッサ・エミュレータを相互に接続する。典型的には（平均的には）10MHz 程度の解像度で動作すると捉えることができる。これは、プラント・シミュレータより高速だが、プロセッサ・エミュレータよりは低速となる。ペリフェラル・エミュレータは、プラント・シミュレータに対しては、パルス状の信号を送る。また、プラント・シミュレータから内部状態を量的なデータとして読み取る。【００１６】
ペリフェラル・エミュレータは、プロセッサ・エミュレータに対しては、読み書き(R/W)の要求を受けてデータを送受信することと、割り込み(INT)を送ることを行う。特に、プロセッサ間を相互に接続するＣＡＮ(controller area network)などネットワークの機能では、プロセッサから送信データを受け取り（W）、ペリフェラル間でバスを経由して通信を行い、データを受信したときにはプロセッサに割込みを送り（INT）、プロセッサからの受信データ読み込みの要求（R）に応える。【００１７】
一側面からみると、ペリフェラルは、プラントとプロセッサ、及びプロセッサ間を相互に接続する、システムの中心である。ペリフェラルを通過する信号の順序を互いに区別できるだけの時間解像度があれば、プラントとプロセッサ間の相互作用に関しては、その順序は正しく再現できる。しかし、次の信号までにかかる時間がデータの精度を決定する（速度の算出など）なら、時間解像度は細かければ細かいほど良い。つまり、時間解像度に応じてデータ誤差の大きさが決まる。【００１８】
データ誤差の問題以外にもオーバヘッドの問題がある。すなわち、固定の同期間隔を設ける方法では、同期の間隔を短くすれば、より正しい動作を実現できるが、逆に、同期処理にかかるオーバヘッドを大きくするので全体処理にかかる時間が増加する。【００１９】
したがって、同期の間隔を固定にして最大限まで小さくする、というアプローチは、データ誤差とオーバヘッドの両面から現実的な解法とはなりえない。【００２０】
このように、Ｖ−ＨＩＬＳにおいて、同期の問題は重要であり、整理すると、次のような３つの方式が考えられる。
(1) 時間同期：この方式では、プロセッサ・エミュレータが互いに通信しつつ、シミュレーションを実行する。実行速度と時間精度のトレードオフがあり、時間の量子化誤差がある。また、上記でも示したように、この方式では、プロセッサ・エミュレータ間の同期通信コストが大きいので、現実的な解法とはならない。
(2) 楽観的なイベント同期：この方式では、各プロセッサ・エミュレータが時刻情報付きのイベントを送り、また受信することで相手と同期する。ただし、「フライング」となる可能性を残したまま、投機的にシミュレーションを実行するので、その投機が外れていた場合には、プロセッサ・エミュレータを適宜、ロールバックする必要がある。同期にかかるコストは、時間同期の方法に比べて小さいが、ロールバックに備えて、状態を遂次記録しておいたりするコストが大きすぎて、現実的でない。
(3) 保守的なイベント同期：この方式では、各プロセッサ・エミュレータが時刻情報付きのイベントを送り、また受信することで相手と同期する。ただし、因果関係が矛盾しないように「保守的」にシミュレーションを進めるために、互いにイベントを待ちあうことになってデッドロックが生じることがある。そのようなデッドロックを避けるためには、時間送りのために特別な nullメッセージを高頻度で送るなど、回避のためのコストが大きくなることがある。【００２１】
Ｖ−ＨＩＬＳの従来技術として、特開２００７−１１７２０号公報は、複雑な構成のシステムに対応しつつ、システムシミュレータの構成を柔軟に変更可能とすることを解決すべき課題とするもので、システムシミュレータを、ＣＰＵの動作をシミュレートするインストラクションセットシミュレータ、バスの動作をシミュレートするバスシミュレータ、ペリフェラルの動作をシミュレートするペリフェラルシミュレータの３種類で構成し、各シミュレータ間で互いの状態を参照・変更可能な各インターフェースをそれぞれ設けることを開示する。しかし、この従来技術は、ペリフェラルとＣＰＵ間の同期を最適化する技法について示唆するものではない。【００２２】
そこで、本願発明者らは、保守的なイベント同期の仕組みを発展させて、特願２００９−２３８９５４号明細書に記述されている、ペリフェラル・スケジューラを用いたシミュレーション技法を提供した。この技法においては、ペリフェラル・スケジューラは、全てのペリフェラル・エミュレータの完了フラグを解除(OFF)することによって、並列動作を開始する。そうして、ペリフェラル・スケジューラは、設定された個々のペリフェラル・エミュレータの処理の区切りタイミングに基づき、最も早く処理の区切りを迎える予定のペリフェラル・エミュレータを見出す。それをペリフェラルPと呼ぶことにする。その処理の区切りの時間をTとすると、ペリフェラル・スケジューラは、時間Tに達する時点まで、各プロセッサ・エミュレータと、各プラント・シミュレータの実行を進める。そうして、ペリフェラル・スケジューラは、ペリフェラルPの完了フラグが設定されるのを待つ。ペリフェラルPの完了フラグが設定されたことに応答して、ペリフェラル・スケジューラは、ペリフェラルPと、プロセッサ・エミュレータ及びプラント・シミュレータの間でデータを同期させる。【００２３】
ところが最近になって、複数のＥＣＵを同時に、マルチコアのホスト・コンピュータ上でエミュレートするような、より実機の動作全体に近いシミュレーションに対する要望があらわれてきた。すると、複数のＥＣＵの個々のホスト上での実行速度が互いに異なるため、それらの間に明示的な同期処理が必要となるが、ＥＣＵ間では不定期に割り込むようにして通信が行われるために、複数のＥＣＵを同期させることは容易でない。特願２００９−２３８９５４号明細書に記述されている技法は、単独のＥＣＵを対象としているために、そのままでは複数のＥＣＵをもつシステムのシミュレーションに、適用できない。
【先行技術文献】
【特許文献】
【００２４】
【特許文献１】特開２００７−１１７２０号公報
【特許文献２】特願２００９−２３８９５４号明細書
【発明の概要】
【発明が解決しようとする課題】
【００２５】
従って、本発明の目的は、互いに非同期的にデータを通知（割込み）する複数のＥＣＵとプラントを持つシステムにおいて、十分な時間精度および小さなデータ誤差で、且つ、高速にシミュレーションを実行することを可能とする技法を提供することにある。ここで、非同期的なデータ通知とは、たとえば、プラントで不定期に起こる状態変化をコントローラに通知することや、プロセッサ間の非同期的なＣＡＮ通信などをさす。【００２６】
この発明の他の目的は、ＥＣＵとその制御対象であるプラントを持つシステム全体をシミュレートするように、プロセッサ・エミュレータ、ペリフェラル・エミュレータ、およびプラント・シミュレータの３種類を連成することにある。
【課題を解決するための手段】
【００２７】
本発明によれば、ペリフェラルが、相互ペリフェラル、外部ペリフェラル、および内部ペリフェラルの３種類に分割されて、それぞれに固有のスケジューラが提供される。この３種類のスケジューラが協調して、効率的で正確な連成動作を実現する。【００２８】
相互ペリフェラルは、プロセッサ間の通信を処理する中間層であり、固有の相互ペリフェラル・スケジューラを持つ。プロセッサ間の非同期通信を高速に処理する機能をもつ。【００２９】
外部ペリフェラルは、プラントとプロセッサとを接続する中間層であり、固有の外部ペリフェラル・スケジューラを持つ。プラントからの非同期的な通知を受けてプロセッサに伝達すること、また、プラントに向けてプロセッサからの指示を送り出す機能をもつ。【００３０】
内部ペリフェラルは、特定のプロセッサとのみ接続されるペリフェラル層であり、たとえば、Watch Dog Timer やメモリなどが該当する。プラントやほかのプロセッサとの信号の交換はない。固有の内部ペリフェラル・スケジューラ（あるいは、プロセッサ・スケジューラ）を持つ。【００３１】
相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラ、および内部ペリフェラル・スケジューラは、コルーチンの形式で並列に動作する。【００３２】
なお、プラント・シミュレータは、好適には、MATLAB(R)/Simulink(R)のような連続的数値シミュレーション・モデリング・システムで作成される。ペリフェラル・エミュレータは、トランザクション型のエミュレータであり、好適には、SystemC/TLMで作成される。プロセッサ・エミュレータは、命令セット・シミュレータ（ＩＳＳ）によるエミュレーションを行う。【００３３】
外部ペリフェラル・スケジューラは、プロセッサ・エミュレータの「反応遅延時間」と次イベントが起きる時間までの早い方を選び、その時間までプラント・シミュレータを先行実行させる。そして、実際にプラント・シミュレータが停止した時間まで先行実行するように、すべてのプロセッサ・スケジューラ（あるいは内部ペリフェラル・スケジューラ）に通知する。なお、反応遅延時間とは、プラントから状態変化の通知を受けてから、それに対応するプラントへの指示を計算して、実際にその指示がプラントにおいて有効になる時刻までの最小の時間差をさす。【００３４】
相互ペリフェラル・スケジューラは、プロセッサ・エミュレータ間の「通信遅延時間」と次イベントが起きる時間までの早いほうを選び、その時間まで先行実行するように、すべてのプロセッサ・スケジューラ（あるいは内部ペリフェラル・スケジューラ）に通知する。なお、通信遅延時間とは、プロセッサがデータを送信してから、別のプロセッサがそれを受信するまでにかかる最小時間をさす。【００３５】
プロセッサ・スケジューラ（あるいは内部ペリフェラル・スケジューラ）は、通知された目標同期時間のうち最も早い時刻まで処理を進める。このようにして、プロセッサ間では時間調整を行うことなく、２種類のペリフェラル・スケジューラから与えられた同期時刻に向かって保守的に処理を進めることにより、低いコストで、プロセッサ間のデッドロックを回避する。【００３６】
各ペリフェラル層は、最も進捗の遅いプロセッサの時刻をイベントとして受け取って、その時刻まで自身の処理を進める。また、その更新された時刻に基づいて、次の同期時間通知を決定する。【００３７】
以上のように、プラント、プロセッサ、ペリフェラルの順にシミュレーションが進行して、全体として異種間の連携を連成した処理が実現される。
【発明の効果】
【００３８】
本発明によれば、プロセッサ・エミュレータの反応遅延時間及びプロセッサ・エミュレータ間の通信遅延時間を利用して、プロセッサ・エミュレータを先行実行させるので、デッドロック回避のためのオーバヘッドがない、保守的なイベント同期による高速なシミュレーションが可能となる。また、固定時間間隔による同期ではなくて、任意の時刻を表現できるイベントに基づく同期手法なので、時間に関する誤差の小さい正確なシミュレーションが可能となる。
【図面の簡単な説明】
【００３９】
【図１】本発明を実施するために使用されるコンピュータのハードウェアの一例を示すブロック図である。
【図２】本発明を実施するための機能ブロックの一実施例を示す図である。
【図３】プロセッサ、ペリフェラル及びプラントにおける遅延を説明する図である。
【図４】プロセッサのエミュレーションの機能を説明する図である。
【図５】ペリフェラルのエミュレーション動作の一例を示すである。
【図６】プラントのシミュレーション動作の一例を示すである。
【図７】内部ペリフェラル・スケジューラの構成要素を示す図である。
【図８】内部ペリフェラル・スケジューラの処理のフローチャートを示す図である。
【図９】内部ペリフェラル・スケジューラの処理のフローチャートを示す図である。
【図１０】内部ペリフェラル・スケジューラの処理のフローチャートを示す図である。
【図１１】相互ペリフェラル・スケジューラの構成要素を示す図である。
【図１２】相互ペリフェラル・スケジューラの処理のフローチャートを示す図である。
【図１３】外部ペリフェラル・スケジューラの構成要素を示す図である。
【図１４】外部ペリフェラル・スケジューラの処理のフローチャートを示す図である。
【図１５】相互ペリフェラル・スケジューラにおける、ＴＱと、それに対応するＩＱ及びＯＱのイベントの時間に沿った出入りの例を示す図である。
【図１６】論理プロセスの構成を示す図である。
【図１７】接続された論理プロセス群を示す図である。
【図１８】nullメッセージによりデッドロックを防ぐ様子を示す図である。
【図１９】プロセッサの通信遅延ΔTcを説明するための図である。
【図２０】プロセッサの反応遅延ΔTRを説明するための図である。
【図２１】共有メモリ・アクセスのシミュレーションを説明するための図である。
【図２２】プロセッサと通信頻度の高いペリフェラルを、ＩＳＳと同じコアでエミュレートすることを説明するための図である。
【図２３】ＣＡＮデバイスへのアボート時に調停に敗れる動作のシミュレーションを説明するための図である。
【図２４】ＣＡＮデバイスのリセットのシミュレーションを説明するための図である。
【図２５】本発明を実施するための機能ブロックの別の実施例を示す図である。
【図２６】受動的プラント・シミュレータ用の外部ペリフェラル・スケジューラの動作のフローチャートを示す図である。
【発明を実施するための形態】
【００４０】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００４１】
先ず、図１を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図１において、ホスト・バス１０２には、複数のＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎが接続されている。ホスト・バス１０２にはさらに、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎの演算処理のためのメイン・メモリ１０６が接続されている。
【００４２】
一方、Ｉ／Ｏバス１０８には、キーボード１１０、マウス１１２、ディスプレイ１１４及びハードティスク・ドライブ１１６が接続されている。Ｉ／Ｏバス１０８は、Ｉ／Ｏブリッジ１１８を介して、ホスト・バス１０２に接続されている。キーボード１１０及びマウス１１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ１１４は、必要に応じて、処理をＧＵＩで操作するためのメニューを表示するために使用される。
【００４３】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ１  １０４ａ、ＣＰＵ２  １０４ｂ、ＣＰＵ３  １０４ｃ、・・・ＣＰＵｎ  １０４ｎは、例えば、インテル（Ｒ）Ｘｅｏｎ（Ｒ）であり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、好適には、マルチタスクの機能を有するものである。オペレーティング・システムは、ハードティスク・ドライブ１１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ１１６からメイン・メモリ１０６に読み込まれる。
【００４４】
本発明を実施するためには、マルチプロセッサ・システムを用いることが望ましい。ここでマルチプロセッサ・システムとは、一般に、独立に演算処理し得るプロセッサ機能のコアを複数もつプロセッサを用いるシステムであることを意図しており、従って、マルチコア・シングルプロセッサ・システム、シングルコア・マルチプロセッサ・システム、及びマルチコア・マルチプロセッサ・システムのどれかでよいことを理解されたい。
【００４５】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）系に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、シミュレーション・プログラムを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用してもよい。
【００４６】
ハードティスク・ドライブ１１６にはさらに、後述するプロセッサ・エミュレータ、ペリフェラル・エミュレータ、プラント・シミュレータ、内部ペリフェラル・スケジューラ、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラ、ＣＡＮエミュレータなどのプログラムが格納されており、その各々は、コンピュータ・システムの起動時にメイン・メモリ１０６にロードされて、個別のスレッドまたはプロセスとして個々のＣＰＵ１〜ＣＰＵｎに割当てられて、実行される。このため、図１に示すコンピュータ・システムは、好適には、プロセッサ・エミュレータ、ペリフェラル・エミュレータ、プラント・シミュレータ、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラ、ＣＡＮエミュレータなどの個々のスレッドに個別に割り当てるに十分な個数のＣＰＵをもつ。
【００４７】
図２は、そのように個々のＣＰＵ１〜ＣＰＵｎに割当てられて個別のスレッドまたはプロセスとして動作するプロセッサ・エミュレータ、ペリフェラル・エミュレータ、プラント・シミュレータ、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラ、ＣＡＮエミュレータなどの処理プログラムの間の協働関係を示す機能ブロック図である。
【００４８】
この構成は、ＥＣＵにあたるプロセッサ・エミュレータおよびペリフェラル・エミュレータ、そして、プラント・シミュレータからなるシミュレーション・システムである。ペリフェラル・エミュレータは、相互ペリフェラルと外部ペリフェラルに分かれる。なお、図では示されていないが、内部ペリフェラルは、プロセッサ・エミュレータのブロックに含まれると理解されたい。全体では、図の横方向に、４層のシミュレーション・システムであると捉えることができる。
【００４９】
図２において、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚは、シミュレーション・システムにおいて、ＥＣＵの機能のうちコントローラの中心的な働きをする。プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚは、ソフトウエア・コードをロードして、命令セット・シミュレータ（ＩＳＳ）によるエミュレーションを行う。
【００５０】
ペリフェラル・エミュレータ２０４ａ、２０４ｂ、・・・２０４ｚ、および、ＣＡＮエミュレータ２１２は、トランザクション型のエミュレータであり、好適には、SystemC/TLMで作成される。
【００５１】
プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚは、好適には、MATLAB(R)/Simulink(R)のような連続的数値シミュレーション・モデリング・システムで作成される。プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚの各々は、エンジンなどの動力装置、トランスミッションなどの動力伝達装置、ステアリングなどの走行装置、及びブレーキ装置などの自動車の機構装置に対応する。
【００５２】
プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚは例えば典型的には、80MHzという相対的に高解像度のクロックで動作する。一方、プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚは、物理機構のシミュレータであるため、例えば典型的には、10KHzという相対的に低解像度で動作する。
【００５３】
従って、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚとプラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚを直接接続することができないので、ペリフェラル・エミュレータ２０４ａ、２０４ｂ、・・・２０４ｚがそれらの間に介在して、プラント・シミュレータからの状態変化やセンサーの値をイベントに変換してプロセッサ・シミュレータに渡したり、逆に、プロセッサ・エミュレータからの指示（シグナリング）をイベントに変換してプラント・シミュレータに渡す役割を果たす。
【００５４】
内部ペリフェラル・スケジューラは、プロセッサ・エミュレータと、それに接続するペリフェラル・エミュレータのスケジューリングを行う。プロセッサ・エミュレータに接続するペリフェラル・エミュレータは、ＲＯＭ、ＲＡＭ、ウォッチ・ドッグ・タイマーなど、他のプロセッサやプラントに直接関係しないペリフェラル（内部ペリフェラル）機能を処理する。内部ペリフェラル・スケジューラは、ＥＣＵのメモリマップ仕様を参照して、IＳＳからのload/store命令を、内部ペリフェラル・スケジューラ、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラに振り分けるという重要な機能を有する。なお、以下では、内部ペリフェラル・スケジューラをプロセッサ・スケジューラと言い換えて説明することがあるが、両者は同一の機能を指すことに注意されたい。
【００５５】
外部ペリフェラル・スケジューラ２０８は、プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚに接続するペリフェラル・エミュレータ２０４ａ、２０４ｂ、・・・２０４ｚを処理するスケジューラである。外部ペリフェラル・スケジューラ２０８は、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚの反応遅延時間（あるいは次イベントまでの時間）だけ、プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚを先行実行させるようにスケジューリングする。プラント・シミュレータは指定された時間か、あるいは内部状態の更新の通知が必要であれば、それより前の時間で停止する。そして、実際にプラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚが停止した時間まで、プロセッサ・エミュレータに先行実行するよう通知する。
【００５６】
外部ペリフェラル・スケジューラ２０８は、プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚに対して、コントローラから要求されたシグナリングまたはサンプリングの指示を与える。シグナリングはコントローラがプラントを操作（actuate）するためのイベントであり、例えば、スイッチのON/OFF信号を指示するような動作である。また、サンプリングは、コントローラがプラントの状態をモニター（sense）する際に値の読み取りを指示するためのイベントであり、例えば、バッテリーセル（プラント）の電圧値をコントローラが読取るような動作である。ここで、コントローラとは、プロセッサ・エミュレータにロードされたソフトウエアで、プラントに対する制御信号を作るロジックのことである。シグナリングとサンプリングは、エミュレーション対象の処理が周期的か否かによらず、コントローラがそのタイミングを決定するものである。
【００５７】
一方、外部ペリフェラル・スケジューラ２０８は、プラント・シミュレータ２０６ａ、２０６ｂ、・・・２０６ｚから、状態変化(state change)のイベントとして通知を受ける。これは、プラントが状態の変化をコントローラに通知するイベントであり、プラントがそのタイミングを決定する。これも、周期的である場合もあり、非周期的である場合もある。
【００５８】
相互ペリフェラル・スケジューラ２１０は、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚ間を接続する、相互ペリフェラル機能を提供するスケジューラである。相互ペリフェラル・スケジューラ２１０は、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚ間の通信遅延時間（あるいは次イベントまでの時間）だけ、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚに先行実行するように通知する。プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚは、通知された時間のうち最も早い時刻まで保守的に処理を進める。このとき、プロセッサ・エミュレータ間の通信は例えば、ＣＡＮ(Controller Area Network)エミュレータ２１２によって行う。ECUのプロセッサ間の通信に共有メモリが用いられる場合のシミュレーションは、図２１を用いて後述する。
【００５９】
図２に示されているように、外部ペリフェラル・スケジューラ２０８及び相互ペリフェラル・スケジューラ２１０からプロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚへのイベントは、割込み（ＩＮＴ）の形式で行われ、プロセッサ・エミュレータ２０２ａ、２０２ｂ、・・・２０２ｚから外部ペリフェラル・スケジューラ２０８及び相互ペリフェラル・スケジューラ２１０へのイベントは、読み書き（Ｒ／Ｗ）の形式で行われる。
【００６０】
図３を参照して、プロセッサ・エミュレータ（あるいはプロセッサ・スケジューラ）、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラ、及びプラント・シミュレータにおける遅延を利用した先行実行について説明すると、以下のとおりである。
・先ず、図３(1)に示すように、外部ペリフェラル・スケジューラ２０８が、プラント・シミュレータ２０６を先行実行させる。実際に先行した時間を、Tplantとする。
・先行させる時間の上限は、次のシグナリング、あるいは、ΔTRの近い方である。ここで、ΔTRとは、プラント・シミュレータからの入力時刻から、それによるプロセッサ・エミュレータの反応がプラント・シミュレータに伝わって有効となるまでの遅延の最小値であり、図２０で、より詳しい説明がなされる。
・次に、図３(2)に示すように、外部ペリフェラル・スケジューラ２０８は、実際にプラント・シミュレータ２０６が停止した位置（Tplant）まで、プロセッサ・エミュレータ２０２に先行実行するように通知する。
・次に、図３(3)に示すように、相互ペリフェラル・スケジューラ２１０は、プロセッサ・エミュレータ２０２間の通信遅延時間および次のイベントまでの時間の早いほうまで、プロセッサ・エミュレータ２０２に先行実行するように通知する。図では、通信遅延時間のほうが早い例を示している。
・通信遅延時間ΔTcについては、図１９で、より詳しい説明がなされる。
・次に、図３(4)に示すように、プロセッサ・エミュレータ２０２は、通知された２つの時間のうち最も早い時刻まで保守的に処理を進めるが、必ずしもその時刻まで中断することなく処理を進められるとは限らず、たとえば、共有メモリの読取り（Ｒ）があるとその時刻で一旦停止する。図では、時刻（３）まで処理を進める前に時刻（４）で一旦停止している様子を示している。共有メモリへのアクセスがなければ、時刻（３）まで一度に進む。
・図３(5)に示すように、相互ペリフェラル・スケジューラ、外部ペリフェラル・スケジューラは、プロセッサから受取ったイベントのうち最も早い時刻まで、自身の処理を進める。
【００６１】
次に、図４を参照して、プロセッサのエミュレーションの機能を説明する。上述のように、プロセッサのエミュレーションは、ＩＳＳ(Instruction Set Simulator)として実現される。プロセッサのエミュレーションは、指定された時刻を目指して実行し、インストラクション（命令語）に応じてアクセス（R/W）の要求を出し、また、ペリフェラルから発生した不定期な割込みを受け付ける。
【００６２】
特にこの実施例では、説明の便宜のため、ＩＳＳへの指示とＩＳＳからの要求を以下のように記述する。
ＩＳＳへの指示あるいは通知
advance(t) :    最大で時刻 t まで実行するようにＩＳＳに指示する。ただし、その時刻に達する前にコミュニケーションが必要であれば、ＩＳＳはその要求を出して処理を中断する。
resume(v) :     読み出しの要求に対応するデータをＩＳＳに通知して実行を再開する。
interrupt(i) :  割込み i が生じたことをＩＳＳに通知する。
ＩＳＳからの要求あるいは通知
load(t,a) :     時刻tにa番地のデータを読み出すことを要求する。その後、resume 通知を受けるまで処理を中断する。
store(t,a,v) :  時刻tにa番地にデータvを書き込むことを要求する。
complete() :    advanceで指示された時刻 t まで進んだら、完了の通知を行う。
【００６３】
図４は、このような命令による、プロセッサのエミュレーション動作の一例を示すものである。図４において先ず、プロセッサは、advance(tg)という命令を受け取る。プロセッサは時刻t1で、load(t1,a1)を出力する。これに応答して、プロセッサは、resume(v1)を受け取る。プロセッサは時刻t2で、store(t2,a2,v2)を出力する。
【００６４】
時刻tgに達したときプロセッサは、前に受け取っていたadvance(tg)に従い、complete()を出力する。その後、プロセッサはプラントの反応に応じて、interrupt(i)を受け取ることがある。そうでなければ、次の advance() 指示を受け取る。
【００６５】
次に、図５を参照して、ペリフェラルのエミュレーションの動作を説明する。上述のように、ペリフェラルのエミュレータは、好適にはSystemCによって実現される。ペリフェラルのエミュレーションは、タスク・キューに詰まれたイベントに従って、トランザクション実行を行うものである。
【００６６】
イベントには、レジスタのREAD要求およびWRITE要求などがある。ペリフェラルのエミュレーションは、このイベントをタスク・キューの先頭から順に取り出して解釈してトランザクションとして実行して新たなイベントに変換して、再びタスク・キューに挿入する。一つあるいは二つ以上のイベントに変換する場合もあるし、イベントをまったく生成しない場合もある。イベントの解釈と実行は、個々のペリフェラルの機能による。この処理をイベントが尽きるまで繰り返すことで、ペリフェラルのエミュレーションが行われる。すなわち、pop（取り出し）、execute（実行）、push（挿入）の繰り返しである。
【００６７】
この実施例では、ペリフェラルに閉じたシミュレーションではなくて、プロセッサやプラントと連成するシミュレーションなので、複数のペリフェラル・エミュレータのタスク・キューをまたがってイベントが行き来する。この場合、ペリフェラル・スケジューラが、適切なタスク・キューにイベントを追加する。すなわち、pop、execute、push or export （挿入あるいは転送）、import（転入）の繰り返しである。ただし、import はサイクルによってはオプション（なし）となる。
【００６８】
プラント・シミュレータへの入出力は、<port_update,t,p,v> イベントである。これは、時刻 t にポート p がとる値 y を通知する。たとえば、プラントへの指示（シグナリング）やプラントからの状態変化の通知が、これで表現される。
【００６９】
プロセッサから発する要求は、<read,t,r> イベントおよび <write,t,r,v> イベントであり、それぞれ、時刻 t にレジスタ r がとる値の読み出しを要求するイベント、時刻 t にレジスタ r に値 v を書き込むことを要求するイベントである。逆に、プロセッサが受け取るのは <register_update,t,r,v> イベントで、これは、<read,t,r> 要求に呼応して時刻 t のレジスタ r の値 v を通知する。また、<interrupt,t,i> も受信イベントで、これは、時刻 t に割込み i が発生することを通知するイベントである。
【００７０】
特にこの実施例では説明の便宜のため、ペリフェラルのタスク・キューに関する操作を以下のように記述する。
insert(e[t]) :   時刻tに発生するイベント e[t]をタスク・キューに追加する
next() : k :   タスク・キューの先頭を取り出（pop）して発火（execute）して、その応答として必要なら、新しいイベントを返す。
peek() : t :   タスク・キューの先頭にあるイベントの時刻tを返す。
【００７１】
nextが返す新しいイベントには、タイマーの発火などペリフェラルに閉じた内部イベントもあるが、特に、他のペリフェラルに渡すべきイベントは、<interrupt,t,i>、<register_update,t,r,v>、および <port_update,t,p,v> の３通りである。
【００７２】
ペリフェラルの動作は勿論、これで尽きている訳ではないが、とりあえず、本発明の動作に関連するものを説明した。
【００７３】
図５は、ペリフェラルのエミュレーション動作の一例を示すものである。図５(1)において先ず、スケジューラからペリフェラルにタスク・キュー操作命令insert(e1[t1])  が到来するので、タスク・キューにイベント  e1をＦＩＦＯとなるように積む。タスク・キューが空であったり、その他のイベントの時刻が t1 よりも後であるなら、e1はタスク・キューの先頭に詰まれる。ここで、e1はレジスタのread要求であるとする。
【００７４】
次に、操作命令 next() が到来すると、タスク・キューの先頭のイベントが解釈されてトランザクションとして実行されて、新たなイベント <register_update,t1,r1,v1> が出力される。この例は、プロセッサがレジスタの値を読みとる要求を出してから、その回答を得るまでの一連の処理の流れである。外部に送るべきイベントなので元のタスク・キューには挿入（push）されずに、プロセッサのスケジューラに転送（export）される。
【００７５】
図５(2)に示すように、ペリフェラルに、レジスタへの write要求insert(e2[t2]) およびnext() 命令が順に到来したときも同様に、タスク・キューに詰まれた e2が先頭なら、時刻t2で e2 がポップされて、たとえば、新しいイベント <port_update,t2,p2,v2> がスケジューラに返される。この例は、プロセッサがプラントに向けてシグナリングの指示を出したケースである。新しいイベントは、プラント・シミュレータが解釈できる形式に変換されて伝えられる。
【００７６】
図５(3)の例は、プラントから状態変化の通知があって、それを割り込み信号を用いてプロセッサに伝える様子を表す。スケジューラはタスク・キューに状態変化の通知を積んで（insert(e3[t3])）から取り出し（pop）て実行（execute）すると、新しいイベント <interrupt,t,i>に変換されて、プロセッサに転送（export）される。
【００７７】
次に、図６を参照して、プラントのシミュレーションの動作を説明する。上述のように、プラントのシミュレーションは、好適にはMATLAB(R)/Simulink(R)のような連続的数値シミュレーション・モデリング・システムによって実現される。プラントは、まず、指定された時刻の内部状態（ベクトル）や外部入力（ベクトル）にしたがって出力（ベクトル）を計算する。次に、内部状態の変化分（ベクトル）を出力するが、このとき、指定された誤差の範囲、プラント固有の最大ステップ幅、ゼロクロッシングなどに基づいて、内部状態の変化分を調整して、次のステップ時刻を決定する。
【００７８】
特にこの実施例では説明の便宜のため、プラントの動作を以下のように記述する。
プラントへの指示
advance(t) :  最大で時刻 t まで実行するようにプラントに指示する。ただし、時刻 t までステップを伸ばせない場合には、それ以前の時刻で停止する。
input(u) :    プラントへの入力ベクトル u を更新する
プラントからの通知
complete() :  advance で指定された時刻まで実行が完了したことを通知される
output(t,y) : 時刻 t において、プラントからの出力ベクトル y が更新されたことを通知される
【００７９】
プラントの動作は勿論、これで尽きている訳ではないが、とりあえず、本発明の動作に関連するものを説明した。
【００８０】
なお、参考までに、Simulink(R)のS-Functionコールバックルーチンとの対応を示す。
mdlGetTimeOfNextVarHit()の呼出し      complete()
mdlGetTimeOfNextVarHit()のリターン    advance(t)
mdlOutputs()の呼出し                  output(t,y)
mdlOutputs()のリターン                input(u)
【００８１】
図６は、プラントのシミュレーション動作の一例を示すものである。図６において先ず、プラントに、advance(tg)が到来する。プラントは、シミュレーション時間t1に、output(t1,y1)を出力する。
【００８２】
次にプラントに、input(u1)が到来する。プラントは、シミュレーション時間t2に、output(t2,y2)を出力する。
【００８３】
次にプラントに、input(ug)が到来する。シミュレーション時間tgに到達すると、プラントは、complete()を出力する。
【００８４】
このように、advanceとcomplete、また、outputとinputはそれぞれペアになる。
【００８５】
本発明において、内部ペリフェラル・スケジューラ、相互ペリフェラル・スケジューラ、および外部ペリフェラル・スケジューラが主要な役割を果たす。これら３つのスケジューラの動作を説明するために以下では、まず、保守的なイベント同期のシミュレーションの概要とその用語を説明する。
【００８６】
先ず、図７は、内部ペリフェラル・スケジューラにおける入力キューと出力キューに関係する処理を示す図である。図示されているように、入力キューには、ＩＰ(Input Queue from Processors)、すなわち、他のプロセッサからのイベント（共有メモリの更新通知）を受取るキューと、ＩＱすなわち、相互ペリフェラルまたは外部ペリフェラルからメッセージを受取るキューとがある。Pi, Pjというのはそれぞれ、i番目とj番目のプロセッサである。ＩＱに置かれるデータは、ＣＡＮ受信や割込みのイベントメッセージまたはnullメッセージである。
【００８７】
一方、出力キューには、ＯＰ(Output Queue to Processors)、すなわち、他のプロセッサへのイベント（共有メモリの更新通知）を送り出すキューと、ＯＱすなわち、相互ペリフェラルまたは外部ペリフェラルへメッセージを送るキューとがある。ＯＱに置かれるデータは、CAN送信のイベントメッセージまたは進捗nullメッセージである。
【００８８】
プロセッサ同士でイベントをやりとりする際、ＩＰ、ＯＰを相手のプロセッサごとに一組、使用することになる。
【００８９】
次に、図８〜図１０フローチャートを参照して、内部ペリフェラル・スケジューラの処理を説明する。図８のフローチャートの初期値は、全てのＩＱ／ＩＰは空、全てのＯＱは時刻ゼロの進捗イベント、全てのＯＰは空であり、T := 0である。
【００９０】
また、ＩＱ／ＩＰにk番目に到着するイベントの時間Tkは、以下の条件を満たす。
Tk ≦ Tk+1
【００９１】
内部ペリフェラル・スケジューラは、ステップ８０２で、キュー入力eを待ち、ステップ８０４では、全ＩＱがfilled(１つ以上のメッセージが到着した状態)になったかどうかを判断し、もしそうなら、ステップ８０６で、全ＩＱ中の最早時刻をT0とし、ステップ８０８で「parallel」というサブルーチンを呼び出して、他のプロセッサと並行して進める処理を行う。「parallel」のサブルーチンの処理は、図９のフローチャートを参照して後で説明する。
【００９２】
ステップ８１０で、内部ペリフェラル・スケジューラは、Te = T in Qすなわち、Te = Tの条件をみたすイベントeがＩＱにあるかどうかを判断する。そして、もしそうなら、内部ペリフェラル・スケジューラは、ステップ８１２で、ＩＱからeをポップして処理し、ステップ８１０に戻る。
【００９３】
ステップ８１０で、もしTe = TをみたすイベントeがＩＱにないなら、処理は、ステップ８０４での判断に戻る。
【００９４】
次に、図９のフローチャートを参照して、ステップ８０８での「parallel」の処理をより詳細に説明する。内部ペリフェラル・スケジューラは、ステップ９０２で、処理が"read"「読取り」であったかどうか判断し、もしそうなら、ステップ９０４で「fill」のサブルーチンを呼び出す。
【００９５】
「fill」のサブルーチンについては、図１０のフローチャートを参照して後で説明する。ステップ９０４の後はステップ９０６に進む。ステップ９０２で、処理が"read"「読取り」でなかった場合は、直接ステップ９０６に進む。
【００９６】
ステップ９０６は、T1 := min(T0,Ttop)によって、T1に値を入れる。
Ttopは、ＩＰの先頭時刻であり、ＩＰがない（共有メモリ通信を行うプロセッサがない）またはＩＰが空の場合はTtop = ∞とおく。
【００９７】
ステップ９０８では、内部ペリフェラル・スケジューラは、プロセッサを、T1を目指して実行させる。すなわち、相互ペリフェラル・スケジューラまたは外部ペリフェラル・スケジューラが指示する時間まで進むことになる。
【００９８】
ステップ９１０では、内部ペリフェラル・スケジューラは、プロセッサを実行させつつその分の時間Tを進め、ステップ９１２では、ＯＱ／ＯＰの更新・フラッシュを行う。
【００９９】
ステップ９１４では、内部ペリフェラル・スケジューラは、T = T1かどうか判断し、もしそうでなければ、ステップ９１６で、ＩＳＳからの最後の通知が"read"「読取り」であったかどうか判断し、もしそうなら、ステップ９０４に戻る。
【０１００】
ステップ９１６で、ＩＳＳからの最後の通知が"read"「読取り」でないと判断されたなら、ステップ９１８で、共有メモリへの書込み、ＣＡＮの送信、またはnullメッセージ送信のどれかが行われて、ステップ９０８に戻る。
【０１０１】
ステップ９１４で、T = T1であるなら、ステップ９２０に進み、そこでTe = T in IPすなわち、Te = Tの条件をみたすイベントがＩＰにあるかどうかを判断する。もしそうなら、ステップ９２２で、ＩＰからイベントeをポップして処理し、ステップ９２０に戻る。
【０１０２】
ステップ９２０で、イベントeの時刻をもつイベントがＩＰにないと判断されると、ステップ９２４で、T = T0であるかどうか判断され、もしそうなら、処理を終了する。
【０１０３】
ステップ９２４で、T = T0でないと判断されると、ステップ９２６で、共有メモリ上の読取り、またはnullメッセージの受信のどれかが行われ、ステップ９０２での判断に戻る。
【０１０４】
次に、図１０のフローチャートを参照して、ステップ９０４での「fill」の処理をより詳細に説明する。図１０において、内部ペリフェラル・スケジューラは、ＩＰのキューにあるエントリの一時リストを作成する。一時リスト作成後、ＩＰの中で現在時刻より古い時刻印をもつメッセージを全て取り除き、一時リストに追加する。
【０１０５】
ステップ１００４では、内部ペリフェラル・スケジューラは、全ＩＰがfilledかどうか判断する。もしそうなら、ステップ１００６で、一時リスト内のイベント（他プロセッサからの共有メモリへの書込み）を時刻印順に全て反映する。一時リストを処理すると、fillのサブルーチンは完了である。
【０１０６】
ステップ１００４で、全ＩＰがfilledでないと判断されると、ステップ１００８に進み、そこで、内部ペリフェラル・スケジューラは、ＩＰからのイベントeを待つ。
【０１０７】
ステップ１０１０で、 T > Teかどうか判断し、もしそうなら、ステップ１０１４で、一時リストにeを加えて更新し、ステップ１００８に戻る。
【０１０８】
ステップ１０１０で、 T > Teでないと判断されたなら、内部ペリフェラル・スケジューラは、ステップ１０１２でＩＰにeを加えて、ステップ１００４に戻る。
【０１０９】
図１１は、相互ペリフェラル・スケジューラにおけるキューに関係する処理を示す図である。図示されているように、入力キューＩＱには、Pi, Pjからイベントが入来し、それは、ＣＡＮエミュレータに送信される。
【０１１０】
一方、出力キューＯＱには、ＣＡＮエミュレータからイベントが入来し、それは、プロセッサが取り出すことになる。
【０１１１】
さらに、タスクキューＴＱが設けられ、それは、ＣＡＮエミュレータ受信の発火をもたらす。なお、以下では入力キューや出力キューと区別するために、タスク・キューに詰まれるイベントをタスクと呼ぶことがあることに注意されたい。
【０１１２】
次に、図１２のフローチャートを参照して、相互ペリフェラル・スケジューラの処理を説明する。ここでの初期値は、全てのＩＱは空、全てのＯＱは空、ＴＱは空、T := 0である。ステップ１２０２で、相互ペリフェラル・スケジューラは、ＩＱの更新待ちを行い、ステップ１２０４では、全ＩＱがfilledかどうか判断し、そうでなければステップ１２０２に戻って、ＩＱの更新待ちを続ける。
【０１１３】
そうしてステップ１２０４で、相互ペリフェラル・スケジューラが、全ＩＱがfilledと判断すると、ステップ１２０６で、全ＩＱ中最も近い時刻をT0とおく。
【０１１４】
ステップ１２０８では、相互ペリフェラル・スケジューラは、Te = T0 in IQ、すなわち、ＩＱにTe = T0となるタスクeがあるかどうかを判断する。もしそうなら、相互ペリフェラル・スケジューラは、ステップ１２１０でイベントeをポップし、ステップ１２１２で insert(e1[t])、insert(e2[t])により、ＴＱの更新を行う。ここで、イベントe1は、<read,t,r>すなわち、時刻tにレジスタrの値を読み込むイベントであり、イベントe2は、<write,t,r,v>すなわち、時刻tにレジスタrの値をvに更新するイベントである。
【０１１５】
ステップ１２１２の後はステップ１２０８に戻り、そこで、相互ペリフェラル・スケジューラがＩＱにTe = T0となるタスクeがないと判断すると、ステップ１２１４で、T := T0とセットし、ステップ１２１６で、peek()を使って、Tk = T in TQすなわち、ＴＱにTk = Tとなるタスクkがあるかどうか判断する。
【０１１６】
ステップ１２１６で、ＴＱにTk = Tとなるタスクkがあると判断すると、相互ペリフェラル・スケジューラはステップ１２１８でkをポッブし、ステップ１２２０で、next()によりタスクを実行する。ここではＣＡＮデータを受信する際にプロセッサに通知される <interrupt,t,i>、<register_update,t,r,v>イベントが発生する。
【０１１７】
ステップ１２２２では、相互ペリフェラル・スケジューラは全ＯＱを更新し、ステップ１２１６に戻る。
【０１１８】
ステップ１２１６で、ＴＱにTk = Tとなるタスクkがないと判断すると、ステップ１２２４に進み、そこで、相互ペリフェラル・スケジューラは、ＯＱに更新があったかどうかを判断する。
【０１１９】
ＯＱに更新がない場合、相互ペリフェラル・スケジューラは、ステップ１２２６で、全ＯＱに時刻min(T+ΔTc,Ttop)のnullメッセージを追加し、ステップ１２２８で、ＯＱをフラッシュしてステップ１２０４に戻る。なおここで、ΔTcは、プロセッサの通信遅延時間である。
【０１２０】
ＯＱに更新があった場合、相互ペリフェラル・スケジューラは、ステップ１２２８で、ＯＱをフラッシュして、ステップ１２０４に戻る。
【０１２１】
図１５に、参考までに、相互ペリフェラル・スケジューラにおける、ＴＱと、それに対応するＩＱ及びＯＱのイベントの時間に沿った出入りの例を示す。点線矢印はゲスト時間の進行を示す。
【０１２２】
この例でＩＱにプロセッサ・スケジューラ（内部ペリフェラル・スケジューラ）から到着するメッセージのイベントは、時系列順にＣＡＮアボート、ＣＡＮ送信、null（進捗メッセージのイベント）、ＣＡＮリセットである。上記のnull以外のメッセージは全て、プロセッサがＣＡＮデバイスに対して指令を出す（レジスタ書込みを行う）ことによって生じるイベントである。このうちＣＡＮアボートは、調停に敗れた場合に送信待機状態の解除を行い、さらにプロセッサに割込み通知をするよう、指令を出すイベントである。ＣＡＮ送信は、事前にセットしたデータを送信するよう、指令を出すイベントである。図１５は、２つの異なるプロセッサからＣＡＮ送信イベントが続けて到着する例を示している。ＣＡＮリセットは、ＣＡＮデバイスをバスから切り離して初期状態に戻るよう、指令を出すイベントである。
【０１２３】
この例でＯＱからプロセッサ・スケジューラに送出されるメッセージのイベントは、時系列順にnull（nullメッセージのイベント）、アボート通知、ＣＡＮ受信である。ＣＡＮ受信は、ＣＡＮデバイスがプロセッサに対して、ＣＡＮのデータを受信したことを割り込みによって通知するイベントである。アボート通知は、ＣＡＮデバイスがプロセッサに対して、調停に敗れたことを割り込みによって通知するイベントである。
【０１２４】
ＣＡＮ送信イベントが発生（ＩＱに到着）した時点では、以前に送信開始されたデータが転送中である事がある。図１５の例では、2つ目のＣＡＮ送信イベントが到着した時点で、ＴＱの先頭に以前開始された転送の完了に伴う、ＣＡＮ受信イベント（1つめ）が積まれている。ＣＡＮ受信イベントの直後に、次のデータ転送のための調停が行われる。この図の例では簡単のため、ＣＡＮ受信のイベントと調停のイベントの時刻が同じであるとする。ＩＱに到着するnullイベントの時刻印は、ＣＡＮ受信・調停のゲスト時刻と同じである。ここで本発明の相互ペリフェラルスケジューラは、ＴＱの先頭時刻まで先行実行するようプロセッサ・スケジューラに通知(nullメッセージを送出）する処理を含む。図１５のＩＱに到着するnullは、プロセッサがこの処理によって通知された時刻まで到達したことを、プロセッサ・スケジューラが通知する進捗メッセージのものである。また、図のＯＱで最初に送出されているnullメッセージは、この処理でプロセッサ・スケジューラに先行実行を通知したものを示す。
【０１２５】
調停が行われると、２つのプロセッサから要求されたＣＡＮ送信のうち、一方が受け入れられ（調停への勝利）、もう一方が保留される（調停への敗退）。図は、前者の送信要求を行ったプロセッサへのＣＡＮ受信のイベントが、後者の送信要求を行ったプロセッサへのアボート通知のイベントが、それぞれＴＱに追加されることを示している。ＣＡＮデバイスのエミュレーションの進行に伴って、追加された2つのイベントが順に処理され、対応するイベント（アボート通知、ＣＡＮ受信）がＯＱを通してプロセッサ・スケジューラにそれぞれ通知される。
【０１２６】
図１３は、外部ペリフェラル・スケジューラにおけるキューに関係する処理を示す図である。図示されているように、入力キューＩＱには、Pi, Pjからメッセージが入来する。
【０１２７】
出力キューＯＱには、割込み通知のイベントメッセージ及びnullメッセージが送出され、それらは、Pi, Pjが取り出す。
【０１２８】
タスク・キューＴＱは、タイムスタンプ（時刻印）でソートされている。
【０１２９】
また、外部ペリフェラル・スケジューラは、プラントに接続するI/Oポートの現在の信号値を保持する。
【０１３０】
次に、図１４のフローチャートを参照して、外部ペリフェラル・スケジューラの処理を説明する。ここでの初期値は、全てのＩＱは空、全てのＯＱは空、ＴＱは空、ＰＶ（ポート値）はＥＣＵ仕様での初期値、T := 0, TR := ΔTRである。
【０１３１】
ステップ１４０２で、外部ペリフェラル・スケジューラは、ＩＱの更新待ちを行い、ステップ１４０４では、全ＩＱがfilledかどうか判断し、そうでなければステップ１４０２に戻って、ＩＱの更新待ちを続ける。
【０１３２】
そうしてステップ１４０４で、外部ペリフェラル・スケジューラが、全ＩＱがfilledと判断すると、ステップ１４０６で、全ＩＱ中最も近い時刻をT0とおく。ここで、T ≦ T0 ≦ TPであって、TPは現在のプラント時間である。
【０１３３】
ステップ１４０８では、外部ペリフェラル・スケジューラは、Te = T0 in IQ、すなわち、ＩＱにTe = T0となるタスクeがあるかどうかを判断する。もしそうなら、外部ペリフェラル・スケジューラは、ステップ１４１０でイベントeをポップし、ステップ１４１２で insert(e1[t])、insert(e2[t]) により、ＴＱの更新を行う。ここで、イベントe1は、<read,t,r>すなわち、時刻tにレジスタrの値を読み込むイベントであり、イベントe2は、<write,t,r,v>すなわち、時刻tにレジスタrの値をvに更新するイベントである。
【０１３４】
ステップ１４１２の後はステップ１４０８に戻り、そこで、外部ペリフェラル・スケジューラがＩＱにTe = T0となるタスクeがないと判断すると、ステップ１４１４で、T := T0とセットし、ステップ１４１６で、T = TPであるかどうか判断する。
【０１３５】
もしステップ１４１６で、T = TPであると判断すると、外部ペリフェラル・スケジューラはステップ１４１８で、insert(e4[T])を呼び出して、ＴＱに、時刻Tで発火するタスク<plant_go>を追加する。ここでe4とは、プラントを時刻min{Ttop,T + ΔTR}まで実行するイベントである。Ttopは、ＴＱの先頭時刻であり、ＴＱが空の場合はTtop = ∞とおく。ここはすなわち、全てのプロセッサがプラントに追いついたら、ブラント先行実行ざせる処理である。
【０１３６】
ステップ１４１８の次は、ステップ１４２０の判断ステップに進む。ステップ１４１６で、T = TPでないと判断された場合は直接、ステップ１４２０に進む。
【０１３７】
ステップ１４２０では、外部ペリフェラル・スケジューラは、peek()を呼び出して、ＴＱに、Tk = Tとなるイベントkがあるかどうかを判断する。もしなければ、処理は、ステップ１４０４に戻る。
【０１３８】
ステップ１４２０で、ＴＱにTk = Tとなるイベントkがあると判断すると、外部ペリフェラル・スケジューラはステップ１４２２で、kをポップし、ステップ１４２４で、kがプラント実行かどうか判断する。
【０１３９】
外部ペリフェラル・スケジューラが、ステップ１４２０で、kがプラント実行であると判断すると、ステップ１４２６で、advance()を呼び出してプラントを実行する。
【０１４０】
次のステップ１４２８では、外部ペリフェラル・スケジューラは、ＴＱの更新を行う。具体的には、output(t,y)を受けて、pusg(e3[t])を実行し、ＰＶを参照して、input(u)を通知する。そして、nullメッセージを送信する。ここでe3とは、<port_update,p,v>でポートpの値をvに更新するというイベントである。
【０１４１】
次のステップ１４３０で、外部ペリフェラル・スケジューラはTpを更新し、次のステップ１４３２で、処理の完了かどうか判断する。もし処理の完了であると判断されると、処理はステップ１４２０に戻る。処理の完了でないと判断されると、ステップ１４３４でタスクを戻してから、処理はステップ１４２０に戻る。
【０１４２】
ステップ１４２４に戻って、kがプラント実行でないと判断すると、外部ペリフェラル・スケジューラはステップ１４３６に進み、next()を呼び出して、タスクを実行する。これは具体的には、<interrupt>、<register value>、<register_update>、<port_update>を実行し、nullメッセージを送信する。
【０１４３】
次のステップ１４３８では、外部ペリフェラル・スケジューラは、ＯＱの更新を行う。ここで、ＯＱにnull以外のメッセージを追加した場合、ＴＱに時刻T + ΔTRで発火するタスク<plant_go>を追加する。すなわち、insert(e4[T + ΔTR])を実行するのであるが、より具体的に言うと、e4は、プラントを時刻min{Ttop,T+ ΔTR}まで実行するものである。ここで、Ttopは、ＴＱの先頭時刻であり、ＴＱが空の場合はTtop = ∞とおく。
【０１４４】
次のステップ１４４０では、外部ペリフェラル・スケジューラは、ＯＱをフラッシュして、ステップ１４２０に戻る。
【０１４５】
以下では、保守的なイベント同期を行う際にデッドロックが生じること、また、それを回避するためには nullメッセージが必要であることを説明する。なお、これは新しい発見ではなくて、従来より知られた知見である。
【０１４６】
シミュレーション対象を分割し各領域のシミュレータ（またはエミュレータ）を接続して全体のシミュレーションを行う際、通信インタフェースを含む各領域のシミュレーション単位を論理プロセスと呼ぶ。図１６に、論理プロセスの構成を示す。
【０１４７】
図１６に示すように、保守的なイベント同期のシミュレーションにおいては、論理プロセス（ＬＰk）は、メッセージ受信のための入力キューＩＱと、メッセージ送信のための出力キューＯＱと、予定されたシミュレーションタスクを記憶するためのタスクキューＴＱと、現在時刻を示すスカラー値をもつ。ＩＱとＯＱはＦＩＦＯであり、ＴＱは時間順にソートされている。
【０１４８】
図１７は、複数の論理プロセス（ＬＰ1〜ＬＰ4）が通信チャネルを介して接続されている様子を示す図である。このように接続を図るために、個々の論理プロセスは、ＩＱとＯＱを通信チャネル毎にもつ。
【０１４９】
論理プロセスはＩＱ、ＯＱを用いて、時刻の情報（時刻印）を持つメッセージを交換する。ＩＱ／ＯＱに送出/受信されるメッセージの時刻印は、送出/受信を行うたびに単調増加する。このため、論理プロセスが他の全ての論理プロセスからメッセージを受取ると、受取ったメッセージのうち最も小さい時刻印までロールバックすることなくシミュレーションを進めることができる。交換されるメッセージにはイベントメッセージとnullメッセージがある。
【０１５０】
時刻tのイベントeに関するイベントメッセージとは、「送信側から受信側に対して発生する次のイベントの時刻がtであり、発生するイベントはeである」ことを伝えるメッセージである。
【０１５１】
時刻tのnullメッセージとは、「送信側から受信側に対して発生する次のイベントの時刻が、tより後である」ことを伝えるメッセージであり、受信側のシミュレーション領域そのものには影響を与えない。nullメッセージの目的は、下に述べるデッドロックを防ぐことである。保守的なイベント同期ではロールバックを防ぐために、他の全ての論理プロセスから現在時刻より大きな時刻印のメッセージを受信するまで処理を停止する。しかし、メッセージの受信を待つ相手の論理プロセスも同じ時刻でその論理プロセスからの受信を待つ場合、図18(a)のようにお互いがメッセージを待ち合って処理を再開できない。そこで、現在時刻からどれだけ先まで外部へのイベントが発生しないかを「先読み」して、図１８(b)のように、nullメッセージを送ることで、デッドロックを防ぐ。
【０１５２】
論理プロセスの処理の概要は、次のとおりである。
(1) 全てのＩＱにメッセージが到着するまで待機
(2) ＩＱの中で最も時刻の早いメッセージ(t = T0)をポップ
(3) T0まで現在時刻を進めながら、シミュレーションを実行（タスクキューをポップして実行）
(a) 未来のイベントはタスクキューに追加
(b) 発生した外部へのイベントは逐次ＯＱに追加
(c) イベント追加がないＯＱには、nullメッセージを追加（t = 現在時刻 + 先読み時間）
(2)でポップしたメッセージを処理して(1)に戻る
【０１５３】
なお、本発明では特に、「先読み」を行わないnullメッセージ（送信時の現在時刻を時刻印としてもつnullメッセージ）を進捗メッセージと呼ぶ。  進捗メッセージの目的は、微小な先読み幅をもつnullメッセージによって生じてしまう頻繁な同期を回避することである。本発明では、内部ペリフェラル・スケジューラが進捗メッセージを送信する。これは、内部ペリフェラル・スケジューラを駆動するＩＳＳが、微小な幅でしか他の論理プロセスへの次のイベントを予測できないからである。
【０１５４】
次に図１９を参照して、プロセッサの通信遅延ΔTcについて説明する。すなわち、図示されているように、相互ペリフェラルへの書込み(write)から、受信側／送信側プロセッサへの割込みが発生するまでの遅延の最小値がプロセッサの通信遅延ΔTcである。
【０１５５】
ちなみに、最大ボーレート1.0MbpsのＣＡＮによる通信では、データフレームの最大遅延は44μ秒（フレームの最小ビット数が44)で、これがΔTcの参考値である。
【０１５６】
次に図２０を参照して、プロセッサの反応遅延ΔTRについて説明する。すなわち、プロセッサの反応遅延ΔTRとは、図示されているように、プラントの入力時刻から、それによるプロセッサの反応がプラントに伝わって有効となるまでの遅延の最小値である。図２０でTRとは、ＴＱが空の場合にプロセッサの反応がプラントに到達する可能性のある最小時刻である。
【０１５７】
前提として、プラントの状態変化に起因する割込みを受け付けてから、TR以内に、プラントへの最初のイベント発生時刻Treactionを決めるレジスタ書込み（例：タイマスタートレジスタへの書込み）が発生する。この書込み時刻をTtriggerと表記すると、下記の式が成立する。
Ttrigger  << TR ≦ Treaction
プロセッサが動作を決定（時刻Ttrigger）してからアクチュエータが動作（時刻Treaction）するまでの時間を先読みとしてプラントを先行実行しても。時間正確性は失わない、という知見を利用するために、プロセッサの反応遅延ΔTRが使用される。
【０１５８】
次に、プロセッサ反応遅延の例を示す。最初の例として、エンジン燃料噴射制御において、クランク15°毎にプラントから回転パルス（state change）が発生する場合、燃料噴射や点火の指示は、その時間を正確にするためにタイマーを利用して実行される。タイマーへの時間セットは、ひとつ以上前の回転パルスが発生したときに計算するので、噴射・点火までには、ひとつ以上のパルス間隔、すなわち、最大回転数10,000 rpmではパルス間隔 250μ秒以上の十分な遅延がある。これを反応遅延とする。
【０１５９】
別の例として、プラントからの入力に対しプロセッサが即時に指示を返す制御では、反応遅延は非常に小さい。しかしこの種の制御では、プロセッサに比べて鈍い物理現象に対し周期的なタスクを実行するものが多い（例： 温度を制御量としたファンへのPWM信号の指示、車速を制御量としたスロットル開度の指示）。温度、速度、トルクの制御周期の目安はそれぞれ1秒、1ミリ秒、0.1ミリ秒であり、これより細かな時間粒度でプラントへの指示行う必要はない。このため、プラントの粗い時間粒度から定めた時間を、反応遅延として利用する。
【０１６０】
次に、図２１を参照して、共有メモリ・アクセスのシミュレーションを説明する。図２１においては、プロセッサＰｒ１、Ｐｒ２、Ｐｒ３が共有メモリにアクセスするとする。そこで、プロセッサＰｒ１、Ｐｒ２が先行していて、プロセッサＰｒ３がプロセッサＰｒ１、Ｐｒ２に追随するものとする。すると、プロセッサＰｒ３は、ＩＱの内容から、自分が最も昔の時刻にいること、及び後ろから２番手のプロセッサの時刻が分かる。そこで、storeとloadを実行し、２番手に追随する。最後に、load直前で停止し、ＩＱに到達した過去のstoreを時間順に全て反映してからloadを実行して再開する。
【０１６１】
すると、全てのプロセッサが必ずどこかで「最も昔の時刻」に到達して再開していくので、デッドロックが回避される。逆に言えば、このように R/W が同期的に動作する論理プロセスの場合には、デッドロックは生じない。こうして、読書きの一貫性を保ちながら、デッドロックなくシミュレーションすることが可能となる。
【０１６２】
図２２は、ＩＳＳ、ペリフェラル・エミュレータ、プラントシミュレータおよび本発明の3つのスケジューラ機能の、ホスト計算機のコアへの割当て例を示している。プロセッサと通信頻度の高い内部ペリフェラル・スケジューラとＩＳＳを同じコア２２０４でエミュレートすることで、シミュレーションを高速に実行することができる。。
【０１６３】
内部ペリフェラル・スケジューラは、ＥＣＵのメモリマップ仕様を参照して、ＩＳＳからのload/store命令を、内部ペリフェラル（コア内のSystemC）、相互ペリフェラル、 外部ペリフェラルに振り分ける。
【０１６４】
尚、図中の表記は、次のとおりである。
<ISS>
int: interrupt
rs: resume
a:  advance
l:  load
s:  store
c:  complete
<SystemC>
r:  read
w:  write
ru: register update
int: interrupt
pu: port update
<plant>
a: advance
i: input
c: complete
o: output
<通信チャネル>
r: read
w: write
ru: register update
int: interrupt
【０１６５】
次に図２３を用いて、ＣＡＮデバイスが調停の敗退後にプロセッサへアボート通知を行う動作を、相互ペリフェラル・スケジューラが保守的に（ロールバックさせることなく）エミュレートできることを説明する。  図２３は、２つのプロセッサ１、２がＣＡＮデバイスに対してＣＡＮフレームの送信要求を行う例を示している。プロセッサ１が送信要求するフレームは、プロセッサ２が送信要求するフレームより優先度が高い。プロセッサ２はＣＡＮデバイスに対し、調停に敗れた場合には送信待機状態の解除を行って割込み通知をするよう、指令を出している（アボートセット）。また、図の縦方向の矢印はゲスト時間の進行を示す。
【０１６６】
図２３の例では、２つのプロセッサがＣＡＮデバイス（相互ペリフェラル）に、アボートセットと送信セットを行った後、ＣＡＮデバイスのエミュレータ(SystemC等で記述)が調停処理を開始する。調停開始のイベントはＣＡＮデバイスのエミュレータによってＴＱに追加されたものであり、相互ペリフェラル・スケジューラの処理によって、全てのプロセッサがこの時刻（調停開始）でゲスト時間の同期を取る。この例におけるアボートセット、２つの送信セット、調停はそれぞれ、図１５において、ＩＱに到着するＣＡＮアボート、ＩＱに到着する２つのＣＡＮ送信、ＴＱに追加される調停イベントに対応する。また図２３でプロセッサの時刻の同期をとる相互ペリフェラル・スケジューラの処理とは、ＴＱ先頭の時刻のnullメッセージの送出と進捗メッセージの受信であり、図１５に関連して説明した処理と同一である。
【０１６７】
また図２３の例は、調停が開始されると、ＣＡＮデバイスのエミュレータが敗退通知時刻のイベントをTQに追加することを示している。相互ペリフェラル・スケジューラが次にプロセッサに先行実行を通知する際、送出するnullメッセージの時刻印は、ΔTCではなく、ここで追加された敗退通知の時刻である。このため、プロセッサ２が、敗退通知の時刻を通り過ぎること（ロールバックを要するオーバーヘッド）がない。
【０１６８】
次に図２４を用いて、高優先度のＣＡＮフレームを送信要求したプロセッサがＣＡＮデバイスをリセットする場合の動作を、相互ペリフェラル・スケジューラが保守的に（ロールバックさせることなく）エミュレートできることを説明する。これは、ＣＡＮデバイスのエミュレータにおいて、敗退を通知する前にリセットの有無をチェックすることで可能となる。図２４に示す動作は、調停開始までは図２３と同じである。
【０１６９】
図２４の例は、ゲスト時間上、調停が開始されてから調停が完了（フレームの勝利と敗退が確定）するまでの間に、優先度の高いＣＡＮフレーム要求を出したプロセッサ１がＣＡＮデバイスをリセットすることを示している。調停が開始された時点で、図２３の例で述べたように、ＣＡＮデバイスのエミュレータによって、プロセッサ２に対してアボート通知のためのイベントがＴＱに追加される。
【０１７０】
図２４の例では、ここで追加されたアボート通知のためのイベントの処理において、ＣＡＮデバイスのエミュレータが、アボート通知を行う前にリセット通知の有無をチェックし、アボート通知を行うか否かを決定することを示している。
【０１７１】
この決定処理でＣＡＮデバイスのエミュレータは、リセット通知があった場合、どのＣＡＮフレームが調停に勝利するかを再び計算する。再計算の結果、調停開始時に敗退する予定であったフレームが調停に勝利した場合、アボートが発生しないので、プロセッサにアボートを通知しない。図２４の例は、プロセッサ２が送信要求を出したＣＡＮフレーム（調停開始時には敗退予定）が再計算の結果調停に勝利した結果、予定されていたアボート通知が行われないことを示す。
【０１７２】
再計算の結果、調停開始時に敗退する予定であったフレームが再び調停に敗退した場合、アボートが発生するので、予定通りプロセッサにアボートを通知する。また、上の決定処理においてリセット通知がなかった場合、ＣＡＮフレームの勝敗が調停開始時から変わることはない。このため、リセット通知がなかった場合も、調停開始時に予定されたアボートをプロセッサに通知する。
【０１７３】
このように、ＣＡＮデバイスのエミュレータにおいて敗退を通知する前にリセットの有無をチェックすることで、リセットによってアボートが発生しないにも関わらず誤ってプロセッサがアボート通知を受取る（ロールバックを要するオーバーヘッド）ことがない。
【０１７４】
次に、図２５を参照して、本発明を実施するための別の実施例を説明する。図２５において、プロセッサ・エミュレータ２５０２ａ、・・・、２５０２ｍ、２５０４ａ、・・・、２５０４ｎは、図２に示すプロセッサ・エミュレータ２０２ａ、・・・、２０２ｚと機能的に実質的に同一である。
【０１７５】
ペリフェラル・エミュレータ２５０６ａ、・・・、２５０６ｍ、２５０８ａ、・・・、２５０８ｎも、図２に示すペリフェラル・エミュレータ２０４ａ、・・・、２０４ｚと機能的に実質的に同一である。
【０１７６】
図２５の構成が、図２の構成と異なるのは、プラント・シミュレータが、能動的(active)プラント・シミュレータ２５１０ａ、・・・、２５１０ｍと、受動的（passive）プラント・シミュレータ２５１２ａ、・・・、２５１２ｎに分かれていることである。ここで、能動的プラント・シミュレータとは、エンジン・シミュレータのように、状態変化のタイミングなどを自律的に決定する機能をもつプラント・シミュレータである。例えば、エンジンは、クランク角度を１５度刻みのパルスで知らせるプラントであるが、そのタイミングは、コントローラ（ＥＣＵ）側で決定することはできない。
【０１７７】
一方、受動的(passive)プラント・シミュレータとは、タイミングを、コントローラが決定できるプラント・シミュレータで、例えば、電池の電圧を指定されたタイミングでモニター（サンプル）するプラントがそれに該当する。それ以外にも、温度センサ、圧力センサ、回転速度センサなど、センサ系のプラントが、受動的プラントに該当する。ブレーキやサスペンションもサンプリングによって状態をセンスする場合には、受動的プラントとして分類する。
【０１７８】
このような能動的プラント・シミュレータと、受動的プラント・シミュレータの仕分けに対応して、外部ペリフェラル・スケジューラも、能動的プラント・シミュレータに接続されたペリフェラル・エミュレータをスケジューリングする外部ペリフェラル・スケジューラ２５１４ａと、受動的プラント・エミュレータに接続されたペリフェラル・シミュレータをスケジューリングする外部ペリフェラル・スケジューラ２５１４ｂとが設けられる。能動的プラント・シミュレータに接続されたペリフェラル・エミュレータに対して、対応するプロセッサ・エミュレータは、シグナル更新を通知する一方で、状態変化を受取るという双方向の働きかけがあるが、受動的プラント・シミュレータに接続されたペリフェラル・エミュレータに対して、対応するプロセッサ・エミュレータは、原則的に、シグナル更新とサンプリング予告を通知するだけである。
【０１７９】
能動的プラント・シミュレータと、受動的プラント・シミュレータの仕分けは、基本的には、プロセッサ・エミュレータ間の通信には影響を与えないので、相互ペリフェラル・スケジューラ２５１６の動作は、実質的に図２の相互ペリフェラル・スケジューラ２１０と同一であるし、ＣＡＮエミュレータ２５１８も、図２のＣＡＮエミュレータ２１２と、実質的に同一である。
【０１８０】
ところで、能動的プラント・シミュレータのための外部ペリフェラル・スケジューラ２５１４ａは、図２の外部ペリフェラル・スケジューラ２０８と機能的に実質的に同一であるが、受動的プラント・シミュレータのための外部ペリフェラル・スケジューラ２５１４ｂは、プロセッサに対してプラントを先行させる時間幅を計算する処理が不要である。
【０１８１】
そこで、外部ペリフェラル・スケジューラ２５１４ｂの動作を、図２６のフローチャートを参照して説明する。ここでの初期値は、全てのＩＱは空、全てのＯＱは空、ＴＱは空、ＰＶ（ポート値）はＥＣＵ仕様での初期値、T := 0である。受動的プラント・シミュレータのための外部ペリフェラル・スケジューラは、先行するプロセッサの時刻が通知される度にその時刻に追いつく、という処理を繰り返すだけでよい。
【０１８２】
ステップ２６０２で、外部ペリフェラル・スケジューラ２５１４ｂは、ＩＱの更新待ちを行い、ステップ２６０４では、全ＩＱがfilledかどうか判断し、そうでなければステップ２６０２に戻って、ＩＱの更新待ちを続ける。
【０１８３】
そうしてステップ２６０４で、外部ペリフェラル・スケジューラ２５１４ｂが、全ＩＱがfilledと判断すると、ステップ１４０６で、全ＩＱ中最も近い時刻をT0とおく。
【０１８４】
ステップ２６０８では、外部ペリフェラル・スケジューラ２５１４ｂは、Te = T0 in IQ、すなわち、ＩＱにTe = T0となるタスクeがあるかどうかを判断する。もしそうなら、外部ペリフェラル・スケジューラ２５１４ｂは、ステップ２６１０でイベントeをポップし、ステップ２６１２で、ＴＱの更新を行う。
【０１８５】
ステップ２６１２の後はステップ２６０８に戻り、そこで、外部ペリフェラル・スケジューラ２５１４ｂがＩＱにTe = T0となるタスクeがないと判断すると、ステップ２６１４で、T := T0とセットする。
【０１８６】
次にステップ２６１６に進み、そこで外部ペリフェラル・スケジューラ２５１４ｂは、プラントをTまで実行する。このとき、プラントは受動的プラントであるので、外部ペリフェラル・スケジューラ２５１４ｂは、状態変化の通知を受けることはない。
【０１８７】
次に外部ペリフェラル・スケジューラ２５１４ｂは、ステップ２６１８で、ＴＱエントリ(T)を実行して、ステップ２６０４に戻る。
【０１８８】
尚、相互ペリフェラル・スケジューラが扱う車載ＬＡＮプロトコルとして、ＣＡＮの場合について説明したが、本発明のシミュレーション・システムは、ＣＡＮに限定されず、ＬＩＮ、FlexRayなどの任意の車載ＬＡＮプロトコルにも適用可能である。
【０１８９】
以上、自動車用の複数のシミュレーション・システムに関連して、本発明の特定の実施例を説明してきたが、本発明はこのような特定の実施例に限定されず、飛行機用のシミュレーション・システムなど、一般的な電子機械制御系システムのシミュレーション・システムに適用可能であることを、この分野の当業者であるなら、理解するであろう。
【０１９０】
また、本発明は、特定のコンピュータのアーキテクチャやプラットフォームに限定されることなく、マルチタスクを実現可能な任意のプラットフォームで実装可能である。
【符号の説明】
【０１９１】
１０２                            ホスト・バス
１０４ａ，・・・１０４ｎ          ＣＰＵ
１０６                            メイン・メモリ
１１６                            ハードティスク・ドライブ
２０２，２５０２，２５０４        プロセッサ・エミュレータ
２０４，２５０６，２５０８        ペリフェラル・エミュレータ
２０６，２５１０，２５１２        プラント・シミュレータ
２０８，２５１４ａ，２５１４ｂ    外部ペリフェラル・スケジューラ
２１０，２５１６                  相互ペリフェラル・スケジューラ
２１２，２５１８                  ＣＡＮエミュレータ
【図１】
0005583773.tif 000002
【図２】
0005583773.tif 000003
【図３】
0005583773.tif 000004
【図４】
0005583773.tif 000005
【図５】
0005583773.tif 000006
【図６】
0005583773.tif 000007
【図７】
0005583773.tif 000008
【図８】
0005583773.tif 000009
【図９】
0005583773.tif 000010
【図１０】
0005583773.tif 000011
【図１１】
0005583773.tif 000012
【図１２】
0005583773.tif 000013
【図１３】
0005583773.tif 000014
【図１４】
0005583773.tif 000015
【図１５】
0005583773.tif 000016
【図１６】
0005583773.tif 000017
【図１７】
0005583773.tif 000018
【図１８】
0005583773.tif 000019
【図１９】
0005583773.tif 000020
【図２０】
0005583773.tif 000021
【図２１】
0005583773.tif 000022
【図２２】
0005583773.tif 000023
【図２３】
0005583773.tif 000024
【図２４】
0005583773.tif 000025
【図２５】
0005583773.tif 000026
【図２６】
0005583773.tif 000027