(57)【特許請求の範囲】
【請求項１】
関数として実装され、バスマスタの動作をシミュレートするマスタシミュレータと、
関数として実装され、バススレーブの動作をシミュレートするスレーブシミュレータと、
前記マスタシミュレータ及び前記スレーブシミュレータを順次サイクリックに関数呼び出しする処理が記述される関数用マネージャと、
前記マスタシミュレータを実行するスレッドにセマフォを用いてサイクリックに制御を移す処理が記述されるスレッド用マネージャと
を具備し、
前記関数用マネージャと前記スレッド用マネージャとは各々スレッドとしてあらかじめ起動され、前記関数用マネージャは、前記マスタシミュレータを実行するスレッドを起動し、
前記関数用マネージャに関数呼び出しされた前記マスタシミュレータにアクセスブロッキングが発生すると、前記マスタシミュレータは、セマフォを用いて前記スレッド用マネージャを実行するスレッドに制御を移し、
制御を移された前記スレッド用マネージャは、前記マスタシミュレータを実行するスレッドにサイクリックに制御を移す処理を開始する
システムシミュレータ。
【請求項２】
前記スレッド用マネージャは、更に、前記スレーブシミュレータを関数呼び出しにより実行させる
請求項１に記載のシステムシミュレータ。
【請求項３】
前記アクセスブロッキングが解消された後は、前記スレッド用マネージャは、関数呼び出しにより前記関数用マネージャに制御を戻す
請求項１又は２に記載のシステムシミュレータ。
【請求項４】
関数として実装されるマスタシミュレータによりバスマスタの動作をシミュレートするステップと、
関数として実装されるスレーブシミュレータによりバススレーブの動作をシミュレートするステップと、
前記マスタシミュレータ及び前記スレーブシミュレータを順次サイクリックに関数呼び出しして実行させるステップと、
前記マスタシミュレータを実行するスレッドにセマフォを用いてサイクリックに制御を移すステップと、
前記関数呼び出しして実行させるステップと前記セマフォを用いてサイクリックに制御を移すステップとを各々スレッドとして予め起動するステップと
を具備し、
前記予め起動するステップにおいて起動された前記関数呼び出しして実行させるステップは、前記マスタシミュレータを実行するスレッドを起動するステップを備え、
前記バスマスタの動作をシミュレートするステップは、関数呼び出しされた前記マスタシミュレータにアクセスブロッキングが発生したとき、前記セマフォを用いてサイクリックに制御を移すステップに制御を移すステップを備え、
制御を移された前記セマフォを用いてサイクリックに制御を移すステップは、前記マスタシミュレータを実行するスレッドに制御を移す処理を開始するステップを備える
シミュレーション方法。
【請求項５】
前記セマフォを用いてサイクリックに制御を移すステップは、前記スレーブシミュレータを関数呼び出しにより実行させるステップを更に備える
請求項４に記載のシミュレーション方法。
【請求項６】
前記アクセスブロッキングが解消された後は、前記マスタシミュレータを前記関数呼び出しして実行させるステップに制御を戻すステップを更に備える
請求項４又は５に記載のシミュレーション方法。
【請求項７】
バスマスタの動作をシミュレートするマスタシミュレーションプログラムと、
バススレーブの動作をシミュレートするスレーブシミュレーションプログラムと、
前記マスタシミュレーションプログラム及び前記スレーブシミュレーションプログラムを順次サイクリックに関数呼び出しする処理が記述される関数用マネージャプログラムと、
前記マスタシミュレータを実行するスレッドにセマフォを用いてサイクリックに制御を移す処理が記述されるスレッド用マネージャプログラムと、
前記関数用マネージャプログラムと前記スレッド用マネージャプログラムとを各々スレッドとして予め起動するプログラムと
を具備し、
前記関数用マネージャプログラムは、前記マスタシミュレーションプログラムを実行するスレッドを起動する処理を含み、
前記関数マネージャプログラムに関数呼び出しされる前記マスタシミュレーションプログラムは、実行時にアクセスブロッキングが発生すると、セマフォを用いて前記スレッド用マネージャプログラムを実行するスレッドに制御を移す処理を含み、
前記スレッド用マネージャプログラムは、制御を移されると前記マスタシミュレーションプログラムを実行するスレッドにサイクリックに制御を移す処理を含む
コンピュータに実行させるためのシミュレーションプログラム。
【請求項８】
前記スレッド用マネージャプログラムは、更に、前記スレーブシミュレーションプログラムを関数呼び出しにより実行させる処理が記述される
請求項７に記載のシミュレーションプログラム。
【請求項９】
前記アクセスブロッキングが解消された後は、前記スレッド用マネージャプログラムは、関数呼び出しにより前記関数用マネージャプログラムに制御を戻す処理が記述される
請求項７又は８に記載のシミュレーションプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、システムシミュレータ、シミュレーション方法及びシミュレーションプログラムに関し、特にバスマスタとバススレーブとがバスを介して接続されたシステムをシミュレーションする技術に関する。
【０００２】
【従来の技術】
従来、マイクロプロセッサを応用した装置として、バスマスタ（以下、単に「マスタ」という）とバススレーブ（以下、単に「スレーブ」という）とがバスによって接続されることにより構成されるシステムが知られている。このようなシステムの開発におけるソフトウェアの開発は、一般に、該ソフトウェアを動作させるためのハードウェア環境が整ってから、換言すれば、ハードウェアの開発が完了した後に、そのハードウェアを用いて行われる。
【０００３】
しかしながら、このような従来の開発方法では、システムの開発に長期間を必要とする。そこで、最近は、開発期間を短縮するために、ソフトウェアの開発をシミュレータ上で行い、以てハードウェアの開発とソフトウェアの開発とを並行して行う方法が採用されている。
【０００４】
図１７は、このようなソフトウェアの開発に使用される従来のシステムシミュレータ（以下、「第１の従来技術に係るシステムシミュレータ」という）の構成を示す。このシステムシミュレータは、第１マスタ、第２マスタ、スレーブ及びマネージャから構成されている。
【０００５】
第１マスタは、例えばＣＰＵやＤＭＡといったマスタとして使用されるデバイスをシミュレーションするためのプログラムで構成されたシミュレータである。第２マスタは、同じくマスタとして使用される他のデバイスをシミュレーションするためのプログラムで構成されたシミュレータである。スレーブは、例えばタイマ、シリアル入出力ポート、汎用入出力ポート、メモリといったスレーブとして使用される周辺回路をシミュレーションするためのプログラムで構成されたシミュレータである。マネージャは、第１マスタ、第２マスタ及びスレーブを同期して動作させるための制御プログラムである。
【０００６】
このように構成される第１の従来技術に係るシステムシミュレータは、第１マスタ、第２マスタ及びスレーブの各々に組み込まれるプログラムの正当性を検証するために使用される。
【０００７】
この第１の従来技術に係るシステムシミュレータでは、シミュレーションは、マネージャが第１マスタ、第２マスタ及びスレーブに対して関数呼び出しを順次実行することにより進められる。より詳しくは、マネージャは、先ず第１マスタに対して関数呼び出しを実行する。これにより、第１マスタは、１クロックに相当する処理を実行する。例えば、関数呼び出しの対象が１クロックで完了する命令であれば、１命令が実行され、その後、制御はマネージャに戻される。関数呼び出しの対象が複数クロックを必要とする命令であれば、１クロック分の処理が完了した時点で、制御はマネージャに戻される。
【０００８】
次いで、上記と同様にして、第２マスタに対して関数呼び出しが実行され、引き続いて、スレーブに対して関数呼び出しが実行される。以下、第１マスタ→第２マスタ→スレーブ→第１マスタ→・・・と関数呼び出しがサイクリックに実行されることにより、シミュレーションが進行する。なお、関数呼び出しの対象が複数クロックを必要とする命令の場合は、その対象に対して複数のサイクルにわたって複数回の関数呼び出しが実行されることにより、１命令が完了する。
【０００９】
このように、第１マスタ、第２マスタ及びスレーブは、マネージャから関数呼び出しが行われる毎に１クロック分に相当する処理を順次実行する。従って、第１マスタ、第２マスタ及びスレーブは恰もクロックに同期しているように動作する。即ち、第１マスタ、第２マスタ及びスレーブは、マネージャから動作タイミングを貰って動作すると考えることができる。これにより、タイミングを考慮したシミュレーションが可能になっている。
【００１０】
図１８は、複数のシミュレータを同期させるための同期機構としてセマフォ（semaphore）を用いた従来の他のシステムシミュレータ（以下、「第２の従来技術に係るシステムシミュレータ」という）の構成を示す図である。この第２の従来技術に係るシステムシミュレータは、常にマルチスレッドな動作を行う。
【００１１】
この第２の従来技術に係るシステムシミュレータは、第１マスタ、第２マスタ、スレーブ、マネージャ及びバスから構成されている。これら第１マスタ、第２マスタ、スレーブ及びマネージャは、上述した実施例のそれらと同様の機能を有する。バスは、図１７では図示を省略したが、第１マスタ及び第２マスタがスレーブにアクセスする際のバスの動作をシミュレーションするためのシミュレータである。
【００１２】
図１８において、第１マスタ、第２マスタ、マネージャ及びバス中の記号○は、セマフォを表す。記号Ｐはポストを、Ｗはウエイトを、Ｔはトライウエイトをそれぞれ表す。トライウエイトは、バスに対して問い合わせをする機能である。この第２の従来技術に係るシステムシミュレータでは、第１マスタ、第２マスタ及びマネージャの何れか１つのみが起動されるように制御される。
【００１３】
基本的には、マネージャは、第１マスタ及び第２マスタ（以下、単に「マスタ」と総称する場合がある）のセマフォに対してポスト（Ｐ）を行うことによりマスタのスレッドを起動し、自身はウエイト（Ｗ）する。また、マスタは、マネージャのセマフォに対してポスト（Ｐ）を行うことにより制御をマネージャに戻し、自身はウエイト（Ｗ）する。スレーブは、上述した第１の従来技術に係るシミュレータと同様に、マネージャがスレーブに対して関数呼び出しを実行することにより起動される。
【００１４】
この第２の従来技術に係るシミュレータの具体的な動作を、図１９〜図２１を参照しながら説明する。
【００１５】
図１９は、マネージャと第１マスタとの間の遷移動作を説明するための図であり、点線は制御の流れを示す。マネージャは、先ず、第１マスタのセマフォに対してポストを行い、自身はウエイトする。このポストにより、ウエイトしている第１マスタのスレッドが起動され、バスのセマフォに対してトライウエイトを行う。そして、このトライウエイトが失敗すれば、第１マスタは、マネージャのセマフォに対してポストを行い、第１マスタはウエイトする。
【００１６】
図２０は、マネージャと第２マスタとの間の遷移動作を説明するための図であり、点線は制御の流れを示す。上述したように、第１マスタがマネージャのセマフォに対してポストを行うことにより制御がマネージャに移ると、次いで、マネージャは、第２マスタのセマフォに対してポストを行い、自身はウエイトする。このポストにより、ウエイトしている第２マスタのスレッドが起動され、バスのセマフォに対してトライウエイトを行う。そして、このトライウエイトが失敗すれば、マネージャのセマフォに対してポストを行い、第２マスタはウエイトする。
【００１７】
図２１は、マネージャとスレーブとの間の遷移動作を説明するための図であり、点線は制御の流れを示す。上述したように、第２マスタがマネージャのセマフォに対してポストを行うことにより制御がマネージャに移ると、次いで、マネージャは、スレーブに対して関数呼出を実行する。スレーブは、第１マスタ及び第２マスタからのアクセス要求に対して応答可能になったらバスのセマフォに対してポストする。これにより、第１マスタ及び第２マスタによる次回のトライウエイトは成功することになる。その後、制御は、スレーブからマネージャに戻される。以下、上述した動作が繰り返される。
【００１８】
このように、第１マスタ及び第２マスタはスレッド切り替えを行いながら各スレッドで１クロック分に相当する処理を順次実行し、スレーブは、マネージャから関数呼び出しが行われる毎に１クロック分に相当する処理を実行する。従って、第１マスタ、第２マスタ及びスレーブは恰もクロックに同期しているように動作するので、タイミングを考慮したシミュレーションが可能になっている。
【００１９】
この第２の従来技術に係るシステムシミュレータによれば、マスタがスレーブにアクセスする際に、アクセスブロッキングが発生しても、つまりマスタがバスのトライウエイトに失敗しても、マスタが応答待ちを継続することが無いので、デッドロック状態に陥ることはない。
【００２０】
なお、関連する技術として、特開平１１−２９６４０８号公報は、ハードウェアのシミュレーションを複数のアプリケーションで実現し、それらを連携動作させることにより、ハードウェアの動作の記述を容易にすると共に、ソフトウェアのデバッグ効率を向上させる組み込み機器用ソフトウェア論理シミュレータを開示している。このシミュレータによれば、ハードウェアシミュレータとソフトウェアとを協調してデバッグする場合に、ハードウェアの動作のシミュレーションが非常に遅かったり、ハードウェアの記述に難があるという点が解消される。
【００２１】
【発明が解決しようとする課題】
しかしながら、上述した第１の従来技術に係るシステムシミュレータは、次のような問題を有する。即ち、マスタのプログラムには、スレーブにアクセスする命令が含まれる。マスタがこの命令を実行した場合にスレーブが１クロックに相当する時間で応答できる場合は問題ないが、スレーブの多くは応答に数クロックを必要とする。このように、マスタからのアクセスにスレーブが直ちに応答できない現象を「アクセスブロッキング」と呼ぶ。アクセスブロッキングには、リードアクセスブロッキング及びライトアクセスブロッキングが含まれる。
【００２２】
このアクセスブロッキングが発生すると、マスタはスレーブからの応答待ちに入り、制御がマネージャに返されなくなる。その結果、スレーブにクロックが与えられなくなるので、マスタの応答待ちは継続されたままでシステムシミュレータはデッドロック状態に陥る。
【００２３】
この問題は、システムシミュレータ上におけるスレーブの仕様を変更して１クロックで応答を返すようにすれば解消される。しかし、この場合は、システムシミュレータ上でのスレーブと実際のスレーブとの仕様が異なることになり、タイミングを考慮したシミュレーションを行うことができない。或いはまた、上記問題は、スレーブの応答待ちになったマスタは、制御をマネージャに強制的に返すようにマスタのプログラムを構成することにより解消できる。しかし、この場合は、従来のマスタのプログラムを作り直す必要があり、更に、作り直しにあたっては、マスタのプログラムが複雑になるのでその開発に多大な工数を必要とする。
【００２４】
また、上述した第２の従来技術に係るシステムシミュレータは、デッドロックに陥ることはないが、次のような問題を有する。即ち、このシステムシミュレータでは、スレッド制御部の制御の下に常にスレッド切り替えが行われるのでオーバーヘッドによるロス時間が発生する。このオーバーヘッドの大きさは、マスタに搭載されるプログラムによって異なる。シミュレーション時間で比較した場合、本発明者等の測定によれば、第２の従来技術に係るシミュレータによるシミュレーション時間は、第１の従来技術に係るシミュレータによるシミュレーション時間の２〜４０倍程度である。
【００２５】
そこで、本発明の目的は、従来のバスマスタをシミュレーションするシミュレータを変更することなく、高速で且つアクセスブロッキングによるデッドロック状態に陥らずにシミュレーションを行うことのできるシステムシミュレータ、シミュレーション方法及びシミュレーションプログラムを提供することにある。
【００２６】
【課題を解決するための手段】
本発明の第１の態様に係るシステムシミュレータは、上記目的を達成するために、バスマスタをシミュレートするマスタシミュレータと、バススレーブをシミュレートするスレーブシミュレータと、前記マスタシミュレータ及び前記スレーブシミュレータを関数呼び出しにより順次実行させる関数用マネージャと、前記マスタシミュレータをスレッド切り替えにより実行させるスレッド用マネージャ、とを備え、前記関数用マネージャからの関数呼び出しにより実行される前記マスタシミュレータが前記スレーブシミュレータにアクセスした際にアクセスブロッキングが発生すると、前記マスタシミュレータは、前記スレッド用マネージャによるスレッド切り替えで実行されるように前記スレッド用マネージャを制御するように構成されている。
【００２７】
このシステムシミュレータにおいては、前記スレッド用マネージャは、更に、前記スレーブシミュレータを関数呼び出しにより実行させるように構成できる。また、前記アクセスブロッキングが解消された後は、前記スレッド用マネージャは、関数呼び出しにより前記マスタシミュレータが実行されるように前記関数用マネージャを制御するように構成できる。
【００２８】
また、本発明の第２の態様に係るシミュレーション方法は、バスマスタをシミュレートするマスタシミュレータと、バススレーブをシミュレートするスレーブシミュレータ、とを備え、前記マスタシミュレータ及び前記スレーブシミュレータを関数呼び出しにより順次実行させるステップと、該関数呼び出しによる実行において前記マスタシミュレータが前記スレーブシミュレータにアクセスすることによりアクセスブロッキングが発生すると、前記マスタシミュレータをスレッド切り替えで実行させるステップ、とを備えている。
【００２９】
このシミュレーション方法においては、前記スレッド切り替えで実行させるステップは、前記スレーブシミュレータを関数呼び出しにより実行させるステップ、を更に備えて構成できる。また、前記アクセスブロッキングが解消された後は、スレッド切り替えから関数呼び出しに戻って前記マスタシミュレータを実行させるステップを更に備えて構成できる。
【００３０】
更に、本発明の第３の態様に係るシミュレーションプログラムは、バスマスタをシミュレートするマスタシミュレーションプログラムと、バススレーブをシミュレートするスレーブシミュレーションプログラムと、前記マスタシミュレーションプログラム及び前記スレーブシミュレーションプログラムを関数呼び出しにより順次実行させる関数用マネージャプログラムと、前記マスタシミュレータをスレッド切り替えにより実行させるスレッド用マネージャプログラム、を備え、前記関数用マネージャプログラムからの関数呼び出しにより実行される前記マスタシミュレーションプログラムが前記スレーブシミュレーションプログラムにアクセスした際にアクセスブロッキングが発生すると、前記マスタシミュレーションプログラムは、前記スレッド用マネージャプログラムによるスレッド切り替えで実行されるように前記スレッド用マネージャプログラムを制御するように構成されている。
【００３１】
このシミュレーションプログラムにおいては、前記スレッド用マネージャプログラムは、更に、前記スレーブシミュレーションプログラムを関数呼び出しにより実行させるように構成できる。また、前記アクセスブロッキングが解消された後は、前記スレッド用マネージャプログラムは、関数呼び出しにより前記マスタシミュレーションプログラムが実行されるように前記関数用マネージャプログラムを制御するように構成できる。
【００３２】
【発明の実施の形態】
以下、本発明の実施の形態を図面を参照しながら詳細に説明する。
【００３３】
図１は、本発明の実施の形態に係るシステムシミュレータの構成を示す機能ブロック図である。このシミュレータは、パーソナルコンピュータ、ワークステーション、汎用コンピュータといった情報処理装置の上にソフトウェアによって構築される。情報処理装置の構成及び動作は周知であるので説明は省略する。
【００３４】
このシステムシミュレータは、関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ、スレッド用第２マスタ２ｓ、関数用マネージャＦ、スレッド用マネージャＳ、スレーブＬ及びバスＢから構成されている。
【００３５】
図１には、このシステムシミュレータにおける制御の遷移も示されている。即ち、スレッド用第１マスタ１ｓ、スレッド用第２マスタ２ｓ、関数用マネージャＦ、スレッド用マネージャＳ及びバスＢに含まれる記号○はセマフォを表す。また、記号Ｐはポスト、Ｗはウエイト、Ｔはトライウエイトを行うことをそれぞれ表す。また、図１中の一点鎖線矢印は関数呼び出し、実線矢印はポスト、破線矢印はウエイト、２点鎖線矢印はトライウエイトがそれぞれ行われることによる制御の遷移を示す。更に、二重線矢印はスレッドが実行されることを示す。
【００３６】
関数用第１マスタ１ｆは、例えばＣＰＵやＤＭＡといったマスタとして使用されるデバイスの動作をシミュレーションするためのプログラムで構成されたシミュレータである。この関数用第１マスタ１ｆは、バスＢを介してスレーブＬにリード及びライトのアクセス動作を行う。この関数用第１マスタ１ｆは、関数用マネージャＦと同じスレッドであり、関数用マネージャＦから１クロック毎に関数呼び出しされることにより実行される。そして、１クロックに相当するシミュレーションを実行後、リターンすることにより制御が関数用マネージャＦに戻される。
【００３７】
スレッド用第１マスタ１ｓは、上記と同様にマスタとして使用されるデバイスの動作をシミュレーションするためのプログラムで構成されたシミュレータである。このスレッド用第１マスタ１ｓは、バスＢを介してスレーブＬにリード及びライトのアクセス動作を行う。このスレッド用第１マスタ１ｓは、関数用マネージャＦとは別のスレッドであり、やはり別のスレッドであるスレッド用マネージャＳからセマフォに対してポストが行われることにより実行される。実行後は、セマフォをウエイトすることにより制御がスレッド用マネージャＳに移される。
【００３８】
これら関数用第１マスタ１ｆとスレッド用第１マスタ１ｓとは同一のモジュールで構成されており、同じテキストの異なるスレッドである。具体的には、関数用第１マスタ１ｆとスレッド用第１マスタ１ｓとはモジュール中の実行開始位置が異なるのみである。
【００３９】
関数用第２マスタ２ｆは、上記と同様にマスタとして使用されるデバイスの動作をシミュレーションするためのプログラムで構成されたシミュレータである。この関数用第２マスタ２ｆは、バスＢを介してスレーブＬにリード及びライトのアクセス動作を行う。この関数用第２マスタ２ｆは、関数用マネージャＦと同じスレッドであり、関数用マネージャＦから１クロック毎に関数呼び出しされることにより実行される。そして、１クロックに相当するシミュレーションを実行後、リターンすることにより制御が関数用マネージャＦに戻される。
【００４０】
スレッド用第２マスタ２ｓは、上記と同様にマスタとして使用されるデバイスの動作をシミュレーションするためのプログラムで構成されたシミュレータである。このスレッド用第２マスタ２ｓは、バスＢを介してスレーブＬにリード及びライトのアクセス動作を行う。このスレッド用第２マスタ２ｓは、関数用マネージャＦとは別のスレッドであり、やはり別のスレッドであるスレッド用マネージャＳからセマフォに対してポストが行われることにより実行される。実行後は、セマフォをウエイトすることにより制御がスレッド用マネージャＳに移される。
【００４１】
これら関数用第２マスタ２ｆとスレッド用第２マスタ２ｓとは同一のモジュールで構成されており、同じテキストの異なるスレッドである。具体的には、関数用第２マスタ２ｆとスレッド用第２マスタ２ｓとはモジュール中の実行開始位置が異なるのみである。
【００４２】
スレーブＬは、例えばタイマ、シリアルポート、汎用入出力ポートといったスレーブとして使用される周辺回路をシミュレーションするためのプログラムで構成されたシミュレータである。このスレーブＬは、関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ及びスレッド用第２マスタ２ｓからバスＢを介して行われるリードアクセス及びライトアクセスに応答して所定の動作を行う。このスレーブＬは、関数用マネージャＦ及びスレッド用マネージャＳから関数呼び出しされることにより実行される。
【００４３】
バスＢは、関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ及びスレッド用第２マスタ２ｓと、スレーブＬとを接続するバスをシミュレートするためのプログラムで構成されたシミュレータである。このバスＢは、関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ及びスレッド用第２マスタ２ｓからのトライウエイトによる問い合わせに応答して、スレーブＬが直ちに応答可能であるかどうか、即ち、アクセスブロッキングが発生したかどうかを表す情報を返す。
【００４４】
関数用マネージャＦは、関数用第１マスタ１ｆ、関数用第２マスタ２ｆ及びスレーブＬを順番に関数呼び出しすることにより、これらを同期して実行させるための制御プログラムである。
【００４５】
スレッド用マネージャＳは、スレッド用第１マスタ１ｓ及びスレッド用第２マスタ２ｓをスレッド切り替えにより実行させると共に、スレーブを関数呼び出しにより実行するための制御プログラムである。
【００４６】
次に、上記のように構成される本発明の実施の形態に係るシステムシミュレータの動作を説明する。このシステムシミュレータでは、関数用第１マスタ１ｆ、スレッド用第１マネージャ１ｓ、関数用第２マスタ１ｓ、スレッド用第２マスタ２ｓ、関数用マネージャＦ及びスレッド用マネージャＳの何れか１つのみが起動されるように制御される。
【００４７】
最初に、アクセスブロッキングが発生しない場合の動作を、図２を参照しながら説明する。この場合、このシステムシミュレータは、上述した第１の従来技術に係るシミュレータと同様に動作する。即ち、シミュレーションは、関数用マネージャＦが関数用第１マスタ１ｆ、関数用第２マスタ２ｆ及びスレーブＬに対して関数呼び出しを順次実行することにより進められる。
【００４８】
より詳しくは、関数用マネージャＦは、先ず関数用第１マスタ１ｆに対して関数呼び出しを実行する。これにより、関数用第１マスタ１ｆは、１クロックに相当する処理を実行する。例えば、関数呼び出しの対象が１クロックで完了する命令であれば、１命令が実行された後に、制御は関数用マネージャＦに戻される。この処理ではアクセスブロッキングは発生しないものと仮定しているので、バスＢにアクセスする処理であっても１クロックで処理は完了する。なお、関数呼び出しの対象が複数クロックを必要とする命令であれば、１クロック分の処理が完了した時点で、制御は関数用マネージャＦに戻される。
【００４９】
次に、上記と同様にして、関数用マネージャＦは、関数用第２マスタ２ｆに対し関数呼び出しを実行し、引き続いて、スレーブＬに対して関数呼び出しを実行する。以下、関数用第１マスタ１ｆ→関数用第２マスタ２ｆ→スレーブＬ→関数用第１マスタ１ｆ→・・・と関数呼び出しがサイクリックに実行されることにより、シミュレーションが進行する。なお、関数呼び出しの対象が複数クロックを必要とする命令の場合は、その対象に対して複数のサイクルにわたって複数回の関数呼び出しが実行されることにより、１命令が完了する。
【００５０】
以上のように、アクセスブロッキングが発生しない限り、関数用第１マスタ１ｆ、関数用第２マスタ２ｆ及びスレーブＬは、マネージャから関数呼び出しが行われる毎に１クロック分に相当する処理を順次実行するので、恰もクロックに同期しているように動作する。これにより、タイミングを考慮したシミュレーションが可能になっている。
【００５１】
次に、アクセスブロッキングが発生する場合の動作を図３〜図６を参照しながら説明する。この場合、この実施の形態に係るシステムシミュレータは、上述した第２の従来技術に係るシミュレータと同様に動作する。
【００５２】
図３は、関数用マネージャＦから関数呼び出しされた関数用第１マスタ１ｆの処理においてアクセスブロッキングが発生し、制御がスレッド用マネージャＳに遷移する様子を示す図である。点線は制御の流れを示す。
【００５３】
関数用マネージャＦは、先ず関数用第１マスタ１ｆに対して関数呼び出しを実行する。これにより、関数用第１マスタ１ｆは、１クロックに相当する処理を実行する。この処理において、関数用第１マスタ１ｆは、バスＢのセマフォに対してトライウエイトを行う。ここで、トライウエイトが成功すれば、つまりアクセスブロッキングが発生しなければ、関数用第１マスタ１ｆは、上述したように、１クロックに相当する処理を完了して制御は関数用マネージャＦに戻る。
【００５４】
一方、トライウエイトが失敗すれば、つまりアクセスブロッキングが発生すれば、図３の点線矢印で示すように、関数用第１マスタ１ｆは、スレッド用マネージャＳのセマフォに対してポストを行い、関数用マネージャＦのセマフォに対してウエイトを行う。これにより、制御は、関数用マネージャＦからスレッド用マネージャＳに移る。即ち、スレッド用マネージャＳが起動され、関数用マネージャＦはスリープ状態に入る。以後、スレッド用マネージャＳの制御下でスレッド切り替えによるシミュレーションが開始される。
【００５５】
図４は、スレッド用マネージャＳによってスレッドが起動されたスレッド用第２マスタ２ｓの処理においてアクセスブロッキングが発生し、制御がスレッド用マネージャＳに遷移する様子を示す図である。点線は制御の流れを示す。
【００５６】
図３に示した動作に引き続いて、スレッド用マネージャＳは、スレッド用第２マスタ２ｓのセマフォに対してポストすることにより該スレッド用第２マスタ２ｓのスレッドを起動し、自身はウエイトする。スレッド用第２マスタ２ｓのスレッドは、バスＢのセマフォに対してトライウエイトを行う。
【００５７】
ここで、図４の点線矢印で示すように、トライウエイトが成功すれば、つまりアクセスブロッキングが発生しなければ、１クロック分の処理を完了した後に、スレッド用マネージャＳのセマフォに対してポストを行い、自身はウエイトする。一方、トライウエイトが失敗すれば、つまりアクセスブロッキングが発生すれば、直ちにスレッド用マネージャＳのセマフォに対してポストを行い、自身はウエイトする。
【００５８】
図５は、スレッド用マネージャＳから関数呼び出しされたスレーブＬが処理を完了し、その後、制御がスレッド用マネージャＳに遷移する様子を示す図である。点線は制御の流れを示す。
【００５９】
図４に示した動作に引き続いて、スレッド用マネージャＳは、スレーブＬに対して関数呼び出しを実行する。これにより、スレーブＬは、１クロックに相当する処理を実行する。例えば関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ及びスレッド用第２マスタ２ｓからのリード要求に対するデータが用意できると、スレーブＬは、バスＢのセマフォに対してポストを行う。これにより、バスＢにおけるアクセスブロッキング状態が解除される。その後、制御はスレッド用マネージャＳに戻される。
【００６０】
図６は、スレッド用マネージャＳから関数呼び出しされたスレッド用第１マスタ１ｓの処理においてアクセスブロッキングが発生せず、制御が関数用マネージャＦに遷移する様子を示す図である。点線は制御の流れを示す。
【００６１】
図５に引き続いて、スレッド用マネージャＳは、関数用マネージャＦのセマフォに対してポストを行う。これにより、トライウエイトに失敗してウエイトしていた関数用第１マスタ１ｆが起動され、再び、バスＢのセマフォに対してトライウエイトを行う。ここで、トライウエイトが成功すれば、つまりアクセスブロッキングが発生しなければ、関数用第１マスタ１ｆは、１クロックに相当する処理を完了して制御は関数用マネージャＦに戻る。
【００６２】
一方、トライウエイトが失敗すれば、つまりアクセスブロッキングが解消されていなければ、図３を参照しながら説明したように、関数用第１マスタ１ｆは、スレッド用マネージャＳのセマフォに対してポストを行う。以後、上述したと同様の動作が繰り返される。そして、アクセスブロッキングが解消した時点で、全てのマスタが関数呼び出しによって実行される。
【００６３】
以上説明した本発明の実施の形態に係るシステムシミュレータによれば、例えばＣＰＵ単体のシミュレーションを目的として作成された既開発の命令セットシミュレータを、マスタのシミュレータとしてそのまま利用できる。従って、シミュレータの作り直しは不要である。
【００６４】
また、アクセスブロッキングが発生したときは、関数呼び出しによるシミュレーションからスレッド切り替えによるシミュレーションに切り替えられるので、従来のように、アクセスブロッキングの発生に起因してシステムシミュレータがデッドロックに陥ることがない。
【００６５】
更に、アクセスブロッキングが発生しない限り、シミュレーションは関数呼び出しにより実行され、スレッド切り替えによる動作は行われない。その結果、スレッド切り替えによるオーバーヘッドを最小限に抑えることができ、高速なシミュレーションを実現できる。
【００６６】
次に、本発明の理解をより深めるために、上述した動作を実現するための処理を、関数用マネージャＦとスレッド用マネージャＳとの切り替え部分の動作を中心に、フローチャートを参照しながら説明する。
【００６７】
図７は、この実施の形態に係るシステムシミュレータのメイン処理を示すフローチャートである。
【００６８】
このシステムシミュレータにおいて、関数用マネージャＦ（以下、単に「マネージャＦ」という）及びスレッド用マネージャＳ（以下、単に「マネージャＳ」という）では、関数用第１マスタ１ｆ、スレッド用第１マスタ１ｓ、関数用第２マスタ２ｆ及びスレッド用第２マスタ２ｓ（以下、単に「マスタ」と総称する場合がある）は、テーブルにより管理されている。なお、以下では、関数用第１マスタ１ｆ及び関数用第２マスタ２ｆを単に「マスタｆ」と呼び、スレッド用第１マスタ１ｓ及びスレッド用第２マスタ２ｓを単に「マスタｓ」と呼ぶ場合がある。
【００６９】
カレントマスタテーブルインデックス（current_master_table_index）は、マネージャＦとマネージャＳとで共有する、次にクロックを進めるためのマスタのテーブルインデックスである。
【００７０】
システムシミュレータによるシミュレーションが開始されると、先ず、カレントマスタテーブルインデックス（current_master_table_index）及びカレントスレーブテーブルインデックス（current_slave_table_index）がゼロに初期設定される（ステップＳ１０及びＳ１１）。次いで、シミュレーションに使用されるマネージャＳのスレッドが生成される（ステップＳ１２）。
【００７１】
次いで、後述するマスタｓのスレッド生成処理（ステップＳ１３）を行った後に、マネージャＦに関して、マネージャＦのシステムの時間を１クロック進める処理が、シミュレーション終了指示があるまで繰り返される（ステップＳ１４及びＳ１５）。一方、マネージャＳに関しては、マネージャＳのセマフォでウエイトさせ（ステップＳ１６）、その後、マネージャＳのシステムの時間を１クロック進める処理が、シミュレーション終了指示があるまで繰り返される（ステップＳ１７及びＳ１８）。
【００７２】
従って、初期状態では、ステップＳ１４及びＳ１５により、関数用マネージャＦによる関数呼び出しが実行されることによってシミュレーションが開始される。その後は、ステップＳ１４の処理及びステップＳ１７の処理がアクセスブロッキングの有無に応じて適宜実行される。
【００７３】
次に、上記ステップＳ１３で行われる「マスタｓのスレッド生成処理」の詳細を図８に示したフローチャートを参照しながら説明する。
【００７４】
ここで、カレントマスタインデックス（current_master_index）は、マネージャＳによって、次にクロックを進めるマスタｓのインデックスである。
【００７５】
マスタｓのスレッドの生成処理においては、先ず、カレントマスタインデックス（current_master_index）がゼロに初期設定される（ステップＳ２０）。次いで、カレントマスタインデックスがマスタテーブルサイズ（master_table_size）より小さいかどうかが調べられる（ステップＳ２１）。ここで小さいことが判断されると、カレントマスタインデックス（current_master_index）に対応するマスタｓのスレッドが生成される（ステップＳ２２）。
【００７６】
次いで、後述するマスタｓの時間を１クロック進めるための処理（ステップＳ２４）を行う一方で、カレントマスタインデックス（current_master_index）の値をプラス１（ステップＳ２３）した後に、次のマスタｓのスレッド生成のために、ステップＳ２１に戻り、上述した動作が繰り返される。上記ステップＳ２１で、カレントマスタインデックスがマスタテーブルサイズ以上であることが判断されると、マスタｓのスレッド生成処理を終了する。
【００７７】
次に、上記ステップＳ１４で行われる「マネージャＦのシステムの時間を１クロック進める処理」の詳細を、図９に示したフローチャートを参照しながら説明する。
【００７８】
この処理では、先ず、カレントマスタテーブルインデックス（current_master_table_index）がマスタテーブルサイズ（master_table_size）より小さいかどうかが調べられる（ステップＳ２５）。ここで、小さいことが判断されると、カレントインデックス（cur_index）に、カレントマスタテーブルインデックス（current_master_table_index）の値を代入してからカレントマスタテーブルインデックス（current_master_table_index）の値を１だけインクリメントする処理（cur_index=current_master_table_index++）が実行される（ステップＳ２６）。
【００７９】
次いで、マスタのテーブルインデックスがカレントインデックス（cur_index）のマスタを関数呼び出しすることにより時間を１クロック進める処理が行われる（ステップＳ２７）。この処理の詳細は後述する。次いで、アクセスブロッキングが発生しているマスタの情報を格納している連想配列が空かどうかが調べられる（ステップＳ２８）。ここで、連想配列が空であることが判断されると、アクセスブロッキングは発生していないものと認識され、シーケンスはステップＳ２５に戻り、次のマスタに対して上述した動作が繰り返される。
【００８０】
一方、連想配列が空でないことが判断されると、アクセスブロッキングが発生しているものと認識され、マネージャＳのセマフォに対してポストを行い（ステップＳ２９）、マネージャＦのセマフォに対してウエイトを行う（ステップＳ３０）。これにより、制御は、マネージャＦからマネージャＳに移行し、以後、マネージャＳの制御下でスレッド切り替えによるシミュレーションが開始される。その後、シーケンスはステップＳ２５に戻り、次のマスタに対して上述した動作が繰り返される。
【００８１】
上記ステップＳ２５で、カレントマスタテーブルインデックス（current_master_table_index）がマスタテーブルサイズ（master_table_size）以上であることが判断されると、カレントマスタテーブルインデックス（current_master_table_index）がゼロにリセットされる（ステップＳ３１）。
【００８２】
次いで、カレントスレーブテーブルインデックス（current_slave_table_index）がスレーブテーブルサイズ（slave_table_size）より小さいかどうかが調べられる（ステップＳ３２）。ここで、小さいことが判断されると、カレントインデックス（cur_index）にカレントスレーブテーブルインデックス（current_slave_table_index）の値を代入してからカレントスレーブテーブルインデックス（current_slave_table_index）の値を１だけインクリメントする処理（cur_index=current_slave_table_index++）が実行される（ステップＳ３３）。
【００８３】
次いで、スレーブのテーブルインデックスがカレントインデックス（cur_index）のスレーブを関数呼び出しすることにより時間を１クロック進める処理が行われる（ステップＳ３４）。その後シーケンスはステップＳ２５に戻り、次のスレーブに対して上述した動作が繰り返される。
【００８４】
上記ステップＳ３２で、カレントスレーブテーブルインデックス（current_slave_table_index）がスレーブテーブルサイズ（slave_table_size）以上であることが判断されると、カレントスレーブテーブルインデックス（current_slave_table_index）がゼロにリセットされる（ステップＳ３５）。以上により、マネージャＦのシステムの時間を１クロック進める処理が終了し、シーケンスはメイン処理に戻る。
【００８５】
次に、上記ステップＳ１７で行われる「マネージャＳのシステムの時間を１クロック進める処理」の詳細を、図１０に示したフローチャートを参照しながら説明する。
【００８６】
この処理では、先ず、カレントマスタテーブルインデックス（current_master_table_index）がマスタテーブルサイズ（master_table_size）より小さいかどうかが調べられる（ステップＳ４０）。ここで、小さいことが判断されると、カレントインデックス（cur_index）にカレントマスタテーブルインデックス（current_master_table_index）の値を代入してからカレントマスタテーブルインデックス（current_master_table_index）の値を１だけインクリメントする処理（cur_index=current_master_table_index++）が実行される（ステップＳ４１）。
【００８７】
次いで、マスタのテーブルインデックスがカレントインデックス（cur_index）のマスタｓの時間を１クロック進める処理が行われる（ステップＳ４２）。但し、アクセスブロッキングが発生した旨の通知によって、マネージャＦのセマフォに対してポストを行うように設定されていれば、マネージャＦのセマフォに対してポストを行い、そうでなければ、該当するマスタｓに対してポストを行う。この処理の詳細については後述する。
【００８８】
次いで、マネージャＳのセマフォでウエイトする（ステップＳ４３）。次いで、連想配列が空かどうかが調べられる（ステップＳ４４）。ここで、連想配列が空であることが判断されると、アクセスブロッキングは発生していないものと認識され、シーケンスはステップＳ４０に戻り、次のマスタに対して上述した動作が繰り返される。
【００８９】
一方、連想配列が空でないことが判断されると、アクセスブロッキングが発生しているものと認識され、マネージャＦのセマフォに対してポストを行い（ステップＳ４５）、マネージャＳのセマフォに対してウエイトする（ステップＳ４６）。これにより、制御は、マネージャＳからマネージャＦに移行し、以後、マネージャＦの制御下で関数呼び出しによるシミュレーションが行われる。その後、シーケンスはステップＳ４０に戻り、次のマスタに対して上述した動作が繰り返される。
【００９０】
上記ステップＳ４０で、カレントマスタテーブルインデックス（current_master_table_index）がマスタテーブルサイズ（master_table_size）以上であることが判断されると、カレントマスタテーブルインデックス（current_master_table_index）がゼロにリセットされる（ステップＳ４７）。
【００９１】
次いで、カレントスレーブテーブルインデックス（current_slave_table_index）がスレーブテーブルサイズ（slave_table_size）より小さいかどうかが調べられる（ステップＳ４８）。ここで、小さいことが判断されると、カレントインデックス（cur_index）にカレントスレーブテーブルインデックス（current_slave_table_index）の値を代入してからカレントスレーブテーブルインデックス（current_slave_table_index）の値を１だけインクリメントする処理（cur_index=current_slave_table_index++）が実行される（ステップＳ４９）。
【００９２】
次いで、スレーブのテーブルインデックスがカレントインデックス（cur_index）のスレーブを関数呼び出しすることにより時間を１クロック進める処理が行われる（ステップＳ５０）。その後シーケンスはステップＳ４８に戻り、次のスレーブに対して上述した動作が繰り返される。
【００９３】
一方、上記ステップＳ４８で、カレントスレーブテーブルインデックス（current_slave_table_index）がスレーブテーブルサイズ（slave_table_size）以上であることが判断されると、カレントスレーブテーブルインデックス（current_slave_table_index）がゼロにリセットされる（ステップＳ５１）。以上により、マネージャＳのシステムの時間を１クロック進める処理が終了し、シーケンスはメイン処理に戻る。
【００９４】
次に、上述した図９に示したステップＳ２７で行われる「マスタの時間を１クロック進めるための処理」の詳細を、図１１に示したフローチャートを参照しながら説明する。なお、以下では、マスタとしてＣＰＵが使用される場合を例示して説明する。
【００９５】
この処理では、先ず、命令のフェッチが行われる（ステップＳ６０）。次いで、フェッチされた命令がデコードされる（ステップＳ６１）。そして、デコードの結果に基づいて、ＮＯＰ命令（ステップＳ６２）、ＡＤＤ命令（ステップＳ６３）、ＬＯＡＤ命令（ステップＳ６４）、・・・の何れかの実行が行われる。なお、デコードの結果、該当する命令が存在しなければエラー処理が行われる（ステップＳ６５）。
【００９６】
次に、マネージャＦから関数呼び出しによって実行される命令の一例を、ＬＯＡＤ命令を例にとって、図１２に示したフローチャートを参照しながら説明する。
【００９７】
このＬＯＡＤ命令の実行では、先ず、スレーブからバスを経由してデータが得られるかどうかが調べられる（ステップＳ７０）。ここで、データが得られないことが判断されると、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理が行われる（ステップＳ７１）。このアクセスブロッキング発生の通知処理の詳細は、図１３のフローチャートに示されている。
【００９８】
このアクセスブロッキング発生の通知処理では、先ず、ブロッキングしているマスタの情報を格納する連想配列が空かどうかが調べられる（ステップＳ８０）。そして、空であることが判断されると、マネージャＳが、このマスタの時間を進めるときは、マネージャＦのセマフォに対してポストを行うように設定する（ステップＳ８１）。一方、空でないことが判断されると、ステップＳ８１の処理はスキップされる。次いで、ブロッキングをしているマスタの情報を格納する連想配列にマスタを登録する（ステップＳ８２）。その後、シーケンスは、図１２のステップＳ７２に戻る。
【００９９】
ステップＳ７２では、マネージャＳのセマフォに対してポストが行われる。次いで、マネージャＦのセマフォでウエイトする（ステップＳ７３）。その後、シーケンスはステップＳ７０に戻り、上述した動作が繰り返され、１クロック毎に、スレーブからデータが得られているかどうかをチェックする。
【０１００】
上記ステップＳ７０で、スレーブからバスを経由してデータを得られることが判断されると、次いで、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理を呼んでいたかどうか、つまりステップＳ７１を実行していたかどうかが調べられる（ステップＳ７４）。ここで、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理を呼んでいたことが判断されると、マスタｆとマスタｓとで共通のアクセスブロッキング終了の通知処理が実行される（ステップＳ７５）。このアクセスブロッキング終了の通知処理の詳細は、図１４のフローチャートに示されている。
【０１０１】
このアクセスブロッキング終了の通知処理では、ブロッキングをしているマスタの情報を格納する連想配列からマスタが削除される（ステップＳ８５）。次いで、マネージャＳが、このマスタの時間を進めるときは、このマスタｓのセマフォに対してポストを行うように設定する（ステップＳ８６）。その後、シーケンスは、図１２のステップＳ７６に戻る。
【０１０２】
ステップＳ７６では、スレーブからバスを経由して得られたデータを、ＬＯＡＤ命令で指定されたレジスタ（図示せず）にライトする。これにより、ＬＯＡＤ命令の実行が完了する。
【０１０３】
次に、上記ステップＳ２４で行われる「マスタの時間を１クロック進める処理」の詳細を、図１５に示したフローチャートを参照しながら説明する。なお、以下では、マスタとしてＣＰＵが使用される場合を例示して説明する。
【０１０４】
この処理では、先ず、マスタｓのセマフォでウエイトする（ステップＳ９０）。次いで、命令のフェッチが行われる（ステップＳ９１）。次いで、フェッチされた命令がデコードされる（ステップＳ９２）。そして、デコードの結果に基づいて、ＮＯＰ命令（ステップＳ９３）、ＡＤＤ命令（ステップＳ９４）、ＬＯＡＤ命令（ステップＳ９５）、・・・の何れかの実行が行われる。なお、デコードの結果、該当する命令が存在しなければエラー処理が行われる（ステップＳ９６）。次いで、マネージャＳのセマフォに対してポストが行われる（ステップＳ９７）。
【０１０５】
マスタｓから起動される命令の一例を、ＬＯＡＤ命令を例にとって、図１６に示したフローチャートを参照しながら説明する。
【０１０６】
このＬＯＡＤ命令の実行では、先ず、スレーブからバスを経由してデータが得られるかどうかが調べられる（ステップＳ１００）。ここで、データが得られないことが判断されると、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理が行われる（ステップＳ１０１）。このアクセスブロッキング発生の通知処理の詳細は、図１３のフローチャートを参照して説明した。
【０１０７】
次いで、マネージャＳのセマフォに対してポストが行われる（ステップＳ１０２）。次いで、マスタｓのセマフォでウエイトする（ステップＳ１０３）。その後、シーケンスはステップＳ１００に戻り、上述した動作が繰り返され、１クロック毎にスレーブからデータが得られているかをチェックする。
【０１０８】
上記ステップＳ１００で、スレーブからバスを経由してデータを得られることが判断されると、次いで、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理を呼んでいたかどうか、つまりステップＳ１０１が実行されていたかどうかが調べられる（ステップＳ１０４）。ここで、マスタｆとマスタｓとで共通のアクセスブロッキング発生の通知処理を呼んでいたことが判断されると、マスタｆとマスタｓとで共通のアクセスブロッキング終了の通知処理が実行される（ステップＳ７５）。このアクセスブロッキング終了の通知処理の詳細は、図１４のフローチャートを参照して説明した。
【０１０９】
次いで、スレーブからバスを経由して得られたデータを、ＬＯＡＤ命令で指定されたレジスタ（図示せず）にライトする（ステップＳ１０６）。これにより、ＬＯＡＤ命令の実行が完了する。
【０１１０】
以上の処理により、図２〜図６を参照しながら説明した動作が実現されている。
【０１１１】
なお、上述した実施の形態では、２つのマスタと１つのスレーブを備えた装置をシミュレーションする場合を例に挙げて説明したが、本発明では、マスタの数及びスレーブの数はこれらに限定されず、任意の数とすることができる。
【０１１２】
【発明の効果】
以上詳述したように本発明によれば、従来のバスマスタをシミュレーションするシミュレータを変更することなく、高速で且つアクセスブロッキングによるデッドロック状態に陥らずにシミュレーションを行うことのできるシステムシミュレータ、シミュレーション方法及びシミュレーションプログラムを提供できる。
【図面の簡単な説明】
【図１】本発明の実施の形態に係るシステムシミュレータの構成を示す機能ブロック図である。
【図２】本発明の実施の形態に係るシステムシミュレータにおいて、アクセスブロッキングが発生しない場合の動作を説明するための図である。
【図３】本発明の実施の形態に係るシステムシミュレータにおいて、アクセスブロッキングが発生する場合の動作（その１）を説明するための図である。
【図４】本発明の実施の形態に係るシステムシミュレータにおいて、アクセスブロッキングが発生する場合の動作（その２）を説明するための図である。
【図５】本発明の実施の形態に係るシステムシミュレータにおいて、アクセスブロッキングが発生する場合の動作（その３）を説明するための図である。
【図６】本発明の実施の形態に係るシステムシミュレータにおいて、アクセスブロッキングが発生する場合の動作（その４）を説明するための図である。
【図７】本発明の実施の形態に係るシステムシミュレータのメイン処理を示すフローチャートである。
【図８】図７のマスタｓのスレッド生成処理の詳細を示すフローチャートである。
【図９】図７のマネージャＦのシステムの時間を１クロック進める処理の詳細を示すフローチャートである。
【図１０】図７のマネージャＳのシステムの時間を１クロック進める処理の詳細を示すフローチャートである。
【図１１】図９のステップＳ２７の処理の詳細を示すフローチャートである。
【図１２】図１１のステップＳ６４の処理の詳細を示すフローチャートである。
【図１３】図１２のステップＳ７１の処理の詳細を示すフローチャートである。
【図１４】図１２のステップＳ７５の処理の詳細を示すフローチャートである。
【図１５】図１０のステップＳ４２の処理の詳細を示すフローチャートである。
【図１６】図１５のステップＳ９５の処理の詳細を示すフローチャートである。
【図１７】第１の従来技術に係るシステムシミュレータを説明するための図である。
【図１８】第２の従来技術に係るシステムシミュレータを説明するための図である。
【図１９】図１８に示したシステムシミュレータにおけるマネージャと第１マスタとの間の遷移動作を説明するための図である。
【図２０】図１８に示したシステムシミュレータにおけるマネージャと第２マスタとの間の遷移動作を説明するための図である。
【図２１】図１８に示したシステムシミュレータにおけるマネージャとスレーブとの間の遷移動作を説明するための図である。
【符号の説明】
１ｆ  関数用第１マスタ
１ｓ  スレッド用第１マスタ
２ｆ  関数用第２マスタ
２ｓ  スレッド用第２マスタ
Ｌ  スレーブ
Ｂ  バス
Ｆ  関数用マネージャ
Ｓ  スレッド用マネージャ
【図１】
0004529063.tif 000002
【図２】
0004529063.tif 000003
【図３】
0004529063.tif 000004
【図４】
0004529063.tif 000005
【図５】
0004529063.tif 000006
【図６】
0004529063.tif 000007
【図７】
0004529063.tif 000008
【図８】
0004529063.tif 000009
【図９】
0004529063.tif 000010
【図１０】
0004529063.tif 000011
【図１１】
0004529063.tif 000012
【図１２】
0004529063.tif 000013
【図１３】
0004529063.tif 000014
【図１４】
0004529063.tif 000015
【図１５】
0004529063.tif 000016
【図１６】
0004529063.tif 000017
【図１７】
0004529063.tif 000018
【図１８】
0004529063.tif 000019
【図１９】
0004529063.tif 000020
【図２０】
0004529063.tif 000021
【図２１】
0004529063.tif 000022