(57)【要約】ある側面では、本発明は、合成可能タスクのシミュレーションを加速する多くの並列プロセッサ要素を有するＶＬＩＷシミュレーションプロセッサを使用するだけでなく、また、合成不可能タスクおよび／または分岐もサポートする論理シミュレーションシステムを提供することによって、従来技術の制限を克服する。あるアプローチでは、ＶＬＩＷシミュレーションプロセッサは、オンチップ命令キャッシュを有さないアーキテクチャに基づく。代わりに、ＶＬＩＷ命令ワードは、プログラムメモリから直接ストリームし、個々のプロセッサ要素は、命令ワードに基づいて、連続的にプログラムされる。これは、また、割り込みジャンプの効率的実装を可能にし、コード領域は、常に最初からの侵入を必要とせず、領域の中間に侵入可能である。別の側面では、合成不可能タスクは、例外ハンドラによって効率的に処理可能である。
2009533785.tif 000002
【特許請求の範囲】
【請求項１】
回路設計の論理シミュレーションのためのハードウェア加速論理シミュレーションシステムであって、
複数の並列処理要素を含むＶＬＩＷシミュレーションプロセッサであって、該処理要素は、サポートされた命令セット内に含まれる命令を実行するように作動可能であり、該命令は、該論理シミュレーションのための合成可能タスク、合成不可能タスク、および分岐を実装する、ＶＬＩＷシミュレーションプロセッサと、
該命令を含むプログラムメモリであって、該命令は、オンチップ命令キャッシュを使用せずに、該プログラムメモリから該処理要素へ直接ストリームされる、プログラムメモリと
を備える、システム。
【請求項２】
前記合成可能タスクは、前記回路設計内のユーザ論理のシミュレーションを含む、請求項１に記載のシステム。
【請求項３】
前記合成不可能タスクは、前記回路設計の行動モデルのシミュレーションを含む、請求項１に記載のシステム。
【請求項４】
前記合成不可能タスクは、前記論理シミュレーションのためのテストベンチ機能を含む、請求項１に記載のシステム。
【請求項５】
前記合成不可能タスクは、前記論理シミュレーションの全体制御を含む、請求項１に記載のシステム。
【請求項６】
前記処理要素へストリームされる前記命令のプログラムメモリ内のアドレスをポイントするプログラムカウンタレジスタをさらに備え、分岐に対する命令の実行は、新しいアドレスを該プログラムカウンタレジスタ内にロードする、請求項１に記載のシステム。
【請求項７】
分岐を実装する前記命令は、グローバルジャンプ命令を含む、請求項６に記載のシステム。
【請求項８】
分岐を実装する前記命令は、相対ジャンプ命令を含む、請求項６に記載のシステム。
【請求項９】
分岐を実装する前記命令は、条件付きジャンプ命令を含む、請求項６に記載のシステム。
【請求項１０】
分岐を実装する前記命令は、無条件ジャンプ命令を含む、請求項６に記載のシステム。
【請求項１１】
分岐を実装する前記命令は、多重分岐命令を含む、請求項６に記載のシステム。
【請求項１２】
前記多重分岐命令は、一式の条件付き分岐命令として実装され、該条件付き分岐命令はそれぞれ、異なる処理要素によって、同時に実行される、請求項１１に記載のシステム。
【請求項１３】
分岐を実装する前記命令の少なくとも１つは、フィールドオーバーロードとしてエンコードされる、請求項６に記載のシステム。
【請求項１４】
前記命令は、領域に分割され、分岐を実装する該命令の少なくとも１つは、起動領域から被起動領域への割り込みジャンプである、請求項６に記載のシステム。
【請求項１５】
前記被起動領域への前記割り込みジャンプ後、前記起動領域へのリターンの際に、該起動領域の一時変数は、該割り込みジャンプ前と同じ場所に保存されている、請求項１４に記載のシステム。
【請求項１６】
前記被起動領域への前記割り込みジャンプ後、前記起動領域へのリターンの際に、該起動領域の一時変数は、異なる場所に保存され、該割り込みジャンプ前のもとの場所に復元される、請求項１４に記載のシステム。
【請求項１７】
前記被起動領域への前記割り込みジャンプ後、前記起動領域へのリターンの際に、該起動領域の一時変数は、保存されず、再ロードおよび／または再計算される、請求項１４に記載のシステム。
【請求項１８】
前記被起動領域への前記割り込みジャンプ後、前記起動領域へのリターンの際に、該起動領域の一時変数は、マッピング／スケジュールされた該プログラムではなく、前記ＶＬＩＷプロセッサのアーキテクチャに基づいて、確定的に復元可能である、請求項１４に記載のシステム。
【請求項１９】
前記プログラムメモリは、異なる動的条件に対して最適化された代替バリアント実行ドメインを含み、前記ＶＬＩＷシミュレーションプロセッサは、該動的条件に対する制御変数の評価に基づいて、該代替バリアント実行ドメインのうちの１つに分岐する、請求項６に記載のシステム。
【請求項２０】
前記代替バリアント実行ドメインのうちの１つは、コードの展開バージョンを含み、別の該代替バリアント実行ドメインは、同じコードのインライン展開または被起動のバージョンを含む、請求項１９に記載のシステム。
【請求項２１】
前記代替バリアント実行ドメインのうちの１つは、前記動的条件の特定の状態を仮定して、デッドコード削除を実装する、請求項１９に記載のシステム。
【請求項２２】
前記代替バリアント実行ドメインのうちの１つは、前記動的条件の特定の状態を仮定して、定数伝播を実装する、請求項１９に記載のシステム。
【請求項２３】
合成不可能タスクに対する命令の実行は、例外ハンドラを起動する、請求項１に記載のシステム。
【請求項２４】
前記例外ハンドラおよび前記ＶＬＩＷシミュレーションプロセッサは、同一チップ上に実装される、請求項２３に記載のシステム。
【請求項２５】
前記例外ハンドラ、前記ＶＬＩＷシミュレーションプロセッサ、および前記プログラムメモリは、同一プリント基板上に実装される、請求項２３に記載のシステム。
【請求項２６】
前記例外ハンドラは、前記ハードウェア加速論理シミュレーションシステムのためのホストコンピュータ内のハードウェアによって実行される、請求項２３に記載のシステム。
【請求項２７】
前記例外ハンドラは、前記ハードウェア加速論理シミュレーションシステムのためのホストソフトウェアによって実行される、請求項２３に記載のシステム。
【請求項２８】
前記例外ハンドラは、前記ＶＬＩＷシミュレーションプロセッサの前記処理要素と並列して実行する、請求項２３に記載のシステム。
【請求項２９】
ホストコンピュータと、
該ホストコンピュータにプラグインされたプリント基板であって、
単一チップとして実装された前記ＶＬＩＷシミュレーションプロセッサと、
前記プログラムメモリと
をさらに含む、プリント基板と、
をさらに備える、請求項１に記載のシステム。
【請求項３０】
前記処理要素にストリームされる前記命令のプログラムメモリ内のアドレスをポイントするプログラムカウンタレジスタをさらに備え、異なる処理要素は、プログラムメモリ内の異なるアドレスからストリームされる命令を同時に受信可能である、請求項１に記載のシステム。
【請求項３１】
回路設計の論理シミュレーションの方法であって、
サポートされた命令セットからの命令をプログラムメモリ内に格納するステップと、
オンチップ命令キャッシュを使用せずに、該プログラムメモリからＶＬＩＷシミュレーションプロセッサの処理要素へ直接該命令をストリームするステップと、
該処理要素が、該命令を実行するステップであって、該命令は、該論理シミュレーションのための合成可能タスク、合成不可能タスク、および分岐を実装する、ステップと
を包含する、方法。
【請求項３２】
回路設計を、該回路設計の論理シミュレーションのためにサポートされた命令セットからの命令を含むプログラムにコンパイルする方法であって、
該回路設計を領域に分割するステップと、
命令を各領域内で並列化するステップと、
該領域のためのスケジュールを構成するステップと、
を包含し、
該領域内の該命令は、オンチップ命令キャッシュを使用せずに、プログラムメモリからＶＬＩＷシミュレーションプロセッサの処理要素へ直接ストリームされ、該命令は、該論理シミュレーションのための合成可能タスク、合成不可能タスク、および分岐を実装し、少なくとも１つの領域は、該領域内への割り込みジャンプを含む、方法。
【請求項３３】
少なくとも１つの領域は、該領域内への２つ以上の割り込みジャンプを含む、請求項３２に記載の方法。
【請求項３４】
少なくとも１つの領域は、合成不可能タスクを実装するために、例外ハンドラを起動するステップを含む、請求項３２に記載の方法。
【請求項３５】
各領域内の命令を並列化する前記ステップは、前記領域内のループを、展開バージョン、インライン展開バージョンおよび／または被起動バージョンとして実装するかどうかを判断するステップを包含する、請求項３２に記載の方法。
【請求項３６】
前記判断ステップに従って、
前記ループの反復数が静的であって、該ループの展開サイズが相対的に小さい場合、該ループは、展開バージョンとして実装され、
該ループの反復数が動的であって、該ループのサイズが相対的に小さい場合、該ループは、インライン展開バージョンとして実装され、
該ループの反復数が動的であって、該ループのサイズが相対的に大きい場合、該ループは、被起動バージョンとして実装される、
請求項３５に記載の方法。
【請求項３７】
前記判断ステップに従って、前記ループは、前記展開、インライン展開、および被起動バージョンのうちの２つ以上として実装され、前記領域は、制御変数の動的評価に基づいて、該展開、インライン展開、および被起動バージョンの中から選択する条件付き分岐命令をさらに含む、請求項３５に記載の方法。
【請求項３８】
各領域内で命令を並列化する前記ステップは、
異なる動的条件に対し最適化された代替バリアント実行ドメインを実装するステップと、
該動的条件に対する制御変数の動的評価に基づいて、該代替バリアント実行ドメインの中から選択する条件付き分岐命令を含むステップと
を包含する、請求項３２に記載の方法。
【請求項３９】
前記回路設計を領域に分割する前記ステップは、
タスクの完全合成可能ブロックから別個の領域を形成するステップと、
領域拡張技術を使用して、該別個の領域をより大きな領域に結合するステップと
を備える、請求項３２に記載の方法。
【請求項４０】
領域拡張技術を使用する前記ステップは、例外ハンドラを起動し、領域を分離する合成不可能タスクを実装し、それによって、前記別個の領域の組み合わせをより大きな領域にするステップを包含する、請求項３９に記載の方法。
【請求項４１】
領域拡張技術を使用する前記ステップは、分岐を使用して、別個の領域を接続し、それによって、該別個の領域の組み合わせをより大きな領域にするステップを包含する、請求項３９に記載の方法。
【請求項４２】
領域拡張技術を使用する前記ステップは、割り込み分岐を使用して、別個の領域を接続し、それによって、該別個の領域の組み合わせをより大きな領域にするステップを備える、請求項３９に記載の方法。
【請求項４３】
プロセッサに、回路設計を該回路設計の論理シミュレーションのためにサポートされた命令セットからの命令を含むプログラムにコンパイルするための方法を実行させる、ソフトウェア命令を含むコンピュータ可読記憶媒体であって、該方法は、
該回路設計を領域に分割するステップと、
命令を各領域内で並列化するステップと、
該領域のためのスケジュールを構成するステップと、
を包含し、
該領域内の該命令は、オンチップ命令キャッシュを使用せずに、プログラムメモリからＶＬＩＷシミュレーションプロセッサの処理要素へ直接ストリームされ、該命令は、該論理シミュレーションのための合成可能タスク、合成不可能タスク、および分岐を実装し、少なくとも１つの領域は、該領域内への割り込みジャンプを含む、コンピュータ可読記憶媒体。
【請求項４４】
複数の並列処理要素を含むＶＬＩＷプロセッサであって、
該処理要素は、サポートされた命令セット内に含まれる命令を実行するように作動可能であり、
該命令は、合成可能タスク、合成不可能タスク、および分岐を実装し、
該命令は、オンチップ命令キャッシュを使用せずに、プログラムメモリから該処理要素に直接ストリームされる、
ＶＬＩＷプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の参照）
本出願は、（ａ）米国特許出願第１１／２９２，７１２号（２００５年１２月１日出願、名称「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｓｉｍｕｌａｔｉｏｎ  ｏｆ  Ｌｏｇｉｃ  ａｎｄ  Ｍｅｍｏｒｙ」、出願人：Ｈｅｎｒｙ  Ｔ．ＶｓｒｈｅｙｅｎおよびＷｉｌｌｉａｍ  Ｗａｔｔ）、および（ｂ）米国特許出願第１１／２９６，００７号（２００５年１２月６日出願、名称「Ｐａｒｔｉｔｉｏｎｉｎｇ  ｏｆ  Ｔａｓｋｓ  ｆｏｒ  Ｅｘｅｃｕｔｉｏｎ  ｂｙ  ａ  ＶＬＩＷ  Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ」、出願人：Ｈｅｎｒｙ  Ｔ．ＶｓｒｈｅｙｅｎおよびＷｉｌｌｉａｍ  Ｗａｔｔ）の一部継続出願であり、そして、（ｃ）米国仮特許出願第６０／７４４，９９１号（２００６年４月１７日出願、名称「Ｂｒａｎｃｈｉｎｇ  ａｎｄ  Ｂｅｈａｖｉｏｒａｌ  Ｐａｒｔｉｔｉｏｎｉｎｇ  ｆｏｒ  ａ  ＶＬＩＷ  Ｐｒｏｃｅｓｓｏｒ」、出願人：Ｈｅｎｒｙ  Ｔ．Ｖｓｒｈｅｙｅｎ、他）、および米国特許出願第１１／７３５，８６５号（２００７年４月１６日出願、名称「Ｂｒａｎｃｈｉｎｇ  ａｎｄ  Ｂｅｈａｖｉｏｒａｌ  Ｐａｒｔｉｔｉｏｎｉｎｇ  Ｆｏｒ  ａ  ＶＬＩＷ  Ｐｒｏｃｅｓｓｏｒ」、出願人：Ｈｅｎｒｙ  Ｔ．Ｖｓｒｈｅｙｅｎ、他）に対し、米国特許法第１１９条（ｅ）に基づく優先権を主張する。これら出願の主題は、その全体が本明細書に参照として援用される。
【０００２】
（発明の分野）
本発明は、概して、ＶＬＩＷ（ｖｅｒｙ  ｌｏｎｇ  ｉｎｓｔｒｕｃｔｉｏｎ  ｗｏｒｄ；超長命令ワード）プロセッサに関し、例えば、半導体集積回路（また、半導体チップとしても知られる）の設計のシミュレーションのためのハードウェア加速システム内で使用され得るシミュレーションプロセッサを含む。本発明のある側面は、分岐の実装および／またはＶＬＩＷプロセッサのためのタスクの分割のための種々のアプローチに関し、具体的には、ある特定の場合には、オンチップ命令キャッシュを有さないＶＬＩＷプロセッサに関する。
【背景技術】
【０００３】
半導体チップの設計シミュレーションは、典型的には、設計内の大量の論理、大量のオンチップおよびオフチップメモリのため、高速処理および多数の実行ステップを必要とし、高速演算が、典型的には、最新の半導体チップのための設計において存在する。シミュレーションのための典型的アプローチは、ソフトウェアベースのシミュレーション（すなわち、ソフトウェアシミュレータ）である。このアプローチでは、チップの論理およびメモリ（便宜上、ユーザ論理およびユーザメモリと称する）は、汎用ハードウェア上で実行するコンピュータソフトウェアによってシミュレートされる。ユーザ論理は、論理機能を模倣するソフトウェア命令の実行によってシミュレートされる。ユーザメモリは、汎用ハードウェア内のメインメモリを配分し、次いで、シミュレーションによる必要に応じて、これらの記憶場所からデータを転送したりされたりすることによって、シミュレートされる。残念ながら、ソフトウェアシミュレータは、典型的には、非常に低速である。チップ上の大量の論理のシミュレーションは、多数のオペランド、結果、および対応するソフトウェア命令が、メインメモリから実行のための汎用プロセッサへ転送されることを必要とする。チップ上の大量のメモリのシミュレーションは、多数のデータ転送、およびチップ記述内で使用されるアドレスと、汎用ハードウェアのメインメモリ内で使用される対応するアドレスとの間の対応するアドレス変換を必要とする。
【０００４】
チップシミュレーションのための別のアプローチは、ハードウェアベースのシミュレーション（すなわち、ハードウェアエミュレータ）である。このアプローチでは、ユーザ論理およびユーザメモリは、専用基準に基づいて、エミュレータ内のハードウェア回路にマッピングされ、次いで、ハードウェア回路は、シミュレーションを行う。ユーザ論理は、エミュレータ内の特定のハードウェアゲートにマッピングされ、ユーザメモリは、エミュレータ内の特定の物理的メモリにマッピングされる。残念ながら、エミュレータ内で必要とされるハードウェア回路の数は、シミュレートされるチップ設計のサイズに応じて増加するため、ハードウェアエミュレータは、典型的には、コストが高くなる。例えば、オンチップ論理は、専用基準に基づいて、エミュレータ内の物理的論理にマッピングされるため、ハードウェアエミュレータは、典型的には、チップ上に存在するものと同一量の論理を必要とする。大量のユーザ論理が存在する場合、同等に、大量の物理的論理がエミュレータ内に存在しなければならない。さらに、ユーザメモリもまた、エミュレータ上にマッピングされなければならず、また、ユーザメモリからハードウェアエミュレータ内の物理的メモリへの専用マッピングも必要とする。典型的には、エミュレータメモリは、ユーザメモリを模倣するようにインスタンス化および分割される。これは、各メモリが物理的アドレスおよびデータポートを使用するため、非常に非効率となり得る。典型的には、マッピング可能なユーザ論理およびユーザメモリの量は、エミュレータのアーキテクチャ特性に依存するが、ユーザ論理およびユーザメモリの両方が、物理的リソースをエミュレータ内に含め、設計サイズに伴って拡大することを必要とする。これは、エミュレータのコストを跳ね上がらせる。また、性能を減退させ、エミュレータの設計を複雑にする。エミュレータメモリは、典型的には、高速であるが小型である。大型ユーザメモリは、多くのエミュレータメモリに分割しなければならい場合がある。これは、したがって、異なるエミュレータメモリ間の同期化を必要とする。
【０００５】
論理シミュレーションのためのさらに別のアプローチは、ハードウェア加速シミュレーションである。ハードウェア加速シミュレーションは、典型的には、論理設計をエミュレートまたはシミュレートするように構成可能なプロセッサ要素を含む、特殊ハードウェアシミュレーションシステムを利用する。コンパイラは、典型的には、論理設計（例えば、ネットリストまたはＲＴＬ（レジスタ転送言語；Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）の形式）を、論理設計をシミュレートするプロセッサ要素にロードされる命令を含むプログラムに変換するために提供される。ハードウェア加速シミュレーションは、種々の技術を利用して、論理設計を小区分（または、ドメイン）に分割し、これらのドメインをシミュレーションプロセッサにロードし得るため、論理設計のサイズに比例して拡大する必要はない。その結果、ハードウェア加速シミュレータは、典型的には、ハードウェアエミュレータよりも大幅に安価となる。加えて、ハードウェア加速シミュレータは、シミュレーションプロセッサによって生成されるハードウェア加速のため、典型的には、ソフトウェアシミュレータよりも高速である。
【０００６】
しかしながら、ハードウェア加速シミュレータは、典型的には、全体シミュレーション制御と、加速されるハードウェアシミュレータ内に生じる特定のドメインのシミュレーションとの間の連携を必要とする。例えば、ユーザ設計が、一度に１つのドメインでシミュレートされる場合、ドメインの現在の状態をハードウェアシミュレータ内にロードし、ハードウェアシミュレータにそのドメインのシミュレーションを行わせ、次いで、シミュレートされる次のドメインの状態をロードする代わりに、ドメインの修正された状態を（恐らくは、結果またはエラーメッセージ等の追加データも）スワップアウトするために、いくつかの制御が必要とされる。別の例として、ハードウェアシミュレータによって実行されない機能のためのコマンド（例えば、ホストコンピュータによって実行されるコマンド）は、典型的には、また、ハードウェアシミュレータと連携される必要がある。シミュレーション内のレポーティング、インタラプトおよびエラー、および分岐は、一部の例である。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
これらの機能は、好ましくは、リソース効率的方法および低オーバーヘッドで実装される。例えば、異なるドメインの状態空間をスワップすることは、好ましくは、過度にシミュレーションを遅延させることなく生じる。したがって、上述の欠点の一部または全部を克服する、チップ設計のハードウェア加速機能シミュレーションに対するアプローチの必要性がある。
【課題を解決するための手段】
【０００８】
ある側面では、本発明は、合成可能タスクのシミュレーションを加速する多くの並列プロセッサ要素を有するＶＬＩＷシミュレーションプロセッサを使用するだけでなく、また、合成不可能タスクおよび／または分岐もサポートする論理シミュレーションシステムを提供することによって、従来技術の制限を克服する。
【０００９】
あるアプローチでは、ＶＬＩＷシミュレーションプロセッサは、オンチップ命令キャッシュを有さないアーキテクチャに基づく。代わりに、ＶＬＩＷ命令ワードは、プログラムメモリから直接ストリームし、個々のプロセッサ要素は、命令ワードに基づいて、連続的にプログラムされる。その結果、コード分岐は、命令キャッシュを使用する従来のＶＬＩＷプロセッサアーキテクチャと異なり、命令キャッシュの同期化が必要でないため、ほぼ実行ペナルティなく実装可能である。これは、また、割り込みジャンプの効率的実装を可能にし、コード領域は、常に最初からの侵入を必要とせず、領域の中間に侵入されることが可能である。言い換えると、割り込みジャンプの可用性によって、より大きな領域の形成が可能になり、概して、スケジューリング効率および命令レベル並列度を増加させる。これは、対応するキャッシュの同期化要件のため、概して、割り込みジャンプが可能ではない従来のＶＬＩＷプロセッサアーキテクチャと正反対である。
【００１０】
別の側面では、合成不可能タスク（すなわち、ＶＬＩＷプロセッサ要素による効率的実行に好適ではないタスク）は、例外ハンドラを介して、効率的に達成される。例外ハンドラのコールおよび実行の待機時間が相対的に長い場合でも、待機時間が予測可能である場合、全体の高実行効率は、その待機時間を考慮するように例外ハンドラをスケジューリングすることによって、依然として維持可能であって、他の並列演算がＶＬＩＷシミュレーションプロセッサ内で同時に実行することを可能にする。
【００１１】
論理シミュレーションとの関連において、ユーザ論理の論理演算は、合成可能タスクの主要実施例である。これらは、回路内で作動することが意図され、通常、合成される。ＶＬＩＷプロセッサ要素は、これらの論理演算を効率的にシミュレートするように設計される。一方、合成不可能タスクの実施例は、多くの行動モデル（ユーザメモリモデル等）、多くのテストベンチ機能（初期化、繰り返し、非終、無限ループ、イベント、リアル、時間、フォーク、結合、手続き指定、特定の演算子等）、およびシミュレーションの全体制御（＃遅延、不完全感度リスト、非局所参照、行動制御等）を含む。典型的には、合成可能および合成不可能タスクの両方が、チップ設計をシミュレートするために必要とされる。その結果、ＶＬＩＷプロセッサ要素を使用して、合成可能タスクの実行を加速する一方、同時に、合成不可能タスクの効率的実行をサポートする（例えば、例外ハンドラによって）上述のアプローチは、全体論理シミュレーションを大幅に加速することが可能である。
【００１２】
ある特定の実装では、論理シミュレーションシステムは、ホストコンピュータにプラグインされる、プリント基板（Ｐｒｉｎｔｅｄ  Ｃｉｒｃｕｉｔ  Ｂｏａｒｄ；ＰＣＢ）上に実装される専用ハードウェアシミュレータとして実装される。専用ハードウェアシミュレータは、ＶＬＩＷ命令ワードを格納するためのプログラムメモリと、他の情報間のデータを格納するための記憶メモリと、ＶＬＩＷシミュレーションプロセッサとを含む。ＶＬＩＷシミュレーションプロセッサは、１つのチップとして実装される一方、プログラムメモリおよび記憶メモリは、ＰＣＢ上に別個の（メモリ）チップとして実装される。このアーキテクチャ内では、例外ハンドラは、概して、行動プリミティブ（ＶＬＩＷシミュレーションプロセッサとともにチップ上に、またはＰＣＢ上に実装される）、あるいは内蔵行動（ホストＣＰＵベースまたはホストプログラムベースである）として分類可能である。ある実装では、例外ハンドラは、ＶＬＩＷシミュレーションプロセッサのための特別なオペコードによってトリガされる。例えば、特定のフィールドオーバーロードは、種々の例外ハンドラをトリガするように定義されてもよい。
【００１３】
加えて、より複雑なシミュレーションは、典型的には、分岐を通して実現される、より複雑な種類の動的またはランタイム制御を必要とする場合が多い。ドメインは、分岐を実装するために使用される。実行される全体タスクは、ドメインと称される命令またはタスクのグループに細分される。ドメインは、１つのドメインから次のドメインに分岐することによって、ランタイムで互いに接続可能であって、次のドメインは、特定の条件（条件付き分岐）に依存し得る。また、ループ、ｉｆ−ｔｈｅｎ、およびケースステートメントも実装可能である。上述のＶＬＩＷアーキテクチャでは、プログラムカウンタ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ；ＰＣ）レジスタは、ＶＬＩＷプロセッサにストリームされる次の命令のプログラムメモリ内のアドレスをポイントする。分岐は、プログラムメモリのための新しいアドレスを有するＰＣレジスタを単にロードすることによって実装可能である（自動的に、ＰＣレジスタをインクリメントせずに）。条件付き分岐（多重分岐も同様）は、ＰＣレジスタのための新しいアドレスを条件の評価に依存させることによって、実装可能である。
【００１４】
分岐コマンドは、特別なオペコード、例えば、フィールドオーバーロードとしてエンコード可能である。ＶＬＩＷシミュレーションプロセッサがこの特別なオペコードを受信すると、これによって、新しいアドレスのＰＣレジスタへのロードがトリガされる。多くの種類の分岐が実装可能である。例えば、ＪＵＭＰコマンドは、グローバル（提供されるアドレスが、ＰＣレジスタ内にロードされるグローバルアドレスである場合）または相対（提供されるアドレスが、現在のＰＣレジスタをインクリメントまたはデクリメントする量である場合）であることが可能である。また、ＪＵＭＰコマンドは、条件付きまたは無条件であることが可能である。無条件ＪＵＭＰでは、新しいアドレスは、常に、ＰＣレジスタ内にロードされる。条件付きＪＵＭＰでは、アドレスのロードは、条件の評価に依存する。その条件は、前サイクルにおいて評価され得る。代替として、同一サイクルにおいて、同一プロセッサ要素または異なるプロセッサ要素（ＶＬＩＷシミュレーションプロセッサは、典型的には、多数の並列プロセッサ要素を有することを想起されたい）によって評価され得る。実際、多重ＪＵＭＰ（例えば、ＣＡＳＥステートメント）は、ケースのそれぞれを複数の処理要素に同時に評価させることによって、ＴＲＵＥであるケースにＪＵＭＰを実行させるように、単一サイクルで実装され得る。
【００１５】
この概念は、実行をさらに最適化するために拡張可能である。特定のコードセクションは、異なるバリアントにコンパイル可能であり得、それぞれ、特定のケースにおいてより効率的に実行し得る。例えば、コードのピースが、その中にループを有する場合、ループの反復数Ｎが小さい場合、ループを展開し、ループ本体をＮ回再現するだけでより効率的となり得る。一方、Ｎが大きい場合、ループをコールとして実装し、「サブルーチン」（ループ本体）からリターンし、その後、条件付きテストを行うことがより効率的となり得る。コンパイラは、両方のバリアントを生成し、次いで、Ｎが小さい場合、展開バリアントを、Ｎが大きい場合、サブルーチン起動バリアントを選択する分岐命令を含むことが可能である。
【００１６】
また、上述の命令キャッシュレスＶＬＩＷアーキテクチャは、割り込みジャンプをサポート可能である。割り込みジャンプは、ドメインの中間へのジャンプである（常に、最初からドメインに侵入する場合と対照的である）。リターンは、割り込みジャンプの特別なケースであって、呼び出しドメインから起動されたドメインを呼び出しドメインにリターンさせる。割り込みジャンプは高価であるため、割り込みジャンプ（および概して、反復）は、概して、従来のＶＬＩＷアーキテクチャに回避される。実際、多くの技術は、割り込みジャンプを回避するように開発されてきており、静的にスケジュールされたＶＬＩＷアーキテクチャでは、可能ですらない。従来のＶＬＩＷでは、一時変数の状態を考慮しなければならないため、割り込みジャンプは、命令キャッシュ同期化問題によりコストがかかる。
【００１７】
しかしながら、上述のアーキテクチャでは、割り込みジャンプは、相対的に、効率的に実装可能である。上述のように、キャッシュ同期化は、命令キャッシュレスアーキテクチャに対し重要な問題ではない。一時変数に関し、あるアプローチでは、スケジューラは、単に一時データを無効にし、親ドメインのための一時データの再ロードを行い、既にスケジュールされている並列演算を再計算する。これは、実際、単一プロセッサがスタックを有していない場合の動作に類似する。代替アプローチでは、被起動ドメインは、一時データを削除することはできない。保存しなければならない。既に使用されているスクラッチパッドの再使用もできない。利用可能な空のスロット内で動作しなければならない。第３のアプローチでは、分岐命令は、分岐が生じない場合になり得る同一状態に一時データを同期化する条件に基づいて、自由に動作可能である。本ＶＬＩＷアーキテクチャでは、正しくあるために過度の記録アルゴリズムを必要とする第１の前述のアプローチと対照的に、これは、アーキテクチャ現象であるため、この同期化は、プログラムおよび一時的コンテンツを配慮せずに、行うことが可能である。追加の利点は、これらの後者の２つのアプローチのいずれも、ＶＬＩＷシミュレーションプロセッサへのハードウェア変更を伴わずに実装可能であって、コンパイラは、任意の所与の状況に対しより優れたアプローチを選択可能であることである。
【００１８】
合成不可能タスクおよび分岐の効率的サポートの利点の１つは、コンパイラが、より大きな領域を生成可能であって、概して、より効率的スケジューリングとなることである。ＶＬＩＷスケジューリングは、概して、領域形成およびスケジュール構成を含む。従来、領域は、最初からのみ侵入可能なドメインのグループである。領域形成は、プログラム／設計を領域に分割するステップと、領域内の命令の実行を並列化するステップとを含む。スケジュール構成は、領域のためのスケジューリングを圧縮するステップ（すなわち、プログラム／設計をスケジューリング）と、プログラム／設計内の領域を接続するステップ（すなわち、制御論理の追加）とを含む。
【００１９】
従来のＶＬＩＷアーキテクチャは、割り込みジャンプに関し困難点を有しており、同期化問題のため、典型的には、領域（または、論理シミュレーション加速の用語では、合成不可能タスクの実行のための基本ブロック）内への割り込みジャンプをサポートしない。多くの技術が提案されているが、本発明者らが知る限り、いずれも、領域内への任意の割り込みを可能としない。その結果、割り込みジャンプまたは合成不可能タスクに遭遇する場合、従来のＶＬＩＷスケジューラは、典型的には、プログラムを別個の領域に分割しなければならない。しかしながら、上述のＶＬＩＷアプローチは、これらの両方を処理可能であって、その結果、対応するスケジューラは、より大きな領域を生成することが可能でとなり、より優れたスケジューリング効率（すなわち、より優れた命令レベル並列度）となる。実際、領域は、複数の割り込み点によって有効化される任意の境界を形成可能であって、コンパイラ最適化は、さらなる効率のために適用可能である。これは、従来のＶＬＩＷスケジューリングから大きく逸脱するものであって、静的または動的に実行されるかにかかわらず、より高レベルのＩＬＰ（ｉｎｓｔｒｕｃｔｉｏｎ  ｌｅｖｅｌ  ｐａｒａｌｌｅｌｉｓｍ；命令レベル並列度）をもたらす。
【００２０】
領域形成は、スケジュール命令と制御命令との間のトレードオフの生成としてみなされ得る。スケジュール命令は、異なるドメイン（実行ドメインと称される）として考えられ、制御命令は、種々のジャンプ命令として考えられ得る。従来のＶＬＩＷスケジューリングでは、制御命令は、領域を複数の小領域に分割させる（例えば、キャッシュコヒーレンス問題を回避するため）。しかしながら、概して、ＶＬＩＷスケジューリングのための計算効率を増加させるために、領域のサイズを拡大することが望ましい。対照的に、本アーキテクチャ下では、ＶＬＩＷプロセッサは、各命令を直接オフチップメモリから読み出す。オンチップ命令キャッシュが削除されているため（したがって、また、キャッシュコヒーレンス問題）、これによって、ほぼコストをかけずに、１つの実行ドメインから別の実行ドメインへのジャンプのスケジューリングを可能にする。言い換えると、ＶＬＩＷ効率は、実行ドメインのサイズにそれほど依存しない。領域は、多くの実行ドメインから成ることが可能である。このケースでは、実行ドメインを通過するパスであるトレースは、動的制御下、偶然作動されるトレースのみ実行するために動的に調節可能である。すべての他のトレースは、実行されない。
【００２１】
従来のＶＬＩＷ領域拡張技術が、領域のサイズを拡大するために適用可能である。しかしながら、他の領域拡張技術（従来のＶＬＩＷスケジューリングに必ずしも適用可能ではない）を、この特定のＶＬＩＷプロセッサアーキテクチャ内の処理要素の数の増加に伴ってさらに使用可能である。概して、拡張技術は、ループ展開等のより高いＶＬＩＷ効率を可能にする。しかしながら、多数のプロセッサによって、ｉｆまたはｅｌｓｅの実行ドメインにジャンプ（制御フローマッピング）するよりも、時として、ｉｆ−ｔｈｅｎ−ｅｌｓｅ構文の両式を計算すること（ｉｆ変換）が良い場合がある。あるケースでは、基本ブロックジャンプおよび分岐がスケジュールされた場合、ＶＬＩＷプロセッサの完全効率が達成されない場合がある。
【００２２】
上述の説明では、全プロセッサ要素は、プログラムメモリ内の同一アドレスからストリームされた命令を受信すると仮定された。これは、説明を明確にするためになされたものであるが、必要ではない。別の側面では、マルチスレッディングをサポート可能である。ある実装では、プログラムメモリへのアクセスは、並列に作用する複数のメモリコントローラによって実装され、各メモリコントローラは、プロセッサ要素の特定のグループのための命令ワードを抽出する。各メモリコントローラは、プログラムメモリ内の異なる場所から命令ワードを抽出可能であって、したがって、マルチスレッド演算を可能にする。
【００２３】
本発明の他の側面は、上述のアプローチに対応する方法、装置、システム、およびアプリケーションを含む。本発明のさらなる側面は、上述のＶＬＩＷ技術を含むが、論理シミュレーション以外のアプリケーションにも適用される。
【発明を実施するための最良の形態】
【００２４】
本発明は、付随の図面に関連してなされる、発明を実施するための最良の形態および添付の請求項からより容易に明白となる、他の利点および特性を有する。
【００２５】
図面は、説明のみを目的として、本発明の実施形態を図示する。当業者は、本願に記載の本発明の原理から逸脱することなく、本願に示される構造および方法の代替実施形態が採用され得ることを本議論から容易に理解されるであろう。
【００２６】
（概要）
１．システムアーキテクチャ
１．Ａ．概要
１．Ｂ．シミュレーションプロセッサ
１．Ｃ．ＰＥオプコード
１．Ｄ．イベント駆動およびサイクルベースシミュレータ
１．Ｅ．クロックドメイン
２．合成不可能タスク
３．例外ハンドラ
３．Ａ．拡張アーキテクチャ
３．Ｂ．ループバック例外ハンドラ
３．Ｃ．例外ハンドラ起動のためのオプコード
３．Ｄ．オンチップベース、オンＰＣＢベース、ホストＣＰＵベース、およびホストプログラムベース例外ハンドラ
３．Ｅ．行動プリミティブおよび内蔵行動
４．分岐
４．Ａ．ＪＵＭＰオプコード
４．Ｂ．待機時間
４．Ｃ．スタックレスおよびスタック演算
４．Ｄ．分岐を使用するドメイン実装
４．Ｅ．一部の実施例
４．Ｆ．多重分岐および制御変数解析
５．複合実行ドメイン
５．Ａ．合成不可能タスクおよび分岐
５．Ｂ．例示的実行ドメイン
５．Ｃ．例示的クロックドメイン構成
６．ＶＬＩＷコンパイルおよびスケジューリング
６．Ａ．概要
６．Ｂ．領域拡大
６．Ｃ．動的条件を含む、インライン展開、起動、または展開
６．Ｄ．行動マッピングのための合成拡張
６．Ｅ．並列化
６．Ｆ．スケジュール構成：コンパクション、制御、および構成
６．Ｇ．要約
７．マルチスレッディング
７．Ａ．アーキテクチャ拡張
７．Ｂ．分岐のためのマルチスレッドサポート
８．従来のＶＬＩＷ命令との比較による差異
８．Ａ．アーキテクチャ特性
８．Ｂ．利点
９．さらなる実施例
（詳細な開示）
（１．システムアーキテクチャ）
（１．Ａ．概要）
図１は、本発明の一実施形態による、ハードウェア加速論理シミュレーションシステムを示すブロック図である。論理シミュレーションシステムは、専用ハードウェア（Ｈａｒｄｗａｒｅ；ＨＷ）シミュレータ１３０と、コンパイラ１０８とＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ；アプリケーションプログラミングインターフェース）１１６とを含む。ホストコンピュータ１１０は、ＣＰＵ１１４と、メインメモリ１１２とを含む。ＡＰＩ１１６は、それによってホストコンピュータ１１０がハードウェアシミュレータ１３０を制御する、ソフトウェアインターフェースである。専用ＨＷシミュレータ１３０は、プログラムメモリ１２１と、記憶メモリ１２２と、シミュレーションプロセッサ１００（プロセッサ要素１０２、内蔵ローカルメモリ１０４と、ハードウェア（ＨＷ）メモリインターフェースＡ１４２と、ハードウェア（ＨＷ）メモリインターフェースＢ１４４とを含む）とを含む。
【００２７】
図１に示されるシステムは、以下のように動作する。コンパイラ１０８は、ユーザチップまたは設計の記述１０６、例えば、ＲＴＬ（レジスタ転送言語；Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌａｎｇｕａｇｅ）記述または設計のネットリスト記述を受信する。記述１０６は、典型的には、チップ内の論理機能（すなわち、ユーザ論理）およびオンチップメモリ（すなわち、ユーザメモリ）の両方の記述を含む。記述１０６は、典型的には、有向グラフとしてユーザ論理設計を表し、グラフのノードは、設計内のハードウェアブロックに対応し、典型的には、行動または機能（すなわち、合成不可能）記述（合成可能記述もまた処理可能であるが）によって、ユーザメモリを表す。コンパイラ１０８は、設計の記述１０６をプログラム１０９にコンパイルする。プログラムは、ユーザ論理をシミュレートする命令と、ユーザメモリをシミュレートする命令とを含む。命令は、典型的には、ユーザ論理の機能をシミュレートするために、設計１０６内のユーザ論理をシミュレーションプロセッサ１００内のプロセッサ要素１０２に対しマッピングする。命令は、典型的には、設計１０６内のユーザメモリを記憶メモリ１２２内の場所に対しマッピングする。コンパイラ１０８によって受信される記述１０６は、典型的には、チップまたは設計自体のみ以上のものを表す。また、多くの場合、シミュレーション目的のための設計をシミュレートするために使用されるテスト環境（すなわち、テストベンチ）を表す。システムは、チップ設計およびテストベンチの両方をシミュレートするように設計可能である（テストベンチが、ユーザメモリのブロックを必要とするケースを含む）。
【００２８】
例示的コンパイラ１０８のさらなる説明は、２００３年６月５日公開の米国特許出願公開第２００３／０１０５６１７Ａｌ号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｓｉｍｕｌａｔｉｏｎ」を参照されたい（参照することによって本願に援用される）。特に、段落１９１−２５２および対応する図を参照されたい。プログラム１０９内の命令は、最初、メモリ１１２内に格納される。
【００２９】
シミュレーションプロセッサ１００は、ユーザ論理の論理ゲートをシミュレートするための複数のプロセッサ要素１０２と、プロセッサ要素１０２のための命令および／またはデータを格納するためのローカルメモリ１０４とを含む。ある実施形態では、ＨＷシミュレータ１３０は、ＨＷシミュレータ１３０が、自然に、任意の一般的計算システム、ホストコンピュータ１１０に接続されるように、ＰＣＩ（周辺装置相互接続；Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）とＤＭＡ（ダイレクトメモリアクセス；Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）コントローラとを有するＦＰＧＡ（フィールドプログラマブルゲートアレイ；Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）を使用して、一般的ＰＣＩ基板上に実装される。シミュレーションプロセッサ１００は、ＨＷシミュレータ１３０の一部を形成する。シミュレーションプロセッサ１００は、ホストコンピュータ１１０のメインメモリ１１２への直接アクセスを有し、その演算は、ＡＰＩ１１６を介してホストコンピュータ１１０によって制御される。ホストコンピュータ１１０は、メインメモリ１１２とＨＷシミュレータ１３０上のメモリ１２１、１２２との間のダイレクトなＤＭＡ転送が可能であるが、メインメモリ１１２とメモリ１２２との間のＤＭＡはオプションであってもよい。
【００３０】
ホストコンピュータ１１０は、ユーザと、コンパイラ１０８によって生成されるプログラム１０９とによって指定されるシミュレーションベクタ（図示せず）を入力として受け取り、シミュレーションプロセッサ１００のための広範なレベルの命令１１８を生成する。シミュレーションベクタ（図示せず）は、シミュレートされるネットリスト１０６の入力値を含む。広範なレベルの命令１１８は、ＤＭＡによって、メインメモリ１１２からＨＷシミュレータ１３０のプログラムメモリ１２１に転送される。記憶メモリ１２２は、ユーザメモリデータを格納する。シミュレーションベクタ（図示せず）および結果１２０は、ホストコンピュータ１１０による転送のために、プログラムメモリ１２１または記憶メモリ１２２内に格納可能である。
【００３１】
メモリインターフェース１４２、１４４は、プロセッサ要素１０２のためのインターフェースを提供し、それぞれメモリ１２１、１２２にアクセスする。プロセッサ要素１０２は、命令１１８を実行し、ある時点で、またＤＭＡによって、シミュレーション結果１２０をホストコンピュータ１１０にリターンする。中間結果は、次の命令による使用のために、コンピュータ上に保持されてもよい。全命令１１８の実行によって、１つのシミュレーションベクタに対するネットリスト１０６全体をシミュレートする。
【００３２】
（１．Ｂ．シミュレーションプロセッサ）
図２は、本発明の一実施形態による、ハードウェア加速シミュレーションシステム内のシミュレーションプロセッサ１００を示すブロック図である。シミュレーションプロセッサ１００は、相互接続システム１０１を介して互いに通信する、ｎ個のプロセッサユニット１０３Ａ〜１０３Ｋ（同様に、Ｕ１、Ｕ２、…ＵＫとラベル表示される）を含む。この実施例では、相互接続システムは、非ブロッキングクロスバーである。各プロセッサユニットは、クロスバーから最大２つの入力を受け取り、したがって、ｎ個のプロセッサユニットに対し、２ｎ入力信号が利用可能となり、２ｎ信号（スラッシュを有する内向き矢印によって示される）から入力信号を選択可能である。各プロセッサユニットは、クロスバー（外向き矢印によって示される）に対し最大２つの出力を生成可能である。ｎ個のプロセッサユニットに対し、これは、２ｎ出力信号を生成する。したがって、クロスバーは、２ｎ（プロセッサユニットからの出力）×２ｎ（プロセッサユニットへの入力）クロスバーとなり、各プロセッサユニット１０３のそれぞれの入力を任意のプロセッサユニット１０３の真意の出力に結合可能とする。このように、１つのプロセッサユニットによって計算される中間値は、任意の他のプロセッサユニットによる計算のための入力としての使用に利用可能となる。
【００３３】
それぞれ２つの入力を有する、ｎ個のプロセッサユニットを含むシミュレーションプロセッサ１００に対し、２ｎ信号は、非ブロッキングアーキテクチャのためのクロスバーにおいて選択可能でなければならない。各プロセッサユニットが同一の場合、それぞれ、好ましくは、２つの変数をクロスバーに供給するであろう。これは、２ｎ×２ｎ非ブロッキングクロスバーをもたらす。しかしながら、このアーキテクチャは、必須ではない。ブロッキングアーキテクチャ、不均質アーキテクチャ、最適化アーキテクチャ（特定の設計スタイルのため）、共有アーキテクチャ（プロセッサユニットは、アドレスビットを共有するか、あるいはクロスバーへの入力または出力行を共有する）は、非ブロッキング２ｎ×２ｎクロスバー以外の相互接続システム１０１が好ましい一部の実施例である。
【００３４】
プロセッサユニット１０３のそれぞれは、プロセッサ要素（ＰＥ）３０２と、ローカルキャッシュ３０８（一部の実装においてシフトレジスタとして実装される）と、その専用ローカルメモリとして、ローカルメモリ１０４の対応する部分３２６とを含む。各プロセッサユニット１０３は、ユーザ論理の少なくとも１つの論理ゲートをシミュレートし、シミュレーションの際の中間または最終のシミュレーション値を格納するように構成可能である。また、プロセッサユニット１０３は、マルチプレクサ３０４、３０６、３１０、３１２、３１４、３１６、３２０と、フリップフロップ３１８、３２２とを含む。プロセッサユニット１０３は、ＶＬＩＷ命令１１８によって制御される。この実施例では、ＶＬＩＷ命令１１８は、各プロセッサユニット１０３に対し１つの個々のＰＥ命令２１８Ａ〜２１８Ｋを含む。
【００３５】
ＰＥ３０２は、２つまたはそれ以下の入力（例えば、ＮＯＴ、ＡＮＤ、ＮＡＮＤ、ＯＲ、ＮＯＲ、ＸＯＲ、定数１、定数０等）によって、任意の論理ゲートをシミュレートするように構成可能である、設定可能なＡＬＵ（算術論理演算；Ａｒｉｔｈｍｅｔｉｃ  Ｌｏｇｉｃ  Ｕｎｉｔ）である。ＰＥ３０２がシミュレートする論理ゲートの種類は、ＰＥ３０２を特定の種類の論理ゲートをシミュレートするようにプログラムするＰＥ命令２１８に依存する。
【００３６】
マルチプレクサ３０４および３０６は、ＰＥ命令２１８内の選択信号に応じて、クロスバー１０１の２ｎバスラインの１つから入力データを選択する。図２の実施例では、各プロセッサユニット１０３のためのマルチプレクサ３０４、３０６のそれぞれは、２ｎバスラインのうちのいずれかを選択可能である。データがクロスバー１０１ではなく記憶メモリ１２２から読み出される場合、マルチプレクサ３０４、３０６は、記憶メモリ１２２（図２に図示せず）から（直接または間接的に）もたらされる入力行を選択するように作動される。このように、記憶メモリ１２２からのデータは、プロセッサユニットに提供可能である。
【００３７】
ＰＥ３０２の出力は、クロスバー１０１（マルチプレクサ３１６およびフリップフロップ３１８を介して）、ローカルキャッシュ３０８、または専用ローカルメモリ３２６にルーティング可能である。ローカルキャッシュ３０８は、シフトレジスタとして実装され、生成される中間値を格納する一方、シミュレーションプロセッサ１００内のＰＥ３０２は、複数のサイクル内の論理設計１０６の多数のゲートをシミュレートする。
【００３８】
ローカルキャッシュ３０８の出力側において、マルチプレクサ３１２および３１４は、ＰＥ命令２１８の関連フィールド内に指定されるローカルキャッシュ３０８のメモリセルのうちの１つを選択する。マルチプレクサ３１６および３２０の状態に応じて、選択された出力は、プロセッサユニット１０３のデータ入力による消費のために、クロスバー１０１にルーティング可能である。
【００３９】
専用ローカルメモリ３２６は、ローカルキャッシュ３０８だけで処理できるものよりも非常に大きな設計の処理が可能である。ローカルメモリ３２６は、その制限サイズのためにローカルキャッシュ３０８が溢れることを許すために、データを格納するため、入力ポートＤＩと出力ポートＤＯとを有する。言い換えると、ローカルキャッシュ３０８内のデータは、メモリ３２６からロードし、および／またはそこへ格納されてもよい。格納される中間信号値の数は、メモリ３２６の総合サイズによって制限される。メモリ３２６は、相対的に安価かつ高速であるため、このスキームは、論理シミュレーションのためのスケーラブル、高速、かつ安価なソリューションを提供する。メモリ３２６は、ＰＥ命令２１８内のフィールドによってアドレス指定される。
【００４０】
入力ポートＤＩは、ＰＥ３０２の出力を受信するように結合される。別個のデータパスでは、ローカルキャッシュ３０８に転送される値は、続いて、ローカルキャッシュ３０８からクロスバー１０１に出力し、次いで、ＰＥ３０２を介してメモリ３２６に再入力することによって、メモリ３２６に移動可能である。出力ポートＤＯは、クロスバー１０１への可能性のある表示のため、マルチプレクサ３２０に結合される。
【００４１】
また、専用ローカルメモリ３２６は、第２の出力ポート３２７を有し、記憶メモリ１２２およびプログラムメモリ１２１の両方にアクセス可能である。本願は、ポート３２７とプログラムメモリ１２１との間のデータワード５４０の読み込みおよび書き込みにより焦点を当てる。記憶メモリ１２２へのデータワード５４０の読み込みおよび書き込みの詳細は、例えば、ＶｅｒｈｅｙｅｎおよびＷａｔｔによる２００５年１２月１日出願の米国特許出願第１１／２９２，７１２号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｓｉｍｕｌａｔｉｏｎ  ｏｆ  Ｌｏｇｉｃ  ａｎｄ  Ｍｅｍｏｒｙ」を参照されたい（参照することによって本願に援用される）。
【００４２】
プロセッサユニット１０３の種々の側面のさらなる詳細および実施例は、例えば、２００５年９月２８日出願の米国特許出願第１１／２３８，５０５号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｌｏｇｉｃ  Ｓｉｍｕｌａｔｉｏｎ  Ｕｓｉｎｇ  Ｓｈｉｆｔ  Ｒｅｇｉｓｔｅｒ  ａｓ  Ｌｏｃａｌ  Ｃａｃｈｅ」、２００５年１１月３０日出願の米国特許出願第１１／２９１，１６４号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｌｏｇｉｃ  Ｓｉｍｕｌａｔｉｏｎ  Ｕｓｉｎｇ  Ｓｈｉｆｔ  Ｒｅｇｉｓｔｅｒ  ａｓ  Ｌｏｃａｌ  Ｃａｃｈｅ  ｗｉｔｈ  Ｐａｔｈ  ｆｏｒ  Ｂｙｐａｓｓｉｎｇ  Ｓｈｉｆｔ  Ｒｅｇｉｓｔｅｒ」、２００５年１２月１日出願の米国特許出願第１１／２９２，７１２号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｓｉｍｕｌａｔｉｏｎ  ｏｆ  Ｌｏｇｉｃ  ａｎｄ  Ｍｅｍｏｒｙ」、および２００６年１０月２３日出願の米国特許出願第１１／５５２，１４１号「ＶＬＩＷ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  Ｕｓｉｎｇ  Ｍｕｌｔｉ−Ｓｔａｔｅ  Ｌｏｇｉｃ」を参照されたい。上述のすべての教示は、参照することによって本願に援用される。
【００４３】
（１．Ｃ．ＰＥオプコード）
この例示的実装では、ＰＥオペコード２１８は、以下の形式を有する。
【００４４】
Ｐ０｜Ｐｌ｜ＥＮ｜ブール関数｜ＸＢ０｜ＸＢ１｜ＸＭ
Ｐ０およびＰｌは、クロスバー１０１からのどの入力が、それぞれマルチプレクサ３０４および３０６によって選択され、そして、ＰＥ３０２へ入力するかを決定しフィールドである。ブール関数は、ＰＥ３０２によって実装される論理ゲートを決定する。ＥＮは、どの入力がマルチプレクサ３１０、３１６、および３２０によって選択されるかを決定する。ＸＢ０、ＸＢ１、およびＸＭ（Ｘｔｒａ  Ｍｅｍ）は、アドレスである。マルチプレクサ３１６および３２０が、シフトレジスタ（マルチプレクサ３１２および３１４を介して）からデータを受信している場合、ＸＢ０およびＸＢ１は、マルチプレクサ３１２および３１４への選択入力として使用される。データが、ローカルメモリ３２６からロードされる、またはそこに格納されている場合、メモリ３２６内の関連アドレスは、フィールドＸＢ０、ＸＢ１、およびＸＭによって決定される。
【００４５】
あるアプローチでは、ＥＮフィールドは、ＰＥ３０２の４つの動作モード（Ｅｖａｌｕａｔｉｏｎ、Ｎｏ−ｏｐ、Ｌｏａｄ、またはＳｔｏｒｅ）のうちの１つを決定する。Ｅｖａｌｕａｔｉｏｎモードの主要機能は、ＰＥ３０２が論理ゲートをシミュレートすることである（すなわち、２つの入力を受信し、２つの入力上の特定の論理機能を行い、出力を生成する）。故に、このモードでは、マルチプレクサ３１０は、ＰＥ３０２の出力を選択し、マルチプレクサ３１６は、マルチプレクサ３１２の出力を選択し、マルチプレクサ３２０は、マルチプレクサ３１４の出力を選択し、ＸＢ０およびＸＢ１は、マルチプレクサ３１２および３１４への入力として使用される（シフトレジスタ３０８へのアドレスとして）。その結果、ＰＥ３０２は、マルチプレクサ３０４および３０６によって出力される入力オペランドに基づいて論理ゲートをシミュレートし、中間値をシフトレジスタ３０８内に格納し、この中間値は、最終的に、他のプロセッサユニット１０３による使用のために、クロスバー１０１に出力される。同時に、マルチプレクサ３１２および３１４は、次のサイクルにおけるプロセッサユニットへの入力として使用するためのシフトレジスタ３０８からエントリを選択可能である。
【００４６】
Ｎｏ−ｏｐモードでは、ＰＥ３０２は、演算を行わない。例えば、他のプロセッサユニットが、このシフトレジスタ３０８からのデータに基づいて機能を評価しているが、このＰＥがアイドリング状態の場合、このモードは、有用である場合がある。このモードでは、マルチプレクサ３１０は、シフトレジスタ３０８の最終エントリを選択し、マルチプレクサ３１６、３２０およびＸＢ０、ＸＢ１は、Ｅｖａｌｕａｔｉｏｎモードの場合と同じく使用される（すなわち、マルチプレクサ３１２および３１４への入力として）。Ｎｏ−ｏｐモードの際、ＰＥ３０２は、いずれのゲートもシミュレートしない一方、シフトレジスタ３０８の最終エントリがシフトレジスタ３０８の第１のエントリに再循環されるように、シフトレジスタ３０８は、リフレッシュされる。同時に、データは、マルチプレクサ３１２および３１４を介して、シフトレジスタ３０８から読み出し可能である。
【００４７】
Ｌｏａｄモードの主要機能は、ローカルメモリ３２６からデータをロードすることである。ここで、マルチプレクサは、フィールドＸＢ０、ＸＢ１、およびＸＭによって決定されるアドレスにおけるローカルメモリ３２６内のデータが、マルチプレクサ３２０を介してロード可能であって、ＰＥ３０２が、同時に、マルチプレクサ３０４および３０６からの出力に基づいてシミュレーションを行うように設定される。このモードの際、データは、プロセッサユニットによる使用のために、メモリ３２６からクロスバー１０１へロード可能であって、同時に、ＰＥ３０２は、論理機能の評価を行い、シフトレジスタ３０８内に結果を格納可能であることに留意されたい。多くの代替アプローチでは、ＰＥによる評価およびメモリからのロードは、本願におけるケースのように、同時に行うことは不可能である。この実施例では、ローカルメモリ３２６からのデータのロードは、ＰＥ３０２の演算をブロックしない。
【００４８】
Ｓｔｏｒｅモードの主要機能は、ローカルメモリ３２６へのデータの格納である。このモードでは、ローカルメモリ３２６は、フィールドＸＢ０、ＸＢ１、およびＸＭによってアドレス指定される。したがって、Ｓｔｏｒｅモードの際、ＰＥ３０２の出力は、ローカルメモリ３２６内に格納可能である。また、Ｓｔｏｒｅモードも、ＰＥ３０２の演算をブロックしない。ＰＥ３０２は、論理機能を評価可能であって、結果値は、ローカルメモリ３２６に直ぐに格納可能である。また、マルチプレクサ３１６を介して、クロスバー１０１にも利用可能である。
【００４９】
図２に示されるアーキテクチャの利点の１つは、ＬｏａｄおよびＳｔｏｒｅモードが、ＰＥ３０２の演算をブロックしないことである。つまり、Ｌｏａｄモードは、より適切には、ＬｏａｄおよびＥｖａｌｕａｔｉｏｎモードとして称され、Ｓｔｏｒｅモードは、より適切には、ＳｔｏｒｅおよびＥｖａｌｕａｔｉｏｎモードとして称され得る。これは、論理シミュレーションにとって重要である。論理シミュレーションは、特定の数のゲートのシミュレーションを必要とする。したがって、より迅速に評価を行うことが可能であれば、より早く論理シミュレーションを完了することが可能である。単一サイクル内におけるロード／格納および評価をサポートすることは、ロード／格納が１つのサイクルを必要とし、評価が別個のサイクルを必要とするアプローチと比較して、大幅な速度アップとなる。
【００５０】
（１．Ｄ．イベント駆動およびサイクルベースシミュレータ）
シミュレータは、イベント駆動またはサイクルベースであることが可能である。イベント駆動シミュレータは、シミュレーションの状態が、論理ゲートの評価に影響を及ぼし得るように変化する場合、例えば、論理ゲートへの入力が値を変える場合、または別様に論理ゲートに影響を及ぼし得る変数（例えば、トライステートイネーブル）が値を変える場合、論理ゲート（または、ステートメントのブロック）を評価する。この値の変化は、イベント呼ばれる。サイクルベースのシミュレータは、クロックドメインに従って回路を分割し、クロックの各トリガエッジにおいて一度、クロックドメイン内のサブ回路を評価する。したがって、イベント数は、シミュレータの稼働速度に影響する。低イベント数の回路は、イベント駆動シミュレータ上でより高速に稼働するが、高イベント数の回路は、サイクルベースのシミュレータ上でより高速に稼働する。実際は、ほとんどの回路は、サイクルベースのシミュレータが、イベント駆動のシミュレータよりも稼動で優るだけの十分なイベント数を有している。以下の説明は、最初に、現在のアーキテクチャのサイクルベースのシミュレータをマッピングするための使用方法を説明し、次いで、イベント駆動シミュレータを処理するための制御フローの実装方法を説明する。
【００５１】
典型的には、ホストＣＰＵ１１４上で稼働するソフトウェアシミュレータは、どの論理回路の部分がハードウェアアクセラレータ１３０によってシミュレートされるかを制御する。ハードウェアアクセラレータ１３０上にマッピングされる論理は、ソフトウェアシミュレータ内のブラックボックスとしてみなされ得る。ハードウェアアクセラレータ上にマッピングされた論理への接続性は、このブラックボックスを介して接続する入力および出力信号を通してモデル化することが可能である。これは、同様に、内部および外部信号の両方に対しモデル化される。すなわち、全内部信号（例えば、「プローブ」）はまた、ブラックボックスのための入力および出力信号として抽出される。便宜上、これらの信号は、ブラックボックスのための主要入力（Ｐｒｉｍａｒｙ  Ｉｎｐｕｔ；ＰＩ）および主要出力（Ｐｒｉｍａｒｙ  Ｏｕｔｐｕｔ；ＰＯ）と称される。これは、ブラックボックスがチップ設計全体を表す場合、特定のチップ設計の主要入力および主要出力の上位集合である可能性があることに留意されたい。通常、システムタスクおよび他の論理（例えば、アサーション）もまた、含まれ、多くの場合、テストベンチの一部もまた、ブラックボックスに含まれる。
【００５２】
主要入力信号のいずれかがソフトウェアシミュレータにおいて変化する場合、これによって、ブラックボックスに直接影響を及ぼすイベントを生じさせる。ソフトウェアシミュレータは、ブラックボックスインターフェース（この実施例では、ソフトウェアドライバである）に刺激を送信する。ドライバは、このイベントを直接ハードウェアアクセラレータに送信するか、または刺激を蓄積させることが可能である。ハードウェアアクセラレータがサイクルベースの原理で動作する場合、蓄積が生じる。同期クロックドメインに対しては、クロック信号上のイベントだけが、ＰＯ値を計算するためにハードウェアアクセラレータを必要とする。しかしながら、設計内の組み合わせパスに対しては、入力上の任意のイベントが、典型的には、ＰＯ値を計算するためにハードウェアアクセラレータを必要とするであろう。このケースでは、ソフトウェアドライバは、ＰＩ変化をアップデートし、どのクロック信号がイベントを有するかを記録する。現在の時間ステップの評価終了時、シミュレータが次の時間ステップへ移動する前に、ソフトウェアドライバは、再び呼び出されるが、今回は、ブラックボックスのＰＯ値を計算するためである。これは、シミュレーションイベントと称される。典型的には、時点毎に１つのシミュレーションイベントのみ存在するが、組み合わせフィードバックパスが存在する場合、ソフトウェアシミュレータがブラックボックスを再評価することが可能であることに留意されたい。この時点で、ソフトウェアドライバは、変化したクロック信号のリストを分析しており、ハードウェアアクセラレータにそれらのドメインの新しいＰＯ値を計算させる。クロックが変化しない他のドメインは、典型的には、アップデートされる必要はない。これによって、より優れた効率がもたらされる。組み合わせ論理およびクロックドメイン相互作用をサポートするため、クロックイベントにかかわらず評価される、組み合わせクロックドメインが導入される。
【００５３】
各シミュレーションイベントでは、蓄積された変化は、ＤＭＡ法を使用して、メインメモリ１１２からプログラムメモリ１２１にコピーされる。ＤＭＡ完了後、クロックドメインおよびそれらを実行するシーケンスのリストが、ソフトウェアドライバ内に存在する。このリストは、ハードウェアアクセラレータ１３０を起動し、各クロックドメイン（一度に１つのドメイン）のＰＯをアップデートするために使用可能であるか、またはこのリストは、ハードウェアアクセラレータに全体として送信され、所与のシーケンスで一度にすべて、選択されたクロックドメインをハードウェア制御ルーチンに実行させることが可能である。また、それらの組み合わせも可能である。
【００５４】
（１．Ｅ．クロックドメイン）
ある実施形態では、プログラムメモリ１２１は、図３に示されるように配列される。図３は、本発明の一実施形態による、シミュレーションプロセッサ１００による異なるドメインのメモリ配列を示す略図である。上述のように、全命令１１８を実行することによって、１つのシミュレーションベクタに対するネットリスト１０６全体をシミュレートする。しかしながら、ネットリスト１０６全体は、典型的には、ローカルメモリ１０４にロードされず、一度にすべてシミュレートされる。代わりに、シミュレーションは、典型的には、異なるドメインに分割される。次いで、ドメインは、順序通りローカルメモリ１０４にロードされ、ネットリスト全体が、区分的基準（一度に１つのドメイン）に基づいてシミュレートされる。
【００５５】
図３は、チップ設計がクロックドメインに分割され、シミュレーションがサイクルベース（一度に１つのクロックドメイン）で実行される実施例を示す。単一チップは、多くのクロック（外部ソースから受信したクロック、内部で生成されたクロック、および／またはこれらのいずれかから派生したローカルクロック）を使用してもよい。チップ設計内の回路は、回路内のイベントが、同一クロックによって決定される場合、同一クロックドメイン内にある。クロックドメインへの入力は、そのドメインのクロックに同期化されるが、その入力は、ゲートクロックドメインにおいて一般的であるように、他のドメインから供給されることも可能である。図３の実施例では、チップ設計は、ＣＫ１、ＣＫ２等によって示されるいくつかの「ローカル」クロックドメインと、ＧＣＬＫによって示されるグローバルドメインとに分割される。ローカルクロックドメインは、シミュレーションイベント、またはそのクロックドメインのクロックエッジに応じて評価されるチップ設計の一部、である。ＣＫ１ドメインは、ＣＫ１によって時間調節され、ＣＫ１ドメイン内の回路のシミュレーションは、クロックＣＫ１にのみ依存する論理に関連する。したがって、これらのドメインは、「ローカル」である。グローバルドメインＧＣＬＫは、例えば、時間調節が、１つのクロックから異なるクロックへ移行する回路、または例えば、非同期リセット信号等の設計の主要入力から主要出力への組み合わせパス等、２つ以上のクロックドメインにオーバラップするチップ設計の一部を含む。ＣＫ１によって影響を受ける回路のシミュレーションは、典型的には、ＣＫ１ドメインおよびＧＣＬＫドメインのシミュレーションを必要とする。ＣＫ２に対し、ＣＫ２ドメインおよびＧＣＬＫドメイン等のシミュレーションが、典型的には、必要とされる。ＣＫ２がＣＫ１のゲートクロックドメインである場合、クロックＣＫ１がイベントを有し、ゲート論理がＣＫ２をイネーブルし、したがって、ＣＫ２がまた、イベントを有すると、ＣＫ２は評価される必要がある。ＣＫ１およびＣＫ２が同期ドメインである場合、それぞれ、そのイベントが生じると評価される。グローバルＧＣＬＫドメインは、各イベントに応じて評価される。
【００５６】
異なるドメインに関する情報は、プログラムメモリ１２１内に格納される。各ドメインは、命令セット（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ；ＩＳ）と、状態空間（Ｓｔａｔｅ  Ｓｐａｃｅ；ＳＳ）とを有する。命令セットは、そのドメインをシミュレートするために使用される命令１１８のグループである。状態空間は、そのクロックドメイン内の変数の現在の状態である。便宜上、ローカルドメインの状態空間、ＣＫ１ＳＳ、ＣＫ２ＳＳ等は、図３に示されるように、共に格納される。同様に、ローカルドメインの命令セット、ＣＫ１ＩＳ、ＣＫ２ＩＳ等もまた、共に格納される。ＩＳセットは、各ドメインに対する命令であって、典型的には、実行の際に変化しない。典型的には、各ＳＳに対し１つのＩＳセットのみ必要とされるが、複数のセットが、ハードウェア制御ルーチンによって格納および選択されてもよい。例えば、１つのＳＳは、クロック評価、主要出力評価、非同期セット評価、非同期リセット評価、アサーション評価、またはテストコード評価のためのいくつかのＩＳセットによってアクセスされてもよい。ＳＳセットは、各ドメインのためのデータであって、典型的には、ドメインが評価される度に変化する。ＳＳセットの複数のインスタンス（そのドメインのためのシミュレーションにおける各時間ステップに対し１つ）が存在可能であるため、ＳＳセットは、ＩＳセットから別個に格納され、履歴を格納可能にする。この実施例では、プログラムメモリ１２１はまた、主要入力（ＰＩ）と、主要出力（ＰＯ）と、ヘッダとを含む。主要入力は、刺激ベクタを含む。主要出力は、刺激ベクタに対する応答を含む。ヘッダは、各ドメインに適用する別個のヘッダと、メモリ配列に適用するグローバルヘッダとにさらに細分可能である。
【００５７】
特定のクロックドメインのシミュレーションの際、クロックドメインのための状態空間は、ローカルメモリ１０４内に格納され、クロックドメインをシミュレートする命令１１８は、フェッチおよび実行される。図３に示されるように、ローカルメモリ１０４は、典型的には、シミュレートされるローカルクロックドメインの状態空間（ＣＫｎ  ＳＳ）と、グローバルクロックドメインの状態空間（ＧＣＬＫ  ＳＳ）とを含む。また、ローカルメモリ１０４は、ＰＯと、ＰＩと、（随意に）ヘッダと、一時変数、またはチップ設計内のユーザメモリのシミュレーションのために割り当てられるローカルメモリ等の追加データとを含んでもよい。
【００５８】
シミュレーションの際、クロックドメインＣＫｎ（グローバルクロックドメインＧＣＬＫのための命令を含む）をシミュレートするために使用される命令は、ＰＥ１０２によってフェッチおよび実行される。図３は、プログラムメモリ１２１からＰＥ１０２への命令ＣＫｎＩＳｎのフェッチ（４１０−４２０−４２２）を示す。命令の実行は、状態空間を変化させる。クロックドメインのための全命令１１８が実行されると、その時間ステップのクロックドメインのシミュレーションは完了し、修正された状態空間ＣＫｎＳＳは、プログラムメモリ１２１に戻され、格納される（４３２−４３０−４１０）。シミュレートされる次のクロックドメインのための状態空間は、シミュレーションに備え、ローカルメモリ１０４内にロードされる（４１０−４３０−４３２）。このプロセスは、チップのシミュレーションが完了するまで繰り返される。同一クロックドメインは、通常、異なる時刻をシミュレートするために、２回以上ローカルメモリ１０４内にロードされるであろう。
【００５９】
（２．合成不可能タスク）
この実装では、プログラムカウンタ（ＰＣ）レジスタが、プログラムメモリ１２１内のアドレスをポイントし、読み込み命令に基づいて、データは、プログラムメモリ１２１から、プログラムメモリデータバス４１０を介して、ＰＥ命令レジスタアレイ１１８に流れる。次のクロックサイクルのそれぞれにおいて、ＰＥ命令レジスタアレイはリフレッシュされる。ＰＥ命令レジスタアレイは、命令キャッシュの代わりに動作する。命令は、プログラムメモリからサイクル毎にフェッチされ、したがって、ＶＬＩＷシミュレーションプロセッサは、事実上、オンチップ命令キャッシュを有さない、または別様に、非常に大きなオフチップ命令キャッシュを有する。
【００６０】
プロセッサ要素１０２だけに基づくＶＬＩＷアーキテクチャは、タスクがプロセッサ要素によってシミュレート可能な場合であって、プログラム１０９内の命令が、コンパイル時において、効率的に所定の方法でスケジュール可能である場合（例えば、動的ＪＵＭＰ命令を伴わない）には、プログラム１０９（および、記述１０６内のタスク）を実行することに対し効率的なアプローチである。しかしながら、より複雑な記述１０６に対し、そうではない場合が多い。むしろ、記述１０６で表されるタスクは、通常、合成可能または合成不可能かに分類可能である。概して、合成可能タスクは、プロセッサ要素１０２に効率的にマッピング可能なタスクである。
【００６１】
図１の論理シミュレーション実施例では、ユーザ論理は、回路内で作動するよう意図され、通常、合成される論理を反映するので、それは、典型的には、合成可能タスクである。プロセッサ要素１０２は、具体的には、そのようなユーザ論理の論理演算をシミュレートするように設計される。一方、ユーザメモリモデル、多くのテストベンチ機能（初期化、繰り返し、非終、無限ループ、イベント、リアル、時間、フォーク、結合、手続き指定、特定の演算子等）、およびシミュレーションの全体制御（＃遅延、不完全感度リスト、非局所参照、行動制御）等の多くの行動モデルは、典型的には、合成不可能タスクであって、回路内で作動するように意図されていない。これらは、典型的には、プロセッサ要素１０２以外のシミュレーションシステム部分（例えば、ホストコンピュータ１１０によって、記憶メモリ１２２によって、またはシステム内の例外ハンドラによって）によって、より効率的に処理される。例えば、ＩＥＥＥ１３６４および１０７６「Ｓｙｎｔｈｅｓｉｓ  Ｉｎｔｅｒｏｐｅｒａｂｉｌｉｔｙ  Ｓｔａｎｄａｒｄｓ  ｆｏｒ  Ｖｅｒｉｌｏｇ  ａｎｄ  ＶＨＤＬ」を参照されたい（それぞれは、さらなる議論および実施例のため、参照することによって本願に援用される）。加えて、より複雑なプログラム１０９は、多くの場合、分岐を通して実現される、より複雑な種類の動的またはランタイムの制御を必要とするであろう。
【００６２】
合成不可能タスクの実行は、例外ハンドラを介して、効率的に達成可能である。例外ハンドラは、プロセッサ要素１０２によって直接行われることが不可能な、あるいはより便利にまたは外部からより高速に行われることが可能な、タスクを処理するために使用可能な技術である。例外ハンドラは、入力データを受け取り、記述プロトコルまたはアルゴリズムに基づいて出力データを計算し、この出力データは、再入可能（内部状態を保存）である。従来のＣＰＵアーキテクチャでは、浮動小数点コプロセッサは、オンチップ例外ハンドラとしてみなされ得る。Ｈｅｎｒｙ  Ｔ．  ＶｅｒｈｅｙｅｎおよびＷｉｌｌｉａｍ  Ｗａｔｔによる２００５年１２月１日出願の米国特許出願第１１／２９２，７１２号「Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  ｆｏｒ  Ｓｉｍｕｌａｔｉｏｎ  ｏｆ  Ｌｏｇｉｃ  ａｎｄ  Ｍｅｍｏｒｙ」は、例外ハンドラを使用した、行動ユーザメモリ記述のハードウェア内での処理方法を説明している。また、多サイクル評価の単一サイクルＶＬＩＷプロセッサへの追加方法も説明している。
【００６３】
ドメインは、分岐の実装を補助するために使用可能である。ドメインでは、実行されるタスクまたは命令は、共にドメインにグループ化される。これらのドメインは、２つの種類（制御ドメインおよび実行ドメイン）に大まかに分類可能である。制御ドメインは、種々の他のドメインを順序付ける（スケジュールする）ドメインである。例えば、米国特許出願第１１／２９６，００７号「Ｐａｒｔｉｔｉｏｎｉｎｇ  ｏｆ  Ｔａｓｋｓ  ｆｏｒ  Ｅｘｅｃｕｔｉｏｎ  ｂｙ  ａ  ＶＬＩＷ  Ｈａｒｄｗａｒｅ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ」では、ハードウェア制御ルーチンが、クロックドメインを動的にスケジュールするために適用される。制御ドメインは、制御ドメインを接続する場合、コンテクストスイッチングが、典型的には、必要となる（すなわち、状態空間は、典型的には、スワップインおよびアウトする）が、実行ドメインを接続する場合には、これは、典型的には、必要ではなく、ドメインは、単一状態空間内で動作するという点において実行ドメインとは異なる。米国特許出願第１１／２９６，００７号に記載のクロックドメイン命令セット（ＣＫ  ＩＳ）は、実行ドメインの実施例である。
【００６４】
本開示は、実行ドメインの複数のグループの命令セット（ＩＳ）からの構成方法を説明する。実行ドメイン自体は、次のＩＳグループを選択するために制御ドメインに戻るのではなく、その実行ドメイン自体の中でＩＳグループの動的順序付けを可能にするように、ＶＬＩＷアーキテクチャ内に構成可能である。実行ドメインは、計算が行われるドメインの一部である。実行ドメインは、シーケンス（次のドメイン）または子ドメインとして、他の実行ドメインを起動可能である。実行ドメインは、より大きなドメインをより小さなグループに細分可能である。これによって、分岐の実装を簡素化することが可能である。また、ドメインは、階層的にも構成可能である。
【００６５】
（３．例外ハンドラ）
（３．Ａ．拡張アーキテクチャ）
図４〜５は、例外ハンドラを実装するためのアーキテクチャを示す。図４は、シミュレーションプロセッサ１００と、プログラムメモリ１２１と、記憶メモリ１２２との間のインターフェースの特定の実装のブロック図である。この特定の実施例は、プロセッサ４１０とコプロセッサ４２０とに分割され、それぞれその独自の読み込みＦＩＦＯと、書き込みＦＩＦＯと、制御とを有する。２つの部分４１０および４２０は、中間インターフェース４５０を介して互いに通信する。この分割は必要ではないが、このアプローチの利点の１つは、設計がモジュール化されることである。例えば、コプロセッサ４２０上の追加回路は、さらに多くの機能性を導入するために追加可能である。同一のことが、プロセッサ４１０に対し行うことが可能である。
【００６６】
図４におけるインターフェースは、以下のように動作する。プログラムメモリ１２１からの命令フェッチは、パス４１１−４３２−４２１を介して、シミュレーションプロセッサ１００内の命令レジスタに生じる。プログラムメモリ１２１からシミュレーションプロセッサ１００へのデータ読み込み（例えば、新しい状態空間のロード）は、パス４１１−４３２−４３１を介して生じる。シミュレーションプロセッサ１００からプログラムメモリ１２１へのデータ書き込み（例えば、修正状態空間のライトバック）は、逆パス４３１−４３２−４１１を介して生じる。
【００６７】
記憶メモリ１２２からおよびそこへの読み込みおよび書き込みは、プロセッサ４１０およびコプロセッサ４２０を介して生じる。記憶メモリへの書き込みに対し、記憶メモリアドレスは、読み込みレジスタ４２５から、書き込みＦＩＦＯ４１２、インターフェース４５０、読み込みＦＩＦＯ４２４、メモリコントローラ４２８へ流れる。データは、同一パスに沿って流れ、最終的に、記憶メモリ１２２に書き込まれる。記憶メモリからの読み込みに対し、記憶メモリアドレスは、上述のように同一パスに沿って流れる。しかしながら、記憶メモリ１２２からのデータは、メモリコントローラ４２８から、書き込みＦＩＦＯ４２７、インターフェース４５０、読み込みＦＩＦＯ４１４、書き込みレジスタ４１５、シミュレーションプロセッサ１００へ流れる。
【００６８】
シミュレーションプロセッサ１００上の命令を実行するための動作周波数と、記憶メモリ１２２へのアクセスのためのデータ転送周波数（帯域幅）とは、概して、異なる。実際は、命令がプログラムメモリ１２１からフェッチされるため、命令実行のための動作周波数は、典型的には、プログラムメモリ１２１への帯域幅によって制限される。記憶メモリ１２２へ／からのデータ転送周波数は、典型的には、記憶メモリ１２２への帯域幅（例えば、コントローラ４２８と記憶メモリ１２２との間）、シミュレーションプロセッサ１００（読み込みレジスタ４１５および書き込みレジスタ４２５を介して）へのアクセス、またはインターフェース４５０全体の帯域幅によって制限される。
【００６９】
論理シミュレーションのために設計されたある実装では、プログラムメモリ１２１および記憶メモリ１２２は、異なる帯域幅およびアクセス方法を有する。プログラムメモリ１２１は、メインプロセッサ４１０に直接接続し、２，０００億ビット／秒を超える帯域幅で実現される。記憶メモリ１２２は、コプロセッサ４２０に接続し、２００億ビット／秒を超える帯域幅で実現される。記憶メモリ１２２は、メインプロセッサ４１０に直接接続されないため、待機時間（インターフェース４５０を含む）が要因となる。ある特定の設計では、プログラムメモリ１２１は、ｒｅｇ［２，５６０］ｍｅｍ［８Ｍ］として物理的に実現され、記憶メモリ１２２は、ｒｅｇ［２５６］ｍｅｍ［１２５Ｍ］として物理的に実現されるが、ハードウェアおよびソフトウェア論理によって、ｒｅｇ［６４］ｍｅｍ［５００Ｍ］にさらに分割される。相対的に言って、プログラムメモリ１２１は、広く（２，５６０ビット／ワード）浅い（８百万ワード）が、記憶メモリ１２２は、狭く（６４ビット／ワード）深い（５億ワード）。これは、あるデータ転送の量および周波数にどのＤＭＡ転送（プログラムメモリ１２１と記憶メモリ１２２のいずれに対しても）を使用するかを決定する際に考慮すべきである。
【００７０】
インターフェース４４２（この実施例では、ＰＣＩインターフェースとして図示される）は、パス４２５−４１２−４５０−４２４−４４２を介して、データをホストコンピュータ１１０に返送するために使用可能である。インターフェース４５２は、別のカードに拡張可能である。状態空間履歴を含むデータは、追加の処理または記憶のために、他のカードに転送可能である。ある実装では、この第２のカードは、データを圧縮する。類似アプローチは、他のカードからコプロセッサ４２０にデータを返送するために使用可能である。
【００７１】
（３．Ｂ．ループバック例外ハンドラ）
図５Ａおよび５Ｂは、例外ハンドラを示すブロック図である。図５Ａでは、例外ハンドラ５１０は、読み込みレジスタ４２５から書き込みレジスタ４１５へのループバックパスに挿入される。直接ループバックに対し、データは、読み込みレジスタ４２５から、直接書き込みレジスタ４１５に移転する。代替パスでは、データは、読み込みレジスタ４２５から、例外ハンドラ５１０、書き込みレジスタ４１５へ移転する。例外ハンドラは、多くの異なる機能を処理可能であって、他のポート（例えば、他の回路、プロセッサ、またはデータソース／シンクに接続する）を有してもよい。図５Ｂは、代替アーキテクチャを示し、読み込みレジスタ４２５および書き込みレジスタ４１５との相互作用は、例外ハンドラ５１０によって処理される。読み込みレジスタ４２５から書き込みレジスタ４１５への直接ループバックパス、記憶メモリ１２２との相互作用等は、例外ハンドラ５１０を介してすべて処理される。
【００７２】
例外ハンドラ５１０は、典型的には、マルチビットイン、マルチビットアウト装置である。ある設計では、例外ハンドラ５１０は、ＰｏｗｅｒＰＣコア（あるいは、他のマイクロプロセッサまたはマイクロコントローラコア）を使用して実装される。他の設計では、例外ハンドラ５１０は、（汎用）算術ユニットとして実装可能である。設計に応じて、例外ハンドラ５１０は、様々な場所に実装可能である。例えば、例外ハンドラ５１０がＶＬＩＷシミュレーションプロセッサ１００の一部として実装される場合、その演算は、ＶＬＩＷ命令１１８によって制御可能である。図２を参照すると、ある実装では、プロセッサユニット１０３の一部は、ＰＥ３０２が、単一ビット入力ではなく、マルチプレクサ３０４、３０６からマルチビット入力を受信するように修正される。次いで、ＰＥ３０２は、受信したベクタデータについての算術機能を行うことが可能である。
【００７３】
代替アプローチでは、例外ハンドラ５１０は、ＶＬＩＷシミュレーションプロセッサ１００の外部の回路（および／またはソフトウェア）によって実装可能である。例えば、図４を参照すると、例外ハンドラ５１０は、４１０上に位置するが、シミュレーションプロセッサ１００の外部の回路上に実装可能である。このアプローチの利点の１つは、例外ハンドラ５１０がＶＬＩＷ命令１１８によって駆動されず、したがって、シミュレーションプロセッサ１００の残りの部分と横並びに動作する必要がないことである。加えて、例外ハンドラ５１０は、シミュレーションプロセッサのアーキテクチャによって直接制約されないため、大きなデータ演算を処理するようにより容易に設計可能である。
【００７４】
（３．Ｃ．例外ハンドラ起動のためのオプコード）
シミュレーションプロセッサ１００のための命令セットは、特定のオペコードが例外ハンドラを起動するように設計可能である。セクション１．Ｃを参照すると、１つの可能性のあるオペコード形式は、以下である。
【００７５】
Ｐ０｜Ｐｌ｜ＥＮ｜ブール関数｜ＸＢ０｜ＸＢ１｜ＸＭ
例外ハンドラは、ＰＥ０上にオーバーロードされた特別なＰ０／Ｐ１フィールドによってトリガされ得る。ある実装では、ＰＥ０がＮｏ−ｏｐモードおよびＰ０＝Ｐｌ＝０を示すＥＮを有する命令を受信する場合、例外ハンドラがトリガされる。また、他の命令も、例外ハンドラをトリガするために使用可能である。例外ハンドラがトリガされると、オペコード内の残りのフィールドは、より具体的に例外ハンドラを識別するように、異なって解釈され得る。また、命令セットは、例外ハンドラのトリガに応じて、他のＰＥからのオペコードもまた、例外ハンドラを識別するために使用されるように設計され得る。別の実装では、フィールドＸＢ０、ＸＢ１、ＸＭは、ローカルメモリ３２６内の場所をポイントするように解釈可能であって、その場所は、例外ハンドラに関する追加情報を含むか、または例外ハンドラに関する追加情報を含むより長いアドレス（例えば、記憶メモリ１２２内）を含む。例外ハンドラを起動および特定する他のアプローチは、明白であるだろう。
【００７６】
（３．Ｄ．オンチップベース、オンＰＣＢベース、ホストＣＰＵベース、およびホストプログラムベース例外ハンドラ）
以下の説明に対し、例外ハンドラは、４つの異なるグループ（オンチップベース、オンＰＣＢベース、ホストＣＰＵベース、およびホストプログラムベース）に分類される。「オンチップベース」は、ＶＬＩＷプロセッサ１００集積回路（チップ）内のプロセッササイクルと一致して実行する例外ハンドラを意味する。典型的には、例外ハンドラは、単一プロセッササイクル内でその計算を完了せず、処理要素１０２と比較して、データにアクセスするための様々な方法を使用し得る。一例は、処理要素１０２が浮動小数点算術を処理しない場合の浮動小数点計算である。別の実施例は、例外ハンドラとして、ＶＬＩＷプロセッサ１００と同一チップ内に内蔵可能なＰｏｗｅｒＰＣコア等のプロセッサコアである。また、単一ＶＬＩＷプロセッササイクル内で完了するが、ハードウェア補助（すなわち、処理要素のグリッド外で実行される）を必要とする特別機能は、この種類の一部であるとみなされる。最終グループの実施例は、条件付き分岐［“ｉｆ（式）”］およびハードウェア補助アサーション［“ｈａｓ＿ｘ＿ｏｒ＿ｚ（式）”］の実装を含むことが可能である。また、以下に導入される条件付き、無条件、および多重分岐命令も、この種類の例外ハンドラを使用して実装可能である。
【００７７】
「オンＰＣＢベース」は、ＶＬＩＷシミュレーションプロセッサ１００に対しオフチップであるが、同一プリント基板（ＰＣＢ）カードのいずれかの場所、またはＶＬＩＷプロセッサをホストするＰＣＢカードの娘カード上で実行される例外ハンドラを意味する。ＰｏｗｅｒＰＣコアベースの例外ハンドラは、ＶＬＩＷプロセッサ１００と離れた半導体チップ内に実装される場合、オンＰＣＢベースであることが可能である。
【００７８】
「ホストＣＰＵベース」は、ホストコンピュータ１１０上で行われる例外ハンドラアクティビティを示す。この実施例は、典型的には、（シミュレーションにおける）メッセージング（＄ｄｉｓｐｌａｙ）、あるいは入力データ（＄ｒｅａｄｍｅｍｈ）または出力データ（ＶＣＤ／ＦＳＤＢダンプ）等のファイルＩ／Ｏに関する。ファイルは、オペレーティング・システムを介してアクセス可能であって、したがって、ホストコンピュータ上で実行される。典型的には、これらのアクセス方法は、ＶＬＩＷシミュレーションプロセッサ１００をホストＣＰＵ１１４に接続するドライバソフトウェア内で行うことが可能である。
【００７９】
「ホストプログラムベース」は、ドライバソフトウェア以外のソフトウェアプログラムとして実装される例外ハンドラを示し、このドライバソフトウェアは、ホストＣＰＵ上で実行し、そのプログラムに対しＶＬＩＷプロセッサ１００が子プロセスである（特定のアーキテクチャにおいて）。例えば、ＶＬＩＷプロセッサ１００がホストＣＰＵ１１０から直接実行される場合等、そのようなプロセスがない場合もある。半導体集積回路の設計のシミュレーションでは、ホストプログラムは、典型的には、ソフトウェアシミュレータを示し、このプログラムは、シミュレーションプログラムの範囲内でのみ定義される＄ｔｉｍｅ、＄ｒｅａｌｔｉｍｅ、外部ＰＬＩ機能、ライブラリ方法等の特定の状態機械要素を維持可能である。これらの変数へまたはそこからのアクセスを使用する例外ハンドラは、典型的には、ソフトウェアシミュレータ内で実行される。一般的に、プログラムは、一部がホスト１１０（シミュレータプログラム等）上で、一部がＶＬＩＷプロセッサカード１３０上で実行するように分割されてもよい。
【００８０】
（３．Ｅ．行動プリミティブおよび内蔵行動）
特定のアプリケーションに対し、ＶＬＩＷプロセッサ１００は、主に、合成可能タスクを処理するように設計されるため、例外ハンドラは、大抵の場合、合成不可能タスクを処理するために使用され得る。集積回路のシミュレーションとの関連で、合成不可能タスクは、行動または機能タスク（行動または機能に関して記述可能であるが、同等の論理回路に統合が困難なタスクを示す）と称される場合が多い。行動タスクは、概して、２つのグループ（行動プリミティブおよび内蔵行動）に分類可能である。行動プリミティブ（Ｂｅｈａｖｉｏｒａｌ  Ｐｒｉｍｉｔｉｖｅ；ＢＰ）は、オンチップベース例外ハンドラまたはオンＰＣＢベース例外ハンドラによって実装される行動タスクである。内蔵行動（Ｅｍｂｅｄｄｅｄ  Ｂｅｈａｖｉｏｒ；ＥＢ）は、ホストＣＰＵベース例外ハンドラまたはホストプログラムベース例外ハンドラによって実装される行動タスクである。
【００８１】
行動待機時間は、行動タスクの１つの属性である。例外ハンドラがモデル化される方法に応じて、所望の応答を計算する時間（すなわち、行動待機時間）が大きく変り得る。例えば、オンチップベース例外ハンドラは、非常に高速に応答可能である。基本条件付き分岐［“ｉｆ（式）”］テスト条件では、単一ＶＬＩＷ命令サイクル内で応答する。内部ループバック例外ハンドラ（図５に図示されるような）によって実装される同じ分岐は、１０ＶＬＩＷ命令サイクルで応答し得る。オンＰＣＢベース例外ハンドラは、典型的には、データが生成可能となるまでより長い待機時間を必要とする（例えば、ユーザメモリ演算に対し１００ＶＬＩＷ命令サイクル）。オンチップベースおよびオンＰＣＢベースマイクロプロセッサ（例えば、ＰｏｗｅｒＰＣコア）ベース例外ハンドラは、ＶＬＩＷ命令サイクルの数ｌ００倍に対応するミリ秒で応答し得る。ホストＣＰＵベースおよびホストプログラムベース例外ハンドラは、さらに長く、１，０００ＶＬＩＷ命令サイクル以上を要し得る。
【００８２】
（４．分岐）
（４．Ａ．ＪＵＭＰオプコード）
図３を参照すると、プログラムカウンタ（ＰＣ）レジスタは、プログラムメモリ１２１内のアドレスをポイントし、読み込み命令に応じて、データは、プログラムメモリ１２１から、プログラムメモリデータバス４１０を介して、ＰＥ命令レジスタアレイ１１８へストリームする。次のクロックサイクルのそれぞれにおいて、ＰＥ命令レジスタアレイがリフレッシュされる。したがって、ＪＵＭＰは、ＶＬＩＷ命令に、次の命令ワードフェッチに応じて、この新しいアドレスから継続して読み込みを行わせる、プログラムメモリ１２１の新しいアドレスを有するＰＣレジスタをロードすることによって実装可能である。これは、命令ストリームの中断なく行うことが可能であって、実装において効率的である。
【００８３】
上述のセクション１．Ｃ．を参照すると、そこで導入されたＶＬＩＷシミュレーションプロセッサ１００のためのオペコード形式は、以下である。
【００８４】
Ｐ０｜Ｐｌ｜ＥＮ｜ブール関数｜ＸＢ０｜ＸＢ１｜ＸＭ
ＪＵＭＰ命令は、以下のようにエンコード可能である。フィールドＰ０およびＰ１は、ＰＥ３０２に対し２つの入力を決定し、ブール関数というフィールドは、ＰＥ３０２によってシミュレートされる機能を決定する。この実施例では、ＢＵＦ（バッファ）は、可能性のあるブール関数のうちの１つとして選択される。しかしながら、ＢＵＦは、１つの入力（例えば、Ｐ０入力）のみを必要とする。これによって、「オーバーロード」と称される特別値をエンコードするためにＰｌを利用可能なままとする。ある実装では、ＪＵＭＰコマンドは、オーバーロード演算のこのセットの一部として含められる（例外ハンドラは、このようにも実装可能であることに留意されたい）。したがって、ＰＥ３０２がブール関数＝ＢＵＦおよびＰ１＝ＪＵＭＰオーバーロード値に遭遇する場合、命令をＪＵＭＰコマンドとして解釈する。
【００８５】
２つ以上のＪＵＭＰコマンドを、命令セットの一部として含むことが可能である。以下は、６つのＪＵＭＰコマンドの例示的セットであって、それぞれ、Ｐｌに対する異なるオーバーロード値に対応する。
【００８６】
無条件ＪＵＭＰＧ
条件付きＪＵＭＰＧ
無条件前方ＪＵＭＰＲ（インクリメント）
条件付き前方ＪＵＭＰＲ（インクリメント）
無条件後方ＪＵＭＰＲ（デクリメント）
条件付き後方ＪＵＭＰＲ（デクリメント）
ここで、ＪＵＭＰＧは、グローバルジャンプ（すなわち、絶対アドレスへのジャンプ）であって、ＪＵＭＰＲは、相対ジャンプ（すなわち、現在のＰＣレジスタを指示量分インクリメントまたはデクリメント）である。無条件ジャンプは、常に生じる。条件付きジャンプは、条件が満たされる場合に生じる。条件付きジャンプは、例えば、条件を事前計算し、Ｐ０フィールドを使用して、条件がＴＲＵＥまたはＦＡＬＳＥであるかを示すことによって、実装可能である。
【００８７】
ＪＵＭＰＧの場合、アドレスフィールドは、ＰＥオペコードよりも長くてもよい。その場合、オペコードを完了するために必要とされる追加ビットは、いくつかの方法で得ることが可能である。あるアプローチでは、アドレスフィールドは、他のＰＥからのオペコードを使用して完了してもよい。例えば、ＸＢ０、ＸＢ１、およびＸＭは合わせて１６ビットを有するが、ＰＣレジスタは２４ビットを有する場合、追加８ビットは、隣接するＰＥのＸＢ０、ＸＢ１、および／またはＸＭフィールドから受け取ることが可能である。また、間接化も使用可能である。例えば、ＸＢ０、ＸＢ１、およびＸＭは、２４ビットアドレスを含む場所をポイント（または、それ自体が、２４ビットアドレスをポイント）してもよいが、間接化は、通常、ＪＵＭＰ命令の実行に待機時間を追加する。
【００８８】
ＪＵＭＰＲの場合、最大インクリメントは、現在のオペコード内で利用可能なものに制限可能である。このアプローチは、他からの余剰ビットをロードする複雑性を回避する。上述の実施例を継続すると、ＪＵＭＰＲは、１６ビットに制限されてもよい。つまり、ＰＣレジスタは、２４ビットの全スパンではなく、最大１６ビットインクリメントまたはデクリメントすることが可能である。
【００８９】
上述のアプローチは、ＰＥオペコードに基づく、ＶＬＩＷプロセッサのための効率的分岐機構である。分岐は、単一ＰＥ（適切に制限されたＪＵＭＰＲのため）、またはその隣接するＰＥのビットフィールドと結合された単一ＰＥ（ＪＵＭＰＧのため）のみを必要とする。加えて、分岐は、動的な式（すなわち、ランタイムで計算された）に基づく条件付きにすることが可能であって、この動的な式は、任意の式を条件付き分岐のテスト条件に対し生成されることが可能である。ＶＬＩＷシミュレーションプロセッサは、命令キャッシュレスであるため、分岐は、ほぼペナルティなして行うことが可能である。対照的に、命令キャッシュを有するＶＬＩＷプロセッサでは、分岐は、命令キャッシュが消去および再ロードされる必要があって、非効率的である。
【００９０】
加えて、この実施例では、ＶＬＩＷプロセッサ１００は、単一集積回路として実装され、全ＰＥ３０２は、オンチップメモリへのアクセスを有する。その結果、任意の式が、チップ内の任意の場所に格納され、条件付き分岐内のテスト条件として使用可能である。評価は、既に、ＶＬＩＷプロセッサの通常演算の一部であるように設計されているため、テストは、効果的に、ペナルティなしで評価可能である。
【００９１】
（４．Ｂ．待機時間）
上述のＶＬＩＷアーキテクチャでは、命令ワードは、オフチップメモリ１２１から連続的にストリームされ、ジャンプ後、全処理要素３０２は、新しいＪＵＭＰアドレスに位置する命令ワードから新しい命令データを受信する。したがって、ＪＵＭＰ命令による分岐は、全処理要素に対し、同時に行われる（これは、以下に詳述されるように、例えば、並列スレッディングによって精緻化可能である）。ＪＵＭＰ命令は、単一ＶＬＩＷ命令サイクルで行われるが、メモリアーキテクチャに応じて、待機時間（通常、数命令サイクルのみ）があり得る。その場合、ＶＬＩＷプロセッサは、命令がＪＵＭＰアドレスからのストリーミングを開始するまで、非アクティブのままであり得る。さらなる最適化は、遅延分岐の使用、すなわち、分岐遅延スロットを可能にすることである（余剰命令サイクルの間、ＶＬＩＷプロセッサに計算させ、本質的に、待機時間を吸収し、したがって、ＶＬＩＷ命令サイクルは失われない）。
【００９２】
例えば、メモリ待機時間が４命令である場合、ジャンプは、後述されるように、その中にＪＵＭＰ命令を有するＶＬＩＷ命令ワードの後、４命令サイクルで実行される（遅延分岐）。これらの４命令の際、ＶＬＩＷは、実行サイクルを継続可能であるが、好ましくは、既に始動されたＪＵＭＰ命令に干渉する可能性があるため、他のＪＵＭＰ命令は、これらの４命令サイクル内ではスケジュールされないことがあり得る。また、最初の有効リターンアドレスは、技術的に、ＪＵＭＰ命令を有するＶＬＩＷ命令のすぐ次のアドレスではなく、このアドレス＋４（待機時間が４つである場合）である。
【００９３】
０１０００１：ＪＵＭＰ０２００００／／ｔ＝０で実行
０１０００２：・・・              ／／ｔ＝１で実行
０１０００３：・・・              ／／ｔ＝２で実行
０１０００４：・・・              ／／ｔ＝３で実行
０１０００５：・・・              ／／最初の有効リターン場所
０１０００６：・・・              ／／コードが継続
０２００００：・・・              ／／ｔ＝４で実行
別の言い方をすると、ＶＬＩＷプロセッサへストリームするＶＬＩＷ命令ワードは、時刻順に以下となる。｜０１０００１｜０１０００２｜０１０００３｜０１０００４｜０２００００｜０２０００１｜０２０００２。ストリームは、継続的であって、中断はない。待機時間は、先験的に知られており、スケジューリングに考慮可能である。本開示では、議論および実施例を明確にするため、メモリ待機時間はゼロであると仮定される。
【００９４】
（４．Ｃ．スタックレスおよびスタック演算）
簡素化された実施形態では、反復は許されない。したがって、実行ドメインは、一度アクティブになると、再起動は不可能である。これは、記録を大幅に簡素化する。スタック機構および一時データの処理の必要性はない。全変数は、グローバルに（クロックドメイン内で）アクセス可能であって、ジャンプは、自由に行うことが可能である。
【００９５】
また、このアプローチは、ハードコーディングリターンアドレスによって簡素化される。動的にジャンプし、予測されるリターンアドレスを事前ロードせずに、特定の演算（後述される）を除き、全ジャンプアドレスが静的に計算される。これによって、プログラムメモリ１２１からの「読み込み」モードの維持が可能になり、特定のアプリケーションのために好ましい。
【００９６】
また、所望のリターンアドレスを動的にプッシュする分岐命令も実装可能である。各リターンアドレスは、プログラムカウンタレジスタ内のビット数のみ必要とするため、分岐によって形成されるスタックは、ローカルメモリ内に維持可能である。このメモリは、小さく、例えば、ＶＬＩＷワードロード４２０を処理する状態機械内のＦＩＦＯとして実装され、ＰＥグリッド外に維持可能である。スタック演算は、さらに後述される。
【００９７】
（４．Ｄ．分岐を使用するドメイン実装）
上述のように、より大きなプログラムは、ドメインに分割可能である。ドメインは、分岐を介して、より大きなプログラムに共に「組み立て」可能である。ドメインに侵入する３つの方法は、前方ジャンプ、割り込みジャンプ（ｓｉｄｅ−ｅｎｔｒａｎｃｅ  ｊｕｍｐ）、およびリターンである。前方ジャンプは、ドメインの最初へのジャンプである。割り込みジャンプは、ドメインの中間へのジャンプである。リターン命令は、割り込みジャンプの特別なケースであって、呼び出しドメインから起動された実行ドメインをこのドメインの起動地点の前（ルーピングの間）または後（分岐の場合）にリターンさせる。
【００９８】
割り込みジャンプは、前方ジャンプよりも幾分複雑である。この特定のアプリケーションでは、スケジューラは、演算を並列にスケジュールしているため、ジャンプ時点で未だ完了していない開始計算（シミュレーションにおける論理コーン）が既にある場合がある。前方ジャンプでは、全一時データ（シフトレジスタ３０８およびローカルメモリ３２６の両方内）の状態が既知であるため、計算は継続可能である。実際、複数の前方ジャンプが存在する場合、各前方ジャンプは、これらの並列演算の計算を簡単に継続可能である。
【００９９】
しかしながら、スケジューラが、割り込みジャンプ（または、リターン）をスケジュールする場合、被起動ドメインは、一時データ空間を使用しており、シフトレジスタは、現在、未知の状態にある可能性がある。親ドメインは、いくつのクロックサイクルが経過したか、一時データが有効のままかどうかも分からない場合がある。
【０１００】
あるアプローチでは、スケジューラは、単に一時データを無効にすることによって、親ドメインのための一時データを再ロードし、既にスケジュールされていた並列演算を再計算することになる。ほとんどの変数は、必要な場合のみ、一時ストレージにロードされるため（依存性駆動遅延ローティング）、これは、典型的には、大幅なコストはかからない。これは、実際、スタックがない場合のプロセッサの動作方法に類似する。その事前ロードされたレジスタは、唯一利用可能なものであって、起動される子機能の処理の間、再利用されなければならず、したがって、レジスタのコンテンツは、リターンに応じて無効となり、子機能が完了すると、プロセッサにレジスタの再ロードを要求する。
【０１０１】
代替アプローチでは、被起動ドメインは、シフトレジスタからの一時データの除去を許可されない。それらを保存しなければならない。既に使用中のスクラッチパッドの再使用も許可されない。空のスロットを使用しなければならない。これは、通常、被起動ドメインを非制限ドメインよりも若干非効率的にし、より大きなドメインよりも、より小さなドメインに対しより実行可能である。その場合、被起動ドメインは、親ドメインの一時データ空間を妨害しない。単に、被起動ドメインが完了すると、シフトレジスタが残される場所に影響するだけである。次いで、完了後、親ドメインは、子ドメインが起動された時の状態に等しく戻すために必要とされるサイクルだけ、シフトレジスタを回転する。ここで伴う空のサイクルの数は、最大でもシフトレジスタの深度に等しく、無効化ステップよりも効率的であるかもしれないし、またはそうでないかもしれない。
【０１０２】
マッピングされるプログラムまたは設計（ネットリスト）に応じて、一方または両方のアプローチが使用可能である。通常、無効化アプローチは、より大きな被起動ドメインに対しより効率的であって、保存アプローチは、より小さな被起動ドメインに対しより効率的である。
【０１０３】
第３のアプローチでは、シフトレジスタは、静的レジスタに代替可能である。これは、追加プログラミングビットを必要とするため（ＰＥオペコード２１８において）、静的レジスタの量は、類似のＰＥオペコードサイズのためのシフトレジスタの量未満となるであろう。このアプローチは、リターン命令が、より少ない記憶レジスタを代償として、最初の２つのアプローチが必要とする特別な処理を必要としないという利点を有する。
【０１０４】
シフトレジスタを使用するアプローチに戻ると、一時変数が保存される場合、スタック機構を実装可能である。ＶＬＩＷアーキテクチャでは、スタックは、リターンアドレスおよび全ローカル（一時的）変数の両方を維持しなければならないため、多くの一時的値が存在可能であって、したがって、スタックサイズは、かなり大きくなり得る。シフトレジスタ３０８およびローカルメモリ３２６を使用して実現可能であるが、これは、特に、起動（または、反復）のより深いレベルに利用可能な空間を制限する。より単純なアプローチでは、スタックプッシュポップ機構を使用して起動されるドメインは、シフトレジスタ３０８の使用を制限されるであろう。代わりに、それは、スケジューリング効率を制限するだけでなく、スタックのサイズも制限する、メモリ３２６からロードおよび格納される実際かつ一時変数に直接基づいて動作する。次いで、メモリ３２６は、新しいデータ空間が、反復の各レベルにおけるローカル（一時的）変数に利用可能となり、スタックに付随するプッシュおよびポップ機構を効果的にサポートするように配列可能である。
【０１０５】
実行ドメインの最後は、典型的には、無条件分岐を有するであろう。無条件分岐に先立って、条件付き分岐が使用可能であって、テスト条件に応じて、実行ドメインを２つ以上の異なる場所で継続可能である。実施例が、以下に与えられる（ゼロ待機時間と仮定）。
【０１０６】
０１０１２２：・・・                    ／／    実行ドメインの最終コード
０１０１２３：ｉｆ（ＣＯＮＤ１）ＪＵＭＰ０２００００；／／条件付き分岐
０１０１２４：ｉｆ（ＣＯＮＤ２）ＪＵＭＰ０３００００；／／第２の条件付き分岐
０１０１２５：ＪＵＭＰ０４００００；                ／／無条件分岐
０２００００：・・・                ／／ＣＯＮＤ１の場合、ここへジャンプ
０３００００：・・・                ／／ＣＯＮＤ２かつ！ＣＯＮＤ１の場合、ここへジャンプ
０４００００：・・・                ／／無条件（！ＣＯＮＤ１かつ！ＣＯＮＤ２）
（４．Ｅ．一部の実施例）
便宜上、反復はなく、グローバル変数のみと仮定する。実施例として、起動される子実行ドメインを使用して、単純なｉｆ−ｔｈｅｎ−ｅｌｓｅ構文を検討する。
【０１０７】
親実行ドメイン：
０１０００１：ｉｆ（ＣＯＮＤ）ＪＵＭＰ０２００００；／／子  実行ドメインへ
０１０００２：・・・              ／／コード継続、これは、ｅｌｓｅ分岐である
０１００１０：・・・              ／／ｅｌｓｅ分岐命令の最後
０１００１１：・・・              ／／割り込み（リターン）アドレス
子実行ドメイン：
０２００００：・・・              ／／コード継続、これは、ｉｆ分岐である
０２０００９：・・・              ／／ｉｆ分岐命令の最後
０２００１０：ＪＵＭＰ０１００１１：／／（すなわち、リターンジャンプ）
任意のアドレス（親または子において、子は、別の子に対する親である）をリターン可能に（すなわち、割り込み指示を提供）するために、ハードウェアサポートは必要ではない。その唯一の含意は、ソフトウェアスケジューラが、このアドレスにおける一時変数のその使用をリセットする、または被起動ドメイン内の一時使用を制限する（または、スタックを使用する）ということである。
【０１０８】
以下の代替実施例は、親ドメイン内にマッピングされた同一ｉｆ−ｔｈｅｎ−ｅｌｓｅコードを示し、単一プロセッサスケジューリングに類似するが、ＶＬＩＷのためのこのケースでは、インライン展開実行ドメインを使用する。
【０１０９】
０１０００１：ｉｆ（ＣＯＮＤ）ＪＵＭＰ  ０１００４０；／／ｉｆ分岐へ条件付きジャンプ
０１０００２：・・・                                ／／コード継続、これは、ｅｌｓｅ分岐である
０１００３８：・・・                                ／／ｅｌｓｅ分岐命令の最後
０１００３９：                ＪＵＭＰ０１００６０；／／ｉｆ分岐を越えて、無条件ジャンプ
０１００４０：・・・                              ／／コード継続、これは、ｉｆ分岐である
０１００５９：・・・                              ／／ｉｆ分岐命令の最後
０１００６０：・・・                              ／／割り込み場所
類似構文を使用して、ループを実装可能である。
【０１１０】
０１０００１：・・・                              ／／ループの最初
０１０００２：ｉｆ（！ＣＯＮＤ）ＪＵＭＰ０１００４０；／／ＣＯＮＤの場合、ループを抜ける
０１０００３：・・・                            ／／コード継続、これは、ループ本体である
０１００３８：・・・                            ／／ループ本体の最後
０１００３９：            ＪＵＭＰ０１０００１；／／ループを反復
０１００４０：・・・                              ／／コード継続
（４．Ｆ．多重分岐および制御変数解析）
ＶＬＩＷシミュレーションプロセッサの利点の１つは、ＶＬＩＷ命令ワードが大きいため、多重分岐が単一命令（または、分岐の数よりも少ないいくつかの命令）としてエンコード可能であることである。例えば、一連の条件付き分岐とみなされ得る、ケースステートメントを検討する。
【０１１１】
ケース（ａ）｛
０：ＪＵＭＰ  ＡＤＤＲ０；／／（０）？の場合、ＡＤＤＲ０へ
１：ＪＵＭＰ  ＡＤＤＲ１；／／（ｌ）？の場合、ＡＤＤＲ１へ
２：ＪＵＭＰ  ＡＤＤＲ２；／／（２）？の場合、ＡＤＤＲ２へ
３：ＪＵＭＰ  ＡＤＤＲ３；／／（３）？の場合、ＡＤＤＲ３へ
Ｎ：ＪＵＭＰ  ＡＤＤＲＮ；
｝
これは、Ｎ個の条件付き分岐命令を必要とする。
【０１１２】
多重分岐命令によって、これは、単一命令として実装可能である。
【０１１３】
０１０００１：ケース（ａ）：０？ＡＤＤＲ０；１？ＡＤＤＲ１；２？ＡＤＤＲ２；・・・；Ｎ？ＡＤＤＲＮ；
０１０００２：・・・：／／次の命令アドレス、例えば、リターンまたは割り込み
各ＰＥ３０２は、オペコードを受信することを想起されたい。条件付き分岐命令のそれぞれは、異なるＰＥ３０２によって評価可能であるが、評価のすべては、同時に生じ得（すなわち、同一クロックサイクルにおいて）、ｋ個のプロセッサ要素がある場合、ｋ個の並列分岐を可能にする。別様に、並列デコーダは、分岐命令全体をデコードするために使用され、１つのＰＥだけ除いて全部に対するオペコードを削除することによって、さらに高い効率のビットパッキングを可能にする。
【０１１４】
多重分岐は、コンパイラに複雑な制御フローグラフを処理させるだけの技術ではなく、実行速度を最適化するために使用可能な技術でもある。つまり、機能は、複数回コンパイル可能であって、各回、異なる仮定を有する。論理シミュレーションでは、変数が低頻度で変化する場合、その関連論理は、毎回計算される必要はない。静的にスケジュールされたＶＬＩＷ実行では、システムは、サイクルシミュレータとして機能し、自動的に、各サイクルにおいて、全変数を計算する。実行ドメインが、変数は１または０であると仮定可能である場合、ドメイン実行は、この知識に基づいてトリミング可能である。これは、計算ステップの量を低減し、その関連する節約は、膨大となり得る。典型的には、コンパイルの際、その値が一定であることが既知である場合、ｉｆ−ｔｈｅｎ−ｅｌｓｅまたはｃａｓｅステートメントを制御する制御変数は、大きな論理計算（論理コーン）を削除可能である。例示的技術は、定数伝搬（Ｃｏｎｓｔａｎｔ  Ｐｒｏｐａｇａｔｉｏｎ；ＣＰ）およびデッドコード削除（Ｄｅａｄ  Ｃｏｄｅ  Ｅｌｉｍｉｎａｔｉｏｎ；ＤＣＥ）を含む。特定の変数が一定である場合、５０，０００サイクルを必要とし得るドメインは、２５，０００サイクルに低下し得る。
【０１１５】
シミュレーションでは、この仮定は成り立たないが、コンパイラは、複数のドメインをスケジュール可能である。例えば、以下の表の３つの変数Ａ、Ｂ、およびＣを仮定する。
【０１１６】
識別番号    Ａ              Ｂ              Ｃ          サイクル数
０        −              −              −        ６５，０００
１ ＦＡＬＳＥ   ＦＡＬＳＥ   ＦＡＬＳＥ   １５，０００
２ ＦＡＬＳＥ   ＦＡＬＳＥ   ＴＲＵＥ     ２５，０００
３ ＦＡＬＳＥ   ＴＲＵＥ     ＦＡＬＳＥ   ５０，０００
４ ＦＡＬＳＥ   ＴＲＵＥ     ＴＲＵＥ     ４５，０００
５ ＴＲＵＥ     ＦＡＬＳＥ   ＦＡＬＳＥ   ５５，０００
６ ＴＲＵＥ     ＦＡＬＳＥ   ＴＲＵＥ     ４２，０００
７ ＴＲＵＥ     ＴＲＵＥ     ＦＡＬＳＥ   ６０，０００
８ ＴＲＵＥ     ＴＲＵＥ     ＴＲＵＥ     １２，０００
さらに、制御変数のための特別な配慮を必要としないドメインは、６５，０００サイクル（表内の識別番号０）を必要とすると仮定する。
【０１１７】
識別番号１、２、および８が、大幅な節約をもたらすことに留意されたい。実行ドメインを単一６５，０００サイクルドメインとしてコンパイルするよりも、かつこれを８つの別個のドメイン（各識別番号に対し１つ）としてコンパイルするよりも、コンパイラは、４つの実行ドメイン（０、１、２、および８）を生成し得る。シミュレーション実行の際、表に識別番号１、２、または８としてリストアップされている制御変数の組み合わせが生じる場合、代替実行ドメインを使用して、加速が達成される。すべての他のケースでは、識別番号０（すなわち、非最適化実行ドメイン）は、正確な評価を保証する。
【０１１８】
これらのドメインの別の見方は、これらのドメインが、異なる目的のため（かつ動的制御下で）最適化されてもよいことである。例えば、制御は、自己チェックドメイン（アサーション）、またはデバッグドメイン（可視性を生成）をトリガするために使用可能である。制御は、ランタイムでユーザ選択可能であるか、または実行される論理自体内から生成されてもよい。このケースでは、複数のドメイン生成は、加速目的のためではなく、デバッグまたは可視性目的のためである。他の変形例も明白であるだろう。
【０１１９】
この技術は、複数の制御変数のために最適化可能である。例えば、１６制御変数が分析される場合、６５，５３６の可能性のある代替実行ドメインバリアントが存在することになる。例として、２４ビットを必要とするＪＵＭＰＧ（１６Ｍ  ＶＬＩＷワードのためのＰＣアドレスを仮定）または１６ビットを必要とするＪＵＭＰＲ（上述のように仮定）と結合された、４ビット長の条件評価を使用する最大１６制御変数を可能にする。これは、分岐ターゲット当たり４＋２４＝２８または４＋１６＝２０ビットとなる。特別オーバーロードオペコードは、第１のＰＥ−ＰＥ０オーバーロード内の（ハードウェアベース−並列エンジン）条件付き分岐ジャンプ命令をトリガするために使用される。これは、７ビットを使用する。ＰＥ命令１１８当たり４０ビットを有する６４個のＰＥを仮定すると、ＶＬＩＷ命令１１８に対し２５６０ビットとなる。これは、（２５６０−７）／２８＝９１のＪＵＭＰＧまたは（２５６０−７）／２０＝１２７のＪＵＭＰＲが、単一ＶＬＩＷ命令１１８にビットパックされることを可能にする。他の変形例も明白であろう。
【０１２０】
したがって、６５，５３６の可能性のある代替グループの中、最大９１ドメインは、グローバルジャンプを使用して、単一ＶＬＩＷ命令サイクル内で選択可能である（および、相対ジャンプを使用して最大１２７）。９１の実行ドメインに対するプログラムコードは、単一実行ドメインに対するプログラムコードよりも大幅に大きく、したがって、これは、考慮されるべきである。プログラムメモリ１２１は、かなり大きく、命令ドメインは、プログラムサイズにかかわらず、その全体が利用可能である（コンパイラは、プログラムメモリ１２１が利用可能な空間を有する限り、より多くの実行ドメインバリアントを生成することによって、実行時間を最適化することが可能である）。これは、ディレーティング対加速のトレードオフを可能にする。所与の速度における容量がより大きいほど、速度が増えると容量がより小さくなる。
【０１２１】
（５．複合実行ドメイン）
（５．Ａ．合成不可能タスクおよび分岐）
上述の例外処理および分岐技術は、論理シミュレーションシステムに効率的方法で合成不可能タスクを処理することを可能にする。従来のＶＬＩＷプロセッサは、所定の順番で合成可能タスクを計算する際に効率的である。タスクが独立している場合、並列に実行可能である。実行の順番が、コンパイル時に決定可能である（例えば、動的分岐条件に依存しない）場合、タスクは、ＶＬＩＷ計算リソースを最も効率的に使用するために、連続的にスケジュール可能である。
【０１２２】
しかしながら、従来のＶＬＩＷプロセッサは、典型的には、実行の順番がコンパイル時に決定可能でない場合、効率を損なう。ランタイムでの分岐の選択は、命令キャッシュおよび／またはデータキャッシュの消去を必要とし得る。キャッシュが大きい場合、この消去および正確な分岐のための再ロードは、ＶＬＩＷ計算リソースがアイドリングし得る間、相当数のサイクルを要する場合がある。さらに、合成不可能タスクの導入は、さらに効率を低下させる。あるケースでは、従来のＶＬＩＷアーキテクチャは、単に、合成不可能タスクを処理しない。他のケースでは、合成不可能タスクは、ＶＬＩＷプロセッサ要素以外のリソースによって完了される。しかしながら、合成可能タスクおよび合成不可能タスクの混合は、ＶＬＩＷプロセッサ要素と非ＶＬＩＷプロセッサリソースとの間の通信および連携を必要とし、これは、大幅な待機時間を有する可能性がある。さらに、ＶＬＩＷプロセッサが、合成不可能タスクからの結果を待機する間、アイドリング状態でなければならない場合、さらなる非効率性が導入され得る。
【０１２３】
対照的に、上述のＶＬＩＷ実装では、分岐および合成不可能タスクの両方が、効率的に処理可能である。分岐に対し、プログラム全体は、ドメインに分割可能であり、上述のように、ドメイン内の効率的ＶＬＩＷ計算と、ドメイン間（または、同一ドメイン内の異なる場所間でも）の効率的分岐とを有する。このケースでは、命令キャッシュがないため、命令キャッシュの消去等、従来の非効率性は回避される。ドメイン内では、合成不可能タスクは、上述のように、非効率的方法での合成不可能タスクの処理をＶＬＩＷプロセッサ要素に強制するか、または合成不可能タスクの実行を単にサポートしないのとは対照的に、例外ハンドラによって効率的に実装可能である。例外ハンドラは、実行にある程度の時間を要する（例えば、メモリ待機時間に応じて）が、この時間は、先験的に（すなわち、コンパイル時間において）計算可能である場合が多く、したがって、ＶＬＩＷプロセッサのアイドリングが低減または削減されるように、タスクのスケジューリングに考慮される。加えて、上述のアーキテクチャおよびアプローチは、ＶＬＩＷプロセッサ要素と非ＶＬＩＷプロセッサリソースとの間の連携に必要とされるオーバーヘッドも低減する。
【０１２４】
（５．Ｂ．例示的実行ドメイン）
図６は、実行ドメインの例示的構成を示す略図である。この実施例は、種々の特性を示すために選択されている。トップレベルのドメインは、制御ドメイン６００である。制御ドメイン６００は、ＳＴＡＲＴ  ＣＯＵＮＴへの前方ジャンプ（割り込みジャンプではなく）を有する親実行ドメイン６１０を起動６０２する。次いで、親実行ドメイン６１０での分岐（条件付きまたは無条件）は、実行ドメイン６２０への前方ジャンプであるアドレスＪＵＭＰ１へジャンプ６１２する。同様に、別の分岐は、アドレスＪＵＭＰ２（実行ドメイン６３０）への別の前方ジャンプ６２２を行う。
【０１２５】
例外ハンドラ６４０は、実行ドメイン６３０内で始動６３２される。例外ハンドラ６４０は、行動プリミティブまたは内蔵行動のいずれかであることが可能である。いずれのケースでも、例外ハンドラ６４０は、例外ハンドラの行動待機時間である実行６３３のための一定の時間を要する。この待機時間は、典型的には、リターン６３４の最早時間もまた、推測および適切にスケジュール可能なように、コンパイル時間で推測可能である。その間、計算リソースが効率的に使用されるように、実行ドメイン６３０は、ＶＬＩＷプロセッサにタスクの実行６３５を継続させることが可能である（場合によって、他の例外ハンドラの始動を含む）。ＶＬＩＷシミュレーションプロセッサは、例外ハンドラの実行６３３と並列で実行６３５可能であることに留意されたい。
【０１２６】
この実施例では、実行ドメイン６３０は、実行ドメイン６２０内のＡＤＤＲ３にリターン６２４することによって終了する。実行ドメイン６３０のデフォルト終了は、ＪＵＭＰ４（実行ドメイン６５０Ｂ）への無条件分岐６２６である。実行ドメイン６２０は、実行ドメイン６１０のＡＤＤＲ１へリターン６１４する。
【０１２７】
実行ドメイン６１０内に示される別の特性は、コード複製として知られる代替実行ドメインである。このケースでは、親６１０は、２つの条件付きジャンプを有し、１つはバリアント６５０Ａへ、１つはバリアント６５０Ｂへである。２つの実行ドメイン６５０Ａおよび６５０Ｂは、プログラムまたは設計（ネットリスト）の同一領域をマッピングしているが、異なる行動（例えば、上述のセクション４．Ｆ．参照）のために最適化される。例えば、１つのドメイン６５０は、デバッグルーチン（＄ｄｉｓｐｌａｙ  ａｃｔｉｖｅ）を有する、または他のドメインがこれを回避し得る間、アサーションを使用してもよい。この特性の別の使用は、上述のように、状態依存最適化を有効にすることである。別の実施例は、バス信号上での大幅な多重化である。バリアント６５０Ａは、特定の条件を考慮して、マルチプレクサを除去（デッドコード削除；ＤＣＥ）するように最適化され得る。条件が一致しない場合、バリアントＢは、実行される正確なドメインである。スイッチングが、動的に生じ、追加性能改良を可能にする。いずれのドメインが実行されるかの制御は、「ｉｆ（式）」を使用して行われることが可能であって、式は、データが動的に取得可能な任意の方法であることが可能である。この実施例では、バリアント６５０Ａおよび６５０Ｂの両方が、ドメイン６１０内のＡＤＤＲ２へリターンする。
【０１２８】
ドメイン６５０Ｂ内に示される別の特性は、前方スキップ６５２である。これは、ジャンプしなければ実行される必要があるコードをスキップするドメイン内のジャンプである（例えば、「ｉｆ（！ｃｏｎｄ）ｊｕｍｐ  ＳＫＩＰ；」、これは「ｉｆ（ｃｏｎｄ）ｅｘｅｃｕｔｅ  ｉｆ−ｂｏｄｙ；」に等しい）。これは、コードのインライニングと称される場合が多い。ＶＬＩＷアーキテクチャは、ＪＵＭＰ命令を使用する単一プロセッサのために存在するものと類似する機構をサポート可能である。これは、使用方法が制限されないことを強調する、割り込みジャンプの別の形式である。
【０１２９】
図７Ａ〜７Ｄは、種々の特性の追加実施例を提供する。図７Ａは、高度な行動待機時間の例外ハンドラについて詳述する。例外ハンドラを始動した同じ実行ドメインが、データを抽出することは必要条件ではない。図７Ａでは、ドメイン７１０は、例外ハンドラ７１２を始動し、ドメイン７１８が、結果を受信する。一部の例示的例外ハンドラは、例えば、＄ｄｉｓｐｌａｙ（）または＄ｍｅｍ＿ｗｒｉｔｅ（）演算等の抽出（ＧｅｔＤａｔａ）構成要素を有していない。＄ｍｅｍ＿ｒｅａｄ（）または＄ｒｅａｄｍｅｍｈ（）等の他のものは、有している。有している場合、データ抽出は、準備ができるとスケジュール可能であって、まさに異なる実行ドメイン内にある場合がある。ソフトウェアスケジューラは、データ抽出構成要素を有する既に始動された全要求を記録し、その行動待機時間と一致させてスケジュールする。この特性は、より大きな実行ドメインを生成する際に強固な構成要素であって、ＶＬＩＷスケジューリングの際のより高い効率命令レベル並列度のために好ましい。
【０１３０】
図７Ｂは、割り込み／リターン機構について詳述する。分岐７２２は、ドメイン７２０から始動される。しかしながら、リターンは、直ぐ次のアドレスへではない。むしろ、リターン７２４は、後のアドレス（ＡＤＤＲフィールド）へである。これは、スケジューラの柔軟性を強調し、さらに別のｉｆ−ｔｈｅｎ−ｅｌｓｅ構文を示す。ｉｆ分岐は、アドレスＪＵＭＰ１へジャンプ７２２し、例外ハンドラをスケジュールし、アドレスＡＤＤＲへリターン７２４する。ｅｌｓｅ分岐は、ＪＵＭＰ１へジャンプしない。むしろ、親ドメイン７２０内で計算７２６を継続する。この構造は、複数のコンピュータを使用して並列にスケジュール（コンパイル）可能である（階層的スケジューリング）より大きなドメインに対し有用である。
【０１３１】
図７Ｃは、類似構文を示すが、次にルーピングに適用される。ループテストは、条件付き分岐である。！ＣＯＮＤの場合、実行は、ＪＵＭＰ１へジャンプ７３２する。そうでなければ、ループは完了し、実行は、ドメイン７３０の残りを継続する。
【０１３２】
図７Ｄは、コード複製について詳述する。この実施例では、ドメイン７４０は、例外ハンドラ７４２を起動する。実行は、ドメイン７４０、次いで、ドメイン７４４、次いで、ドメインバリアント７４６Ａまたは７４６Ｂ内で並列に継続される。このケースでは、バリアント７４６Ａおよび７４６Ｂの両方が、例外ハンドラからのデータ抽出に依存する。両方とも抽出命令をスケジュールし、行動待機時間を観測する。このケースでは、７４６Ａまたは７４６Ｂのいずれも、インライン展開ではない。例外ハンドラ７４２の使用は、このタスクを実行ドメイン７４６Ａ／Ｂから分離させる。
【０１３３】
（５．Ｃ．例示的クロックドメイン構成）
図３を参照すると、図３は、クロックドメインがプログラムメモリ１２１内で構成される方法を示す。図８は、実行ドメインがクロックドメイン内で構成される方法を示す。図３の右側に示されるクロックドメイン構成は、図８の中間に復元される。図８の右側は、クロックドメインＣＫＮが実行ドメインに分割される方法を示す。ドメインＴは、トップ実行ドメイン、すなわち、制御ドメインＣＤから起動される第１のドメインである。ドメインＡ〜Ｆは、他の実行ドメインである。制御ドメインは、複数の実行ドメインを起動し得ることに留意されたい。各実行ドメインが、単一トップドメインに制限される必要はない。
【０１３４】
また、図８は、ＣＫＮ命令ドメインが再配置され得る方法を示す。ＣＫＮドメイン内の全ＪＵＭＰ命令が相対的であって、調節が必要ないと仮定する。ＣＫＮドメイン外へのＪＵＭＰ命令（ＪＵＭＰＧ）のみ、再計算される必要がある。これは、コード再使用に対し有用である。回路設計のためのシミュレーションに関連し、これは、回路設計が複数回使用される場合、対応する実行ドメインもまた、再使用可能であるため有益である。さらに、実行ドメインは、再使用に応じて再コンパイルされる必要はなく、したがって、暗号化および保護可能である。
【０１３５】
また、図８は、実行ドメインＳ１〜Ｓ８を有するグローバルな性質である共有ライブラリを示す。例えば、このライブラリは、実行ドメインとして実行可能な事前コンパイルされた例外ハンドラを含むことが可能である。通常、これらは、スケジューラ、または事前選択値およびアドレスをダンプするために使用可能であるため、ランタイムをデバッグする際に使用される。便宜上、ＮＥＸＴ＿ＡＤＤＲで示される単一アドレスは、共有機能のそれぞれのジャンプ先を反映する。クロックドメインＣＫＮ内の特定のアドレスへリターンするために、このアドレスＮＥＸＴ＿ＡＤＤＲは、所望のリターンアドレスで上書きされる。この特定の実施例では、１つだけがアクティブであり得るため、この構造は、共有モジュールの各グループに対し繰り返されることに留意されたい。複数モジュールは、同時にアクティブである必要がある場合、構成可能である。
【０１３６】
さらに、ＮＥＸＴ＿ＡＤＤＲフィールドは、オフチップメモリ（プログラムメモリ１２１）ではなく、オンチップメモリ内に格納可能である。これは、非効率的となり得る、実行の際のプログラムメモリ１２１内への書き込みの必要性を回避する。これは、間接ジャンプと称される。間接ジャンプの処理は、ＰＥ命令ではなく、ＶＬＩＷ状態機械コントローラを介して行われる。ＮＥＸＴ＿ＡＤＤＲフィールドは、状態機械をトリガし、オンチップメモリから実際の次のアドレスをルックアップする予約アドレスである。実際の次のアドレスは、自動的またはプログラムによって書き込まれる。自動的とは、Ｓ１〜Ｓ８ドメインを起動する際に、プログラムカウンタメモリ内の次のアドレスが自動的にオンチップメモリ内に格納されることを意味する。プログラムによってとは、プログラム命令下行われることを意味する。例えば、新しい特別な「オーバーロード」ＰＥ命令は、コンパイラ生成アドレス（グローバルまたは相対）をこのオンチップメモリ内に格納するように追加可能である。自動的方法は、自動的ジャンプ−リターンを可能にし、プログラム的方法は、ジャンプアドレスを継続のために選択可能にする。
【０１３７】
（６．ＶＬＩＷコンパイルおよびスケジューリング）
（６．Ａ．概要）
ＶＬＩＷスケジューリングは、周期的または非周期的に行うことが可能である。周期的スケジューラは、プログラム内のループ上で動作し、非周期的スケジューラは、ループフリー領域上で動作する。領域は、最初から侵入可能な実行ドメインのグループであって、従来のＶＬＩＷアーキテクチャと異なり、本アーキテクチャは、領域への割り込みも可能である。「リターン」ステートメント（すなわち、割り込みを使用した領域内のルーピング）もまた、ＶＬＩＷアーキテクチャから生じ、スケジュールされたプログラム（または、ネットリスト）からは生じない特定の制限下において可能である。領域形成は、スケジューリングの効率に影響を及ぼす。コンパイラ技術は、領域を拡張するために使用可能であって、それは、概して、より効率的スケジューリングとなる。例えば、「ループ展開」と呼ばれる技術は、プログラム内のループをループフリー領域に変換するために適用可能であって、非周期的スケジューラのループ上での動作を可能にする。本アーキテクチャは、概して、任意の領域サイズを可能にし、これは、論理シミュレーションおよび一般的プログラミングアプリケーション（以下のセクション９参照）の両方に対し大きな利点である。
【０１３８】
図９に示されるように、ＶＬＩＷスケジューリングは、概して、領域形成９１０およびスケジュール構成９２０のステップを含む。領域形成９１０は、プログラム／設計を領域に分割９１２するステップと、領域内の命令の実行を並列化９１４するステップとを含む。スケジュール構成９２０は、領域のためのスケジューリングを圧縮９２２（すなわち、プログラム／設計をスケジューリング）するステップと、プログラム／設計内の領域を接続９２４（すなわち、制御論理を追加）するステップとを含む。
【０１３９】
従来のＶＬＩＷスケジューリングでは、共通領域は、以下を含む。「基本ブロック」は、単一入口、単一出口、分岐のないブロックである。プログラムは、最初から侵入し、最後に終了し、分岐は許容されない。「トレース」は、可能な限り多くのコードを展開し、最も生じる可能性のある分岐をとることによって、形成される単一入口、単一出口ブロックである。「スーパーブロック」は、単一入口、複数出口、内部分岐のない（すなわち、ルーピング）ブロックである。プログラムは、最初から侵入し、ブロックの最後に最初にジャンプして戻ることが可能であって、スーパーブロック外の分岐を可能にする。「ハイパーブロック」は、単一入口、複数出口、内部分岐可能ブロックである。本質的に、内部分岐制御を有するスーパーブロックは、通常、ｉｆ変換を使用する（論理マッピングでは、これは、マルチプレクサに供給するコーンが大きくない限り、ほとんどのマルチプレクサ論理がマッピングされる方法である）。「ツリー領域（ｔｒｅｅｇｉｏｎ）」は、単一入口、複数出口、内部分岐可能ブロックである。各ツリー領域は、各基本ブロッが、領域内に正確に１つの先行オペレーションを有する特性を有する、基本ブロックの集合として識別される。これは、スーパーブロック内に形成するツリー領域を通る任意のパスとなる（割り込みなし）。「末尾複製」もまた、割り込みを回避するための一般的拡張技術である。
【０１４０】
しかしながら、上述のＶＬＩＷアプローチに、２つの追加特性（領域内への割り込みジャンプおよび例外ハンドラ）が導入される。その結果、領域を生成する能力は、上述のＶＬＩＷ領域の共通セットに制限されない。これらの２つの追加特性のため、効率は、従来のＶＬＩＷ領域形成およびスケジューリング技術と比較して、大幅に向上可能である。
【０１４１】
従来のＶＬＩＷでは、領域が形成されると、各領域は、ＩＬＰ（命令レベル並列度）のためにスケジュールされる。複製領域が存在してもよく（末尾複製）、または領域は、ｉｆ変換技術を使用して形成されてもよい。しかしながら、本アーキテクチャでは、領域フォーマッタは、従来のＶＬＩＷよりも優れた柔軟性を有し得る。本質的に、領域形成は、スケジュール命令と制御命令との間のトレードオフを生じさせている。図６〜７を参照すると、スケジュール命令は、実行ドメインとして視覚化可能であって、制御命令は、種々のジャンプ命令（ｉｆ−ｔｈｅｎ−ｅｌｓｅ、ｃａｓｅ、ｆｏｒ、ｗｈｉｌｅ等）として視覚化可能である。
【０１４２】
従来のＶＬＩＷスケジューリングでは、制御命令は、領域を複数のより小さな領域（例えば、キャッシュコヒーレンス問題を回避するため）に分割させる。しかしながら、概して、ＶＬＩＷスケジューリングのための計算効率を向上させるために、領域のサイズを増加させることが望ましい。対照的に、本アーキテクチャ下では、ＶＬＩＷプロセッサは、オフチップメモリから直接各命令を読み込む。命令キャッシュが（したがって、キャッシュコヒーレンス問題も）削除されているため、これは、ほとんどコストをかけずに、１つの実行ドメインから別の実行ドメインへのジャンプのスケジューリングを可能にする。言い換えると、ＶＬＩＷ効率は、実行ドメインのサイズにそれほど依存していない。領域は、多くの実行ドメインから成ることが可能である。このケースでは、実行ドメインを通過するパスであるトレースは、動的制御下、偶然作動されるトレースのみ実行するために動的に調節可能である。すべての他のトレースは、実行されない。
【０１４３】
従来のトレースベースのＶＬＩＷスケジューリングは、予測されたトレースが実行される場合効率的であるが、予測されないトレースが使用される場合非効率的である。トレースが１０個のｉｆ−ｔｈｅｎ−ｅｌｓｅ決定点を含み、各決定が、９０％のｙｅｓの可能性および１０％のｎｏの可能性を有する場合、連続して１０個のｙｅｓトレースの統計的可能性は、（０．９）１０のみ、すなわち３５％である。発生の統計的可能性は低いが、他の可能性のあるトレースのそれぞれのためのトレースを複製するために、末尾複製が必要とされ、末尾複製の各レベルに対しほぼ２倍に命令コードを増加させ得、コードオーバーヘッドが大きくなる。対照的に、本ＶＬＩＷアーキテクチャでは、各ｉｆ−ｔｈｅｎ−ｅｌｓｅトレースは、結合され、コード複製および実行オーバーヘッドがなく、正確なシーケンスを提供可能である。ジャンプの効率的実装は、前述の従来の技術に制限された領域（トレース、スーパーブロック、ハイパーブロック、ツリー領域）を生成する必要性をなくす。
【０１４４】
（６．Ｂ．領域拡大）
ＶＬＩＷ効率は、領域のサイズに関連するため、領域拡張技術は、好ましくは、領域のサイズを増加させるために使用される。そのような技術の１つは、ループ展開であって、本質的に、ループ本体をインライン展開する。別のそのような技術は、トレーススケジューリングであって、ほとんどの一般的トレースは、事前計算され、事前計算されたトレースのそれぞれのためのループフリー領域となる。これは、これらのトレースに対しより高速実行を可能にする。「一般的」領域は、（「他のトレースすべて」に対し）より低速で実行する可能性のある、より煩雑なループ起動スケジューリングを処理する。これは、小さなスケール基準およびより大きなスケール基準の両方に基づいて行われ得る。別のそのような技術は、末尾複製であって、領域は、類似の結末を共有するトレースを有する。このケースでは、エンドコードは共有され、末尾に必要とされるコードのみ要求される。Ｉｆ変換は、ｉｆ−ｔｈｅｎ−ｅｌｓｅの両方の分岐が評価され、結果の１つだけが前へ進められる技術であるが、今や、静的にスケジュール可能である。これは、余剰（不必要）計算時間を代償にして、可能性のある分岐の数を低減する。
【０１４５】
しかしながら、従来のＶＬＩＷスケジューリングに必ずしも適用可能ではない他の領域拡張技術が、ＶＬＩＷプロセッサ内の処理要素の数の増加に応じて使用可能である。概して、拡張技術は、ループ展開等のより高いＶＬＩＷ効率を可能にする。しかしながら、多数のプロセッサの場合、ｉｆまたはｅｌｓｅの実行ドメインへジャンプ（制御フローマッピング）せず、ｉｆ−ｔｈｅｎ−ｅｌｓｅ構文（Ｉｆ変換）の両式を計算する方が良い場合がある。あるケースでは、基本ブロックジャンプおよび分岐がスケジュールされた場合、ＶＬＩＷプロセッサの完全効率は、達成されない場合がある。
【０１４６】
拡張技術の３つの特定の実施例は、ループアンフォールディング、ｉｆ−ｔｈｅｎ−ｅｌｓｅ変換、および例外ハンドラである。ループアンフォールディングは、ループ展開のより一般的ケースである。ループ展開は、直接的であるが、全変数が既知およびバインドされる場合のみ可能である。これが当てはまらない場合、ループは、依然として、より複雑なスキームを使用してアンフォールド可能である。実施例は、ループピーリング、ループアンフォールディング、準不変／指標変数、およびアンフォールディング因子を含む。
【０１４７】
Ｉｆ−ｔｈｅｎ−ｅｌｓｅ変換は、両方の応答の実行と、その後の所望の１つの選択である。チップ論理では、これは、ＭＵＸ演算子と称され、２つの入力は、ｉｆ−およびｅｌｓｅ−分岐として見られる。セレクタは、どの値をとるか選択する。
【０１４８】
例外ハンドラに対し、実行ドメインは、その後処理される結果を生成する例外（ＢＰまたはＥＢ）を始動可能である。この技術では、そのようなデータは、異なる実行ドメイン内で抽出可能であって、これは、ＶＬＩＷスケジュールを簡素化し、制御フローグラフ（Ｃｏｎｔｒｏｌ  Ｆｌｏｗ  Ｇｒａｐｈ；ＣＦＧ）を低減するための強力な方法である。
【０１４９】
多重ジャンプは、ケースステートメントを制御ステートメントに変換（逆もまた同様）するために使用可能なケースステートメントのための特定のＢＰである。合成可能構文内のケースステートメントは、合成（アンフォールド）され、単一実行ドメイン内で完全に実行され得る。ケースステートメントを制御ステートメントとして処理する利点は、コンパイラが、種々のケース評価実行ドメインを独立にスケジュールすることを可能にし、したがって、評価が必要な実行ドメインのみアクティブとなる。したがって、性能が向上する。ケースステートメントをアンフォールドされた実行ドメインとして処理する利点は、ケースステートメント論理が、他の論理と重ねてスケジュール可能であって、特別な処理を必要としないことである。当然ながら、このソリューションでは、アクティブなものだけではなく、可能性のある全ケースが評価される。アクティブなものは、受信論理内へと前方へ伝搬される。コンパイラは、ケースのそれぞれのサイズを分析し、大きい場合、多重ジャンプを支持し、小さい場合、展開アプローチを支持する。
【０１５０】
この説明は、コンパイラが恣意的な領域を生成可能であることを示す。コンパイラは、好ましくは、制御挿入（ＪＵＭＰ）および削除（アンフォールディング）を可能にし、サイドからのドメインへの侵入（ＮＥＸＴ  ＡＤＤＲ、ＳＫＩＰ  ＡＤＤＲ）を可能にし、オーバーヘッドがゼロまたはほとんどない、条件付き分岐（単一サイクル「ｉｆ（式）」評価）を可能にし、可変待機時間演算子をスケジュール、低速インターフェース（例えば、ファイルＩ／Ｏ）にアクセスするため、またはそうでなければ展開できないコードを簡単に処理するために使用可能な可変種の例外ハンドラを可能にする選択肢を有する。
【０１５１】
（６．Ｃ．動的条件を含む、インライン展開、起動、または展開）
典型的には、大きい並列演算が起動されるのに対し、小さい演算は展開される。展開された演算は、全体ＶＬＩＷ効率を向上（ループ展開）し得るし、低減（Ｉｆ変換：余剰な不必要演算がスケジュールされ得る）もし得るが、これは、より大きな領域を生成することによって、ＶＬＩＷパッキングが増加するという点において補償される。以下は、共通コード構造の実施例である。
【０１５２】
関数Ａ（ｖａｒ，ｉ）｛
ｆｏｒ（；ｉ＜１０；ｉ＋＋）              ／／ｉは動的、静的に未知
ｖａｒ＝関数Ｂ（ｖａｒ）；                  ／／サブルーチンコール
｝
関数Ｂ（ｂ）｛                            ／／サブルーチン関数
ｂ＝ｂ＊２；
ｒｅｔｕｒｎ  ｂ；                        ／／関数Ｂの本体
｝
言語およびアプリケーションに応じて、サブルーチンの本体は、例えば、長い論理（６４ビット、１２８ビット）および複素演算のための大きい実行ブロックを生成可能である。
【０１５３】
ルーピングを起動するインライン展開コードは、実行ドメイン内でジャンプを使用するが、サブルーチンジャンプは、回避可能である。上述の実施例は、以下のようにインライン展開可能である。
【０１５４】
関数Ａ（ｖａｒ，ｉ）｛
ｆｏｒ（；ｉ＜１０；ｉ＋＋）
ｖａｒ＝ｖａｒ＊２；          ／／機能Ｂのコンテンツ（本体）
｝
インライン展開は、ジャンピング（ルーピング）を解決しないが、関数呼び出しをサブルーチンの本体に代えることによって、サブルーチンコールを回避する。そうすることによって、コードを拡大するが、関数スタックコールを回避する。コードおよびアプリケーションに応じて、これは、好ましいトレードオフを有し得る。以下は、別のインライン展開実施例である。左側の数は、ＰＣ（プログラムカウンタ）レジスタのメモリアドレスであると仮定される。コメントは、右側に提供される。
【０１５５】
０１００００：                                ／／前のコードブロック
０１０００１：ｉｆ（ｉ＞＝１０）ＪＵＭＰ０１０００５；            ／／割り込みアドレス、エンドループのためのテスト
０１０００２：ｖａｒ＝ｖａｒ＊２；        ／／関数Ｂ実行ドメインコード
０１０００３：ｉ＝ｉ＋１；                ／／変数ｉをアップデート
０１０００４：ＪＵＭＰ０１０００１；      ／／終了：割り込み場所へのジャンプ
０１０００５：・・・                      ／／コード継続、ループ完了
このアプローチは、関数Ｂへのコールを完全に削除するが、分岐を削除しない。ｆｏｒループ実行は、依然として、分岐命令を必要とする。変数ｉがコンパイル時間において未知である（動的変数）という事実は、制限ではなく、アドレス０１０００１および０１０００４の両方におけるＪＵＭＰを必要とし、ｉが既知である場合、ＪＵＭＰはアドレス０１０００４においてだけ必要とされ得るということに留意されたい。同様に、終了条件（このケースでは１０）もまた、動的である場合、コード実施例は、終了条件が、本体の実行の際に変化を受ける場合でも、依然として、適合するであろう。
【０１５６】
展開コードは、完全に拡張されるコードである。ループの展開は、いくつの反復が存在するか静的に（すなわち、コンパイル時において）判断可能な場合のみ可能である。提供される実施例では（ｉは動的である）、ループは、展開不可能である。しかしながら、ｉが関数Ａ内で代入される、例えば、
ｉ＝０；
である場合、有界ループが存在する。ｆｏｒ（ｉ＝０；ｉ＜１０；ｉ＋＋）は、正確に１０回実行される（静的に判断される）。コードは、展開可能であって、これは、関数の本体は、正確に１０回インスタンスが作成されることになる。以下に示されるように、代入ｖａｒ＝ｖａｒ＊２の１０のインスタンスがある。これは、典型的には、合成またはソフトウェアコンパイラ技術である。
【０１５７】
２０００００：ｖａｒ＝ｖａｒ＊２；／／ｉ＝０
２００００１：ｖａｒ＝ｖａｒ＊２；／／ｉ＝１
２００００２：ｖａｒ＝ｖａｒ＊２；／／ｉ＝２
２００００３：ｖａｒ＝ｖａｒ＊２；／／ｉ＝３
２００００４：ｖａｒ＝ｖａｒ＊２；／／ｉ＝４
２００００５：ｖａｒ＝ｖａｒ＊２；／／ｉ＝５
２００００６：ｖａｒ＝ｖａｒ＊２；／／ｉ＝６
２００００７：ｖａｒ＝ｖａｒ＊２；／／ｉ＝７
２００００８：ｖａｒ＝ｖａｒ＊２；／／ｉ＝８
２０００１０：ｖａｒ＝ｖａｒ＊２；／／ｉ＝９
２０００１１：  …  ／／ここでコードは継続：ＪＵＭＰはない
概して、展開されたコードは、被起動コードよりも高速実行時間をもたらす。増加した命令サイズを代償にして、制御評価を回避する。コンパイラは、好ましくは、命令サイズと制御評価時間との比率を分析する。典型的には、命令サイズが大きくなるほど、起動はより有利に働き、逆もまた同様であって、小命令コードセグメントは、制御演算を回避するように単に展開可され得る。
【０１５８】
展開されたコードは、特定の動的条件を処理するための条件チェックと組み合わせ可能である。これは、典型的には、合成を使用する際に、シミュレーション加速において行われる。すべての展開された分岐が実行されるが、動的制御が、結果を分解するために使用される。上述の実施例は、以下のように実装され得る。
【０１５９】
ｉｆ（ｉ＜０）
ＥＲＲＯＲ−ｉ＜０のケースに対応できない；／／本実施例の場合
ｉｆ（ｉ＜ｌ）      ／／ｉ＝０；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜２）      ／／ｉ＝ｌ；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜３）      ／／ｉ＝２；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜４）      ／／ｉ＝３；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜５）      ／／ｉ＝４；
ｖａｒ＝ｖａｒ２
ｉｆ（ｉ＜６）      ／／ｉ＝５；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜７）      ／／ｉ＝６；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜８）      ／／ｉ＝７；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜９）      ／／ｉ＝８；
ｖａｒ＝ｖａｒ＊２
ｉｆ（ｉ＜１０）    ／／ｉ＝９；
ｖａｒ＝ｖａｒ＊２
本実施例は、０以上であるｉの動的値に対し正しい。シミュレーション加速では、合成は、すべての本体を合成し、これらは、常に実行される。フローは、所望の結果を得るために、順に多重化することによって処理される。全分岐が常に実行されるため、分岐内に含まれる状態機械情報が維持不可能であることは明白であるはずである。状態機械は、本体が実行される場合のみアップデートされるはずである。これは、行動コードを効率的に処理できないため、合成されたアプローチの別の制限となる。合成は、理論的には、論理をさらに追加することによって、行動状態機械を処理可能であるが、これは、典型的には、論理の過量を代償にすることになる。
【０１６０】
概して、展開は、以下の条件下において好ましい。１）ループパラメータ（開始および終了）が、静的に判断可能である（コンパイル時において）、２）ループの本体は、現在の関数（範囲）内で拡張可能である、３）スケジュールされたコード量は、スケジューリング制限内にある。合成技術は、典型的には、展開技術をループに適用し、したがって、これらの制限を受けることに留意されたい。
【０１６１】
被起動コードは、別の実行ドメインへのジャンプを使用して実行されるコードである。呼び出しサブルーチン関数Ｂを呼び出す関数Ａの我々の実施例では、通常プログラミングにおける関数Ｂのコールは、通常、スタック（プッシュ／ポップ）を使用して実装される。本アーキテクチャでは、これは、ジャンプとして処理可能であって、スタック演算は、典型的には、回避される（小関数に対し不必要オーバーヘッドとみなされ、より大きな関数に対しては、スタック機構が利用可能である）。ｉｆ−ｔｈｅｎ−ｅｌｓｅおよびルーピング構文の両方が、インライン展開または起動可能である。好ましい実施形態におけるその区別は、スケジューラに大幅に依存する。構文が、単一プログラムによってスケジュールされる場合、割り込み命令が回避可能であるため、インライン展開が、通常、好ましい。子実行ドメインが、別個のプログラム（例えば、階層的コンパイルアプローチを使用する第２のＣＰＵ）によってスケジュールされる場合、起動が好ましい。単に、メモリ１２１におけるコード配列である。起動は、通常、コードの本体がスタックされることを必要とし、インライン展開は、通常、オンザフライで行うことが可能である。インライン展開されたコードおよび被起動コードの実施例は、上述のセクション４．Ｅ．で提供された。インライン展開または起動のいずれも、展開コードの制限を受けないことに留意されたい。したがって、「合成不可能」とみなされるシミュレーションにおける構文に適用可能である。
【０１６２】
次に、以下の一般的実施例を検討する。
【０１６３】
ｆｏｒ（ｉ＝ＳＴＡＲＴ；ｉ＜ＥＮＤ；ｉ＋＋）ｂｏｄｙ（ｉ）；
Ｎ＿ＩＴＥＲ＝反復数（Ｎ＿ＩＴＥＲ＝ＥＮＤ−ＳＴＡＲＴ、ＥＮＤ＞＝ＳＴＡＲＴと仮定）およびＳＩＺＥ＿ＯＦ＿ＢＯＤＹ＝本体のサイズとする。
【０１６４】
Ｎ＿ＩＴＥＲが、静的（すなわち、コンパイル時において判断可能）である場合、したがって、反復数は、あらかじめ既知である。このケースでは、本体は、展開されたものとして実装可能であって、展開されたコードのサイズは、ＳＩＺＥ＿ＵＮＲＯＬＬＥＤ＝Ｎ＿ＩＴＥＲ＊ＳＩＺＥ＿ＯＦ＿ＢＯＤＹとして計算可能である。加えて、Ｎ＿ＩＴＥＲが静的または動的であるかにかかわらず、本体もまた、インライン展開されたものとして（実行ドメイン内のジャンプを使用して、本体をＮ＿ＩＴＥＲ回繰り返すことによって）、または被起動として（本体を含む別個の実行ドメインへＮ＿ＩＴＥＲ回ジャンプすることによって）実装可能である。
【０１６５】
ＳＩＺＥ＿ＵＮＲＯＬＬＥＤが相対的に小さい場合、展開アプローチが、概して、好ましい（合成可能）。そうでなければ、ＳＩＺＥ＿ＯＦ＿ＢＯＤＹが、コンパイルの際に使用される。インライン展開アプローチは、概して、相対的に小さいＳＩＺＥ＿ＯＦ＿ＢＯＤＹに対し好ましく、被起動アプローチは、概して、相対的に大きいＳＩＺＥ＿ＯＦ＿ＢＯＤＹに対し好ましい。
【０１６６】
また、コードは、展開されたコードおよびインライン展開／被起動コードの両方の組み合わせとして実装可能である。この実施例に対し、ＳＴＡＲＴおよびＥＮＤは動的であってもよいが、以下のコードの実行の際には変化しないと仮定する。
【０１６７】
ｔｅｓｔ＝ＥＮＤ−ＳＴＡＲＴ；
ｉｆ（ｔｅｓｔ＞ＭＡＸ）｛
ＣｏｄｅＢｌｏｃｋ１／／インライン展開または被起動コードをここに置く、すなわち、ＭＡＸ反復制限はない
｝ｅｌｓｅ｛
ＣｏｄｅＢｌｏｃｋ２／／展開コードをここに置く、すなわち、ＭＡＸ反復制限
｝
このアプローチでは、コードは、ＭＡＸ反復までに対し静的に実行（展開）され、ＭＡＸ反復以上に対し動的に実行（起動）される。これは、より大きな命令コード、すなわち、命令コードのためのより多くのストレージを必要とするが、概して、性能のさらなる最適化を可能にする。セクション４．Ｆで上述のように、このアプローチは、動的に選択可能な（「ｔｅｓｔ」という変数に基づいて）ドメインＣｏｄｅＢｌｏｃｋ１およびＣｏｄｅＢｌｏｃｋ２をもたらす。つまり、静的アプローチを使用するか、または動的アプローチを使用するかの決定は、実行の際に動的に判断される。つまり、コンパイラは、論理を阻害することなく、性能およびサイズの両方を最適化可能である。ドメインＣｏｄｅＢｌｏｃｋ１は、テストの全値に対し作用するように保証されるが、概して、低速である。ドメインＣｏｄｅＢｌｏｃｋ２は、高速であるが、テストの特定の値のみに作用する。２つのコードバリアントＣｏｄｅＢｌｏｃｋ１とＣｏｄｅＢｌｏｃｋ２との間の選択は、上述のように、動的になされ得る。
【０１６８】
好ましい実施形態では、最適化は、コード最小化および実行速度の両方に対しなされる。コードの爆発的な増大は、通常、オフチップ（非常に大きい）命令キャッシュによって問題ではないため、実行速度最適化は、典型的には、好ましい。ループピーリングおよびバリアントコード移動におけるループ等のより複雑なマッピング技術もまた、適用可能である。
【０１６９】
（６．Ｄ．行動マッピングのための合成拡張）
論理シミュレーションに関連して、上述の議論は、動的変数を処理する際の合成の制限を指摘する。典型的には、合成は、展開技術だけに限られ、動的制御を処理するために、複合状態機械を生成することを必要とされる。複合状態機械は、行動がマッピングされる場合、指数関数的に増加する（状態変数が生じ得るすべての可能性のある組み合わせに対して生成される必要があるため）。行動実行は、これを回避し、行動コードに対し非常に効率的である。加えて、記載のＶＬＩＷアーキテクチャは、マッピングにおいてさらなる効率を可能にする。
【０１７０】
具体的には、合成不可能論理の処理を可能にするために適用される技術の一部は、条件付きおよび無条件分岐、恣意的感度、複数のプロセスから書き込み可能な行動レジスタ、および非ブロッキング代入である。この開示のほとんどは、非有界ループのマッピングを可能にする条件付きおよび無条件分岐に対処する。分岐およびルーピングの実施例は、以下である。
【０１７１】
．ｉｆ＜ｃｏｎｄ＞，．ｅｌｓｅ，．ｅｎｄｉｆ
．ｗｈｉｌｅ＜ｃｏｎｄ＞，．ｅｎｄｗｈｉｌｅ
．ｌａｂｅｌ＜ｌａｂｅｌ＿ｎａｍｅ＞
．ｇｏｔｏ＜ｌａｂｅｌ＿ｎａｍｅ＞
．ｃｇｏｔｏ＜ｃｏｎｄ＞＜ｌａｂｅｌ＿ｎａｍｅ＞
恣意的感度は、合成が、典型的には、混合エッジおよびレベル感度を拒絶するため、合成に対し好ましい。実施例は、以下である。
【０１７２】
．ｐｏｓｅｄｇｅ＜ｓｉｇｎａｌ＞
．ｎｅｇｅｄｇｅ＜ｓｉｇｎａｌ＞
．ａｎｙｅｄｇｅ＜ｓｉｇｎａｌ＞
行動レジスタは、クロックドメインマッピングから独立して、名前によってアドレス指定可能なレジスタである。これらは、一時レジスタ空間を使用して実装可能である。これは、複数のプロセスにレジスタを共有可能にし、それもまた、以下の合成を通して実行可能ではない。
【０１７３】
．ｒｅｇ＜ｒｅｇ＿ｎａｍｅ＞
これは、以下の種類の合成されたレジスタと対照的である。
【０１７４】
．ｆｆ＜ｆｆ＿ｎａｍｅ＞＜ｃｌｋ＞＜ｏｐｔｉｏｎｓ＞
行動モデルにおける非ブロッキング代入は、ブロッキング代入と混合される場合が多い。合成は、これを拒絶する。
【０１７５】
．ｎｂａ＜ｒｈｓ＞＜ｌｈｓ＞    ／／ｒｈｓ＝右側、ｌｈｓ＝左側
前述の技術の包含は、概して、全プロセッサにすべての一時データへのアクセスを任意のときに提供するローカルメモリ１０４と連結され、クロックドメインスケジューリングおよびクロックドメインアーキテクチャと連結され、合成不可能タスクを処理可能な効率的ＶＬＩＷアーキテクチャを可能にする種々の種類の例外ハンドラと結合された、条件付きおよび無条件分岐オペランドの両方の可用性を必要とする。これは、ハードウェア記述言語（Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ；ＨＤＬ）およびより一般的行動言語の両方のための完全言語マッピングを可能にする。ＨＤＬ言語は、合成プロセスを通して利用される内蔵並列性を有する。より一般的行動言語は、典型的には、加速目的のための並列性の摘出を必要とし、その加速の成功は、アプリケーションおよびコード構造に依存する。
【０１７６】
（６．Ｅ．並列化）
上述のように、コンパイラは、サイズ、ＶＬＩＷスケジューリングおよびパッキング効率に基づいて、任意に領域を生成可能である。次に、ＶＬＩＷアーキテクチャ内の別の要素（並列化）を検討する。プログラムおよび設計（ネットリスト）の両方を検討する。
【０１７７】
並列言語（ＶｅｒｉｌｏｇまたはＶＨＤＬ等）の観点から既に定義されている設計（例えば、ネットリスト）では、並列化は、合成を適用することによって実現される。また、これは、論理をスカラー化し、効率的パッキング（すなわち、単一実行ドメイン内の多くのＶＬＩＷ演算）を可能にする。代償として、多重分岐セクションで説明されたように、多くの並列パスが必要でなく、ＶＬＩＷは、その最大潜在性を実現しない。コンパイラは、好ましくは、領域（プログラムコードサイズ）ではなく、性能に対し最適化するため、トレードオフは、概して、実行時間に有利に働く。実行ドメインが小さ過ぎると、分岐は、非効率となり、拡張技術は、より優れた性能をもたらすだろう。拡張技術が大きい実行ドメインで使用される場合、結果として生じる冗長並列パス評価は、過剰なＶＬＩＷ演算を生じさせ、実行速度を減速する場合がある。
【０１７８】
慎重に領域を生成し、代替バリアントを分析し、多重分岐し、領域拡張技術および例外ハンドラを適用することによって、コンパイラは、特定のプログラムメモリ１２１制限サイズを考慮して、その実行が最大化されるように、結果として生じるプログラムマッピングを最適化可能である。本明細書に記載の技術を使用することによって、コンパイラは、ＣＦＧ（制御フローグラフ）を変換し、設計（ネットリスト）および（並列化）プログラムの両方のための効率的ＶＬＩＷ実行を可能にする。
【０１７９】
領域へのユーザプログラムコードのマッピングでは、ユーザプログラムコードは、通常、最初に並列化される。多くの既知の技術が存在する。非常に特異種の並列化は、ＮＣ問題のマッピングである（以下のＮｉｃｋ’ｓ  Ｃｌａｓｓセクションを参照）。この技術の使用は、個々のプロセッサソリューションと比較して、より優れた線形加速を達成可能である。
【０１８０】
（６．Ｆ．スケジュール構成：コンパクション、制御、および構成）
制御フローグラフが決定されると、コードの特定の部分は、例外ハンドラを通して起動、展開、または処理されるであろう。スケジューラは、各実行ドメインを分析し、ＶＬＩＷスケジュールされたコードを生成する。このプロセスは、コンパクションと称される。割り込みリターン構文およびデータをリターン（抽出）する例外ハンドラに対し配慮すべきである。
【０１８１】
コンパイラでは、スケジューリングの際に記号アドレスが使用される。全実行ドメインを接続する制御グラフは、各ドメイン内でスケジュールされる。このプロセスは、追加制御と称される。
【０１８２】
次に、スケジューラは、ドメインを構成する。本質的に、これは、全ジャンプアドレスを接続するメモリ配列である。これらのアドレスは、図３および８に示されるように、メモリ配列を実現するための相対および絶対の両方の、プログラムメモリ１２１内の物理的メモリアドレスに変換される。
【０１８３】
（６．Ｇ．要約）
大きい設計／プログラムをマッピングする場合、領域は、好ましくは、高レベルの命令レベル並列度（ＩＬＰ）が生成可能なように形成される。上述の領域形成技術を使用して、領域は、上述のスケジューリング構成技術を使用して最適化可能なように形成可能である。
【０１８４】
大きなプログラムに適用されるか、または大きな設計（ネットリスト）に適用されるかにかかわらず、アプローチは、概して、同一である。分割される各領域は、最も大きい効率のためにスケジュールされる。領域は、制御命令（条件付き分岐、多重分岐、無条件分岐、ジャンプ、ＮＥＸＴ＿ＡＤＤＲ）を使用して、共に接続される。領域は、既知の拡張技術および例外ハンドラ等の技術を使用して拡大される。インフライトである例外ハンドラ（行動モジュール：ＲｅｔｒｉｅｖｅＤａｔａ等）が尊重されるべきであるため、領域が末尾複製を有する場合配慮される。ハードウェア実装に応じて、これを最適化するために利用可能なソフトウェアおよびハードウェアの両方のソリューションがある。
【０１８５】
再び図９を参照すると、この図は、プログラムまたは設計（ネットリスト）のＶＬＩＷプログラムへの変換可能な方法を示す。領域形成９１０では、プログラム／設計は、分析９１１され、領域は、余剰プログラムコードを代償にして、実行がより効率的となり得るように、構築９１２される。典型的技術は、末尾複製、ループ展開、ループピーリング、ターゲット拡張等である。次いで、各コード領域は、典型的には、パラレライザプログラム、すなわち、プログラムのためのＮＣ→ＰＲＡＭスケジュールコンバータおよび／または設計（ネットリスト）のための合成ステップを通してマッピングすることによって、並列化９１４される。典型的には、領域は、真のＮＣ→ＰＲＡＭまたは合成ステップに適格ではないことに留意されたい。これは、例外ハンドラが、これらの制限を克服するために利用可能な場合である（例えば、合成ステップでは、「合成不可能」構文は、これらの行動モジュールにマッピングされ、残りの論理のための合成が行われることを可能にする）。
【０１８６】
スケジュール構成９２０では、スケジュールは、コンパクションステップ９２２において各領域に対し構成される。割り込み／リターン命令および行動モジュールに対し配慮すべきである。典型的には、スケジューリングは、サイクルベース、線形、およびグラフベースの技術の組み合わせを使用して行われる。領域形成に基づいて、条件付き分岐、無条件分岐、多重分岐、および行動モジュールを通して実装される制御９２４は、プログラムインテグリティが保証されるように接続される。各スケジュール構成の出力は、各（クロック）ドメインに対する命令ドメイン（実行ドメインの集合体）を形成する。
【０１８７】
構成ステップ９３０は、メモリ内にスケジュールされた命令を配置する。スケジュール構成９２０は、生成されたコードが再配置可能であるため、典型的には、各独立ドメインに対し並列に生じることが可能である。構成９３０は、全ドメインのためのグローバルステップである。このステップでは、トップレベル制御ドメインは、他のドメインのすべてを接続（スケジュール）するように生成される。
【０１８８】
（７．マルチスレッディング）
（７．Ａ．アーキテクチャ拡張）
便宜上、今まで、本開示は、全ＰＥ３０２が、プログラムメモリ１２１内の同一アドレスから命令を受信すると仮定してきた。これは必要ではなく、マルチスレッディングが、サポートされ得る。図１０Ａおよび１０Ｂは、マルチスレッディングに好適なプログラムメモリ１２１のためのアーキテクチャを示すブロック図である。この実施例では、プログラムメモリ１２１は、単一メモリインスタンスとして実装されない。むしろ、Ｎ個の別個のインスタンス１０２１Ａ〜１０２１Ｎとして実装される。プログラムメモリ１２１に対する総帯域幅が２００Ｇｂ／ｓである場合、各メモリインスタンス１０２１に対するメモリ帯域幅は、２００／Ｎ  Ｇｂ／ｓである。ある実装では、各メモリインスタンス１０２１は、同一コントローラによって制御されるメモリチップのグループである。メモリチップの各グループは、典型的には、コントローラの最大動作頻度に対する制御信号の必要ファンアウトのために、５乃至７のメモリチップを含む。
【０１８９】
さらに、図１０Ｂに示されるように、全体プログラムメモリ１２１は、メモリスライス１０２１Ａ〜１０２１Ｎに構成され、各スライスは、メモリインスタンス１０２１Ａ〜１０２１Ｎの１つによって実装される。各メモリインスタンス１０２１（または、メモリスライス）は、別個のメモリコントローラ１０３２Ａ〜１０３２Ｎによってアクセスされ、それらは、アドレス、制御、およびデータビットによって図１０Ｂに表される。ある特定の実装では、プログラムメモリ１２１は、ｒｅｇ［２，５６０］ｍｅｍ［８Ｍ］として、物理的に実現される。言い換えると、プログラムメモリ１２１のデータ幅は、Ｄ＝２５６０ビットであって、これらの８Ｍの２５６０ビットワードが存在する。同等幅のＮ個のメモリスライスがある場合、各スライス１０２ＩＡ〜Ｎは、８Ｍの幅２５６０／Ｎのサブワードを含む。より一般的には、メモリスライス１０２１Ａは、Ｄ１ビット幅であって、スライス１０２１Ｂは、Ｄ２ビット幅、Ｄｌ＋Ｄ２＋…＋ＤＮ＝Ｄである。図１０Ｂでは、メモリスライス１０２１Ａは、最左の高く細い矩形のプログラムメモリ１２１によって表される。それは、メモリコントローラ１０３２Ａによってアクセスされる。メモリスライス１０２１Ｂは、次の高く細い矩形によって表され、メモリコントローラ１０３２Ｂによってアクセスされ、以下同様である。
【０１９０】
このアーキテクチャによって、各メモリスライス１０２１は、別個にアクセスおよび制御可能である。コントローラ１０１０Ａは、Ａｄｄｒｅｓｓ１、Ｃｏｎｔｒｏｌ１、およびＤａｔａ１を使用する。Ｃｏｎｔｒｏｌ１は、データが、メモリスライス１０２１Ａ内のＡｄｄｒｅｓｓ１から読み込まれるべきであることを示す。Ｃｏｎｔｒｏｌ２は、データが、メモリスライス１０２１Ｂ内のＡｄｄｒｅｓｓ２に書き込まれるべきであることを示し得る。Ｃｏｎｔｒｏｌ３は、メモリスライス１０２１Ｃ内のＡｄｄｒｅｓｓ３からの命令フェッチ（データ読み込みの種類）を示し得、以下同様である。このように、各メモリスライス１０２１は、他から独立して動作可能である。また、メモリスライス１０２１は、共に動作可能である。全メモリスライス１０２１のためのアドレスおよび制御が同一である場合、Ｄビットの全体ワードは、プログラムメモリ１２１内の単一アドレスに書き込まれる（または、そこから読み込まれる）だろう。
【０１９１】
図１１および１２は、この柔軟性能力を利用するシミュレーションプロセッサ１００およびプログラムメモリ１２１の例示的構成を示すブロック図である。図１１では、シミュレーションプロセッサ１００は、Ｋ個のプロセッサユニットＵ１〜ＵＫを含む。プロセッサユニットは、メモリコントローラ１０３２Ａ〜１０３２Ｎおよびメモリスライス１０２１Ａ〜１０２１Ｎに対応する、クラスタ１００３Ａ〜１００３Ｎにグループ化される。プロセッサクラスタ１００３Ａは、５つのプロセッサユニットＵ１〜Ｕ５を含む。各プロセッサユニットは、ＰＥ命令２１８Ａ〜２１８Ｅを実行可能である。ＰＥ命令２１８Ａ〜２１８Ｅは、Ｄｌビット幅であるクラスタ命令１０１８Ａを共に形成する。クラスタ命令１０１８Ｂは、Ｄ２ビット幅であって、クラスタ命令１０１８Ｃは、Ｄ３ビット幅であって、以下同様である。クラスタ命令１０１８Ａ〜１０１８Ｎはすべて、Ｄビット幅であるＶＬＩＷ命令１１８を共に形成する。各プロセッサクラスタ１００３が、異なるメモリコントローラ１０３２に対応するため、対応するクラスタ命令１０１８は、各クラスタ１００３に対し独立してフェッチおよび実行可能である。したがって、マルチスレッド実行は、図１０Ｂにおいて示されるように、サポート可能である。他の命令形式も可能である。例えば、全Ｄ１ビットは、５つの別個のＰＥ命令（それぞれ、Ｄ１／５ビット幅）をエンコードせずに、全体としてクラスタに行動を命令するクラスタレベル命令をエンコード可能であり、単一ＰＥに行動を命令可能である。
【０１９２】
典型的には、各プロセッサクラスタ、例えば、Ｄ１のための命令ワード幅は、物理的実現によって制限され、ＰＥ当たりの命令ビット数およびストレージのためのデータビット数は、アーキテクチャ選択によって決定される。その結果、Ｄ１は、ＰＥレベル命令幅×プロセッサクラスタ内のＰＥの数に正確に対応しない場合がある。さらに、追加ビットは、典型的には、種々のクラスタレベル行動をプログラムするために使用される。ＰＥの少なくとも１つが、各クラスタにおいてアイドリング状態であると仮定される場合、それらのＰＥレベル命令ビットは、クラスタレベル行動をプログラムするために利用可能である。クラスタレベル命令の幅は、このマッピングを最適化するために、意図的に設計可能である。その結果、異なるプロセッサクラスタのためのクラスタレベル命令は、異なる幅を有してもよい。
【０１９３】
図１２は、マルチスレッド実行をサポートするためのメモリ構成を示す。ここでは、プログラムメモリアドレスＡ〜Ｈは、スレッド命令専用である。最大Ｎスレッドまで、同時にアクティブであり得る。アドレスＨ〜Ｋは、スレッドストレージ専用である。最大Ｎの独立読み込み／書き込みが、サポート可能である。アドレスＫ〜ＮおよびＮ〜Ｒは、それぞれ結合命令および結合ストレージをサポートする。共通アドレスは、完全ＶＬＩＷ命令（アドレスＫ〜Ｎ）または完全ＶＬＩＷデータワード（アドレスＮ〜Ｒ）である、ＶＬＩＷワード全体にアクセスするために使用される。アドレスＲ〜ＶおよびＶ〜Ｘは、それぞれ混合命令および混合ストレージをサポートする。
【０１９４】
（７．Ｂ．分岐のためのマルチスレッドサポート）
図１３Ａ〜１３Ｂは、分岐のためのマルチスレッドサポートを示す略図である。これらの図では、縦にハッチされた矩形は、分岐命令であって、実線矢印は、ジャンプの開始を示し、点線矢印は、リターンを示す。ＣＤは、制御ドメインであって、Ｔは、トップレベル実行ドメインであって、Ｂｎ〜Ｄｎは、低レベル実行ドメインである。したがって、ドメインＴ内の縦にハッチされた領域は、Ｂ１、Ｂ２およびＢ３に対する３つの可能性のある分岐を示す。この実施例では、各分岐は、条件付きであってもまたはそうでなくてもよく、すべてが考慮され得る。同様に、ドメインＣ１は、条件付き分岐が、ドメインＣ１の末端においてドメインＤ２に対しなされ、無条件分岐が、ドメインＤ１に対しなされ得ることを示す。便宜上、Ｂｎドメインの１つによって始動されるシーケンスは、同一Ｂｎドメインにリターンしなければならないと仮定する。したがって、シーケンスＢ１→Ｃ１→Ｄ１→Ｅ１→Ｂ１は、有効シーケンスであるが、Ｂ１→Ｃ１→Ｄ１→Ｅ２→Ｂ２は、Ｂ１で開始するが、Ｂ２にリターンするため、有効なシーケンスではない。
【０１９５】
Ｃｎドメインの１つから生じる有効シーケンスは、以下である。
【０１９６】
Ｃ１１１：Ｃ１→Ｄ１→Ｅｌ
Ｃ１２１：Ｃ１→Ｄ２→Ｅ１
Ｃ１２２：Ｃ１→Ｄ２→Ｅ２
Ｃ２１１：Ｃ２→Ｄ１→Ｅ１
Ｃ２２１：Ｃ２→Ｄ２→Ｅ１
Ｃ２２２：Ｃ２→Ｄ２→Ｅ２
上述の表記法を使用して、Ｂｎドメインの１つから生じる有効  シーケンスは、以下である。
【０１９７】
Ｂ１ｌ：Ｂ１→Ｃ１１１→Ｂ１
Ｂ１２：Ｂ１→Ｃ１２１→Ｂ１
Ｂ１３：Ｂ１→Ｃ１２２→Ｂ１
Ｂ２１：Ｂ２→Ｃ２１１→Ｂ２
Ｂ２２：Ｂ２→Ｃ２１２→Ｂ２
Ｂ２３：Ｂ２→Ｃ２２２→Ｂ２
Ｂ３１：Ｂ３
但し：Ｂ１→Ｃ１ｘｘ→Ｂ２ではなく
Ｂ２→Ｃ２ｘｘ→Ｂ１でもない。
【０１９８】
トップモジュールから、以下となる。
【０１９９】
Ｔ→Ｂｘｘ→Ｔ
図１３Ｂは、ＶＬＩＷアーキテクチャがマルチスレッディングを有効にするために利用可能な方法を示し、ジャンプは、メモリコントローラ境界上で生じる。このケースでは、３つのスレッドが、３つのドメインＴ→Ｂ１ｘ→Ｔ、Ｔ→Ｂ２ｘ→Ｔ、およびＴ→Ｂ３ｘ→Ｔに対応して形成される。３つすべてのドメインは、別個のスレッド上で同時および独立して、アクティブであり得る。つまり、３つすべてのスレッドは、プログラムメモリ内の同一アドレスからの命令を使用する必要はない。あるアプローチでは、ＮＥＸＴ＿ＡＤＤＲリターン機構（制御ドメインに戻る）は、ＪＯＩＮまたはＢＡＲＲＩＥＲ技術によって向上される。これは、親ドメインＴにおける継続に先立って、すべての並列実行スレッド（同時にアクティブ可能なＢ１ｘ、Ｂ２ｘ、およびＢ３ｘ）が完了することを保証する。例えば、ドメインＴは、シンプルなカウンタがゼロにリターンするまで待機可能であって、カウンタは、いくつのスレッドが、依然としてアクティブであるかをカウントする。
【０２００】
（８．従来のＶＬＩＷ命令との比較による差異）
（８．Ａ．アーキテクチャ特性）
この種類のアプローチを実行可能にする補助をする、ＶＬＩＷシミュレーションプロセッサに関するいくつかの（オプション）アーキテクチャ側面が存在する。以下に提供される数は、上述の例示的実装に特有であるが、それに制限されることを意味していない。
【０２０１】
（命令キャッシュレス）  ほとんどのＶＬＩＷプロセッサアーキテクチャと異なり、本アーキテクチャは、命令をキャッシュしない。命令は、プログラムメモリ１２１からストリームし、プロセッサ要素３０２は、命令ワードに基づいて、連続的にプログラムされる。したがって、ＶＬＩＷプロセッサアーキテクチャに基づく命令キャッシュと異なり、コード分岐は、ほぼ実行ペナルティなしで生じる。メモリアドレスポインタがＸにあって、次のアドレスが、Ｘ＋１ではなくＹである場合、唯一の代償は、数クロックサイクルとして測定され、遅延分岐技術を使用して実装される、メモリ待機時間である。大きいプログラム／設計の実行は、数１００，０００サイクルと予測される。割り込みに対する分岐（または、リターン分岐）の代償は、一時データおよびグローバル変数への依存性の除去、または、一時データの保存およびシフトレジスタの既知の状態への回転である。これは、典型的には、数百サイクルまで影響を及ぼし得るスケジューリング制約となる。影響は、それらのサイクルの損失ではなく、むしろ、非効率な実行にあり、例えば、処理のために既に利用可能であった一時データ（シフトレジスタ）がジャンプに先立って格納され、ジャンプ後に検索されることである。
【０２０２】
（共有オンチップメモリ）  別のアーキテクチャ特性は、全プロセッサ要素３０２が、スケジューリング制御下、利用可能なすべてのオンチップメモリ１０４へのアクセスを有していることである。オンチップメモリ１０４は、メインメモリからロードされる非常に大きなデータキャッシュである。完全なデータキャッシュリフレッシュ（フェッチ）は、全体計算時間に対し重要ではないほんの数１，０００サイクルを必要とし、通常、非常に小量が必要とされる。
【０２０３】
（ＰＲＡＭ（並列ランダムアクセス機械；Ｐａｒａｌｌｅｌ  ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍａｃｈｉｎｅ））  このアーキテクチャもまた、スケジューリングに対し柔軟である。基本ＶＬＩＷプロセッサ幅は、６４に設定されるが、これは可変である。これは、６４のプロセッサ要素３０２が命令サイクル当たり１回実行することを意味する。アルゴリズムが６４並列演算未満を必要とする場合、アルゴリズムは、他の並列実行アルゴリズムと対となり得る。しかしながら、アルゴリズムが、６４並列演算よりも多く必要とする場合、より多くの数の演算が、連続した命令サイクルを通して行われる。全プロセッサ要素は、同時にメモリへのアクセスを有することが可能である。言い換えると、ＰＲＡＭ様アーキテクチャが実現可能であって、柔軟な数のプロセッサスケーリングを可能にする。ｎが、必要なプロセッサ要素の数である場合、ＰＲＡＭサイクルは、ｎから最大６４に対し１つのＶＬＩＷ命令サイクルで完了する。１つのＰＲＡＭサイクルは、６５乃至１２８の間のｎ等に対し、２つのＶＬＩＷ命令サイクルをとる。アルゴリズムが、メモリを通る全交換データに対し１，０００プロセッサを必要とする場合、ＰＲＡＭサイクルは、１０ＶＬＩＷサイクルを構成する。
【０２０４】
共有メモリは、分散型メモリとして実装されるが、スケジュールされたアプローチ下で全プロセッサ要素に対し利用可能である。コンパイラは、各プロセッサ要素が、スケジュールされる場合に、メモリデータへのアクセスを有することを保証する。
【０２０５】
（Ｎｉｃｋ’ｓ  Ｃｌａｓｓ）  ＰＲＡＭアーキテクチャと連結される柔軟な数のプロセッサ要素は、一般的にＮｉｃｋ’ｓ  ＣｌａｓｓまたはＮＣと称される特定の種類のアルゴリズムの効率的スケジューリングを可能にする。ＮＣ問題は、多項式個のプロセッサを有する並列コンピュータ上で対数多項式時間で解決可能な問題として定義される。言い換えると、問題は、Ｏ（ｎ＊＊ｋ）並列プロセッサを使用して、時間Ｏ（（ｌｏｇ  ｎ）＊＊ｃ）で解くことができるような、定数ｃおよびｋが存在する場合、ＮＣにある。同等に、ＮＣは、対数多項式深度および多項式個のゲートを有する均一ブール回路によって決定可能なそれらの決定問題として定義可能である。これは、アルゴリズムを並列化するために使用可能な既知の技術に転換し、アルゴリズムには、最適性能のためのネットリストコンパイルプロセスと同様にコンパイル可能である。
【０２０６】
固有の並列性を有するアプリケーションは、このプロセッサアーキテクチャのための適切な候補である。科学計算の領域では、例は、気候モデリング、石油およびガス探査のための地球物理学および地震解析、核シミュレーション、計算流体力学、素粒子物理学、財務モデリングおよび材料科学、有限要素モデリング、ＭＲＩ等のコンピュータ断層撮影法を含む。生命科学および生命工学では、計算化学および生物学、タンパク質折り畳みおよび生体系のシミュレーション、ＤＮＡ塩基配列決定法、薬理ゲノム学、インシリコ創薬は、一部の実施例である。ナノテクノロジーアプリケーションは、分子モデリングおよびシミュレーション、密度汎関数理論、原子動力学、量子力学的解析を含み得る。デジタルコンテンツ製作の例は、アニメーション、合成およびレンダリング、映像処理および編集、画像処理を含む。
【０２０７】
（出力および速度）  ＶＬＩＷプロセッサ性能は、メモリ帯域幅（ある実装では２００Ｇｂ／ｓ）と結び付いている。６４プロセッサ要素のそれぞれが、浮動小数点ベースのプロセッサとして実現される場合、持続計算率は、５ＧＦＬＯＰＳを大幅に上回り得る。これは、最大の達成可能性能ではなく、むしろ安定的達成可能状態である。アルゴリズムスケジューリングの効率によって低下させられる必要があるだけである。これは、現在の単一プロセッサＣＰＵによって達成可能なものよりも非常に大きい（典型的には、特定の種類の問題に対し１００ＭＦＬＯＰＳ）。２００５年１２月２３日出願のＶｅｒｈｅｙｅｎ、Ｍａｔｈｕｒ、およびＷａｔｔによる米国特許出願第１１／３１８，０４２号「Ｐｒｏｃｅｓｓｏｒ」（参照することによって本願に援用される）に記載のある実装では、ＶＬＩＷシミュレーションプロセッサは、この計算性能を実現する一方、平均５Ｗ未満の出力を消費する。
【０２０８】
（８．Ｂ．利点）
上述のアーキテクチャ特徴の一部の結果として、種々の実装は、以下の利点および／または従来のＶＬＩＷシステムとの比較による差異の一部または全部を有得る。
【０２０９】
（無スタック（ジャンプ時））  ＶＬＩＷシステムは、サブルーチンが、グローバル変数に基づき、条件付きおよび／または無条件リターンアドレスを有するように、実装可能である。反復は、概して、このアプローチでは必要ではない。複数反復は、現在実行中のドメインではなく、起動ドメインによって処理される。所望に応じて、スタック機構を実行し、反復を可能にする。この機構では、被起動ドメインは、プッシュおよびポップのオーバーヘッドのほとんどを削除する制御されたスケジュールを有している。
【０２１０】
（キャッシュコヒーレンス問題の回避）  ＶＬＩＷアーキテクチャでは、オンチップ命令キャッシュはない。プログラムメモリは、非常に大きい（効果的に、無限）オフチップ命令キャッシュとしてみなされ得る。各命令は、直接、プログラムメモリ１２１からフェッチされる。このため、領域ベースまたはトレースベースアルゴリズム等の高度なスケジューリング方法は必要ない。むしろ、実行ドメインは、継続のため、メモリ空間内の任意の他のアドレスへ自由にジャンプ可能である。
【０２１１】
（簡素化領域形成）  上述のように、領域形成は、単一サイクル分岐構文、例外ハンドラ、および領域拡張技術によって、大幅に簡素化可能である。従来の記録コストを必要とせず、領域への割り込みを可能にすることによって、より複雑な言語構文をマッピングするコンパイラ能力およびＶＬＩＷ実行の効率を大幅に向上させる。領域形成に適用される典型的ＶＬＩＷスケジューリング制限は排除され、コンパイラは、非常に優れたマッピングの柔軟性を有する。
【０２１２】
（簡素化ＩＬＰスケジューリング）  命令レベルの並列が、最も効率的方法を選択し、プロセッサ要素の数全体にわたる全命令をパッキングするグラフベース変換アルゴリズムによって、各実行ドメインにおいてなされ得る。目標は、通常、このドメインを実行するために必要とされるステップの数を最小化することである。
【０２１３】
（合成不可能タスクの処理）  シミュレーション加速アプリケーションでは、このＶＬＩＷアーキテクチャは、多数のソリューションを通して合成不可能タスクのマッピングを可能にし、この多数のソリューションは、「全体言語」マッピングを可能にし、これは、典型的には、従来の合成ベースのシミュレーション加速方法では達成不可能である。一般言語アプリケーションでは、同一効果を得ることができる。
【０２１４】
（９．さらなる実施例）
本発明は、いくつかの実施形態に対し上述されてきたが、種々の修正が、本発明の範囲内でなされ得る。例えば、本発明は、同一であるＰＥに関連して記載されるが、代替実施形態は、異なる種類のＰＥおよび異なる数のＰＥを使用可能である。また、ＰＥは、同一の接続性を有することを必要としない。また、ＰＥは、リソースを共有してもよい。例えば、２つ以上のＰＥは、同一シフトレジスタおよび／またはローカルメモリに書き込まれてもよい。また、逆も同様であって、単一ＰＥが、２つ以上のシフトレジスタおよび／またはローカルメモリに書き込まれてもよい。
【０２１５】
別の側面では、本発明のシミュレーションプロセッサ１００は、ＡＳＩＣ（特定アプリケーション向け集積回路；Ａｐｐｌｉｃａｔｉｏｎ−Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）または  ＦＰＧＡ（フィールド・プログラマブル・ゲート・アレイ；Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）、あるいは他の種類の集積回路において実現可能である。また、別個の回路基板上に実装される必要も、ホストコンピュータ１１０に接続される必要もない。別個のホストコンピュータ１１０が存在しない場合もある。例えば、図１を参照すると、ＣＰＵ１１４およびシミュレーションプロセッサ１００は、より緊密に集積されてもよく、または単一集積計算装置として実装されてもよい。
【０２１６】
本発明は、半導体チップのための論理シミュレーションに関連して記載されるが、本明細書で提示されるＶＬＩＷプロセッサアーキテクチャは、他のアプリケーションのためにも使用可能である。条件付き分岐を有するＶＬＩＷアーキテクチャの柔軟性を示す際に、ＣまたはＣ＋＋等の一般的シーケンシャルプログラミング言語は、非常に容易にサポート可能であることに留意されたい（単一プロセッサソリューション上の標準コンパイルに類似）。それらは、ＶｅｒｉｌｏｇまたはＶＨＤＬ等のハードウェア記述言語の固有の並列行動を欠くが、多くのアプリケーションに対し、並列アルゴリズムが識別されており、そのようなシーケンシャルプログラミング言語の加速を可能にするために使用可能である。例としては、マトリックス乗算および相関関数がある。記載のＶＬＩＷアーキテクチャは、論理シミュレーションおよびハードウェア記述言語を超えて容易に拡張し、その加速は、プログラムの並列化およびアルゴリズム内のデータアクセスに応じて、多くの他のアプリケーションのために達成可能である。
【０２１７】
例えば、プロセッサアーキテクチャは、単一ビット２状態論理シミュレーションから２ビット４状態論理シミュレーション、固定幅計算（例えば、ＤＳＰプログラミング）、浮動小数点計算（例えば、ＩＥＥＥ−７５４）まで拡張可能である。固有の並列性を有するアプリケーションは、このプロセッサアーキテクチャのための適切な候補である。科学計算の領域では、例は、気候モデリング、石油およびガス探査のための地球物理学および地震解析、核シミュレーション、計算流体力学、素粒子物理学、財務モデリングおよび材料科学、有限要素モデリング、ＭＲＩ等のコンピュータ断層撮影法を含む。生命科学および生命工学では、計算化学および生物学、タンパク質折り畳みおよび生体系のシミュレーション、ＤＮＡ塩基配列決定法、薬理ゲノム学、インシリコ創薬は、一部の実施例である。ナノテクノロジーアプリケーションは、分子モデリングおよびシミュレーション、密度汎関数理論、原子動力学、量子力学的解析を含み得る。デジタルコンテンツ製作の実施例は、アニメーション、合成およびレンダリング、映像処理および編集、画像処理を含む。
【０２１８】
特定の実施例として、ＰＥが整数または浮動小数点算術可能である場合（２００６年１０月２３日出願の米国特許出願第１１／５５２，１４１号「ＶＬＩＷ  Ａｃｃｅｌｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ  Ｕｓｉｎｇ  Ｍｕｌｔｉ−Ｓｔａｔｅ  Ｌｏｇｉｃ」に記載され、参照することによって全体として本願に援用される）、上述のＶＬＩＷアーキテクチャは、汎用データ駆動コンピュータを生成可能にする。例えば、刺激データは、コンピュータ断層撮影法によって得られる生データである場合がある。ハードウェアアクセラレータ１３０は、出力データ（このケースでは、計算される必要のある３Ｄ画像）を生成する整数または浮動小数点アクセラレータである。
【０２１９】
アプリケーションの仕様に応じて、ハードウェアアクセラレータは、イベント駆動またはサイクルベースの（あるいは、より一般的に、ドメインベース）であることが可能である。ドメインベースのアプローチでは、必要な３Ｄ画像の計算の問題は、「下位問題」（例えば、恐らく、ローカルＦＦＴ）に細分される。これらの「下位問題」は、上述のドメインに類似し、これらのドメインに対する上述の技術もまた、この状況に適用可能である。
【０２２０】
また、図１０〜１３に記載のマルチスレッディングおよびクラスタリング技術も、論理シミュレーション以外のアプリケーションにおいて使用可能である。例えば、ＰＥは、特定の算術タスクを行うためにクラスタ化可能である。別の実施例として、異なるスレッドは、異なる問題ドメインを同時に評価するために使用可能である。
【０２２１】
種々の他の修正、変更、および変形例は、添付の請求項に定義される本発明の精神および範囲から逸脱することなく、本願に開示される本発明の方法および装置の配列、演算、および詳細において成され得ることは、当業者には明白であろう。したがって、本発明の範囲は、添付の請求項およびその法的均等物によって決定されるべきである。
【図面の簡単な説明】
【０２２２】
【図１】図１は、ハードウェア加速シミュレーションシステムを示す、ブロック図である。
【図２】図２は、ハードウェア加速シミュレーションシステム内のシミュレーションプロセッサを示す、ブロック図である。
【図３】図３は、シミュレーションプロセッサによる異なるドメインのシミュレーションを示す、略図である。
【図４】図４は、シミュレーションプロセッサと、プログラムメモリと、記憶メモリとの間のインターフェースを示す、ブロック図である。
【図５Ａ】図５Ａは、例外ハンドラを示す、ブロック図である。
【図５Ｂ】図５Ｂは、例外ハンドラを示す、ブロック図である。
【図６】図６は、実行ドメインの例示的構成を示す、略図である。
【図７Ａ】図７Ａは、実行ドメインの種々の側面を示す、略図である。
【図７Ｂ】図７Ｂは、実行ドメインの種々の側面を示す、略図である。
【図７Ｃ】図７Ｃは、実行ドメインの種々の側面を示す、略図である。
【図７Ｄ】図７Ｄは、実行ドメインの種々の側面を示す、略図である。
【図８】図８は、クロックドメイン内の実行ドメインの構成を示す、略図である。
【図９】図９は、ＶＬＩＷスケジューリングを示す、フロー図である。
【図１０Ａ】図１０Ａは、プログラムメモリ１２１のためのメモリアーキテクチャを示す、ブロック図である。
【図１０Ｂ】図１０Ｂは、プログラムメモリ１２１のためのメモリアーキテクチャを示す、ブロック図である。
【図１１】図１１は、マルチスレッディングをサポートするプロセッサクラスタリングを示す、ブロック図である。
【図１２】図１２は、マルチスレッディングをサポートするプログラムメモリのための構成のブロック図である。
【図１３Ａ】図１３Ａは、分岐のためのマルチスレッドサポートを示す、略図である。
【図１３Ｂ】図１３Ｂは、分岐のためのマルチスレッドサポートを示す、略図である。
【図１】
2009533785.tif 000003
【図２】
2009533785.tif 000004
【図３】
2009533785.tif 000005
【図４】
2009533785.tif 000006
【図５Ａ】
2009533785.tif 000007
【図５Ｂ】
2009533785.tif 000008
【図６】
2009533785.tif 000009
【図７Ａ】
2009533785.tif 000010
【図７Ｂ】
2009533785.tif 000011
【図７Ｃ】
2009533785.tif 000012
【図７Ｄ】
2009533785.tif 000013
【図８】
2009533785.tif 000014
【図９】
2009533785.tif 000015
【図１０Ａ】
2009533785.tif 000016
【図１０Ｂ】
2009533785.tif 000017
【図１１】
2009533785.tif 000018
【図１２】
2009533785.tif 000019
【図１３Ａ】
2009533785.tif 000020
【図１３Ｂ】
2009533785.tif 000021
【国際調査報告】
2009533785.tif 000022