(57)【特許請求の範囲】
【請求項１】
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成装置であって，
プロセッサと，
前記プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成部と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出部と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成部と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出部と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成部と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入部とを有する高位合成装置。
【請求項２】
請求項１において，
前記レイテンシ生成回路生成部が生成する第２のハードウエア記述ファイルは，前記レイテンシ拡張変数に対応するレイテンシ生成回路として，前記抽出した関数内の静的なレイテンシを前記ループ情報のループ回数に基づいて加算するレイテンシ生成回路を記述する高位合成装置。
【請求項３】
請求項２において，
前記ループ情報生成部は，前記抽出した関数内の全てのループそれぞれのループ回数を，前記ループ情報に含まれるループ回数として生成する高位合成装置。
【請求項４】
請求項３において，
前記ループ回数のいずれかが変数に基づくループ回数であり，
前記レイテンシ生成回路は，前記変数に基づいて関数の動的レイテンシを算出する回路である高位合成装置。
【請求項５】
請求項１〜３のいずれかにおいて，
前記ビヘイビア記述ファイルは，前記機能部分内のレイテンシ拡張変数の値を前記制御部分に供給する記述を有する高位合成装置。
【請求項６】
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成方法であって，
プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成工程と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出工程と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成工程と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出工程と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成工程と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入工程とを有する高位合成方法。
【請求項７】
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成処理をコンピュータに実行させる高位合成プログラムであって，
前記高位合成処理は，
プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成工程と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出工程と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成工程と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出工程と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成工程と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入工程とを有する高位合成プログラム。
【請求項８】
タイミング記述がない高位言語によるビヘイビア記述ファイルであって，集積回路の機能回路に対応する機能部分の記述と，前記機能部分のレイテンシに対応する制御回路に対応する制御部分の記述と，前記機能部分内のレイテンシ拡張変数の記述とを有するビヘイビア記述ファイルを生成する工程と，
コンピュータが，前記ビヘイビア記述ファイルを高位合成して第１のハードウエア記述ファイルを生成する工程と，
コンピュータが，前記ビヘイビア記述ファイルの高位合成工程で抽出されるデータであって，前記レイテンシ拡張変数を有する関数のループ回数と前記関数内の静的レイテンシのデータとから，レイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成する工程と，
コンピュータが，前記第１のハードウエア記述ファイル内のレイテンシ拡張変数の記述を，前記第２のハードウエア記述ファイル内の前記レイテンシ生成回路のハードウエア記述に置換して，レイテンシ生成回路と前記機能回路と前記制御回路とを記述する第３のハードウエア記述ファイルを生成する工程とを有する集積回路の設計方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，高位合成装置，高位合成方法，高位合成プログラム，集積回路の設計方法に関する。
【背景技術】
【０００２】
近年における集積回路の設計は，ムーアの法則に従って集積度が年々向上し，集積回路設計の複雑度は日々増加している。現在，集積回路設計の主流であるハードウエア記述言語（HDL（Hardware Description Language)）を用いたRTL(Register Transfer Level)設計は，論理ゲートにより回路を設計するゲートレベル設計に比べて設計抽象度が高いので，集積回路設計の工数を大幅に削減できる。HDL記述ファイルは，論理合成されてゲートレベルの回路を記述するネットリストに変換され，さらに，ネットリストのゲートにライブラリに登録されているセルが割り当てられ，セル間を接続する配線とクロック供給回路がレイアウトされて，LSIチップの設計データが生成される。
【０００３】
しかし，RTL設計は，回路に対する抽象度が低いHDL記述を開発しなければならず，年々増加している回路規模に対応できなくなりつつあり，RTL設計よりもさらに抽象度の高い高位設計が利用され始めている。高位設計で用いられる入力言語(高位言語)としては，ソフトウェア言語の利用が多く，最も利用されているものはC/C++言語や，ハードウエア記述向けクラスライブラリを実装したSystemC等である。高位設計では，このような高位言語で回路のアルゴリズムまたは機能を記述したビヘイビア記述ファイルを生成する。
【０００４】
そして，高位言語で記述されたビヘイビア記述は，高位合成という一種のコンパイラによりHDLファイルに変換される。高位合成については，特許文献１〜４等に記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開2010-165334号公報
【特許文献２】特開2000-57180号公報
【特許文献３】特開2004-265224号公報
【特許文献４】特開平6-325124号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら，高位設計は未だ発展途上の技術であり，抽象度の低い設計には向かないこともある。
例えば，C/C++言語で記述すると，タイミングなどの時間の概念を記述することができない。したがって，高位設計を行う場合は，集積回路の機能すべてを高位言語で記述するのではなく，適材適所で既存のRTL設計と組み合わせて行うのが一般的である。
【０００７】
しかし，高位設計とRTL設計は別々の言語で集積回路の機能を記述するので，かつ抽象度も違うため，お互いを組み合わせた場合，それぞれのインタフェース部分の検証が必須となる。
【０００８】
そこで，本発明の目的は，タイミング制御を含めて集積回路の設計を高位言語で行うことができる高位合成装置，高位合成方法，高位合成プログラム，集積回路の設計方法を提供することにある。
【課題を解決するための手段】
【０００９】
高位合成装置の第１の側面は，タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成装置であって，
プロセッサと，
前記プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成部と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出部と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成部と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出部と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，前記レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成部と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入部とを有する。
【発明の効果】
【００１０】
第１の側面によれば，タイミング制御を含めて集積回路の設計を高位言語で行うことができる。
【図面の簡単な説明】
【００１１】
【図１】高位合成装置または高位合成プログラムを説明する図である。
【図２】レイテンシを説明する図である。
【図３】動的レイテンシを説明する図である。
【図４】静的レイテンシを説明する図である。
【図５】高位言語による高位設計を行った場合のHDLで記述された回路構成例を示す図である。
【図６】本実施の形態におけるビヘイビア記述の構成例を示す図である。
【図７】本実施の形態における高位合成装置の構成図である。
【図８】動的レイテンシ計算回路挿入機能付き高位合成装置を示す図である。
【図９】本実施の形態における動的レイテンシ計算回路挿入装置の処理のフローチャート図である。
【図１０】ビヘイビア記述ファイルの例を示す図である。
【図１１】図１０のビヘイビア記述ファイルの機能部分の機能を説明する図である。
【図１２】図１０のビヘイビア記述ファイルの構成を示すブロック図である。
【図１３】拡張変数抽出処理121のフローチャート図である。
【図１４】拡張変数DB122の内容とそれを生成する段階で生成される関数ツリーを示す図である。
【図１５】ループ情報抽出123の処理フローチャート図である。
【図１６】抽出されたループ情報データベースの一例を示す図である。
【図１７】スケジューリング処理116の一例を示す図である。
【図１８】静的レイテンシ抽出処理126のフローチャート図である。
【図１９】図１０のビヘイビア記述ファイル内の関数calc_ave，pixel_aveの静的レイテンシを示す図である。
【図２０】静的レイテンシDB 126の一例を示す図である。
【図２１】静的レイテンシ抽出処理125におけるレイテンシ情報の更新処理のフローチャート図である。
【図２２】レイテンシ計算回路生成処理のフローチャート図である。
【図２３】レイテンシ計算回路生成処理を説明するための図である。
【図２４】レイテンシ計算回路生成処理を説明するための図である。
【図２５】レイテンシ計算回路付き回路のHDLファイル105のブロック図である。
【図２６】制御回路24Hの動作を示すタイミングチャート図である。
【図２７】図８のHDLファイル104の例を示す図である。
【図２８】図８のHDLファイル104の例を示す図である。
【図２９】図８のHDLファイル104の例を示す図である。
【図３０】レイテンシ計算回路付き関数pixel_aveの回路のHDL記述例を示す図である。
【発明を実施するための形態】
【００１２】
図１は，高位合成装置または高位合成プログラムを説明する図である。高位合成装置または高位合成プログラム１００は，抽象度の高い言語(例：C/C++/SystemC/C#/Java(登録商標)/BASIC/アセンブリ言語などの高位言語)で記述されたビヘイビア記述ファイル１と，集積回路であるハードウエアを実現するための制約１０２と，テクノロジライブラリ１０３とに基づいて，回路設計情報であるHDL，例えばVerilog-HDL，VHDLなど，で記述されたHDL記述ファイル２を生成する装置またはプログラム（コンパイラ）である。
【００１３】
ビヘイビア記述ファイル１には，集積回路で実現する機能が記述される。ただし，抽象度の高い言語で記述されるので，タイミングなどの時間についての記述は含まれない。制約１０２は，集積回路の最大周波数や目標面積などであり，速度優先で集積回路を設計したいか，消費電力またはチップサイズ優先で集積回路を設計したいかについての制約条件である。一般に，速度優先にするとその速度を実現するためにチップサイズが大きくなり消費電力が増加するのに対して，消費電力やチップサイズを優先するとクロック周波数が低くなり低速の集積回路になる傾向がある。テクノロジライブラリ１０３は，例えば９０ナノテクノロジ，６０ナノテクノロジや，使用可能なファンダリ会社のテクノロジなどを有し，集積回路設計者が希望するテクノロジが選択される。
【００１４】
ハードウエア記述ファイル２は，RTLレベルの回路をHDLで記述したファイルである。このHDL記述ファイルは，論理合成ツールにより，ゲートレベルの回路を記述するネットリストに変換される。そして，ネットリストに基づいて，チップ上のレイアウト設計が行われ，レイアウト設計データに基づいて集積回路チップが製造される。
【００１５】
図２は，レイテンシを説明する図である。レイテンシとは，高位合成で生成した回路などに入力データを与えてからその処理結果が出力されるまでのクロックサイクル数である。図２に示されるとおり，回路Lでは，時間t1で入力イネーブル信号がHレベルになり，入力データI0,I1,I2,I3-Inがクロックに同期して入力される。そして，時間t1から３クロックサイクル後の時間t2から，出力イネーブル信号がHレベルになると共に，入力データに対応する出力データD0,D1,D2,D3-Dnが出力される。このような回路Lのレイテンシは，３クロックサイクルとなる。回路Lの応答時間は，クロック周波数が高くなれば短い時間になり低くなれば長い時間になるものの，回路Lのレイテンシであるクロックサイクル数は固定である。
【００１６】
図３は，動的レイテンシを説明する図である。動的レイテンシは，入力データに対する出力データのレイテンシが入力データ以外の入力パラメータによって変化するレイテンシを意味する。図３の回路Dの例では，入力パラメータがP0の場合はレイテンシが２クロックサイクルであるのに対して，入力パラメータがP1に変化するとレイテンシが４クロックサイクルになっている。
【００１７】
図４は，静的レイテンシを説明する図である。静的レイテンシは，入力データに対する出力データのレイテンシが入力データ以外の入力パラメータの変化によらず常に固定の値となるレイテンシを意味する。図４の回路Sの例では，入力パラメータがP0,P1のいずれの場合も，レイテンシが２クロックサイクルと固定になっている。
【００１８】
静的レイテンシは，例えばC/C++言語によるビヘイビア記述ファイルを高位合成によりHDLファイルに変換する過程で求められ，高位合成のレポートに出力される。一方で，動的レイテンシは回路への入力パラメータによって変化するので，通常の高位合成だけでは求められない。
【００１９】
図５は，高位言語による高位設計を行った場合のHDLで記述された回路構成例を示す図である。前述のとおり，集積回路で実現したい機能のアルゴリズム等をC/C++などの高位言語で記述したビヘイビア記述ファイル１を高位合成することで，そのアルゴリズムによる機能を実現する機能回路２を記述したHDLファイル２に変換される。このように設計された機能回路２は，既に開発済みのHDLファイルである回路A,Bと接続したり，メモリであるROMやRAMとデータの読み書きを行うことが行われる。そのため，機能回路２と回路A,Bおよびメモリとの間に，インタフェース制御と機能回路２に対する入出力の制御を行うラッパーモジュール４を開発する必要がある。このラッパーモジュールは制御回路のHDL記述ファイルである。
【００２０】
つまり，C/C++言語などで高位設計を行う場合，アルゴリズム機能部分をC/C++言語で記述し，高位合成を行う。しかし，アルゴリズム機能部分の外部IFおよび機能部分の制御は，タイミングなどの時間概念の制御であり，C/C++言語ではタイミングを表現出来ない。そのため，現状では，図５のラッパーモジュール４は，HDLを用いてタイミング記述が可能なRTL設計で記述されている。この場合，アルゴリズム機能部分を高位合成した後に生成されるレポート情報３からレイテンシの情報を抜き出し，その値をラッパーモジュール４に記述する。これによりラッパーモジュール４がアルゴリズム機能回路２に対するタイミング制御を行うことができる。
【００２１】
しかし，図５のような設計方法では，高位言語によるビヘイビア記述ファイル１の開発とは別に，HDLで外部IF制御および機能回路の制御を行うラッパーモジュールのHDLファイルを別途開発する必要があり，さらに，ラッパーモジュール４とアルゴリズム機能回路２とのインタフェースの検証も必要になる。そして，アルゴリズム機能回路２のレイテンシが入力パラメータなどによって可変になる場合，高位合成後のレポート情報３からは静的レイテンシしか得られず，動的レイテンシを求めてラッパーモジュール内の回路記述を開発することが必要になる。このようなラッパーモジュールの開発は，通常，手作業により行われ，開発工数の増大を招く。
【００２２】
［本実施の形態におけるビヘイビア記述ファイル］
本実施の形態では，上記のラッパーモジュールのHDLファイルの開発を，高位言語によるビヘイビア記述とは別に行うのではなく，アルゴリズム機能部分の記述と，外部IFや機能部分の制御を行う部分（以下制御部分と称する。）の記述とを含むビヘイビア記述ファイルを開発する。そして，そのビヘイビア記述ファイルを高位合成することにより，アルゴリズム機能回路と，そのレイテンシに対応する制御や外部IFを行う制御回路とを有するHDLファイルに変換する。この高位合成により，レイテンシの計算を行う回路が自動的に生成される。その結果，生成されたHDLファイルの回路では，アルゴリズム機能回路内でその計算回路がレイテンシを計算し，制御回路に出力して，制御回路がレイテンシに基づく制御を行う。
【００２３】
図６は，本実施の形態におけるビヘイビア記述の構成例を示す図である。第１に，このビヘイビア記述２０は，例えばC/C++の高位言語で記述され，アルゴリズム機能部分２２と制御部分２４とを有する。そして，第２に，アルゴリズム機能部分２２のレイテンシの値を，制御部分２４が参照出来る仕組みを記述する。第３に，アルゴリズム機能部分２２内にレイテンシ拡張変数を埋め込み，高位合成プログラムが，高位合成のプロセスと平行してレイテンシ計算回路を自動で生成し，レイテンシ拡張変数の位置にレイテンシ計算回路を組み込む。このレイテンシ計算回路は，例えば，静的レイテンシであれば固定値であり，動的レイテンシでは入力パラメータに基づいて計算する計算回路である。その場合は，入力パラメータが与えられる関数内にレイテンシ計算回路が挿入されるように，レイテンシ拡張変数がその関数内に記述される。
【００２４】
高位合成プログラムは，通常の高位合成処理（コンパイル）の中で，ビヘイビア記述ファイル２０の構文を解析し，データフローを生成し，RTL(Register Transfer Level)を生成するので，ビヘイビア記述ファイル内の関数やレイテンシの拡張変数を抽出することができると共に，関数の演算要素毎の静的レイテンシをレポートとして出力することができる。
【００２５】
そこで，本実施の形態における高位合成プログラムは，関数の演算要素毎の静的レイテンシと，関数の構文から得られるループ回数とに基づいて，アルゴリズム機能部分２２のレイテンシの値またはレイテンシを計算する回路のHDL記述を自動的に生成する。この高位合成プログラムによるレイテンシ計算回路の生成処理については後に詳述する。
【００２６】
この方法によれば，アルゴリズム機能部分２２を開発する開発者が，高位言語でアルゴリズム機能部分２２と共に上記の制御部分２４の記述も開発し，両者を含むビヘイビア記述が高位合成されて，機能部分に対応する機能回路と制御部分に対応する制御回路を有する回路のHDLファイルに変換される。さらに，高位合成処理で，機能回路の静的レイテンシや，入力パラメータによってレイテンシが可変になる動的レイテンシを計算する回路のHDL記述が開発され，制御回路が静的レイテンシまたは動的レイテンシを有する機能回路の制御を行えるようになる。
【００２７】
したがって，制御回路に対応するラッパーモジュールのHDLファイルを，高位合成後に別途開発する必要がなく，制御回路に対応する制御部分の記述がアルゴリズム機能部分の記述と共に同じビヘイビア記述ファイルとして開発される。さらに，ビヘイビア記述ファイル内には，アルゴリズム機能部分２２からレイテンシを参照する記述が制御部分２４に含まれ，制御部分２４からアルゴリズム機能部分２２へ制御信号を供給する記述も必要なら含ませることができ，HDLファイルでの両者の回路間の動作について検証しなくともよい。よって，本実施の形態の方法によれば，集積回路の設計工数を大幅に削減する。
【００２８】
［本実施の形態における高位合成装置］
図７は，本実施の形態における高位合成装置の構成図である。高位合成装置は，CPUなどのプロセッサ１０と，RAMなどのメモリ１２と，プログラムファイルやデータファイルが格納されたファイルシステムとがバスBUSを介して接続されるコンピュータシステムである。ファイルシステム内には，レイテンシ計算回路挿入機能付きの高位合成プログラム１００と，高位合成用ライブラリ１０３とが格納される。レイテンシ計算回路挿入機能付き高位合成プログラム１００は，通常の高位合成を行う高位合成プログラム１１０と，レイテンシ計算回路挿入プログラム１２０とを有する。
【００２９】
そして，図７の高位合成装置には，図６に示したビヘイビア記述ファイル１０１と高位合成制約ファイル１０２とが入力され，高位合成プログラム１１０がビヘイビア記述ファイル１０１をHDL記述ファイルに変換する。この高位合成処理中に，レイテンシ計算回路挿入プログラム１２０は，ビヘイビア記述ファイル１０１内の拡張変数とそれを含む関数を抽出しそれを有する拡張変数データベース（以下DB）１２２と，抽出した関数内のループ回数などを有するループ情報DB１２４と，関数内の各要素の静的レイテンシを抽出してそれを有する静的レイテンシDB１２６と，上記のDBに基づいて生成したレイテンシ計算回路のHDL記述ファイル１２８とを生成する。そして，高位合成プログラム１１０が高位合成により生成した機能回路と制御回路とを有するHDLファイル１０４内の拡張変数の位置に，レイテンシ計算回路のHDL記述を挿入し，レイテンシ計算回路付き機能回路と制御回路とを有するHDLファイル１０５を生成する。
【００３０】
図８は，動的レイテンシ計算回路挿入機能付き高位合成装置を示す図である。図７のレイテンシ計算回路挿入機能付き高位合成プログラム100をプロセッサ10が実行することにより，図８の高位合成装置が構成される。したがって，プログラムの引用番号110，120がそのまま装置の引用番号に与えられている。
【００３１】
動的レイテンシ計算回路挿入機能付き高位合成装置100は，従来の高位合成装置110を有するとともに，その高位合成装置110にはなかった動的レイテンシ計算回路挿入装置120と高位合成装置110と動的レイテンシ計算回路挿入装置120を接続するためのインタフェース131，インタフェース132，インタフェース133，インタフェース134を含む。このインタフェースらは，たとえば，高位合成プログラム100内に含まれている動的レイテンシ計算回路挿入装置120の各処理121,123,125,127,129をサブルーチンコールする記述である。
【００３２】
動的レイテンシ計算回路挿入装置120は，高位合成装置110に含まれるコード解析111，コントロール・データ・フロー解析113，スケジューリング116において，それぞれ拡張変数抽出121，ループ情報抽出123，静的レイテンシ抽出125を行い，レイテンシ計算回路生成127とレイテンシ計算回路挿入129に必要なデータベースである拡張変数DB 122，ループ情報DB 124, 静的レイテンシDB 126を生成する。レイテンシ計算回路生成127は，ループ情報DB 124と静的レイテンシDB 126からレイテンシ計算回路のHDL記述128を生成し，レイテンシ計算回路挿入129は，拡張変数DB 122を参照して，ビヘイビア記述101を高位合成して得た回路のHDLファイル104内のレイテンシ拡張変数が記述されている箇所に，レイテンシ計算回路のHDL記述128を挿入して，レイテンシ計算回路付き回路のHDLファイル105を生成する。
【００３３】
［動的レイテンシ計算回路挿入装置の概略］
図９は，本実施の形態における動的レイテンシ計算回路挿入装置の処理のフローチャート図である。以下，処理の概略を説明し，その後ビヘイビア記述の具体例に基づいて，詳細に説明する。
【００３４】
時間概念のないC/C++などの高位言語で記述されたビヘイビア記述内の機能部分を，高位合成により，その機能を実現する回路のHDLファイルへ変換する場合，機能部分のレイテンシに対する制御回路が必要になる。本実施の形態では，ビヘイビア記述内にこの機能部分と制御部分とを関連つけて開発し，動的レイテンシ計算回路挿入装置120が，機能部分を解析してレイテンシを求めるレイテンシ生成回路のHDL記述を生成し，高位合成されたHDLファイルに挿入する。挿入する位置を特定するために，ビヘイビア記述においてレイテンシ拡張変数を記述しておく。
【００３５】
さらに，動的レイテンシ計算回路挿入装置120では，特に，レイテンシが条件によって変化する場合，そのレイテンシを静的に決定することができないため，入力パラメータの変化を考慮したレイテンシ計算回路のHDL記述128を生成し，高位合成で生成する回路のHDLファイル104に挿入する。
【００３６】
動的レイテンシ計算回路挿入装置120の処理は，図９に示されるとおり，
(1)C/C++で記述された機能部分からレイテンシ拡張変数と関数を抽出し，拡張変数DB122を生成する(拡張変数抽出処理121)。
(2)前記関数に含まれるループを抽出し，ループ回数を含むループ情報を抽出し，ループ情報DB124を生成する(ループ情報抽出処理123)。
(3)前記関数を要素毎に分割し，各要素の静的なレイテンシを求め，静的レイテンシDB126を生成する(静的レイテンシ抽出処理125)。これでレイテンシ計算回路を生成するために必要なデータベースが構築される。
(4)前記ループ情報と前記静的なレイテンシとに基づき，動的レイテンシを計算するための式を求める(レイテンシ計算回路生成処理127)。
(5)レイテンシ計算式に相当する回路のHDLファイル128を，高位合成で変換された回路のHDLファイル104の中のレイテンシ拡張変数の箇所に挿入する(レイテンシ計算回路挿入処理129)。である。
【００３７】
レイテンシ計算回路のHDL記述が挿入された回路のHDLファイル105は，レイテンシに基づいて機能回路の制御を行う制御回路を有し，且つ，動的レイテンシを計算して制御回路の制御に反映することができる。さらに，ビヘイビア記述ファイル102は，機能部分と制御部分とが連携しあうように開発されているので，高位合成後のHDLファイル104,105において，機能回路と制御回路のインタフェース検証を行わなくともよい。
【００３８】
［ビヘイビア記述ファイルの例］
図１０は，ビヘイビア記述ファイルの例を示す図である。この例は，C/C++で記述され，px列，py行の画素マトリクス内の各画素データの平均値を求める機能部分を有する。
【００３９】
図１１は，図１０のビヘイビア記述ファイルの機能部分の機能を説明する図である。この機能部分は，px列，py行の画素マトリクス内の各画素データの平均値を求める。
【００４０】
図１０のビヘイビア記述ファイルソースコードは，入出力として次の変数や状態信号を有する。
入力px：横の画像サイズ
入力py：縦の画像サイズ
入力mem：画像のメモリ
入力start：開始信号
出力run：計算中を示す状態信号
出力done：終了信号
戻り値ave：平均算出結果(pxとpyの全画素を累積加算して，平均値を求める)
そして，画像メモリmemから横の画像サイズpxと縦の画像サイズpyで指定したサイズの画像データを読み込み，指定サイズの画像データの画素の平均値を算出して，平均値aveを出力する処理内容となっている。例えば，px=8，py=8の場合は，8×8=64画素分の平均値を求めて出力する。従って，本ソースコードは，平均値算出のためのループ回数がpxとpyで可変となり，高位合成した回路もpxとpyに従って入力から演算結果が出力されるまでのレイテンシが可変になっている。
【００４１】
図１０のビヘイビア記述ファイルソースコードは，以下の記述を有する。
【００４２】
行1：レイテンシ拡張変数P_HLS_LATENCYを定義。ただし，この拡張変数はとりあえず０になっている。
【００４３】
行2：変数MAXが128と定義。
【００４４】
行3-27：アルゴリズム機能部分の記述。
【００４５】
行3-8：関数calc_aveの記述であり，画素データの合計値sumを列px，行pyの積で除算して求める関数。px,pyは変数である。
【００４６】
行10-27：関数pixel_aveの記述であり，変数に，スタート信号start，入力パラメータのpx,py，画素データが格納されているメモリの値mem[MAX],レイテンシ値latのアドレスを示すポインタ*latencyが含まれている。また，行13-14に，レイテンシ拡張変数P_HLS_LATENCYの値を値latに代入し，そのアドレスをポインタ*latencyに代入する記述が含められている。このレイテンシ拡張変数の位置に，高位合成で生成されるレイテンシ計算回路のHDL記述が埋め込まれる。そして，行15-24に，スタート信号startが真になると，ループL0,L1で全ての列px，行pyについてメモリ内の画素値を累積（行19）し，累積値sumの平均値を求める関数cal_aveをコールし（行22）する記述がある。
【００４７】
行29-50：制御部分の記述であり，関数controlは変数としてレイテンシ値latency，フラグstart，状態信号のポインタ*run,*dineが含まれている。レジスタsr_run，sr_doneがfalseにリセットされ（行31,32），カウント値cntが宣言され（行33），スタート信号startが真になると（行34），レジスタsr_run，sr_doneがtrue，falseに，カウント値cntがレイテンシ値latencyにされ（行35-37），カウント値cntが0になるまでの間（行38），レジスタsr_runが真にされ，カウント値cntがデクリメントされ（行40），カウント値cntが0になるとwhileループを抜けてレジスタsr_run，sr_doneがfalse，trueにセットされ（行42,43），スタート信号startが偽になるとレジスタsr_run，sr_doneがfalseにリセットされ（行45,46)，最後に状態信号のポインタ*run,*dineにレジスタsr_run，sr_doneのアドレスが代入される（行48,49）。
【００４８】
行52-58：メインルーチンの関数dutが記述され（行52），その関数dutでは，レイテンシ値latency,平均値aveを宣言し（行54），関数pixel_aveの戻り値を平均値aveに代入し（行55)，関数controlを実行し（行56），戻り値を平均値aveにする（行57）。
【００４９】
図１２は，図１０のビヘイビア記述ファイルの構成を示すブロック図である。上記の説明から明らかなとおり，図１０のビヘイビア記述ファイルの構成は，図１２に示されるとおりである。すなわち，ビヘイビア記述ファイル２０は，アルゴリズム機能部分２２である関数pixel_aveが，内部で他の関数calc_aveをコールし，さらに，関数pixel_ave内にレイテンシ拡張変数P_HLS_LATENCYが埋め込まれている。関数pixel_aveが，入力パラメータである変数px,pyを入力し，その変数px,pyに応じてレイテンシが変化するので，かかる動的レイテンシを計算する回路は，関数pixel_ave内に埋め込む必要があることは，ビヘイビア記述ファイルを開発する開発者は知っている。したがって，開発者は，上記のように動的レイテンシを計算する回路を埋め込む箇所を，レイテンシ拡張変数P_HLS_LATENCYで指定する。
【００５０】
さらに，ビヘイビア記述ファイル２０は，レイテンシ値latencyに基づいてアルゴリズム機能部分２２を制御するための状態信号run,doneを生成する制御部分２４を有する。すなわち，制御部分２４は，スタート信号startが真になったときに機能部分２２が動作を開始することに対応して，その動作を開始し，そのレイテンシ値latencyに基づくクロックサイクル後に状態信号run,doneを出力する。
【００５１】
従来の機能部分２２だけを有するビヘイビア記述ファイルを開発する場合に比較すると，開発者は，機能部分２２がその機能回路を記述するHDLファイルに変換された場合に，その回路のレイテンシに対応する必要な制御を行う制御部分２４を同時に開発し，さらに，そのレイテンシが入力パラメータなどにより動的に変化する動的レイテンシの場合には，そのレイテンシ計算が可能な位置にレイテンシ拡張変数P_HLS_LATENCYを埋め込む。その結果，ビヘイビア記述ファイルを高位合成することで，機能部分２２の回路とそれの制御部分２４の回路とを記述するHDLファイルに変換することができる。このHDLファイルでは，機能部分に対応する機能回路と制御部分に対応する制御回路とのインタフェースの記述も含まれる。そして，高位合成の過程で抽出した情報に基づいてレイテンシ生成回路のHDL記述を生成して，機能部分に対応する機能回路内に挿入してレイテンシ生成回路付き集積回路のHDLファイルを生成することができる。
【００５２】
［高位合成の詳細説明］
図１０のビヘイビア記述ファイルを例にして，図８，図９を参照しながら，本実施の形態における高位合成装置（または高位合成プログラム）100の詳細な処理について説明する。以下，高位合成プログラムをプロセッサが実行した場合の処理として説明する。
【００５３】
図８，図９において，ビヘイビア記述ファイル101は，高位言語であるC/C++で記述され，例えば図１０の記述を有する。高位合成制約102は，高位合成を行うための制約条件であり，主なものとして，集積回路の目標動作周波数，目標面積，高位合成用ライブラリの設定（どのテクノロジのライブラリを使用するかの設定）などである。さらに，高位合成用ライブラリ103は，高位合成を行うためのライブラリであり，通常，ASICベンダが提供するテクノロジライブラリから高位合成用に提供されるライブラリを使用する。ライブラリ内には，回路の遅延情報，面積情報，消費電力情報，などが定義されている。
【００５４】
高位合成プログラム110は，ビヘイビア記述ファイル101をコンパイルして集積回路のHDLファイル104に変換する。さらに，高位合成プログラム110には，動的レイテンシ計算回路挿入プログラム120の各処理をコールする記述等がインタフェースとして含まれている。
【００５５】
［コード解析処理111］
高位合成プログラム110は，コード解析処理111にて，ビヘイビア記述ファイル101が高位合成可能な記述であることをチェックし，高位合成装置が解釈できるフォーマットに変換する。このコード解析処理は，一般的なコンパイラ技術をもとに作られており，字句解析，構文解析，意味解析，などからなる。コード解析の処理後に拡張変数抽出処理121で拡張変数を抽出する処理を行う。
【００５６】
［拡張変数抽出処理121］
図１３は，拡張変数抽出処理121のフローチャート図である。図１４は，拡張変数DB122の内容とそれを生成する段階で生成される関数ツリーを示す図である。ビヘイビア記述ファイル101(図１０のソースコード例参照)をコード処理111で解析を行った後，図１３のフローチャート図に従って，拡張変数P_HLS_LAYTENCYを拡張変数DB 122に登録する。
【００５７】
拡張変数抽出121では，拡張変数抽出に先立って，図１４に示す関数ツリーの作成を行う(S10,S11)。図１０の例では，関数dutがトップに，その次のレベルに関数pixel_aveとcontrol関数とがあり，さらに，関数pixel_aveの下のレベルに関数calc_aveがある。この関数ツリーを作成することにより，各関数がどのレベルに属するかを把握することが可能となる。
【００５８】
次に各関数内で定義されている拡張変数を抽出し，拡張変数が存在すればその"名前"を，存在しなければ"なし"を各関数レベルと共に拡張変数DB122に登録する(S12,S13,S14)。図１０のソースコードで拡張変数P_HLS_LAYTENCYが存在する関数は関数pixel_aveのみであり，その他の関数に拡張変数は存在しない。図１０のソースコードの例では，最終的には図１４の表１の拡張変数DB 122が得られる。ここで得られた拡張変数DB 122の内容は，後工程のレイテンシ計算回路129で参照される。
【００５９】
［コード最適化処理112］
コード最適化処理112では，コード解析111の結果をもとにコード記述の最適化を行う。例えば，冗長なコードがある場合に冗長性をなくすよう最適化するなどである。一般的なコンパイラ技術の最適化のフェーズにあたる。
【００６０】
［コントロール・データ・フロー解析113］
次に，最適化したソースコードからデータ・フロー・グラフを生成し，高位合成に必要なデータの流れを明確にする。このコントロール・データ・フロー解析113内のループ解析113aと条件分岐解析113bで，後工程であるリソース・アロケーション115とスケジューリング116の処理対象となるループ文や条件分岐の解析を行い，ループや条件分岐が反映されたデータ・フロー・グラフを生成する。そして，コントロール・データ・フロー解析の処理後にループ情報抽出123でループ情報を抽出する処理を行う。
【００６１】
［ループ情報抽出処理123］
図１５は，ループ情報抽出123の処理フローチャート図である。図１６は，抽出されたループ情報データベースの一例を示す図である。コントロール・データ・フロー解析113でループ解析113aや条件分岐解析113bを行った後に，動的レイテンシ計算回路挿入プログラム120が，ループ情報抽出処理123を実行する。
【００６２】
まず，初めに各関数内に記述されているループ文(for文，while文，do〜while文，break文)の抽出を行い，抽出されたループ文よりも入れ子として先にあるループは親ループとして定義し，親ループの抽出を行う(S15,S16)。その後，ループ回数となる要素を確定し，各関数ごとに用意したループ情報DBに登録を行う（S18,S19,S20)。
【００６３】
図１０のビヘイビア記述ファイルのpixel_ave関数の場合，最初に出現するループL0より上のループは存在しないため，親ループはなし，ループ回数は変数pxとなり，回数属性は変数，変数名はpxとして，図１６の表３のように登録する。次にループL1の場合，ループL1より上のループとしてループL0が存在しているため，親ループはL0，ループ回数は変数pyとなり，回数属性は変数，変数名はpyとして，図１６の表３のように登録する。回数属性が変数ではなく固定値である場合は，回数属性を固定値，固定値にループ回数の値を登録する。
【００６４】
関数pixel_aveと同様の処理を関数calc_ave，関数control，関数dutにも行うが，これらの関数はいずれも内部にループ文が存在しないため，ループなし，親ループなし，回数属性なし，変数名/固定値なし，という形で登録される。結局，ループ情報抽出処理123の結果，図１６の表２，３，４，５のような内容のループ情報DB124が生成される。
【００６５】
［ライブラリ選択処理114］
高位合成プログラム110に戻り，ライブラリ選択処理114では，高位合成制約102で指定したライブラリを高位合成ライブラリ103から読み込み，高位合成に必要な演算リソースの作成や，すでに準備された演算リソースを選択して，次の処理であるリソース・アロケーション115にライブラリデータを渡す。
【００６６】
［リソース・アロケーション処理115］
次に，リソース・アロケーション処理115では，コントロール・データ・フロー解析113で生成したデータ・フロー・グラフの各演算パーツ(加減算器，乗算器，除算器，など)に対して，ライブラリ選択114で読み込んだライブラリのリソースを割り当てる。これも高位合成の一般的処理である。
【００６７】
［スケジューリング処理116］
スケジューリング処理116では，リソース・アロケーション115でライブラリデータを適用したデータ・フロー・グラフに対して，高位合成制約102で記述した目標動作周波数，スループットなどの制約を与え，その制約を満たす範囲内で高位合成可能なクロックサイクルを計算する。本処理の時点でUntimedな処理フローからフリップフロップを利用したクロックサイクルの処理フロー(RTL: Register Transfer Level)への変換が行われる。本実施の形態では，スケジューリングの処理後に静的レイテンシ抽出125で静的レイテンシを抽出する処理を行う。
【００６８】
図１７は，スケジューリング処理116の一例を示す図である。まず，図１７中の（１）に示されているX=A+B*Cのフローグラフについて，加算器と乗算器との間にラッチ回路FFを挿入して（２）のグラフを生成する。この（２）のグラフにおいて乗算器は入力側ラッチ回路FFと出力側ラッチ回路FFとの間に設けられ，乗算器は１クロックサイクルt10で乗算処理を完了させる構成になっている。そこで，スケジューリング処理116では，高位合成制約102の目標動作周波数から１クロックサイクルの時間が得られ，その時間内に乗算器が乗算処理を完了できるか否かチェックする。
【００６９】
完了不能の場合は，さらにスケジューリング処理により，乗算器を２つに分割し，それらの間にラッチ回路FFを挿入する。その結果，乗算器は２クロックサイクルで処理すれば良いことになり，乗算器は２クロックサイクルt12で乗算処理を完了させる構成に変更される。
【００７０】
上記のようなスケジューリング処理により，フローグラフにクロックサイクルに対応したラッチ回路が追加され，RTLへの変換が行われる。RTLに変換されれば，各関数内に存在する静的なレイテンシを決定することができる。
【００７１】
［静的レイテンシ抽出処理125］
次に，スケジューリング116で各関数内に存在する静的なレイテンシが決定可能になるので，静的レイテンシ抽出処理125では，静的レイテンシの値を抽出し，静的レイテンシDB 126に登録する。
【００７２】
図１８は，静的レイテンシ抽出処理126のフローチャート図である。図１９は，図１０のビヘイビア記述ファイル内の関数calc_ave，pixel_aveの静的レイテンシを示す図である。そして，図２０は，静的レイテンシDB 126の一例を示す図である。
【００７３】
動的レイテンシの計算対象となる関数は，拡張変数P_HLS_LATENCYが記述されているpixel_ave関数とそこから呼び出されるcalc_ave関数である。そこで，図１９にはpixel_ave関数とcalc_ave関数のみを抜き出したC/C++のソースコードが示されている。まず初めに，図１９のソースコードから演算要素となる式を抽出し，各要素ごとにユニークな番号I〜VIIを割り振る。次に，番号ごとに属性，親ループ，静的レイテンシを抽出し(図１８のS21)，図２０の表６のように静的レイテンシDBに登録する（S22)。続いて，calc_ave関数も同様の処理S21,S22を行い，図２０の表７のように静的レイテンシDBに登録する。ただし，calc_ave関数は，pixel_ave関数と違いループがないため，親ループは存在しない。同様の処理S21,S22を，拡張変数に関連するすべての関数に対して行い，静的レイテンシDB 126を構築する。
【００７４】
図１９の２つの関数の演算要素のレイテンシは，以下のとおりである。
関数pixel_aveの場合では，
I：条件式であるため文属性は条件式，親ループは存在せずなし，レイテンシは0
II：代入文であるため文属性は代入，親ループは存在せずなし，レイテンシは1
III：累積加算であるため文属性は計算式，親ループはループL1，レイテンシは5
IV：関数であるため文属性は関数，親ループは存在せずなし，レイテンシは未定
V：リターンであるため文属性はリターン，親ループは存在せずなし，レイテンシは0
また，関数calc_aveの場合では，
VI：計算式であるため文属性は式，親ループは存在せずなし，レイテンシは3
VII：リターンであるため文属性はリターン，親ループは存在せずなし，レイテンシは0
上記の両関数の演算要素のレイテンシ抽出により，両関数に対する静的レイテンシDBは，図２０の表６，表７に示されるとおりとなる。さらに，関数calc_aveのレイテンシは，表７のレイテンシの列を加算することで得られ，関数calc_aveのレイテンシは3+0=3となる。
【００７５】
次に，表６内の演算要素IVの未定のレイテンシを確定させるために表７から得られた関数calc_aveのレイテンシ3+0=3を参照し，表６の演算要素IVのレイテンシを更新する。その結果，図２０の表８に示す関数pixel_aveの静的レイテンシDBが生成される。
【００７６】
図２１は，静的レイテンシ抽出処理125におけるレイテンシ情報の更新処理のフローチャート図である。図２１に示すとおり，高位合成対象の関数の静的レイテンシDBを読み込む（S25)。これにより，図２０の表６，７が読み込まれる。そして，表６について，文属性が関数である行を抽出し(S27)，その関数の行のレイテンシの列が「確定」か「未定」かを確認し(S28)，「未定」の場合は，その行の関数の静的レイテンシDB（表７）を読み込む(S29)。そして，読み込んだ関数の静的レイテンシDB（表７）内に未確定の演算要素があるか否かチェックし（S30)，存在する場合は，図２１のプログラムを再帰呼び出しする（S32)。表７の静的レイテンシDBには未確定の演算要素は存在しないので，表６の行IVのレイテンシ情報を更新する（S31)。具体的には，関数calc_aveの合計レイテンシ情報「３」を表６の行IVのレイテンシ情報に更新する。そして，関数pixel_aveの全ての関数について上記と同じ処理を完了すれば(S26のYES)，更新処理は完了する。
【００７７】
［回路最適化117］
高位合成プログラム110に戻り，回路最適化処理117にて，スケジューリング116で生成されたRTL（図１７（３））に対して，演算器やフリップフロップの最適化を行い，制約を満たす範囲内で最適な回路を構築する。この最適化処理により，冗長な構成や無駄な構成などが最適化される。これも一般的な高位合成プログラムの処理の一つである。
【００７８】
［HDL生成118］
高位合成プログラム110は，上記の最適化されたRTL回路からHDLファイルを生成する。HDLファイルとしては，一般的にVerilog-HDLやVHDLが使用される。本実施の形態では，HDLファイル生成処理118の後にレイテンシ計算回路挿入処理129でレイテンシ計算回路の生成と挿入を行う。
【００７９】
［レイテンシ計算回路生成処理127］
一方，動的レイテンシ計算回路挿入プログラム120は，レイテンシ計算回路生成処理127を実行して，レイテンシ計算回路のHDLファイルを生成する。レイテンシ計算回路生成処理127では，図１６のループ情報DB 124と図２０の静的レイテンシDB 126に基づいて，動的レイテンシ計算回路のHDLファイル128を生成する。
【００８０】
まず，図２０の表８のpixel_ave関数の静的レイテンシDBでは，演算要素IIIの親ループL1のレイテンシが何回なのか，もしくはループ回数が変数なのかの情報が決まっていない。この情報の確定は，ループ情報抽出123で生成した図１６の表３のpixel_ave関数のループ情報DB 124を参照することで可能である。計算式確定までの処理ステップを以下に示す。
【００８１】
図２２は，レイテンシ計算回路生成処理のフローチャート図である。また，図２３，図２４は，レイテンシ計算回路生成処理を説明するための図である。図２２のレイテンシ計算回路生成処理では，まず高位合成対象関数dutのうち，レイテンシ拡張変数が埋め込まれている関数pixel_aveとそれがコールする関数calc_aveとを統合した静的レイテンシDB（図２０の表８）を読み込む（S40)。そして，その静的レイテンシDB（図２０の表８）内の親ループが存在する全ての行について処理S42-S44を実行する（S41のNO)。そして，親ループが存在する行が全て処理されて親ループがなくなると（S41のYES)，処理S45,S46を実行してレイテンシ計算式の確定（S45)と，その回路のHDLファイルの生成（S46)を行う。
【００８２】
図２０の表８の例では，処理S42-S44を２回行い，その後処理S45,S46を行うことでレイテンシ計算回路のHDLファイルが生成される。以下，具体例に沿って説明する。
【００８３】
処理S42-S44（１回目）：図２３に示すように表８の要素IIIの親ループL1の情報を参照する。表８の関数pixel_aveの親ループL1の情報は，表３の関数pixel_aveのループ情報DBにおけるループ名L1の列を参照することで取得できる（S42)。この場合，表３の関数pixel_aveのループ情報DBでは，ループL1の親ループはL0，回数属性は変数，変数名はpyであるため，表８の要素IIIの親ループ名をL1からL1の親ループであるL0に書き換え（S43)，表３のループL1のループ回数である変数名pyに基づいて，表８の要素IIIのレイテンシを5*pyに書き換える（S44)。上記の処理を行うことで，図２３において表８は表９のように更新される。
【００８４】
処理S42-S44（２回目）：図２４に示すように表９の要素IIIの親ループL0の情報を参照する。
表９の関数pixel_aveの親ループL0の情報は，表３の関数pixel_aveのループ情報DBにおけるループ名L0の列を参照することで取得できる（S42)。この場合，表３の関数pixel_aveのループ情報DBでは，ループL0の親ループはなし，回数属性は変数，変数名はpxであるため，表９の要素IIIの親ループ名をL0から親ループなしに書き換え（S43)，表３のループL0のループ回数である変数名pxに基づいて，表９のIIIのレイテンシを5*px*pyに書き換える（S44)。上記の処理を行うことで，図２４において表９は表１０のように更新される。
【００８５】
処理S45,S46：図２４の表１０からレイテンシの計算式を抽出し，計算回路を生成する。
処理S42-S44の繰り返しにより，静的レイテンシDB内の未確定情報がすべて確定したため，表１０のレイテンシの列の総和が関数pixel_aveのレイテンシの計算式になる（S45)。表１０の例では，「１＋５*px*py＋３」というレイテンシ計算式になる。そこで，このレイテンシ計算式に相当する回路のHDLファイルが，動的なレイテンシ計算回路128として生成される（S46)。
【００８６】
［レイテンシ計算回路挿入処理129］
レイテンシ計算回路挿入処理129では，HDLファイル104内の拡張変数と拡張変数DB 122に登録されている拡張変数が一致することを確認し，一致すればHDLファイル104内の拡張変数の箇所にレイテンシ計算回路のHDL記述128を挿入し，レイテンシ計算回路付き回路のHDLファイル105を生成する。
【００８７】
図２５は，レイテンシ計算回路付き回路のHDLファイル105のブロック図である。図１２に示したビヘイビア記述ファイルのブロック図における機能部分２２の関数pixel_aveと関数calc_aveとが，図２５のHDLファイルのブロック図では，pixel_ave回路22Hとcalc_ave回路23HのHDL記述に変換され，図１２の拡張変数P_HLS_LATENCYが，図２５ではレイテンシ計算回路のHDL記述128に変換されている。さらに，図１２の制御部分２４は，図２５の制御回路のHDL記述24Hに変換されている。
【００８８】
そして，図２３の回路では，レイテンシ計算回路128で計算されるレイテンシlatencyが制御回路24Hに入力されるよう高位合成されるので，従来のように制御回路を高位合成とは独立してHDLファイルにより開発した場合の動作検証などが不要になる。
【００８９】
図２６は，制御回路24Hの動作を示すタイミングチャート図である。図１０のビヘイビア記述ファイルのソースコード内にある制御部分controlの動作は，レイテンシ計算回路により計算されたレイテンシ値latencyが与えられることで，図２６に示す動作になる。即ち，スタート信号startが「１」になると，状態信号runが「１」になり，クロックCLKに同期して，カウンタのカウント値cntがレイテンシ値Latencyからデクリメントされる。そして，カウント値cntが０になると，状態信号runが「０」になると共に，状態信号doneが１クロックサイクルだけ「１」になる。
【００９０】
この制御回路24Hが出力する状態信号run,doneを参照して，図２５には示されていない別の回路により，pixel_ave回路22Hの出力である平均値aveの値がラッチされる。つまり，状態信号doneが一種のストローブ信号として機能する。
【００９１】
図１０のビヘイビア記述ファイルの例では，関数pixel_aveにだけレイテンシ拡張変数が埋め込まれている。複数の関数においてそれぞれレイテンシに対応した制御が必要な場合は，各関数にレイテンシ拡張変数が区別可能に埋め込まれることになることは明らかである。そして，前述の動的レイテンシ計算回路挿入プログラム120により，それぞれのレイテンシ拡張変数が埋め込まれた関数それぞれについて，レイテンシ計算式の生成とレイテンシ計算回路のHDL記述128の生成が行われ，対応するレイテンシ拡張変数の位置に挿入される。
【００９２】
［静的なレイテンシ計算回路の例］
図２２のレイテンシ計算回路の生成処理127を実行したとき，レイテンシ計算式に変数が含まれない場合がある。その場合は，その関数のレイテンシは，入力パラメータにより動的に変化することのない静的レイテンシである。その場合は，レイテンシ計算回路は，変数が含まれず，固定値の演算式または固定値になる。たとえば，上記の例でpx=4，py=4の固定値の場合は，レイテンシ計算式は「1＋5×4×4＋3」となり，レイテンシ＝84で固定となる。
【００９３】
このようにレイテンシ拡張変数が埋め込まれた関数のレイテンシが静的レイテンシの場合も，本実施の形態にしたがって，固定値についてレイテンシ計算回路のHDL記述を生成して挿入すれば，制御回路のHDLファイルを有効に生成することができる。すなわち，図２３に示したレイテンシ計算回路付き回路のHDLファイル105では，レイテンシ計算回路128が固定値を出力する回路になる。もちろん，この場合のレイテンシ計算回路はレイテンシを変数で計算することはない。しかし，この場合においても，回路開発において，制御部分をビヘイビア記述ファイル内に含めて開発できるので，高位合成により制御回路を有する回路のHDLファイル105を開発することができる。そして，制御回路と機能回路とのインタフェースの検証作業などは不要になる。
【００９４】
［HDLファイル104,105の具体例］
図２７，図２８，図２９は，図８のHDLファイル104の例を示す図である。図２７において，リスト1-aは，図１０のビヘイビア記述ファイルの行3-8の関数calc_aveを高位合成した回路のHDL記述例である。リスト1-aでは，関数calc_aveの動作を高位合成した回路の具体的なHDL記述は簡単のために省略されている。リスト1-a内に示されるとおり，このHDL記述は，入力sum,px,pyと出力aveを有する回路モジュールcalc_aveを記述する。
【００９５】
さらに，図２７のリスト1-bは，図１０のビヘイビア記述ファイルの行29-50の関数controlを高位合成した回路のHDL記述例である。ここでも関数controlの動作を高位合成した回路の具体的なHDL記述は省略されている。リスト1-b内に示されるとおり，このHDL記述は，クロック入力clk，入力rst,latency,start，出力run,doneを有する回路モジュールcontrolを記述する。
【００９６】
図２８において，リスト1-cは，図１０のメインの関数dutを高位合成した回路のHDL記述例である。ビヘイビア記述内の関数dutが，回路モジュールdutを記述するHDLファイルに変換されている。また，回路モジュールdutは，内部でcontrolとpixel_aveをコールしている。
【００９７】
図２９において，リスト1-dは，図１０の関数pixel_aveを高位合成した回路のHDL記述例である。リスト1-dでは，関数pixel_aveの動作を高位合成した回路の具体的なHDL記述は簡単のために省略されている。リスト1-d内に示されるとおり，このHDL記述は，クロック入力clk，入力rst,start,px,py，出力ave,latencyを有する回路モジュールcalc_aveを記述する。そして，この関数pixel_aveのHDL記述においても，レイテンシ拡張変数P_HLS_LATENCYを出力latencyに代入する回路が下線のとおり含まれている。これは，ビヘイビア記述内の関数pixel_ave内に記述したレイテンシ拡張変数がHDL記述に変換されたものである。
【００９８】
図３０は，レイテンシ計算回路付き関数pixel_aveの回路のHDL記述例を示す図である。このレイテンシ計算回路付き関数pixel_aveの回路のHDL記述105は，ビヘイビア記述101を高位合成して生成したHDLファイル104内の関数pixel_ave（図２９）内のレイテンシ拡張変数P_HLS_LATENCYに，レイテンシ計算回路のHDL記述128を挿入して生成される。図３０中の下線部分がレイテンシ計算回路のHDL記述128に対応する。
【００９９】
上記の実施の形態では，図８に示されるとおり，高位合成プログラム110が変換した回路のHDLファイル104内の拡張変数の位置に，動的レイテンシ計算回路挿入プログラム120が生成したレイテンシ計算回路のHDLファイル128を挿入した。しかし，スケジューリング処理116で生成されたRTL記述に，レイテンシ計算回路生成処理127で生成されるレイテンシ計算回路のRTL記述を挿入して，それをHDLファイルに変換するようにしてもよい。
【０１００】
以上の通り，本実施の形態では，集積回路で実現したい機能部分と，それを制御する制御部分とを有するビヘイビア記述ファイル101を開発する。また，その機能部分にレイテンシ拡張変数を挿入しておく。そして，高位言語で記述されたビヘイビア記述ファイル101を高位合成する過程で，レイテンシの制御が必要な関数の解析結果であるループ情報DBと，その関数の静的レイテンシDBとを生成し，両DBから関数のレイテンシ計算式を生成し，レイテンシ計算回路のHDL記述128を生成する。最後にビヘイビア記述ファイル101を高位合成して変換したHDL記述ファイル104内のレイテンシ拡張変数の位置にレイテンシ計算回路のHDL記述128を挿入することで，レイテンシに対する制御回路を有する集積回路のHDLファイル105を生成することができる。しかも，レイテンシが変数により動的に変化する場合は，動的レイテンシ計算回路のHDL記述128を挿入することで，動的レイテンシに対する制御回路を有する集積回路のHDLファイル105を生成することができる。
【０１０１】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１０２】
（付記１）
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成装置であって，
プロセッサと，
前記プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成部と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出部と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成部と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出部(125)と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，前記レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成部と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入部とを有する高位合成装置。
【０１０３】
（付記２）
付記１において，
前記レイテンシ生成回路生成部が生成する第２のハードウエア記述ファイルは，前記レイテンシ拡張変数に対応するレイテンシ生成回路として，前記抽出した関数内の静的なレイテンシを前記ループ情報のループ回数に基づいて加算するレイテンシ生成回路を記述する高位合成装置。
【０１０４】
（付記３）
付記２において，
前記ループ回数は，前記レイテンシ拡張変数を内部に有する全てのループのループ回数を有する高位合成装置。
【０１０５】
（付記４）
付記３において，
前記ループ回数のいずれかが変数に基づくループ回数であり，
前記レイテンシ生成回路は，前記変数に基づいて関数の動的レイテンシを算出する回路である高位合成装置。
【０１０６】
（付記５）
付記１〜３のいずれかにおいて，
前記ビヘイビア記述ファイルは，前記機能部分内のレイテンシ拡張変数の値を前記制御部分に供給する記述を有する高位合成装置。
【０１０７】
（付記６）
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成方法であって，
プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成工程と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出工程と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成工程と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出工程と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，前記レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成工程と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入工程(129)とを有する高位合成方法。
【０１０８】
（付記７）
タイミング記述がない高位言語により集積回路の機能を記述したビヘイビア記述ファイルを，タイミング記述を含めて前記集積回路を記述するハードウエア記述ファイルに変換する高位合成処理をコンピュータに実行させる高位合成プログラムであって，
前記高位合成処理は，
プロセッサが，前記機能を記述した機能部分とタイミングを制御する制御部分とを有するビヘイビア記述ファイルを，第１のハードウエア記述ファイルに変換する高位合成工程と，
前記プロセッサが，前記ビヘイビア記述ファイルから，前記機能部分内のレイテンシ拡張変数を含む関数を抽出する変数抽出工程と，
前記プロセッサが，前記抽出した関数に含まれるループ記述を抽出し，前記関数内のループのループ回数を含むループ情報を生成するループ情報生成工程と，
前記プロセッサが，前記抽出した関数の要素毎に静的なレイテンシを生成する静的レイテンシ抽出工程と，
前記プロセッサが，前記ループ回数と静的レイテンシとに基づいて，前記レイテンシ情報を生成するレイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成するレイテンシ生成回路生成工程と，
前記プロセッサが，前記第１のハードウエア記述ファイルに前記第２のハードウエア記述ファイルを挿入して第３のハードウエア記述ファイルを生成する挿入工程とを有する高位合成プログラム。
【０１０９】
（付記８）
タイミング記述がない高位言語によるビヘイビア記述ファイルであって，集積回路の機能回路に対応する機能部分の記述と，前記機能部分のレイテンシに対応する制御回路に対応する制御部分の記述と，前記機能部分内のレイテンシ拡張変数の記述とを有するビヘイビア記述ファイルを生成する工程と，
コンピュータが，前記ビヘイビア記述ファイルを高位合成して第１のハードウエア記述ファイルを生成する工程と，
コンピュータが，前記ビヘイビア記述ファイルの高位合成工程で抽出されるデータであって，前記レイテンシ拡張変数を有する関数のループ回数と前記関数内の静的レイテンシのデータとから，レイテンシ生成回路を記述する第２のハードウエア記述ファイルを生成する工程と，
コンピュータが，前記第１のハードウエア記述ファイル内のレイテンシ拡張変数の記述を，前記第２のハードウエア記述ファイル内の前記レイテンシ生成回路のハードウエア記述に置換して，レイテンシ生成回路と前記機能回路と前記制御回路とを記述する第３のハードウエア記述ファイルを生成する工程とを有する集積回路の設計方法。
【０１１０】
（付記９）
付記８において，
前記第２のハードウエア記述ファイルは，前記レイテンシ生成回路として，前記抽出した関数内の静的なレイテンシを前記ループ回数に基づいて加算するレイテンシ生成回路を記述する集積回路の設計方法。
【０１１１】
（付記１０）
付記９において，
前記ループ回数は，前記レイテンシ拡張変数を内部に有する全てのループのループ回数を有する集積回路の設計方法。
【０１１２】
（付記１１）
付記１０において，
前記ループ回数のいずれかが変数に基づくループ回数であり，
前記レイテンシ生成回路は，前記変数に基づいて前記関数の動的レイテンシを算出する回路である集積回路の設計方法。
【０１１３】
（付記１２）
付記８〜１１のいずれかにおいて，
前記ビヘイビア記述ファイルは，前記機能部分内のレイテンシ拡張変数を前記制御部分に供給する記述を有する集積回路の設計方法。
【符号の説明】
【０１１４】
100：動的レイテンシ計算回路挿入機能付き高位合成プログラム
101：ビヘイビア記述ファイル
104：第１のハードウエア記述ファイル
105：第３のハードウエア記述ファイル
110：高位合成プログラム
120：動的レイテンシ計算回路挿入プログラム
121：拡張変数抽出処理
123：ループ情報抽出処理
125：静的レイテンシ抽出処理
127：レイテンシ計算回路生成処理
129：レイテンシ計算回路挿入処理
【図１】
0005910108.tif 000002
【図２】
0005910108.tif 000003
【図３】
0005910108.tif 000004
【図４】
0005910108.tif 000005
【図５】
0005910108.tif 000006
【図６】
0005910108.tif 000007
【図７】
0005910108.tif 000008
【図８】
0005910108.tif 000009
【図９】
0005910108.tif 000010
【図１０】
0005910108.tif 000011
【図１１】
0005910108.tif 000012
【図１２】
0005910108.tif 000013
【図１３】
0005910108.tif 000014
【図１４】
0005910108.tif 000015
【図１５】
0005910108.tif 000016
【図１６】
0005910108.tif 000017
【図１７】
0005910108.tif 000018
【図１８】
0005910108.tif 000019
【図１９】
0005910108.tif 000020
【図２０】
0005910108.tif 000021
【図２１】
0005910108.tif 000022
【図２２】
0005910108.tif 000023
【図２３】
0005910108.tif 000024
【図２４】
0005910108.tif 000025
【図２５】
0005910108.tif 000026
【図２６】
0005910108.tif 000027
【図２７】
0005910108.tif 000028
【図２８】
0005910108.tif 000029
【図２９】
0005910108.tif 000030
【図３０】
0005910108.tif 000031