(57)【要約】【課題】高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法を提供すること。【解決手段】上記方法は、高レベル言語での記述から複数の仮想プログラマブルデバイスをコンパイルすることと、高レベル言語で、プログラマブル集積回路デバイスのためのユーザー構成の記述を受信することと、プログラミングプロセッサを用いてユーザー構成を構文解析し、構文解析の結果として、コンパイルされた仮想プログラマブルデバイスのうちの１つを選択することと、プログラマブル集積回路デバイス上でコンパイルされた仮想プログラマブルデバイスのうちの１つのインスタンスを作成することと、ユーザー構成を用いて、コンパイルされた仮想プログラマブルデバイスのうちのインスタンスが作成された１つを構成することとを含む。【選択図】図８
2018028919.tif 000002
【特許請求の範囲】
【請求項１】
高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法であって、該方法は、
複数の仮想プログラマブルデバイスを該高レベル言語での該仮想プログラマブルデバイスの記述からコンパイルすることと、
該高レベル言語で、該プログラマブル集積回路デバイスのためのユーザー構成の記述を受信することと、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、該コンパイルされた仮想プログラマブルデバイスのうちの１つを選択することと、
該プログラマブル集積回路デバイス向けの該コンパイルされた仮想プログラマブルデバイスのうちの該１つのインスタンスを作成することと、
該ユーザー構成を用いて、該コンパイルされた仮想プログラマブルデバイスのうちの該インスタンスが作成された１つを構成することと
を含む、方法。
【請求項２】
前記ユーザー構成は、第１のグループの機能を有する第１の構成と、第２のグループの機能を有する第２の構成とを含み、前記構成することは、該第２の構成を用いることなく、該第１の構成を用いて、前記コンパイルされた仮想プログラマブルデバイスのうちの前記インスタンスが作成された１つを構成することを含み、前記方法は、
該第１の構成をアンロードすることと、
テストからの結果に応答して、該第１の構成を用いることなく、該第２の構成を用いて、該コンパイルされた仮想プログラマブルデバイスのうちの該インスタンスが作成された１つを構成することと
をさらに含む、請求項１に記載の方法。
【請求項３】
前記高レベル言語は、ＯｐｅｎＣＬである、請求項１または２に記載の方法。
【請求項４】
前記インスタンスを作成することは、前記コンパイルされた仮想プログラマブルデバイスのうちの前記１つを前記プログラマブル集積回路デバイスの外部のプロセッサで実行することを含む、請求項１または２に記載の方法。
【請求項５】
前記インスタンスを作成することは、前記コンパイルされた仮想プログラマブルデバイスのうちの前記１つを前記プログラマブル集積回路デバイス上の構成プロセッサで実行することを含む、請求項１または２に記載の方法。
【請求項６】
前記実行することは、前記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成することを含む、請求項５に記載の方法。
【請求項７】
前記実行することは、前記コンパイルされた仮想プログラマブルデバイスのうちの前記１つを前記プログラマブル集積回路デバイスに内蔵されたハード構成プロセッサで実行することを含む、請求項５に記載の方法。
【請求項８】
前記構成することは、合成、配置およびルーティングのうちの少なくとも１つを含む、請求項１または２に記載の方法。
【請求項９】
前記仮想プログラマブルデバイスの各々は、
前記プログラマブル集積回路デバイスのプログラマブルリソースから構成された構成可能なルーティングリソースと、
該プログラマブル集積回路デバイスのプログラマブルリソースから構成された複数の機能ブロックと
を含む、請求項１または２に記載の方法。
【請求項１０】
前記複数の機能ブロックは、算数関数ブロック、三角関数ブロック、多重化論理ブロック、またはソフトプロセッサブロックのうちの少なくとも１つを含む、請求項９に記載の方法。
【請求項１１】
複数の仮想プログラマブルデバイスのための前記複数のコンパイルされた構成は、動作中に再構成可能である仮想プログラマブルデバイスのための少なくとも１つのコンパイルされた構成を含み、
前記選択することは、前記構文解析の結果として、動作中に再構成可能である仮想プログラマブルデバイスのための該少なくとも１つのコンパイルされた構成のうちの１つを選択することを含み、
前記インスタンスを作成することは、動作中に再構成可能である仮想プログラマブルデバイスのための該少なくとも１つのコンパイルされた構成のうちの該選択された１つのインスタンスを作成することを含む、請求項１または２に記載の方法。
【請求項１２】
前記コンパイルされた仮想プログラマブルデバイスのうちの前記１つを実行するプロセッサを含む、請求項１または２に記載の方法に従って構成されたプログラマブル集積回路デバイス。
【請求項１３】
前記プロセッサは、前記プログラマブル集積回路デバイスの外部にある、請求項１２に記載のプログラマブル集積回路デバイス。
【請求項１４】
前記プロセッサは、前記プログラマブル集積回路デバイスの中に搭載されたハードプロセッサである、請求項１２に記載のプログラマブル集積回路デバイス。
【請求項１５】
前記プロセッサは、前記プログラマブル集積回路デバイスのプログラマブルリソースから構成されている、請求項１２に記載のプログラマブル集積回路デバイス。
【請求項１６】
高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法であって、該方法は、
該高レベル言語で、該プログラマブル集積回路デバイスに対してユーザー構成を記述することと、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、該高レベル言語での仮想プログラマブルデバイスの記述から事前にコンパイルされた仮想プログラマブルデバイスのライブラリの中から、１つの事前にコンパイルされた仮想プログラマブルデバイスを選択することと、
該プログラマブル集積回路デバイス向けの該事前にコンパイルされた仮想プログラマブルデバイスのインスタンスを作成することと、
該ユーザー構成を用いて、該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成することと
を含む、方法。
【請求項１７】
前記ユーザー構成は、第１のグループの機能を有する第１の構成と、第２のグループの機能を有する第２の構成とを含み、前記構成することは、該第２の構成を用いることなく、該第１の構成を用いて、前記コンパイルされた仮想プログラマブルデバイスのうちの前記インスタンスが作成された１つを構成することを含み、前記方法は、
該第１の構成をアンロードすることと、
テストからの結果に応答して、該第１の構成を用いることなく、該第２の構成を用いて、前記インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成することと
をさらに含む、請求項１６に記載の方法。
【請求項１８】
前記高レベル言語は、ＯｐｅｎＣＬである、請求項１６または１７に記載の方法。
【請求項１９】
前記インスタンスを作成することは、前記事前にコンパイルされた仮想プログラマブルデバイスを前記プログラマブル集積回路デバイスの外部のプロセッサで実行することを含む、請求項１６または１７に記載の方法。
【請求項２０】
前記インスタンスを作成することは、前記事前にコンパイルされた仮想プログラマブルデバイスを前記プログラマブル集積回路デバイス上の構成プロセッサで実行することを含む、請求項１６または１７に記載の方法。
【請求項２１】
前記実行することは、前記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成することを含む、請求項２０に記載の方法。
【請求項２２】
前記実行することは、前記事前にコンパイルされた仮想プログラマブルデバイスを前記プログラマブル集積回路デバイスに内蔵されたハード構成プロセッサで実行することを含む、請求項２０に記載の方法。
【請求項２３】
前記構成することは、合成、配置およびルーティングのうちの少なくとも１つを含む、請求項１６または１７に記載の方法。
【請求項２４】
前記仮想プログラマブルデバイスの各々は、
前記プログラマブル集積回路デバイスのプログラマブルリソースから構成された構成可能なルーティングリソースと、
該プログラマブル集積回路デバイスのプログラマブルリソースから構成された複数の機能ブロックと
を含む、請求項１６または１７に記載の方法。
【請求項２５】
前記複数の機能ブロックは、算数関数ブロック、三角関数ブロック、多重化論理ブロック、またはソフトプロセッサブロックのうちの少なくとも１つを含む、請求項２４に記載の方法。
【請求項２６】
前記事前にコンパイルされた仮想プログラマブルデバイスのライブラリにおける該事前にコンパイルされた仮想プログラマブルデバイスのうちの少なくとも１つは、動作中に再構成可能であり、
前記選択することは、前記構文解析の結果として、動作中に再構成可能である該少なくとも１つの事前にコンパイルされた仮想プログラマブルデバイスのうちの１つを選択することを含み、
前記インスタンスを作成することは、動作中に再構成可能である該事前にコンパイルされた仮想プログラマブルデバイスのうちの該少なくとも１つのうちの該選択された１つのインスタンスを作成することを含む、請求項１６または１７に記載の方法。
【請求項２７】
前記コンパイルされた仮想プログラマブルデバイスを実行するプロセッサを含む、請求項１６または１７に記載の方法に従って構成されたプログラマブル集積回路デバイス。
【請求項２８】
前記プロセッサは、前記プログラマブル集積回路デバイスの外部にある、請求項２７に記載のプログラマブル集積回路デバイス。
【請求項２９】
前記プロセッサは、前記プログラマブル集積回路デバイスの中に搭載されたハードプロセッサである、請求項２７に記載のプログラマブル集積回路デバイス。
【請求項３０】
前記プロセッサは、前記プログラマブル集積回路デバイスのプログラマブルリソースから構成されている、請求項２７に記載のプログラマブル集積回路デバイス。
【請求項３１】
高レベル言語を用いてプログラマブルデバイス集積回路デバイスを構成する方法を行う命令を用いて符号化された不揮発性機械読み取り可能な格納媒体であって、該命令は、
該高レベル言語で、該プログラマブル集積回路デバイスのためのユーザー構成の記述を受信する命令と、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、該高レベル言語での仮想プログラマブルデバイスの記述から事前にコンパイルされた仮想プログラマブルデバイスのライブラリの中から１つの事前にコンパイルされた仮想プログラマブルデバイスを選択する命令と、
該プログラマブル集積回路デバイス向けの該事前にコンパイルされた仮想プログラマブルデバイスのインスタンスを作成する命令と、
該ユーザー構成を用いて該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成する命令と
を含む、不揮発性機械読み取り可能な格納媒体。
【請求項３２】
前記ユーザー構成は、第１のグループの機能を有する第１の構成と、第２のグループの機能を有する第２の構成とを含み、前記構成する命令は、該第２の構成を用いることなく、該第１の構成を用いて、前記インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成する命令を含み、前記方法は、
該第１の構成をアンロードする命令と、
テストからの結果に応答して、該第１の構成を用いることなく、該第２の構成を用いて、該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成する命令と
をさらに含む、請求項３１に記載の不揮発性機械読み取り可能な格納媒体。
【請求項３３】
前記インスタンスを作成する命令は、前記事前にコンパイルされた仮想プログラマブルデバイスを前記プログラマブル集積回路デバイスの外部のプロセッサ上で実行する命令を含む、請求項３１または３２に記載の不揮発性機械読み取り可能な格納媒体。
【請求項３４】
前記インスタンスを作成する命令は、前記事前にコンパイルされた仮想プログラマブルデバイスを前記プログラマブル集積回路デバイス上の構成プロセッサ上で実行する命令を含む、請求項３１または３２に記載の不揮発性機械読み取り可能な格納媒体。
【請求項３５】
前記実行する命令は、前記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成する命令を含む、請求項３４に記載の不揮発性機械読み取り可能な格納媒体。
【請求項３６】
高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法であって、該方法は、
該高レベル言語で、該プログラマブル集積回路デバイスに対して、第１の構成および第２の構成を含むユーザー構成を記述することと、
プログラミングプロセッサを用いて該構成を構文解析し、該構文解析の結果として、該第１の構成および該第２の構成の要件を満たす、該高レベル言語での仮想プログラマブルデバイスの記述から事前にコンパイルされた仮想プログラマブルデバイスのライブラリの中から、１つの事前にコンパイルされた仮想プログラマブルデバイスを選択することと、
該プログラマブル集積回路デバイス向けの該事前にコンパイルされた仮想プログラマブルデバイスのインスタンスを作成することと、
該第２の構成を用いることなく、該ユーザー構成における該第１の構成を用いて、該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成することと、
該第１の構成をアンロードすることと、
テストからの結果に応答して、該第１の構成を用いることなく、該第２の構成を用いて、該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成することと
を含む、方法。
【請求項３７】
前記高レベル言語は、ハードウェア記述言語よりも高級言語である、請求項１または２に記載の方法。
【請求項３８】
前記高レベル言語は、ハードウェア記述言語よりも高級言語である、請求項１６または１７に記載の方法。
【請求項３９】
前記高レベル言語は、ハードウェア記述言語よりも高級言語である、請求項３１または３２に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
（発明の分野）
本発明は、プログラマブル集積回路デバイス（例えば、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）または他のタイプのプログラマブル論理デバイス（ＰＬＤ））を構成するための高レベル言語の使用に関する。
【背景技術】
【０００２】
（発明の背景）
初期のプログラマブルデバイスは、１回のみ構成可能であった。例えば、構成は、可溶性リンクを「ブローイング（ｂｌｏｗｉｎｇ）」する（すなわち、開放する）ことによって達成された場合がある。代替的に、構成は、プログラマブル読み取り専用メモリに格納された場合がある。それらのデバイスは、概して、「積和」（またはＰ−ＴＥＲＭ）論理動作に対してデバイスを構成する能力をユーザーに提供した。最近、構成に対して消去可能なプログラマブル読み取り専用メモリ（ＥＰＲＯＭ）を組み込むプログラマブル論理デバイスが利用可能になり、デバイスが再構成されることを可能にした。
【０００３】
なお最近、構成に対して静的ランダムアクセスメモリ（ＳＲＡＭ）要素を組み込むプログラマブルデバイスが利用可能になっている。同様に再構成され得るこれらのデバイスは、それらの構成を不揮発性メモリ（例えば、ＥＰＲＯＭ）に格納し、デバイスが電力をオンにされる場合、構成が不揮発性メモリからＳＲＡＭ要素内にロードされる。これらのデバイスは、概してルックアップテーブルタイプの論理デバイスに対してデバイスを構成する能力をユーザーに提供する。
【０００４】
ある時点で、このようなデバイスは、ランダムアクセスメモリ、読み取り専用メモリ、または論理（例えば、Ｐ−ＴＥＲＭ論理）として動作するために、ユーザーによって構成され得るランダムアクセスメモリの内蔵型ブロックを提供され始めた。さらに、プログラマブルデバイスがより大きくなってきているので、さまざまな一般的に使用される機能に対してプログラマブルデバイスに専用の回路を追加することはより一般的になってきている。その専用の回路は、クロック生成のための位相ロックループまたは遅延ロックループも、さまざまな数学的動作（例えば、加算、乗算）のためのさまざまな回路も含み得る。これは、利用可能な汎用プログラマブル論理を構成することによって、ユーザーを、同等回路を作らなければならないことから助ける。
【０００５】
さまざまな要素がどこに展開されるべきかを考えて決定することによって、手動で簡単に初期のプログラマブル論理デバイスを構成することが可能であったであろうが、たとえそのような以前のデバイスに関しても、ユーザーが必要に応じて論理を展開し、そしてその論理をプログラマブルデバイスのための構成に翻訳することを可能にするプログラミングソフトウェアを提供することは一般的であった。より大きな電流のデバイス（上述した専用の回路網を有するそのようなデバイスを含む）の場合、そのようなソフトウェアなしに、論理を展開しようとすることは、非現実であろう。現在、そのようなソフトウェアは、一般的に、ある一般的に使用される構造を構成するために、特に、上述した専用の回路を組み込む、数学的動作のための回路を構成するために、一般的に「コア」と呼ばれる所定の機能も含む。例えば、コアは、さまざまな三角関数または代数関数を提供され得る。
【０００６】
利用可能なプログラミングソフトウェアは、ユーザーがプログラムされるデバイスの能力内にほとんどの所望の論理設計を実装することを可能にするが、ほとんどのこのようなソフトウェアは、ハードウェア記述言語の知識（例えば、ＶＨＤＬまたはＶｅｒｉｌｏｇ）を必要とする。しかしながら、プログラマブルデバイスの多くの潜在的ユーザーは、ハードウェア記述言語に精通しておらず、より高レベルのプログラミング言語を用いてデバイスをプログラムすることを望む場合がある。
【発明の概要】
【課題を解決するための手段】
【０００７】
（発明の要約）
プログラマブルデバイスを構成するために適合され得る１つの高レベルプログラミング言語は、ＯｐｅｎＣＬ（Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ）であるが、他の高レベル言語、特に、Ｃ、Ｃ＋＋、Ｆｏｒｔｒａｎ、Ｃ＃、Ｆ＃、ＢｌｕｅＳｐｅｃおよびＭａｔｌａｂを含む他の高レベル合成言語の使用も本発明の範囲内にある。
【０００８】
ＯｐｅｎＣＬにおいて、計算は、ホストおよびカーネルの組み合わせを用いて行われ、そこで、ホストは、入力／出力（Ｉ／Ｏ）およびセットアップタスクを担い、カーネルは、独立した入力で計算を行う。カーネルの明確なデクラレイションがあり、処理されるべき各組の要素が、独立であることが既知である場合、各カーネルは、高性能ハードウェア回路として実装され得る。プログラマブルデバイス（例えば、ＦＰＧＡ）における利用可能な空間の量に基づいて、カーネルは、アプリケーションの性能を向上させるために反復され得る。
【０００９】
カーネルコンパイラは、カーネルを、ハード生成器、システム集積を通じてＯｐｅｎＣＬからのアプリケーションを実装し、かつ、ホストコンピュータとインターフェース接続するハードウェア回路に変換する。コンパイラは、ＯｐｅｎＣＬアプリケーションのコンパイルを可能にするために拡張される開放ソース低レベル仮想機械コンパイラに基づき得る。コンパイラは、ＯｐｅｎＣＬカーネルを構文解析し、分析し、最適化し、プログラマブルデバイス（例えば、ＦＰＧＡ）における実装に適している高性能のパイプライン化された回路として実装する。次に、システムは、特定のプログラマブルデバイスに対する適切なプログラミングツールを用いてコンパイルされ得る。デバイスは、ＯｐｅｎＣＬ（または他の高レベル）コードを動作させるために、内蔵型ハードプロセッサも有し得るか、または内蔵型ソフトプロセッサ用いて構成され得るか、または外部のプロセッサが使用され得る。ＯｐｅｎＣＬまたは他の高レベルコードは、内蔵型または外部のプロセッサでホストプログラムを実行することによって動作され得る。
【００１０】
本発明に従って、高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法が提供される。方法は、高レベル言語で記述から複数の仮想プログラマブルデバイスをコンパイルすることと、高レベル言語で、プログラマブル集積回路デバイスのためのユーザー構成の記述を受信することと、プログラミングプロセッサを用いてユーザー構成を構文解析することと、構文解析の結果として、コンパイルされた仮想プログラマブルデバイスのうちの１つを選択することとを含む。コンパイルされた仮想プログラマブルデバイスのうちのその選択された１つは、プログラマブル集積回路デバイス上にインスタンスを作成され、コンパイルされた仮想プログラマブルデバイスのうちのインスタンスが作成された１つは、ユーザー構成を用いて構成される。
【００１１】
仮想プログラマブルデバイスが事前にコンパイルされている場合の対応する方法、およびその方法を行う命令を用いて組み込まれた不揮発性機械読み取り可能な格納媒体も提供される。これらの方法に従ってプログラムされたデバイスも提供される。
【００１２】
例えば、本発明は以下の項目を提供する。
（項目１）
高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法であって、該方法は、
該高レベル言語での記述から複数の仮想プログラマブルデバイスをコンパイルすることと、
該高レベル言語で、該プログラマブル集積回路デバイスのためのユーザー構成の記述を受信することと、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、該コンパイルされた仮想プログラマブルデバイスのうちの１つを選択することと、
該プログラマブル集積回路デバイス上で該コンパイルされた仮想プログラマブルデバイスのうちの該１つのインスタンスを作成することと、
該ユーザー構成を用いて、該コンパイルされた仮想プログラマブルデバイスのうちの該インスタンスが作成された１つを構成することと
を含む、方法。
（項目２）
上記高レベル言語は、ＯｐｅｎＣＬである、上記項目に記載の方法。
（項目３）
上記インスタンスを作成することは、上記プログラマブル集積回路デバイスの外部のプロセッサで上記コンパイルされた仮想プログラマブルデバイスのうちの上記１つを実行することを含む、上記項目のいずれかに記載の方法。
（項目４）
上記インスタンスを作成することは、上記プログラマブル集積回路デバイス上の構成プロセッサで上記コンパイルされた仮想プログラマブルデバイスのうちの上記１つを実行することを含む、上記項目のいずれかに記載の方法。
（項目５）
上記実行することは、上記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成することを含む、上記項目のいずれかに記載の方法。
（項目６）
上記実行することは、上記プログラマブル集積回路デバイスに内蔵されたハード構成プロセッサで上記コンパイルされた仮想プログラマブルデバイスのうちの上記１つを実行することを含む、上記項目のいずれかに記載の方法。
（項目７）
上記構成することは、合成、配置およびルーティングのうちの少なくとも１つを含む、上記項目のいずれかに記載の方法。
（項目８）
上記仮想プログラマブルデバイスの各々は、上記プログラマブル集積回路デバイスのプログラマブルリソースから構成された構成可能なルーティングリソースと、
該プログラマブル集積回路デバイスの構成可能なリソースから構成された複数の複雑な機能ブロックと
を含む、上記項目のいずれかに記載の方法。
（項目９）
上記複数の複雑な機能ブロックは、算数関数ブロック、三角関数ブロック、多重化論理ブロック、またはソフトプロセッサブロックのうちの少なくとも１つを含む、上記項目のいずれかに記載の方法。
（項目１０）
複数の仮想プログラマブルデバイスのための上記複数のコンパイルされた構成は、動作中に再構成可能である仮想プログラマブルデバイスのための少なくとも１つのコンパイルされた構成を含み、
上記選択することは、上記構文解析の結果として、動作中に再構成可能である仮想プログラマブルデバイスのための該少なくとも１つのコンパイルされた構成のうちの１つを選択することを含み、
上記インスタントを作成することは、動作中に再構成可能である仮想プログラマブルデバイスのための該少なくとも１つのコンパイルされた構成のうちの該選択された１つのインスタントを作成することを含む、上記項目のいずれかに記載の方法。
（項目１１）
上記コンパイルされた仮想プログラマブルデバイスのうちの上記１つを実行するプロセッサを含む、上記項目のいずれかに記載の方法に従って構成されたプログラマブル集積回路デバイス。
（項目１２）
上記プロセッサは、上記プログラマブル集積回路デバイスの外部にある、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目１３）
上記プロセッサは、上記プログラマブル集積回路デバイスの中に搭載されたハードプロセッサである、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目１４）
上記プロセッサは、上記プログラマブル集積回路デバイスのプログラマブルリソースから構成されている、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目１５）
高レベル言語を用いてプログラマブル集積回路デバイスを構成する方法であって、該方法は、
該高レベル言語で、該プログラマブル集積回路デバイスに対してユーザー構成を記述することと、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、事前にコンパイルされた仮想プログラマブルデバイスのライブラリの中から、１つの事前にコンパイルされた仮想プログラマブルデバイスを選択することと、
該プログラマブル集積回路デバイス上で該事前にコンパイルされた仮想プログラマブルデバイスのインスタンスを作成することと、
該ユーザー構成を用いて、該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成することと
を含む、方法。
（項目１６）
上記高レベル言語は、ＯｐｅｎＣＬである、上記項目のいずれかに記載の方法。
（項目１７）
上記インスタンスを作成することは、上記プログラマブル集積回路デバイスの外部のプロセッサで上記事前にコンパイルされた仮想プログラマブルデバイスを実行することを含む、上記項目のいずれかに記載の方法。
（項目１８）
上記インスタンスを作成することは、上記プログラマブル集積回路デバイス上の構成プロセッサで上記事前にコンパイルされた仮想プログラマブルデバイスを実行することを含む、上記項目のいずれかに記載の方法。
（項目１９）
上記実行することは、上記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成することを含む、上記項目のいずれかに記載の方法。
（項目２０）
上記実行することは、上記プログラマブル集積回路デバイスに内蔵されたハード構成プロセッサで上記事前にコンパイルされた仮想プログラマブルデバイスを実行することを含む、上記項目のいずれかに記載の方法。
（項目２１）
上記構成することは、合成、配置およびルーティングのうちの少なくとも１つを含む、上記項目のいずれかに記載の方法。
（項目２２）
上記仮想プログラマブルデバイスの各々は、上記プログラマブル集積回路デバイスのプログラマブルリソースから構成された構成可能なルーティングリソースと、
該プログラマブル集積回路デバイスの構成可能なリソースから構成された複数の複雑な機能ブロックと
を含む、上記項目のいずれかに記載の方法。
（項目２３）
上記複数の複雑な機能ブロックは、算数関数ブロック、三角関数ブロック、多重化論理ブロック、またはソフトプロセッサブロックのうちの少なくとも１つを含む、上記項目のいずれかに記載の方法。
（項目２４）
上記事前にコンパイルされた仮想プログラマブルデバイスのライブラリにおける該事前にコンパイルされた仮想プログラマブルデバイスのうちの少なくとも１つは、動作中に再構成可能であり、
上記選択することは、上記構文解析の結果として、動作中に再構成可能である該少なくとも１つの事前にコンパイルされた仮想プログラマブルデバイスのうちの１つを選択することを含み、
上記インスタントを作成することは、動作中に再構成可能である該事前にコンパイルされた仮想プログラマブルデバイスのうちの該少なくとも１つのうちの該選択された１つのインスタントを作成することを含む、上記項目のいずれかに記載の方法。
（項目２５）
上記コンパイルされた仮想プログラマブルデバイスを実行するプロセッサを含む、上記項目のいずれかに記載の方法に従って構成されたプログラマブル集積回路デバイス。
（項目２６）
上記プロセッサは、上記プログラマブル集積回路デバイスの外部にある、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目２７）
上記プロセッサは、上記プログラマブル集積回路デバイスの中に搭載されたハードプロセッサである、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目２８）
上記プロセッサは、上記プログラマブル集積回路デバイスのプログラマブルリソースから構成されている、上記項目のいずれかに記載のプログラマブル集積回路デバイス。
（項目２９）
高レベル言語を用いてプログラマブルデバイス集積回路デバイスを構成する方法を行う命令を用いて符号化された不揮発性機械読み取り可能な格納媒体であって、該命令は、
該高レベル言語で、該プログラマブル集積回路デバイスのためのユーザー構成の記述を受信する命令と、
プログラミングプロセッサを用いて該ユーザー構成を構文解析し、該構文解析の結果として、事前にコンパイルされた仮想プログラマブルデバイスのライブラリの中から１つの事前にコンパイルされた仮想プログラマブルデバイスを選択する命令と、
該プログラマブル集積回路デバイス上で該事前にコンパイルされた仮想プログラマブルデバイスのインスタンスを作成する命令と、
該ユーザー構成を用いて該インスタンスが作成された事前にコンパイルされた仮想プログラマブルデバイスを構成する命令と
を含む、不揮発性機械読み取り可能な格納媒体。
（項目３０）
上記インスタンスを作成する命令は、上記プログラマブル集積回路デバイスの外部のプロセッサ上で上記事前にコンパイルされた仮想プログラマブルデバイスを実行する命令を含む、上記項目のいずれかに記載の不揮発性機械読み取り可能な格納媒体。
（項目３１）
上記インスタンスを作成する命令は、上記プログラマブル集積回路デバイス上の構成プロセッサ上で上記事前にコンパイルされた仮想プログラマブルデバイスを実行する命令を含む、上記項目のいずれかに記載の不揮発性機械読み取り可能な格納媒体。
（項目３２）
上記実行する命令は、上記プログラマブル集積回路デバイス上でソフトプロセッサのインスタンスを作成することを含む、上記項目のいずれかに記載の不揮発性機械読み取り可能な格納媒体。
【００１３】
（摘要）
プログラマブル集積回路デバイスを構成する方法は、高レベル言語を使用する。方法は、高レベル言語での記述から複数の仮想プログラマブルデバイスをコンパイルすることと、高レベル言語で、プログラマブル集積回路デバイスに対してユーザー構成を記述することと、プログラミングプロセッサを用いてユーザー構成を構文解析することと、構文解析の結果として、コンパイルされた仮想プログラマブルデバイスのうちの１つを選択することとを含む。コンパイルされた仮想プログラマブルデバイスのうちのその選択された１つは、プログラマブル集積回路デバイス上にインスタンスを作成され、コンパイルされた仮想プログラマブルデバイスのうちのインスタンスが作成された１つは、ユーザー構成を用いて構成される。
【００１４】
本発明のさらなる特徴、その特性およびさまざまな利点は、添付の図面に関連して以下の詳細な説明を考慮した上で明白になる。図面において、同様な参照文字は、本明細書を通じて同様な部分を指す。
【図面の簡単な説明】
【００１５】
【図１】図１は、プログラマブルデバイスを構成するために、高レベル言語を用いる既知の方法を示す。
【図２】図２は、本発明の実施形態に従う基本的な仮想ファブリックの例を示す。
【図３】図３は、本発明の実施形態に従うより数学的に複雑な仮想ファブリックの例を示す。
【図４】図４は、ソフトマイクロプロセッサブロックを含む、本発明の実施形態に従う仮想ファブリックの例を示す。
【図５】図５は、本発明の実施形態に従う方法を含む方法において使用される制御データフローグラフを示す。
【図６】図６は、本発明の実施形態に従う仮想ファブリックにおいて構成される仮想ルーティングスイッチの例を示す。
【図７】図７は、本発明の実施形態に従う仮想ファブリックにおいて構成される仮想ＦＩＦＯを有する機能ブロックの例を示す。
【図８】図８は、プログラマブルデバイスを構成するために、仮想ファブリックのライブラリを用いる、本発明の実施形態に従う方法の実施形態のフローダイヤグラムを示す。
【図９】図９は、プログラマブルデバイスを構成するために、仮想ファブリックのライブラリを用いる、本発明の実施形態に従う別の方法の実施形態のフローダイヤグラムを示す。
【図１０】図１０は、本発明に従う方法を行う１組の機械的実行可能な命令を用いて符号化される磁気データ格納媒体の断面図である。
【図１１】図１１は、本発明に従う方法を行う１組の機械的実行可能な命令を用いて符号化される光学的に読み取り可能なデータ格納媒体の断面図である。
【図１２】図１２は、本発明を組み込むプログラマブル論理デバイスを使用する例示的なシステムの簡単化されたブロックダイヤグラムである。
【発明を実施するための形態】
【００１６】
ＯｐｅｎＣＬにおいて、アプリケーションが、２つの部分（ホストおよびカーネル）で実行される。ホストは、Ｉ／Ｏリクエストを処理することおよび並列処理のためにデータをセットアップすることを担うプログラムである。ホストがデータを処理する準備ができた場合、ホストは、カーネル上の１組のスレッドを起動し得る。カーネルは、各スレッドによって行われるべき計算のユニットを表す。
【００１７】
各スレッドは、ホストによって特定されるメモリからデータをロードし、そのデータを処理し、そしてユーザーまたはユーザーのアプリケーションによって読み込まれるために、メモリに結果を再格納することによってカーネル計算を実行する。ＯｐｅｎＣＬテクノロジーにおいて、カーネルおよびその上でカーネルが実行しているデータが、スレッドとして考えられる。結果は、一度にスレッドのグループに対して計算され得る。スレッドは、ワークグループ内にグループ化され得、これは、データがワークグループの中のスレッド間に共用されることを可能にする。普通は、ワークグループの中のスレッドの実行の順序に対して制約は課されない。
【００１８】
データ格納および処理の目的のために、各カーネルは、１つより多いタイプのメモリ、例えば、全てのスレッドによって共用されるグローバルメモリ、同じワークグループのスレッドによって共用されるメモリ、および単一のスレッドのみによって使用されるプライベートメモリへのアクセスを有し得る。
【００１９】
ＯｐｅｎＣＬアプリケーションの実行は、ホストプログラムにおいて部分的に、かつ１つ以上のカーネルを実行することによって部分的に発生し得る。例えば、ベクトル加算において、ベクトルを表すデータアレイは、ホストプログラムを用いてセットアップされ得るが、実際の加算は、１つ以上のカーネルを用いて行われ得る。アプリケーションのこの２つの部分間の通信は、ホストプログラムの中の１組のＯｐｅｎＣＬ機能によって容易にされ得る。これらの機能は、ホストとカーネルとの間のインターフェースを規定し、ホストプログラムが、どのデータが処理されるか、その処理がいつ開始するかを制御し、処理がいつ完了されたかを検出することを可能にする。
【００２０】
プログラマブルデバイス（例えば、ＦＰＧＡ）は、１組のカーネルおよびホストプログラムから開始することによって、高レベル言語（例えば、ＯｐｅｎＣＬ）を用いてプログラムされ得る。カーネルは、この目的のために拡張され得る低レベル仮想機械（ＬＬＶＭ）コンパイラを用いてハード回路表示内にコンパイルされる。コンパイル処理は、各カーネルのための中間表示を生成する高レベルパーサー（例えば、Ｃ言語パーサー）から開始する。中間表示は、命令および命令間の依存関係の形態であり得る。次に、この表示は、標的プログラマブルデバイスに対して最適化され得る。
【００２１】
最適化されたＬＬＶＭ中間表示は、次に、ハードウェア指向のデータ構造（例えば、制御データフローグラフ（Ｆｌｏｗ  Ｇｒａｐｈ）（ＣＤＦＧ）（図５）へ変換される。このデータ構造は、低レベルでカーネルを表し、そのエリアおよび最大のクロック周波数についての情報を含む。次に、ＣＤＦＧは、各カーネルのＶｅｒｉｌｏｇ  ＨＤＬ記述を生成するＲＴＬ生成の前に、システムのエリアおよび性能を向上させるために最適化され得る。
【００２２】
次に、コンパイルされたカーネルは、好ましくは、ホストへのインターフェースもメモリインターフェースも含むシステムにおいてインスタンスを作成される。ホストインターフェースは、ホストプログラムが各カーネルにアクセスすることを可能にする。これは、リモートでワークスペースのパラメータおよびカーネルの引数を設定することを可能にする。メモリは、ＯｐｅｎＣＬカーネルのためのグローバルメモリスペースとして機能する。このメモリは、ホストインターフェースを介してアクセスされ得、ホストプログラムが計算結果を処理し、読み出すために、カーネルに対してデータを設定することを可能にする。最後、ホストプログラムは、書き込まれる高レベル言語（例えば、Ｃ＋＋）のためのレギュラーコンパイラを用いてコンパイルされ得る。
【００２３】
処理の個々の部分に戻ると、カーネルをハードウェア回路にコンパイルするために、各カーネルは、基本ブロックモジュールから実装される。各基本ブロックモジュールは、入力と出力インターフェースとを含み、出力インターフェースを用いて他の基本ブロックとトークし、かつ、ロード、加算、減算、格納等のような命令を実装する。
【００２４】
各カーネルをハードウェア回路として実装することにおける次のステップは、各基本ブロックモジュールをハードウェアモジュールに変換することである。各基本ブロックモジュールは、その内部の動作を扱うことを担う。適切に機能するために、基本ブロックモジュールは、他の基本ブロックと情報を交換することもできるべきである。基本ブロックモジュールがどのようなデータを必要とし、生成するかを決定することは、ライブ可変（Ｌｉｖｅ−Ｖａｒｉａｂｌｅ）分析を用いて完成され得る。
【００２５】
一旦各基本ブロックが分析されると、制御データフローグラフ（ＣＤＦＧ）（図５）が、その基本ブロックモジュールの動作を表すように生成され得、ＣＤＦＧは、ライブ可変分析の結果に基づいて、その基本ブロックモジュールがカーネルの引数かまたは別の基本ブロックからどのように入力を取り込むかを示す。一旦インスタンスを作成されると、各基本ブロックは、ブロック内に含まれる命令に従ってデータを処理し、他の基本ブロックによって、または直接にユーザーによって読み込まれ得る出力を生成する。
【００２６】
一旦各基本ブロックモジュールがＣＤＦＧとして表されると、ブロック内部の動作がスケジュール化され得る。各ノードは、動作を完成させるために必要とする１組のレジスタおよびクロックサイクルを割り当てられ得る。例えば、ＡＮＤ動作は、レジスタを必要としない場合があるが、浮動小数点の加算は、少なくとも７つのクロックサイクルおよび対応するレジスタを必要とし得る。一旦各基本ブロックがスケジュール化されると、パイプライン方式のレジスタが、ＣＤＦＧを通じて、各経路の待ち時間のバランスを保つために挿入され得る。これは、多くのスレッドが処理されることを可能にする。
【００２７】
一旦各カーネルがハードウェア回路として記述されると、設計が生成され得、設計は、カーネル、メモリ、およびホストプラットフォームへのインターフェースを含む。パイプラインオーバーロードを防止するために、ワークグループ内に許可されるスレッドの数、および同時にカーネル内に許可されるワークグループの数が制限され得る。
【００２８】
上記の一般化された方法１００が図１においてダイヤグラム化されている。図１において、経路１０１は、カーネルの実装を示すが、経路１０２は、ホストプログラムの実装を示す。
【００２９】
経路１０１は、カーネルファイル（ｋｅｒｎｅｌ．ｃｌ）１１１から開始する。パーサーフロントエンド（ｆｒｏｎｔ  ｅｎｄ）１２１は、カーネルファイル１１１から最適化されていない中間表示１３１を引き出し、最適化されていない中間表示１３１は、オプチマイザ（ｏｐｔｉｍｉｚｅｒ）１４１によって最適化された中間表示１５１に変換される。最適化処理は、コードをより効率的にするためのコンパイラ技術（例えば、ループ展開、メモリ−レジスタ変換、デッドコード削除等）を含む。レジスタタイミング言語「ＲＴＬ」１６１生成器は、最適化された中間表示１５１をハードウェア記述言語表示１７１に変換し、ハードウェア記述言語表示１７１は、任意のハードウェア記述言語（例えば、Ｖｅｒｌｏｇ（示された）またはＶＨＤＬ）で書き込まれる。
【００３０】
経路１０２は、ホストプログラムファイル（ｈｏｓｔ．ｃ）１１２から開始し、ホストプログラムファイル１１２は、実行可能なプログラムファイル１４２を生成するために、ランタイムライブラリ１３２を用いてコンパイラ１２２によってコンパイルされ、ランタイムライブラリ１３２は、ホストとプログラマブルデバイスとの間の通信を抽象化するソフトウェアルーティンを含む。
【００３１】
実行可能なプログラムファイル１４２と、カーネルのハードウェア記述言語表示１７１とは、適切なソフトウェア１０３によってプログラマブルデバイス構成にコンパイルされる。例えば、Ａｌｔｅｒａ  Ｃｏｒｐｏｒａｔｉｏｎ（Ｓａｎ  Ｊｏｓｅ，Ｃａｌｉｆｏｒｎｉａ）からの市販されているＦＰＧＡデバイスに対して、ソフトウェア１０３は、Ａｌｔｅｒａによって提供されるＱＵＡＲＴＵＳ（登録商標）ＩＩソフトウェアであり得る。
【００３２】
結果は、カーネルによって表される回路のインスタンスを作成するために、カーネルファイル上でホストプログラムを実行するように構成されたプログラマブルデバイスである。プログラマブルデバイスは、ハードウェア記述言語表示１６１を生成するために、カーネル１１１を実行するように、プログラムファイル１４２を実行するための内蔵型プロセッサを有するべきである。内蔵型プロセッサが、「ソフト」プロセッサである場合、内蔵型プロセッサも、ソフトウェア１０３を用いて構成され得る。内蔵型プロセッサが「ハード」プロセッサである場合、ソフトウェア１０３は、ハードプロセッサへの適切な接続を構成する。
【００３３】
上記の一般化された方法は、高レベル言語（例えば、ＯｐｅｎＣＬ）を用いてユーザー論理設計の効率的ハードウェア回路実装を生成するために使用され得るが、必要とされるコンパイル時間が、従来のハードウェア記述言語ベースのプログラミングに対して必要とされるコンパイル時間に匹敵し得ることが望ましくない。特定のユーザー論理設計に応じて、コンパイルは、ＨＤＬベースのプログラミングに対する数秒または数分と比べて、数時間または数日さえもかかり得る。長いコンパイル時間の問題は、特に開発の中に、論理設計を周期的に変える必要によって拡大され得る。
【００３４】
それゆえ、本発明に従って、複数の「仮想ファブリック」の高レベル言語表示が事前にコンパイルされ得る。各このような仮想ファブリック２００（図２）は、バス２１１およびルーティングスイッチ２２１の相互接続ネットワーク２０１と、論理要素の組み合わせを表す比較的に少数のより複雑な機能ブロック２０２とを含む粗粒の仮想ＦＰＧＡの高レベル言語表示であり得、機能ブロック２０２は、比較的により多数の個々の論理要素を有する物理的ＦＰＧＡの上に実装される。例えば、機能ブロック２０２は、基本的な数学関数（例えば、固定または浮動小数点の加算または乗算、または三角関数）を行うブロックと、多重化論理または「ソフト」マイクロプロセッサとを含み得る。
【００３５】
複数の仮想ファブリックは、仮想ファブリックのライブラリとして考えられ得る。ライブラリの中の異なる仮想ファブリックは、異なるタイプの機能ブロックの異なる分配を有し得る。例えば、ライブラリは、ファブリック２００が単に１つの実施例である複数の異なる基本仮想ファブリックを含み得、基本仮想ファブリックの各々は、多重化論理と共に基本的な数学関数を含む機能ブロック２０２の異なる分配を有する。ファブリック３００（図３）が単に１つの実施例であるいくつかの複雑な仮想ファブリックもあり得、ファブリック３００が、基本的および多重化機能２０２を有するが、ファブリック３００において、機能ブロック３０１は、より複雑な関数（例えば、三角関数）を行うものである。それらのより複雑な仮想ファブリックのうちの異なるもの間において、さまざまな算数関数、三角関数および多重化機能の数および分配が変えられ得る。ファブリック４００（図４）が単に１つの実施例である仮想ファブリックさえもあり得、ファブリック４００は、１つ以上の機能ブロックがソフトプロセッサブロック４０１によって置換されていること以外、ファブリック２００またはファブリック３００に類似し得る。さらなるタイプの仮想ファブリックも提供され得る。
【００３６】
仮想ファブリックをある程度までパイプライン化することによって仮想ファブリックの性能を加速することが望ましい場合がある。例えば、レジスタステージが、仮想ルーティングスイッチにおいて提供され得、レジスタステージの各々は、レジスタにつながる多重器として考えられ得る。パイプラインにおける任意の要素は、好ましくは、ストール信号アップストリームを送信することによって、パイプラインをストールする（すなわち、より多く受け取る準備ができるまでデータのフローを停止する）能力を有する。そうでなければ、ダウンストリーム要素がビジーすぎてデータを処理できない間にアップストリーム要素がデータを送信し続ける場合、データが失われる。
【００３７】
しかしながら、要素がストール信号アップストリームを送信する場合、信号が１クロックサイクル遅れて到達する場合があり、その結果、１つのクロックサイクルに相当するデータが失われ得る。それゆえ、ストール信号は、好ましくは、それ自身パイプライン化され、それによって、仮想ファブリック内にパイプライン化されるストール信号ネットワークを提供する。これは、一部または全てのルーティングスイッチにおいてレジスタにストール信号を提供することによって達成され得る。次に、ストールされたコンポーネントからストール信号を送信することに代わって、ストール信号は、レジスタから送信され得る。
【００３８】
一実施例が図６に示される。図６の全てのコンポーネントは、仮想であり、すなわち、それらは、下部ＦＰＧＡの基本要素、または仮想ファブリックのコンパイルの一部分のような他の構成可能またはプログラム可能なデバイスから構成される。
【００３９】
図６は、ルーティングスイッチ６００の１つの可能で詳細な実装のダイヤグラムであり、ルーティングスイッチ６００において、信号は、６０１において「ｗｅｓｔ」から入り、６０２において「ｎｏｒｔｈ」へ、６０３において「ｓｏｕｔｈ」へ、または６０４において「ｅａｓｔ」へルーティング可能である。ルーティングスイッチ６００は、６０５においてアップストリームにストール信号を返送することが可能である必要があるが、６０６においてｎｏｒｔｈから、６０７においてｓｏｕｔｈから、および６０８においてｅａｓｔからストール信号を受信する。
【００４０】
仮想ルーティングスイッチ６００は、入力多重器６１１と、ｎｏｒｔｈ、ｓｏｕｔｈおよびｅａｓｔ出力のそれぞれにおける出力多重器６１２、６１３および６１４とを含む。このようなルーティングスイッチは、入力が到達する方向でストール信号６０５を返送する必要があり得るが、３つの出力方向のうちの任意の１つからストール信号６０６、６０７、６０８を受信する必要もあり得る。本発明の実施形態に従って、ストール信号レジスタ６１５が、ストール信号６０５を出力するために提供され得、ストール信号レジスタ６１６、６１７、６１８が、受信されるストール信号６０６、６０７、６０８を登録するために提供され得る。ストール信号レジスタ６１５，６１６、６１７、６１８は、パイプライン化されるストール信号がアップストリームおよびダウンストリームの両方へ完全に伝搬することを可能にする。
【００４１】
レジスタ６０９、６１０が、入力データを提供される。レジスタ６０９は、ストールがダウンストリームから受信されているため、さらに伝搬することができないデータをキャプチャーする。データが伝搬されるべき出力方向６０２、６０３、６０４のうちの任意の１つがストールされる場合、それらのデータが、ストールが消去されるまでにレジスタ６０９において保持される。レジスタ６１０は、入力データをキャプチャーし、かつ、ストール信号６０５がアサートされなければならない場合にそれらのデータが失われることを防ぐ。レジスタ６１０がない場合、上述した１つのクロックの遅延のため、新しいデータは、ストール信号６０５のアサーション後の最初のクロックサイクルで多重器６１１において受信され得、たとえ事前に受信されたデータがダウンストリームへ伝搬されていなくても、多重器６１１において任意の事前に受信されたデータを置換し得る。しかしながら、レジスタ６１０がある場合、たとえ追加のデータが多重器６１１において後に受信されても、多重器６１１において事前に受信されたデータが保存される。構成レジスタ６２６、６２７、６２８は、ストール信号を受信するための能力をオンまたはオフにするために提供され得る。構成レジスタ６２９は、多重器６１１へ、従って仮想ルーティングスイッチ６００への入力を選択する。構成レジスタ６３０、６３１、６３２は、仮想ルーティングスイッチ６００の１つ以上の出力を選択するように出力多重器６１２、６１３、６１４を制御する。
【００４２】
前述のストール信号ネットワークのパイプライン方式に加えて、仮想ファブリックのパイプライン方式も、仮想ファブリックの個々の機能ブロック２０２、３０１、４０１の入力におけるデータ自身のためのレジスタを含み得る。パイプライン化されるデータ経路の長さが、仮想ファブリックの生成時において未知であり、かつ、同じ機能ブロックに対する異なるデータ経路が、特定のユーザー設計において実装される場合、それらは異なり得るので、各機能ブロック２０２、３０１、４０１の入力においてデータパイプラインレジスタは、好ましくは、パイプラインのバランスを保つために、図７に示されるＦＩＦＯ７０１である。
【００４３】
各ＦＩＦＯ７０１の深さは、最大予期されたパイプラインのアンバランスに基づいて選択され得る。しかしながら、ＦＩＦＯ７０１は満杯になる場合があり、従って各ＦＩＦＯ７０１は、満杯のときにストール信号７０２をアサートする能力を有することが可能である。
【００４４】
同様に、各ＦＩＦＯ７０１は、機能ブロック２０２、３０１、４０１が利用不能のときにデータを読み込もうとしないように、空（ｅｍｐｔｙ）信号７０３をアサートして、機能ブロック２０２、３０１、４０１をストールする能力も有し得る。そうでなければ、機能ブロック２０２、３０１、４０１へのさまざまな入力は、同期から外れ得る（すなわち、機能ブロック２０２、３０１、４０１は、１つのパイプライン上のデータがまだ到達していないときに、２つ以上のパイプラインからデータを読み込む）。
【００４５】
本発明の別の局面に従って、プログラマブルデバイスは、事前にコンパイルされた仮想ファブリックのライブラリまたは集合の中から選択することによって構成され得る。特定の仮想ファブリックの選択は、ユーザーの論理設計の機能的ニーズを検査し、仮想機能ブロックの数およびタイプに関してその機能的ニーズに最もよくマッチする仮想ファブリックを選択することによって、プログラミングソフトウェアで実行され得る。その仮想ファブリックは、オンボードハードプロセッサ、仮想ファブリックの選択の前、後または間にオンボードで構成されるソフトプロセッサ、または外部のプロセッサによってデバイス上で実行される。選択された仮想ファブリックの実行は、デバイスを粗粒の仮想デバイスとして構成する。次に、従来の合成、配置およびルーティングツールは、ユーザーの論理設計を用いてその粗粒の仮想デバイスを構成するために使用され得る。
【００４６】
図８にダイヤグラム化されたプロセッサ８００の実施形態は、前述のようなさまざまなタイプの機能ブロックの異なるサイズおよび異なる分配を有するコンパイルされた仮想ファブリックの集合の生成を有するステップ８０１において開始し得る。ステップ８０１は、デバイス製造者によって行われ得、仮想ファブリックのライブラリは、デバイス上のメモリ、またはデバイスに提供されたデバイス構成ソフトウェアに関連付けられた格納デバイスまたは媒体に提供され得る。第３者も、コンパイルされた仮想ファブリックのライブラリを提供し得る。代替的に、ユーザーは、デバイスが始めて構成されるときに仮想ファブリックのライブラリをコンパイルし得る。
【００４７】
ユーザー自身の仮想ファブリックのライブラリをコンパイルしたユーザーのために、処理８００は、ステップ８０３において続く。仮想ファブリックの事前にコンパイルされたライブラリ（デバイスの事前構成中に、製造者、第３者、または、ユーザーによって提供される）を用いるユーザーに対して、ユーザーは、８０２において処理８００に入り、ステップ８０３へ進む。
【００４８】
ステップ８０３において、ユーザーは、前述のような高レベル言語ステートメント（例えば、ＯｐｅｎＣＬステートメント）の形態で所望の構成を入力し、１組のカーネルを規定する。前述のように、ステップ８０４において、カーネルは、各カーネルに対して中間表示を生成する高レベルパーサー（例えば、Ｃ言語パーサー）を用いて構文解析される。中間表示は、命令および命令間の依存関係の形態であり得る。次に、ステップ８０５において、この表示は、最適化され、ハードウェア指向のデータ構造（例えば、制御データフローグラフ（ＣＤＦＧ））に変換され得る。
【００４９】
ステップ８０６において、ＣＤＦＧは、そのハードウェアニーズを確定するために、プログラミングソフトウェアによって検査され、次に、ソフトウェアは、仮想ファブリックのライブラリの中から、そのハードウェアニーズに合う仮想ファブリックを選択する。既知の技術を用いて、ソフトウェアは、最もよい仮想ファブリックを見つけるために、全ての仮想ファブリックを検査し得るか、または、検査は、ハードウェアニーズに十分に近い仮想ファブリックが見つかれば、終了し得る。この文脈において、「十分に近い」は、全ての必要とされるリソースが仮想ファブリックの中に存在するが、仮想ファブリックが使用されないことがある追加のリソースを有し得ることを意味する。
【００５０】
最後、ステップ８０７において、ユーザーの論理設計は、従来の合成、配置およびルーティング技術（例えば、Ａｌｔｅｒａ  Ｃｏｒｐｏｒａｔｉｏｎからの前述した市販のＱＵＡＲＴＵＳ（登録商標）ＩＩソフトウェアによって実装され得る技術）を用いて、ＣＤＦＧから選択された仮想ファブリック上でプログラムされる。もしデバイスが内蔵型ハードプロセッサを含むことも、外部のハードプロセッサが仮想ファブリックを実行するために使用されるべきでもなければ、このステップは、仮想ファブリックを実行するために、ソフトプロセッサを構成することを含み得る。
【００５１】
特定のユーザー設計は、多数の機能を含み得るが、その機能の全てが同時にアクティブにならない。本明細書に説明される仮想ファブリックが、比較的に粗いので、その仮想ファブリックは、比較的に少数の構成ビットを有する。それゆえ、ランタイムで仮想ファブリックの構成を可能にすることは、（実行時間の観点から）非現実であり得る。従って、仮想ファブリックは、第１のグループの機能を含む第１の構成で構成され得、次に、「オンザフライ（ｏｎ  ｔｈｅ  ｆｌｙ）」は、第２のグループの機能を用いて再構成され得る（第２のグループの機能は、第１のグループの機能と重なり得、すなわち、第２のグループの機能は、第１のグループの機能と同じようないくつかの機能を有し得る）。
【００５２】
このような再構成を用いるためにデバイスをプログラムする方法８５０が図９に示される。方法８５０は、方法８００と同様に開始し、ステップ８０１，８０２、８０３、８０４および８０５を有する。ステップ８５６において、ＣＤＦＧは、そのハードウェアニーズを確定するために検査され、次に、ソフトウェアは、仮想ファブリックのライブラリの中から、２つ以上の別個の構成においてそのハードウェアニーズに合い得る仮想ファブリックを選択する。例えば、どの仮想ファブリックを使用すべきかを決定する１つの方法は、仮想ファブリックがどの程度カーネルのリソースニーズと似ているかを計算するコスト機能を使用することであり得る。
【００５３】
ステップ８５７において、２つ以上の別個の構成は、従来の合成、配置およびルーティング技術（例えば、前述したＱＵＡＲＴＵＳ（登録商標）ＩＩソフトウェアによって実装され得る技術）を用いてプログラムされる。さまざまな構成に対する構成ビットストリームが、ステップ８５８において格納され、仮想ファブリックは、第１の構成を用いてステップ８５９において構成される。必要な場合（テスト８６０、８６１）、その構成は、ステップ８６２においてアンロードされ得、２つ以上の構成のうちの別の構成が、ステップ８６３においてロードされ得る。新しい構成が実行される場合、方法は、ステップ８５９に戻る。これは、デバイスの所望の機能が完成されるまで、２つ以上の構成のうちの異なる構成がアンロードおよび再ロードされるように、１回より多く発生し得る。
【００５４】
選択された仮想ファブリックが前述された再構成処理中に変更されないので、再構成処理は、物理的デバイスが再構成をオンザフライでサポートするか否かに関わらずに使用され得ることが認識される。仮想ファブリックによって表される仮想デバイスが再構成をオンザフライでサポートすることのみが必要である。物理的デバイスが再構成をオンザフライでサポートする場合、選択された仮想ファブリックの構成がランタイムで変更されることが可能であるだけではなく、仮想ファブリック自身も、（前述のように、必要な場合、ロードされている任意の特定の仮想ファブリックの構成がオンザフライで変更されることより）オンザフライでアンロードおよびロードされることが可能であることがさらに認識される。
【００５５】
ライブラリの中の仮想ファブリックが、前もってハードウェア記述言語表示にコンパイルされるので、仮想ファブリックの所望の構成のユーザー高レベル合成言語表示のみが、ユーザープログラミング処理の一部分としてコンパイルされる必要がある。ユーザーは、なお、所望の回路の完全な高レベル記述を入力し、構成されるデバイスを生成するために、高レベル記述を実行するためのプロセッサがなお存在する。しかしながら、ユーザーの高レベル記述の実行の大部分が事前にコンパイルされた仮想ファブリックの選択を伴うので、伴われたコンパイルは、前述のように比較的に小さな構成問題のみを伴う仮想ファブリックの構成のコンパイルのみである。従って、ユーザーによって見られるコンパイル時間は、全設計が高レベル記述からコンパイルされた場合に必要とされ得る時間よりずっと短く、かつ、ハードウェア言語を用いるときの構成時間に匹敵する。
【００５６】
従って、過度に長いコンパイル時間を必要とせずに、高レベル合成言語を用いてプログラマブルデバイスを構成する方法が提供されていることが分かる。
【００５７】
プログラマブルデバイスをプログラムする本発明に従う方法を実行する命令は、機械読み取り可能な媒体上に符号化され、前述の高レベル合成言語によって記述された構成を用いてＰＬＤまたはプログラマブルデバイスをプログラムまたは構成する本発明の方法を実装するために、適切なコンピュータまたは類似のデバイスによって実行され得る。例えば、パーソナルコンピュータは、ＰＬＤが接続され得るインターフェースを装備され得、パーソナルコンピュータは、前述のように、適切なソフトウェアを用いてＰＬＤをプログラムするために、ユーザーによって使用され得る。さらに、同じ機械読み取り可能な媒体、または別個の機械読み取り可能な媒体は、仮想ファブリックのライブラリを用いて符号化され得る。
【００５８】
図１０は、磁気データ格納媒体１２００の断面を示し、磁気データ格納媒体１２００は、前述のパーソナルコンピュータ、または他のコンピュータまたは類似のデバイスのようなシステムによって実行され得る機械実行可能なプログラムを用いて符号化され、または仮想ファブリックのライブラリを用いて符号化され得る。媒体１２００は、フロッピー（登録商標）ディスクまたはハードディスク、または磁気テープであり得、媒体１２００は、従来的であり得る適切な基板１２０１と、片側または両側上の従来的であり得る適切なコーティング１２０２とを有し、コーティング１２０２は、極性または配向が磁気的に変更され得る磁気領域（見えない）を含む。磁気テープである場合を除いて、媒体１２００は、ディスクドライブのスピンドルまたは他のデータ格納デバイスを受け取るための開口部（示されていない）も有し得る。
【００５９】
媒体１２００のコーティング１２０２の磁気領域は、パーソナルコンピュータまたは他のコンピュータまたは類似のシステムのようなプログラミングシステムによる実行のために、機械実行可能なプログラムを従来的であり得る方法を符号化するように偏極または配向され、プログラミングシステムは、本発明に従って、（もしあれば）、その特定された処理ブロックを含むＰＬＤの適切な部分を構成するために、プログラムされるべきＰＬＤが挿入され得るソケットまたは周辺アタッチメントを有する。
【００６０】
図１１は、光学的読み取り可能なデータ格納媒体１２１０の断面を示し、光学的読み取り可能なデータ格納媒体１２１０は、前述のパーソナルコンピュータ、または他のコンピュータまたは類似のデバイスのようなシステムによって実行され得る機械実行可能なプログラムを用いても符号化され、または仮想ファブリックのライブラリを用いて符号化され得る。媒体１２１０は、従来のコンパクトディスク読み取り専用メモリ（ＣＤ−ＲＯＭ）またはデジタルビデオディスク読み取り専用メモリ（ＤＶＤ−ＲＯＭ）または再書き込み可能な媒体（例えば、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ、ＤＶＤ＋Ｒ、ＤＶＤ＋ＲＷ、または光学的に読み取り可能、かつ、磁気光学的に再書き込む可能であるＤＶＤ−ＲＡＭまたは磁気光学ディスクであり得る。媒体１２１０は、好ましくは、従来的であり得る適切な基板１２１１と、一般的に基板１２１１の片側または両側上の従来的であり得る適切なコーティング１２１２とを有する。
【００６１】
ＣＤベースまたはＤＶＤベースの媒体の場合、周知のように、コーティング１２１２は、反射性であり、機械実行可能なプログラムを符号化するために、１つ以上の層の上に配列される複数のピット１２１３を加えられる。ピットの配列は、コーティング１２１２の表面にレーザー光を反射させることによって読み取られる。保護性コーティング１２１４は、好ましくは、実質的に透明であり、コーティング１２１２の上に提供される。
【００６２】
磁気光学ディスクの場合、周知のように、コーティング１２１２は、ピット１２１３を有しないが、レーザー（示されていない）によってある温度より上に加熱されたときに、極性または配向が磁気的に変更され得る複数の磁気領域を有する。領域の配向は、コーティング１２１２から反射されるレーザー光の偏光を測定することによって読み取られ得る。領域の配列は、前述のように、プログラムを符号化する。
【００６３】
本発明に従ってプログラムされたＰＬＤ１５００は、多くの種類の電子デバイス内に使用され得る。１つの可能な使用は、図１２に示されるデータ処理システム１４００内に使用される。データ処理システム１４００は、以下のコンポーネント：プロセッサ１４０１、メモリ１４０２、Ｉ／Ｏ回路網１４０３、および周辺デバイス１４０４のうちの１つ以上を含み得る。これらのコンポーネントは、システムバス１４０５によって一緒に連結され、エンドユーザーシステム１４０７内に含まれる回路ボード１４０６上に装着される。
【００６４】
システム１４００は、幅広いさまざまな応用、例えば、コンピュータネットワーク、データネットワーク、計装、ビデオ処理、デジタル信号処理、またはプログラム可能または再プログラム可能な論理の使用の利点が望まれる任意の他の応用において使用され得る。ＰＬＤ１４０は、さまざまな異なる論理機能を行うために使用され得る。例えば、ＰＬＤ１５００は、プロセッサ１４０１と協働して動作するプロセッサまたはコントローラとして構成され得る。ＰＬＤ１５００は、システム１４００の共用のリソースへのアクセスを調停するアービターとしても使用され得る。なお別の実施例において、ＰＬＤ１５００は、プロセッサ１４０１とシステム１４００の他のコンポーネントのうちの１つとの間のインターフェースとして構成され得る。システム１４００は、例示のみであることと、本発明の真の範囲および精神は、以下の請求項によって示されるべきであることとが留意されるべきである。
【００６５】
さまざまなテクノロジーは、前述のようで本発明を組み込むＰＬＤ１５００を実装するために使用され得る。
【００６６】
上記説明は、単に本発明の原理の例示であることと、本発明の範囲および精神から逸脱することなしに当業者によってさまざまな変更がなされ得ることとが理解される。例えば、本発明のさまざまな要素は、任意の所望の数および／または配列でＰＬＤ上に提供され得る。当業者は、限定ではなく、例示の目的のために示された説明された実施形態以外で実践され得ることと、本発明は、後に続く請求項のみによって限定されることとを認識する。
【図１】
2018028919.tif 000003
【図２】
2018028919.tif 000004
【図３】
2018028919.tif 000005
【図４】
2018028919.tif 000006
【図５】
2018028919.tif 000007
【図６】
2018028919.tif 000008
【図７】
2018028919.tif 000009
【図８】
2018028919.tif 000010
【図９】
2018028919.tif 000011
【図１０】
2018028919.tif 000012
【図１１】
2018028919.tif 000013
【図１２】
2018028919.tif 000014