(57)【要約】【課題】動作合成により生成されるパイプライン回路において、複数のイタレーションで同一の値となる変数に対して生成されるパイプラインレジスタの数を減らすことができる動作合成装置を提供する。【解決手段】プログラミング言語によってハードウエアの構成を記述したプログラムに基づいて動作合成を行う動作合成装置（１）は、プログラムにおけるループ文中に記述された変数の中から、イタレーション間で同一の値をとり、かつハードウエアにおける複数のステージで利用される、同一値変数を抽出する同一値変数抽出部（１３ｃ）と、同一値変数抽出部によって抽出された前記同一値変数のための共通レジスタを作成し、かつ、前記同一値変数の値を前記共通レジスタから読み出すRTL記述を生成するRTL記述生成部（１３ｄ）とを有する。【選択図】図１
2007323606.tif 000002
【特許請求の範囲】
【請求項１】
プログラミング言語によってハードウエアの構成を記述したプログラムに基づいて動作合成を行う動作合成装置であって、
前記プログラムにおけるループ文中に記述された変数の中から、イタレーション間で同一の値をとり、かつ前記ハードウエアにおける複数のステージで利用される、同一値変数を抽出する同一値変数抽出部と、
該同一値変数抽出部によって抽出された前記同一値変数のための共通レジスタを作成し、かつ、前記同一値変数の値を前記共通レジスタから読み出すRTL記述を生成するRTL記述生成部と、
を有することを特徴とする動作合成装置。
【請求項２】
前記同一値変数抽出部は、１イタレーション中の変数の中から、代入操作により前記１イタレーション中に更新される変数と、イタレーションが切り替わる毎に所定の値だけ変化する変数とを、除いて残った変数を、前記同一値変数として抽出することを特徴とする請求項１記載の動作合成装置。
【請求項３】
前記RTL記述生成部は、最初のイタレーション時に共通のレジスタを作成する記述を生成する共通レジスタ作成記述生成部と、第２回目以降のイタレーションでは、前記同一値変数を前記共通レジスタから読み出す記述を生成する読出記述生成部とを有することを特徴とする請求項１又は２に記載の動作合成装置。
【請求項４】
前記同一値変数は、１イタレーション中の演算処理により生成される変数であることを特徴とする請求項１記載の動作合成装置。
【請求項５】
前記同一値変数は、所定のイタレーション間隔毎に同一の値をとる変数であることを特徴とする請求項１記載の動作合成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動作合成装置に関し、特に、パイプライン処理に関する動作合成装置に関する。
【背景技術】
【０００２】
従来より、半導体装置の設計において、ソフトウエアプログラミング言語、例えばC言語、によるプログラム記述（以下、C記述と略すこともある）を用いて、半導体装置のハードウエア構成を設計し、レジスタトランスファレベル（以下、RTLという）の記述（以下、RTL記述という）を自動的に生成する動作合成ツールが広く利用されている。
【０００３】
C記述からRTL記述を生成する動作合成処理、すなわち高位合成処理では，C記述中にループ処理を記述することによって、動作合成処理においてパイプライン動作をする回路のRTL記述が生成される。このようなソフトウエア記述からパイプライン動作回路の記述を生成する技法は、ループパイプラインあるいはソフトウェアパイプラインとも呼ばれ、一般に利用されている。そして、パイプライン動作の構造を有するアークテクチャの合成方法の技術も種々提案されている（例えば、特許文献１参照）。
【０００４】
ループパイプライン技法は，ループ１回分の処理（すなわち１イタレーション）が最後まで終了する前に次のイタレーションを開始するようにRTL記述を生成する方法である。前のイタレーションの開始から次のイタレーションの開始までの時間は、イニシエーション・インターバル（Initiation Interval）と呼ばれる。ソフトウエアのループ内の各演算、すなわち１イタレーション中の各演算処理において、イニシエーション・インターバルの時間が経過するごとに、対応するハードウエアでは、その各演算処理に用いていた計算資源（レジスタなどの記憶素子、演算器などの論理回路等）は、次のイタレーションに明け渡される。そして、１イタレーションは、イニシエーション・インターバルの時間が経過するごとに、別の計算資源を用いて次の演算処理を継続する。このような計算資源の集まり中の各計算資源は、ステージ単位に分けられる。１イタレーションは、イニシエーション・インターバルごとに１つずつステージを移動する。すなわち、１イタレーションにおける全演算処理は、複数のステージを移動することにより最終的に終了する。
【０００５】
１イタレーション中のある演算処理が終了して次の演算処理を行うために、そのイタレーションが別のステージへ移動するとき、その移動前のステージでレジスタに記憶された値は、その移動後のステージで利用するために、複製する場合がある。これにより、前ステージのレジスタを、次のイタレーションが利用できるようになる。この複製された値を保存するためのレジスタは、パイプラインレジスタと呼ばれる。
【０００６】
C記述における各センテンスは、高位合成のスケジューリング処理により、いずれかのステージに対応付けられる。そして、C記述中のある変数が、複数のステージに出現するとき、高位合成の処理によってその変数を保存するためのパイプラインレジスタが生成される。
【０００７】
しかし、上述した合成方法の技術（特許文献１）に開示されているような従来のパイプラインレジスタの生成方式では、１イタレーションにおけるステージの移動にのみ着目して、必要なパイプラインレジスタが生成されている。そのため複数のイタレーションに関わる、同一の値の変数があっても、不必要なパイプラインレジスタが生成されてしまうという問題があった。
【特許文献１】特開平8-44773号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
そこで、本発明は、動作合成により生成されるパイプライン回路において、複数のイタレーションで同一の値となる変数に対して生成されるパイプラインレジスタの数を減らすことができる動作合成装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の一態様によれば、プログラミング言語によってハードウエアの構成を記述したプログラムに基づいて動作合成を行う動作合成装置であって、前記プログラムにおけるループ文中に記述された変数の中から、イタレーション間で同一の値をとり、かつ前記ハードウエアにおける複数のステージで利用される、同一値変数を抽出する同一値変数抽出部と、該同一値変数抽出部によって抽出された前記同一値変数のための共通レジスタを作成し、かつ、前記同一値変数の値を前記共通レジスタから読み出すRTL記述を生成するRTL記述生成部と、を有することを特徴とする動作合成装置が提供される。
【発明の効果】
【００１０】
本発明によれば、動作合成により生成されるパイプライン回路において、複数のイタレーションで同一の値となる変数に対して生成されるパイプラインレジスタの数を減らすことができる。
【発明を実施するための最良の形態】
【００１１】
以下、図面を参照して本発明の実施の形態を説明する。  
（第１の実施の形態）  
まず図１に基づき、第１の実施の形態に係わる動作合成装置の処理を説明する。
【００１２】
図１は、本実施の形態に係わる動作合成装置の構成を示すブロック図である。動作合成装置１は、コンピュータ装置であり、入出力装置、記憶装置、CPU等からなる。具体的には、動作合成装置１は、設計者であるユーザが各種命令を指示するための、キーボード等の入力装置１１と、各種データの表示等を行う画面を有するモニタ等の表示装置１２と、CPUを含み、各種処理を実行するデータ処理装置１３と、各種データを記憶する記憶装置１４とを含んで構成されている。
【００１３】
記憶装置１４は、設計対象である半導体装置の構成を記述したC言語によるプログラム、すなわちC記述を記憶する記憶領域部１４ａと、そのＣ記述に高位合成、すなわち動作合成を行うことにより生成されたRTL言語によるプログラム、すなわちRTL記述を記憶する記憶領域部１４ｂとを含む。C言語は、プログラミング言語の一つである。
【００１４】
データ処理装置１３は、Ｃ記述読込部１３ａと、ステージ対応部１３ｂと、非更新変数抽出部１３cと、RTL記述生成部１３ｄとを含む。各部１３ａから１３ｄは、主としてソフトウエアにより実現されている。
【００１５】
Ｃ記述読込部１３ａは、ユーザの指示に応じて、記憶装置１４の記憶領域部１４ａに記憶されたＣ記述を読み出す処理を行う処理部である。
【００１６】
ステージ対応部１３ｂは、後述するように、読み出したＣ記述を解析しスケジューリングを行い、Ｃ記述中の各センテンス中の変数を、パイプライン動作の各ステージに対応付ける処理を行う処理部である。ステージ対応部１３ｂは、さらに、対応付けられた各ステージで利用される変数の情報を、Ｃ記述の中から抽出する処理を行う。
【００１７】
ループ変数比較部としての非更新変数抽出部１３ｃは、ループ中の変数をリストアップし、Ｃ記述中のセンテンス毎に変数の利用、及び更新をチェックし、イタレーション間での変数の値を比較する処理を行う比較処理部である。特に、非更新変数抽出部１３ｃは、Ｃ記述の中の変数の中で、その値の更新が行われない変数、すなわち非更新変数を抽出するための処理を行う。言い換えると、非更新変数抽出部１３cは、全てのイタレーションで同一の値をとる変数を抽出する処理を行う処理部である。
【００１８】
RTL記述生成部１３ｄは、C記述に基づいてRTL記述を生成する処理を行う処理部である。生成されたRTL記述は、記憶領域部１４ｂに記憶される。
【００１９】
次に、図２を用いて、パイプライン回路合成の対象となるＣ記述の例を説明する。図２は、ループ処理を含むC記述の例を示す図である。C記述は、パイプラインの対象となるループ文を含む。動作合成処理により、図２のループ文の部分に対応して、パイプライン動作の回路が作成される。図２のC記述のループ文では、７つの変数、具体的には、２つの配列変数a[N],g[N]と５つの変数b,c,d,e,fとが用いられている。図２に示すC記述は、配列変数a[N]と変数cを入力として、配列変数g[N]を出力する処理を示す。
【００２０】
ループ文を構成するfor文２１は、ループボディ部２２を含む。ループ文が、パイプライン合成の対象となるループである。ループボディ部２２の第１のセンテンス２１aは、配列変数a[N]から１つの値を読み出して、変数bに代入する処理が行われることを示している。  
第２のセンテンス２１bは、変数bと変数cとを乗算して、変数dを得る処理が行われることを示している。  
第３のセンテンス２１cは、変数bと変数cとを加算して、変数eを得る処理が行われることを示している。  
第４のセンテンス２１dは、変数ｄと変数eとを加算して、変数fを得る処理が行われることを示している。  
第５のセンテンス２１eは、変数cと変数fとを乗算して、配列変数g[N]を得る処理が行われることを示している。  
以上の第１から第５のセンテンスの処理は、配列変数a[N]の変数iを０からＮまで、iを１ずつインクリメントしながら、iがNになるまで繰り返される。よって、このようなＣ記述から動作合成して得られたRTL記述は、第１から第５のセンテンスに対応した並列処理を実行するハードウエア回路の構成を示す記述となる。
【００２１】
各変数の値を得るために、変数a[N],b,c,d,e,fは、それぞれ、各センテンスにおいて代入あるいは演算のために用いられている。特に、図２において、変数cは、第２、第３および第５のセンテンスにおいて、他の変数を求めるために利用されている。
【００２２】
従来の動作合成処理によれば、図２のＣ記述を動作合成すると、図３の左側のRTL記述３１が生成される。図３は、動作合成処理により得られるRTL記述の例を示す図である。
【００２３】
図３の左側のRTL記述３１は、図２のC記述から生成される。本実施の形態は、ハードウエア回路のステージとC記述のセンテンスとが、一対一に対応している例である。RTL記述３１の場合、変数cが、C記述の第２、第３及び第５のセンテンスに対応する各ステージにおいて利用されるようにするために、変数cの値は更新されずに同一であるにも拘わらず、ステージ毎に、変数c用のパイプラインレジスタが生成されるようにRTL記述３１が生成される。図３では、変数cのために、矢印で示すように３つの代入文Dが記述されており、その図３のRTL記述３１によれば、図４に示すようなハードウエア回路が生成される。
【００２４】
図４は、従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。  
図４の回路は、ステージ１から５を有する。ステージ１から５は、それぞれ図２に示すループボディ部２２のセンテンス２１aから２１ｅに対応する。ステージ１は、配列変数a[i]の値とcの値を、それぞれレジスタ４１とレジスタ４２にストアする処理を行う入力処理のステージである。このステージ１は、第１のセンテンス２１ａに対応する。ステージ２は、配列変数a[i]の値をストアしているレジスタ４１の値と、変数cの値をストアしているレジスタ４２の値とを、乗算器４３により乗算する処理を行うステージである。このステージ２は、第２のセンテンス２１ｂに対応する。ステージ３は、変数b,cの値を、加算器４７により加算する処理を行うステージである。このステージ３は、第３のセンテンス２１ｃに対応する。ステージ４は、変数d,eの値を、加算器５１により加算する処理を行うステージである。このステージ４は、第４のセンテンス２１ｄに対応する。そして、ステージ５は、変数cの値と変数fを、乗算器５４により乗算する処理を行うステージである。このステージ５は、第５のセンテンス２１ｅに対応する。
【００２５】
ステージ２では、レジスタ４１と４２にそれぞれストアされた２つの値を乗算してその結果は変数ｄのレジスタ４６にストアされる。ステージ３では、レジスタ４１の値が転送されてストアされた変数ｂのレジスタ４４と、レジスタ４２の値が転送されてストアされた変数ｃのレジスタ４５とにストアされた２つの値を加算してその結果は変数ｅのレジスタ５０にストアされる。ステージ４では、レジスタ４６の値が転送されてストアされた変数ｄのレジスタ４９と、レジスタ５０とにストアされた２つの値を加算してその結果はレジスタ変数ｆの５３にストアされる。ステージ５では、レジスタ４８の値が転送されてストアされた変数ｃのレジスタ５２と、レジスタ５３にストアされた２つの値を乗算してその結果は配列変数g[i]の値として出力される。
【００２６】
特に、ステージ３から５では、それぞれのステージで変数cを利用するために、あるいは次のステージへ変数cの値を転送するためにパイプラインレジスタであるレジスタ４５、４８及び５２が設けられている。変数cの値は更新されずに同一値であるにも拘わらず、従来のようにＣ記述をそのまま動作合成処理すると、単に値をコピーして保持するためのレジスタ４５、４８及び５２が生成されてしまう。
【００２７】
そこで、本実施の形態に係る動作合成装置１は、C記述を解析して複数のイタレーションにおける変数の変化を検出して、図５に示すようなRTL記述が得られるように、後述するような処理を行う。本実施の形態の動作合成装置１によれば、図２のＣ記述を動作合成すると、図３の右側のRTL記述３２が生成される。
【００２８】
図３の右側のRTL記述３２では、左側のRTL記述３１における、変数cのための、矢印で示すように３つの代入文Ｄは無い。図３の右側のRTL記述３２を生成する処理については、後述する。図３のRTL記述３２によれば、図５に示すようなハードウエア回路が生成される。
【００２９】
図５は、本実施の形態の動作合成装置１により生成されるハードウエア回路の構成を説明するための模式図である。図５では、図４と同じ構成要素については、同じ符号を付す。
【００３０】
図５に示すように、本実施の形態の動作合成装置１により生成されるハードウエア回路では、変数c用のレジスタ６１は、１つだけ生成され、図４と比較すると、レジスタの数が３つ減少している。
【００３１】
次に、以上のような構成にかかる動作合成装置１の処理の流れの例を説明する。図６は、本実施の形態に係わる動作合成装置１の処理の流れの例を示すフローチャートである。
【００３２】
ユーザの作成したC記述、ここでは、図２のループ文を含むC記述は、動作合成装置１の記憶装置１４の記憶領域部１４ａに記憶されている。ユーザは、動作合成装置１に対して、記憶領域部１４ａに記憶されたC記述を指定し、そのC記述からRTL記述を生成する動作合成処理を行うように、動作合成装置１に指示を入力する。動作合成装置１は、その指示に応じて、指定されたC記述の動作合成を行うべく、図６の処理を実行する。
【００３３】
まず、動作合成装置１のC記述読込部１３ａは、指定されたＣ記述を、データ処理装置１３のメモリ（図示せず）上に読み込む（ステップS1）。
【００３４】
次に、ステージ対応部１３ｂは、C記述に対してスケジューリングを行い、各センテンスを、各パイプラインステージに対応させる処理が行われる（ステップS2）。この結果、パイプラインステージと各センテンスの変数との対応付けの情報、すなわち対応関係の情報が得られる。
【００３５】
そのために、ステージ対応部１３ｂは、まず、ループボディ部２２中に、複数のステージで利用される変数の情報の抽出を行う。図２の場合、ループ文の１イタレーションの間にある変数は、変数a[i], b, c, d, e, f, g[i], iである。そして、ステージ対応部１３ｂは、C記述と、スケジューリングにより得られたパイプライン回路のステージの情報とを対応させ、これらの変数の中から、複数のステージにおいて利用される変数を抽出する。図２の場合、複数のステージにおいて利用される変数は、変数b, c, d, e, f, iである。
【００３６】
ステージ対応部１３ｂにおける変数の情報及び対応関係の情報の抽出は、C記述のプログラム言語をテキスト解析により、行うことができる。例えば、C記述中の代入式「＝」、演算子「＊」、「＋」等に基づいてテキスト文字の変数を特定し、代入式の左右にいずれかにあるかをチェックする、等により、変数の情報の抽出を行うことができる。また、２以上のステージに現れる変数があるかをチェックすることによって、２以上のステージで利用されている変数の情報も抽出することができる。そして、抽出された変数の情報と、ステージの情報とが対応付けされる。
【００３７】
続いて、非更新変数抽出部１３ｃにより、ループ文中の変数をリストアップし，C記述中のセンテンス毎に変数の利用状況、更新状況をチェックし、イタレーション間での変数の値を比較し、すべてのイタレーションにおいて更新のない変数を抽出する処理が行われる（ステップS3）。具体的には、非更新変数抽出部１３ｄは、C記述に対してテキスト解析を行い、センテンス２１ａから２１ｅについて、代入式「＝」の左側に存在する変数、すなわち代入操作により１イタレーションの間に更新される変数を抽出する。さらに、非更新変数抽出部１３ｄは、代入式「＝」の左側に存在しない変数であるが、イタレーションが切り替わるごとに所定の値ずつ、ここでは１ずつ、増分し変化する変数を抽出する。
【００３８】
図２の場合、非更新変数抽出部１３cは、ループ文の1イタレーションの間に在る変数a[i], b, c, d, e, f, g[i], iをまず抽出してリストアップする。そして、非更新変数抽出部１３cは、その変数a[i], b, c, d, e, f, g[i], iの中から、代入操作により１イタレーションの間に更新される変数b, d, e, f, g[ i ]と、イタレーションが切り替わるごとに所定の値だけ変化する変数a[ i ] , iとを除いた変数を抽出する。このようにして最後に抽出されて残った変数は、変数cであり、変数cは、すべてのイタレーションの間で同一値を取る変数である。このようにして、非更新変数抽出部１３cは、すべてのイタレーションで同一値を取る変数の情報を抽出する処理を行う。
【００３９】
RTL記述生成部１３ｄは、ステージ対応部１３ｂと非更新変数抽出部１３cの結果をもとに、削減できるパイプラインレジスタを特定し、C記述からRTL記述を生成する処理を行う（ステップS4）。
【００４０】
具体的には、RTL記述生成部１３ｄは、複数のステージで利用され、かつ全てのイタレーションで同一値を取る変数は変数cであるので、変数cのパイプラインレジスタを削減するために、変数cを保存するレジスタを1つだけ生成するようにRTL記述を生成する。ステップS4の中は、２つのステップS5,S6を有している。
【００４１】
ステップS4では、同一値の変数cを保存するレジスタを1つだけ生成するために、図３の右側に示すように、RTL記述生成部１３ｄは、RTL記述３２中に、所定のRTL記述部３３を追加する記述追加処理(ステップS5)を行う。さらに、RTL記述生成部１３ｄは、変数cについては、すべてのステージで同じレジスタからの読み出しとなるようにRTL記述を生成あるいは変更する生成処理（ステップS6）も行う。
【００４２】
RTL記述生成部１３ｄによって加えられる所定のRTL記述部３３は、図３に示すように、最初のイタレーション時にだけ変数cのレジスタが生成されるようにする記述を含んでいる。言い換えると、所定のRTL記述部３３は、複数のステージで利用され、かつ全てのイタレーションで同一値を取る変数cについては、最初のイタレーションのときに変数cのレジスタを１つだけ生成するためのRTL記述部である。
【００４３】
所定のRTL記述部３３は、リセット（rst）信号が入ったときに、状態を示す変数stateを所定の状態（1’b0）とし、そして、変数stateがその所定の状態（1’b0）のときに、変数cに入力データの値を代入するためのレジスタ６１（図５）を生成し、入力された変数cの値をそのレジスタに書き込むという記述である。
【００４４】
具体的には、記述追加処理(ステップS5)では、最初のイタレーションかどうか（ここでは、ステージ１の最初のステージかどうか）に応じて、変数stateの内容を変更するRTL記述部３４が加えられる。そして、記述追加処理(ステップS5)では、最初のイタレーションのときにのみ、レジスタ６１を生成し、そのレジスタ６１に入力データの値cinを変数cとして書き込むRTL記述部３５も加えられる。
【００４５】
その結果、レジスタ６１に書き込まれた変数cの値は、必要とする全てのステージで、レジスタ６１から読み出すことが可能となる。
【００４６】
そして、RTL記述生成部１３ｄは、各ステージにおいて変数cが用いられるときは、共通のレジスタ６１にストアされている値を読み出すように、変数cの部分を記述する。図３のRTL記述部３６では、矢印で示す各センテンスEでは、変数cが同じレジスタから読み出されるように記述されている。
【００４７】
すなわち、RTL記述生成部１３ｄは、RTL記述中に、always文を用いて、最初のイタレーションにおいて、共通のレジスタを作成する処理を記述したRTL記述部３３を挿入する。そして、RTL記述生成部１３ｄは、その後のイタレーションでは、変数cについてはその共通のレジスタにストアされた値を読み込むようにするだけの処理にするように、C記述部３６を生成する。
【００４８】
挿入されるRTL記述部３３は、記憶装置１４に予め記憶されたRTL記述のテンプレートを用いて、変数名等を置き換えることによって、生成することができる。例えば、図３においては、矢印で示すセンテンスF中の変数だけを、非更新変数抽出部１３cにおいて抽出された、全てのイタレーションで同一値を取る変数ｃの情報を用いて、置き換えるだけで、RTL記述部３３は生成され得る。
【００４９】
RTL記述部３６は、従来の合成方法で生成される各ステージのRTL記述部から、同一値を取る変数に関する代入文を削除し、その変数を、共通の変数に置き換えることによって、生成することができる。図３の場合、RTL記述部３６は、従来の合成方法で生成されるRTL記述部３１の各ステージの記述部から、矢印で示す変数cに関する代入文D,Gを削除し、変数cに関する変数を全て、共通の変数cに置き換えるような処理を行うことをよって、生成することができる。
【００５０】
すなわち、RTL記述生成部１３ｄは、RTL記述中に、ハードウエアにおける複数のステージで利用され、かつ同一値を取る変数については、すべてのステージで同じレジスタからの読み出しとなるようにRTL記述を生成する。その結果、生成されるハードウエア回路では、図５に示すように、変数c用のレジスタ６１は、１つだけ生成され、図４と比較すると、レジスタの数が３つ減少している。
【００５１】
以上のように、本実施の形態によれば、複数のステージで利用され、かつ全てのイタレーションで同一値を取る変数について、複製用のパイプラインレジスタを生成することがなくなるので、レジスタの数を減らすことができる。その結果、レジスタは消費電力が大きいので，レジスタの数を削減することで、設計対象の半導体装置は、物理的なサイズを小さくでき、かつ、消費電力の小さい回路を得ることができる。
【００５２】
なお、上述したステージ対応部１３ｂと非更新変数抽出部１３ｃの処理順序は、図１では、ステージ対応部１３ｂの後に非更新変数抽出部１３ｃが実行されるようになっているが、ステージ対応部１３ｂと非更新変数抽出部１３ｃとは互いに並列的に実行されて、それぞれの結果情報を、RTL記述生成部１３ｄに出力するような構成でもよい。
【００５３】
（第２の実施の形態）  
次に、第２の実施の形態を、図７から図１３を用いて説明する。  
第２の実施の形態の動作合成装置は、ループ文中において、それぞれが同一値をとる複数の変数にのみ依存して生成される変数の場合に、複製用のパイプラインレジスタを生成しないようにした点に特徴がある。
【００５４】
図７は、本実施の形態に係わる動作合成装置の構成を示すブロック図である。図７では、図１の同一の構成要素については同一の符号を付し、説明は省略する。図７に示すように、本実施の形態に係る動作合成装置１Ａは、第２の非更新変数抽出部１３ｅを有する点と、RTL記述生成部１３ｆの内容がRTL記述生成部１３ｄと異なる点が、第１の実施の形態と異なる。非更新変数抽出部１３ｅとRTL記述生成部１３ｆの処理内容については後述する。
【００５５】
図８は、本実施の形態に関わるC記述の例を示す図である。図８のC記述も、ループ処理を含むC記述である。図８のC記述のループ文では、７つの変数、具体的には、３つの配列変数a[N],b[N],z[N]と７つの変数c,d,e,f,g,x,yとが用いられている。図８に示すC記述は、配列変数a[N],b[N]と変数c,dを入力として、配列変数z[N]を出力する処理を示す。
【００５６】
ループ文を構成するfor文７１は、ループボディ部７２を含む。ループ文が、パイプライン合成の対象となるループである。ループボディ部７２の第１のセンテンス７１aは、配列変数a[N]から１つの値を読み出して、変数ｅに代入する処理が行われることを示している。第２のセンテンス７１ｂも、同様に、配列変数b[N]から１つの値を読み出して、変数fに代入する処理が行われることを示している。  
第３のセンテンス７１ｃは、変数ｃと変数ｄとを加算して、変数ｇを得る処理が行われることを示している。第４のセンテンス７１ｄは、変数ｅと変数ｇとを乗算して、変数ｘを得る処理が行われることを示している。第５のセンテンス７１ｅは、変数ｆと変数ｇとを加算して、変数ｙを得る処理が行われることを示している。第６のセンテンス７１ｆは、変数ｘと変数ｙとを乗算して、配列変数ｚ[N]を得る処理が行われることを示している。  
以上の第１から第６のセンテンスの処理は、配列変数a[N]とb[N]の変数iをそれぞれ０からＮまで、iを１ずつインクリメントしながら、iがNになるまで繰り返される。よって、このようなＣ記述から動作合成して得られたRTL記述は、第１から第６のセンテンスに基づく、並列処理を実行するハードウエア回路の構成を示す記述となる。
【００５７】
各変数の値を得るために、変数a[N],b[N],c,d,e,f,g,x,yは、それぞれ、各センテンスにおいて代入あるいは演算のために用いられている。特に、図８において、変数cとｄは、第３のセンテンスにおいて、他の変数を求めるために利用されている。
【００５８】
従来の動作合成処理によれば、図８のC記述を動作合成すると、図９のRTL記述８１が生成される。図９は、従来の動作合成処理により得られるRTL記述の例を示す図である。図１０は、従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。
【００５９】
図９のRTL記述８１は、図８のC記述から生成される。本実施の形態は、ハードウエア回路のステージとC記述のセンテンスとが、一対一に対応していない例である。RTL記述８１の場合、それぞれ同一値をとる変数cとｄとを加算して生成された変数ｇの値が、更新されずに同一であるにも拘わらず、変数ｇの値をC記述の第４及び第５のセンテンスに対応する各ステージにおいて利用されるようにするために、変数ｇ用のパイプラインレジスタが生成される。図９では、変数ｇのために、矢印で示すように１つの代入文D1が記述されており、その図９のRTL記述８１によれば、図１０に示すようなハードウエア回路が生成される。
【００６０】
図１０の回路は、ステージ１から５を有する。ステージ１は、変数c,dの値と配列変数a[i], b[i]の値とを、それぞれレジスタ９１，９２，９３，９４にストアする処理を行う入力処理のステージである。このステージ１は、第１及び第２のセンテンス７１ａと７１ｂに対応する。ステージ２は、変数cとdの値をストアしているレジスタ９１と９２のそれぞれの値を、加算器９５により加算する処理を行うステージである。このステージ２は、第３のセンテンス７１ｃに対応する。ステージ３は、変数ｅと変数ｇの値を、乗算器９９により乗算する処理を行うステージである。このステージ３は、第４のセンテンス７１ｄに対応する。ステージ４は、変数ｆとｇの値を、加算器１０３により加算する処理を行うステージである。このステージ４は、第５のセンテンス７１ｅに対応する。そして、ステージ５は、変数ｘと変数ｙを、乗算器１０６により乗算する処理を行うステージである。このステージ５は、第６のセンテンス７１ｆに対応する。
【００６１】
ステージ２では、レジスタ９１と９２にそれぞれストアされた２つの値を乗算してその結果の値は、変数ｇのレジスタ９６にストアされる。ステージ３では、レジスタ９３の値が転送されてストアされた変数ｅのレジスタ９７と、レジスタ９６の値を乗算してその結果は変数ｘのレジスタ１０１にストアされる。ステージ４では、レジスタ９６の値が転送されてストアされた変数ｇのレジスタ１００と、レジスタ９４の値がレジスタ９８を介して転送されてストアされた変数ｆのレジスタ１０２とにストアされた２つの値を加算してその結果は変数ｙのレジスタ１０５にストアされる。ステージ５では、レジスタ１０１の値が転送されてストアされた変数ｘのレジスタ１０４の値と、変数ｙのレジスタ１０５の値を乗算してその結果は配列変数z[i]の値として出力される。
【００６２】
特に、ステージ３では、ステージ４で変数ｇを利用するためにパイプラインレジスタであるレジスタ１００が設けられている。変数ｇの値は更新されずに同一値であるにも拘わらず、従来のようにＣ記述をそのまま動作合成処理すると、単に値をコピーして保持するためのレジスタ１００が生成されてしまう。
【００６３】
そこで、本実施の形態に係る動作合成装置１Ａは、C記述を解析して複数のイタレーションにおける変数の変化を検出して、図１１に示すようなRTL記述が得られるように、後述するような処理を行う。本実施の形態の動作合成装置１Ａによれば、図８のＣ記述を動作合成すると、図１１のRTL記述８２が生成される。図１１は、本実施の形態に係る動作合成装置により生成されたRTL記述の例を示す図である。
【００６４】
図１１のRTL記述８２では、図９のRTL記述８１における、変数ｇのための、矢印で示すように代入文Ｄ1は無い。図１１のRTL記述８２を生成する処理については、後述する。図１１のRTL記述８２によれば、図１２に示すようなハードウエア回路が生成される。
【００６５】
図１２は、本実施の形態の動作合成装置１Ａにより生成されるハードウエア回路の構成を説明するための模式図である。図１２では、図１０と同じ構成要素については、同じ符号を付す。
【００６６】
図１２に示すように、本実施の形態の動作合成装置１Ａにより生成されるハードウエア回路では、変数ｇ用のレジスタ１１１は、１つだけ生成され、図１０と比較すると、レジスタの数が１つ減少している。
【００６７】
次に、以上のような構成にかかる動作合成装置１Ａの処理の流れの例を説明する。図１３は、本実施の形態に係わる動作合成装置１Ａの処理の流れの例を示すフローチャートである。
【００６８】
ユーザの作成したC記述、ここでは、図８のループ文を含むC記述は、動作合成装置１Ａの記憶装置１４の記憶領域部１４ａに記憶されている。ユーザは、動作合成装置１に対して、記憶領域部１４ａに記憶されたC記述を指定し、そのC記述からRTL記述を生成する動作合成処理を行うように、動作合成装置１Ａに指示を入力する。動作合成装置１Ａは、その指示に応じて、指定されたC記述の動作合成を行うべく、図１３の処理を実行する。なお、図６における処理と同じ処理については、同じ符号を付す。
【００６９】
まず、動作合成装置１のC記述読込部１３ａは、指定されたＣ記述を、データ処理装置１３のメモリ（図示せず）上に読み込む（ステップS1）。
【００７０】
次に、ステージ対応部１３ｂは、C記述に対してスケジューリングを行い、各センテンスを、各パイプラインステージに対応させる処理が行われる（ステップS2）。この結果、パイプラインステージと各センテンスの変数との対応付けの情報、すなわち対応関係の情報が得られる。
【００７１】
ステージ対応部１３ｂは、ループボディ部７２中に、複数のステージで利用される変数の情報の抽出を行う。図８の場合、ループ文の１イタレーションの間に在る変数は、変数a[i], b[i], c, d, e, f, g, x, y, z[i], iである。ステージ対応部１３ｂは、C記述と、スケジューリングにより得られたパイプライン回路のステージの情報とを対応させ、これらの変数の中から、複数のステージにおいて利用される変数を抽出する。図８の場合、複数のステージにおいて利用される変数は、変数e, f, g, x, y, iである。
【００７２】
続いて、非更新変数抽出部１３ｃにより、ループ文中の変数をリストアップし，C記述中のセンテンス毎に変数の利用状況、更新状況をチェックし、イタレーション間での変数の値を比較し、全てのイタレーションにおいて更新のない変数を抽出する処理が行われる（ステップS3）。
【００７３】
非更新変数抽出部１３ｃは、ループ文中での変数の利用等をチェックし、すべてのイタレーション間での変数の値を比較する比較処理部である。図８の場合、非更新変数抽出部１３cは、ループ文の１イタレーション中の変数a[i], b[i], c, d, e, f, g, x, y, z[i], iをまず抽出してリストアップする。そして、非更新変数抽出部１３ｃは、その変数a[i], b[i], c, d, e, f, g, x, y, z[i], iの中から、代入操作により１イタレーションの間に更新される変数e, f, g, x, y, z[ i ]と、イタレーションが切り替わるごとに所定の値だけ変化する変数a[ i ] , b[i] , z[i], iとを除いた変数を抽出する。このようにして最後に抽出されて残った変数は、変数c, dであり、変数cは、すべてのイタレーションの間で同一値を取る変数である。このようにして、非更新変数抽出部１３cは、すべてのイタレーションで同一値を取る変数の情報を抽出する処理を行う。
【００７４】
さらに、ループ変数比較部としての非更新変数抽出部１３ｅは、非更新変数抽出部１３ｃにおいて抽出された同一値をとる変数のみから求まる変数であって、複数のステージで利用されるものを抽出する処理を行う（ステップS11）。非更新変数抽出部１３ｅは、１イタレーションの中で、同一値をとる変数のみに依存して更新され、複数のステージで利用される処理を、ループ文の中のセンテンスの代入式の左右の変数を比較する比較処理により特定し、同一値をとる変数のみから求まる変数であって、複数のステージで利用されるものを抽出する。図８の場合、変数ｇは、非更新変数抽出部１３cにおいて抽出された、すべてのイタレーションで同一値を取る変数c, dのみから求まる変数であり、かつ複数のステージで利用される。ここでは、変数ｇは、変数ｃとｄの加算により得られる変数であるので、変数ｇもすべてのイタレーションの中では定数となる。なお、同一値をとる変数のみから求まる変数としては、図８の場合には示されていないが、他にも、変数ｃのみから求まる変数、及び変数ｄのみから求まる変数がある。
【００７５】
RTL記述生成部１３ｆは、ステージ対応部１３ｂと非更新変数抽出部１３ｅの結果をもとに、削減できるパイプラインレジスタを特定し、C記述からRTL記述を生成する処理を行う（ステップS12）。
【００７６】
具体的には、RTL記述生成部１３ｆは、同一値を取る変数c, dのみから求まる変数は変数ｇであるので、変数ｇのパイプラインレジスタを削減するために、変数ｇを保存するレジスタを1つだけ生成するようにRTL記述を生成する。
【００７７】
ステップS12では、変数ｇを保存するレジスタを1つだけ生成するために、図１１に示すように、RTL記述生成部１３ｆは、RTL記述８２中に、所定のRTL記述部８３を追加する記述追加処理（ステップS13）を行う。さらに、その所定のRTL記述生成部１３ｆは、変数ｇについては、他のステージで同じレジスタからの読み出しとなるようにRTL記述を生成あるいは変更する生成処理（ステップS14）も行う。
【００７８】
RTL記述生成部１３ｆによって加えられる所定のRTL記述部８３は、図１１に示すように、最初のイタレーションであって、かつ変数ｇを生成するステージの時に、変数ｇのレジスタが生成されるようにするRTL記述を含んでいる。よって、所定のRTL記述部８３は、複数のステージで利用され、かつ同一値を取る変数c, dのみから求まる変数ｇについては、最初のイタレーションであって、かつ変数ｇを生成するステージの時に変数ｇのレジスタを１つだけ生成するためのRTL記述部である。ここでは、変数ｇは、ステージ２のときに更新すなわち生成されるので、RTL記述部８３は、最初のイタレーションのステージ２のときに、レジスタを生成している。
【００７９】
所定のRTL記述部８３は、リセット（rst）信号が入ったときに、状態を示す変数stateを所定の状態（2’b00）とし、そして、変数stateが２ステージ目の状態を示す所定の状態（2’b01）を検出できるようにし、最初のイタレーションのステージ２のタイミングでレジスタ１１１（図１２）を生成し、変数ｇの値をそのレジスタに書き込むという記述である。
【００８０】
具体的には、記述追加処理(ステップS13)では、最初のイタレーションであって、変数ｇを生成するステージ（ここでは、ステージ２）になったときに、変数stateの内容を変更するというRTL記述部８４が加えられる。そして、記述追加処理(ステップS13)では、最初のイタレーションのステージ２のときに、変数ｇのレジスタ１１１を生成し、そのレジスタ１１１に、変数ｇとして書き込むというRTL記述部８５も加えられる。
【００８１】
その結果、レジスタ１１１に書き込まれた変数ｇの値は、必要とする全てのステージで、レジスタ１１１から読み出すことが可能となる。
【００８２】
そして、RTL記述生成部１３ｆは、各ステージにおいて変数ｇが用いられるときは、共通のレジスタ１１１にストアされている値を読み出すように、変数ｇの部分を記述する。図１１のRTL記述部８６では、矢印で示す各センテンスE1では、変数ｇが同じレジスタから読み出されるように記述されている。
【００８３】
すなわち、RTL記述生成部１３ｆは、RTL記述中に、always文を用いて、最初のイタレーションの変数ｇを生成するステージの時に、共通のレジスタを作成する処理を記述したRTL記述部８３を挿入する。そして、RTL記述生成部１３ｆは、その後のイタレーションでは、変数ｇについてはその共通のレジスタにストアされた値を読み込むようにするだけの処理にするように、C記述部８６を生成する。
【００８４】
挿入されるRTL記述部８３も、第１の実施の形態のRTL記述部３３と同様に、記憶装置１４に予め記憶された、ステージ数に応じたRTL記述のテンプレートを用いて、変数名等を置き換えることによって、生成することができる。例えば、図１１においては、矢印で示すセンテンスF1中の変数だけを、非更新変数抽出部１３cにおいて抽出された、同一値を取る変数c, dのみから求まる変数ｇの情報を用いて、置き換えるだけで、RTL記述部８３は生成され得る。
【００８５】
RTL記述部８６は、従来の合成方法で生成される各ステージのRTL記述部から、同一値を取る変数に関する代入文を削除し、その変数を、共通の変数に置き換えることによって、生成することができる。図１１の場合、RTL記述部８６は、従来の合成方法で生成されるRTL記述部８１の各ステージの記述部から、矢印で示す変数ｇに関する代入文D1を削除し、矢印で示す代入文D2における変数gに関する変数を全て、共通の変数gに置き換えるような処理を行うことをよって、生成することができる。
【００８６】
すなわち、RTL記述生成部１３ｆは、RTL記述中に、ハードウエアにおける複数のステージで利用され、かつ同一値を取る変数のみから求まる変数については、すべてのステージで同じレジスタからの読み出しとなるようにRTL記述を生成する。その結果、生成されるハードウエア回路では、図１２に示すように、変数ｇ用のレジスタ１１１は、１つだけ生成され、図１０と比較すると、レジスタの数が１つ減少している。
【００８７】
以上のように、本実施の形態によれば、ハードウエアにおける複数のステージで利用され、かつ同一値を取る変数のみから求まる変数について、複製用のパイプラインレジスタを生成することがなくなるので、レジスタの数を減らすことができる。その結果、レジスタは消費電力が大きいので，レジスタの数を削減することで、設計対象の半導体装置は、物理的なサイズを小さくでき、かつ、消費電力の小さい回路を得ることができる。
【００８８】
なお、応用例として、動作合成装置は、第１の実施の形態の処理と第２の実施の形態の処理の両方の処理を組み合わせた装置であってもよい。図１４は、その両方の処理部を有する動作合成装置１Bの構成を示すブロック図である。図１４では、図１及び図７の同一の構成要素については同一の符号を付している。
【００８９】
第１の実施の形態で生成されるレジスタと、第２の実施の形態で生成されるレジスタは異なるので、第１の実施の形態と第２の実施の形態の２つの処理を併せて行うようにすることによって、第１と第２の実施の形態のそれぞれの効果を生じさせることができる。
【００９０】
その場合、図１４に示すように、本実施の形態に係る動作合成装置１BのRTL記述部１３ｇは、非更新変数抽出部１３ｃにおいて得られた、同一値を取る変数についてすべてのステージで同じレジスタからの読み出しとなるようにRTL記述を生成する処理（ステップS4）と、第２の非更新変数抽出部１３ｅにおいて得られた、同一値を取る変数のみから求まる変数について複製用のパイプラインレジスタを生成しないようにRTL記述を生成する処理（ステップS12の処理）の両方の処理を行う。このような構成にすることにより、動作合成装置１Bは、本実施の形態の上述した効果に加えて、第１の実施の形態の効果を生じさせる。
【００９１】
なお、上述したステージ対応部１３ｂと、非更新変数抽出部１３ｃ，１３ｅの処理順序は、図７では、ステージ対応部１３ｂの後に非更新変数抽出部１３ｃ，１３ｅが実行されるようになっているが、ステージ対応部１３ｂと非更新変数抽出部１３ｃ，１３ｅとは互いに並列的に実行されて、それぞれの結果情報を、RTL記述生成部１３ｆに出力するような構成でもよい。図１４においても、同様である。
【００９２】
（第３の実施の形態）  
次に、第３の実施の形態を、図１５から図２０を用いて説明する。  
第３の実施の形態の動作合成装置は、ループ文中において、全てのイタレーションにおいて同一値をとるのではなく、所定回数のイタレーション毎に同一値をとる変数にのみ依存して生成される変数の場合に、複製用のパイプラインレジスタを生成しないようにした点に特徴がある。
【００９３】
図１５は、本実施の形態に係わる動作合成装置の構成を示すブロック図である。図１５では、図１の同一の構成要素については同一の符号を付し、説明は省略する。図１５に示すように、本実施の形態に係る動作合成装置１Ｃは、繰り返し変数抽出部１３ｈを有する点と、RTL記述生成部１３ｉの内容が、RTL記述生成部１３ｄとは異なる点が、第１の実施の形態と異なる。繰り返し変数抽出部１３ｈとRTL記述生成部１３ｉの処理内容については後述する。
【００９４】
図１６は、本実施の形態に関わるC記述の例を説明するための図である。図１６のＣ記述も、ループ処理を含むC記述である。動作合成処理により、図１６のループ文の部分に対応して、パイプライン動作の回路が作成される。図１６のC記述のループ文では、７つの変数、具体的には、４つの配列変数a[N],b[N],c[2],y[N]と６つの変数d,e,f,g,h,x,とが用いられている。図１６に示すC記述は、配列変数a[N],b[N],c[2]と変数dを入力として、配列変数y[N]を出力する処理を示す。
【００９５】
図１６のC記述は、第１及び第２の実施の形態に係る装置に適用しても、複数のステージで利用され、かつすべてのイタレーションで同一値を取る変数は存在しないが、上述したように、本実施の形態に係る装置に適用すると、所定のイタレーション間隔では同一値をとる変数についての不必要なパイプラインレジスタの生成をしないようにすることができる。
【００９６】
ループ文を構成するfor文１２１は、ループボディ部１２２を含む。ループ文が、パイプライン合成の対象となるループである。ループボディ部１２２の第１のセンテンス１２１aは、配列変数a[N]から１つの値を読み出して、変数ｄに代入する処理が行われることを示している。第２のセンテンス１２１ｂは、配列変数b[N]から１つの値を読み出して、変数eに代入する処理が行われることを示している。第３のセンテンス１２１ｃは、配列変数c[N]から１つの値を読み出して、変数ｆに代入する処理が行われることを示している。
【００９７】
第４のセンテンス１２１ｄは、変数ｄと変数ｆとを乗算して、変数ｇを得る処理が行われることを示している。第５のセンテンス１２１ｅは、変数ｅと変数ｆとを乗算して、変数ｈを得る処理が行われることを示している。第６のセンテンス１２１ｆは、変数ｇと変数ｈとを加算して、変数ｘを得る処理が行われることを示している。第７のセンテンス１２１ｇは、変数ｘと変数fとを加算して、配列変数y[N]を得る処理が行われることを示している。  
以上の第１から第７のセンテンスの処理は、配列変数a[N],b[N]の変数iを０からＮまで、iを１ずつインクリメントしながら、iがNになるまで繰り返される。
【００９８】
特に、第３のセンテンスの処理では、配列変数c[２]は、演算（ｉ％２）の値によって２つの値を取り得る。すなわち、整数である変数ｉが０からＮまで変化するが、その変数ｉを２で除算して、その余り（０又は１）の値が、配列変数c[２]の値となる。よって、配列変数c[２]は、変数ｉが０からＮまで変化するときに、０と１の値を所定の間隔で、ここでは交互に繰り返すものとなる。
【００９９】
その結果、変数ｆは、その０と１のいずれかの値となるので、変数ｆを用いた処理を行う第４，第５及び第７のセンテンス１２１ｄ，１２１ｅ、１２１ｇでは、所定の間隔で変化する変数ｆが用いられる。
【０１００】
このようなＣ記述から動作合成して得られたRTL記述は、第１から第７のセンテンスに対応した並列処理を実行するハードウエア回路の構成を示す記述となる。
【０１０１】
従来の動作合成処理によれば、図１６のＣ記述を動作合成すると、図１７の左側のRTL記述１３１が生成される。図１７は、動作合成処理により得られるRTL記述の例を示す図である。
【０１０２】
図１７の左側のRTL記述１３１は、図１６のC記述から生成される。本実施の形態では、ハードウエア回路のステージとC記述のセンテンスとが、一対一に対応していない。RTL記述１３１の場合、変数ｆが、C記述の第４、第５及び第７のセンテンスに対応する各ステージにおいて利用されるようにするために、対応するステージにおいて、変数ｆ用のパイプラインレジスタが生成されるようにRTL記述１３１が生成される。図１７では、変数ｆのために、矢印D2で示すように２つの代入文が記述されており、その図１７のRTL記述１３１によれば、図１８に示すようなハードウエア回路が生成される。
【０１０３】
図１８は、従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。  
図１８の回路は、ステージ１から５を有する。ステージ１は、配列変数a[i], b[i], c[i%2]の値を、それぞれレジスタ１４１、１４２、１４３にストアする処理を行う入力処理のステージである。このステージ１は、第１から第３のセンテンス１２１ａから１２１ｃに対応する。ステージ２は、配列変数a[i]の値をストアしているレジスタ１４１の値と、配列変数c[i%2]の値をストアしているレジスタ１４３の値とを、乗算器１４４により乗算する処理を行うステージである。このステージ２は、第４のセンテンス１２１ｄに対応する。ステージ３は、変数eとfの値を、乗算器１４８により乗算する処理を行うステージである。このステージ３は、第５のセンテンス１２１ｅに対応する。ステージ４は、変数gとhの値を、加算器１５２により加算する処理を行うステージである。このステージ４は、第６のセンテンス１２１ｆに対応する。そして、ステージ５は、変数xの値と変数fを、加算器１５５により乗算する処理を行うステージである。このステージ５は、第７のセンテンス１２１ｇに対応する。
【０１０４】
ステージ２では、レジスタ１４１と１４２にそれぞれストアされた２つの値を乗算してその結果は変数ｇのレジスタ１４５にストアされる。ステージ３では、レジスタ１４３の値が転送されてストアされた変数ｆのレジスタ１４７と、レジスタ１４２の値が転送されてストアされた変数ｅのレジスタ１４６とにストアされた２つの値を乗算してその結果は変数ｈのレジスタ１５０にストアされる。ステージ４では、レジスタ１４５の値が転送されてストアされた変数ｇのレジスタ１４９と、レジスタ１５０とにストアされた２つの値を加算してその結果は変数ｘのレジスタ１５３にストアされる。ステージ５では、レジスタ１５１の値が転送されてストアされた変数ｆのレジスタ１５４と、レジスタ１５３にストアされた２つの値を加算してその結果は配列変数z[i]の値として出力される。
【０１０５】
特に、レジスタ１４３、１４７、１５１，１５４には、配列変数c[i%2]に対応する変数ｆの値が順次入力されるが、配列変数c[i%2]は、上述したように、ステージが切り替わる毎に、すなわち１ステージ毎に０と１を交互に繰り返す。よって、変数ｆも、０と１を交互に繰り返す。その結果、図１７の左側のＣ記述１３１の場合は、変数ｆは所定の間隔毎に（ここでは１ステージ毎に）同一値であるにも拘わらず、ステージ１から５の間に存在する変数ｆのために４つのパイプラインレジスタが、図１８に示すように生成されてしまう。ある瞬間においては、レジスタ１４３と１５１は、同一値であり、レジスタ１４７と１５４も、レジスタ１４３と１５１の値とは異なる１又は０の値をとる。
【０１０６】
そこで、本実施の形態に係る動作合成装置１Cは、C記述を解析して複数のイタレーションにおける変数の変化を検出して、図１７の右側に示すようなRTL記述が得られるように、後述するような処理を行う。本実施の形態の動作合成装置１Ｃによれば、図１６のＣ記述を動作合成すると、図１７の右側のRTL記述１３２が生成される。
【０１０７】
図１７の右側のRTL記述１３２では、左側のRTL記述１３１における、変数ｆのために、矢印で示すように２つの代入文Ｄ２は無い。図１７の右側のRTL記述１３２を生成する処理については、後述する。図１７のRTL記述１３２によれば、図１９に示すようなハードウエア回路が生成される。
【０１０８】
図１９は、本実施の形態の動作合成装置１Ｃにより生成されるハードウエア回路の構成を説明するための模式図である。図１９では、図１８と同じ構成要素については、同じ符号を付す。
【０１０９】
図１９に示すように、本実施の形態の動作合成装置１Ｃにより生成されるハードウエア回路では、２つの変数ｆ用のレジスタ１４３，１４７が生成され、図１８と比較すると、レジスタの数が２つ減少している。
【０１１０】
次に、以上のような構成にかかる動作合成装置１Ｃの処理の流れの例を説明する。図２０は、本実施の形態に係わる動作合成装置１Ｃの処理の流れの例を示すフローチャートである。
【０１１１】
ユーザの作成したC記述、ここでは、図１６のループ文を含むC記述は、動作合成装置１Ｃの記憶装置１４の記憶領域部１４ａに記憶されている。ユーザは、動作合成装置１Ｃに対して、記憶領域部１４ａに記憶されたC記述を指定し、そのC記述からRTL記述を生成する動作合成処理を行うように、動作合成装置１Ｃに指示を入力する。動作合成装置１Ｃは、その指示に応じて、指定されたC記述の動作合成を行うべく、図２０の処理を実行する。なお、図６における処理と同じ処理については、同じ符号を付す。
【０１１２】
まず、動作合成装置１ＣのC記述読込部１３ａは、指定されたＣ記述を、データ処理装置１３のメモリ（図示せず）上に読み込む（ステップS1）。
【０１１３】
次に、ステージ対応部１３ｂは、C記述に対してスケジューリングを行い、各センテンスを、各パイプラインステージに対応させる処理が行われる（ステップS2）。この結果、パイプラインステージと各センテンスの変数との対応付けの情報、すなわち対応関係の情報が得られる。
【０１１４】
ステージ対応部１３ｂは、まず、ループボディ部２２中に、複数のステージで利用される変数の情報の抽出を行う。図１６の場合、ループ文の１イタレーションの間にある変数は、変数a[i], b[i], c[i%2], d, e, f, g, h, x, y[i], iである。そして、ステージ対応部１３ｂは、C記述と、スケジューリングにより得られたパイプライン回路のステージの情報とを対応させ、これらの変数の中から、複数のステージにおいて利用される変数を抽出する。図１６の場合、複数のステージにおいて利用される変数は、変数d, e, f, g, h, x, iである。すべてのイタレーションで同一値となる変数はない。
【０１１５】
続いて、繰り返し変数抽出部１３ｈにより、所定間隔毎に値が繰り返される変数を抽出する処理が行われる（ステップS21）。具体的には、繰り返し変数抽出部１３ｈは、C記述に対してテキスト解析を行い、センテンス１２１ａから１２１ｇについて、代入式「＝」の右側に存在する変数が、所定の形式の記述に該当するか否かを判断することにより、所定間隔毎に値が繰り返される変数を抽出する。
【０１１６】
図１６の場合、繰り返し変数抽出部１３ｈは、第３のセンテンスに、値が繰り返すものとなる変数の記述、ここでは、”i%2”のような割り算の余りを用いるような表現として、c[i%2]を検出することができる。そして、そのような変数（ここでは、変数c[i%2]）のみから生成される変数であって、複数のステージで利用される変数として、変数ｆが抽出される。従って、”i%2”のような表現情報は、記憶装置１４に予め記憶されており、繰り返し変数抽出部１３ｈは、その表現情報を利用して、各センテンス中のテキストから、値が繰り返すものとなる変数を抽出することができる。
【０１１７】
RTL記述生成部１３ｉは、ステージ対応部１３ｂと繰り返し変数抽出部１３ｈの結果をもとに、削減できるパイプラインレジスタを特定し、C記述からRTLを生成する処理を行う（ステップS22）。
【０１１８】
具体的には、RTL記述生成部１３ｉは、複数のステージで利用され、かつ所定間隔で（ここでは１ステージおきに）、その値が繰り返される変数は変数ｆであるので、変数ｆのパイプラインレジスタを削減するために、変数ｆを保存するレジスタを、所定の数だけ生成するようにRTL記述を生成する。ステップS22の中は、２つのステップS23,S24を有している。
【０１１９】
ステップS22では、所定の間隔で値が繰り返される変数ｆを保存するレジスタを、必要な数だけ生成するために、その数を決定するレジスタ数決定処理 (ステップS23)を行う。さらに、RTL記述生成部１３ｉは、変数ｆについては、不必要なレジスタが生成されずに、同一値の別のレジスタからの読み出しとなるようにRTL記述を生成あるいは変更する生成処理（ステップS24）も行う。
【０１２０】
具体的には、レジスタ数決定処理 (ステップS23)では、変数ｆが、いくつのイタレーション毎に同一値をとるかに応じて、必要なレジスタ数が決定される。まず、図１６の場合、変数c[i%2]の記述から、変数c[i%2]は、２イタレーション毎に同一値をとることがわかり、変数c[i%2]のみで更新される変数ｆも、２イタレーション毎に同一値をとることがわかる。また、イタレーションの間隔（あるいはイタレーション数）と、そのイタレーション間隔に対応して必要なレジスタ数との対応関係をテーブルデータとして記憶装置１４に予め記憶させておく。そして、RTL記述生成部１３ｉは、変数c[i%2]の記述から決定されたイタレーションの間隔に基づいて、そのテーブルデータを参照することによって、必要なレジスタ数を決定する。
【０１２１】
図１６の場合、変数ｆの値をストアするレジスタの値は、２ステージ毎（言い換えると、１ステージおき）に同一値である。図１８の場合は、一点鎖線の矢印ＪとＫで示す、それぞれ２つのレジスタは、同一値である。
【０１２２】
そこで、RTL記述生成部１３ｉは、繰り返される所定間隔に応じて必要な数のレジスタを生成するように、変数ｆの部分が記述されたRTL記述を生成する（ステップS24）。図１７のRTL記述部１３３では、矢印で示す２つセンテンスD3のみが記述され、RTL記述部１３３は、RTL記述部１３１の矢印で示す２つのレジスタを生成する記述D2は含まれていない。
【０１２３】
図１７の右側のRTL記述１３３によれば、２ステージ毎に変数fを保存するパイプラインレジスタの値は同一であるので、２個のレジスタが生成される。そして、１ステージ目では、変数ｆの値は図１９のレジスタ１４３に書き込まれ、２ステージ目ではレジスタ１４７に書き込まれる。３ステージ目以降のレジスタは削除するようにRTL記述は、生成されるが、３ステージ目のパイプラインレジスタの代わりに、１ステージ目で書き込まれたレジスタ１４３から、変数ｆの値は読み出される。４ステージ目のレジスタの代わりに、２ステージ目で書き込まれたレジスタ１４７から、変数ｆの値は、読み出される。従って、２ステージ毎に交互に読み出すように、読み出しレジスタの構成が決定される。
【０１２４】
すなわち、RTL記述生成部１３ｉは、RTL記述中に、always文を用いて、必要な数のレジスタを作成する処理を記述し、その後のイタレーションでは、変数ｆについてはその作成されたレジスタにストアされた値を読み込むようにするだけの処理にするように、C記述部１３３を生成する。
【０１２５】
生成されるRTL記述部１３３も、第１の実施の形態のRTL記述部３６と同様に、従来の合成方法で生成される各ステージのRTL記述部から、必要な数のレジスタを生成する記述はそのまま利用して生成される。そして、その後のイタレーションでは、変数ｆについてはその作成されたレジスタにストアされた値を読み込むように、不必要なレジスタ生成のための記述を削除し、その変数を、共通の変数に置き換えることによって、生成され得る。図１７の場合、RTL記述部１３２は、従来の合成方法で生成されるRTL記述部１３１の、矢印で示す変数ｆに関する代入文D2を削除し、変数ｆに関する変数ｆ３を、矢印E2で示す共通の変数ｆ1に置き換えるような処理を行うことをよって、生成され得る。
【０１２６】
すなわち、RTL記述生成部１３ｉは、RTL記述中に、ハードウエアにおける複数のステージで利用され、かつ所定間隔で同一値をとる変数については、必要なレジスタを生成しないようにRTL記述を生成する。その結果、生成されるハードウエア回路では、図１９に示すように、変数ｆ用のレジスタ１４３，１４７だけが生成され、図１８と比較すると、レジスタの数が２つ減少している。
【０１２７】
以上のように、本実施の形態によれば、複数のステージで利用され、かつ所定間隔で同一値をとる変数について、複製用のパイプラインレジスタを生成することがなくなるので、レジスタの数を減らすことができる。その結果、レジスタは消費電力が大きいので，レジスタの数を削減することで、設計対象の半導体装置は、物理的なサイズを小さくでき、かつ、消費電力の小さい回路を得ることができる。
【０１２８】
なお、上述したステージ対応部１３ｂと繰り返し変数抽出部１３ｈの処理順序は、図１５では、ステージ対応部１３ｂの後に繰り返し変数抽出部１３ｈが実行されるようになっているが、ステージ対応部１３ｂと繰り返し変数抽出部１３ｈとは互いに並列的に実行されて、それぞれの結果情報を、RTL記述生成部１３ｉに出力するような構成でもよい。
【０１２９】
なお、応用例として、動作合成装置は、第１、第２及び第３の実施の形態の処理の３つの処理を組み合わせた装置であってもよい。図２１は、その３つの処理部を有する動作合成装置１Ｄの構成を示すブロック図である。図２１では、図１４の同一の構成要素については同一の符号を付している。
【０１３０】
その場合、図２１に示すように、本実施の形態に係る動作合成装置１BのRTL記述部１３ｇは、非更新変数抽出部１３ｃにおいて得られた、同一値を取る変数についてすべてのステージで同じレジスタからの読み出しとなるようにRTL記述を生成する処理（ステップS4）と、第２の非更新変数抽出部１３ｅにおいて得られた、同一値を取る変数のみから求まる変数について複製用のパイプラインレジスタを生成しないようにRTL記述を生成する処理（ステップS12の処理）と、繰り返し変数抽出部１３ｈにおいて得られた所定間隔で同一値をとる変数について不必要なレジスタを生成しないようにRTL記述を生成する処理（ステップS22）の３つの処理を行う。このような構成にすることにより、動作合成装置１Dは、本実施の形態の上述した効果に加えて、第１及び第２の実施の形態の効果を生じさせることができる。
【０１３１】
なお、図２１の場合、ステージ対応部１３ｂと繰り返し変数抽出部１３ｈとは互いに並列的に実行されて、それぞれの結果情報を、RTL記述生成部１３ｉに出力するような構成でもよい。
【０１３２】
また、上述した３つの実施の形態では、クロックの１サイクルでステージが移行するため、レジスタ等へのデータの入力処理部と、乗算器、加算器等の各演算部が、それぞれ１つのステージを構成しているが、複数サイクルに基づいてステージが移行する場合は、入力処理部と各演算部だけでなく、入力データ用のレジスタ、演算結果用等のレジスタも含めて１つのステージが構成される。
【０１３３】
なお、以上説明した各部の動作を実行するプログラムは、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ等の可搬媒体や、ハードディスク等の記憶装置等に、その全体あるいは一部が記録され、あるいは記憶されている。そのプログラムがコンピュータにより読み取られて、動作の全部あるいは一部が実行される。あるいは、そのプログラムの全体あるいは一部を通信ネットワークを介して流通または提供することができる。利用者は、通信ネットワークを介してそのプログラムをダウンロードしてコンピュータにインストールしたり、あるいは記録媒体からコンピュータにインストールすることで、容易に本発明の動作合成装置を実現することができる。
【０１３４】
以上説明したように、上述した３つの実施の形態に係る動作合成装置によれば、高位合成におけるパイプライン合成において、複数のイタレーションで共通の値となる変数に対するパイプラインレジスタの数を削減することができる。その結果、不要なレジスタを削減することにより半導体装置の面積を小さくすることができる。さらに、レジスタは消費電力が大きいので、レジスタの数を削減することで消費電力の小さい半導体装置を得ることができる。
【０１３５】
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【０１３６】
【図１】本発明の第１の実施の形態に係わる動作合成装置の構成を示すブロック図である。
【図２】ループ処理を含むC記述の例を示す図である。
【図３】動作合成処理により得られるRTL記述の例を示す図である。
【図４】従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。
【図５】第１の実施の形態の動作合成装置により生成されるハードウエア回路の構成を説明するための模式図である。
【図６】第１の実施の形態に係わる動作合成装置の処理の流れの例を示すフローチャートである。
【図７】本発明の第２の実施の形態に係わる動作合成装置の構成を示すブロック図である。
【図８】C記述の例を示す図である。
【図９】従来の動作合成処理により得られるRTL記述の例を示す図である。
【図１０】従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。
【図１１】第２の実施の形態に係る動作合成装置により生成されたRTL記述の例を示す図である。
【図１２】第２の実施の形態の動作合成装置により生成されるハードウエア回路の構成を説明するための模式図である。
【図１３】第２の実施の形態に係わる動作合成装置の処理の流れの例を示すフローチャートである。
【図１４】第１の実施の形態の処理と第２の実施の形態の処理の両方の処理部を有する動作合成装置の構成を示すブロック図である。
【図１５】本発明の第３の実施の形態に係わる動作合成装置の構成を示すブロック図である。
【図１６】C記述の例を説明するための図である。
【図１７】動作合成処理により得られるRTL記述の例を示す図である。
【図１８】従来の動作合成により生成されるハードウエア回路の構成を説明するための模式図である。
【図１９】第３の実施の形態の動作合成装置により生成されるハードウエア回路の構成を説明するための模式図である。
【図２０】第３の実施の形態に係わる動作合成装置の処理の流れの例を示すフローチャートである。
【図２１】第１、第２及び第３の実施の形態の３つの処理部を有する動作合成装置の構成を示すブロック図である。
【符号の説明】
【０１３７】
１、１A、１B、１C、１D  動作合成回路、１３  データ処理装置、１４  記憶装置
【図１】
2007323606.tif 000003
【図２】
2007323606.tif 000004
【図３】
2007323606.tif 000005
【図４】
2007323606.tif 000006
【図５】
2007323606.tif 000007
【図６】
2007323606.tif 000008
【図７】
2007323606.tif 000009
【図８】
2007323606.tif 000010
【図９】
2007323606.tif 000011
【図１０】
2007323606.tif 000012
【図１１】
2007323606.tif 000013
【図１２】
2007323606.tif 000014
【図１３】
2007323606.tif 000015
【図１４】
2007323606.tif 000016
【図１５】
2007323606.tif 000017
【図１６】
2007323606.tif 000018
【図１７】
2007323606.tif 000019
【図１８】
2007323606.tif 000020
【図１９】
2007323606.tif 000021
【図２０】
2007323606.tif 000022
【図２１】
2007323606.tif 000023