(57)【要約】コンパイラは、クロック境界及びレジスタ代入文によりステートメントレベルでの並列動作の記述をサイクル精度で記述可能な擬似Ｃ記述（１）を入力とし、レジスタ代入文の識別を行い（Ｓ２）、実行可能なＣ記述（３）を生成すると共に、状態数削減を行ったステートマシンを抽出し、０サイクルで実行されるループが存在するか否かを判定し（Ｓ５）、もしなければ、論理合成可能な回路記述（４）を生成する。これにより、クロック境界を明示的にＣ記述内に挿入した擬似Ｃ記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似Ｃ記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。
2004036463.tif 000002
【特許請求の範囲】
【請求項１】
所定のプログラム言語を流用して記述された第１プログラム記述を回路記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
前記回路記述は、前記第１プログラム記述が特定する回路動作を実現するハードウェアを所定のハードウェア記述言語で特定することを特徴とするコンパイラ。
【請求項２】
所定のプログラム言語を流用して記述された第１プログラム記述を所定のプログラム言語を用いた第２プログラム記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
前記第２プロダラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文とを含むことを特徴とするコンパイラ。
【請求項３】
所定のプログラム言語を流用して記述された第１プログラム記述を、所定のプログラム言語を用いた第２プログラム記述と回路記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
前記第２プログラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文とを含み、
前記回路記述は、前記第２プログラム記述で定義されるハードウェアを所定のハードウェア記述言語で特定することを特徴とするコンパイラ。
【請求項４】
前記所定のプログラム言語はＣ言語であることを特徴とする請求項１乃至３の何れか１項記載のコンパイラ。
【請求項５】
前記ハードウェア記述言語はＲＴＬレベルの記述言語であることを特徴とする請求項１又は３記載のコンパイラ。
【請求項６】
タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第１プログラム記述を入力する第１処理と、
前記第１プログラム記述に基づいて前記タイミング仕様を満足する回路情報を生成する第２処理と、を含むことを特徴とする論理回路の設計方法。
【請求項７】
前記第２処理は、前記第１プログラム記述を変換して、レジスタ代入文が入力変数と出力変数を用いて変形されると共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含む第２プログラム記述を前記回路情報として生成する処理を含むことを特徴とする請求項６記載の論理回路の設計方法。
【請求項８】
前記第２処理は、前記第２プログラム記述を変換して、前記タイミング仕様を満足するハードウェアを所定のハードウェア記述言語で特定するための回路記述を更に別の前記回路情報として生成する処理を含むことを特徴とする請求項７記載の論理回路の設計方法。
【請求項９】
前記プログラム言語はＣ言語であることを特徴とする請求項８記載の論理回路の設計方法。
【請求項１０】
前記第２プログラム記述を用いて設計対象回路のシミュレーションを行う第３処理を更に含むことを特徴とする請求項９記載の論理回路の設計方法。
【請求項１１】
前記第２処理は、前記第１プログラム記述を変換して、前記レジスタ代入文が入力変数と出力変数を用いて変形された記述を含む第２プログラム記述を前記回路情報として生成する処理を含むことを特徴とする請求項６記載の論理回路の設計方法。
【請求項１２】
前記第２処理は、前記第２プログラム記述を変換して、前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含み、所定のプログラム言語で記述されてコンピュータで実行可能なむ第３プログラム記述を、前記回路情報として生成する処理を含むことを特徴とする請求項１１記載の論理回路の設計方法。
【請求項１３】
前記第３プログラム記述を用いて設計対象回路のシミュレーションを行う第３処理を更に含むことを特徴とする請求項１２記載の論理回路の設計方法。
【請求項１４】
タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第１プログラム記述を入力する入力処理と、
前記レジスタ代入文が入力変数と出力変数を用いて変形されると共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含み、前記所定のプログラム言語で記述された第２プログラム記述を生成する変換処理と、を含むことを特徴とする論理回路の設計方法。
【請求項１５】
前記変換処理は、第１プログラム記述に基づいてＣＦＧを生成する過程で、前記ＣＦＧに前記クロック境界記述に対応してクロック境界ノードを設定し、前記クロック境界ノードの後に、前記レジスタ代入記述を挿入することを特徴とする請求項１４記載の論理回路の設計方法。
【請求項１６】
第２プログラム記述に対してそのＣＦＧを利用しながらステート遷移毎の変数表を作成しながらコード最適化を行う最適化処理を更に含むことを特徴とする請求項１５記載の論理回路の設計方法。
【請求項１７】
前記変数表においてステート間で変数に変化のない部分を前置保持を要する部分として抽出し、抽出された部分に、出力変数に入力変数を代入する記述を追加する前置保持処理を更に含むことを特徴とする請求項１６記載の論理回路の設計方法。
【請求項１８】
前記前置保持処理を経た変数表の各ステート遷移毎の変数と引数に基づいてステートマシンを構成するコードの抽出を行う抽出処理を更に含むことを特徴とする請求項１７記載の論理回路の設計方法。
【請求項１９】
前記抽出処理で抽出されたステートマシン構成コードと第２プログラム記述を参照しながら、前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する処理を更に含むことを特徴とする請求項１８記載の論理回路の設計方法。
【請求項２０】
前記第１プログラム記述に対して０サイクルで実行されるループが存在するか否かが判定され、存在しないと判別されたときに前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する処理を行うことを特徴とする請求項１４記載の論理回路の設計方法。
【発明の詳細な説明】
【技術分野】  本発明はプログラム記述からシミュレーション用のプログラム記述又はハードウェアを特定する回路記述を自動生成する技術に関し、例えばパイプライン動作される論理回路、例えばＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）等の論理回路の設計に適用して有効な技術に関する。
【背景技術】  プログラム言語を用いてディジタル回路の回路記述を生成する技術がある。特許文献１に記載の技術では、レジスタを示す変数と、レジスタの入力を示す変数とに分け、モジュール部での処理の後に第２の変数から第１の変数に一括して代入する一括代入部を設けている。特許文献２には、汎用プログラム言語で回路動作を記述したプログラムの中から、順次制御する部分を特定処理部で特定し、その後、変換処理部で、前記順次制御する部分の記述を、ステートマシンとして動作するように汎用プログラム言語を用いて変換し、その変換後のプログラムを取得し、続いて、プログラム生成処理部で、前記変換後のプログラムの中から並行動作する部分を抽出し、この抽出部分の全てをアクセスするプログラムを生成する、というものである。
特許文献１：特開２００２−４９６５２号公報
特許文献２：特開平１０−１４９３８２号公報
【発明の開示】
特許文献１によれば、▲１▼回路動作を示すモジュール、▲２▼レジスタ代入を行う一括代入部、▲３▼クロック同期で繰り返すループ部の３つの構成がらなっており、特に▲３▼内で▲１▼の実行後に▲２▼を実行する事を特徴としている。しかしながら、▲１▼がクロック境界を含まず、必ず▲３▼に含まれる構成となるため、複数サイクルにまたがる回路動作を記述する為には、回路動作をクロック境界で分割する必要がある。例えば、ある条件が成立したときは、前サイクルで実行した回路動作の途中から回路動作を行うという記述を行わなければならないが、そのような記述を行うのは困難である。特に、ストール動作を伴うパイプライン動作を行う回路を特許文献１に示す方法で記述すると、煩雑な作業を伴い、かつプログラム記述が複雑なものになる虞のあることが本発明者によって見出された。
特許文献２によれば、▲１▼汎用言語で記述したプログラムから順次処理部を識別し、ステートマシンを表す汎用プログラム記述に変換、▲２▼関数レベルでの並列性の抽出、▲３▼ハード化するプログラムとそれを制御するソフトプログラムの結合の自動化、▲４▼順次処理部内でハード化する際にフリップフロップやラッチを必要とする部分を識別してＨＤＬに変換、の４つを特徴点がある。しかしながら、クロック境界を明示的に与えられる手段がなく、サイクル精度での記述を直接行う事が出来ない。特許文献２の実施例によれば、クロック境界は関数から関数への間であり、例えばある条件が成立したときは、前サイクルで実行した回路動作の途中から回路動作を行うという記述を行うのが困難である。特に、ストール動作を伴うパイプライン動作を行う回路を特許文献２に示す方法で記述することは可能であるが、煩雑な作業を伴い、かつプログラム記述が複雑になる虞のあることが本発明者によって見出された。
本発明の目的は、本発明の目的は、クロック境界を明示的に記述したプログラム記述からハードウェア記述を自動生成することができるコンパイラを提供することにある。
本発明の別の目的は、ストール動作を伴うパイプライン動作が可能な回路のプログラム記述又は回路記述を容易に得る事ができるコンパイラを提供することにある。
本発明の更に別の目的は、ストール動作を伴うパイプライン動作が可能な回路の設計を行うことができる論理回路の設計方法を提供することにある。
本発明の上記並びにその他の目的と新規な特徴は本明細書の以下の記述と添付図面から明らかにされるであろう。
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
〔１〕本発明の概要を全体的に説明する。即ち、クロック境界（記述子＄）及びレジスタ代入文（演算子＝＄を挟む記述）によりステートメントレベルでの並列動作の記述をサイクル精度で記述可能な擬似Ｃ記述（１）を入力とし、レジスタ代入文の識別を行い（Ｓ２）、実行可能なＣ記述（３）を生成するする（Ｓ３およびＳ４）と共に、状態数削減を行ったステートマシンを抽出し、０サイクルで実行されるループが存在するか否かを判定し（Ｓ５）、もしなければ、論理合成可能な回路記述（４）を生成する（Ｓ６）。
上記より、クロック境界を明示的にＣ記述内に挿入した擬似Ｃ記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似Ｃ記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。
擬似Ｃ記述から一般のＣコンパイラによるコンパイルが可能なＣ記述を出力することができる。状態（ステート）数削減を行うので、記述で与えたクロック境界の数＋１以下のステート数のステートマシンを伴う回路記述を出力することができる。
ステートマシンを意識する事なくプログラム・レベルで機能設計を行う事ができるため、記述量が低減され、開発期間の短縮のみならず品質向上にも寄与する。
また、一般のクロック境界を指定しないプログラム・レベルでの記述では表現できない、バス・インターフェース回路や調停回路の記述が可能となる。特に、レジスタ代入が記述可能である為、ステートメントレベルでの並列性を考慮した記述を行う事が可能であり、ストール動作を伴うパイプライン動作のような複雑な回路動作をＣ記述よりも少ないコード量で容易に記述可能である。
また、一般のＣコンパイラでコンパイル可能なＣ記述へ変換する為、高速なシミュレーションが可能となり、機能検証工数の大幅な低減が可能となる。従って、機能設計における論理設計、論理検証の双方の大幅な工数削減が可能となる。
クロック境界を指定したプログラム記述からミーリー（Ｍｅａｌｙ）型のステートマシンが生成可能であるので、プログラム・レベルでのモデル検査を行う事が可能である。
高位合成ツールが不得意とする、サイクル精度を要求される例えば、キャッシュ・コントローラやＤＭＡコントローラの開発に適用可能であり、設計期間の短縮に大きく寄与する。
〔２〕本発明に係るコンパイラの第１形態では、コンパイラは、所定のプログラム言語を流用して記述された第１プログラム記述（１）を回路記述（４）に変換可能であって、前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文（演算子＝＄を挟む記述）とクロック境界記述（＄）を含み、前記回路記述は、前記第１プログラム記述が特定する回路動作を実現するハードウェアを所定のハードウェア記述言語で特定する。
本発明に係るコンパイラの第２形態では、コンパイラは、所定のプログラム言語を流用して記述された第１プログラム記述を所定のプログラム言語を用いた第２プログラム記述（３）に変換可能であり、前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文（演算子＝＄を挟む記述）とクロック境界記述（＄）を含む。前記第２プログラム記述は、前のサイクルの状態を参照可能に前記レジスタ代入文を変形した変形代入文（１３）と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文（１２）とを含む。
本発明に係るコンパイラの第３形態では、コンパイラは、所定のプログラム言語を流用して記述された第１プログラム記述（１）を、所定のプログラム言語を用いた第２プログラム記述（３）と回路記述（４）に変換可能である。前記第１プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む。前記第２プログラム記述は、前のサイクルの状態を参照可能に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述とを含む。前記回路記述は、前記第２プログラム記述で定義されるハードウェアを所定のハードウェア記述言語で特定する。
前記所定のプログラム言語は例えばＣ言語である。前記ハードウェア記述言語は例えばＲＴＬレベルの記述言語である。
〔３〕本発明に係る論理回路の設計方法の第１形態では、タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文（演算子＝＄を挟む記述）とクロック境界記述（＄）を含む第１プログラム記述（１）を入力する第１処理（Ｓ１）と、前記第１プログラム記述に基づいて前記タイミング仕様を満足する回路情報を生成する第２処理と、を含む。
前記第２処理は、前記第１プログラム記述を変換して、前記レジスタ代入文が入力変数と出力変数を用いて変形される（Ｓ２）と共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する（Ｓ４）記述（１３，１２）を含む第２プログラム記述（３）を、前記回路情報として生成する処理を含んでよい。
前記第２処理は、前記第２プログラム記述に基づいて前記タイミング仕様を満足するハードウェアを所定のハードウェア記述言語で特定するための回路記述（４）を更に別の前記回路情報として生成する処理を含んでよい。
前記第２プログラム記述を用いて設計対象回路のシミュレーションを行う第３処理を更に含んでもよい。
上記第２処理に関し、前記レジスタ代入文が入力変数と出力変数を用いて変形される（Ｓ２）記述（１３）を含む第２プログラム記述（５）と、前記クロック境界記述に対応させて前記入力変数を出力変数に代入する（Ｓ４）記述（１２）を含む第３プログラム記述（３）とを、分けて把握することも可能である。このとき、第３処理によりシミュレーションは第３プログラム記述に基づいて行うことになる。
〔４〕本発明に係る論理回路の設計方法の第２形態では、タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第１プログラム記述を入力する入力処理（Ｓ１）と、前記レジスタ代入文が入力変数と出力変数を用いて変形される（Ｓ２）と共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する（Ｓ４）記述（１３，１２）を含み、前記所定のプログラム言語で記述された第２プログラム記述を生成する変換処理とを含む。
前記変換処理は、第１プログラム記述に基づいてＣＦＧを生成する過程で、前記ＣＦＧに前記クロック境界記述に対応してクロック境界ノードを設定し、前記クロック境界ノードの後に、前記レジスタ代入記述を挿入する処理であってよい。
第２プログラム記述に対してそのＣＦＧを利用しながらステート遷移毎の変数表を作成しながらコード最適化を行う最適化処理を更に含んでもよい。
前記変数表においてステート間で変数に変化のない部分を前置保持を要する部分として抽出し、抽出された部分に、出力変数に入力変数を代入する代入記述を追加する前置保持処理を更に含んでもよい。
前記前置保持処理を経た変数表の各ステート遷移毎の変数と引数に基づいてステートマシンを構成するコードの抽出を行う抽出処理を更に含んでもよい。
前記抽出処理で抽出されたステートマシン構成コードと第２プログラム記述を参照しながら、前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する回路記述を生成する処理を更に含んでもよい。
前記第１プログラム記述に対して０サイクルで実行されるループが存在するか否かが判定され、存在しないと判別されたときに前記変換処理が行なわれる。
【図面の簡単な説明】  第１図は本発明に係る論理回路の設計方法を例示するフローチャートである。
第２図は第１図の設計方法を適用して設計すべき回路例を示すブロック図である。
第３図は第２図の回路動作仕様を示すタイミングチャートである。
第４図は第２図の設計対象回路の擬似Ｃプログラムを例示する説明図である。
第５図はレジスタ代入文識別処理（Ｓ２）によって得られる追加変数宣言の記述とレジスタ代入文書き換えの記述を示す説明図である。
第６図は擬似Ｃ記述に基づくＣＦＧ作成過程の一つの過程を示す説明図である。
第７図は擬似Ｃ記述に基づくＣＦＧ作成過程の別の過程を示す説明図である。
第８図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第９図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１０図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１１図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１２図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１３図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１４図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１５図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１６図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１７図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１８図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第１９図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第２０図は擬似Ｃ記述に基づくＣＦＧ作成過程の更に別の過程を示す説明図である。
第２１図は擬似Ｃ記述に基づくＣＦＧ作成過程の最終過程を示す説明図である。
第２２図は説明を簡単化するために第２１図のＣＦＧに対してクロック境界や分岐の始点・終点、及びループの始点・終点の情報を付加していないＣＦＧを例示する説明図である。
第２３図は第２２図のＣＦＧに対するフラグ挿入状態を例示する説明図である。
第２４図はレジスタ代入記述挿入文の挿入位置をＣＦＧ上で例示する説明図である。
第２５図はＣ記述生成処理（Ｓ４）を経て得られる実行可能な変換Ｃ記述（Ｃプログラム）の最初の一部を例示する説明図である。
第２６図は第２５図に続く実行可能な変換Ｃ記述（Ｃプログラム）の一部を例示する説明図である。
第２７図は第２６図に続く実行可能な変換Ｃ記述（Ｃプログラム）の最後の部分を例示する説明図である。
第２８図はステート数削減処理の第１のルールを示す説明図である。
第２９図はステート数削減処理の第２のルールを示す説明図である。
第３０図は第２２図のＣＦＧに対してステート数削減を行った結果を例示する説明図である。
第３１図はステート数削減等の処理を行ったＣＦＧに対してステートの割り当てを行った状態を例示する説明図である。
第３２図は前記コード最適化の処理を説明するために特別に簡素化した例としてコード最適化対象とされる擬似Ｃプログラムを示す説明図である。
第３３図は第３２図の擬似Ｃプログラムに基づいて得られたＣＦＧを例示する説明図である。
第３４図は第３３図のＣＦＧに対してステート割り当てが行なわれた状態を例示する説明図である。
第３５図は第３４図のＣＦＧに対してステートマシン生成のための変数表作成処理過程の最初の状態を例示する説明図である。
第３６図は第３５図に続く変数表作成処理過程の次の状態を例示する説明図である。
第３７図は第３６図に続く変数表作成処理過程の次の状態を例示する説明図である。
第３８図は第３７図に続く変数表作成処理過程の次の状態を例示する説明図である。
第３９図は第３８図に続く変数表作成処理過程の次の状態を例示する説明図である。
第４０図は第３９図の生成過程を経て生成された変数表を例示する説明図である。
第４１図は第４０図の変数表に対して冗長ステートメント削除を行ったとき、削除されるべきステートメントを例示する説明図である。
第４２図は第４１図に対して冗長ステートメントが削除された結果の変数表を例示する説明図である。
第４３図は冗長ステートメントが削除された結果をＣＦＧで示す説明図である。
第４４図は第４２図の変数表に対してローカル変数削除を行ったとき削除されるべき変数を例示する説明図である。
第４５図はローカル変数削除処理が行なわれた結果をＣＦＧで示す説明図である。
第４６図は冗長ステートメント削除処理及びローカル変数削除処理が行なわれて最終的に更新された変数表を例示する説明図である。
第４７図は後工程の前置保持解析により変数表に前置保持“ｒｅｔａｉｎ“の記述が追加された状態を例示する説明図である。
第４８図はコードの最適化として更に演算式の簡約化を行った例をＣＦＧで示す説明図である。
第４９図は第３２図乃至第４８図で特別に簡素化した別の例を用いて説明したコード最適化の処理を第３１図に示されるステート割り当てが行われた後に施すことによって得られる最適化後のＣＦＧを例示する説明図である。
第５０図は第４９図に対する最適化処理後の変数表を示す説明図である。
第５１図は前置保持解析のアルゴリズムを例示する説明図である。
第５２図は前置保持解析の結果に対応する変数表を示す説明図である。
第５３図は第５２図に対し“ｒｅｔａｉｎ”を実際のコードで上書きした変数表を示す説明図である。
第５４図は開始ステートＳＴ０におけるステートマシン抽出処理を示す説明図である。
第５５図は第５４図に対しｒｅｔａｉｎ情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第５６図は開始ステートＳＴ１におけるステートマシン抽出処理を示す説明図である。
第５７図は第５６図に対しｒｅｔａｉｎ情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第５８図は開始ステートＳＴ２におけるステートマシン抽出処理を示す説明図である。
第５９図は第５８図に対しｒｅｔａｉｎ情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第６０図はＨＤＬ記述生成処理（Ｓ６）にて生成されたＨＤＬ記述の最初の一部を示す説明図である。
第６１図は第６０図に続くＨＤＬ記述の一部を示す説明図である。
第６２図は第６１図に続くＨＤＬ記述の最後の部分を示す説明図である。
【発明を実施するための最良の形態】  《設計方法の概略》
第１図には本発明に係る論理回路の設計方法が例示される。同図に示される設計方法は、擬似Ｃ記述（擬似Ｃプログラム）１の作成、擬似Ｃプログラム１に対するコンパイル処理２に大別される。コンパイル処理２では、擬似Ｃプログラム１を、レジスタ代入記述を変形代入文とした擬似Ｃプログラム（５に格納）、および実行可能なＣ記述（Ｃプログラム）３に変換し、また、そのＣプログラム３をＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）などのＨＤＬ（Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）記述４に変換する。
前記擬似Ｃプログラム１は、サイクル精度で回路動作を特定可能とするクロック境界記述（単にクロック境界とも記す）及びレジスタ代入文を含み、ステートメントレベルでの並列記述を可能にしたプログラムである。擬似Ｃ記述とは、前記クロック境界及びレジスタ代入文が定義されているない所謂ネイティブのＣ言語記述とは相違するという意味で用いられている。プログラム言語としてＣ言語以外の高級言語をベースとすることを妨げるものではない。
コンパイル処理２は、図示を省略するコンピュータ装置がコンパイラを実行し、擬似Ｃプログラム１を読み込んで行なわれる。先ず擬似Ｃプログラム１が読み込まれる（Ｓ１）。読み込まれた擬似Ｃプログラム１に対しては、レジスタ代入文の識別が行なわれ、識別されたレジスタ代入文を、前のサイクルの状態を参照可能に変形し、換言すれば、入力変数と出力変数を用いて変形する（Ｓ２）。変形されたレジスタ代入文を変形代入文とも称する。レジスタ代入文が変形代入文に変形された擬似Ｃプログラムはレジスタ情報記憶部５に格納される。レジスタ代入文が変形代入文に変形された擬似Ｃプログラムは前記レジスタ情報記憶部５から取り出されて、そのコントロール・フロー・グラフ（以下ＣＦＧと記す）が生成される（Ｓ３）。生成されたＣＦＧは中間表現記憶部６に格納される。前記中間表現記憶部６に格納されたＣＦＧ及び前記レジスタ情報記憶部５に格納された擬似Ｃプログラムは、実行可能なＣ記述プログラムに変換される（Ｓ４）。例えば、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文が挿入される。換言すれば、クロック境界記述に対応させて前記変形代入文の入力変数を出力変数に代入するレジスタ代入記述挿入文が挿入される。
前記擬似Ｃプログラム５等に基づいてＨＤＬ記述４を得る場合、先ずそれらを入力してステートマシンの生成が行なわれる（Ｓ５）。ステートマシン生成（Ｓ５）は、ステート数削減処理（Ｓ５Ａ）、コードの最適化（Ｓ５Ｂ）、ＨＤＬ記述に則するための前置保持解析（Ｓ５Ｃ）、及びステートマシン抽出（Ｓ５Ｄ）に大別される。ステート数削減処理（Ｓ５Ａ）とコードの最適化（Ｓ５Ｂ）は最適化処理の範疇に属する処理と把握してもよい。コードの最適化（Ｓ５Ｂ）の段階では、０サイクルで実行されるループが存在するか否かを判定し、もしなければ、ＨＤＬ記述に則するための前置保持解析（Ｓ５Ｃ）、及びステートマシン抽出（Ｓ５Ｄ）が行われる。前記Ｃ記述プログラムを得るときには、例えばクロック境界ノードに前記レジスタ代入記述挿入文を挿入すればよかったが、ＨＤＬ記述を得るときはクロック境界でレジスタ値が変化しない場合にもそれを明示的に記述しておくことが必要とされる。そのために、前置保持解析（Ｓ５Ｃ）が行なわれる。生成されたステートマシンはステート遷移毎の変数表に基づいて生成される。生成されたステートマシンはステートマシン記憶部７に保持される。保持されたステートマシン等に基づいてＨＤＬ記述４が生成される（Ｓ６）。
ＨＤＬ記述４は論理合成ツールを利用することによって論理回路図データに変換可能にされる。前記Ｃ記述３は前記論理合成される論理回路のシミュレーションなどに利用される。
以下に、上記擬似Ｃプログラムとそのコンパイル処理を詳細に説明する。以下の詳細説明は第２図の回路に第３図の仕様を満足させる回路の設計を一例とする。
《設計対象回路》
第２図には第１図の設計方法を適用して設計すべき回路例が示される。設計対象回路１０はストール動作を伴うパイプライン加算回路である。その動作仕様は以下の通りである。
（１）入力信号ｖａｌｉｄ＿ａが立ち上がると、信号レベルのハイレベルとなったサイクルの入力信号ａの値を取り込む。ここではｖａｌｉｄ＿ａが立ち上がり変化を問題にする。
（２）入力信号ｖａｌｉｄ＿ａの立ち上がりの次サイクル以降で、入力信号ｖａｌｉｄ＿ｂの信号レベルがハイレベルとなると、そのサイクルでの入力信号ｂの値を取り込む。入力信号ｖａｌｉｄ＿ｂに対してはレベル検出だけで充分とされ、エッジ変化の検出は不要とされる。
（３）上記（１）（２）の動作でａとｂが取り込まれたなら、その次サイクルでａとｂの加算結果を出力信号ｏｕｔにより送出し、その同一サイクルに出力信号ｖａｌｉｄ＿ｏｕｔの信号レベルをハイレベルとし、次サイクルで出力信号ｖａｌｉｄ＿ｏｕｔの信号レベルをロウレベルとする。
（４）出力信号ｏｕｔは（１）（２）（３）の動作での新たな加算結果が代入されない限り、同じ値を出力する。
（５）出力信号ｖａｌｉｄ＿ｏｕｔは（１）（２）（３）の動作で出力信号ｏｕｔへ新たな加算結果が代入されたサイクルのみ信号レベルがハイとなり、それ以外はロウレベルを出力する。
第３図には第２図の回路動作仕様を示すタイミングチャートである。同図において、出力データ送出と入力データ取り込みが同一サイクルで行われており、パイプライン動作となっている。例えばａ２の入力とａ１＋ｂ１の出力が並列化されている。また、入力信号ｖａｌｉｄ＿ａの立ち上がりの次サイクル以降で入力信号ｖａｌｉｄ＿ｂの値が１となった次のサイクルで出力データ送出が行われる為、ストール動作を伴うパイプライン動作となっている。例えばｂ１の取込み後におけるｂ２の取込みは２サイクル待たされている。
《擬似Ｃプログラム》
第４図には前記設計対象回路１０の擬似Ｃプログラムが例示される。第４図に記述において１１は、設計対象回路１０の回路動作を記述した回路動作記述部である。同図に示される擬似Ｃプログラムの記述は以下の通りである。即ち、
１行目：Ｃ言語でのライブラリ呼び出し、
２〜７行目：関数ｐｉｐｅｌｉｎｅのプロトタイプ宣言部、
８〜１４行目：ｍａｉｎ関数部、
９〜１０行目：ｍａｉｎ関数のローカル変数宣言部。出力信号はポインタ型で宣言、
１１〜１２行目：ｍａｉｎ関数のローカル変数の初期化（出力信号のみ初期化、特に出力信号に対してＲＴＬへの変換時にレジスタが推定される場合ここで指定した初期値がリセット値となる）、
１５〜３６行目：ｐｉｐｅｌｉｎｅ関数部、
１８〜２０行目：ｐｉｐｅｌｉｎｅ関数のローカル変数宣言部（特にローカル変数に対してＲＴＬへの変換時にレジスタが推定される場合ここで指定した初期値がリセット値となる）、
２１〜３５行目：回路動作記述部１１、である。
回路動作記述部１１の詳細は以下の通りである。即ち、
２１、３５行目：無限ループにより回路を表現、
２２行目：入力変数ｖａｌｉｄ＿ａのローカル変数ｖａｌｉｄ＿ａ＿ｔｍｐへのレジスタ代入文（ここで、０ｘ０００１＆ｖａｌｉｄ＿ａにより、入力変数ｖａｌｉｄ＿ａの有効ビット幅が１ビットである事を指定している）、
２３行目：ｖａｌｉｄ＿ａが１‘ｂ１でｖａｌｉｄ＿ａ＿ｔｍｐが１’ｂ０であるか否かの判定文（即ち、ｖａｌｉｄ＿ａが立ち上がりであるか否かの判定文。特に、０ｘ０００１＆ｖａｌｉｄ＿ａ＿ｔｍｐにより、ローカル変数ｖａｌｉｄ＿ａ＿ｔｍｐの有効ビット幅が１ビットである事を指定している）、
２４行目：入力信号ａのローカル変数ａ＿ｔｍｐへの代入文（特に、０ｘ７ＦＦＦ＆ａにより、入力変数ａの有効ビット幅が１５ビットである事を指定している）、
２５行目：クロック境界、
２６行目：ｇｏｔｏラベル、
２７〜２８行目：入力変数ｖａｌｉｄ＿ｂが１‘ｂ１であれば、ローカル変数ｂ＿ｔｍｐに入力変数ｂを代入し、そうでなければクロック境界を１つまたいでラベルＬへ分岐する事を表している（特に、０ｘ０００１＆ｖａｌｉｄ＿ｂにより、入力変数ｂの有効ビット幅が１ビットである事を、０ｘ７ＦＦＦ＆ｂにより、入力変数ｂの有効ビット幅が１５ビットである事を表している）、
２９行目：ローカル変数ａ＿ｔｍｐとローカル変数ｂ＿ｔｍｐの和の出力変数ｏｕｔへのレジスタ代入文、
３０行目：定数０ｘ０００１の出力変数ｖａｌｉｄ＿ｏｕｔへのレジスタ代入文、
３１行目：２３行目のｉｆ文の判定が成立しなかった場合の分岐。即ち、ｖａｌｉｄ＿ａが立ち上がりでなかった場合の分岐を表す、
３２行目：クロック境界、
３３行目：定数０ｘ００００の出力信号ｖａｌｉｄ＿ｏｕｔへのレジスタ代入文、である。
上記記号“＄”はクロック境界記述を意味し、記号“＝＄”レジスタ代入を意味する。それらはＣ言語の汎用的な記述子及び演算子ではない。これを用いた擬似Ｃプログラムは、その意味においてＣ言語を流用したプログラム記述と言うことができる。
上記回路動作記述部１１より明らかなように、クロック境界記述及びレジスタ代入文によりステートメントレベルで並列動作をサイクル精度で簡単に記述可能になる。サイクル精度とは、クロックサイクルとの同期が意図される、ということである。
第４図の回路動作記述部１１の記述内容について説明する。入力変数ｖａｌｉｄ＿ａをローカル変数ｖａｌｉｄ＿ａ＿ｔｍｐに代入する事で、ｉｆ文によるｖａｌｉｄ＿ａの立ち上がり判定を行い、もし立ち上がりであった場合は、ローカル変数ａ＿ｔｍｐに入力信号ａを取り込み、次のサイクルで入力信号ｖａｌｉｄ＿ｂが１‘ｂ１であるか否かを判定する。もしそうなら入力信号ｂの値をローカル変数ｂ＿ｔｍｐに代入し、そうでなければ次のサイクルでもう一度入力信号ｖａｌｉｄ＿ｂが１‘ｂ１であるか否かを判定する。これを入力信号ｖａｌｉｄ＿ｂが１‘ｂ１となるまで繰り返す。この動作がストール動作に対応している。さて、ローカル変数ａ＿ｔｍｐとｂ＿ｔｍｐの和は取り込んだａとｂの値の和を表しており、それを出力変数ｏｕｔへレジスタ代入し、同時に１‘ｂ１を出力信号ｖａｌｉｄ＿ｏｕｔへレジスタ代入している。これにより、入力信号ａとｂを取り込んだ１サイクル後での加算結果とｖａｌｉｄ＿ｏｕｔ信号が１‘ｂ１である事を表現している。ｉｆ文によるｖａｌｉｄ＿ａの立ち上がり判定を行い、立ち上がりでない場合は、１サイクル後に１‘ｂ０をｖａｌｉｄ＿ｏｕｔへレジスタ代入している。ｖａｌｉｄ＿ａの立ち上がりは高々２サイクルに１回しか起こり得ないので、変数ｏｕｔへの新たな代入が２９行目で行われた時のみｖａｌｉｄ＿ｏｕｔが１‘ｂ１となり、それ以外の場合は、１‘ｂ０となる。
第４図の第２２行におけるレジスタ代入文は、サイクル精度で動作を特定するのに順序回路としてのレジスタを想定しており、左辺（ｖａｌｉｄ＿ａ＿ｔｍｐ）はレジスタの出力、即ち前サイクルの値を保持している変数として把握可能である。レジスタ代入文の右辺（０ｘ０００１＆ｖａｌｉｄ＿ａ）は現時点のレジスタ入力として把握可能である。また、第４図の第２９行目及び第３０行目に記載のレジスタ代入文に関しては、その後の第３２行におけるクロック境界記述でクロックが消費されるようになっているが、第２図及び第３図の回路仕様ではその次サイクルでｏｕｔを出力するとあり、結果として、ｏｕｔ、ｖａｌｉｄ＿ｏｕｔに関しては必然的にサイクル精度の記述が必要になるため、それらの記述にはレジスタ代入文が用いられている。
《レジスタ代入文識別》
次にレジスタ代入文識別処理Ｓ２について説明する。前記レジスタ代入文識別処理部では、代入文であって、＝と右辺の間に＄が付加された文を識別し、回路動作記述部１１内のレジスタ代入文、レジスタ代入文の左辺の変数の型と初期値を記憶し、識別したレジスタ代入文
2004036463.tif 000003
の記述に変更する。ｓｉｇｎａｌ＿ｌａｔｃｈｅｄ＿ｉは現時点の入力が与えられる入力変数、ｓｉｇｎａｌ＿ｌａｔｃｈｅｄ＿ｏは１サイクル前の出力が当てられる出力変数として把握することが可能である。変数宣言部に変更により生じた新たな変数
2004036463.tif 000004
を先に記憶しておいた変数の型と初期値を参照して追加する。例えば、
2004036463.tif 000005
の場合は、
2004036463.tif 000006
を追加する。特に、レジスタ代入の左辺の変数が、ポインタ型の場合（記号＊が付されている）は、そのポインタ型を用いて変数宣言を行う。例えば、
2004036463.tif 000007
の場合は、
2004036463.tif 000008
を追加する。特に、追加対象となった変数に対して、同じ型で初期値を０としたフラグ変数も追加予定として、記憶する。この例の場合、
2004036463.tif 000009
を追加予定変数として記憶する。尚、上記変更を行った記述も記憶する。また、変数の初期値はＨＤＬ変換時に該変数へのレジスタ推定が行われた場合、リセット時の値として用いる。
第５図にはレジスタ代入文識別処理Ｓ２によって得られる結果が例示される。第４図の擬似Ｃプログラム対して追加変数宣言の記述と変形代入文（レジスタ代入文書き換え）１３の記述が変更されている。
《ＣＦＧ生成》
次にＣＦＧ生成処理について説明する。ＣＦＧとは、一般に各関数内部において制御の流れを示すグラフを意味する。
ＣＦＧ生成処理では、回路動作記述部１１を読み込んで、ＣＦＧの作成を行う。特にｗｈｉｌｅやｆｏｒ等のループ及びｉｆやｃａｓｅ等の条件分岐、ｇｏｔｏ文によるラベルへのラベル分岐を識別する為のノードを持つＣＦＧの作成を行う。要するに、ｗｈｉｌｅやｆｏｒ等のループ及びｉｆやｃａｓｅ等の条件分岐、ｇｏｔｏ文によるラベルへのラベル分岐をノードに持つＣＦＧを作成する。各文をプログラムの終了迄読み込み、以下の手順１）〜７）でノードを作成しながらプログラムの流れに沿って、ノード間の接続を有向辺（向きが付いている辺）で接続する事でＣＦＧを作成する。第６図から第２１図には手順１）〜７）によるＣＦＧの作成過程が順を追って示される。各図にはループ文スタック、分岐文スタック、生成途中のＣＦＧが示される。
１）ループの開始であれば、ループ文スタックにその行番号とｗｈｉｌｅやｆｏｒ等のループを表す終端記号を登録し、ループ開始ノード（ＮＤｓ）を作成し、行番号と終端記号をノードに付加する。また、ｆｏｒやｗｈｉｌｅループ終了条件があれば、その条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
２）ループの終了であれば、ループ文スタックから先頭にある情報を取り去り、ループ終了を表すループ終了ノードを作成し、行番号と“ｅｎｄ  ｏｆ終端記号”をノードに付加する。但し、ｃｏｎｔｉｎｕｅやｂｒｅａｋはループの終了としては扱わない。また、ｄｏ−ｗｈｉｌｅループ終了条件があれば、その条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
３）条件分岐の開始であれば、分岐文スタックにその行番号とｉｆやｃａｓｅ等の分岐を表す終端記号を登録し、条件分岐開始ノードを作成し、行番号と終端記号をノードに付加する。また、分岐条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
４）条件分岐の終了であれば、分岐文スタックから先頭にある情報を取り去り、条件分岐終了を表す条件分岐終了ノードを作成し、行番号と“ｅｎｄ  ｏｆ終端記号”をノードに付加する。
５）ラベルであれば、ラベルを表すラベルノードを作成し、行番号とラベル記号をノードに付加する。
６）クロック境界であれば、クロック境界ノードを作成し、行番号と＄をノードに付加する。
７）上記以外であれば、行番号と文を付加したノードを作成し、１）〜６）の何れかに出会うまでノードをマージする。
上記手順によるＣＦＧが作成されるが、以下の説明では、その説明を簡単化するために、第２２図に例示されるように、クロック境界や分岐の始点・終点、及びループの始点・終点の情報を付加していないＣＦＧを用いて説明を行う。特に、クロック境界ノードのみ黒丸で、それ以外のループ、条件分岐、ラベル分岐ノードを白丸で表現する。
《Ｃ記述生成》
前記Ｃ記述生成処理Ｓ４について説明する。Ｃ記述生成処理Ｓ４では、前記レジスタ代入文識別処理で追加予定変数として記憶しておいた変数で、レジスタ代入部識別処理で変更した部分（変形代入文）の直下に対応するフラグ変数に１を代入する文の挿入を行い、レジスタ代入文の左辺の変数への代入文でレジスタ代入文でない代入文の直下に対応するフラグ変数に０を代入する文の挿入を行う。また同時に、ローカル変数宣言部に、レジスタ代入文識別部で記憶しておいた変数宣言を追加する。第２３図ではｆｌｇ＿ｖａｌｉｄ＿ａ＿ｔｍｐ＝１、ｆｌｇ＿ｖａｌｉｄ＿ｏｕｔ＝１のフラグが挿入されている。
次にレジスタ代入記述挿入文が決定される。前記レジスタ代入文識別処理Ｓ２において、識別されたレジスタ代入文の右辺の変数全てに対して、レジスタ代入記述挿入文が作成される。即ち、
2004036463.tif 000010
を作成する。これをレジスタ代入文識処理で識別したレジスタ代入文の
2004036463.tif 000011
右辺の変数全てに対して作成する。例の場合には、下記記述
が得られる。
上記レジスタ代入記述挿入文は、第２４図に例示されるように、クロック境界ノードの直下に挿入される。第２４図においてレジスタ代入記述挿入文には参照符号１２が付されている。このようにして行なわれるＣ記述への変換は、各ノードに付加された行番号等の情報を元に、深さ優先探索等のアルゴリズム（ＤＦＳ）を用いて、ＣＦＧを探索する事で挿入文の順番を考慮して行えば良い。尚、適度にコメント文を挿入しても良い。
第２５図乃至第２７図には上記Ｃ記述生成処理Ｓ４を経て得られる実行可能な変換Ｃ記述（Ｃプログラム）３の全体が例示される。
《ステートマシン生成−ステート数削減》
前記ステートマシンの生成処理Ｓ５について説明する。ステート数削減処理Ｓ５Ａは例えば第１又は第２のルールに従って行なわれる。ステート数削減処理の第１のルールは第２８図に例示される。即ち、ループ開始・終了ノード、条件分岐開始・終了ノード、ラベル分岐ノードの何れかであって、入力辺が複数あるノードを探索し、その入力辺の内２つ以上の入力辺にクロック境界がある場合は、同図に示すグラフ変形を行う。ステート数削減処理の第２のルールは第２９図に例示される。即ち、ループ開始・終了ノード、条件分岐開始・終了ノード、ラベル分岐ノードの何れかであって、出力辺が複数あり且つ出力辺に付加された条件が入力信号も出力信号の何れも含まず、２本以上の出力辺にクロック境界が付加されたノードを探索し、その前段のクロック境界が出力辺のクロック境界を含まない場合、同図に示すグラフ変形を行う。第３０図には第２２図のＣＦＧに対してステート数削減を行った結果が例示される。
《ステートマシン生成−コード最適化》
コード最適化処理Ｓ５Ｂでは前記ステート数削減等の処理を行ったＣＦＧに対しては第３１図に例示されるようにステートの割り当てを行う。第３１図に従えば、
回路動作部の開始文に対応するＣＦＧ上のノードに初期ステートを割り当て、ＣＦＧ上のクロック境界ノードにステートを割り当てる。但し、開始ノードへの入力辺が１つしか存在せずクロック境界が付加されている場合は、既に割り当てた初期ステートを削除する。尚、最適化の第１ルールにより、初期ステート削除が起こる必要十分条件は、開始ノードへの入力辺が１つしか存在せずクロック境界が付加されている事である事に注意することが望ましい。また、得られるステート数は、必ず回路動作部に記述したクロック境界の数＋１以下となる事に注意すべきである。
ここで、前記コード最適化の処理を、特別に簡素化した別の例を用いて、第３２図乃至第４８図を参照しながら説明する。
第３２図はコード最適化対象とされる擬似Ｃプログラムを示す。この擬似Ｃプログラムに基づいて得られたＣＦＧは第３３図に例示される。第３４図には第３３図のＣＦＧに対してステート割り当てが行なわれた状態を例示する。
第３５図から第４０図まではステートマシン生成のための変数表作成処理の様子が順を追って例示される。変数表の作成は、以下の（１）〜（３）の手順で行う。（１）ローカル変数を取得し、（２）関数の引数を取得し、（３）割り当てたステートからステートに到達するまでＣＦＧを下位側に辿って、ステート遷移を識別すると共に変数の定義・参照の情報を取得する。この段階で、両端がクロック境界ではないループが発見されると、ゼロサイクル・ループを検出したとして、ユーザに通知し、処理を終了。ゼロサイクル・ループの発生は、生成される回路に組合せ回路からなるループ回路が存在する事を意味しており、ループ回路の存在は生成される回路に重大なミスがあることを意味する。第３５図にはステートＳＴ０からＳＴ１への一つのステート遷移におけるローカル変数と引数が例示される。第３６図にはステートＳＴ０からＳＴ１への別のステート遷移におけるローカル変数と引数が例示される。第３７図にはステートＳＴ０からＳＴ２へのステート遷移におけるローカル変数と引数が例示される。第３８図にはステートＳＴ１からＳＴ０へのステート遷移におけるローカル変数と引数が例示される。第３９図にはステートＳＴ２からＳＴへのステート遷移におけるローカル変数と引数が例示される。第３５図から第３９図に示される夫々のステート遷移で得られたローカル変数と引数に基づいて、第４０図に例示される変数表が生成される。第４０図の変数表の記述において、ｄｅｆ［ｎ］：ｎ行目で変数定義されている事を表し、
ｕｓｅ＠ｖａｒ［ｍ］：ｍ行目で変数ｖａｒへの代入に用いられている事を表し、
ｐｒｅｄ（ｃｏｎｄ）｛．．．｝：条件ｃｏｎｄの分岐が成立した場合、｛．．．｝が実施される事を表し、
ｄｅｆ［ｌ］ｕｓｅ：１行目で自変数への代入に用いられている事を表し、
ｕｓｅ＠ｐｒｅｄ（ｃｏｎｄ）：条件ｃｏｎｄで用いられている事を表す、とされる。
最適化処理は例えば第４０図の変数表に基づいて行なわれる。最適化処理の一つは冗長ステートメントの削除である。
冗長ステートメントの削除として、第１に、同一変数に対して、ステート遷移のカラム内でｄｅｆが２つ以上存在する場合には、１）又は２）の処理を行う。即ち、
１）下記１−１），１−２）をｄｅｆの後段に存在するｐｒｅｄ（ｃｏｎｄ）｛．．．｝の手前まで（ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の有無に関わらず）実施する。１−１）：ｄｅｆの後段にｕｓｅを伴うｄｅｆがない場合は、最後のｄｅｆに対応するステートメントのみ残す。１−２）：ｄｅｆの後段にｕｓｅを伴うｄｅｆがある場合は、ｕｓｅを伴うｄｅｆの後段にｕｓｅを伴わないｄｅｆがあれば、そのｄｅｆのみを残し、そうでなければｕｓｅを伴うｄｅｆの前段のｄｅｆとｕｓｅを伴うｄｅｆを残し、これを変化が無くなるまで繰り返し、残ったｄｅｆに対応するステートメントのみ残す。
２）ｄｅｆの後段にｐｒｅｄ（ｃｏｎｄ）｛．．．｝が無ければ終了し、あれば下記２−１），２−２）を実施する。２−１）：ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件がｄｅｆの結果を参照している場合には終了とする。２−２）：ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件がｄｅｆの結果を参照していない場合は、１）へ分岐とする。
冗長ステートメントの削除処理として、第２に、ｕｓｅがどのステート遷移にも存在しない変数は削除とする。
上記処理手順により第４０図の変数表に対して冗長ステートメント削除を行ったとき、削除されるべきステートメントは第４１図に示される。同図において削除されるべきステートメントには斜め破線が明示されている。第４２図には冗長ステートメントが削除された結果の変数表が例示される。第４３図には冗長ステートメントが削除された結果をＣＦＧで表している。
最適化処理のもう一つはローカル変数の削除である。このローカル変数の削除処理として、第１に、各変数のステート遷移カラムに於いて、下記１）〜３）を左から順次変化が無くなる迄実施する。即ち、
１）ｄｅｆの後段にｐｒｅｄ（ｃｏｎｄ）｛．．．｝を挟まずｕｓｅが存在する場合には、１−１）、１−２）、１−３）、１−４）を行う。１−１）：ｕｓｅ自体がｕｓｅ＠ｐｒｅｄの場合は代入操作を実施し、ｄｅｆを削除し、１−２）の場合は＠の変数がローカル変数でｕｓｅ＠ｐｒｅｄとして用いられている場合は代入操作を実施せず、１−３）：＠の変数がローカル変数でｕｓｅ＠ｐｒｅｄとして用いられていない場合は代入操作を実施し、ｄｅｆを削除し、１−４）：＠の変数が引数の場合は代入操作を実施し、ｄｅｆを削除する。
２）ｄｅｆの後段にｐｒｅｄ（ｃｏｎｄ）｛．．．｝を挟んでｕｓｅが存在し、ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件で用いられている変数が引数の場合は１−１）から１−４）を適用する。
３）ｄｅｆの後段にｐｒｅｄ（ｃｏｎｄ）｛．．．｝を挟んでｕｓｅが存在し、ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件で用いられている変数がローカル変数の場合には、３−１）、３−２）を行う。３−１）：ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件がｄｅｆの結果を参照していない場合は１−１）から１−４）を適用し、３−２）：ｐｒｅｄ（ｃｏｎｄ）｛．．．｝の条件がｄｅｆの結果を参照している場合は代入操作を実施しない。
ローカル変数の削除処理として、第２に、ｄｅｆがどのステート遷移カラムにも存在しない変数は削除し、代入操作後のＣＦＧを再び解析して、変数表を更新する。
第４２図の変数表に対してローカル変数削除を行ったとき、削除されるべき変数は第４４図に示される。同図において削除されるべき変数には斜め破線が明示されている。第４５図にはローカル変数削除処理が行なわれた結果をＣＦＧで表している。
第４６図には冗長ステートメント削除処理及びローカル変数削除処理が行なわれて最終的に更新された変数表が例示される。この変数表により、必要となるローカル変数が管理されることになる。第４６図において、ｄｅｆが存在しない部分では、出力変数とローカル変数の前置保持が必要である事が識別できる。ステートの遷移において当然前置保持されなければならないからである。従って、その部分には、前置保持を必要とすることが容易に識別可能になる。第４７図に例示されるように、後工程の前置保持解析により、その部分に、前置保持“ｒｅｔａｉｎ“が追加されることになる。
コードの最適化として更に、第４８図に例示されるような演算式の簡約化が行なわれる。
《ステートマシン生成−前置保持解析》
ここからの説明は再度第２図及び第３図の仕様を満足させる回路設計の例に話しを戻す。第３２図乃至第４８図では特別に簡素化した別の例を用いて前記コード最適化の処理を説明したが、第３１図に示されるステート割り当てが行われた後に、それと同様の最適化処理を施すことにより、第４９図の最適化後のＣＦＧを得ることができ、また、第５０図の変数表が得られる。最適化処理後の第５０図の変数表には前置保持“ｒｅｔａｉｎ“は明示されていない。次に説明する前置保持解析で取得される。
第５１図には前置保持解析のアルゴリズムが例示される。前置保持解析は、出力変数とローカル変数に対して、状態遷移のカラムにてｄｅｆが全く存在しない場合、その状態遷移では前置保持が必要となる。また、ｄｅｆが存在したとしても、ｐｒｅｄ（）が付加されている場合は、各出力変数・ローカル変数の各状態遷移に対して、第５１図に示されるような図を作成して、ｐｒｅｄ（）による分岐の中でどの部分で前置保持が必要となるかを識別する。特に、レジスタ代入文識別処理で新たに追加したローカル変数に対しては、＿ｉが付加されている変数のみに対して前置保持が必要かの解析を行う。また、例え、変数表にｐｒｅｄ（）の情報がなくても必要ならＣＦＧを解析し直して付加する。
第５１図に示される図の作成は、ｐｒｅｄ（）の条件を分岐として、ｕｓｅ、ｄｅｆ等のノードを持つ木を作成する事で行う。そして木のｄｅｆより下位の部分木を削除し、最上位ノード以外で下位ノードにｄｅｆが存在しないノードを前置保持が必要なノードとして識別する。
ここで、最上位ノードとは、木の根から一番距離が近いｄｅｆがｕｓｅのノードまでのノードとその兄弟ノード全てを指す。
例えば、変数ｖａｒの状態遷移ＳＴｎ−＞ＳＴｍでの変数表からの情報が、ｐｒｅｄ（ｃｏｎｄ＿０）｛ｐｒｅｄ（ｃｏｎｄ＿１）｛ｕｓｅ＠ｖａｒ＿１［ｊ］，ｐｒｅｄ（ｃｏｎｄ＿２）｛ｄｅｆ［ｋ］，ｐｒｅｄ（ｃｏｎｄ＿３）｛ｄｅｆ［ｓ］｝｝｝である場合、第５１図のようになる。
第５２図には前置保持解析の結果に対応する変数表が例示される。前置保持を要する部分には“ｒｅｔａｉｎ”が追加される。
変数表において“ｒｅｔａｉｎ”の部分に追加すべき実際のコードは変数表から取得することができる。即ち、前置保持解析結果の変数表からの情報取得処理では、変数表のカラムでｒｅｔａｉｎが挿入された、出力変数・ローカル変数を取得し、例えば変数名が
１）レジスタ代入文の左辺の変数の場合は、ｓｉｇ＝ｓｉｇ＿ｏ；
２）レジスタ代入文識別部で追加した変数であって、＿ｉが付加されている変数の場合は、ｓｉｇ＿ｉ＝ｓｉｇ＿ｏ；
３）その他の変数の場合は、ｎｘｔ＿ｓｉｇ＝ｓｉｇ；
として記憶しておく。特に、ｒｅｔａｉｎにｐｒｅｄ（）が付加されている場合は、例えば、ｐｒｅｄ（ｃｏｎｄ＿０）｛ｐｒｅｄ（ｃｏｎｄ＿１）｛ｐｒｅｄ（！ｃｏｎｄ＿２）｛ｒｅｔａｉｎ｝｝｝に対しては、変数が３）の場合で変数名がｓｉｇの場合、ｐｒｅｄ（ｃｏｎｄ＿０）｛ｐｒｅｄ（ｃｏｎｄ＿１）｛ｐｒｅｄ（！ｃｏｎｄ＿２）｛ｎｘｔ＿ｓｉｇ＝ｓｉｇ｝｝｝として記憶する。以上の情軸を変数表に上書き登録する。第５３図には“ｒｅｔａｉｎ”が実際のコードで上書きされた変数表が例示される。更に、ｎｘｔ＿ｓｉｇといった具合にｎｘｔ＿を付加した変数を記憶しておく。第５３図の例の場合、ｎｘｔ＿を付加した変数は、ａ＿ｔｍｐのみである。
《ステートマシン生成−ステートマシン抽出》
次にステートマシン抽出処理Ｓ５Ｄについて説明する。ステートマシン抽出処理Ｓ５Ｄでは、割り当てた各ステートから深さ優先探索でクロック境界即ちステートであって初期ステートでないステートに到達するまで探索し、その探索で得られたループでも条件分岐でもラベル分岐でもないノードの情報を取得し、変数表のｒｅｔａｉｎ情報とマージして、ＨＤＬ記述に用いるステートマシンの抽出を行う。例えば第５４図には開始ステートＳＴ０の例が示される。ステートの記述は、特に制限されないが、各ステートからＤＦＳでコードを生成する。この場合ステート変数は、ｎｘｔ＿ｓｔａｔｅ＝ＳＴ０；等の形式として、コード生成を行う。
特に、ｒｅｔａｉｎ情報にてｎｘｔ＿が付加された変数はもとの変数名ではなくｎｘｔ＿が付加された変数名を用いてＨＤＬ記述に用いるステートマシンの抽出を行う。また、信号と定数との＆演算はビット幅解析に用いたので、不要となるため削除する。尚、定数は入力左辺のビット数を勘案してＨＤＬの２進表記に変換してＨＤＬ記述に則した記述とする。
変数表のｒｅｔａｉｎ情報の取得では、各状態遷移カラムから、深さ優先探索を開始したステートと同じステートを開始ステートするカラムを全て取得し、ｒｅｔａｉｎが開始ステートのみに依存するか、到達ステートにも依存するか、または到達ステートと分岐条件に依存するかを識別し、開始ステートにのみ依存する場合以外は、ｒｅｔａｉｎ情報のｐｒｅｄ（）とＣＦＧの分岐条件を比較する事で、ＨＤＬコードの適切な位置にｒｅｔａｉｎ情報として変数表に格納した代入式を挿入する。第５５図にはｒｅｔａｉｎ情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子が例示される。
第５４図及び第５５図には開始ステートＳＴ０におけるＨＤＬ記述に則したステートマシン記述の取得例が示される。第５６図及び第５７図の例は開始ステートＳＴ１におけるＨＤＬ記述に則したステートマシン記述の取得例が示される。第５８図及び第５９図の例は開始ステートＳＴ２におけるＨＤＬ記述に則したステートマシン記述の取得例が示される。
《ＨＤＬ記述生成処理》
ＨＤＬ記述生成処理Ｓ６において、モジュール宣言は、回路動作記述部を含むＣ記述の関数宣言から、型とポインタを表す＊を削除したものにｃｌｋとｒｅｓｅｔ＿ｎを加えたものをＨＤＬ記述として生成する。入出力宣言は、前記関数宣言での引数であって、代入式の左辺にのみ存在する変数を出力とし、代入式の右辺にのみ存在する変数を入力とし、ビット幅はＣ記述の記述内容で説明した方法で識別し、ＨＤＬ記述として生成する。ｒｅｇ宣言はＣ記述に記載されていたローカル変数で、これまでの変換仮定で最終的に残った変数と、これまでの変換仮定で追加された変数とを識別し、ｃｌｋとｒｅｓｅｔ＿ｎのｒｅｇ宣言文とともにＨＤＬ記述として生成する。ＣＦＧ生成過程で分岐条件に割り当てた変数のｗｉｒｅ宣言のＨＤＬ記述を生成し、前記割り当てた変数への分岐条件の代入文をａｓｓｉｇｎ文としてＨＤＬ記述を生成する。また、割り当てたステートを２進数で表す為のｐａｒａｍｅｔｅｒ宣言文のＨＤＬ記述を生成する。
また、レジスタ代入文に関しては、全てのレジスタ代入文とその右辺の変数宣言を取得し、例えば、取得した情報が
2004036463.tif 000012
2004036463.tif 000013
の場合、
2004036463.tif 000014
のようなＨＤＬ記述を生成する。
次いで、ステートマシン抽出部で得たｎｘｔ＿が付加された変数の記憶を参照し、その変数の宣言部を取得し、例えば、
この例の場合、ａ＿ｔｍｐが対象となるが、
2004036463.tif 000015
であり、ｒｅｇ宣言記述生成時に、
2004036463.tif 000016
なる代入から有効ビット幅が１５ビットである事が解っているので、下記
2004036463.tif 000017
2004036463.tif 000018
の記述を生成する。
また、抽出されたステートマシンのＨＤＬ記述をつなげ、各ステートでの代入文の左辺に対して、レジスタ代入の左辺の変数とレジスタ代入文識別部で追加した変数には、対応する＿ｏの変数を代入し、それ以外の変数には初期値を代入した文を作成し、ｎｘｔ＿ｓｔａｔｅ＝ＳＴ０；なる文を作成し、ｃａｓｅ文のｄｅｆａｕｌｔに対応する部分を作成し、それもつなげ、右辺の変数とｗｉｒｅ宣言した変数をｏｒで並べ、下記
2004036463.tif 000019
の記述を生成し、ｃａｓｅ文の間につなげたＨＤＬ記述を挿入し、最後の行にｅｎｄｍｏｄｕｌｅを付加する事でＨＤＬ記述を生成する。行数は付加しただけである。
第６０図乃至第６２図にはＨＤＬ記述生成処理Ｓ６にて生成されたＨＤＬ記述が例示される。
以上説明した設計方法によれば、以下の作用効果を得る。
クロック境界を明示的にＣ記述内に挿入した擬似Ｃ記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似Ｃ記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。
ステートマシンを意識する事なくプログラム・レベルで機能設計を行う事ができるため、記述量が低減され、開発期間の短縮のみならず品質向上にも寄与する。
また、一般のクロック境界を指定しないプログラム・レベルでの記述では表現できない、バス・インターフェース回路や調停回路の記述が可能となる。特に、レジスタ代入が記述可能である為、ステートメントレベルでの並列性を考慮した記述を行う事が可能であり、ストール動作を伴うパイプライン動作のような複雑な回路動作をＣ記述よりも少ないコード量で容易に記述可能である。
また、一般のＣコンパイラでコンパイル可能なＣ記述へ変換する為、高速なシミュレーションが可能となり、機能検証工数の大幅な低減が可能となる。従って、機能設計における論理設計、論理検証の双方の大幅な工数削減が可能となる。
高位合成ツールが不得意とする、サイクル精度を要求される例えば、キャッシュ・コントローラやＤＭＡコントローラの開発に適用可能であり、設計期間の短縮に大きく寄与する。
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
例えば、以上説明したプログラム記述及び回路記述は一例であり種々の論理設計に適用することができる。ＨＤＬは必ずしもＲＴＬに限定されない。プログラム記述言語はＣ言語に限定されず、その他の高級言語であってもよい。更にＪａｖａ（登録商標）等の仮想マシン言語などを用いることも可能である。
【産業上の利用可能性】  本発明は、ＣＰＵなどの論理回路の設計に広く適用することができる。
【図１】
2004036463.tif 000020
【図２】
2004036463.tif 000021
【図３】
2004036463.tif 000022
【図４】
2004036463.tif 000023
【図５】
2004036463.tif 000024
【図６】
2004036463.tif 000025
【図７】
2004036463.tif 000026
【図８】
2004036463.tif 000027
【図９】
2004036463.tif 000028
【図１０】
2004036463.tif 000029
【図１１】
2004036463.tif 000030
【図１２】
2004036463.tif 000031
【図１３】
2004036463.tif 000032
【図１４】
2004036463.tif 000033
【図１５】
2004036463.tif 000034
【図１６】
2004036463.tif 000035
【図１７】
2004036463.tif 000036
【図１８】
2004036463.tif 000037
【図１９】
2004036463.tif 000038
【図２０】
2004036463.tif 000039
【図２１】
2004036463.tif 000040
【図２２】
2004036463.tif 000041
【図２３】
2004036463.tif 000042
【図２４】
2004036463.tif 000043
【図２５】
2004036463.tif 000044
【図２６】
2004036463.tif 000045
【図２８】
2004036463.tif 000046
【図２７】
2004036463.tif 000047
【図２９】
2004036463.tif 000048
【図３０】
2004036463.tif 000049
【図３１】
2004036463.tif 000050
【図３２】
2004036463.tif 000051
【図３３】
2004036463.tif 000052
【図３４】
2004036463.tif 000053
【図３５】
2004036463.tif 000054
【図３６】
2004036463.tif 000055
【図３７】
2004036463.tif 000056
【図３８】
2004036463.tif 000057
【図３９】
2004036463.tif 000058
【図４０】
2004036463.tif 000059
【図４１】
2004036463.tif 000060
【図４２】
2004036463.tif 000061
【図４３】
2004036463.tif 000062
【図４４】
2004036463.tif 000063
【図４５】
2004036463.tif 000064
【図４６】
2004036463.tif 000065
【図４７】
2004036463.tif 000066
【図４８】
2004036463.tif 000067
【図４９】
2004036463.tif 000068
【図５０】
2004036463.tif 000069
【図５１】
2004036463.tif 000070
【図５２】
2004036463.tif 000071
【図５３】
2004036463.tif 000072
【図５４】
2004036463.tif 000073
【図５５】
2004036463.tif 000074
【図５６】
2004036463.tif 000075
【図５７】
2004036463.tif 000076
【図５８】
2004036463.tif 000077
【図５９】
2004036463.tif 000078
【図６０】
2004036463.tif 000079
【図６１】
2004036463.tif 000080
【図６２】
2004036463.tif 000081
【手続補正書】
【提出日】平成16年1月19日(2004.1.19)
【手続補正００１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項１
【補正方法】変更
【補正の内容】
【請求項１】所定のプログラム言語を流用して記述された第１プログラム記述を回路記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とする、固有の演算子が付されたレジスタ代入文とクロック境界記述を含み、
前記回路記述は、前記第１プログラム記述が特定する回路動作を実現するハードウェアを所定のハードウェア記述言語で特定することを特徴とするコンパイラ。


