JP2010049630A - シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法 - Google Patents

シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法 Download PDF

Info

Publication number
JP2010049630A
JP2010049630A JP2008215388A JP2008215388A JP2010049630A JP 2010049630 A JP2010049630 A JP 2010049630A JP 2008215388 A JP2008215388 A JP 2008215388A JP 2008215388 A JP2008215388 A JP 2008215388A JP 2010049630 A JP2010049630 A JP 2010049630A
Authority
JP
Japan
Prior art keywords
script
simulation
execution
control
time
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2008215388A
Other languages
English (en)
Other versions
JP5374965B2 (ja
Inventor
Takayuki Sasaki
貴行 佐々木
Junichi Niitsuma
潤一 新妻
Hiroaki Fujimoto
博昭 藤本
Takashi Fujita
隆司 藤田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2008215388A priority Critical patent/JP5374965B2/ja
Publication of JP2010049630A publication Critical patent/JP2010049630A/ja
Application granted granted Critical
Publication of JP5374965B2 publication Critical patent/JP5374965B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

【課題】設計者の負担軽減と設計作業の短縮化とを実現すること。
【解決手段】制御シリアライズ化処理部601では、branch_callコマンドがコールされた時点で、管理用スレッド(メインスレッド)700を生成する。この管理用スレッド700に管理機構710を置く。管理機構710は、第1のサブスレッド701と第2のサブスレッド702を起動し、制御プログラム602へ実行命令を出す。また、制御プログラム602からの復帰命令により復帰する。管理機構710は第1のスクリプト201および第2のスクリプト202に制御を返すべき時刻をあらわす復帰時刻テーブルを持っている。
【選択図】図7

Description

この発明は、LSI(Large Scale Integration)のシミュレーションを制御するシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法に関する。
近年、LSIの設計において、LSIを高速にシミュレーションする専用ハードウェアを使って検証する手法がとられる。このような専用ハードウェアをエミュレーション装置という。
図1は、エミュレーションシステムの構成例を示す説明図である。図1に示したように、エミュレーションシステム100では、制御用コンピュータ101とエミュレーション装置102が通信ケーブル103で接続され、制御用コンピュータ101の指示に従って、エミュレーション装置102は、設計者が指定したシミュレーションを実行する。通例、設計者はエミュレーション装置102にさせたい操作を記述したスクリプト記述を作成する。
図2−1は、スクリプト記述の記述例を示す説明図である。図2−1に示したスクリプト記述(以下、「第1のスクリプト」)201は、「回路データをダウンロードし、400サイクル分のエミュレーションを実行、その後波形データの取得を行う操作を100回行い、エミュレーションを終了する」ことが記述されたスクリプト記述である。
図3は、第1のスクリプト201を制御用コンピュータ101に与えた場合の制御シーケンスを示す制御シーケンス図である。制御用コンピュータ101は、第1のスクリプト201および検証対象回路の回路データ301を読み込み、制御プログラムによる制御を実行する。図3の制御シーケンスの場合、エミュレーション装置102では、エミュレーション装置102内の時刻が400サイクルずつ進む。
このように、制御用コンピュータ101内の制御プログラム上の時刻とエミュレーション時刻は同期をとって制御が進む。ここで、エミュレーション装置102を制御したい第2の制御シーケンスがあったと仮定する。
図2−2は、スクリプト記述の記述例を示す説明図である。図2−2のスクリプト記述を第2のスクリプト202と称す。第2の制御シーケンスは、第2のスクリプト202を制御用コンピュータ101に与えた場合の制御シーケンスである。
制御プログラム上で実行できるスクリプトはエミュレーション装置102の逐次的な制御を書き下したものである。第2のスクリプト202による第2の制御シーケンスを第1のスクリプト201による第1の制御シーケンスと同時に実行したくても、この2つの制御シーケンスを実行することはできない。
図2−3は、第1のスクリプト201と第2のスクリプト202をマージして作成されたスクリプト記述の記述例を示す説明図である。従来は、第1のスクリプト201と第2のスクリプト202を一つにまとめた単一のスクリプト記述203を設計者が作成していた。このスクリプト記述203を与えることで、第1および第2の制御シーケンスを実行することとなる。
また、テストスクリプトを解釈してエミュレータに実行させることで、エミュレータ内のプログラムをテストする技術が開示されている(たとえば、下記特許文献1を参照。)。
特開2007−317085号公報
しかしながら、図2−3に示したスクリプト記述203のように、複数のスクリプト記述をマージする場合、エミュレーション装置102からの割り込みを受け取る場合や信号値によって制御を変更する場合などの複雑な制御シーケンスになると工数がかかり、設計者の負担が増大するという問題がある。
また、第1のスクリプト201と第2のスクリプト202のマージを自動化する場合、一方のスクリプトが設計者とインタラクティブにやりとりをする場合には予めマージすることができないという問題がある。
このような例としてソフトウェアデバッガをつなぐ場合がある。エミュレーション装置102上の回路内には、デバッグ対象のソフトウェアを実行しているCPU(Central Processing Unit)がある。ソフトウェアデバッガは、エミュレーション装置102に対して、CPUのプログラムカウンタが特定の値になった時、制御を返してもらう等のインタラクティブな実行をする必要がある。
ソフトウェアデバッガと制御プログラム間でエミュレーション装置102の制御コマンドをやりとりすることになり、実行時にスクリプト相当のものを作成していることになり、スクリプトの一例とみなすことができる。このようにインタラクティブな対応を求められる場合、予めマージするという手法は有効ではない。
また、第1のスクリプト201と第2のスクリプト202を並列に動作させるスレッド等の手法を用いることが考えられる。スレッドプログラミングは共通の資源をそれぞれが破綻することなく共有するしくみである。通例共有資源の排他制御はプログラムに設計者が明示的に書くことで行われる。従って、第1のスクリプト201と第2のスクリプト202に対して排他制御等の記述を書かねばならない。
もし、単純に共有資源に対する排他制御を書かずに並列実行してしまうと、第1のスクリプト201で「run 400」が発行された後、スレッドが切り替わり、第2のスクリプト202で「run 300」が発行され、その後スレッドが切り替わり、第1のスクリプト201に制御が戻ったとする。この場合、すでに700サイクル経過しており、第1のスクリプト201が期待する時刻とエミュレーション装置102の時刻がずれてしまう。したがって、なんらかの排他制御を書かなくてはいけなくなり、設計者の負担が増加するという問題がある。
この発明は、上述した従来技術による問題点を解消するため、設計者の負担軽減と設計作業の短縮化とを実現することができるシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、第1のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法は、検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、前記検証対象回路に関する複数のスクリプトを受け付け、前記各スクリプトの実行サイクル数に基づいて、受け付けられた各スクリプトの復帰時刻を算出し、算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定し、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、決定された実行対象スクリプトを解釈して、前記シミュレーション装置に対する制御を実行することを要件とする。
第1のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、複数のスクリプトを与えることにより、シミュレーション実行時にスクリプトを自動的にマージすることができる。
また、第2のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法は、検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付け、受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出し、算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定し、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、決定された実行対象に応じた前記シミュレーション装置に対する制御を実行することを要件とする。
第2のシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、スクリプトのシナリオを変更することなく、ソフトウェアデバッガによる対話的制御を追加することができる。
このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法によれば、設計者の負担軽減と設計作業の短縮化とを実現することができるという効果を奏する。
以下に添付図面を参照して、このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法の好適な実施の形態を詳細に説明する。このシミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法では、複数のスクリプトに排他制御等を明示的に書くことなく、並列実行できる制御機構を提供する。これにより、設計者の負担軽減と設計作業の短縮化とを実現することができる。
(エミュレーションシステムの構成)
図4は、本実施の形態にかかるエミュレーションシステムの構成例を示す説明図である。図4に示したように、エミュレーションシステム400では、制御装置401とエミュレーション装置102が通信ケーブル103で接続され、制御装置401の指示に従って、エミュレーション装置102は、設計者が指定したシミュレーションを実行する。また、制御装置401には、上述した第1のスクリプト201と第2のスクリプト202が制御装置401に与えられる。また、制御装置401には、設計対象回路の回路データ301が記憶されている。
(制御装置401のハードウェア構成)
図5は、実施の形態にかかる制御装置401のハードウェア構成を示すブロック図である。図5において、制御装置401は、CPU(Central Processing Unit)501と、ROM(Read‐Only Memory)502と、RAM(Random Access Memory)503と、磁気ディスクドライブ504と、磁気ディスク505と、光ディスクドライブ506と、光ディスク507と、ディスプレイ508と、I/F(Interface)509と、キーボード510と、マウス511と、スキャナ512と、プリンタ513と、を備えている。また、各構成部はバス500によってそれぞれ接続されている。
ここで、CPU501は、制御装置401の全体の制御を司る。ROM502は、ブートプログラムなどのプログラムを記憶している。RAM503は、CPU501のワークエリアとして使用される。磁気ディスクドライブ504は、CPU501の制御にしたがって磁気ディスク505に対するデータのリード/ライトを制御する。磁気ディスク505は、磁気ディスクドライブ504の制御で書き込まれたデータを記憶する。
光ディスクドライブ506は、CPU501の制御にしたがって光ディスク507に対するデータのリード/ライトを制御する。光ディスク507は、光ディスクドライブ506の制御で書き込まれたデータを記憶したり、光ディスク507に記憶されたデータを制御装置401に読み取らせたりする。
ディスプレイ508は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ508は、たとえば、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェイス(以下、「I/F」と略する。)509は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク514に接続され、このネットワーク514を介して他の装置に接続される。そして、I/F509は、ネットワーク514と内部のインターフェイスを司り、外部装置からのデータの入出力を制御する。I/F509には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード510は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス511は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ512は、画像を光学的に読み取り、制御装置401内に画像データを取り込む。なお、スキャナ512には、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ513は、画像データや文書データを印刷する。プリンタ513には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
(エミュレーションシステム400の機能的構成)
つぎに、エミュレーションシステム400の機能的構成について説明する。CAD(Computer Aided Design)系のツールではTCL(Tool Command Language)が用いられる。ここではTCLを例に説明をするが、制御装置401内の制御プログラムがTCLスクリプトによる制御命令の受信以外のものであってもよい。
たとえば、API(Application Programable Interface)がC言語の関数の形態で公開されている場合には、第1のスクリプト201、第2のスクリプト202は各々C言語のコードになる。また、スクリプトの逐次解釈が必要なくなるため、インタプリタを介さずに直接APIがコールされることになる。いずれの方法であっても必要な制御命令データを制御プログラムに渡す点で同じである。以下、TCLスクリプトを利用した例を使って説明する。
図6は、エミュレーションシステム400の機能的構成を示すブロック図である。図6では、2個のスクリプト記述(第1のスクリプト201および第2のスクリプト202)を並列実行する場合の例である。第1のスクリプト201および第2のスクリプト202は並列実行させたいスクリプトである。ベーススクリプト204は、制御プログラム602に渡すスクリプトである。
図2−4は、ベーススクリプト204の記述例を示す説明図である。通例、スクリプト言語では独自のコマンドを拡張する方法が用意されている。TCLにも拡張する方法が用意されている。
図2−5は、拡張部分のスクリプト記述(拡張スクリプト)の記述例を示す説明図である。拡張部分を実現する記述(以下、「拡張記述」)205はコンパイルされ、ベーススクリプト204のloadコマンドで呼ばれているライブラリに含まれており、TCLインタプリタではload命令で渡されたライブラリを動的リンクするとともに、ライブラリ名_Init()関数をコールする仕様になっている。したがってベーススクリプト204のload命令解釈時に拡張記述205がコールされ、制御プログラム602内のポインタがBranchproc_Init()に渡される。また、Tcl_から始まるC言語関数はTCLインタプリタが公開しているAPIである。TCL言語では、これらの関数を使って機能拡張が行える仕様になっている。
また、拡張記述205の「Tcl_CreateCommand(interp, “branch_call”, branch_call_proc, NULL, NULL);」により、制御プログラム602内のTCLインタプリタに「branch_call_proc」というコマンドを受け取ったら、「branch_call_proc」という関数を呼ぶように教える。
その後、ベーススクリプト204で「branch_call my0.tcl my1.tcl」がコールされ、関数「branch_call_proc」に引数“my0.tcl”,“my1.tcl”が渡される。この機構を使って、制御シリアライズ化処理部601の実装をコールする。
図7は、制御シリアライズ化処理部601の実装を示すブロック図である。branch_callコマンドがコールされた時点で、管理用スレッド(メインスレッド)700を生成する。この管理用スレッド700に管理機構710を置く。管理機構710は、第1のサブスレッド701と第2のサブスレッド702を起動し、制御プログラム602へ実行命令を出す。また、制御プログラム602からの復帰命令により復帰する。管理機構710は第1のスクリプト201および第2のスクリプト202に制御を返すべき時刻をあらわす復帰時刻テーブル800を持っている。
図8は、復帰時刻テーブル800を示す説明図である。図8の復帰時刻テーブル800は、初期状態を示している。図7において、第1のサブスレッド701および第2のサブスレッド702は、管理機構710からの起動命令により起動する。第1のインタプリタ711は、第1のスクリプト201を解釈して実行する。第2のインタプリタ712は、第2のスクリプト202を解釈して実行する。第1のインタプリタ711および第2のインタプリタ712は、実行命令、例外に関する命令以外の命令(ただしTCL言語がもっているset以外の命令を含まない)を制御プログラム602に与える。
例外に関する命令では管理機構710に渡すデータを共有変数領域に書き、実際に例外に関する設定をするのは管理用スレッドで行われる。詳細は後述する。また、制御プログラム602上のインタプリタには、独自に拡張されているものとして、エミュレーション制御に必要な特別な変数がある。このような変数は制御プログラム602上のインタプリタ、各サブスレッド上のインタプリタ711、712で共有しなければならない。この方法についても詳細は後述する。変数を参照・書き込みするset命令以外のTCL言語がもっている命令(例えばif,while等)については、サブスレッド上のインタプリタ711,712で処理し、制御プログラム602には送らない。
(branch_call関数の内部処理手順)
図9は、branch_call関数の内部処理手順を示すフローチャートである。図9において、branch_procに引数でスクリプトが入力される(ステップS901)。ここでは、第1のスクリプト201のスクリプトファイルmy0.tclと、第2のスクリプト202のスクリプトファイルmy1.tclが入力される。
スクリプトが入力されると、入力されたスクリプトごとにwakeup用とsleep用のスレッドのイベント(pthread_cond_t)を用意する(ステップS902)。つぎに、各スクリプト名と起動順序の対応を示す起動順序テーブルを作成する(ステップS903)。
図10は、起動順序テーブル1000を示す説明図である。ここでは「branch_proc」に与えた引数の順序で起動する例を説明する。つぎに、図8に示した復帰時刻テーブル800を作成する(ステップS904)。そして、起動するスクリプト数を記憶する(ステップS905)。ここでは、第1のスクリプト201のスクリプトファイルmy0.tclと、第2のスクリプト202のスクリプトファイルmy1.tclが入力されているので、起動するスクリプト数は「2」である。
そして、管理用スレッド700を生成する(ステップS906)。すなわち、管理機構710用の関数をスレッド化する。ここでは、このスレッド化された関数を「TimeManager::main (void* a_ptr)」とする。
つぎに、起動するスクリプト数を管理用スレッド700の中で参照し、スクリプト数分のスレッドを生成する(ステップS907)。このスレッドは図7におけるサブスレッド711、712に相当し、以降、サブスレッドまたはスクリプト用のスレッドと呼ぶ。ここではサブスレッドで実現する機能を記述した関数を「interp_thread(void* a_file)」とする。そして、終了したスレッドをjoinする(ステップS908)。すべてjoinできたらスクリプトに対して正常終了を返し、branch_call命令を終了する。
したがって、ベーススクリプト204の場合、puts “join”が実行され、このスクリプトの終端に到達する。制御プログラム602はこれをもってエミュレーション装置102をクローズし、エミュレーションを終了する。次に、各スレッドに渡す関数について説明する。
(管理用スレッド700に渡す関数による処理手順)
図11は、管理用スレッド700に渡す関数による処理手順を示すフローチャートである。図11において、管理用スレッド700に渡す関数は、スレッド間同期処理(ステップS1101)とスレッド間調停処理(ステップS1102)を実行する。スレッド間同期処理(ステップS1101)は、スレッド間の同期をとり、スクリプト用のスレッドがすべて立ち上がるまで待つ。スレッド間調停処理(ステップS1102)は、実際にスレッド間の調停をおこなう処理であり、スクリプト用のスレッドの実行を制御する。スレッド間調停処理(ステップS1102)は、具体的に各スレッドが発行する要求をシリアライズする。
図12は、図11に示したスレッド間同期処理(ステップS1101)の詳細な処理手順を示すフローチャートである。図12において、まず、共有変数領域をロックし(ステップS1201)、ロックされた共有変数領域内の起動済みのスレッド数を計数する(ステップS1202)計数された起動済みスレッド数=スクリプト数であるか否かを判断する(ステップS1203)。
起動済みスレッド数=スクリプト数でない場合(ステップS1203:No)、共有変数領域のアンロックと同時に、スクリプト用のスレッドが起動するたびに発行されるサブスレッドの起動イベントを待ち(ステップS1204)、ステップS1201に戻る。一方、起動済みスレッド数=スクリプト数である場合(ステップS1203:Yes)、すべてのスレッドが立ち上がったので、ステップS1102に移行する。
図13は、図11に示したスレッド間調停処理(ステップS1102)の詳細な処理手順を示すフローチャートである。図13において、まず、起動順序が若い順番に、スクリプトの復帰時刻と現在時刻とを比較する(ステップS1301)。つぎに、復帰時刻と現在時刻とが一致するか否かを判断する(ステップS1302)。一致しない場合(ステップS1302:No)、ステップS1305に移行する。一方、一致する場合(ステップS1302:Yes)、起動順序に対応したwakeup信号を送る(ステップS1303)。そして、起動順序に対応したsleep信号(送出したwakeup信号に対応したsleep信号)を待つと同時に、共有変数領域をアンロックする(ステップS1304)。対応したsleep信号を受け取ると待ち状態を脱して、ステップS1305に移行する。
pthreadの場合、ステップS1303では、pthread_cond_signal(m_wakeup[index])をコールする。ここで、pthread_cond_signalは信号を送るpthreadの関数であり、indexは起動順序を表しており、m_wakeup[index]は起動順序がindex番目のスクリプトを処理するスレッドを起動するイベントである。
例えばindex=0であれば第1のスクリプト(711)を処理するスレッド(701)が起動し、index=1でれば第2のスクリプト(712)を処理するスレッド(702)が起動する。ステップS1304では、pthread_cond_wait(m_sleep[index], &(m_mutex))をコールする。
ここで、m_sleep[index]は、起動順序に対応したイベントであり、m_mutexは共有変数領域の排他制御を行うmutexであり、pthread_cond_waitは信号を待つ状態に入ると同時に、共有変数領域をアンロックする(mutexを開放する)関数である。従って、上記の記述は、m_sleep[index]のイベントを受け取ると待ち状態を脱する。このようにして、管理スレッドはスレッドの起動を管理することができている。
ステップS1305では、すべてのスクリプトの復帰時刻について評価したか否かを判断する(ステップS1305)。評価していない場合(ステップS1305:No)、ステップS1301に戻り、未評価のスクリプトの復帰時刻と現在時刻とを比較する。一方、すべて評価済みである場合(ステップS1305:Yes)、起動済みスレッド数>0であるか否かを判断する(ステップS1306)。すなわち、実行中のスレッドが残っているか否かを判断する。
起動済みスレッド数>0である場合(ステップS1306:Yes)、各サブスレッドが復帰時刻テーブル800に書き込んだ復帰時刻をサーチして、直近の時刻を探す(ステップS1307)。そして、直近の時刻−現在時刻を算出し、この時間差分エミュレーションを実行する(ステップS1308)。そして、現在のエミュレーションの時刻を参照して記憶し(ステップS1309)、ステップS1301に戻る。一方、ステップS1306において、起動済みスレッド数>0でない場合(ステップS1306:No)、実行中のスレッドが残っていないため、スレッド間調停処理(ステップS1102)を終了する。
このスレッド間調停処理(ステップS1102)は、割り込みがなかった場合の処理である。エミュレーション装置102における割り込みとは、たとえば、プログラムカウンタがスレッド間同期処理(ステップS1101)の時に割り込みをあげる設定をして、この条件が満たされた時、エミュレーション装置102が制御プログラム602に制御を返す処理をさす。このような割り込みについては後述する。
スレッド間同期処理(ステップS1101)では、図13に示したように、起動順序にしたがって、図8に示した復帰時刻テーブル800と現在時刻を起動順序に従って参照し、一致しているスレッドに対して、wakeup信号を送る。さらに、このスレッドに対応したsleep信号を待つと同時に、共有変数領域をアンロックする。この手続をサブスレッド分繰り返す。この処理が終わったら、復帰時刻テーブル800を参照する。復帰時刻テーブル800はサブスレッドによって更新されている。
図14は、初回更新後の復帰時刻テーブル800を示す説明図である。たとえば、第1のスクリプト201および第2のスクリプト202を実行した場合、復帰時刻テーブル800は、図14のようになる(フリーrunの場合には最大値(たとえば、long longで表現できる最大の正数)が入っている。)。
もっとも最近の時刻は300サイクルである。そこで、300サイクル分、エミュレーションを進めるため、制御プログラム602のインタプリタに対して、"run 300"を送る。この関数はエミュレーションの処理が終了するまでブロックされる。300サイクルのエミュレーションが終了するか、割り込みが発生するまでは復帰しない。この例では割り込みを設定していないので、300サイクルたって復帰する。
復帰後、エミュレーションの時刻を調べる。ここではエミュレーション装置102から時刻300が帰ってくる。これを現在時刻として記憶する。そして、先頭に戻る。現在時刻は300なので、第2のスクリプト202に対して、wakeupイベントを発行する。
図15は、2回目更新後の復帰時刻テーブル800を示す説明図である。ステップS1307に到達した時には、図15に示したようになる。現在時刻は300サイクルなので、直近の時刻400サイクルまでの時間は100サイクル進めればよいことがわかる。したがって、“run 100”を制御プログラム602のインタプリタに送ることとなる。
(サブスレッドに渡す関数による処理手順)
図16は、サブスレッドに渡す関数による処理手順を示すフローチャートである。図16において、まず、共有変数領域をロックする(ステップS1601)。つぎに、図10の起動順序テーブル1000を参照して、スクリプトの起動順序を引く(ステップS1602)。そして、スレッドのスレッドIDを引く(ステップS1603)。具体的には、スレッドごとにスレッドカーネルがスレッドIDを振る。「pthread」の場合、「pthread_self()」を用いるとスレッドIDを参照できる。そして、スレッドIDと起動番号の対応関係を示すスレッドID−起動順序対応テーブルを作成する(ステップS1604)。
図17は、スレッドID−起動順序対応テーブルを示す説明図である。スレッドID−起動順序対応テーブル1700は、図10の起動順序テーブル1000を基にして作成することができる。つぎに、スレッドは、自分が立ち上がったので起動スレッド数を1加算する(ステップS1605)。そして、サブスレッドのスレッド起動イベントを発行し、更に自スレッドの起動番号に対応したwakeupイベントを待つと同時に共有変数領域をアンロックする(ステップS1606)。
このwakeupイベントを受け取ってwakeup待ち状態を脱した(ステップS1606を抜けた)サブスレッドのみが実行可能になり、起動中のスレッドに対応するスクリプトのインタプリタを生成する(ステップS1607)。そして、拡張命令をインタプリタに登録する(ステップS1608)。
図18は、拡張命令の設定の記述例を示す説明図である。この関数に現在生成したインタプリタのポインタを渡す。さらに、この関数内でエミュレーション用のコマンドとsetのコマンドを設定する。図18の記述はrun,set,getWaveを設定した例を示している。run,set,例外(割り込み)にかかわらないコマンドは即座に制御プログラム602に渡して処理をさせ、結果をうけとる。
図19は、通常コマンドの拡張記述例を示す説明図である。図19のように制御プログラム602内のインタプリタのポインタ(g_tm.get_parent()はこれを取り出す関数)を参照して、このインタプリタにもらった文字列をすべて渡す。このようにすることで、スクリプトの実行を即座に制御プログラム602に渡し、エミュレーション装置102の応答を制御プログラム602よりもらう。もらった応答を呼び出し側のインタプリタ、スクリプト用のスレッド上のインタプリタに返す。run/set、例外(割り込み)関係については後述する。
つぎに、スレッド−インタプリタ間の共有変数とインタプリタを関係付ける(ステップS1609)。具体的には、サブスレッド上のインタプリタの共有変数領域を各スレッドで共有させる。TCLの場合、Tcl_LinkVarを使って共有する。
図20は、共有変数領域の記述例を示す説明図である。たとえば、図20のような記述をおこない、グローバル変数で宣言しておく。ステップS1609では、スレッド上のインタプリタのポインタをg_share_varに渡す。これにより共有変数として、link,aaaMsgLenが登録できたことになる。
また、図16に戻って、ステップS1609のあと、サブスレッドは、内部のインタプリタ(TCLインタプリタ)に自分のスクリプトファイル名を渡して、解析を開始する(ステップS1610)。そして、解析が終了すると、起動済みスレッド数を1減算して(ステップS1611)、スレッドを終了する(ステップS1612)。
(setのコールバック関数proc_setの処理手順)
変数はsetコマンドと関係がある。つぎに、setのコールバック関数であるproc_setを説明する。
図21は、コールバック関数proc_setの処理手順を示すフローチャートである。図21において、引数の個数を判断する(ステップS2101)。TCLでは「set var」のようにコマンドを含めた引数が2個の場合リード処理になる。「set var 1000」のように3個の場合にはライト処理になる。
2個の場合(ステップS2101:2個)、リード処理となり、呼び出し側のインタプリタから第1引数で指定された変数の値を取り出す(ステップS2102)。そして、取り出した値をインタプリタの戻り値設定領域に書き込む(ステップS2103)。具体的には、リード時は、単に呼び出し側のインタプリタに対して、値をセットする「API Tcl_GetVar」を使って結果値を取り出し、この結果値を呼び出し側のインタプリタの結果値の格納領域に書き込む。
一方、3個の場合(ステップS2101:3個)、ライト処理となり、呼び出し側のインタプリタに第1引数で示された変数に、第2引数で示された値をセットする(ステップS2104)。そして、第1引数で示された変数が制御プログラム602の予約された変数か否かを判断する(ステップS2105)。予約された変数である場合(ステップS2105:Yes)、制御プログラム602上のインタプリタに第1引数で示された変数に、第2引数で示された値をセットして(ステップS2106)、終了する。予約された変数でない場合(ステップS2105:No)、ステップS2106を実行せずに終了する。
上述した「set var 1000」のように3個の場合にはライト処理になるので、変数varに1000を書き込む。具体的には、3個の場合、まず、呼び出し側のインタプリタに対して、「Tcl_SetVar」を使って値を書き込む。さらに変数名が制御プログラム602の予約された変数であった場合には、制御プログラム602上のインタプリタに対して、「Tcl_SetVar」を使って値を書き込む。このようにすることで、制御プログラム602上の予約された変数について、制御プログラム602上とサブスレッド上の任意のインタプリタ上で同期がとれる。
さらに、スレッド上のインタプリタ間の共通領域になっているため、setをつかわない値参照$varのように変数名の前に$をつけた形式の参照でも制御プログラム602上の変数と同期がとれた値を参照できるようになる。
もし、ベーススクリプト204で予約された変数に値をセットする可能性がある場合には、管理用スレッド700に渡す関数のスレッド間同期処理(ステップS1101)とスレッド間調停処理(ステップS1102)の間のタイミングなどで、予約された変数に関して、制御プログラム602に対してリードを試みて、リードに成功したものについては共通領域に書き込む。書き込みはすでに起動しているインタプリタのいずれかに対して「Tcl_SetVar」をすることで実現できる。このようにすることで、各インタプリタが同じ変数を参照しなければならない課題を解決し、変数の同期を実現することができる。
(proc_runの処理手順)
図22は、proc_runの処理手順を示すフローチャートである。まず、runコマンドの引数の実行時間(runで渡された時間)と現在時刻をたし合わせた時刻を復帰時刻テーブル800に書き込む(ステップS2201)。フリーrunの場合には、最大値(たとえばlong longの表現で記述する最大の正数(現実的には到達できない数値なので無限と同様の機能を果たす))を書き込む。
つぎに、現在実行中のインタプリタのsleepイベントを実行する(ステップS2202)。sleepイベントが配列につめられていてインデックスが起動順序になっている場合、現在実行中のスレッドのスレッドIDを調べて(pthreadの場合pthread_self())、このスレッド値と図17のスレッドID−起動順序対応テーブル1700を用いてスクリプト名を引き、さらにスクリプト名から起動順序を得ることができる。したがって、現在実行中のインタプリタに対応した起動順序を得ることができる。
つぎに、このスレッドに対応したwakeupイベントを待つと同時に共有変数領域をアンロックする(ステップS2203)。wakeupイベントが配列につめられていて、起動順序でインデクシングされている場合には、先と同様の方法で実行中のスレッドのスレッドIDから起動順序をもとめる。そして、所望のwakeupイベントを見つけ出して、wait状態に入る。該当sleepイベントを待っているのはこのスレッドに対してwakeupイベントを発行した管理用スレッド700だけなので、制御が管理用スレッド700にうつることになる。
このように、runコマンドの発行時点で復帰時刻テーブル800を更新して、制御を管理用スレッド700に返して、スレッド間調停処理(ステップS1102)で説明した処理を実行する。これにより、どのスクリプトも破綻しないようなエミュレーション時刻の進め方が決定でき、その分だけエミュレーションを実行することができる。
(エミュレーションシステム400の制御シーケンス)
図23は、エミュレーションシステム400の制御シーケンスを示すシーケンス図である。この制御シーケンスは、第1のスクリプト201、第2のスクリプト202、およびベーススクリプト204を適用した場合の制御シーケンスである。また、図23では、制御シリアライズ化処理部601が直接エミュレーション装置102を呼ぶように記述しているが、実際は制御プログラム602を介してエミュレーション装置102と通信する。なお、簡単のため、図23のシーケンス図ではエミュレーションサイクル600サイクル〜すべてのスクリプトが最終行に到達するまでのシーケンスを省略している。
なお、図23のシーケンス図中では、スクリプト中で示したコマンドgetWaveはsigTrace(−upload)と表記されている。スクリプト中で示したコマンドgetMemoryはMemory(−Read,...)と表記されている。図24〜図28についても同様である。
制御シリアライズ化処理部601が、制御プログラム602に命令を送り、これを制御プログラム602がエミュレーション装置102に送り、エミュレーション装置102の応答を制御プログラム602が受理し、これを制御シリアライズ化処理部601に渡している。なお、すべてのスクリプトが最終行まで到達すると、制御をベーススクリプト204に返す。以下、制御シリアライズ化処理部601の詳細な制御シーケンスを、図24〜図28に示す。
図24は、制御シリアライズ化処理部601の詳細な制御シーケンスを示すシーケンス図である。制御シリアライズ化処理部601は、基本部2401とタイムマネージャー2402とTCLコールバック関数2403を含む構成である。また、図24中、「Main thread」が管理用スレッド700に相当する。「Sub thread 1」が第1のサブスレッド701に相当し、「my0.tcl」が割り当てられる。また、「Sub thread 2」が第2のサブスレッド702に相当し、「my1.tcl」が割り当てられる。
タイムマネージャー2402は、管理用スレッド700に渡す関数をクラス関数としてもち、初期状態の復帰時刻テーブル800(図8)、初期状態の起動順序テーブル1000(図10)、スレッドID−起動順序対応テーブル1700、wakeup/sleepイベント、現在時刻等のオブジェクトを集約したものである。「TimeManager::main」はスレッド化され、図中の「main thread」として動作する。
また、タイムマネージャー2402は、初期状態の起動順序テーブル1000(図10)とスレッドID−起動順序対応テーブル1700を作成する。スクリプトの評価順序(つまりスレッドを起動する(wakeupする)順序)はユーザが決定できる(たとえば、本実施例では「branch_call」に渡す引数の順序で決定できている。)。通例、スレッドの場合、スレッドの生成順序はカーネルが決定するため、スレッドの起動順序がスレッドの生成順序に依存する場合、起動順序が入れ替わることがある。
図29は、起動時の実行ログを示す説明図である。たとえば、図29に示したように、「my0.tcl」,「my1.tcl」,「my2.tcl」,「my3.tcl」の順にサブスレッドの生成(pthread_create)を実行したにもかかわらず、「my3.tcl」に対応したスレッドが「my2.tcl」に対応したスレッドよりも先に起動されることがある。複数のスクリプトをマージした結果の制御シーケンスが非決定的な動作をすることは望ましくない。したがって、初期状態の起動順序テーブル1000(図10)とスレッドID−起動順序対応テーブル1700から起動順序を参照して、決定的な制御シーケンスを生成する。
図24に戻って、符号2411の制御シーケンスは、図9に示したbranch_call関数を呼ぶ処理である。また、符号2412の制御シーケンスは、図9に示したbranch_call関数の処理内容のうちステップS901〜ステップS907に相当する処理である。符号2413の制御シーケンスは、図11に示したスレッド間同期処理(ステップS1101)の処理内容に相当する処理である。符号2414の制御シーケンスは、図16に示したスクリプト用スレッドに渡す関数のステップS1601〜S1606に相当する処理である。
図25は、管理用スレッド700(Main thread)内の管理機構710の制御シーケンス(前半)を示すシーケンス図である。図25中、「TCLインタプリタ1」は第1のインタプリタ711に相当し、「TCLインタプリタ2」は第2のインタプリタ712に相当する(以下の図において同様。)。
また、符号2501の制御シーケンスは、図13のステップS1301,S1302に相当する処理である。符号2502の制御シーケンスは、図13のステップS1303,S1304に相当する処理である。符号2503の制御シーケンスは、図13のステップS1307〜S1309に相当する処理である。符号2504の制御シーケンスは、S1301、S1302に相当する処理である。符号2505の制御シーケンスは、図13のステップS1303〜S1304に相当する処理である。符号2506はステップ1304に入るタイミングを示す。符号2507はステップ1304から抜けるタイミングを示す。
図26は、管理用スレッド700(Main thread)内の管理機構710の制御シーケンス(後半)を示すシーケンス図である。符号2601の制御シーケンスは、図13のステップS1307〜S1309に相当する処理である。符号2602の制御シーケンスは、図13のステップS1301〜S1304に相当する処理である。
図27は、サブスレッド(Sub thread)の制御シーケンス(前半)を示すシーケンス図である。符号2701の制御シーケンスは、図16のステップS1607〜S1609に相当する処理を行い、ステップS1610の処理に入る。ステップS1610はスクリプトの解釈、すなわちスクリプトの最終行を解釈するまで継続される。図27の符号2701以降および図28はいずれもステップS1610の処理である。符号2702の制御シーケンスは、proc_run、すなわち、図22に示した処理手順に相当する処理である。符号2703の制御シーケンスは、proc_runから戻る処理を示している。
符号2704の制御シーケンスは、図19に示した通常コマンドの拡張記述により実現する処理である。この処理は、エミュレーション装置102の実行を伴わないコマンドであるため、即時実行される。符号2705の制御シーケンスは、インタプリタ(ここでは、TCLインタプリタ2)がrunコマンドの処理の終了を検出して、次のコマンド処理に入ることを示している。
図28は、サブスレッド(Sub thread)の制御シーケンス(後半)を示すシーケンス図である。符号2801の制御シーケンスは、proc_runから戻る処理を示している。符号2802の制御シーケンスは、図19に示した通常コマンドの拡張記述により実現する処理である。この処理は、エミュレーション装置102の実行を伴わないコマンドであるため、即時実行される。
符号2803の制御シーケンスは、インタプリタ(ここでは、TCLインタプリタ1)がrunコマンドの処理の終了を検出して、次のコマンド処理に入ることを示している。符号2804の制御シーケンスは、proc_run、すなわち、図22に示した処理手順に相当する処理である。
(例外系の処理内容)
以上説明した内容が正常系の処理内容である。つぎに例外(割り込み)系の処理内容を説明する。検証では、ある信号の値が特定の値になったら停止するように設定する。この場合、実行時であっても処理を中断し、スクリプト側に制御を返す。このような例外処理はシステムによって若干の相違があるかもしれないが、本質的には同等の処理を行うはずである。
図30は、例外関係の処理が追加された管理用スレッドの関数(図13を参照)の後半部分を示す一般的なフローチャートである。なお、エミュレーションシステム400は例外の発生条件を設定するコマンドを持っているものとする。たとえば、例外のためのイベント設定のような設定形態であったとする。従って、管理用スレッドで一元的に例外を設定する場合、図13のフロー後半部分を図30のように変更することにより実現できる。なお、図30において、図13と同一ステップには同一符号を付しその説明を省略する。
図31は、例外のためのイベント設定に関する記述例を示す説明図である。図31のような記述が設定された場合、「inst_a.sig_a」の値が1になった時、制御を制御プログラム602側に返す意味であるとする。例外の発生条件を設定する場合、具体的には、例外条件を記録する例外発生条件テーブルを追加する。
図32は、例外発生条件テーブルを示す説明図である。この例外発生条件テーブル3200では、スクリプト0(第1のスクリプト201)が2つの例外条件「inst_a.sig_a==1’b1」,「inst_a.sig_b==2’b01」で待っており、スクリプト1(第2のスクリプト202)が1つの例外条件「inst_a.sig_c==10000」を待っていることを示す。
図33は、例外設定用コマンドの追加記述例を示す説明図である。また、図34は、例外設定用コールバック関数の記述例を示す説明図である。正常系と同様、コマンドとコールバックの指定を図33に示した例外設定用コマンドの追加記述のように追加し、図34に示したように、条件対象信号と信号値を、例外発生条件テーブル3200に書き込む。本例では、例外発生条件テーブル3200が図34のg_tmオブジェクト(前記タイムマネージャクラスのインスタンス)の中に置かれており、条件対象信号と信号値を渡している。
この関数はサブスレッドの中でコールされる。したがって、Pthreadの場合、pthread_self()でスレッドIDを参照することができる。スレッドIDから、スレッドID−起動順序対応テーブル1700を参照することにより、現在実行中のスクリプト名が得られ、例外発生条件テーブル3200を作成することができる。
図30に戻って、例外の発生条件の設定がされた(ステップS3020)後、エミュレーションを実行する(ステップS1308)。制御が返ってきたら(ステップS1308を抜けたら)、設定した例外発生条件を解除する(ステップS3021)。ステップS1306〜S1306は図13と同じなので説明を省略する。
つぎに、例外発生時の処理は、図13の前半フローを拡張したフローで実現する。具体的には、管理用スレッド700の管理用スレッド関数(図13を参照)の前半部分(ステップS1301〜S1305)に、例外関係の処理が追加された処理となる。
図35は、例外関係の処理が追加された管理用スレッド700の関数(図13を参照)の前半部分を示すフローチャートである。図13と同一処理には同一ステップ番号を付し、その説明を省略する。図35において、まず、起動順序が若い順に、例外発生条件の信号値を参照して、例外条件に該当するスクリプト名の一覧を得る(ステップS3501)。通例、エミュレーションシステム400では信号値を参照できる。
そして、例外が発生していたか否かを判断する(ステップS3502)。たとえば、「inst_a.sig_a」等、例外発生条件テーブル3200中にある信号の値を参照し、その値が例外発生条件テーブル3200中の信号値に合致すればそのスクリプトは例外を受理したとみなす。その後、例外が発生していない場合(ステップS3502:No)、ステップS1301〜S1305を実行する。
一方、例外が発生した場合(ステップS3502:Yes)、ステップS1303に移行する。このようにすることで現在発生している例外処理を待っているスクリプト、時間を終えて正常終了するスクリプトが起動され、該当しないスクリプトは実行されない。以上のように、例外処理を含む場合であっても、並列化可能である。
(ソフトウェアデバッガとの接続)
上述した実施の形態では、複数のスクリプト(第1のスクリプト201と第2のスクリプト202)をシリアライズ化する例について説明したが、いずれか一つのスクリプトを、ソフトウェアデバッガに代えることとしてもよい。
ソフトウェアデバッガとソフトウェアの振る舞いをシミュレーションするソフトウェアとの接続方法にはTCP/IPでつなぐ方法、ソフトウェアの振る舞いをするソフトウェアをダイナミックリンクライブラリとして作成しておき、ソフトウェアデバッガと動的にリンクする方法などがあるが、いずれも本質的には同じである。ここではTCP/IPを例に説明する。
図36は、ソフトウェアデバッガとインストラクション・セット・シミュレータとの接続例を示す説明図である。図37は、ソフトウェアデバッガ3601と接続する場合の制御シリアライズ化処理部601の実装を示すブロック図である。なお、図7と同一構成には同一符号を付し、その説明を省略する。図36では、第2のスクリプト202に代えて、ソフトウェアデバッガ3601を接続している。制御プログラム602との通信のため、サブスレッド702には、通信部3700が生成される。
最初にインストラクション・セット・シミュレータ3602をサーバーとして起動し、その後、ソフトウェアデバッガ3601をクライアントとして起動し、サーバーに接続する。インストラクション・セット・シミュレータ3602は、サーバーとして動作する。
図38は、インストラクション・セット・シミュレータ3602の動作処理手順を示すフローチャートである。図38において、インストラクション・セット・シミュレータ3602は、初期化処理をおこない(ステップS3801)、TCP/IPソケットを生成する(ステップS3802)。そして、クライアント(ソフトウェアデバッガ3601)からのコネクション要求を待ち(ステップS3803)、コネクション要求があると、クライアントから送られてくる命令列を待つ(ステップS3804)。そして、命令列が送られてくると、命令列をパーズし(ステップS3805)、終了命令か否かを判断する(ステップS3806)。
終了命令でない場合(ステップS3806:No)、命令列が、変数の参照・書き込み、例外の設定か否かを判断する(ステップS3807)。命令列が、変数の参照・書き込み、例外の設定である場合(ステップS3807:Yes)、変数の参照・書き込み、例外の設定をおこなう(ステップS3808)。そして、その実行結果をクライアント(ソフトウェアデバッガ3601)に送信し(ステップS3810)、ステップS3804に戻る。
一方、ステップS3807において、命令列が、変数の参照・書き込み、例外の設定でない場合(ステップS3807:No)、命令列となる実行命令を実行する(ステップS3809)。そして、その実行結果をクライアント(ソフトウェアデバッガ3601)に送信し(ステップS3810)、ステップS3804に戻る。
すなわち、インストラクションセット中の変数への参照であれば、その値を返す。また、ブレークポイントを設定する命令であれば、ブレークポイントに相当するアドレス値をインストラクション・セット・シミュレーションに設定する。実行命令で実行サイクル数が指定されていればその命令数分実行する。また、ステップS3806において、終了命令である場合(ステップS3806:Yes)、一連の処理を終了する。
ソフトウェアデバッガ3601は、外部のシミュレータに命令を送るためのコマンドを持っている。たとえば、「bus」というコマンドがこのようなコマンドであるとする。この時、「bus break 10000」というコマンドをソフトウェアデバッガ3601に入力すると、「break 10000」をTCP/IPに送信する。これは本質的にはスクリプトで与えるコマンドを動作時に生成していることに他ならない。したがって、以下の実装を用意すれば接続が可能になる。
ソフトウェアデバッガ3601と接続する場合、図38に示したインストラクション・セット・シミュレータ3602の動作処理手順と同様のフローを図37の通信部3700で行う。本実施の形態では、接続対象がインストラクション・セット・シミュレータ3602の代わりにエミュレーションシステム400の制御プログラム602になる。第2のサブスレッド702ではソフトウェアデバッガ3601の要求を制御プログラム602のコマンドに翻訳する機能と戻り値を翻訳してソフトウェアデバッガ3601に返す機能を持つ。
図39は、デバッガカテゴリ−信号対応テーブルを示す説明図である。レジスタ・メモリ値の参照・書き込みについて、デバッガカテゴリ−信号対応テーブル3900を用意しておき、参照・書き込み相当の処理を制御プログラム602に発行する。たとえば、ソフトウェアデバッガ3601が「レジスタ0」の値を要求した場合には、デバッガカテゴリ−信号対応テーブル3900の信号位置で示された信号の値をエミュレーション装置102から読み出して、この値をソフトウェアデバッガ3601に返す。
つぎに、実行サイクル数でブレークする場合やステップ実行する場合について説明する。予め被検証回路にステップ数を数える回路を追加して、この回路をエミュレーション装置102に載せる。
図40は、テストベンチと被検証回路の接続例を示す説明図である。被検証回路4001は、CPU4002を有する。テストベンチ4011は、ステップカウンタ4012を有する。CPU4002とステップカウンタ4012は、CPU4002で実行命令をフェッチする信号線4003により接続されている。このような構成により、CPU4002のステップ数が数えられるようになる。
図41は、図40におけるステップ実行処理手順を示すフローチャートである。まず、該当のCPU4002の状態を計測するステップカウンタ4012の値を「0」にする(ステップS4101)。つぎに、該当のCPU4002がブレークするステップカウンタ4012がブレークするまでのサイクル値と等しくなる条件の例外を設定する(ステップS4102)。そして、実行コールバック関数にフリー実行を設定する(ステップS4103)。フリー実行では、例外が発生するまで停止しない。
すなわち、ステップカウンタ4012がステップ数と等しいときに例外を発生させる設定をエミュレーション装置102に設定し、エミュレーション装置102をフリー実行させる。ステップが所望の値になると、エミュレーション装置102から制御が返ってくる。そして、図35に示した例外処理を加えた管理用スレッド700の処理により、ソフトウェアデバッガ3601に制御が返ってくる。したがって、ステップを利用したエミュレーションが実現できる。
つぎに、ソースコードにブレークポイントを張った場合について説明する。この場合、ソフトウェアデバッガ3601にはブレークポイントの命令のアドレスが渡される。第2のサブスレッド702において、ブレークポイントで指定されたアドレスとデバッガカテゴリ−信号対応テーブル3900で示されたプログラムカウンタの信号値が受け取ったアドレス値とが一致したときに、例外を発生する例外を指定する。
これらはソフトウェアデバッガ3601の一部機能ではあるが、実行、ブレーク、変数・メモリの参照・書き込みの主要機能が実現できている。また、CPU4002が複数扱えるソフトウェアデバッガ3601においては、CPU4002のID番号と本体の関係を対応付けるような何らかの機構が必要である。
ID番号で管理し、ソフトウェアデバッガ3601はCPU4002のID番号を付して、ソフトウェアデバッガ3601の命令を送信する手続きであったとすると、デバッガカテゴリ−信号対応テーブル3900のCPU4002のID番号ごとに対応を用意しておき、引くことが可能になる。したがって、容易に拡張することが可能である。以上のように、ソフトウェアデバッガ3601のコマンドをエミュレーション装置102のコマンドに変換する機能を第2のサブスレッド702に持たせることにより、ソフトウェアデバッガ3601との接続が可能である。
(制御装置の機能的構成)
つぎに、これまで述べた内容を踏まえて、本実施の形態の機能的構成について説明する。図42は、本実施の形態にかかる制御装置の機能的構成を示すブロック図である。制御装置401は、受付部4201と、実行部4202と、算出部4203と、決定部4204と、実行制御部4205とを含む構成である。これらの機能(受付部4201〜実行制御部4205)は、ソフトウェア的には、図6に示した制御シリアライズ化処理部601およびCPU501による制御プログラム602の実行によりその機能を実現する。
また、ハードウェア的には、具体的には、たとえば、図5に示したROM502、RAM503、磁気ディスク505、光ディスク507などの記憶領域に記憶されたプログラムをCPU501に実行させることにより、または、I/F509により、その機能を実現する。
受付部4201は、検証対象回路に関する複数のスクリプトを受け付ける機能を有する。具体的には、たとえば、図23に示したように、「ライブラリをコールする()」が制御プログラム602によって実行された場合、第1のスクリプト201と第2のスクリプト202を読み込む。
また、ソフトウェアデバッガ3601により検証対象回路のバグを検出する場合には、スクリプトの受け付けのほか、ソフトウェアデバッガ3601からの接続(コネクション)要求とコマンド(命令列)を受け付ける(図38のステップS3802、S3803を参照)。
実行部4202は、受付部4201によって受け付けられた各スクリプトを解釈して、エミュレーション装置102に対する制御を実行する機能を有する。具体的には、たとえば、図7に示した第1のインタプリタ711により第1のスクリプト201を解釈して、制御プログラム602に対して、エミュレーション装置102を制御するコマンドを与える。
同様に、第1のインタプリタ712により第2のスクリプト202を解釈して、制御プログラム602に対して、エミュレーション装置102を制御するコマンドを与える。そして、実行終了した場合、図23に示したように、エミュレーション装置102から「正常終了()」のシーケンスを受け取る。
また、ソフトウェアデバッガ3601により検証対象回路のバグを検出する場合には、図37に示した第2のサブスレッド702内に生成した通信部3700により、ソフトウェアデバッガからのコマンド(命令列)を受信して、制御プログラム602を介して、当該受信したコマンドをエミュレーション装置102に与える。そして、実行終了した場合、エミュレーション装置102から実行結果を通信部3700が受け取る。通信部3700は、実行結果をソフトウェアデバッガ3601に送る。
算出部4203は、各スクリプトの実行サイクル数に基づいて、各スクリプトの復帰時刻を算出する機能を有する。実行サイクル数は、各スクリプトに記述されているサイクル数である。たとえば、第1のスクリプト201では、図2−1に示したように、「run 400」と記述されているため、第1のスクリプト201の実行サイクル数は、「400」である。同様に、第2のスクリプト202では、図2−2に示したように、「run 300」と記述されているため、第2のスクリプト202の実行サイクル数は、「300」である。
また、復帰時刻とは、スクリプトを解釈するインタプリタがあるサブスレッドが(sleep状態から)復帰して起動する時刻である。この復帰時刻もサイクル数で表現する。たとえば、第1のスクリプト201は400サイクルごとに実行されるため、その復帰時刻は、400、800、1200、1600、…と算出される。同様に、第2のスクリプト202は300サイクルごとに実行されるため、その復帰時刻は、300、600、900、1200、…と算出される。復帰時刻があらたに算出される都度、復帰時刻テーブルが更新される。
決定部4204は、算出部4203によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する機能を有する。直近する時刻とは、現在時刻よりも先の時刻で最も現在時刻との差が小さい時刻である。たとえば、開始時では、現在時刻は0サイクルであるため、第1のスクリプト201の復帰時刻である400サイクルと第2のスクリプト202の300サイクルとを比較する。現在時刻である0サイクルに直近するのは、第2のスクリプト202の300サイクルである。したがって、この場合は、第2のスクリプト202が実行対象スクリプトに決定される。
また、第2のスクリプト202が実行対象スクリプトに決定されると、現在時刻は300サイクルに進む。したがって、算出部4203では、第2のスクリプトの復帰時刻をあらたに算出する。具体的には、たとえば、現在時刻である300サイクルに第2のスクリプト202の実行サイクル数である300サイクルを加算する。この加算結果である600サイクルが、第2のスクリプト202のあらたな復帰時刻となる。
したがって、つぎの実行対象スクリプトを決定する場合、復帰時刻テーブルを参照し、第1のスクリプト201の復帰時刻である400サイクルと第2のスクリプト202のあらたな復帰時刻である600サイクルとを比較して、現在時刻である300サイクルに直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する。この場合は、第1のスクリプト201に決定される。
また、ソフトウェアデバッガ3601により検証対象回路のバグを検出する場合には、復帰時刻に接続要求の時刻(サイクル数)も含めて比較する。接続要求の時刻が直近の時刻となった場合は、そのときのソフトウェアデバッガ3601からの命令列を実行対象に決定する。
実行制御部4205は、実行部4202を制御する。具体的には、現在時刻に直近する復帰時刻まで現在時刻をすすめる。そして、決定部4204によって決定された実行対象スクリプトを実行部4202に解釈させて、シミュレーション装置に対する制御を実行部4202に実行させる。
実行部4202は、起動されているスレッド内のスクリプトを実行するが、実行制御部4205は、スクリプトの実行順序を遵守するため、実行対象スクリプトのスレッドのみを起動し、それ以外のスレッドをsleep状態にする。具体的には、図17に示したスレッドID−起動順序対応テーブル1700を参照し、そのスレッドのみを起動すればよい。これにより、スクリプトの実行順序がスレッドの起動順序により入れ替わることがなく、スクリプトの実行順序を遵守することができる。
また、ソフトウェアデバッガ3601により検証対象回路のバグを検出する場合には、接続要求の時刻が直近の時刻となったときは、そのときのソフトウェアデバッガ3601からの命令列を通信部3700が制御プログラム602を介してエミュレーション装置102に与える。
以上説明したように、上述した従来技術では、エミュレーション用の第1の制御シーケンスに第2の制御シーケンスを追加する場合、第1の制御シーケンスを実装した第1のスクリプト201を解析して、第2の制御シーケンスに相当する処理を第1の制御シーケンスに書き加える必要があり、工数がかかる、信頼性が低下するとういう問題があった。
しかし、本実施の形態によれば、第1の制御シーケンスを表す第1のスクリプト201の主処理を変更することなく、第2の制御シーケンスを実装した第2のスクリプト202を新たに作成した場合、第1のスクリプト201と第2のスクリプト202とをエミュレーション装置102の時刻に同期させながら、実行することができ、工数の短縮、信頼性の低下を回避することが可能である。
たとえば、上述した従来技術では、第1の制御シーケンスがターゲットデザインの信号へのフォース文や、信号値によりシーケンスを切り替えるような複雑なシナリオであった場合、第2の制御シーケンスとして、3000サイクルおきにメモリダンプをするという単純な処理を加える場合であっても、3000サイクルになるポイントにメモリダンプ文を注意深く挿入する必要があり容易ではなかった。
しかし、本実施の形態によれば、第2のスクリプト202として、単に3000サイクルおきにメモリをダンプする命令を呼ぶスクリプトを用意するだけでよく、簡単である。また、第1のスクリプト201も第2のスクリプト202も本質的にさせたい処理のみを記述した可読性のよいスクリプトになる。このため、メンテナンス容易となり、信頼性の低下が避けられる。
また、上述した従来技術では、第1のスクリプト201で実現される第1の制御シーケンスを実行しつつ、ソフトウェアデバッガ3601のように第2の制御シーケンスがユーザと対話的に生成される(動的に生成される)場合の制御はできなかった。
しかし、本実施の形態によれば、第1のスクリプト201のシナリオを変更することなく、ソフトウェアデバッガ3601による対話的制御を容易に加えることが可能になる。したがって、第1のスクリプト201のシナリオ通りに動作することが保証されたエミュレーション環境に対して、ソフトウェアデバッガ3601を解してデータを取り出すことができ、第1のスクリプト201下のエミュレーション環境の観測手段としてソフトウェアデバッガ3601が利用可能になる。これにより、第1のスクリプト201でされたシーケンスに、ソフトウェアデバッガ3601機能を容易に付加できるようになるのである。
また、従来では、スレッドの実行順序は非決定的に行われる。たとえば、1回目のエミュレーションでは第1のスクリプト201の次に第2のスクリプト202が実行されていたが、2回目のエミュレーションでは第2のスクリプト202が先に実行され第1のスクリプト201が実行されるかもしれない。これはデバッグに関して望ましくない。
しかし、本実施の形態によれば、スレッドの実行順序を決定的に決められるので、毎回のエミュレーションで制御順序が変わることはない。したがって、スクリプトの評価順序の変化による現象の変化を考慮することなく、検証対象のデバッグに集中できるようになる。
この他に、スクリプトの代わりにVerilog等のHDL(Hardware description language)言語中にスクリプト言語で指定するコマンド相当のシステムタスクをコールすることにより、エミュレータを制御する方法が考えられる。このような機構においては、Verilogの場合、C言語で作成したライブラリをPLI(programming language Interface)と呼ばれる方法で接続するのが一般的である。一方、Verilog言語は各々の手続き文(always文、initial文)は並列実行可能であり、スレッド相当を言語が持っている。したがって、本実施の形態を応用することが可能である。
これによれば、TCL等のスクリプトをインターフェイスにするシミュレーション制御方法だけではなく、Verilogシミュレータをインターフェイスにするシミュレーション制御方法にも応用することが可能になる。以上説明したように、本実施の形態によれば、設計者の負担軽減と設計作業の短縮化とを実現することができる。
なお、本実施の形態で説明したシミュレーション制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトを解釈して、前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
(付記2)前記決定手段は、
前記各スクリプトの復帰時刻のうち、前記実行制御手段による前記シミュレーション装置に対する制御の実行後の現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定することを特徴とする付記1に記載のシミュレーション制御プログラム。
(付記3)前記実行手段は、
スレッドが起動した場合、当該スレッドに対応するスクリプトを解釈して、前記シミュレーション装置に対する制御を実行し、
前記実行制御手段は、
前記実行手段を制御して、前記実行対象スクリプトのスレッドのみを起動して、前記実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行することを特徴とする付記1または2に記載のシミュレーション制御プログラム。
(付記4)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段、
として機能させることを特徴とするシミュレーション制御プログラム。
(付記5)前記決定手段は、
前記各スクリプトの復帰時刻のうち、前記実行制御手段による前記シミュレーション装置に対する制御の実行後の現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記実行後の現在時刻に直近するスクリプトまたは命令列を実行対象に決定することを特徴とする付記4に記載のシミュレーション制御プログラム。
(付記6)前記実行手段は、
スレッドが起動した場合、当該スレッドに応じた前記シミュレーション装置に対する制御を実行し、
前記実行制御手段は、
前記実行手段を制御して、前記実行対象のスレッドのみを起動して、前記実行対象に応じた前記シミュレーション装置に対する制御を実行することを特徴とする付記1または2に記載のシミュレーション制御プログラム。
(付記7)前記シミュレーション装置は、エミュレーション装置であることを特徴とする付記1〜6のいずれか一つに記載のシミュレーション制御プログラム。
(付記8)前記シミュレーション装置は、HDLシミュレータであり、前記スクリプトはHDL言語で記述されていることを特徴とする付記1〜6のいずれか一つに記載のシミュレーション制御プログラム。
(付記9)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する複数のスクリプトを受け付ける受付手段と、
前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
(付記10)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段と、
前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段と、
前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段と、
前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段と、
を備えることを特徴とするシミュレーション制御装置。
(付記11)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する複数のスクリプトを受け付ける受付工程と、
前記各スクリプトの実行サイクル数に基づいて、前記受付工程によって受け付けられた各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定工程と、
前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
(付記12)検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付工程と、
前記受付工程によって受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出工程と、
前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定工程と、
前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行工程と、
を実行することを特徴とするシミュレーション制御方法。
エミュレーションシステムの構成例を示す説明図である。 スクリプト記述の記述例(その1)を示す説明図である。 スクリプト記述の記述例(その2)を示す説明図である。 第1のスクリプトと第2のスクリプトをマージして作成されたスクリプト記述の記述例を示す説明図である。 ベーススクリプトの記述例を示す説明図である。 拡張部分のスクリプト記述(拡張スクリプト)の記述例を示す説明図である。 第1のスクリプトを制御用コンピュータに与えた場合の制御シーケンスを示す制御シーケンス図である。 本実施の形態にかかるエミュレーションシステムの構成例を示す説明図である。 実施の形態にかかる制御装置のハードウェア構成を示すブロック図である。 エミュレーションシステムの機能的構成を示すブロック図である。 制御シリアライズ化処理部の実装を示すブロック図である。 復帰時刻テーブルを示す説明図である。 branch_call関数の内部処理手順を示すフローチャートである。 起動順序テーブルを示す説明図である。 管理用スレッドに渡す関数による処理手順を示すフローチャートである。 図11に示したスレッド間同期処理(ステップS1101)の詳細な処理手順を示すフローチャートである。 図11に示したスレッド間調停処理(ステップS1102)の詳細な処理手順を示すフローチャートである。 初回更新後の復帰時刻テーブルを示す説明図である。 2回目更新後の復帰時刻テーブルを示す説明図である。 サブスレッドに渡す関数による処理手順を示すフローチャートである。 スレッドID−起動順序対応テーブルを示す説明図である。 拡張命令の設定の記述例を示す説明図である。 通常コマンドの拡張記述例を示す説明図である。 共有変数領域の記述例を示す説明図である。 コールバック関数proc_setの処理手順を示すフローチャートである。 proc_runの処理手順を示すフローチャートである。 エミュレーションシステムの制御シーケンスを示すシーケンス図である。 制御シリアライズ化処理部の詳細な制御シーケンスを示すシーケンス図である。 管理用スレッド(Main thread)内の管理機構の制御シーケンス(前半)を示すシーケンス図である。 管理用スレッド(Main thread)内の管理機構の制御シーケンス(後半)を示すシーケンス図である。 サブスレッド(Sub thread)の制御シーケンス(前半)を示すシーケンス図である。 サブスレッド(Sub thread)の制御シーケンス(後半)を示すシーケンス図である。 起動時の実行ログを示す説明図である。 例外関係の処理が追加された管理用スレッドの関数(図13を参照)の後半部分を示すフローチャートである。 例外のためのイベント設定に関する記述例を示す説明図である。 例外発生条件テーブルを示す説明図である。 例外設定用コマンドの追加記述例を示す説明図である。 例外設定用コールバック関数の記述例を示す説明図である。 例外関係の処理が追加された管理用スレッドの関数(図13を参照)の前半部分を示すフローチャートである。 ソフトウェアデバッガとインストラクション・セット・シミュレータとの接続例を示す説明図である。 ソフトウェアデバッガと接続する場合の制御シリアライズ化処理部の実装を示すブロック図である。 インストラクション・セット・シミュレータの動作処理手順を示すフローチャートである。 デバッガカテゴリ−信号対応テーブルを示す説明図である。 テストベンチと被検証回路の接続例を示す説明図である。 図40におけるステップ実行処理手順を示すフローチャートである。 本実施の形態にかかる制御装置の機能的構成を示すブロック図である。
符号の説明
102 エミュレーション装置
201 第1のスクリプト
202 第2のスクリプト
301 回路データ
400 エミュレーションシステム
401 制御装置
601 制御シリアライズ化処理部
602 制御プログラム
700 管理用スレッド
701 第1のサブスレッド
702 第2のサブスレッド
710 管理機構
711 第1のインタプリタ
712 第2のインタプリタ
800 復帰時刻テーブル
3601 ソフトウェアデバッガ
3700 通信部
4201 受付部
4202 実行部
4203 算出部
4204 決定部
4205 実行制御部

Claims (8)

  1. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
    前記検証対象回路に関する複数のスクリプトを受け付ける受付手段、
    前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段、
    前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
    前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段、
    前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段、
    として機能させることを特徴とするシミュレーション制御プログラム。
  2. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するコンピュータを、
    前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段、
    前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段、
    前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段、
    前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段、
    前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段、
    として機能させることを特徴とするシミュレーション制御プログラム。
  3. 前記シミュレーション装置は、エミュレーション装置であることを特徴とする請求項1または2に記載のシミュレーション制御プログラム。
  4. 前記シミュレーション装置は、HDLシミュレータであり、前記スクリプトはHDL言語で記述されていることを特徴とする請求項1または2に記載のシミュレーション制御プログラム。
  5. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
    前記検証対象回路に関する複数のスクリプトを受け付ける受付手段と、
    前記受付手段によって受け付けられた各スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行手段と、
    前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
    前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定手段と、
    前記実行手段を制御して、前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行制御手段と、
    を備えることを特徴とするシミュレーション制御装置。
  6. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置であって、
    前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付手段と、
    前記受付手段によって受け付けられたスクリプトを解釈し、また、前記接続要求に応じて前記ソフトウェアデバッガと前記シミュレーション装置とを接続して、前記シミュレーション装置に対する制御を実行する実行手段と、
    前記各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出手段と、
    前記算出手段によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定手段と、
    前記実行手段を制御して、前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定手段によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行制御手段と、
    を備えることを特徴とするシミュレーション制御装置。
  7. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
    前記検証対象回路に関する複数のスクリプトを受け付ける受付工程と、
    前記各スクリプトの実行サイクル数に基づいて、前記受付工程によって受け付けられた各スクリプトの復帰時刻を算出する算出工程と、
    前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプトを実行対象スクリプトに決定する決定工程と、
    前記現在時刻に直近する復帰時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象スクリプトに基づいて、前記シミュレーション装置に対する制御を実行する実行工程と、
    を実行することを特徴とするシミュレーション制御方法。
  8. 検証対象回路のシミュレーションを実行するシミュレーション装置を制御するシミュレーション制御装置が、
    前記検証対象回路に関する一または複数のスクリプトと前記検証対象回路のバグを検出するソフトウェアデバッガからの接続要求および命令列を受け付ける受付工程と、
    前記受付工程によって受け付けられた各スクリプトの実行サイクル数に基づいて、前記各スクリプトの復帰時刻を算出する算出工程と、
    前記算出工程によって算出された各スクリプトの復帰時刻のうち現在時刻に直近する復帰時刻に該当するスクリプト、または前記命令列の中から、前記現在時刻に直近するスクリプトまたは命令列を実行対象に決定する決定工程と、
    前記現在時刻に直近する復帰時刻または前記接続要求の時刻まで時刻を進めることにより、前記決定工程によって決定された実行対象に応じた前記シミュレーション装置に対する制御を実行する実行工程と、
    を実行することを特徴とするシミュレーション制御方法。
JP2008215388A 2008-08-25 2008-08-25 シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法 Expired - Fee Related JP5374965B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008215388A JP5374965B2 (ja) 2008-08-25 2008-08-25 シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008215388A JP5374965B2 (ja) 2008-08-25 2008-08-25 シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法

Publications (2)

Publication Number Publication Date
JP2010049630A true JP2010049630A (ja) 2010-03-04
JP5374965B2 JP5374965B2 (ja) 2013-12-25

Family

ID=42066637

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008215388A Expired - Fee Related JP5374965B2 (ja) 2008-08-25 2008-08-25 シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法

Country Status (1)

Country Link
JP (1) JP5374965B2 (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6490780B1 (ja) * 2017-11-06 2019-03-27 株式会社インテリジェンス・ワークス 情報部品実行装置、及び情報部品実行方法
JP2019533252A (ja) * 2016-10-25 2019-11-14 ザイリンクス インコーポレイテッドXilinx Incorporated デバッギングシステム及び方法
CN113360280A (zh) * 2021-06-02 2021-09-07 西安中锐创联科技有限公司 基于多线程运行、动态全局变量处理的仿真曲线显示方法

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03125233A (ja) * 1989-10-11 1991-05-28 Fuji Xerox Co Ltd 記録装置のシミュレータおよびそのシミュレーションエンジン
JPH06348776A (ja) * 1993-06-07 1994-12-22 Toshiba Corp 論理シミュレーション装置
JP2000163456A (ja) * 1998-11-25 2000-06-16 Hitachi Ltd 論理検証方法
JP2004030124A (ja) * 2002-06-25 2004-01-29 Fujitsu Ltd 半導体装置の開発支援連携装置及び開発支援方法
JP2005321848A (ja) * 2004-05-06 2005-11-17 Matsushita Electric Ind Co Ltd システムシミュレーション実行プログラムおよびハードウェア記述変換プログラム
JP2006127017A (ja) * 2004-10-27 2006-05-18 Canon Inc 論理検証手法
JP2008059192A (ja) * 2006-08-30 2008-03-13 Oki Electric Ind Co Ltd ハード・ソフト協調検証用シミュレータ
JP2008070962A (ja) * 2006-09-12 2008-03-27 Matsushita Electric Ind Co Ltd 論理回路検証装置
JP2009026113A (ja) * 2007-07-20 2009-02-05 Fujitsu Microelectronics Ltd シミュレーション装置及びプログラム
JP2010009113A (ja) * 2008-06-24 2010-01-14 Fujitsu Microelectronics Ltd シミュレーション装置およびプログラム

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH03125233A (ja) * 1989-10-11 1991-05-28 Fuji Xerox Co Ltd 記録装置のシミュレータおよびそのシミュレーションエンジン
JPH06348776A (ja) * 1993-06-07 1994-12-22 Toshiba Corp 論理シミュレーション装置
JP2000163456A (ja) * 1998-11-25 2000-06-16 Hitachi Ltd 論理検証方法
JP2004030124A (ja) * 2002-06-25 2004-01-29 Fujitsu Ltd 半導体装置の開発支援連携装置及び開発支援方法
JP2005321848A (ja) * 2004-05-06 2005-11-17 Matsushita Electric Ind Co Ltd システムシミュレーション実行プログラムおよびハードウェア記述変換プログラム
JP2006127017A (ja) * 2004-10-27 2006-05-18 Canon Inc 論理検証手法
JP2008059192A (ja) * 2006-08-30 2008-03-13 Oki Electric Ind Co Ltd ハード・ソフト協調検証用シミュレータ
JP2008070962A (ja) * 2006-09-12 2008-03-27 Matsushita Electric Ind Co Ltd 論理回路検証装置
JP2009026113A (ja) * 2007-07-20 2009-02-05 Fujitsu Microelectronics Ltd シミュレーション装置及びプログラム
JP2010009113A (ja) * 2008-06-24 2010-01-14 Fujitsu Microelectronics Ltd シミュレーション装置およびプログラム

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JPN6013018862; 湯山 紘史, 津邑 公暁, 中島 浩: 'タスク並列言語MegaScriptにおける高精度実行モデルの構築(プログラミングモデル・ツール)' 情報処理学会論文誌. コンピューティングシステム 第46巻/SIG_12(ACS_11)号, 20050815, 第181-193頁, 一般社団法人情報処理学会 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2019533252A (ja) * 2016-10-25 2019-11-14 ザイリンクス インコーポレイテッドXilinx Incorporated デバッギングシステム及び方法
JP7036814B2 (ja) 2016-10-25 2022-03-15 ザイリンクス インコーポレイテッド デバッギングシステム及び方法
JP6490780B1 (ja) * 2017-11-06 2019-03-27 株式会社インテリジェンス・ワークス 情報部品実行装置、及び情報部品実行方法
CN113360280A (zh) * 2021-06-02 2021-09-07 西安中锐创联科技有限公司 基于多线程运行、动态全局变量处理的仿真曲线显示方法
CN113360280B (zh) * 2021-06-02 2023-11-28 西安中锐创联科技有限公司 基于多线程运行、动态全局变量处理的仿真曲线显示方法

Also Published As

Publication number Publication date
JP5374965B2 (ja) 2013-12-25

Similar Documents

Publication Publication Date Title
US8656352B2 (en) System and method for synchronized workflow management
CN102667730B (zh) 设计时调试
US5961610A (en) Systems, methods and apparatus for generating and controlling display of medical images
US10977433B2 (en) System and method for input data validation and conversion
US6941546B2 (en) Method and apparatus for testing a software component using an abstraction matrix
US8201143B2 (en) Dynamic mating of a modified user interface with pre-modified user interface code library
US10437574B2 (en) System and method for providing code completion features for code modules
US8336032B2 (en) Implementing enhanced template debug
JP4201363B2 (ja) セル・オーバーラップ検出及び補正方法
Grechanik et al. Creating GUI testing tools using accessibility technologies
US20040078742A1 (en) Scheduling of transactions in system-level test program generation
JPH10222466A (ja) クライアント/サーバ型の医療用イメージング・システムで指令を実行する方法
EP2171589B1 (en) Transactional debugger for a transactional memory system
JP5374965B2 (ja) シミュレーション制御プログラム、シミュレーション制御装置、およびシミュレーション制御方法
Silva et al. Analysis of WIMP and post WIMP interactive systems based on formal specification
US10929160B1 (en) Composite-trace just-in-time compilation
US10969429B1 (en) System and method for debugging in concurrent fault simulation
US11256479B2 (en) Dynamic updates in an interactive programming environment
Rataj et al. A translator of Java programs to TADDs
Turner et al. Model-based testing of interactive systems using interaction sequences
Lima et al. Verifying deadlock and nondeterminism in activity diagrams
Kälin Advanced features for an integrated verification environment
US20030051072A1 (en) Application program interface for a computer program
Pipero Redesign and improvement of a test system configuration tool
Resmerita Fine-grained timed software in Simulink models

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110513

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120724

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120731

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20121001

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130423

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130624

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130827

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130909

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees