(57)【要約】【課題】設計者の負担軽減と設計作業の短縮化とを実現すること。【解決手段】制御シリアライズ化処理部６０１では、ｂｒａｎｃｈ＿ｃａｌｌコマンドがコールされた時点で、管理用スレッド（メインスレッド）７００を生成する。この管理用スレッド７００に管理機構７１０を置く。管理機構７１０は、第１のサブスレッド７０１と第２のサブスレッド７０２を起動し、制御プログラム６０２へ実行命令を出す。また、制御プログラム６０２からの復帰命令により復帰する。管理機構７１０は第１のスクリプト２０１および第２のスクリプト２０２に制御を返すべき時刻をあらわす復帰時刻テーブルを持っている。【選択図】図７
2010049630.tif 000002
【特許請求の範囲】
【請求項１】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
【請求項２】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
【請求項３】
前記シミュレーション装置は、エミュレーション装置であることを特徴とする請求項１または２に記載のシミュレーション制御プログラム。
【請求項４】
前記シミュレーション装置は、ＨＤＬシミュレータであり、前記スクリプトはＨＤＬ言語で記述されていることを特徴とする請求項１または２に記載のシミュレーション制御プログラム。
【請求項５】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段と、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
【請求項６】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段と、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
【請求項７】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する複数のスクリプトを受け付ける受付工程と、
前記各スクリプトの実行サイクル数に基づいて、前記受付工程によって受け付けられた各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定工程と、
前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
【請求項８】
検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付工程と、
前記受付工程によって受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定工程と、
前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）のシミュレーションを制御するシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法に関する。
【背景技術】
【０００２】
近年、ＬＳＩの設計において、ＬＳＩを高速にシミュレーションする専用ハードウェアを使って検証する手法がとられる。このような専用ハードウェアをエミュレーション装置という。
【０００３】
図１は、エミュレーションシステムの構成例を示す説明図である。図１に示したように、エミュレーションシステム１００では、制御用コンピュータ１０１とエミュレーション装置１０２が通信ケーブル１０３で接続され、制御用コンピュータ１０１の指示に従って、エミュレーション装置１０２は、設計者が指定したシミュレーションを実行する。通例、設計者はエミュレーション装置１０２にさせたい操作を記述したスクリプト記述を作成する。
【０００４】
図２−１は、スクリプト記述の記述例を示す説明図である。図２−１に示したスクリプト記述（以下、「第１のスクリプト」）２０１は、「回路データをダウンロードし、４００サイクル分のエミュレーションを実行、その後波形データの取得を行う操作を１００回行い、エミュレーションを終了する」ことが記述されたスクリプト記述である。
【０００５】
図３は、第１のスクリプト２０１を制御用コンピュータ１０１に与えた場合の制御シーケンスを示す制御シーケンス図である。制御用コンピュータ１０１は、第１のスクリプト２０１および検証対象回路の回路データ３０１を読み込み、制御プログラムによる制御を実行する。図３の制御シーケンスの場合、エミュレーション装置１０２では、エミュレーション装置１０２内の時刻が４００サイクルずつ進む。
【０００６】
このように、制御用コンピュータ１０１内の制御プログラム上の時刻とエミュレーション時刻は同期をとって制御が進む。ここで、エミュレーション装置１０２を制御したい第２の制御シーケンスがあったと仮定する。
【０００７】
図２−２は、スクリプト記述の記述例を示す説明図である。図２−２のスクリプト記述を第２のスクリプト２０２と称す。第２の制御シーケンスは、第２のスクリプト２０２を制御用コンピュータ１０１に与えた場合の制御シーケンスである。
【０００８】
制御プログラム上で実行できるスクリプトはエミュレーション装置１０２の逐次的な制御を書き下したものである。第２のスクリプト２０２による第２の制御シーケンスを第１のスクリプト２０１による第１の制御シーケンスと同時に実行したくても、この２つの制御シーケンスを実行することはできない。
【０００９】
図２−３は、第１のスクリプト２０１と第２のスクリプト２０２をマージして作成されたスクリプト記述の記述例を示す説明図である。従来は、第１のスクリプト２０１と第２のスクリプト２０２を一つにまとめた単一のスクリプト記述２０３を設計者が作成していた。このスクリプト記述２０３を与えることで、第１および第２の制御シーケンスを実行することとなる。
【００１０】
また、テストスクリプトを解釈してエミュレータに実行させることで、エミュレータ内のプログラムをテストする技術が開示されている（たとえば、下記特許文献１を参照。）。
【００１１】
【特許文献１】特開２００７−３１７０８５号公報
【発明の開示】
【発明が解決しようとする課題】
【００１２】
しかしながら、図２−３に示したスクリプト記述２０３のように、複数のスクリプト記述をマージする場合、エミュレーション装置１０２からの割り込みを受け取る場合や信号値によって制御を変更する場合などの複雑な制御シーケンスになると工数がかかり、設計者の負担が増大するという問題がある。
【００１３】
また、第１のスクリプト２０１と第２のスクリプト２０２のマージを自動化する場合、一方のスクリプトが設計者とインタラクティブにやりとりをする場合には予めマージすることができないという問題がある。
【００１４】
このような例としてソフトウェアデバッガをつなぐ場合がある。エミュレーション装置１０２上の回路内には、デバッグ対象のソフトウェアを実行しているＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）がある。ソフトウェアデバッガは、エミュレーション装置１０２に対して、ＣＰＵのプログラムカウンタが特定の値になった時、制御を返してもらう等のインタラクティブな実行をする必要がある。
【００１５】
ソフトウェアデバッガと制御プログラム間でエミュレーション装置１０２の制御コマンドをやりとりすることになり、実行時にスクリプト相当のものを作成していることになり、スクリプトの一例とみなすことができる。このようにインタラクティブな対応を求められる場合、予めマージするという手法は有効ではない。
【００１６】
また、第１のスクリプト２０１と第２のスクリプト２０２を並列に動作させるスレッド等の手法を用いることが考えられる。スレッドプログラミングは共通の資源をそれぞれが破綻することなく共有するしくみである。通例共有資源の排他制御はプログラムに設計者が明示的に書くことで行われる。従って、第１のスクリプト２０１と第２のスクリプト２０２に対して排他制御等の記述を書かねばならない。
【００１７】
もし、単純に共有資源に対する排他制御を書かずに並列実行してしまうと、第１のスクリプト２０１で「ｒｕｎ  ４００」が発行された後、スレッドが切り替わり、第２のスクリプト２０２で「ｒｕｎ  ３００」が発行され、その後スレッドが切り替わり、第１のスクリプト２０１に制御が戻ったとする。この場合、すでに７００サイクル経過しており、第１のスクリプト２０１が期待する時刻とエミュレーション装置１０２の時刻がずれてしまう。したがって、なんらかの排他制御を書かなくてはいけなくなり、設計者の負担が増加するという問題がある。
【００１８】
この発明は、上述した従来技術による問題点を解消するため、設計者の負担軽減と設計作業の短縮化とを実現することができるシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１９】
上述した課題を解決し、目的を達成するため、第１のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法は、検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、前記検証対象回路に関する複数のスクリプトを受け付け、前記各スクリプトの実行サイクル数に基づいて、受け付けられた各スクリプトの復帰時刻を算出し、算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定し、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、決定された実行対象スクリプトを解釈して、前記シミュレーション装置に対する制御を実行することを要件とする。
【００２０】
第１のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、複数のスクリプトを与えることにより、シミュレーション実行時にスクリプトを自動的にマージすることができる。
【００２１】
また、第２のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法は、検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付け、受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出し、算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定し、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、決定された実行対象に応じた前記シミュレーション装置に対する制御を実行することを要件とする。
【００２２】
第２のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、スクリプトのシナリオを変更することなく、ソフトウェアデバッガによる対話的制御を追加することができる。
【発明の効果】
【００２３】
このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、設計者の負担軽減と設計作業の短縮化とを実現することができるという効果を奏する。
【発明を実施するための最良の形態】
【００２４】
以下に添付図面を参照して、このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法の好適な実施の形態を詳細に説明する。このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法では、複数のスクリプトに排他制御等を明示的に書くことなく、並列実行できる制御機構を提供する。これにより、設計者の負担軽減と設計作業の短縮化とを実現することができる。
【００２５】
（エミュレーションシステムの構成）
図４は、本実施の形態にかかるエミュレーションシステムの構成例を示す説明図である。図４に示したように、エミュレーションシステム４００では、制御装置４０１とエミュレーション装置１０２が通信ケーブル１０３で接続され、制御装置４０１の指示に従って、エミュレーション装置１０２は、設計者が指定したシミュレーションを実行する。また、制御装置４０１には、上述した第１のスクリプト２０１と第２のスクリプト２０２が制御装置４０１に与えられる。また、制御装置４０１には、設計対象回路の回路データ３０１が記憶されている。
【００２６】
（制御装置４０１のハードウェア構成）
図５は、実施の形態にかかる制御装置４０１のハードウェア構成を示すブロック図である。図５において、制御装置４０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）５０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）５０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）５０３と、磁気ディスクドライブ５０４と、磁気ディスク５０５と、光ディスクドライブ５０６と、光ディスク５０７と、ディスプレイ５０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）５０９と、キーボード５１０と、マウス５１１と、スキャナ５１２と、プリンタ５１３と、を備えている。また、各構成部はバス５００によってそれぞれ接続されている。
【００２７】
ここで、ＣＰＵ５０１は、制御装置４０１の全体の制御を司る。ＲＯＭ５０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ５０３は、ＣＰＵ５０１のワークエリアとして使用される。磁気ディスクドライブ５０４は、ＣＰＵ５０１の制御にしたがって磁気ディスク５０５に対するデータのリード／ライトを制御する。磁気ディスク５０５は、磁気ディスクドライブ５０４の制御で書き込まれたデータを記憶する。
【００２８】
光ディスクドライブ５０６は、ＣＰＵ５０１の制御にしたがって光ディスク５０７に対するデータのリード／ライトを制御する。光ディスク５０７は、光ディスクドライブ５０６の制御で書き込まれたデータを記憶したり、光ディスク５０７に記憶されたデータを制御装置４０１に読み取らせたりする。
【００２９】
ディスプレイ５０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ５０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３０】
インターフェイス（以下、「Ｉ／Ｆ」と略する。）５０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク５１４に接続され、このネットワーク５１４を介して他の装置に接続される。そして、Ｉ／Ｆ５０９は、ネットワーク５１４と内部のインターフェイスを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ５０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３１】
キーボード５１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス５１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３２】
スキャナ５１２は、画像を光学的に読み取り、制御装置４０１内に画像データを取り込む。なお、スキャナ５１２には、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ５１３は、画像データや文書データを印刷する。プリンタ５１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００３３】
（エミュレーションシステム４００の機能的構成）
つぎに、エミュレーションシステム４００の機能的構成について説明する。ＣＡＤ（Ｃｏｍｐｕｔｅｒ  Ａｉｄｅｄ  Ｄｅｓｉｇｎ）系のツールではＴＣＬ（Ｔｏｏｌ  Ｃｏｍｍａｎｄ  Ｌａｎｇｕａｇｅ）が用いられる。ここではＴＣＬを例に説明をするが、制御装置４０１内の制御プログラムがＴＣＬスクリプトによる制御命令の受信以外のものであってもよい。
【００３４】
たとえば、ＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍａｂｌｅ  Ｉｎｔｅｒｆａｃｅ）がＣ言語の関数の形態で公開されている場合には、第１のスクリプト２０１、第２のスクリプト２０２は各々Ｃ言語のコードになる。また、スクリプトの逐次解釈が必要なくなるため、インタプリタを介さずに直接ＡＰＩがコールされることになる。いずれの方法であっても必要な制御命令データを制御プログラムに渡す点で同じである。以下、ＴＣＬスクリプトを利用した例を使って説明する。
【００３５】
図６は、エミュレーションシステム４００の機能的構成を示すブロック図である。図６では、２個のスクリプト記述（第１のスクリプト２０１および第２のスクリプト２０２）を並列実行する場合の例である。第１のスクリプト２０１および第２のスクリプト２０２は並列実行させたいスクリプトである。ベーススクリプト２０４は、制御プログラム６０２に渡すスクリプトである。
【００３６】
図２−４は、ベーススクリプト２０４の記述例を示す説明図である。通例、スクリプト言語では独自のコマンドを拡張する方法が用意されている。ＴＣＬにも拡張する方法が用意されている。
【００３７】
図２−５は、拡張部分のスクリプト記述（拡張スクリプト）の記述例を示す説明図である。拡張部分を実現する記述（以下、「拡張記述」）２０５はコンパイルされ、ベーススクリプト２０４のｌｏａｄコマンドで呼ばれているライブラリに含まれており、ＴＣＬインタプリタではｌｏａｄ命令で渡されたライブラリを動的リンクするとともに、ライブラリ名＿Ｉｎｉｔ（）関数をコールする仕様になっている。したがってベーススクリプト２０４のｌｏａｄ命令解釈時に拡張記述２０５がコールされ、制御プログラム６０２内のポインタがＢｒａｎｃｈｐｒｏｃ＿Ｉｎｉｔ（）に渡される。また、Ｔｃｌ＿から始まるＣ言語関数はＴＣＬインタプリタが公開しているＡＰＩである。ＴＣＬ言語では、これらの関数を使って機能拡張が行える仕様になっている。
【００３８】
また、拡張記述２０５の「Ｔｃｌ＿ＣｒｅａｔｅＣｏｍｍａｎｄ（ｉｎｔｅｒｐ，  “ｂｒａｎｃｈ＿ｃａｌｌ”，  ｂｒａｎｃｈ＿ｃａｌｌ＿ｐｒｏｃ，  ＮＵＬＬ，  ＮＵＬＬ）；」により、制御プログラム６０２内のＴＣＬインタプリタに「ｂｒａｎｃｈ＿ｃａｌｌ＿ｐｒｏｃ」というコマンドを受け取ったら、「ｂｒａｎｃｈ＿ｃａｌｌ＿ｐｒｏｃ」という関数を呼ぶように教える。
【００３９】
その後、ベーススクリプト２０４で「ｂｒａｎｃｈ＿ｃａｌｌ  ｍｙ０．ｔｃｌ  ｍｙ１．ｔｃｌ」がコールされ、関数「ｂｒａｎｃｈ＿ｃａｌｌ＿ｐｒｏｃ」に引数“ｍｙ０．ｔｃｌ”，“ｍｙ１．ｔｃｌ”が渡される。この機構を使って、制御シリアライズ化処理部６０１の実装をコールする。
【００４０】
図７は、制御シリアライズ化処理部６０１の実装を示すブロック図である。ｂｒａｎｃｈ＿ｃａｌｌコマンドがコールされた時点で、管理用スレッド（メインスレッド）７００を生成する。この管理用スレッド７００に管理機構７１０を置く。管理機構７１０は、第１のサブスレッド７０１と第２のサブスレッド７０２を起動し、制御プログラム６０２へ実行命令を出す。また、制御プログラム６０２からの復帰命令により復帰する。管理機構７１０は第１のスクリプト２０１および第２のスクリプト２０２に制御を返すべき時刻をあらわす復帰時刻テーブル８００を持っている。
【００４１】
図８は、復帰時刻テーブル８００を示す説明図である。図８の復帰時刻テーブル８００は、初期状態を示している。図７において、第１のサブスレッド７０１および第２のサブスレッド７０２は、管理機構７１０からの起動命令により起動する。第１のインタプリタ７１１は、第１のスクリプト２０１を解釈して実行する。第２のインタプリタ７１２は、第２のスクリプト２０２を解釈して実行する。第１のインタプリタ７１１および第２のインタプリタ７１２は、実行命令、例外に関する命令以外の命令（ただしＴＣＬ言語がもっているｓｅｔ以外の命令を含まない）を制御プログラム６０２に与える。
【００４２】
例外に関する命令では管理機構７１０に渡すデータを共有変数領域に書き、実際に例外に関する設定をするのは管理用スレッドで行われる。詳細は後述する。また、制御プログラム６０２上のインタプリタには、独自に拡張されているものとして、エミュレーション制御に必要な特別な変数がある。このような変数は制御プログラム６０２上のインタプリタ、各サブスレッド上のインタプリタ７１１、７１２で共有しなければならない。この方法についても詳細は後述する。変数を参照・書き込みするｓｅｔ命令以外のＴＣＬ言語がもっている命令（例えばｉｆ，ｗｈｉｌｅ等）については、サブスレッド上のインタプリタ７１１，７１２で処理し、制御プログラム６０２には送らない。
【００４３】
（ｂｒａｎｃｈ＿ｃａｌｌ関数の内部処理手順）
図９は、ｂｒａｎｃｈ＿ｃａｌｌ関数の内部処理手順を示すフローチャートである。図９において、ｂｒａｎｃｈ＿ｐｒｏｃに引数でスクリプトが入力される（ステップＳ９０１）。ここでは、第１のスクリプト２０１のスクリプトファイルｍｙ０．ｔｃｌと、第２のスクリプト２０２のスクリプトファイルｍｙ１．ｔｃｌが入力される。
【００４４】
スクリプトが入力されると、入力されたスクリプトごとにｗａｋｅｕｐ用とｓｌｅｅｐ用のスレッドのイベント（ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｔ）を用意する（ステップＳ９０２）。つぎに、各スクリプト名と起動順序の対応を示す起動順序テーブルを作成する（ステップＳ９０３）。
【００４５】
図１０は、起動順序テーブル１０００を示す説明図である。ここでは「ｂｒａｎｃｈ＿ｐｒｏｃ」に与えた引数の順序で起動する例を説明する。つぎに、図８に示した復帰時刻テーブル８００を作成する（ステップＳ９０４）。そして、起動するスクリプト数を記憶する（ステップＳ９０５）。ここでは、第１のスクリプト２０１のスクリプトファイルｍｙ０．ｔｃｌと、第２のスクリプト２０２のスクリプトファイルｍｙ１．ｔｃｌが入力されているので、起動するスクリプト数は「２」である。
【００４６】
そして、管理用スレッド７００を生成する（ステップＳ９０６）。すなわち、管理機構７１０用の関数をスレッド化する。ここでは、このスレッド化された関数を「ＴｉｍｅＭａｎａｇｅｒ：：ｍａｉｎ  （ｖｏｉｄ＊  ａ＿ｐｔｒ）」とする。
【００４７】
つぎに、起動するスクリプト数を管理用スレッド７００の中で参照し、スクリプト数分のスレッドを生成する（ステップＳ９０７）。このスレッドは図７におけるサブスレッド７１１、７１２に相当し、以降、サブスレッドまたはスクリプト用のスレッドと呼ぶ。ここではサブスレッドで実現する機能を記述した関数を「ｉｎｔｅｒｐ＿ｔｈｒｅａｄ（ｖｏｉｄ＊  ａ＿ｆｉｌｅ）」とする。そして、終了したスレッドをｊｏｉｎする（ステップＳ９０８）。すべてｊｏｉｎできたらスクリプトに対して正常終了を返し、ｂｒａｎｃｈ＿ｃａｌｌ命令を終了する。
【００４８】
したがって、ベーススクリプト２０４の場合、ｐｕｔｓ  “ｊｏｉｎ”が実行され、このスクリプトの終端に到達する。制御プログラム６０２はこれをもってエミュレーション装置１０２をクローズし、エミュレーションを終了する。次に、各スレッドに渡す関数について説明する。
【００４９】
（管理用スレッド７００に渡す関数による処理手順）
図１１は、管理用スレッド７００に渡す関数による処理手順を示すフローチャートである。図１１において、管理用スレッド７００に渡す関数は、スレッド間同期処理（ステップＳ１１０１）とスレッド間調停処理（ステップＳ１１０２）を実行する。スレッド間同期処理（ステップＳ１１０１）は、スレッド間の同期をとり、スクリプト用のスレッドがすべて立ち上がるまで待つ。スレッド間調停処理（ステップＳ１１０２）は、実際にスレッド間の調停をおこなう処理であり、スクリプト用のスレッドの実行を制御する。スレッド間調停処理（ステップＳ１１０２）は、具体的に各スレッドが発行する要求をシリアライズする。
【００５０】
図１２は、図１１に示したスレッド間同期処理（ステップＳ１１０１）の詳細な処理手順を示すフローチャートである。図１２において、まず、共有変数領域をロックし（ステップＳ１２０１）、ロックされた共有変数領域内の起動済みのスレッド数を計数する（ステップＳ１２０２）計数された起動済みスレッド数＝スクリプト数であるか否かを判断する（ステップＳ１２０３）。
【００５１】
起動済みスレッド数＝スクリプト数でない場合（ステップＳ１２０３：Ｎｏ）、共有変数領域のアンロックと同時に、スクリプト用のスレッドが起動するたびに発行されるサブスレッドの起動イベントを待ち（ステップＳ１２０４）、ステップＳ１２０１に戻る。一方、起動済みスレッド数＝スクリプト数である場合（ステップＳ１２０３：Ｙｅｓ）、すべてのスレッドが立ち上がったので、ステップＳ１１０２に移行する。
【００５２】
図１３は、図１１に示したスレッド間調停処理（ステップＳ１１０２）の詳細な処理手順を示すフローチャートである。図１３において、まず、起動順序が若い順番に、スクリプトの復帰時刻と現在時刻とを比較する（ステップＳ１３０１）。つぎに、復帰時刻と現在時刻とが一致するか否かを判断する（ステップＳ１３０２）。一致しない場合（ステップＳ１３０２：Ｎｏ）、ステップＳ１３０５に移行する。一方、一致する場合（ステップＳ１３０２：Ｙｅｓ）、起動順序に対応したｗａｋｅｕｐ信号を送る（ステップＳ１３０３）。そして、起動順序に対応したｓｌｅｅｐ信号（送出したｗａｋｅｕｐ信号に対応したｓｌｅｅｐ信号）を待つと同時に、共有変数領域をアンロックする（ステップＳ１３０４）。対応したｓｌｅｅｐ信号を受け取ると待ち状態を脱して、ステップＳ１３０５に移行する。
【００５３】
ｐｔｈｒｅａｄの場合、ステップＳ１３０３では、ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｓｉｇｎａｌ（ｍ＿ｗａｋｅｕｐ［ｉｎｄｅｘ］）をコールする。ここで、ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｓｉｇｎａｌは信号を送るｐｔｈｒｅａｄの関数であり、ｉｎｄｅｘは起動順序を表しており、ｍ＿ｗａｋｅｕｐ［ｉｎｄｅｘ］は起動順序がｉｎｄｅｘ番目のスクリプトを処理するスレッドを起動するイベントである。
【００５４】
例えばｉｎｄｅｘ＝０であれば第１のスクリプト（７１１）を処理するスレッド（７０１）が起動し、ｉｎｄｅｘ＝１でれば第２のスクリプト（７１２）を処理するスレッド（７０２）が起動する。ステップＳ１３０４では、ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｗａｉｔ（ｍ＿ｓｌｅｅｐ［ｉｎｄｅｘ］，  ＆（ｍ＿ｍｕｔｅｘ））をコールする。
【００５５】
ここで、ｍ＿ｓｌｅｅｐ［ｉｎｄｅｘ］は、起動順序に対応したイベントであり、ｍ＿ｍｕｔｅｘは共有変数領域の排他制御を行うｍｕｔｅｘであり、ｐｔｈｒｅａｄ＿ｃｏｎｄ＿ｗａｉｔは信号を待つ状態に入ると同時に、共有変数領域をアンロックする（ｍｕｔｅｘを開放する）関数である。従って、上記の記述は、ｍ＿ｓｌｅｅｐ［ｉｎｄｅｘ］のイベントを受け取ると待ち状態を脱する。このようにして、管理スレッドはスレッドの起動を管理することができている。
【００５６】
ステップＳ１３０５では、すべてのスクリプトの復帰時刻について評価したか否かを判断する（ステップＳ１３０５）。評価していない場合（ステップＳ１３０５：Ｎｏ）、ステップＳ１３０１に戻り、未評価のスクリプトの復帰時刻と現在時刻とを比較する。一方、すべて評価済みである場合（ステップＳ１３０５：Ｙｅｓ）、起動済みスレッド数＞０であるか否かを判断する（ステップＳ１３０６）。すなわち、実行中のスレッドが残っているか否かを判断する。
【００５７】
起動済みスレッド数＞０である場合（ステップＳ１３０６：Ｙｅｓ）、各サブスレッドが復帰時刻テーブル８００に書き込んだ復帰時刻をサーチして、直近の時刻を探す（ステップＳ１３０７）。そして、直近の時刻−現在時刻を算出し、この時間差分エミュレーションを実行する（ステップＳ１３０８）。そして、現在のエミュレーションの時刻を参照して記憶し（ステップＳ１３０９）、ステップＳ１３０１に戻る。一方、ステップＳ１３０６において、起動済みスレッド数＞０でない場合（ステップＳ１３０６：Ｎｏ）、実行中のスレッドが残っていないため、スレッド間調停処理（ステップＳ１１０２）を終了する。
【００５８】
このスレッド間調停処理（ステップＳ１１０２）は、割り込みがなかった場合の処理である。エミュレーション装置１０２における割り込みとは、たとえば、プログラムカウンタがスレッド間同期処理（ステップＳ１１０１）の時に割り込みをあげる設定をして、この条件が満たされた時、エミュレーション装置１０２が制御プログラム６０２に制御を返す処理をさす。このような割り込みについては後述する。
【００５９】
スレッド間同期処理（ステップＳ１１０１）では、図１３に示したように、起動順序にしたがって、図８に示した復帰時刻テーブル８００と現在時刻を起動順序に従って参照し、一致しているスレッドに対して、ｗａｋｅｕｐ信号を送る。さらに、このスレッドに対応したｓｌｅｅｐ信号を待つと同時に、共有変数領域をアンロックする。この手続をサブスレッド分繰り返す。この処理が終わったら、復帰時刻テーブル８００を参照する。復帰時刻テーブル８００はサブスレッドによって更新されている。
【００６０】
図１４は、初回更新後の復帰時刻テーブル８００を示す説明図である。たとえば、第１のスクリプト２０１および第２のスクリプト２０２を実行した場合、復帰時刻テーブル８００は、図１４のようになる（フリーｒｕｎの場合には最大値（たとえば、ｌｏｎｇ  ｌｏｎｇで表現できる最大の正数）が入っている。）。
【００６１】
もっとも最近の時刻は３００サイクルである。そこで、３００サイクル分、エミュレーションを進めるため、制御プログラム６０２のインタプリタに対して、"ｒｕｎ  ３００"を送る。この関数はエミュレーションの処理が終了するまでブロックされる。３００サイクルのエミュレーションが終了するか、割り込みが発生するまでは復帰しない。この例では割り込みを設定していないので、３００サイクルたって復帰する。
【００６２】
復帰後、エミュレーションの時刻を調べる。ここではエミュレーション装置１０２から時刻３００が帰ってくる。これを現在時刻として記憶する。そして、先頭に戻る。現在時刻は３００なので、第２のスクリプト２０２に対して、ｗａｋｅｕｐイベントを発行する。
【００６３】
図１５は、２回目更新後の復帰時刻テーブル８００を示す説明図である。ステップＳ１３０７に到達した時には、図１５に示したようになる。現在時刻は３００サイクルなので、直近の時刻４００サイクルまでの時間は１００サイクル進めればよいことがわかる。したがって、“ｒｕｎ  １００”を制御プログラム６０２のインタプリタに送ることとなる。
【００６４】
（サブスレッドに渡す関数による処理手順）
図１６は、サブスレッドに渡す関数による処理手順を示すフローチャートである。図１６において、まず、共有変数領域をロックする（ステップＳ１６０１）。つぎに、図１０の起動順序テーブル１０００を参照して、スクリプトの起動順序を引く（ステップＳ１６０２）。そして、スレッドのスレッドＩＤを引く（ステップＳ１６０３）。具体的には、スレッドごとにスレッドカーネルがスレッドＩＤを振る。「ｐｔｈｒｅａｄ」の場合、「ｐｔｈｒｅａｄ＿ｓｅｌｆ（）」を用いるとスレッドＩＤを参照できる。そして、スレッドＩＤと起動番号の対応関係を示すスレッドＩＤ−起動順序対応テーブルを作成する（ステップＳ１６０４）。
【００６５】
図１７は、スレッドＩＤ−起動順序対応テーブルを示す説明図である。スレッドＩＤ−起動順序対応テーブル１７００は、図１０の起動順序テーブル１０００を基にして作成することができる。つぎに、スレッドは、自分が立ち上がったので起動スレッド数を１加算する（ステップＳ１６０５）。そして、サブスレッドのスレッド起動イベントを発行し、更に自スレッドの起動番号に対応したｗａｋｅｕｐイベントを待つと同時に共有変数領域をアンロックする（ステップＳ１６０６）。
【００６６】
このｗａｋｅｕｐイベントを受け取ってｗａｋｅｕｐ待ち状態を脱した（ステップＳ１６０６を抜けた）サブスレッドのみが実行可能になり、起動中のスレッドに対応するスクリプトのインタプリタを生成する（ステップＳ１６０７）。そして、拡張命令をインタプリタに登録する（ステップＳ１６０８）。
【００６７】
図１８は、拡張命令の設定の記述例を示す説明図である。この関数に現在生成したインタプリタのポインタを渡す。さらに、この関数内でエミュレーション用のコマンドとｓｅｔのコマンドを設定する。図１８の記述はｒｕｎ，ｓｅｔ，ｇｅｔＷａｖｅを設定した例を示している。ｒｕｎ，ｓｅｔ，例外（割り込み）にかかわらないコマンドは即座に制御プログラム６０２に渡して処理をさせ、結果をうけとる。
【００６８】
図１９は、通常コマンドの拡張記述例を示す説明図である。図１９のように制御プログラム６０２内のインタプリタのポインタ（ｇ＿ｔｍ．ｇｅｔ＿ｐａｒｅｎｔ（）はこれを取り出す関数）を参照して、このインタプリタにもらった文字列をすべて渡す。このようにすることで、スクリプトの実行を即座に制御プログラム６０２に渡し、エミュレーション装置１０２の応答を制御プログラム６０２よりもらう。もらった応答を呼び出し側のインタプリタ、スクリプト用のスレッド上のインタプリタに返す。ｒｕｎ／ｓｅｔ、例外（割り込み）関係については後述する。
【００６９】
つぎに、スレッド−インタプリタ間の共有変数とインタプリタを関係付ける（ステップＳ１６０９）。具体的には、サブスレッド上のインタプリタの共有変数領域を各スレッドで共有させる。ＴＣＬの場合、Ｔｃｌ＿ＬｉｎｋＶａｒを使って共有する。
【００７０】
図２０は、共有変数領域の記述例を示す説明図である。たとえば、図２０のような記述をおこない、グローバル変数で宣言しておく。ステップＳ１６０９では、スレッド上のインタプリタのポインタをｇ＿ｓｈａｒｅ＿ｖａｒに渡す。これにより共有変数として、ｌｉｎｋ，ａａａＭｓｇＬｅｎが登録できたことになる。
【００７１】
また、図１６に戻って、ステップＳ１６０９のあと、サブスレッドは、内部のインタプリタ（ＴＣＬインタプリタ）に自分のスクリプトファイル名を渡して、解析を開始する（ステップＳ１６１０）。そして、解析が終了すると、起動済みスレッド数を１減算して（ステップＳ１６１１）、スレッドを終了する（ステップＳ１６１２）。
【００７２】
（ｓｅｔのコールバック関数ｐｒｏｃ＿ｓｅｔの処理手順）
変数はｓｅｔコマンドと関係がある。つぎに、ｓｅｔのコールバック関数であるｐｒｏｃ＿ｓｅｔを説明する。
【００７３】
図２１は、コールバック関数ｐｒｏｃ＿ｓｅｔの処理手順を示すフローチャートである。図２１において、引数の個数を判断する（ステップＳ２１０１）。ＴＣＬでは「ｓｅｔ  ｖａｒ」のようにコマンドを含めた引数が２個の場合リード処理になる。「ｓｅｔ  ｖａｒ  １０００」のように３個の場合にはライト処理になる。
【００７４】
２個の場合（ステップＳ２１０１：２個）、リード処理となり、呼び出し側のインタプリタから第１引数で指定された変数の値を取り出す（ステップＳ２１０２）。そして、取り出した値をインタプリタの戻り値設定領域に書き込む（ステップＳ２１０３）。具体的には、リード時は、単に呼び出し側のインタプリタに対して、値をセットする「ＡＰＩ  Ｔｃｌ＿ＧｅｔＶａｒ」を使って結果値を取り出し、この結果値を呼び出し側のインタプリタの結果値の格納領域に書き込む。
【００７５】
一方、３個の場合（ステップＳ２１０１：３個）、ライト処理となり、呼び出し側のインタプリタに第１引数で示された変数に、第２引数で示された値をセットする（ステップＳ２１０４）。そして、第１引数で示された変数が制御プログラム６０２の予約された変数か否かを判断する（ステップＳ２１０５）。予約された変数である場合（ステップＳ２１０５：Ｙｅｓ）、制御プログラム６０２上のインタプリタに第１引数で示された変数に、第２引数で示された値をセットして（ステップＳ２１０６）、終了する。予約された変数でない場合（ステップＳ２１０５：Ｎｏ）、ステップＳ２１０６を実行せずに終了する。
【００７６】
上述した「ｓｅｔ  ｖａｒ  １０００」のように３個の場合にはライト処理になるので、変数ｖａｒに１０００を書き込む。具体的には、３個の場合、まず、呼び出し側のインタプリタに対して、「Ｔｃｌ＿ＳｅｔＶａｒ」を使って値を書き込む。さらに変数名が制御プログラム６０２の予約された変数であった場合には、制御プログラム６０２上のインタプリタに対して、「Ｔｃｌ＿ＳｅｔＶａｒ」を使って値を書き込む。このようにすることで、制御プログラム６０２上の予約された変数について、制御プログラム６０２上とサブスレッド上の任意のインタプリタ上で同期がとれる。
【００７７】
さらに、スレッド上のインタプリタ間の共通領域になっているため、ｓｅｔをつかわない値参照＄ｖａｒのように変数名の前に＄をつけた形式の参照でも制御プログラム６０２上の変数と同期がとれた値を参照できるようになる。
【００７８】
もし、ベーススクリプト２０４で予約された変数に値をセットする可能性がある場合には、管理用スレッド７００に渡す関数のスレッド間同期処理（ステップＳ１１０１）とスレッド間調停処理（ステップＳ１１０２）の間のタイミングなどで、予約された変数に関して、制御プログラム６０２に対してリードを試みて、リードに成功したものについては共通領域に書き込む。書き込みはすでに起動しているインタプリタのいずれかに対して「Ｔｃｌ＿ＳｅｔＶａｒ」をすることで実現できる。このようにすることで、各インタプリタが同じ変数を参照しなければならない課題を解決し、変数の同期を実現することができる。
【００７９】
（ｐｒｏｃ＿ｒｕｎの処理手順）
図２２は、ｐｒｏｃ＿ｒｕｎの処理手順を示すフローチャートである。まず、ｒｕｎコマンドの引数の実行時間（ｒｕｎで渡された時間）と現在時刻をたし合わせた時刻を復帰時刻テーブル８００に書き込む（ステップＳ２２０１）。フリーｒｕｎの場合には、最大値（たとえばｌｏｎｇ  ｌｏｎｇの表現で記述する最大の正数（現実的には到達できない数値なので無限と同様の機能を果たす））を書き込む。
【００８０】
つぎに、現在実行中のインタプリタのｓｌｅｅｐイベントを実行する（ステップＳ２２０２）。ｓｌｅｅｐイベントが配列につめられていてインデックスが起動順序になっている場合、現在実行中のスレッドのスレッドＩＤを調べて（ｐｔｈｒｅａｄの場合ｐｔｈｒｅａｄ＿ｓｅｌｆ（）)、このスレッド値と図１７のスレッドＩＤ−起動順序対応テーブル１７００を用いてスクリプト名を引き、さらにスクリプト名から起動順序を得ることができる。したがって、現在実行中のインタプリタに対応した起動順序を得ることができる。
【００８１】
つぎに、このスレッドに対応したｗａｋｅｕｐイベントを待つと同時に共有変数領域をアンロックする（ステップＳ２２０３）。ｗａｋｅｕｐイベントが配列につめられていて、起動順序でインデクシングされている場合には、先と同様の方法で実行中のスレッドのスレッドＩＤから起動順序をもとめる。そして、所望のｗａｋｅｕｐイベントを見つけ出して、ｗａｉｔ状態に入る。該当ｓｌｅｅｐイベントを待っているのはこのスレッドに対してｗａｋｅｕｐイベントを発行した管理用スレッド７００だけなので、制御が管理用スレッド７００にうつることになる。
【００８２】
このように、ｒｕｎコマンドの発行時点で復帰時刻テーブル８００を更新して、制御を管理用スレッド７００に返して、スレッド間調停処理（ステップＳ１１０２）で説明した処理を実行する。これにより、どのスクリプトも破綻しないようなエミュレーション時刻の進め方が決定でき、その分だけエミュレーションを実行することができる。
【００８３】
（エミュレーションシステム４００の制御シーケンス）
図２３は、エミュレーションシステム４００の制御シーケンスを示すシーケンス図である。この制御シーケンスは、第１のスクリプト２０１、第２のスクリプト２０２、およびベーススクリプト２０４を適用した場合の制御シーケンスである。また、図２３では、制御シリアライズ化処理部６０１が直接エミュレーション装置１０２を呼ぶように記述しているが、実際は制御プログラム６０２を介してエミュレーション装置１０２と通信する。なお、簡単のため、図２３のシーケンス図ではエミュレーションサイクル６００サイクル〜すべてのスクリプトが最終行に到達するまでのシーケンスを省略している。
【００８４】
なお、図２３のシーケンス図中では、スクリプト中で示したコマンドｇｅｔＷａｖｅはｓｉｇＴｒａｃｅ（−ｕｐｌｏａｄ）と表記されている。スクリプト中で示したコマンドｇｅｔＭｅｍｏｒｙはＭｅｍｏｒｙ(−Ｒｅａｄ，．．．）と表記されている。図２４〜図２８についても同様である。
【００８５】
制御シリアライズ化処理部６０１が、制御プログラム６０２に命令を送り、これを制御プログラム６０２がエミュレーション装置１０２に送り、エミュレーション装置１０２の応答を制御プログラム６０２が受理し、これを制御シリアライズ化処理部６０１に渡している。なお、すべてのスクリプトが最終行まで到達すると、制御をベーススクリプト２０４に返す。以下、制御シリアライズ化処理部６０１の詳細な制御シーケンスを、図２４〜図２８に示す。
【００８６】
図２４は、制御シリアライズ化処理部６０１の詳細な制御シーケンスを示すシーケンス図である。制御シリアライズ化処理部６０１は、基本部２４０１とタイムマネージャー２４０２とＴＣＬコールバック関数２４０３を含む構成である。また、図２４中、「Ｍａｉｎ  ｔｈｒｅａｄ」が管理用スレッド７００に相当する。「Ｓｕｂ  ｔｈｒｅａｄ  １」が第１のサブスレッド７０１に相当し、「ｍｙ０．ｔｃｌ」が割り当てられる。また、「Ｓｕｂ  ｔｈｒｅａｄ  ２」が第２のサブスレッド７０２に相当し、「ｍｙ１．ｔｃｌ」が割り当てられる。
【００８７】
タイムマネージャー２４０２は、管理用スレッド７００に渡す関数をクラス関数としてもち、初期状態の復帰時刻テーブル８００（図８）、初期状態の起動順序テーブル１０００（図１０）、スレッドＩＤ−起動順序対応テーブル１７００、ｗａｋｅｕｐ／ｓｌｅｅｐイベント、現在時刻等のオブジェクトを集約したものである。「ＴｉｍｅＭａｎａｇｅｒ：：ｍａｉｎ」はスレッド化され、図中の「ｍａｉｎ  ｔｈｒｅａｄ」として動作する。
【００８８】
また、タイムマネージャー２４０２は、初期状態の起動順序テーブル１０００（図１０）とスレッドＩＤ−起動順序対応テーブル１７００を作成する。スクリプトの評価順序（つまりスレッドを起動する（ｗａｋｅｕｐする）順序）はユーザが決定できる（たとえば、本実施例では「ｂｒａｎｃｈ＿ｃａｌｌ」に渡す引数の順序で決定できている。）。通例、スレッドの場合、スレッドの生成順序はカーネルが決定するため、スレッドの起動順序がスレッドの生成順序に依存する場合、起動順序が入れ替わることがある。
【００８９】
図２９は、起動時の実行ログを示す説明図である。たとえば、図２９に示したように、「ｍｙ０．ｔｃｌ」，「ｍｙ１．ｔｃｌ」，「ｍｙ２．ｔｃｌ」，「ｍｙ３．ｔｃｌ」の順にサブスレッドの生成（ｐｔｈｒｅａｄ＿ｃｒｅａｔｅ）を実行したにもかかわらず、「ｍｙ３．ｔｃｌ」に対応したスレッドが「ｍｙ２．ｔｃｌ」に対応したスレッドよりも先に起動されることがある。複数のスクリプトをマージした結果の制御シーケンスが非決定的な動作をすることは望ましくない。したがって、初期状態の起動順序テーブル１０００（図１０）とスレッドＩＤ−起動順序対応テーブル１７００から起動順序を参照して、決定的な制御シーケンスを生成する。
【００９０】
図２４に戻って、符号２４１１の制御シーケンスは、図９に示したｂｒａｎｃｈ＿ｃａｌｌ関数を呼ぶ処理である。また、符号２４１２の制御シーケンスは、図９に示したｂｒａｎｃｈ＿ｃａｌｌ関数の処理内容のうちステップＳ９０１〜ステップＳ９０７に相当する処理である。符号２４１３の制御シーケンスは、図１１に示したスレッド間同期処理（ステップＳ１１０１）の処理内容に相当する処理である。符号２４１４の制御シーケンスは、図１６に示したスクリプト用スレッドに渡す関数のステップＳ１６０１〜Ｓ１６０６に相当する処理である。
【００９１】
図２５は、管理用スレッド７００（Ｍａｉｎ  ｔｈｒｅａｄ）内の管理機構７１０の制御シーケンス（前半）を示すシーケンス図である。図２５中、「ＴＣＬインタプリタ１」は第１のインタプリタ７１１に相当し、「ＴＣＬインタプリタ２」は第２のインタプリタ７１２に相当する（以下の図において同様。）。
【００９２】
また、符号２５０１の制御シーケンスは、図１３のステップＳ１３０１，Ｓ１３０２に相当する処理である。符号２５０２の制御シーケンスは、図１３のステップＳ１３０３，Ｓ１３０４に相当する処理である。符号２５０３の制御シーケンスは、図１３のステップＳ１３０７〜Ｓ１３０９に相当する処理である。符号２５０４の制御シーケンスは、Ｓ１３０１、Ｓ１３０２に相当する処理である。符号２５０５の制御シーケンスは、図１３のステップＳ１３０３〜Ｓ１３０４に相当する処理である。符号２５０６はステップ１３０４に入るタイミングを示す。符号２５０７はステップ１３０４から抜けるタイミングを示す。
【００９３】
図２６は、管理用スレッド７００（Ｍａｉｎ  ｔｈｒｅａｄ）内の管理機構７１０の制御シーケンス（後半）を示すシーケンス図である。符号２６０１の制御シーケンスは、図１３のステップＳ１３０７〜Ｓ１３０９に相当する処理である。符号２６０２の制御シーケンスは、図１３のステップＳ１３０１〜Ｓ１３０４に相当する処理である。
【００９４】
図２７は、サブスレッド（Ｓｕｂ  ｔｈｒｅａｄ）の制御シーケンス（前半）を示すシーケンス図である。符号２７０１の制御シーケンスは、図１６のステップＳ１６０７〜Ｓ１６０９に相当する処理を行い、ステップＳ１６１０の処理に入る。ステップＳ１６１０はスクリプトの解釈、すなわちスクリプトの最終行を解釈するまで継続される。図２７の符号２７０１以降および図２８はいずれもステップＳ１６１０の処理である。符号２７０２の制御シーケンスは、ｐｒｏｃ＿ｒｕｎ、すなわち、図２２に示した処理手順に相当する処理である。符号２７０３の制御シーケンスは、ｐｒｏｃ＿ｒｕｎから戻る処理を示している。
【００９５】
符号２７０４の制御シーケンスは、図１９に示した通常コマンドの拡張記述により実現する処理である。この処理は、エミュレーション装置１０２の実行を伴わないコマンドであるため、即時実行される。符号２７０５の制御シーケンスは、インタプリタ（ここでは、ＴＣＬインタプリタ２）がｒｕｎコマンドの処理の終了を検出して、次のコマンド処理に入ることを示している。
【００９６】
図２８は、サブスレッド（Ｓｕｂ  ｔｈｒｅａｄ）の制御シーケンス（後半）を示すシーケンス図である。符号２８０１の制御シーケンスは、ｐｒｏｃ＿ｒｕｎから戻る処理を示している。符号２８０２の制御シーケンスは、図１９に示した通常コマンドの拡張記述により実現する処理である。この処理は、エミュレーション装置１０２の実行を伴わないコマンドであるため、即時実行される。
【００９７】
符号２８０３の制御シーケンスは、インタプリタ（ここでは、ＴＣＬインタプリタ１）がｒｕｎコマンドの処理の終了を検出して、次のコマンド処理に入ることを示している。符号２８０４の制御シーケンスは、ｐｒｏｃ＿ｒｕｎ、すなわち、図２２に示した処理手順に相当する処理である。
【００９８】
（例外系の処理内容）
以上説明した内容が正常系の処理内容である。つぎに例外（割り込み）系の処理内容を説明する。検証では、ある信号の値が特定の値になったら停止するように設定する。この場合、実行時であっても処理を中断し、スクリプト側に制御を返す。このような例外処理はシステムによって若干の相違があるかもしれないが、本質的には同等の処理を行うはずである。
【００９９】
図３０は、例外関係の処理が追加された管理用スレッドの関数（図１３を参照）の後半部分を示す一般的なフローチャートである。なお、エミュレーションシステム４００は例外の発生条件を設定するコマンドを持っているものとする。たとえば、例外のためのイベント設定のような設定形態であったとする。従って、管理用スレッドで一元的に例外を設定する場合、図１３のフロー後半部分を図３０のように変更することにより実現できる。なお、図３０において、図１３と同一ステップには同一符号を付しその説明を省略する。
【０１００】
図３１は、例外のためのイベント設定に関する記述例を示す説明図である。図３１のような記述が設定された場合、「ｉｎｓｔ＿ａ．ｓｉｇ＿ａ」の値が１になった時、制御を制御プログラム６０２側に返す意味であるとする。例外の発生条件を設定する場合、具体的には、例外条件を記録する例外発生条件テーブルを追加する。
【０１０１】
図３２は、例外発生条件テーブルを示す説明図である。この例外発生条件テーブル３２００では、スクリプト０（第１のスクリプト２０１）が２つの例外条件「ｉｎｓｔ＿ａ．ｓｉｇ＿ａ＝＝１’ｂ１」，「ｉｎｓｔ＿ａ．ｓｉｇ＿ｂ＝＝２’ｂ０１」で待っており、スクリプト１（第２のスクリプト２０２）が１つの例外条件「ｉｎｓｔ＿ａ．ｓｉｇ＿ｃ＝＝１００００」を待っていることを示す。
【０１０２】
図３３は、例外設定用コマンドの追加記述例を示す説明図である。また、図３４は、例外設定用コールバック関数の記述例を示す説明図である。正常系と同様、コマンドとコールバックの指定を図３３に示した例外設定用コマンドの追加記述のように追加し、図３４に示したように、条件対象信号と信号値を、例外発生条件テーブル３２００に書き込む。本例では、例外発生条件テーブル３２００が図３４のｇ＿ｔｍオブジェクト（前記タイムマネージャクラスのインスタンス）の中に置かれており、条件対象信号と信号値を渡している。
【０１０３】
この関数はサブスレッドの中でコールされる。したがって、Ｐｔｈｒｅａｄの場合、ｐｔｈｒｅａｄ＿ｓｅｌｆ（）でスレッドＩＤを参照することができる。スレッドＩＤから、スレッドＩＤ−起動順序対応テーブル１７００を参照することにより、現在実行中のスクリプト名が得られ、例外発生条件テーブル３２００を作成することができる。
【０１０４】
図３０に戻って、例外の発生条件の設定がされた（ステップＳ３０２０）後、エミュレーションを実行する（ステップＳ１３０８）。制御が返ってきたら（ステップＳ１３０８を抜けたら）、設定した例外発生条件を解除する（ステップＳ３０２１）。ステップＳ１３０６〜Ｓ１３０６は図１３と同じなので説明を省略する。
【０１０５】
つぎに、例外発生時の処理は、図１３の前半フローを拡張したフローで実現する。具体的には、管理用スレッド７００の管理用スレッド関数（図１３を参照）の前半部分（ステップＳ１３０１〜Ｓ１３０５）に、例外関係の処理が追加された処理となる。
【０１０６】
図３５は、例外関係の処理が追加された管理用スレッド７００の関数（図１３を参照）の前半部分を示すフローチャートである。図１３と同一処理には同一ステップ番号を付し、その説明を省略する。図３５において、まず、起動順序が若い順に、例外発生条件の信号値を参照して、例外条件に該当するスクリプト名の一覧を得る（ステップＳ３５０１）。通例、エミュレーションシステム４００では信号値を参照できる。
【０１０７】
そして、例外が発生していたか否かを判断する（ステップＳ３５０２）。たとえば、「ｉｎｓｔ＿ａ．ｓｉｇ＿ａ」等、例外発生条件テーブル３２００中にある信号の値を参照し、その値が例外発生条件テーブル３２００中の信号値に合致すればそのスクリプトは例外を受理したとみなす。その後、例外が発生していない場合（ステップＳ３５０２：Ｎｏ）、ステップＳ１３０１〜Ｓ１３０５を実行する。
【０１０８】
一方、例外が発生した場合（ステップＳ３５０２：Ｙｅｓ）、ステップＳ１３０３に移行する。このようにすることで現在発生している例外処理を待っているスクリプト、時間を終えて正常終了するスクリプトが起動され、該当しないスクリプトは実行されない。以上のように、例外処理を含む場合であっても、並列化可能である。
【０１０９】
（ソフトウェアデバッガとの接続）
上述した実施の形態では、複数のスクリプト（第１のスクリプト２０１と第２のスクリプト２０２）をシリアライズ化する例について説明したが、いずれか一つのスクリプトを、ソフトウェアデバッガに代えることとしてもよい。
【０１１０】
ソフトウェアデバッガとソフトウェアの振る舞いをシミュレーションするソフトウェアとの接続方法にはＴＣＰ／ＩＰでつなぐ方法、ソフトウェアの振る舞いをするソフトウェアをダイナミックリンクライブラリとして作成しておき、ソフトウェアデバッガと動的にリンクする方法などがあるが、いずれも本質的には同じである。ここではＴＣＰ／ＩＰを例に説明する。
【０１１１】
図３６は、ソフトウェアデバッガとインストラクション・セット・シミュレータとの接続例を示す説明図である。図３７は、ソフトウェアデバッガ３６０１と接続する場合の制御シリアライズ化処理部６０１の実装を示すブロック図である。なお、図７と同一構成には同一符号を付し、その説明を省略する。図３６では、第２のスクリプト２０２に代えて、ソフトウェアデバッガ３６０１を接続している。制御プログラム６０２との通信のため、サブスレッド７０２には、通信部３７００が生成される。
【０１１２】
最初にインストラクション・セット・シミュレータ３６０２をサーバーとして起動し、その後、ソフトウェアデバッガ３６０１をクライアントとして起動し、サーバーに接続する。インストラクション・セット・シミュレータ３６０２は、サーバーとして動作する。
【０１１３】
図３８は、インストラクション・セット・シミュレータ３６０２の動作処理手順を示すフローチャートである。図３８において、インストラクション・セット・シミュレータ３６０２は、初期化処理をおこない（ステップＳ３８０１）、ＴＣＰ／ＩＰソケットを生成する（ステップＳ３８０２）。そして、クライアント（ソフトウェアデバッガ３６０１）からのコネクション要求を待ち（ステップＳ３８０３）、コネクション要求があると、クライアントから送られてくる命令列を待つ（ステップＳ３８０４）。そして、命令列が送られてくると、命令列をパーズし（ステップＳ３８０５）、終了命令か否かを判断する（ステップＳ３８０６）。
【０１１４】
終了命令でない場合（ステップＳ３８０６：Ｎｏ）、命令列が、変数の参照・書き込み、例外の設定か否かを判断する（ステップＳ３８０７）。命令列が、変数の参照・書き込み、例外の設定である場合（ステップＳ３８０７：Ｙｅｓ）、変数の参照・書き込み、例外の設定をおこなう（ステップＳ３８０８）。そして、その実行結果をクライアント（ソフトウェアデバッガ３６０１）に送信し（ステップＳ３８１０）、ステップＳ３８０４に戻る。
【０１１５】
一方、ステップＳ３８０７において、命令列が、変数の参照・書き込み、例外の設定でない場合（ステップＳ３８０７：Ｎｏ）、命令列となる実行命令を実行する（ステップＳ３８０９）。そして、その実行結果をクライアント（ソフトウェアデバッガ３６０１）に送信し（ステップＳ３８１０）、ステップＳ３８０４に戻る。
【０１１６】
すなわち、インストラクションセット中の変数への参照であれば、その値を返す。また、ブレークポイントを設定する命令であれば、ブレークポイントに相当するアドレス値をインストラクション・セット・シミュレーションに設定する。実行命令で実行サイクル数が指定されていればその命令数分実行する。また、ステップＳ３８０６において、終了命令である場合（ステップＳ３８０６：Ｙｅｓ）、一連の処理を終了する。
【０１１７】
ソフトウェアデバッガ３６０１は、外部のシミュレータに命令を送るためのコマンドを持っている。たとえば、「ｂｕｓ」というコマンドがこのようなコマンドであるとする。この時、「ｂｕｓ  ｂｒｅａｋ  １００００」というコマンドをソフトウェアデバッガ３６０１に入力すると、「ｂｒｅａｋ  １００００」をＴＣＰ／ＩＰに送信する。これは本質的にはスクリプトで与えるコマンドを動作時に生成していることに他ならない。したがって、以下の実装を用意すれば接続が可能になる。
【０１１８】
ソフトウェアデバッガ３６０１と接続する場合、図３８に示したインストラクション・セット・シミュレータ３６０２の動作処理手順と同様のフローを図３７の通信部３７００で行う。本実施の形態では、接続対象がインストラクション・セット・シミュレータ３６０２の代わりにエミュレーションシステム４００の制御プログラム６０２になる。第２のサブスレッド７０２ではソフトウェアデバッガ３６０１の要求を制御プログラム６０２のコマンドに翻訳する機能と戻り値を翻訳してソフトウェアデバッガ３６０１に返す機能を持つ。
【０１１９】
図３９は、デバッガカテゴリ−信号対応テーブルを示す説明図である。レジスタ・メモリ値の参照・書き込みについて、デバッガカテゴリ−信号対応テーブル３９００を用意しておき、参照・書き込み相当の処理を制御プログラム６０２に発行する。たとえば、ソフトウェアデバッガ３６０１が「レジスタ０」の値を要求した場合には、デバッガカテゴリ−信号対応テーブル３９００の信号位置で示された信号の値をエミュレーション装置１０２から読み出して、この値をソフトウェアデバッガ３６０１に返す。
【０１２０】
つぎに、実行サイクル数でブレークする場合やステップ実行する場合について説明する。予め被検証回路にステップ数を数える回路を追加して、この回路をエミュレーション装置１０２に載せる。
【０１２１】
図４０は、テストベンチと被検証回路の接続例を示す説明図である。被検証回路４００１は、ＣＰＵ４００２を有する。テストベンチ４０１１は、ステップカウンタ４０１２を有する。ＣＰＵ４００２とステップカウンタ４０１２は、ＣＰＵ４００２で実行命令をフェッチする信号線４００３により接続されている。このような構成により、ＣＰＵ４００２のステップ数が数えられるようになる。
【０１２２】
図４１は、図４０におけるステップ実行処理手順を示すフローチャートである。まず、該当のＣＰＵ４００２の状態を計測するステップカウンタ４０１２の値を「０」にする（ステップＳ４１０１）。つぎに、該当のＣＰＵ４００２がブレークするステップカウンタ４０１２がブレークするまでのサイクル値と等しくなる条件の例外を設定する（ステップＳ４１０２）。そして、実行コールバック関数にフリー実行を設定する（ステップＳ４１０３）。フリー実行では、例外が発生するまで停止しない。
【０１２３】
すなわち、ステップカウンタ４０１２がステップ数と等しいときに例外を発生させる設定をエミュレーション装置１０２に設定し、エミュレーション装置１０２をフリー実行させる。ステップが所望の値になると、エミュレーション装置１０２から制御が返ってくる。そして、図３５に示した例外処理を加えた管理用スレッド７００の処理により、ソフトウェアデバッガ３６０１に制御が返ってくる。したがって、ステップを利用したエミュレーションが実現できる。
【０１２４】
つぎに、ソースコードにブレークポイントを張った場合について説明する。この場合、ソフトウェアデバッガ３６０１にはブレークポイントの命令のアドレスが渡される。第２のサブスレッド７０２において、ブレークポイントで指定されたアドレスとデバッガカテゴリ−信号対応テーブル３９００で示されたプログラムカウンタの信号値が受け取ったアドレス値とが一致したときに、例外を発生する例外を指定する。
【０１２５】
これらはソフトウェアデバッガ３６０１の一部機能ではあるが、実行、ブレーク、変数・メモリの参照・書き込みの主要機能が実現できている。また、ＣＰＵ４００２が複数扱えるソフトウェアデバッガ３６０１においては、ＣＰＵ４００２のＩＤ番号と本体の関係を対応付けるような何らかの機構が必要である。
【０１２６】
ＩＤ番号で管理し、ソフトウェアデバッガ３６０１はＣＰＵ４００２のＩＤ番号を付して、ソフトウェアデバッガ３６０１の命令を送信する手続きであったとすると、デバッガカテゴリ−信号対応テーブル３９００のＣＰＵ４００２のＩＤ番号ごとに対応を用意しておき、引くことが可能になる。したがって、容易に拡張することが可能である。以上のように、ソフトウェアデバッガ３６０１のコマンドをエミュレーション装置１０２のコマンドに変換する機能を第２のサブスレッド７０２に持たせることにより、ソフトウェアデバッガ３６０１との接続が可能である。
【０１２７】
（制御装置の機能的構成）
つぎに、これまで述べた内容を踏まえて、本実施の形態の機能的構成について説明する。図４２は、本実施の形態にかかる制御装置の機能的構成を示すブロック図である。制御装置４０１は、受付部４２０１と、実行部４２０２と、算出部４２０３と、決定部４２０４と、実行制御部４２０５とを含む構成である。これらの機能（受付部４２０１〜実行制御部４２０５）は、ソフトウェア的には、図６に示した制御シリアライズ化処理部６０１およびＣＰＵ５０１による制御プログラム６０２の実行によりその機能を実現する。
【０１２８】
また、ハードウェア的には、具体的には、たとえば、図５に示したＲＯＭ５０２、ＲＡＭ５０３、磁気ディスク５０５、光ディスク５０７などの記憶領域に記憶されたプログラムをＣＰＵ５０１に実行させることにより、または、Ｉ／Ｆ５０９により、その機能を実現する。
【０１２９】
受付部４２０１は、検証対象回路に関する複数のスクリプトを受け付ける機能を有する。具体的には、たとえば、図２３に示したように、「ライブラリをコールする（）」が制御プログラム６０２によって実行された場合、第１のスクリプト２０１と第２のスクリプト２０２を読み込む。
【０１３０】
また、ソフトウェアデバッガ３６０１により検証対象回路のバグを検出する場合には、スクリプトの受け付けのほか、ソフトウェアデバッガ３６０１からの接続（コネクション）要求とコマンド（命令列）を受け付ける（図３８のステップＳ３８０２、Ｓ３８０３を参照）。
【０１３１】
実行部４２０２は、受付部４２０１によって受け付けられた各スクリプトを解釈して、エミュレーション装置１０２に対する制御を実行する機能を有する。具体的には、たとえば、図７に示した第１のインタプリタ７１１により第１のスクリプト２０１を解釈して、制御プログラム６０２に対して、エミュレーション装置１０２を制御するコマンドを与える。
【０１３２】
同様に、第１のインタプリタ７１２により第２のスクリプト２０２を解釈して、制御プログラム６０２に対して、エミュレーション装置１０２を制御するコマンドを与える。そして、実行終了した場合、図２３に示したように、エミュレーション装置１０２から「正常終了（）」のシーケンスを受け取る。
【０１３３】
また、ソフトウェアデバッガ３６０１により検証対象回路のバグを検出する場合には、図３７に示した第２のサブスレッド７０２内に生成した通信部３７００により、ソフトウェアデバッガからのコマンド（命令列）を受信して、制御プログラム６０２を介して、当該受信したコマンドをエミュレーション装置１０２に与える。そして、実行終了した場合、エミュレーション装置１０２から実行結果を通信部３７００が受け取る。通信部３７００は、実行結果をソフトウェアデバッガ３６０１に送る。
【０１３４】
算出部４２０３は、各スクリプトの実行サイクル数に基づいて、各スクリプトの復帰時刻を算出する機能を有する。実行サイクル数は、各スクリプトに記述されているサイクル数である。たとえば、第１のスクリプト２０１では、図２−１に示したように、「ｒｕｎ  ４００」と記述されているため、第１のスクリプト２０１の実行サイクル数は、「４００」である。同様に、第２のスクリプト２０２では、図２−２に示したように、「ｒｕｎ  ３００」と記述されているため、第２のスクリプト２０２の実行サイクル数は、「３００」である。
【０１３５】
また、復帰時刻とは、スクリプトを解釈するインタプリタがあるサブスレッドが（ｓｌｅｅｐ状態から）復帰して起動する時刻である。この復帰時刻もサイクル数で表現する。たとえば、第１のスクリプト２０１は４００サイクルごとに実行されるため、その復帰時刻は、４００、８００、１２００、１６００、…と算出される。同様に、第２のスクリプト２０２は３００サイクルごとに実行されるため、その復帰時刻は、３００、６００、９００、１２００、…と算出される。復帰時刻があらたに算出される都度、復帰時刻テーブルが更新される。
【０１３６】
決定部４２０４は、算出部４２０３によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する機能を有する。直近する時刻とは、現在時刻よりも先の時刻で最も現在時刻との差が小さい時刻である。たとえば、開始時では、現在時刻は０サイクルであるため、第１のスクリプト２０１の復帰時刻である４００サイクルと第２のスクリプト２０２の３００サイクルとを比較する。現在時刻である０サイクルに直近するのは、第２のスクリプト２０２の３００サイクルである。したがって、この場合は、第２のスクリプト２０２が実行対象スクリプトに決定される。
【０１３７】
また、第２のスクリプト２０２が実行対象スクリプトに決定されると、現在時刻は３００サイクルに進む。したがって、算出部４２０３では、第２のスクリプトの復帰時刻をあらたに算出する。具体的には、たとえば、現在時刻である３００サイクルに第２のスクリプト２０２の実行サイクル数である３００サイクルを加算する。この加算結果である６００サイクルが、第２のスクリプト２０２のあらたな復帰時刻となる。
【０１３８】
したがって、つぎの実行対象スクリプトを決定する場合、復帰時刻テーブルを参照し、第１のスクリプト２０１の復帰時刻である４００サイクルと第２のスクリプト２０２のあらたな復帰時刻である６００サイクルとを比較して、現在時刻である３００サイクルに直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する。この場合は、第１のスクリプト２０１に決定される。
【０１３９】
また、ソフトウェアデバッガ３６０１により検証対象回路のバグを検出する場合には、復帰時刻に接続要求の時刻（サイクル数）も含めて比較する。接続要求の時刻が直近の時刻となった場合は、そのときのソフトウェアデバッガ３６０１からの命令列を実行対象に決定する。
【０１４０】
実行制御部４２０５は、実行部４２０２を制御する。具体的には、現在時刻に直近する復帰時刻まで現在時刻をすすめる。そして、決定部４２０４によって決定された実行対象スクリプトを実行部４２０２に解釈させて、シミュレーション装置に対する制御を実行部４２０２に実行させる。
【０１４１】
実行部４２０２は、起動されているスレッド内のスクリプトを実行するが、実行制御部４２０５は、スクリプトの実行順序を遵守するため、実行対象スクリプトのスレッドのみを起動し、それ以外のスレッドをｓｌｅｅｐ状態にする。具体的には、図１７に示したスレッドＩＤ−起動順序対応テーブル１７００を参照し、そのスレッドのみを起動すればよい。これにより、スクリプトの実行順序がスレッドの起動順序により入れ替わることがなく、スクリプトの実行順序を遵守することができる。
【０１４２】
また、ソフトウェアデバッガ３６０１により検証対象回路のバグを検出する場合には、接続要求の時刻が直近の時刻となったときは、そのときのソフトウェアデバッガ３６０１からの命令列を通信部３７００が制御プログラム６０２を介してエミュレーション装置１０２に与える。
【０１４３】
以上説明したように、上述した従来技術では、エミュレーション用の第１の制御シーケンスに第２の制御シーケンスを追加する場合、第１の制御シーケンスを実装した第１のスクリプト２０１を解析して、第２の制御シーケンスに相当する処理を第１の制御シーケンスに書き加える必要があり、工数がかかる、信頼性が低下するとういう問題があった。
【０１４４】
しかし、本実施の形態によれば、第１の制御シーケンスを表す第１のスクリプト２０１の主処理を変更することなく、第２の制御シーケンスを実装した第２のスクリプト２０２を新たに作成した場合、第１のスクリプト２０１と第２のスクリプト２０２とをエミュレーション装置１０２の時刻に同期させながら、実行することができ、工数の短縮、信頼性の低下を回避することが可能である。
【０１４５】
たとえば、上述した従来技術では、第１の制御シーケンスがターゲットデザインの信号へのフォース文や、信号値によりシーケンスを切り替えるような複雑なシナリオであった場合、第２の制御シーケンスとして、３０００サイクルおきにメモリダンプをするという単純な処理を加える場合であっても、３０００サイクルになるポイントにメモリダンプ文を注意深く挿入する必要があり容易ではなかった。
【０１４６】
しかし、本実施の形態によれば、第２のスクリプト２０２として、単に３０００サイクルおきにメモリをダンプする命令を呼ぶスクリプトを用意するだけでよく、簡単である。また、第１のスクリプト２０１も第２のスクリプト２０２も本質的にさせたい処理のみを記述した可読性のよいスクリプトになる。このため、メンテナンス容易となり、信頼性の低下が避けられる。
【０１４７】
また、上述した従来技術では、第１のスクリプト２０１で実現される第１の制御シーケンスを実行しつつ、ソフトウェアデバッガ３６０１のように第２の制御シーケンスがユーザと対話的に生成される（動的に生成される）場合の制御はできなかった。
【０１４８】
しかし、本実施の形態によれば、第１のスクリプト２０１のシナリオを変更することなく、ソフトウェアデバッガ３６０１による対話的制御を容易に加えることが可能になる。したがって、第１のスクリプト２０１のシナリオ通りに動作することが保証されたエミュレーション環境に対して、ソフトウェアデバッガ３６０１を解してデータを取り出すことができ、第１のスクリプト２０１下のエミュレーション環境の観測手段としてソフトウェアデバッガ３６０１が利用可能になる。これにより、第１のスクリプト２０１でされたシーケンスに、ソフトウェアデバッガ３６０１機能を容易に付加できるようになるのである。
【０１４９】
また、従来では、スレッドの実行順序は非決定的に行われる。たとえば、１回目のエミュレーションでは第１のスクリプト２０１の次に第２のスクリプト２０２が実行されていたが、２回目のエミュレーションでは第２のスクリプト２０２が先に実行され第１のスクリプト２０１が実行されるかもしれない。これはデバッグに関して望ましくない。
【０１５０】
しかし、本実施の形態によれば、スレッドの実行順序を決定的に決められるので、毎回のエミュレーションで制御順序が変わることはない。したがって、スクリプトの評価順序の変化による現象の変化を考慮することなく、検証対象のデバッグに集中できるようになる。
【０１５１】
この他に、スクリプトの代わりにＶｅｒｉｌｏｇ等のＨＤＬ（Ｈａｒｄｗａｒｅ  ｄｅｓｃｒｉｐｔｉｏｎ  ｌａｎｇｕａｇｅ）言語中にスクリプト言語で指定するコマンド相当のシステムタスクをコールすることにより、エミュレータを制御する方法が考えられる。このような機構においては、Ｖｅｒｉｌｏｇの場合、Ｃ言語で作成したライブラリをＰＬＩ（ｐｒｏｇｒａｍｍｉｎｇ  ｌａｎｇｕａｇｅ  Ｉｎｔｅｒｆａｃｅ）と呼ばれる方法で接続するのが一般的である。一方、Ｖｅｒｉｌｏｇ言語は各々の手続き文（ａｌｗａｙｓ文、ｉｎｉｔｉａｌ文）は並列実行可能であり、スレッド相当を言語が持っている。したがって、本実施の形態を応用することが可能である。
【０１５２】
これによれば、ＴＣＬ等のスクリプトをインターフェイスにするシミュレーション制御方法だけではなく、Ｖｅｒｉｌｏｇシミュレータをインターフェイスにするシミュレーション制御方法にも応用することが可能になる。以上説明したように、本実施の形態によれば、設計者の負担軽減と設計作業の短縮化とを実現することができる。
【０１５３】
なお、本実施の形態で説明したシミュレーション制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
【０１５４】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５５】
（付記１）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトを解釈して、前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
【０１５６】
（付記２）前記決定手段は、
前記各スクリプトの復帰時刻のうち、前記実行制御手段による前記シミュレーション装置に対する制御の実行後の現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定することを特徴とする付記１に記載のシミュレーション制御プログラム。
【０１５７】
（付記３）前記実行手段は、
スレッドが起動した場合、当該スレッドに対応するスクリプトを解釈して、前記シミュレーション装置に対する制御を実行し、
前記実行制御手段は、
前記実行手段を制御して、前記実行対象スクリプトのスレッドのみを起動して、前記実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行することを特徴とする付記１または２に記載のシミュレーション制御プログラム。
【０１５８】
（付記４）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
【０１５９】
（付記５）前記決定手段は、
前記各スクリプトの復帰時刻のうち、前記実行制御手段による前記シミュレーション装置に対する制御の実行後の現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記実行後の現在時刻に直近するスクリプトまたは命令列を実行対象に決定することを特徴とする付記４に記載のシミュレーション制御プログラム。
【０１６０】
（付記６）前記実行手段は、
スレッドが起動した場合、当該スレッドに応じた前記シミュレーション装置に対する制御を実行し、
前記実行制御手段は、
前記実行手段を制御して、前記実行対象のスレッドのみを起動して、前記実行対象に応じた前記シミュレーション装置に対する制御を実行することを特徴とする付記１または２に記載のシミュレーション制御プログラム。
【０１６１】
（付記７）前記シミュレーション装置は、エミュレーション装置であることを特徴とする付記１〜６のいずれか一つに記載のシミュレーション制御プログラム。
【０１６２】
（付記８）前記シミュレーション装置は、ＨＤＬシミュレータであり、前記スクリプトはＨＤＬ言語で記述されていることを特徴とする付記１〜６のいずれか一つに記載のシミュレーション制御プログラム。
【０１６３】
（付記９）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段と、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
【０１６４】
（付記１０）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段と、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
【０１６５】
（付記１１）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する複数のスクリプトを受け付ける受付工程と、
前記各スクリプトの実行サイクル数に基づいて、前記受付工程によって受け付けられた各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定工程と、
前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
【０１６６】
（付記１２）検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付工程と、
前記受付工程によって受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定工程と、
前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
【図面の簡単な説明】
【０１６７】
【図１】エミュレーションシステムの構成例を示す説明図である。
【図２−１】スクリプト記述の記述例（その１）を示す説明図である。
【図２−２】スクリプト記述の記述例（その２）を示す説明図である。
【図２−３】第１のスクリプトと第２のスクリプトをマージして作成されたスクリプト記述の記述例を示す説明図である。
【図２−４】ベーススクリプトの記述例を示す説明図である。
【図２−５】拡張部分のスクリプト記述（拡張スクリプト）の記述例を示す説明図である。
【図３】第１のスクリプトを制御用コンピュータに与えた場合の制御シーケンスを示す制御シーケンス図である。
【図４】本実施の形態にかかるエミュレーションシステムの構成例を示す説明図である。
【図５】実施の形態にかかる制御装置のハードウェア構成を示すブロック図である。
【図６】エミュレーションシステムの機能的構成を示すブロック図である。
【図７】制御シリアライズ化処理部の実装を示すブロック図である。
【図８】復帰時刻テーブルを示す説明図である。
【図９】ｂｒａｎｃｈ＿ｃａｌｌ関数の内部処理手順を示すフローチャートである。
【図１０】起動順序テーブルを示す説明図である。
【図１１】管理用スレッドに渡す関数による処理手順を示すフローチャートである。
【図１２】図１１に示したスレッド間同期処理（ステップＳ１１０１）の詳細な処理手順を示すフローチャートである。
【図１３】図１１に示したスレッド間調停処理（ステップＳ１１０２）の詳細な処理手順を示すフローチャートである。
【図１４】初回更新後の復帰時刻テーブルを示す説明図である。
【図１５】２回目更新後の復帰時刻テーブルを示す説明図である。
【図１６】サブスレッドに渡す関数による処理手順を示すフローチャートである。
【図１７】スレッドＩＤ−起動順序対応テーブルを示す説明図である。
【図１８】拡張命令の設定の記述例を示す説明図である。
【図１９】通常コマンドの拡張記述例を示す説明図である。
【図２０】共有変数領域の記述例を示す説明図である。
【図２１】コールバック関数ｐｒｏｃ＿ｓｅｔの処理手順を示すフローチャートである。
【図２２】ｐｒｏｃ＿ｒｕｎの処理手順を示すフローチャートである。
【図２３】エミュレーションシステムの制御シーケンスを示すシーケンス図である。
【図２４】制御シリアライズ化処理部の詳細な制御シーケンスを示すシーケンス図である。
【図２５】管理用スレッド（Ｍａｉｎ  ｔｈｒｅａｄ）内の管理機構の制御シーケンス（前半）を示すシーケンス図である。
【図２６】管理用スレッド（Ｍａｉｎ  ｔｈｒｅａｄ）内の管理機構の制御シーケンス（後半）を示すシーケンス図である。
【図２７】サブスレッド（Ｓｕｂ  ｔｈｒｅａｄ）の制御シーケンス（前半）を示すシーケンス図である。
【図２８】サブスレッド（Ｓｕｂ  ｔｈｒｅａｄ）の制御シーケンス（後半）を示すシーケンス図である。
【図２９】起動時の実行ログを示す説明図である。
【図３０】例外関係の処理が追加された管理用スレッドの関数（図１３を参照）の後半部分を示すフローチャートである。
【図３１】例外のためのイベント設定に関する記述例を示す説明図である。
【図３２】例外発生条件テーブルを示す説明図である。
【図３３】例外設定用コマンドの追加記述例を示す説明図である。
【図３４】例外設定用コールバック関数の記述例を示す説明図である。
【図３５】例外関係の処理が追加された管理用スレッドの関数（図１３を参照）の前半部分を示すフローチャートである。
【図３６】ソフトウェアデバッガとインストラクション・セット・シミュレータとの接続例を示す説明図である。
【図３７】ソフトウェアデバッガと接続する場合の制御シリアライズ化処理部の実装を示すブロック図である。
【図３８】インストラクション・セット・シミュレータの動作処理手順を示すフローチャートである。
【図３９】デバッガカテゴリ−信号対応テーブルを示す説明図である。
【図４０】テストベンチと被検証回路の接続例を示す説明図である。
【図４１】図４０におけるステップ実行処理手順を示すフローチャートである。
【図４２】本実施の形態にかかる制御装置の機能的構成を示すブロック図である。
【符号の説明】
【０１６８】
１０２  エミュレーション装置
２０１  第１のスクリプト
２０２  第２のスクリプト
３０１  回路データ
４００  エミュレーションシステム
４０１  制御装置
６０１  制御シリアライズ化処理部
６０２  制御プログラム
７００  管理用スレッド
７０１  第１のサブスレッド
７０２  第２のサブスレッド
７１０  管理機構
７１１  第１のインタプリタ
７１２  第２のインタプリタ
８００  復帰時刻テーブル
３６０１  ソフトウェアデバッガ
３７００  通信部
４２０１  受付部
４２０２  実行部
４２０３  算出部
４２０４  決定部
４２０５  実行制御部
【図１】
2010049630.tif 000003
【図２−１】
2010049630.tif 000004
【図２−２】
2010049630.tif 000005
【図２−３】
2010049630.tif 000006
【図２−４】
2010049630.tif 000007
【図２−５】
2010049630.tif 000008
【図３】
2010049630.tif 000009
【図４】
2010049630.tif 000010
【図５】
2010049630.tif 000011
【図６】
2010049630.tif 000012
【図７】
2010049630.tif 000013
【図８】
2010049630.tif 000014
【図９】
2010049630.tif 000015
【図１０】
2010049630.tif 000016
【図１１】
2010049630.tif 000017
【図１２】
2010049630.tif 000018
【図１３】
2010049630.tif 000019
【図１４】
2010049630.tif 000020
【図１５】
2010049630.tif 000021
【図１６】
2010049630.tif 000022
【図１７】
2010049630.tif 000023
【図１８】
2010049630.tif 000024
【図１９】
2010049630.tif 000025
【図２０】
2010049630.tif 000026
【図２１】
2010049630.tif 000027
【図２２】
2010049630.tif 000028
【図２３】
2010049630.tif 000029
【図２４】
2010049630.tif 000030
【図２５】
2010049630.tif 000031
【図２６】
2010049630.tif 000032
【図２７】
2010049630.tif 000033
【図２８】
2010049630.tif 000034
【図２９】
2010049630.tif 000035
【図３０】
2010049630.tif 000036
【図３１】
2010049630.tif 000037
【図３２】
2010049630.tif 000038
【図３３】
2010049630.tif 000039
【図３４】
2010049630.tif 000040
【図３５】
2010049630.tif 000041
【図３６】
2010049630.tif 000042
【図３７】
2010049630.tif 000043
【図３８】
2010049630.tif 000044
【図３９】
2010049630.tif 000045
【図４０】
2010049630.tif 000046
【図４１】
2010049630.tif 000047
【図４２】
2010049630.tif 000048