【手続補正００２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項２
【補正方法】変更
【補正の内容】
【請求項２】所定のプログラム言語を流用して記述された第１プログラム記述を所定のプログラム言語を用いた第２プログラム記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とする、固有の演算子が付されたレジスタ代入文とクロック境界記述を含み、
前記第２プログラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文とを含むことを特徴とするコンパイラ。


【手続補正００３】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項３
【補正方法】変更
【補正の内容】
【請求項３】所定のプログラム言語を流用して記述された第１プログラム記述を、所定のプログラム言語を用いた第２プログラム記述と回路記述に変換可能なコンパイラであって、
前記第１プログラム記述は、サイクル精度で回路動作を特定可能とする、固有の演算子が付されたレジスタ代入文とクロック境界記述を含み、
前記第２プログラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述


【手続補正００４】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項６
【補正方法】変更
【補正の内容】
【請求項６】タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とする、固有の演算子が付されたレジスタ代入文とクロック境界記述を含む第１プログラム記述を入力する第１処理と、
前記第１プログラム記述に基づいて前記タイミング仕様を満足する回路情報を生成する第２処理と、を含むことを特徴とする論理回路の設計方法。


【手続補正００５】
【補正対象書類名】特許請求の範囲
【補正対象項目名】請求項１４
【補正方法】変更
【補正の内容】
【請求項１４】タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とする、固有の演算子が付されたレジスタ代入文とクロック境界記述を含む第１プログラム記述を入力する入力処理と、
前記レジスタ代入文が入力変数と出力変数を用いて変形されると共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含み、前記所定のプログラム言語で記述された第２プログラム記述を生成する変換処理と、を含むことを特徴とする論理回路の設計方法。




【国際調査報告】
2004036463.tif 000082
2004036463.tif 000083