(57)【要約】【課題】ハードウェア設計のシミュレーションを向上させる。【解決手段】HDLで記述される設計をシミュレートする方法を提供する。この方法では、設計のモジュールを、シリアルシミュレーションエンジンによるシミュレーションのための第１のモジュールと、コンカレントシミュレーションエンジンによるシミュレーションのための第２のモジュールとに分割することができる。HDLの実行モデルと一致するイベントのクラスに基づくシミュレーションに関して、第１及び第２のモジュールに優先順位を付けることができる。イベントの各クラスに対してシリアル及びコンカレントの両シミュレーションエンジンの両シミュレーションを同期させることができる。同期は、更新されたインタフェース変数の値の転送を含むことができる。【選択図】図６Ａ
2013521583.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェア記述言語（HDL）で記述された設計をシミュレートする方法であって、
シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンを含む統合型論理シミュレータを動作させるステップと、
前記シリアルシミュレーションエンジンを用いて一度に１つずつのシミュレーションを行うステップと、
前記コンカレントシミュレーションエンジンを用いて複数の並行的なシミュレーションを行うステップと、
前記HDLの実行モデルによって定義されるイベントのクラスに基づいて、前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジンの両シミュレーションを同期させるステップとを含むことを特徴とする方法。
【請求項２】
前記設計を、前記統合型論理シミュレータによって実行される２つのモジュール群に分割するステップをさらに含み、
前記２つのモジュール群が、前記シリアルシミュレーションエンジンで評価するための第１のモジュール群と、前記コンカレントシミュレーションエンジンで評価するための第２のモジュール群とを含むことを特徴とする請求項１に記載の方法。
【請求項３】
前記分割するステップを、前記設計の設計階層を考慮して行うことを特徴とする請求項２に記載の方法。
【請求項４】
前記コンカレントシミュレーションエンジンが、第１のモジュールをシミュレートするときに、該第１のモジュールの下位の前記設計階層内においてより深くインスタンス化された任意のサブモジュールも同様にシミュレートすることを特徴とする請求項３に記載の方法。
【請求項５】
第１のシミュレーションエンジンによってシミュレートされる第１のモジュールが、第２のモジュールをインスタンス化するとき、該第２のモジュールを第２のシミュレーションエンジンによってシミュレートし、
前記第２のモジュールが、前記第１のシミュレーションエンジンによってシミュレートされる第３のモジュールをインスタンス化し、
前記第１及び第２のシミュレーションエンジンがそれぞれ、（１）前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジン、または（２）前記コンカレントシミュレーション及び前記シリアルシミュレーションエンジン、のいずれかであることを特徴とする請求項３に記載の方法。
【請求項６】
前記シリアルシミュレーションエンジンまたは前記コンカレントシミュレーションエンジンのうちの一方を前記統合型論理シミュレータの主シミュレーションエンジンに指定するステップと、
前記シリアルシミュレーションエンジンまたは前記コンカレントシミュレーションエンジンのうちの他方を前記統合型論理シミュレータの副シミュレーションエンジンに指定するステップとをさらに含み、
前記主シミュレーションエンジンが、同期点において前記副シミュレーションエンジンを呼び出すことを特徴とする請求項３に記載の方法。
【請求項７】
前記同期点が、前記HDLの前記実行モデルによって定義されたキュー評価の前にあることを特徴とする請求項６に記載の方法。
【請求項８】
前記同期点が、前記HDLの実行モデルによって定義されたキュー評価の後にあることを特徴とする請求項６に記載の方法。
【請求項９】
前記副シミュレーションエンジンモジュールにおける特定の変数を、前記主シミュレーションエンジンと通信するためのインタフェース変数として識別するステップをさらに含むことを特徴とする請求項６に記載の方法。
【請求項１０】
前記インタフェース変数の値を前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジンに格納するステップをさらに含むことを特徴とする請求項９に記載の方法。
【請求項１１】
前記同期点において前記副シミュレーションエンジンにおけるイベントを評価する前に、前記インタフェース変数の値を前記副シミュレーションエンジンに転送するステップをさらに含むことを特徴とする請求項９に記載の方法。
【請求項１２】
前記同期点において前記副シミュレーションエンジンにおけるイベントを評価した後に、前記インタフェース変数の値を前記主シミュレーションエンジンに転送するステップをさらに含むことを特徴とする請求項９に記載の方法。
【請求項１３】
副シミュレーションエンジンモジュールが、前記主シミュレーションエンジン内のスタブモジュールによって表現されることを特徴とする請求項１２に記載の方法。
【請求項１４】
ハードウェア記述言語（HDL）で記述された設計をシミュレートするための、コンピュータ実行可能命令を格納するコンピュータ可読媒体であって、前記命令が、コンピュータによって実行されたときに、
シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンを含む統合型論理シミュレータを実行するステップと、
前記シリアルシミュレーションエンジンを用いて一度に１つずつのシミュレーションを行うステップと、
前記コンカレントシミュレーションエンジンを用いて複数の並行的なシミュレーションを行うステップと、
前記HDLの実行モデルによって定義されるイベントのクラスに基づいて、前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジンの両シミュレーションを同期させるステップとを行うことを特徴とするコンピュータ可読媒体。
【請求項１５】
前記設計を、前記統合型論理シミュレータによって実行される２つのモジュール群に分割するステップをさらに含み、
前記２つのモジュール群が、前記シリアルシミュレーションエンジンで評価するための第１のモジュール群と、前記コンカレントシミュレーションエンジンの評価で評価するための第２のモジュール群とを含むようにしたことを特徴とする請求項１４に記載のコンピュータ可読媒体。
【請求項１６】
前記分割するステップを、前記設計の設計階層を考慮して行うようにしたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項１７】
前記コンカレントシミュレーションエンジンが、第１のモジュールをシミュレートするときに、該第１のモジュールの下位の前記設計階層内においてより深くインスタンス化された任意のサブモジュールも同様にシミュレートするようにしたことを特徴とする請求項１６に記載のコンピュータ可読媒体。
【請求項１８】
第１のシミュレーションエンジンによってシミュレートされる第１のモジュールが、第２のモジュールをインスタンス化するとき、該第２のモジュールを第２のシミュレーションエンジンによってシミュレートし、
前記第２のモジュールが、前記第１のシミュレーションエンジンによってシミュレートされる第３のモジュールをインスタンス化し、
前記第１及び第２のシミュレーションエンジンがそれぞれ、（１）前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジン、または（２）前記コンカレントシミュレーションエンジン及び前記シリアルシミュレーションエンジン、のいずれかであるようにしたことを特徴とする請求項１６に記載のコンピュータ可読媒体。
【請求項１９】
前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジンのうちの一方を前記統合型論理シミュレータの主シミュレーションエンジンに指定するステップと、
前記シリアルシミュレーションエンジン及び前記コンカレントシミュレーションエンジンのうちの他方を前記統合型論理シミュレータの副シミュレーションエンジンに指定するステップとをさらに含み、
前記主シミュレーションエンジンが、同期点において前記副シミュレーションエンジンを呼び出すようにしたことを特徴とする請求項１５に記載のコンピュータ可読媒体。
【請求項２０】
前記同期点が、前記HDLの前記実行モデルによって定義されたキュー評価の前にあるようにしたことを特徴とする請求項１９に記載のコンピュータ可読媒体。
【請求項２１】
前記同期点が、前記HDLの実行モデルによって定義されたキュー評価の後にあるようにしたことを特徴とする請求項１９に記載のコンピュータ可読媒体。
【請求項２２】
前記副シミュレーションエンジンモジュールにおける特定の変数を、前記主シミュレーションエンジンと通信するためのインタフェース変数として識別するステップをさらに含むようにしたことを特徴とする請求項１９に記載のコンピュータ可読媒体。
【請求項２３】
前記実行モデルにおける前記同期点が、業界標準のアプリケーションプログラミングインタフェースを通して確立されるようにしたことを特徴とする請求項１９に記載のコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願
【０００２】
本願は、２０１０年３月４日に出願された米国仮特許出願第６１／３３９，３９１号に基づく優先権を主張する。上記仮特許出願は、引用を以て本明細書の一部となす。
【０００３】
本発明は、論理シミュレーションに関し、より詳細には、シリアルシミュレーションエンジン及びコンカレント（同時並行的）シミュレーションエンジンを含む統合型論理シミュレータに関する。
【背景技術】
【０００４】
論理シミュレーションは、電子回路の設計フローにおいて不可欠なステップである。論理シミュレーションは通常、論理シミュレータと呼ばれる電子設計自動化（Electronic Design Automation：EDA）ソフトウェアツールを用いて行われる。論理シミュレータは、通常、ハードウェア記述言語（Hardware Description Language：HDL）コードの形式で提供されるハードウェア設計を処理する。ハードウェア設計から実際の電子回路を製作する物理的実装フェーズに移行する前に、ハードウェア設計者は、ハードウェア設計が仕様に合っていることを検証するために広範囲に及ぶ論理シミュレーションを行う。通常のハードウェア設計フローでは、仕様に合っていない回路が製作されるリスクを最小にするために、設計プロセスに加えて機能検証プロセスが実行される。論理シミュレーションは通常、その結果として、ユーザが観察したいと思っている一連の回路信号の波形を生成する。ユーザは、生成された波形を解析及び可視化することによって、ハードウェア設計が正しく機能することを検証することができる。論理シミュレータはまた、回路信号の値を用いて回路不良をもたらす状態を検出する埋め込みアサーションにより、ハードウェア設計のシミュレーションをサポートする。論理シミュレータは、回路をシミュレートしている間に埋め込みアサーションを評価し、アサーション違反をユーザに報告する。当該違反報告に基づいて、ユーザは、ハードウェア設計における設計ミスを発見して修復することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許出願第１２／５８６，７２４号明細書（US 2011/0072403 A1）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ハードウェア設計のシミュレーションを向上させる。
【課題を解決するための手段】
【０００７】
ハードウェア記述言語（HDL）で記述された設計をシミュレートする方法が提供される。この方法においては、統合型論理シミュレータを動作させることができる。この統合型論理シミュレータは、シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンを含むことができる。シリアルシミュレーションエンジンは、一度に１つずつのシミュレーションを行うことができるが、コンカレントシミュレーションエンジンは、複数の並行的なシミュレーションを行うことができる。コンピュータを用いて、HDLの実行モデルによって定義されるイベントのクラスに基づいて、シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンの両シミュレーションを同期させることができる。
【０００８】
設計は、統合型論理シミュレータによって実行される２つのモジュール群に分割されることができる。第１のモジュール群はシリアルシミュレーションエンジンで実行することができ、第２のモジュール群はコンカレントシミュレーションエンジンで実行することができる。一実施形態では、分割は、シリアルシミュレーションエンジン及び／またはコンカレントシミュレーションエンジンが所望のレベルのシミュレーション性能を達成する能力に基づいて行われる。別の実施形態では、分割は、ユーザが手動で行うことができる。
【０００９】
シリアルシミュレーションエンジンまたはコンカレントシミュレーションエンジンのいずれか一方を統合型論理シミュレータの主シミュレーションエンジンに指定することができ、その場合、他方のシミュレーションエンジンは副シミュレーションエンジンに指定される。一実施形態では、シリアルシミュレーションエンジンが主シミュレーションエンジンであり、コンカレントシミュレーションエンジンが副シミュレーションエンジンである。別の実施形態では、コンカレントシミュレーションエンジンが主シミュレーションエンジンであり、シリアルシミュレーションエンジンが副シミュレーションエンジンである。主シミュレーションエンジンは、同期点において副シミュレーションエンジンを呼び出す。一実施形態では、同期点は、HDLの実行モデルによって定義されたキュー（待ち行列）評価の前にある。別の実施形態では、同期点は、HDLの実行モデルによって定義されたキュー評価の後にある。
【００１０】
設計の分割は、設計の設計階層を考慮して行うことができることに留意されたい。例えば、一実施形態では、第１のモジュールが副シミュレーションエンジンによってシミュレートされることは、第１のモジュールの下の設計階層内においてより深くインスタンス化された全てのサブモジュールも同様に副シミュレーションエンジンによってシミュレートされることを示唆している。別の実施形態では、（副シミュレーションエンジンによってシミュレートされる）第１のモジュールが第２のモジュールをインスタンス化する場合に、第２のモジュールは、主シミュレーションエンジンによってシミュレートされることができる。
【００１１】
本発明の方法に従って、副シミュレーションエンジンモジュールにおける特定の変数を、主シミュレーションエンジンと通信するためのインタフェース変数として識別することができる。これらのインタフェース変数の値を、シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンの両者に格納することができる。
【００１２】
同期点において副シミュレーションエンジンにおけるイベントを評価する前に、インタフェース変数の値を副シミュレーションエンジンに転送することができる。この転送中、インタフェース変数の値は、主シミュレーションエンジンのストレージ表現（storage representation）から副シミュレーションエンジンのストレージ表現に翻訳されることができる。一実施形態では、変更されたインタフェース変数の値のみが同期点において転送される。
【００１３】
同期点において副シミュレーションエンジンにおけるイベントを評価した後に、インタフェース変数の値を主シミュレーションエンジンに転送することもできる。この転送中、インタフェース変数の値は、副シミュレーションエンジンのストレージ表現から主シミュレーションエンジンのストレージ表現に翻訳されることができる。一実施形態では、変更されたインタフェース変数の値のみが同期点において転送される。
【００１４】
実行モデルにおける同期点は、業界標準のアプリケーションプログラミングインタフェースを通して確立されることができることに留意されたい。例示的な業界標準のアプリケーションプログラミングインタフェースには、プログラミング言語インタフェース（Programming. Language Interface：PLI）及び検証手続インタフェース（Verification Procedural Interface：VPI）が含まれるが、これらに限定されるものではない。別の実施形態では、同期点は、独自仕様のインタフェースを通して確立されることができる。
【００１５】
特に、副シミュレーションエンジンモジュールは、主シミュレーションエンジン内のスタブモジュールによって表現されることができる。このスタブモジュールは、対応する副シミュレーションエンジンモジュールのためのインタフェース変数を含む。スタブモジュールは、対応する副シミュレーションエンジンモジュールのHDLを含まない。
【００１６】
HDLで記述される設計をシミュレートする別の方法が提供される。この方法では、設計のモジュールを、シリアルシミュレーションエンジンによるシミュレーションのための第１のモジュールと、コンカレントシミュレーションエンジンによるシミュレーションのための第２のモジュールとに分割することができる。HDLの実行モデルと一致するイベントのクラスに基づくシミュレーションに関して、第１及び第２のモジュールに優先順位を付けることができる。コンピュータを用いて、イベントの各クラスに対してシリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンのシミュレーションを同期させることができる。
【００１７】
同期は、更新されたインタフェース変数の値の転送を含むことができ、該値は、シリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間で、第２のモジュールと、第１のモジュールの少なくとも１つのサブセットとによって共有される。この転送は、更新されたインタフェース変数の値の表現の翻訳を含むことができる。
【００１８】
第２のモジュールは各々、シリアルシミュレーションエンジン内のスタブモジュールとして表現されることができ、ここで、該スタブモジュールは第１のモジュールのうちの１つである。コンカレントシミュレーションエンジンにおけるインタフェース変数のための値を或るワードに格納することができ、これらの値は、シリアルシミュレーションエンジン内の当該スタブモジュールの複数のインスタンスと関係がある。
【００１９】
同期は、シリアルシミュレーションエンジンにおけるイベントの１つのクラスの評価を終え、次に更新されたインタフェース変数の値をコンカレントシミュレーションエンジンに転送してイベントの当該同じクラスの評価を行うステップをさらに含むことができる。同期は、コンカレントシミュレーションエンジンにおけるイベントの１つのクラスの評価を終え、次に更新されたインタフェース変数の値をシリアルシミュレーションエンジンに転送して、（１）コンカレントシミュレーションエンジンによって当該クラスにおける新しいイベントが生成されたときのイベントの当該同じクラス、または（２）もしあればイベントの次のクラスの評価をHDLの実行モデルに従って行うステップをさらにまた含むことができる。
【００２０】
一実施形態では、HDLはVerilogであり、イベントの１つのクラスは、アクティブイベント、非アクティブイベント及びノンブロッキング代入更新イベントのうちの１つである。一実施形態では、同期は、HDLによって記述されるイベントのクラスの優先順位に基づいて、シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンを用いて、イベントの全てのクラスを通過するステップを含むことができる。
【図面の簡単な説明】
【００２１】
【図１】Verilog HDL実行モデルにおけるキュー評価のサブセットを示す。
【図２】モジュールのためのインタフェース変数の役割を果たす埋め込みモジュールのポート変数を示す。
【図３Ａ】従来のトップモジュールのための例示的なHDLを示す。
【図３Ｂ】スタブモジュールを含むトップモジュールのための例示的なHDLを示す。
【図４Ａ】従来のトップモジュールのブロック図を示す。
【図４Ｂ】スタブモジュールを含むトップモジュールのブロック図を示す。
【図５Ａ】シリアルシミュレーションエンジンにおけるインタフェース変数の値のための例示的なストレージ表現を示す。
【図５Ｂ】コンカレントシミュレーションエンジンにおけるインタフェース変数の値のための例示的なストレージ表現を示す。
【図６Ａ】アクティブイベントキュー評価のためのシリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間の翻訳及び同期のための例示的な動作を示す。
【図６Ｂ】Verilog HDL実行モデルによって指定されるキューの種類に基づく複数のイベントキュー評価のための、シリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間の翻訳及び同期のための例示的な動作を示す。
【図６Ｃ】VHDL実行モデルによって指定されるキューの種類に基づく複数のイベントキュー評価のための、シリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間の翻訳及び同期のための例示的な動作を示す。
【図７】シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンのためのデータストレージを示す。特に、コンカレントシミュレーションエンジンのためのワードストレージは、１つの実行された命令が、シリアルシミュレーションエンジンにおいて、複数の論理関数をシミュレートし、複数の論理インスタンスに対応する複数の出力を生成することを可能にする。
【図８】シリアル及びコンカレントシミュレーションエンジンによって実装されるような様々なモジュールのブロック図を示す。特に、シリアルシミュレーションエンジン内のモジュールには、コンカレントシミュレーションエンジンに責任を転送するスタブモジュールが含まれるが、コンカレントシミュレーションエンジン内のモジュールには、シリアルシミュレーションエンジンに責任を転送するスタブモジュールが含まれる。
【図９】統合型論理シミュレータを含む例示的なデジタルASIC設計フローの簡易化した表現を示す。
【発明を実施するための形態】
【００２２】
従来の論理シミュレータは、本明細書において「シリアルシミュレーションエンジン」と呼ばれる技法において、一度に１つのシミュレーションを実行する。適切な性能を達成するために、シリアルシミュレーションエンジンは各シミュレーションをできるだけ速く実行するように設計される。係属中の米国特許出願第１２／５８６，７２４号明細書（特許文献１）には、ハードウェア設計の同時並行的シミュレーションを効率的に行うための、本明細書において「コンカレントシミュレーションエンジン」と呼ばれる技法が記載されており、特許文献１は引用を以て本明細書の一部となす。コンカレントシミュレーションエンジンは、同時に幾つかのシミュレーションを実行することによって性能を達成する。
【００２３】
シリアル及びコンカレントシミュレーションエンジンの実装並びにシミュレートされているハードウェア設計の独自の特性に応じて、シリアルシミュレーションエンジンを用いてハードウェア設計の特定の部分を実行し、コンカレントシミュレーションエンジンを用いてハードウェア設計の特定の他の部分を実行することが望ましいであろう。コンカレントシミュレーションエンジン及びシリアルシミュレーションエンジンを１つの統合型論理シミュレータに統合するためのソフトウェアベースの技法について以下に説明する。この統合によりもたらされる論理シミュレータを、これ以降「統合型論理シミュレータ」と呼ぶ。
【００２４】
論理シミュレータは、ハードウェア記述言語（HDL）により定められるときに、特定の実行モデルを実装することに留意されたい。統合型論理シミュレータを記述するために、Verilog HDLを用いる。しかし、統合型論理シミュレータは、その他のHDL及び該HDLに関連する実行モデルに適用することができる。
【００２５】
Verilog HDLは、基本的な離散イベント実行モデルに従って解釈される。幾つかのイベントキューが定義され、そこからのイベントが実行される。イベントは、（１）シミュレーションが進むにつれて生成され、（２）特定のキューに配置され、（３）実行モデルにより定められるようなシミュレーション中の特定の時点でキューから取り出され、（４）実行される。イベントを実行すると、今度は、後で実行するためにキューに配置される追加イベントを生成することができる。イベントを含むこのシーケンスは、それ以上イベントが生成されなくなるまで継続し、イベントが生成されなくなった時点でシミュレーションは終了する。
【００２６】
通常、シミュレートされるハードウェア設計は、複数のモジュールとしてVerilog HDLで表される。多くの場合、Verilogモジュールと実際のハードウェアサブコンポーネントとの間に対応関係があるが、必ずしもそうばかりとは限らない（例えばVerilogモジュールは、単一のハードウェアサブコンポーネントによって実装されない抽象的な機能性またはビヘイビア（振る舞い）を表現し得る）。Verilogモジュールは、別のモジュールに「埋め込まれる」と言われているモジュールのインスタンスとともに階層に配置される。例えば、マイクロプロセッサ用モジュールは、種々の演算モジュール、論理モジュール、制御モジュール及び記憶モジュールに分解され得る。マイクロプロセッサモジュール内には、階層に構築された各構成モジュールの埋め込みインスタンスがある。
【００２７】
インスタンス化された各Verilogモジュールは、Verilog HDL実行モデルの仕様に従って、論理シミュレータによる実行のためにイベントを生成する。Verilog HDL論理シミュレータは、シリアルシミュレーションエンジンのみ、コンカレントシミュレーションエンジンのみ、またはシリアルシミュレーションエンジンとコンカレントシミュレーションエンジンの組合せ（後者は本明細書に記載の統合型論理シミュレータである）のいずれを用いて実装されようと、実行モデルに従うはずである。
【００２８】
例えば、図１は、Verilog HDL実行モデルによって記述されるキューのサブセットを示している。Verilog HDL実行モデルは、論理シミュレータの非アクティブイベントキューから任意の非アクティブイベント１０２が実行される前に、論理シミュレータのアクティブイベントキューから全てのアクティブイベント１０１が実行されることを必要とする。アクティブ及び非アクティブイベントキューが空になった時点で、NBA更新イベントキューからノンブロッキング代入（non-blocking assignment：NBA）更新イベント１０３が実行される。図１に示されているものの他にも、シミュレーションの進行とともに１つのキューから別のキューへ進むための確立した規則に従って、Verilog HDL実行モデル内に他のキューがあることに留意されたい。
【００２９】
シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンの両者を用いる統合型論理シミュレータにおいて、ハードウェア設計を記述するHDLプログラムを２つのモジュール群に分割することができる。１つのモジュール群はシリアルシミュレーションエンジンによって実行され、もう１つのモジュール群はコンカレントシミュレーションエンジンによって実行される。統合型論理シミュレータがVerilog HDL実行モデルに違反しない（例えばシリアルシミュレーションエンジンまたはコンカレントシミュレーションエンジンのいずれか一方において実行するためのアクティブイベント及び非アクティブイベントがまだある間はNBA更新イベントが実行されない）ように、統合型論理シミュレータにおける１つのキューから別のキューへの進行は、シリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間で調整されなければならない。
【００３０】
Verilogモジュールは、入力／出力ポート変数を介して互いに相互作用する。モジュール間相互参照として知られている機能（その仕組みは当業者に知られているので、ここでは説明しない）を介して、或るVerilogモジュールを他のモジュールインスタンス内の内部変数に直接読み書きすることもできる。これらの内部変数は、モジュール間相互作用において用いられ、或るモジュールのための「インタフェース変数」として特定されかつ参照される。
【００３１】
図２は、２つのモジュール、すなわち、加算器モジュール２０２と、加算器モジュール２０２をインスタンス化するトップレベルモジュール２０１とを備えた単純な従来の設計を示している。トップレベルモジュール２０１内の変数と埋め込み加算器モジュール２０２内の変数とが、加算器ポート変数を介して結び付けられる。これらのポート変数は、この設計におけるインタフェース変数である。図２に示されているように、トップモジュール２０１のためのインタフェース変数「clk」、「input1」及び「input2」は、加算器モジュール２０２のためのインタフェース変数「clk」、「a」及び「b」にマッピングする。それゆえ、例えば、変数input1が変化すると、変数「a」も変化する。同様に、加算器モジュール２０２のインタフェース変数「out」は、トップレベルモジュール２０１のためのインタフェース変数「sum」にマッピングする。
【００３２】
特に、シリアルシミュレーションエンジンにアサインされたモジュールがコンカレントシミュレーションエンジンにアサインされたモジュールとインターフェースをとるとき、シリアルシミュレーションエンジンモジュールは、コンカレントシミュレーションエンジンモジュールのためのプレースホルダとして機能するスタブモジュールと相互作用することができる。このスタブモジュールは、埋め込みモジュールの全てのインタフェース変数を含むことができる。再び図２に示されている設計を参照すると、トップレベルモジュールをシリアルシミュレーションエンジンにアサインすることができ、加算器モジュールをコンカレントシミュレーションエンジンにアサインすることができる。この場合、加算器モジュールＲＴＬを参照する代わりに、シリアルシミュレーションは、加算器のためのスタブモジュールを参照する。
【００３３】
図３Ａは、設計２００（図２）のための従来のHDL３００を示しており、図３Ｂは、統合型論理シミュレータによりシミュレートされるときのシリアルシミュレーションエンジンによって参照されるHDL３１０を示している。加算器モジュールのためのインタフェース変数はHDL３１０（スタブモジュールとも呼ばれる）に残るが、加算器モジュールの機能的側面（すなわち「always @ (posedge_clk)」及び「out = a + b」）はもはやシリアルシミュレーションエンジン内に存在しないことに留意されたい。特に、図４Ａ及び図４Ｂを参照して説明したように、加算器モジュールの機能的側面は、代わりにコンカレントシミュレーションエンジンにおいて定義される。
【００３４】
図４Ａ及び図４Ｂは、トップモジュール及び埋め込みモジュールの例示的な分割を示している。具体的には、図４Ａは、図２に示した設計の従来の論理シミュレータ図を示している。この場合、全てのモジュール（すなわち、トップモジュール２０１及び加算器モジュール２０２）がシリアルシミュレーションエンジン４０１によってシミュレートされる。対照的に、図４Ｂは、コンカレントシミュレーションエンジン４０２が埋め込み加算器モジュール２０２に対する責任を持たされているときの分割を示している。この場合、実際の加算器モジュールHDLはコンカレントシミュレーションエンジン４０２によってシミュレートされることができ、シリアルシミュレーションエンジン４０１は、埋め込み加算器モジュールのためのスタブモジュール２０２Ａと相互作用することができる。
【００３５】
図４Ｂに示されている構成では、シリアルシミュレーションエンジン４０１は、各インタフェース変数（１つが図示されている）にアサインされた自身のストレージ４０３を有することができる。スタブモジュール２０２Ａへの入力の役割を果たすインタフェース変数に値を書き込むことができ、スタブモジュール２０２Ａへの出力の役割を果たすインタフェース変数から値が読み出される。同様に、コンカレントシミュレーションエンジン４０２は、各インタフェース変数（１つが図示されている）にアサインされた自身のストレージ４０４を有することができる。コンカレントシミュレーションエンジンモジュール、すなわち、加算器モジュール２０２への入力の役割を果たすインタフェース変数から値を読み出すことができ、加算器モジュール２０２への出力の役割を果たすインタフェース変数に値を書き込むことができる。上記したように、加算器モジュール２０２内のインタフェース変数の値の変更は、スタブモジュール２０２Ａに反映されることになり、それによってトップモジュール２０１が適切に機能することを確実にする。同様に、スタブモジュール２０２Ａ内のインタフェース変数の値の変更は、加算器モジュール２０２に反映されることになり、それによってそれが適切に機能することを確実にする。
【００３６】
インタフェース変数ではない変数は、シリアルシミュレーションエンジン４０１またはコンカレントシミュレーションエンジン４０２のいずれか一方に格納されるが、両方には格納されないことに留意されたい。換言すれば、統合型論理シミュレータにおいてシリアルシミュレーションエンジン４０１とコンカレントシミュレーションエンジン４０２との間で共有される状態は、インタフェース変数に限定される。
【００３７】
特に、シリアルシミュレーションエンジン及びコンカレントシミュレーションエンジンは、変数の値を格納するために互いに異なる表現を利用することができる。一実施形態では、シリアルシミュレーションエンジンは、上記変数に対して複数の値、各シミュレーションに対して１つが格納されている表現を用いることができる。例えば、図５Ａに示されているシリアルシミュレーションエンジン５００を参照し、４つの異なるシミュレーション、すなわち、シミュレーション０、シミュレーション１、シミュレーション２及びシミュレーション３に対して複数の値を有する８ビット変数Ｖのための変数の値の表現を考える。変数Ｖのための各シミュレーションは、８ビットを格納する。対照的に、図５Ｂに示されているコンカレントシミュレーションエンジン５１０を参照すると、複数の４ビットワードに４つのシミュレーションの値が格納される。具体的には、そのようなアサインされたワードが８つ、すなわち変数Ｖの各ビットに１つある（すなわちＶ［０］〜Ｖ［７］）。図５Ａ及び図５Ｂ中のボックス５０１及び５０２はそれぞれ、シリアルシミュレーションエンジン５００及びコンカレントシミュレーションエンジン５１０において複数のシミュレーションにわたってシングルビットのための値がどのように構築されるかを示している（例えばビットＡ、Ｂ、Ｃ及びＤを参照）。
【００３８】
インタフェース変数の２つのコピー（すなわち、シリアルシミュレーションエンジンに１つ、コンカレントシミュレーションエンジンに１つ）があるので、これら２つのコピーは、統合型論理シミュレータが全シミュレーション状態の一貫した表示を保つように、更新時に同期されたままでなければならない。いくつかの実施形態では、キュー評価の始めと終わりにインタフェース変数の値が同期される。インタフェース変数の値を同期させるには、変数の値を格納するためのシリアルシミュレーションエンジン表現（例えば図５Ａを参照）とコンカレントシミュレーションエンジン表現（例えば図５Ｂを参照）との間の翻訳が必要である。
【００３９】
図６Ａは、Verilog HDL実行モデルにおけるアクティブイベントキューに基づくシリアルシミュレーションエンジン６００Ａとコンカレントシミュレーションエンジン６００Ｂとの間の例示的な同期を示している。各シミュレーションエンジンは自身のアクティブイベントキューを有することに留意されたい。すなわち、シリアルシミュレーションエンジン６００Ａはアクティブイベント６０１を有し、コンカレントシミュレーションエンジンはアクティブイベント６１１を有する。一実施形態では、シリアルシミュレーションエンジン６００Ａ内のアクティブイベントキューにそれ以上アクティブイベント６０１がなくなれば、その時がコンカレントシミュレーションエンジン６００Ｂに同期させる時間である。
【００４０】
ステップ６３０では、コンカレントシミュレーションエンジンモジュールのためのポートインタフェース変数の値が、シリアルシミュレーションエンジン６００Ａから翻訳・同期関数（translate and synchronize function）６２０へ転送される。この翻訳・同期関数６２０は、シリアルシミュレーションエンジン６００Ａによって用いられるストレージ表現からコンカレントシミュレーションエンジン６００Ｂによって用いられるストレージ表現へ（例えば、図５Ａに示されているストレージ表現から図５Ｂに示されているストレージ表現へ）の翻訳を含む。ステップ６３１では、翻訳され転送されたポートインタフェース変数の値に基づいて、コンカレントシミュレーションエンジン６００Ｂにおけるアクティブイベント６１１が実行される。ステップ６３２では、コンカレントシミュレーションエンジンモジュールのためのポートインタフェース変数の値が、翻訳・同期関数６２０を介してシリアルシミュレーションエンジン６００Ａに転送される。この方向においては、翻訳・同期関数６２０は、コンカレントシミュレーションエンジン６００Ｂによって用いられるストレージ表現からシリアルシミュレーションエンジン６００Ａによって用いられるストレージ表現への翻訳を含む。
【００４１】
翻訳・同期関数６２０は、グルーロジック６４０の一部を形成することに留意されたい。このグルーロジックは、コンパイル時間関数及びランタイム関数の両者を提供する。コンパイル時間関数は、シリアルシミュレーションエンジン６００Ａに全てのモジュールのためのソースコードが与えられたときに、コンカレントシミュレーションエンジン６００Ｂには該エンジンにアサインされるモジュールの定義が与えられる一方で、シリアルシミュレーションエンジン６００Ａには同じモジュールのためのスタブ定義が与えられることを確実にすることを含む。ランタイム関数は、シミュレータが動作してイベントを生成し始めた時点で、シリアルシミュレーションエンジンとコンカレントシミュレーションエンジンとの間でのインタフェース変数の翻訳が与えられることを確実にすることを含む。ランタイム関数はまた、シリアルシミュレーションエンジン６００Ａにおけるキューの実行がVerilog HDL実行モデルに従うように、シリアルシミュレーションエンジン６００Ａ及びコンカレントシミュレーションエンジン６００Ｂの両者においてシミュレーションが適切に同期されることを確実にすることを含む。このように、翻訳・同期関数６２０は、グルーロジック６４０のランタイム関数の一部を形成する。
【００４２】
コンカレントシミュレーションエンジン６００Ｂのアクティブイベント６１１を実行することで、シリアルシミュレーションエンジン６００Ａの追加アクティブイベント６０１を生成したかもしれないことに留意されたい。これについては（翻訳・同期関数６２０を用いて同期される）ステップ６３３で示されている。これらの新たなイベントは次にVerilog HDL実行モデルによって実行され、その後、翻訳・同期関数６２０を用いてステップ６３０、６３１、６３２及び６３３が繰り返される。シリアルシミュレーションエンジン６００Ａのアクティブイベント６０１がないとき（コンカレントシミュレーションエンジン６００Ｂによって生成される追加アクティブイベントまたは既にシリアルシミュレーションエンジン６００Ａにおいてキューに入れられているアクティブイベントに基づいて）、シリアルシミュレーションエンジン６００Ａの非アクティブイベントキューからの非アクティブイベント６０２は、Verilog HDL実行モデルに従って実行されることができる。
【００４３】
図６Ａのアクティブキューを参照して説明した同期をVerilog HDL実行モデルにおける他のキュー評価に拡張することができる。例えば、図６Ｂは、シリアルシミュレーションエンジン６００Ａ及びコンカレントシミュレーションエンジン６００Ｂのためのアクティブイベントキュー（アクティブイベント６０１及び６１１）、非アクティブイベントキュー（非アクティブイベント６０２及び６１２）、並びにNBA更新イベントキュー（NBA更新イベント６０３及び６１３）を含む例示的な拡張を示している。シリアルシミュレーションエンジン６００Ａとコンカレントシミュレーションエンジン６００Ｂとの間で、アクティブキュー、非アクティブキュー及びNBA更新キューは、それぞれ翻訳・同期関数６２０、６２１及び６２２（これらはグルーロジック６４０の一部を形成する）を用いて同期される。
【００４４】
シリアルシミュレーションエンジン６００Ａの或るキューが評価された後、インタフェース変数の値がコンカレントシミュレーションエンジン６００Ｂに転送される。このイベントはその後、コンカレントシミュレーションエンジン６００Ｂの対応するキューから実行される。イベント実行の結果を含むインタフェース変数の値はその後、シリアルシミュレーションエンジン６００Ａに戻され、そしてVerilog HDL実行モデルに従ってキューからキューへ進む。図６Ｂに示されているように、シリアルシミュレーションエンジン６００Ａまたはコンカレントシミュレーションエンジン６００Ｂのいずれか一方において実行される任意のイベントは、優先順位が高いかまたは低いかいずれかの１若しくは複数のイベントを生成し得ることに留意されたい。通常、コンカレントシミュレーションエンジン６００Ｂによって任意の新たなイベントが生成されたときは、翻訳・同期関数はすぐ知らされ、当該新たなイベントはその後、シリアルシミュレーションエンジン６００Ａの適切なキューに配置される。
【００４５】
アクティブイベント、非アクティブイベント及びNBA更新イベントを含むVerilog HDLに基づく例示的なキューについては既に説明したことに留意されたい。しかし、統合型論理シミュレータを、その他のHDL及び該HDLに関連する実行モデルに有利に適用することもできる。従って、通常、統合型論理シミュレータは、特定のHDLによって提供されるイベントの全クラスと連動することができる。さらに、各特定のHDLは、統合型論理シミュレータによって尊重されることができるような互いに異なるキュー遷移規則を有することができる。
【００４６】
例えば、図６Ｃは、VHDL（超高速集積回路（very high speed integrated circuit：VHSIC）HDL）モデルにおける例示的なキューのシミュレーション実行順序を示している。VHDLモデルでは、実行の順序は、信号更新イベント、関数評価イベント及びプロセス評価イベント経て進み、制御もプロセス実行の終わりに達するまでこの方向に流れ、終わりの時点で制御は信号更新に戻ることに留意されたい。上記したように、シリアルシミュレーションエンジン６００Ａとコンカレントシミュレーションエンジン６００Ｂとの間での各実行の遷移は、翻訳・同期関数６２０、６２１及び６２２を含むグルーロジック６４０を用いて促進されることができる。
【００４７】
統合型論理シミュレータにおいて関連アクティブイベント及びNBA更新イベントが実行されるような以下の例を考える。これらのイベントは、３つの代入、すなわち、シリアルシミュレーションエンジンによってシミュレートされるモジュールにおける２つの代入及びコンカレントシミュレーションエンジンによってシミュレートされるモジュールからの１つの代入によってもたらされる（Verilog代入は、計算された変数の値を格納場所に書き込むことを含む）。
Serial Simulation Engine
// Active event.
always @(posedge CLK)
A = B + 1;
// NBA update event.
always @(posedge CLK)
C <= D;
Concurrent Simulation Engine
// Active event.
always @(A)
B = A + 2;
【００４８】
上の例では、立ち上がり（positive edge）においてCLKをトリガするとき、２つのイベントが生成される。１つのイベントはシリアルシミュレーションエンジンアクティブイベントキューに配置され、もう１つのイベントはシリアルシミュレーションエンジンNBA更新イベントキューに配置される。図６Ｂのための優先順位によれば、最初にアクティブイベントがVerilog HDL実行モデルに従って実行され、その後、シリアルシミュレーションアクティブイベントキューは空になる。この空状態は、図６Ａに関連して説明した４ステップのプロセスに従って、統合型論理シミュレータをコンカレントシミュレーションエンジンに同期させる。具体的には、以下の通りである。
【００４９】
変数Ａのための値が、シリアルシミュレーションエンジンからコンカレントシミュレーションエンジンへ転送される。
【００５０】
コンカレントシミュレーションエンジンにおいてアクティブイベントが実行される。
【００５１】
変数Ｂのための更新された値が、コンカレントシミュレーションエンジンからシリアルシミュレーションエンジンへ転送される。
【００５２】
コンカレントシミュレーションにおいてアクティブイベントが実行されるので、次のキュー評価に進む前に、シリアルシミュレーションエンジンにおいてなすべき余分な仕事（すなわち新たなアクティブイベント）が存在するであろう。従って、プロセスは、シリアルシミュレーションエンジンにおけるアクティブイベントキューに戻る。
【００５３】
この時点で、シリアルシミュレーションエンジンにおいて実行すべきアクティブイベントはもうない。さらに、シリアルシミュレーションエンジンにもコンカレントシミュレーションエンジンにも非アクティブイベントがなく（後者の点は、図６Ａにおいて概説したような方法で非アクティブイベントキュー上のコンカレントシミュレーションエンジンと同期させた後に決定される）、これは、シリアルシミュレーションが保留状態のNBA更新イベントを実行して変数Ｃに書き込むことができることを意味する。
【００５４】
一実施形態では、なすべき仕事の量を減らすために、修正インタフェース変数のみ（または代わりにインタフェース変数内の修正ビットのみ）がキュー評価点において同期される。他の実施形態では、修正インタフェース変数を有するシミュレーションがキュー評価点においてのみが同期される。キュー評価点は、１つのシミュレーションエンジンにおける或る特定のキュー内の全てのイベントを終えたときに現れることができる。一実施形態では、キュー評価点は、同期をトリガすることができる。すなわち、グルーロジックが、更新されたインタフェース変数を、他のシミュレーションエンジンにおいて実行するために対応するキューに転送する。しかし、他の実施形態では、１若しくは複数のインタフェース変数の変化が同期をトリガすることができる。それゆえ、同期は、キュー評価前、キュー評価後、またはキュー評価の前後に起こり得る（全部または一部において）。
【００５５】
図７は、シリアルシミュレーションエンジン７００Ａによってシミュレートされるトップモジュール７０１と、コンカレントシミュレーションエンジン７００Ｂによってシミュレートされる加算器モジュール７１２とを示している。この実施形態では、トップモジュール７０１は複数のスタブ加算器モジュール７０２Ａ、７０２Ｂ、７０２Ｃ及び７０２Ｄを含む。特に、シリアルシミュレーションエンジン７００Ａにおけるスタブ加算器モジュール７０２Ａ〜７０２Ｄの全てのインスタンスを、コンカレントシミュレーションエンジン７００Ｂにおける加算器モジュール７１２の１つのインスタンスのみによって定義することができる。
【００５６】
有利には、この態様は、目的を達成するためのかなりの力を統合型論理シミュレータに対して与える。具体的には、シリアルシミュレータエンジン７００Ａ内の各スタブモジュールは、各インタフェース変数のための別個のストレージを有することができるが、コンカレントシミュレーションエンジン７００Ｂ内の対応するモジュールは、複数の値を格納し得る１つのワードを有することができ、それによって該ワードは複数のスタブモジュールに関連するインタフェース変数の値を格納することができる。例えば、図７では、スタブ加算器モジュール７０２Ａ〜７０２Ｄは、各インタフェース変数に対してそれぞれストレージ７０３Ａ〜７０３Ｄを有することができる。対照的に、コンカレントシミュレーションエンジン７００Ｂ内の加算器モジュール７１２は、各スタブ加算器モジュール７０２Ａ〜７０２Ｄからのこれらのインタフェース変数を格納するために１つのワード７１３しか必要としない。
【００５７】
ストレージ７０３Ａ〜７０３Ｄに格納される値が１ビット値（例えば１つのclk値）であると仮定すれば、ワード７１３の各ビットは、特定のスタブモジュールによって格納されている値に対応することができる（すなわち、７０３Ａ←→７０３Ａ’、７０３Ｂ←→７０３Ｂ’、７０３Ｃ←→７０３Ｃ’、７０３Ｄ←→７０３Ｄ’）。それゆえ、イベントの実行中にシリアルシミュレーションエンジン７００Ａのストレージ７０３Ｃ内のインタフェース変数の値が変化した場合、該値は同期中にコンカレントシミュレーションエンジン７００Ｂ内のビット７０３Ｃに転送されることになる。この転送は、図５Ａ及び図５Ｂを参照して説明したものと同じ翻訳を含むことに留意されたい。さらに、他の実施形態は、シリアルシミュレーションエンジン７００Ａに格納されたマルチビット値を有することができ、該値はマルチビット値としてコンカレントシミュレーションエンジン７００Ｂの１つのワードの位置に転送されることができることに留意されたい。このストレージ構成により、コンカレントシミュレーションエンジン７００Ｂは、加算器モジュール７１２内の複数（すなわち４つ）の値を用いて複数（すなわち４回）のコンカレントシミュレーションを行うことができる。
【００５８】
有利には、論理シミュレーションに用いられる多くのコンピュータは、拡張ワード値、例えば３２、６４または１２８ビットのレジスタを有する。それゆえ、統合型論理シミュレータのコンカレントシミュレーションエンジンは、１つのワードに格納されているかなりの量のデータに同じ操作を同時に適用することができる。
【００５９】
上記した実施形態では、シリアルシミュレーションエンジンは、それが同期点においてコンカレントシミュレーションエンジンを呼び出すシリアルシミュレーションエンジンであるという意味では、統合型論理シミュレータの主シミュレーションエンジンであってよい。他の実施形態では、逆の構成、すなわち、コンカレントシミュレーションエンジンが主シミュレーションエンジンであり、Verilog HDL実行モデルに従ってキューからキューへ進行し、適切な同期点においてシリアルシミュレーションエンジンを呼び出すような構成も可能である。一実施形態では、実行モデルにおける同期点は、プログラミング言語インタフェース（PLI）や検証手続インタフェース（VPI）などの業界標準のアプリケーションプログラミングインタフェースを通して確立されることができ、これらのインタフェースは、ユーザ定義拡張子をVerilogシミュレーションに実装するために用いられる。別の実施形態では、実行モデルにおける同期点は、１若しくは複数の独自仕様のインタフェースを通して確立されることができる。
【００６０】
一実施形態では、どのモジュールがスタブモジュールとして（かつコンカレントシミュレーションエンジンにおいて行われる関連コンカレントシミュレーションを用いて）インスタンス化されることができるかを決定するための設計の分割をユーザが手動で行うことができる。別の実施形態では、この分割を、潜在的なインスタンスの数に基づくシミュレーションによって自動的に行うことができる（すなわち、インスタンスの数が多ければ多いほど、コンカレントシミュレーションエンジンによって達成可能な力が大きい）。さらに別の実施形態では、シリアルシミュレーションエンジン及び／またはコンカレントシミュレーションエンジンが所望のレベルのシミュレーション性能を達成する能力に基づいて分割を行うことができる。例えば、或るモジュールがPLI（プログラミング言語インタフェース）を通してユーザ定義C関数への広範な関数呼び出し（コール）を行う場合、おそらくコンカレントシミュレーションエンジンの値表現を活用する能力なしにユーザ定義関数が書き込まれたので、上記モジュールは、シリアルシミュレーションエンジンによる実行に一層適しているであろう。
【００６１】
設計の分割は、設計の設計階層を考慮して行うことができることに留意されたい。例えば、一実施形態では、第１のモジュールが副シミュレーションエンジンによってシミュレートされることは、第１のモジュールの下の設計階層内においてより深くインスタンス化された全てのサブモジュールも同様に副シミュレーションエンジンによってシミュレートされることを示唆している。別の実施形態では、第１のモジュール（副シミュレーションエンジンによってシミュレートされる）が第２のモジュールをインスタンス化する場合に、第２のモジュールは、主シミュレーションエンジンによってシミュレートされることができる。上記したように、主シミュレーションエンジンはシリアルシミュレーションエンジンであってよく、第２のシミュレーションエンジンはコンカレントシミュレーションエンジンであってよい（逆もまた同様）。
【００６２】
例えば、以下のコードは、統合型論理シミュレータに固有の柔軟性の或る例示的な事例を与える。
// Original Verilog
module top_module;
reg clk;
reg [7:0] input1;
reg [7:0] input2;
wire [7:0] sum;
wire [7:0] product;
adder_and_mult am (.clk(clk),
.a(input1),
.b (input2),
.sum(sum),
.product (product) ) ; 
endmodule
module adder_and_mult(clk, a, b, sum, product);
input clk;
input [7:0] a;
input [7:0] b;
output [7:0] sum;
output [7:0] product;
always @(posedge clk)
sum = a + b;
multiplier mult (.clk(clk) ,
.a(a),
.b(b),
.product (product));
end module
module multiplier (clk, a, b, product); 
input clk;
input [7:0] a;
input [7:0] b;
output [7:0] product;
always @(posedge clk)
product = a * b;
endmodule
// Verilog + stub modules simulated by the serial simulation engine.
// To be simulated by the serial simulation engine.
module top_module;
reg clk;
reg [7:0] input1;
reg [7:0] input2;
wire [7:0] sum;
wire [7:0] product;
adder_and_mult am(.clk(clk) ,
.a (input1),
.b (input2),
.sum(sum),
.product (product));
endmodule
// To be simulated by the concurrent simulation engine.
module adder_and_mult (clk, a, b, sum, product);
input clk;
input [7:0] a;
input [7:0] b;
output [7:0] sum;
output [7:0] product;
multiplier mult (.clk(clk),
.a (a),
.b(b),
.product (product));
endmodule
// To be simulated by the serial simulation engine.
module multiplier (clk, a, b, product);
input clk;
input [7:0] a;
input [7:0] b;
output [7:0] product;
always @(posedge clk)
product = a * b;
endmodule
図８は、上記のコードを表現しているブロック図を示していることに留意されたい。この実施形態では、シリアルシミュレーションエンジン８１１は、スタブ加算器及び乗算器モジュール８０２Ａを含むトップモジュール８０１に対する責任を持たされている。コンカレントシミュレーションエンジン８１２は、埋め込み加算器及び乗算器モジュール８０２に対する責任を持たされている。この場合、実際の加算器HDLは、コンカレントシミュレーションエンジン８０２によってシミュレートされることができ、コンカレントシミュレーションエンジン８１２は、埋め込み乗算器モジュールのためのスタブモジュール８０３Ａと相互作用することができる。この実施形態では、加算器及び乗算器モジュール８０２はスタブ乗算器モジュール８０３Ａを含み、スタブ乗算器モジュール８０３Ａは、シリアルシミュレーションエンジン８１１の乗算器モジュール８０３と相互作用する。換言すれば、モジュールの下の設計階層内においてより深くインスタンス化された任意のサブモジュール（スタブモジュールからシミュレーションを行うように指示された任意のモジュール）は、シリアルシミュレーションエンジン８１１またはコンカレントシミュレーションエンジン８１２のいずれかによって実行されるように構造化されることができる。通常、シリアルシミュレーションエンジン８１１とコンカレントシミュレーションエンジン８１２との間のシミュレーション責任のこの転送は、何度も行われることができ、システム資源を最適化するように構造化されることができることに留意されたい。
【００６３】
トップモジュールに埋め込まれている加算器モジュールのためのイベントを実行するものとしてコンカレントシミュレーションエンジンについて上記で説明したが、統合型論理シミュレーションは、他の種類のトップ／埋め込みモジュールに等しく適用可能であることに留意されたい。例えば、別の埋め込みモジュールは、被試験体（device under test：DUT）を含むことができ、DUTはシリアルシミュレーションエンジンにおいてスタブモジュールとして表現されることができる。この場合、トップモジュールは、テストベンチを含むことができる。
【００６４】
図９は、統合型論理シミュレータを含む例示的なデジタルASIC設計フローの簡易化した表現を示している。高レベルにおいて、プロセスは製品アイデア（ステップ９００）から始まり、EDAソフトウェア設計プロセス（ステップ９１０）において実現される。設計が完成すると、完成した設計をテープアウトすることができる（イベント９４０）。テープアウトの後、製造プロセス（ステップ９５０）並びに梱包及び組立てプロセス（ステップ９６０）を行い、最終的に完成チップが得られる（結果９７０）。
【００６５】
EDAソフトウェア設計プロセス（ステップ９１０）は、実際には、簡単にするために直線的に示されている複数のステップ９１２〜９３０からなる。実際のASIC設計プロセスでは、特定の設計は、特定のテストに合格するまで上記ステップを繰り返さなければならないかもしれない。同様に、任意の実際の設計プロセスでは、これらのステップが異なる順番及び組合せで生じることがある。従って、この説明は、特定のASICのための特定の、または推奨される設計フローではなく、コンテキスト及び一般的説明のつもりで与えられている。
【００６６】
ここで、EDAソフトウェア設計プロセス（ステップ９１０）の構成要素ステップについて簡単に説明する。
【００６７】
システム設計（ステップ９１２）：設計者は、自身が実装したい機能性を記述し、何らかの状況を仮定した計画を行うことにより機能性を微調整し、コストをチェックすることなどができる。この段階で、ハードウェア−ソフトウェアのアーキテクチャ分割が起こり得る。このステップにおいて用いることができるシノプシス社（Synopsys, Inc.）製の例示的なEDAソフトウェア製品には、Model Architect、Saber、System Studio、DesignWare（登録商標）の各製品が含まれる。
【００６８】
論理設計及び機能検証（ステップ９１４）：この段階では、システム内のモジュールのためのVHDLまたはVerilogコードが書き込まれ、設計の機能的精度がチェックされる。より具体的には、設計をチェックして該設計が正しい出力を作り出すことを確実にする。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、VCS、VERA、DesignWare（登録商標）、Magellan、Formality、ESP、LEDAの各製品が含まれる。一実施形態では、上記の統合型論理シミュレータは、論理設計及び機能検証ステップ９１４中に実装されることができる。
【００６９】
合成及びテスト設計（design for test）（ステップ９１６）：ここでは、VHDL／Verilogがネットリストに翻訳される。ネットリストは、標的技術に対して最適化されることができる。さらに、完成チップのチェックを可能にするためにテストの設計及び実装が行われる。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Design Compiler（登録商標）、Power Compiler、DFTMAX、TetraMAX、DesignWare（登録商標）の各製品が含まれる。
【００７０】
ネットリスト検証（ステップ９１８）：このステップでは、ネットリストがタイミング制約を順守しかつVHDL／Verilogソースコードと一致しているかチェックされる。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Formality、PrimeTime、VCSの各製品が含まれる。
【００７１】
設計計画（ステップ９２０）：ここでは、チップのための全体的なフロアプランが作成され、タイミング及びトップレベルルーティングのために解析される。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Astro及びIC Compilerの各製品が含まれる。
【００７２】
物理的実装（ステップ９２２）：このステップでは、配置（回路素子の位置決め）及びルーティング（回路素子の接続）を行う。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Astro及びIC Compilerの各製品が含まれる。
【００７３】
解析及び抽出（ステップ９２４）：このステップでは、回路機能がトランジスタレベルにおいて検証され、それにより、何らかの状況を仮定した微調整が可能になる。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、AstroRail、PrimeRail、Primetime、Star RC/XTの各製品が含まれる。
【００７４】
フィジカル検証（ステップ９２６）：このステップでは、製造、電気に関する問題、リソグラフィーの問題及び電気回路の正確さを確保するために種々のチェック機能が行われる。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Hercules製品が含まれる。
【００７５】
解像度向上（ステップ９２８）：このステップは、設計の製造可能性を向上させるためのレイアウトの幾何学的操作を含む。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、Proteus、ProteusAF、PSMGenの各製品が含まれる。
【００７６】
マスクデータ準備（ステップ９３０）：このステップは、完成チップを製作するためにリソグラフィーに用いるためのマスクの製作のための「テープアウト」データを提供する。このステップにおいて用いることができるシノプシス社製の例示的なEDAソフトウェア製品には、CATS(R)ファミリーの製品が含まれる。
【００７７】
データストレージシステム、少なくとも１つの入力デバイス及び少なくとも１つの出力デバイスとデータ及び命令を送受信するように結合された少なくとも１つのプログラマブルプロセッサを含むプログラマブルシステムで実行する１若しくは複数のコンピュータプログラムを用いて、上記した統合型論理シミュレータを実行することができる。各コンピュータプログラムは、高水準手続き型またはオブジェクト指向のプログラミング言語で、あるいは必要に応じてアセンブリ言語または機械語で実装されることができ、いずれの場合においても、言語はコンパイルまたは解釈された言語であってよい。適切なプロセッサには、例として、汎用及び専用マイクロプロセッサ並びに他の種類のマイクロコントローラが含まれる。一般的に、プロセッサは読出し専用メモリ（ROM）及び／またはランダムアクセスメモリ（RAM）から命令及びデータを受け取ることになる。一般的に、コンピュータは、データファイルを格納するための１若しくは複数の大容量ストレージデバイスを含むことになり、そのようなデバイスには、磁気ディスク（内部ハードディスク及びリムーバブルディスクなど）、光磁気ディスク及び光ディスクが含まれる。コンピュータプログラム命令及びデータを目に見える方法で具体化するのに適したストレージデバイスには、例として、半導体メモリデバイス（EPROM、EEPROM、フラッシュメモリデバイスなど）、磁気ディスク（内部ハードディスク及びリムーバブルディスクなど）、光磁気ディスク及びCDROMディスクなどを含む全ての形態の不揮発性メモリが含まれる。上述のいずれも、特殊用途向け集積回路（application-specific integrated circuit：ASIC）を補うかまたはASICに組み込むことができる。
【００７８】
本発明の原理を説明する添付の図面とともに、本発明の１若しくは複数の実施形態の詳細な説明が上記でなされている。そのような実施形態に関連して本発明について説明されているが、本発明は、どの実施形態に限定されるものでもない。本発明の範囲は特許請求の範囲によってのみ限定され、本発明は、数多くの代替形態、変更形態及び等価形態を含む。本発明への完全な理解を与えるために、以下の説明に多くの具体的詳細が示されている。これらの詳細は例示のために与えられているものであり、これらの具体的詳細の一部または全部なしに、特許請求の範囲に従って本発明を実施することができる。明瞭さのために、本発明に関連する技術分野において既知である技術項目については、本発明が不必要に不明瞭にならないように、詳細に説明しなかった。
【図１】
2013521583.tif 000003
【図２】
2013521583.tif 000004
【図３Ａ】
2013521583.tif 000005
【図３Ｂ】
2013521583.tif 000006
【図４Ａ】
2013521583.tif 000007
【図４Ｂ】
2013521583.tif 000008
【図５Ａ】
2013521583.tif 000009
【図５Ｂ】
2013521583.tif 000010
【図６Ａ】
2013521583.tif 000011
【図６Ｂ】
2013521583.tif 000012
【図６Ｃ】
2013521583.tif 000013
【図７】
2013521583.tif 000014
【図８】
2013521583.tif 000015
【図９】
2013521583.tif 000016
【国際調査報告】
2013521583.tif 000017
2013521583.tif 000018