(57)【要約】【課題】ＲＴＬのＶｅｒｉｌｏｇ−ＨＤＬソースを入力し、計算機上で実行可能なプログラム言語に変換する。【解決手段】構成要素解析ステップ（Ｓ１０１）で、入力したソースの構成要素に対応したデータ構造を構築する。データフロー解析ステップ（Ｓ１０２）において、状態レジスタ及びデータパス部レジスタからのデータフローを生成する。制御構造再構築ステップ（Ｓ１０３）で状態レジスタからのデータフローを再構築する。データフロー再構築ステップ（Ｓ１０４）では、データパス部レジスタからのデータフローを、制御構造の各状態で動作する回路のみで構成されるように再構築する。制御構造とデータフローの併合ステップ（Ｓ１０６）では、制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、ビヘイビアレベルの中間語を出力する。目的コード生成ステップ（Ｓ１０８）において、中間語を、プログラム言語に変換する。【選択図】　図１
2004021841.tif 000002
【特許請求の範囲】
【請求項１】
状態レジスタと組み合わせ回路とを備えた制御部と、この制御部からの信号により制御されるレジスタと組み合わせ回路とを備えたデータパス部とを用いてハードウェアの動作を記述するハードウェア動作記述を、構成要素解析手段、データフロー解析手段、制御構造再構築手段、データフロー再構築手段、制御構造とデータフローの併合手段及び目的コード生成手段として機能するコンピュータを使用して、計算機上で実行可能なプログラム言語に変換する方法であって、
前記構成要素解析手段において、前記ハードウェア動作記述の構成要素を解析するステップと、
前記データフロー解析手段において、前記状態レジスタからのデータフローと、前記データパス部のレジスタからのデータフローを生成するデータフロー解析ステップと、
前記制御構造再構築手段において、生成された状態レジスタからのデータフローが再構築されることにより制御構造を再構築するステップと、
前記データフロー再構築手段において、前記データパス部のレジスタからのデータフローを、制御構造の各状態で動作する回路で構成されるように再構築するステップと、
前記制御構造とデータフローの併合手段において、制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、ビヘイビアレベルの中間語を出力するステップと、
前記目的コード生成手段において、前記ビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換するステップとを、
有することを特徴とするハードウェア動作記述変換方法。
【請求項２】
前記構成要素の解析ステップが、入力されたハードウェア動作技術に対して字句解析及び構文解析をおこない、前記ハードウェア動作記述の構成要素に対応したデータ構造を構築し、このデータ構造を意味解析することにより信号の意味付けをおこない、階層展開によりハードウェア動作記述の有する階層的構造を平坦な構造に変換し、この平坦な構造を走査して定数伝播をおこなうことを特徴とする請求項１に記載のハードウェア動作記述変換方法。
【請求項３】
前記コンピュータが冗長な式の削除手段として機能し、
前記データフロー再構築ステップにおいて得られたデータフロー内で冗長な式を削除するステップを実行することを特徴とする請求項１に記載のハードウェア動作記述変換方法。
【請求項４】
前記コンピュータが冗長な式の削除手段として機能し、
前記制御構造とデータフローの併合手段で得られた中間語から冗長である式を削除するステップを実行することを特徴とする請求項１に記載のハードウェア動作記述変換方法。
【請求項５】
コンピュータに入力された状態レジスタと組み合わせ回路とを備えた制御部と、この制御部からの信号により制御されるレジスタと組み合わせ回路とを備えたデータパス部とを用いてハードウェアの動作を記述するハードウェア動作記述に関して、その構成要素を解析するステップと、
前記状態レジスタからのデータフローと、前記データパス部のレジスタからのデータフローを生成するデータフロー解析ステップと、
生成された状態レジスタからのデータフローが再構築されることにより制御構造を再構築する制御構造再構築ステップと、
前記データパス部のレジスタからのデータフローを、制御構造の各状態で動作する回路で構成されるように再構築するデータフロー再構築ステップと、
前記制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、前記ビヘイビアレベルの中間語を出力する制御構造とデータフローの併合ステップと、
ビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換する目的コード生成ステップとをコンピュータにおいて順次実行させることを特徴とするハードウェア動作記述変換用のコンピュータプログラム。
【請求項６】
前記データフロー再構築ステップにおいて得られたデータフロー内で冗長な式を削除するステップを実行することを特徴とする請求項５に記載のハードウェア動作記述変換用のコンピュータプログラム。
【請求項７】
前記制御構造とデータフローの併合手段で得られた中間語から冗長である式を削除するステップを実行することを特徴とする請求項５に記載のハードウェア動作記述変換用のコンピュータプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ハードウェア動作記述変換方法及びそのためのプログラムに関するものであって、より具体的には、ＲＴＬ（Ｒｅｇｉｓｔｅｒ−Ｔｒａｎｓｆｅｒ−Ｌｅｖｅｌ）と呼ばれるハードウェア動作記述から、ハードウェアの動作（ビヘイビア／振る舞い）および計算機言語への変換において、冗長な演算を含まない出力結果を得るための方法に関するものである。
【０００２】
【従来の技術】
現状、ハードウェア設計はＲＴＬと呼ばれる記述方法で書かれるのが一般的である。ＲＴＬ記述には、そのベースに「クロックで同期」という概念がある。ソフトウェアでこれを真面目にシミュレーションすると、動いて欲しいハードウェアの振る舞い以外にやらなければならないことが多すぎて、とても遅い。「クロックに同期」の機構を真面目にやらなければもっと速くシミュレーションが可能である。すなわち、ソフトウェアから見たハードウェア（ＬＳＩ）は、入出力の応答だけしてくれればよく、中でクロックに同期してようがしていまいが、ほとんどの場合関係ない。
【０００３】
ハードウェアの動作をクロックやハードウェアリソース形式で記述し、ツールを使ってＲＴＬ記述に変換する技術＝高位合成というものが提案されているが、あまり普及していない。一方、ビヘイビア記述しておけば、記述量が少なくて生産性が上がる上に、上記のようにシミュレーションも高速化できるので、ビヘイビアレベルでの設計、検証のターンアラウンドが短くできる。この場合、クロック同期しないので、詳細なタイミングの検証はできないが、ハードウェアでの振る舞いレベルでの検証をシミュレーションして検討を行い、ソフト側から見た時、高機能なスタブとなるようなものを作ることが可能となる。
【０００４】
すなわち、前記のようにＲＴＬはクロック同期で記述されるのが一般的なので、これを計算機上でシミュレーションすると非常に遅い。一方、ビヘイビア記述は、ハードウェアの動作（振る舞い）を記述するもので、クロック同期機構などは記述されないのが一般的である。細かい同期などを考えなくて良いので、シミュレーションは高速に可能となる。このため、高速なシミュレーションを実現する目的で、現状ＲＴＬしかないハードウェア設計記述をビヘイビアに変換することは意義がある。
【０００５】
ＲＴＬ記述を通常のソフトウェア記述用の計算機言語（例えばＣ言語）に変換するものはいくつかある。例えば、Ｖｅｒｉｌｏｇ２Ｃ＋＋（商標、ｈｔｔｐ：／／ｓｏｕｒｃｅｆｏｒｇｅ．ｎｅｔ／ｐｒｏｊｅｃｔｓ／ｖｅｒｉｌｏｇ２ｃｐｐ／を参照）は、これを実行するツールである。
【０００６】
【発明が解決しようとする課題】
これらの従来技術では、基本的に並列処理であるハードウェアの動作記述を逐次処理の計算機言語に書き換える処理を行う。例えば、Ｖｅｒｉｌｏｇ２Ｃ＋＋は、ＲＴＬ記述を「レジスタ」と「組み合わせ回路／ラッチ」の二つに大別し、「組み合わせ回路／ラッチ」で行なわれる演算の結果が「レジスタ」に伝播して出力が決定されるという処理の流れに沿って、動作記述を逐次処理することにより、計算機上で実行可能なプログラム言語ソースコードを得るものである。
【０００７】
例えば、図１９に示すように、ハードウェアを外部からアクセス可能な制御部Ａとこの制御部Ａからの信号により制御されるデータパス部Ｂとにより大別し、更にこれら制御部Ａ及びデータパス部Ｂのそれぞれを、レジスタと組み合わせ回路（またはラッチ）によって構成する。この組み合わせ回路には、その回路で処理された演算結果を制御部Ａを構成する他の状態レジスタやデータパス部Ｂに対して出力するための制御信号出力部が設けられている。そして、これらの制御部Ａとデータパス部Ｂとに、所定のクロックに従ったタイミングで信号を入出力することにより、ハードウェアが並行動作する。
【０００８】
すなわち、所定のクロックＣ１のタイミングで、制御部Ａのレジスタ（状態レジスタと呼ぶ）に所定の値が入力されると、このレジスタの値に従って制御部Ａを構成する組み合わせ回路において所定の処理が実行される。そして、次のクロックＣ２のタイミングで、制御部Ａの制御信号出力部から、データパス部Ｂのレジスタに制御信号が出力されることにより、データパス部Ｂのレジスタの値が組み合わせ回路に送られ、それに従ってデータパス部Ｂの組み合わせ回路において所定の処理が実行される。同時に、このクロックＣ２のタイミングで、制御部Ａの制御信号出力部から、制御部Ａの組み合わせ回路での演算結果が新たな値として状態レジスタに与えられる。
【０００９】
その後、クロックＣ３のタイミングで、制御部Ａからの制御信号と、データパス部Ｂの組み合わせ回路の演算結果が、データパス部Ｂのレジスタに与えられると共に、制御部Ａの制御信号出力部から、制御部Ａの組み合わせ回路での演算結果が新たな値として状態レジスタに与えられる。以下、これを繰り返すことにより、ハードウェアの動作が実行される。
【００１０】
しかし、Ｖｅｒｉｌｏｇ２Ｃ＋＋によって、図１９のようなハードウェアの動作記述を逐次処理した場合、処理の後段に位置する「レジスタ」の出力が前段の「組み合わせ回路／ラッチ」への入力となっている場合、「レジスタ」→「組み合わせ回路／ラッチ」というデータの依存関係が発生してしまい、動作的には不必要だがＲＴＬの記述だけでは判断できないような冗長な処理が、出力結果であるプログラム言語ソースに残ってしまう。
【００１１】
本発明では、前記のような従来技術の問題点を解決するために提案されたものであって、その目的は、ＲＴＬからビヘイビア（および計算機言語）への変換において、冗長な演算を含まない出力結果を得るためのハードウェア動作記述変換方法及びそのためのプログラムを提供することにある。
【００１２】
すなわち、本発明は以下の、制御部とデータパス部からなるハードウェアの特性に注目し、２クロックの動作を１クロックの動作にまとめることにより、従来技術で２回のループを必要としていた動作と同等の動作を、１回のループで行うことが出来るようにしたものである。
【００１３】
（１）　状態レジスタの値、すなわち“状態”が決定すれば、その時の制御信号を一意に決定できる可能性がある。
（２）　あるクロックで動作した制御部の出力する制御信号は、次のクロックのデータパス部を制御する制御部とデータパス部で構成されるハードウェアは、前記図１９のように、クロックに対して並列な動作をする。
【００１４】
この場合、従来技術では、図２０の太線で囲まれた箇所を選択し、逐次的に並べ、計算機上で実行可能なプログラム言語に変換するという方法をとっている。このとき制御信号出力部の入力となる状態レジスタは選択されない。そのため、特性（１）　でいう“状態”が決定せず、制御信号も一意に決定することが出来ない。よって、特性（２）　のデータパス部も制御することができず、動作的には不必要だが削除することが出来ない冗長な処理が残ってしまう。
【００１５】
これに対して、本発明では、図２１の太線で囲まれた箇所を選択して、逐次的に並べ、計算機上で実行可能なプログラム言語に変換する。このとき、制御信号出力部の前の状態レジスタが選択されるので、特性（１）　でいう“状態”が決定する。すると、制御信号も一意に決定する可能性がある。制御信号が決定されれば、特性（２）　より、次のクロックのデータパス部に制御信号を与えることができるので、現在の“状態”でのデータパス部の動作を特定することができる。このデータパス部の動作を特定する作業こそ、演算の冗長性の削除にあたる。
【００１６】
【課題を解決するための手段】
上記の目的を達成するために、請求項１の発明は、状態レジスタと組み合わせ回路とを備えた制御部と、この制御部からの信号により制御されるレジスタと組み合わせ回路とを備えたデータパス部とを用いてハードウェアの動作を記述するハードウェア動作記述を、構成要素解析手段、データフロー解析手段、制御構造再構築手段、データフロー再構築手段、制御構造とデータフローの併合手段及び目的コード生成手段として機能するコンピュータを使用して、計算機上で実行可能なプログラム言語に変換する方法であって、
前記構成要素解析手段において、前記ハードウェア動作記述の構成要素を解析するステップと、
前記データフロー解析手段において、前記状態レジスタからのデータフローと、前記データパス部のレジスタからのデータフローを生成するデータフロー解析ステップと、
前記制御構造再構築手段において、生成された状態レジスタからのデータフローが再構築されることにより制御構造を再構築するステップと、
前記データフロー再構築手段において、前記データパス部のレジスタからのデータフローを、制御構造の各状態で動作する回路で構成されるように再構築するステップと、
前記制御構造とデータフローの併合手段において、制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、ビヘイビアレベルの中間語を出力するステップと、
前記目的コード生成手段において、前記ビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換するステップとを、
有することを特徴とする。
【００１７】
請求項２の発明は、請求項１の発明において、前記構成要素の解析ステップが、入力されたハードウェア動作技術に対して字句解析及び構文解析をおこない、前記ハードウェア動作記述の構成要素に対応したデータ構造を構築し、このデータ構造を意味解析することにより信号の意味付けをおこない、階層展開によりハードウェア動作記述の有する階層的構造を平坦な構造に変換し、この平坦な構造を走査して定数伝播をおこなうことを特徴とする。
【００１８】
請求項３の発明は、前記請求項１の発明において、前記コンピュータが冗長な式の削除手段として機能し、前記データフロー再構築ステップにおいて得られたデータフロー内で冗長な式を削除するステップを実行することを特徴とする。
【００１９】
請求項４の発明は、前記請求項１の発明において、前記コンピュータが冗長な式の削除手段として機能し、前記制御構造とデータフローの併合手段で得られた中間語から冗長である式を削除するステップを実行することを特徴とする。
【００２０】
請求項５の発明は、コンピュータに入力された状態レジスタと組み合わせ回路とを備えた制御部と、この制御部からの信号により制御されるレジスタと組み合わせ回路とを備えたデータパス部とを用いてハードウェアの動作を記述するハードウェア動作記述に関して、その構成要素を解析するステップと、
前記状態レジスタからのデータフローと、前記データパス部のレジスタからのデータフローを生成するデータフロー解析ステップと、
生成された状態レジスタからのデータフローが再構築されることにより制御構造を再構築する制御構造再構築ステップと、
前記データパス部のレジスタからのデータフローを、制御構造の各状態で動作する回路で構成されるように再構築するデータフロー再構築ステップと、
前記制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、前記ビヘイビアレベルの中間語を出力する制御構造とデータフローの併合ステップと、
ビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換する目的コード生成ステップとをコンピュータにおいて順次実行させることを特徴とする。
【００２１】
請求項６の発明は、前記請求項５の発明において、前記データフロー再構築ステップにおいて得られたデータフロー内で冗長な式を削除するステップを実行することを特徴とする。
【００２２】
請求項７の発明は、前記請求項５の発明において、前記制御構造とデータフローの併合手段で得られた中間語から冗長である式を削除するステップを実行することを特徴とする。
【００２３】
【発明の実施の形態】
以下、本発明の一実施形態を図面に従って具体的に説明する。なお、本発明における構成要素は、ハードウェア記述言語中の手続きや関数であるので、本実施の形態では構成要素をＲＴＬのＶｅｒｉｌｏｇ−ＨＤＬ（商標）における手続きとする。また、本発明は、ハードウェア動作記述の構成要素解析手段、データフロー解析手段、制御構造再構築手段、データフロー再構築手段、制御構造とデータフローの併合手段、目的コード生成手段及び冗長な式の削除手段として機能するコンピュータに対して、処理対象となるハードウェア動作記述を入力することにより、コンピュータの各手段が入力されたハードウェア動作記述を分析、演算、処理することにより実行される。
【００２４】
（１）本実施の形態の全体像。
本実施の形態は、図１において四角の枠で表示したコンピュータの各手段によって順次処理されるものであるが、大別すると、次の２つの処理から構成されている。
（１）　ＲＴＬのＶｅｒｉｌｏｇ−ＨＤＬをビヘイビアレベルの中間語に変換するための、構成要素解析（Ｓ１０１）から、制御構造とデータフローの併合（Ｓ１０７）までのステップ。
（２）　ビヘイビアレベルの中間語を計算機上で実行可能なプログラム言語に変換するための、目的コード生成ステップ（Ｓ１０８）。
【００２５】
すなわち、本実施の形態において変換のために入力されるデータは、ＲＴＬのＶｅｒｉｌｏｇ−ＨＤＬソースとする。入力されたソースは、構成要素解析ステップ（Ｓ１０１）において字句解析、構文解析をおこない、ソースのモジュール構成要素に対応したデータ構造を構築する。その後、意味解析により信号の意味付けをおこない、階層展開により、階層的構造であるＶｅｒｉｌｏｇ−ＨＤＬを平坦な構造に変換する。それから、平坦な構造を走査して定数伝播をおこなう。
【００２６】
次に、データフロー解析ステップ（Ｓ１０２）において、状態レジスタからのデータフローと、データパス部レジスタからのデータフローを生成する。データフローは信号の伝播を元に生成される。その後、制御構造再構築ステップ（Ｓ１０３）が実行され、生成された状態レジスタからのデータフローが再構築されて制御構造が再構築される。
【００２７】
データフロー再構築ステップ（Ｓ１０４）では、データパス部レジスタからのデータフローを、制御構造の各状態で動作する回路のみで構成されるように再構築する。このステップで、再構築されたデータフローは状態個数分生成される。その後、必要に応じて、再構築されたデータフローの冗長式を削除する。この冗長式の削除ステップ（Ｓ１０５）では、再構築されたデータフロー内で代入を行うことにより、冗長式を削除する。
【００２８】
更に、制御構造とデータフローの併合ステップ（Ｓ１０６）では、制御構造の各状態に、それぞれの再構築されたデータフローをマッピングし、ビヘイビアレベルの中間語を出力する。この中間語からも必要に応じて冗長式を削除する（Ｓ１０７）。その後、目的コード生成ステップ（Ｓ１０８）において、前記のようにして得られたビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換する。
【００２９】
（２）各ステップの詳細。
以下、図１に示した各ステップの詳細を説明する。
（２−１）構成要素解析ステップ（Ｓ１０１）…図２、図３
ソースプログラムが入力されたら、プログラムに含まれる全てのモジュール構成要素を構成要素解析ステップにて抽出する。構成要素解析ステップ（Ｓ１０１）は、具体的には字句解析、構文解析、意味解析からなる。字句解析、構文解析により、モジュール構成要素に対応するデータ構造を構築する。その際、制御部で同期信号に同期して動作するレジスタである、状態レジスタに対するラベル付けを行う。また、このとき、すべての数字を２進数に変換することにする。なお、この変換処理は、このステップで実行する必要はなく、他のステップにおいて行うことも可能である。
【００３０】
意味解析では、回路で使用される信号と、それに対応する宣言を結びつけ、信号の意味付けを行う。図２は、データ構造に対応するクラス図の例を示す。そして、図３のように、下位層モジュールを上位層モジュールに順次コピーし、階層的な構造であるモジュール構成要素を、最終的に最上位層モジュールに全てのモジュール構成要素がコピーされた構造に変換する。
【００３１】
なお、本実施の形態では、オブジェクト指向設計によりプログラムのデータ構造を作成した場合を想定して、クラス図によりデータ構造を表示しているが、プログラムを作成する上で、必ずしもクラス図を書く必要はない。また、図３はあくまでも階層展開の例であって、本発明は必ずしもこのように階層展開することを条件とするものではない。
【００３２】
コピーする際、下位層モジュールで入出力でなく、プライベートであった信号名は先頭にインスタンス名が追加されることで、他のモジュール内にある信号名との重複が防がれる。図３ではインスタンス名「ｈｏ」が追加されている。また、上位層モジュールのインスタンスのポートと、下位層モジュールのポートを接続する新たな代入式を生成する。図３ではａｓｓｉｇｎ　文が新たに生成され、上位層モジュールに加えられている。
【００３３】
また、同期信号を接続する場合、接続先の名前が変更された信号も同期信号であるとみなす。例では「ｃｌｋ」が同期信号の場合、「ｈｏ．ｃｌｋ」も同期信号であるとみなす。また、状態レジスタのラベル付けを壊さないようにする。
【００３４】
最後に、平坦になった構造を走査して定数伝播を行なう。定数伝播は、右辺が定数形である回路、主にパラメータ文を、その出力信号を入力とする箇所を定数に置き換えるものである。
【００３５】
（２−２）データフロー解析ステップ（Ｓ１０２）
基本的なＲＴＬ−ＨＤＬは、制御部Ａとデータパス部Ｂからなる。制御部Ａはデータパス部Ｂを制御し、データパス部Ｂは演算を行う回路である。例えば図４のように構成される。この例で、矢印は信号の流れを表している。
【００３６】
制御部Ａは、状態レジスタＡ１と、組み合わせ回路／ラッチからなる。また制御部Ａの組み合わせ回路／ラッチは、現在の状態や入力により制御信号を出力する制御信号出力部Ａ２と、次の状態を決定する次状態決定部Ａ３などからなる。データパス部Ｂは制御部Ａからの出力に従い動作する。具体的には、制御信号出力部Ａ２より出力される制御信号を入力とするレジスタＢ１が制御信号に従った動作を行い、データパス部Ｂの組み合わせ回路／ラッチＢ２を動作させる。
【００３７】
そこで、図１のデータフロー解析ステップ（Ｓ１０２）は、制御部Ａにおける状態レジスタＡ１からのデータフローの生成処理（図７）、データパス部ＢにおけるレジスタＢ１からのデータフローの生成処理（図８）、及び外部入力信号からのデータフロー生成処理（図９）を実行する。以下、それぞれのデータフローの生成処理について説明する。
【００３８】
（２−２−１）状態レジスタからのデータフローの生成…図４〜図７
このデータフロー解析ステップ（Ｓ１０２）では、構成要素解析ステップ（Ｓ１０１）により出力される構成要素を元に、図５のように、状態レジスタからのデータフローを生成する。図６は、データ構造に対応するクラス図の例を示す。
【００３９】
図５では、信号「ｓｔａｔｅ」の伝播によりデータフローが生成されている。このとき、データ構造のなかで不要な部分である「ＡＬＷＡＹＳ」や「Ｅｖｅｎｔ」などは削除し、「式」をあらわす情報のみにより構成されるデータ構造を生成して、データフローの要素とする。代わりに、その「式」がレジスタなのか「組み合わせ回路／ラッチ」なのかを判別するための情報を付加する。図５では、クラスＡｓｓｉｇｎ　以下の「式」を表すツリー構造と、レジスタなのか「組み合わせ回路／ラッチ」なのかを判別するための情報のみを持っている。
【００４０】
その結果、図２のクラス図中から「Ｅｖｅｎｔ」や階層処理を表す「Ｍｏｄｕｌｅ」「Ｉｎｓｔａｎｃｅ」「Ｐｏｒｔ」などのクラスが削除され、「Ｅｖｅｎｔ」中から「式」がレジスタなのか「組み合わせ回路／ラッチ」なのかを判別するための情報が取り出されて「Ｈａｎｄｌｅ」に格納される。
【００４１】
なお、前記の説明の「式」として選択される箇所、図２のクラス図からクラスが削除される点、及び「Ｈａｎｄｌｅ」に格納される点は、あくまでも本実施の形態の例に過ぎず、本発明は、この点に限定されるものではない。
【００４２】
図７は、このデータフロー解析ステップ（Ｓ１０２）における動作フローを示す。まず、構成要素解析ステップ（Ｓ１０１）におけるラベルを元に状態レジスタを見つけ（Ｓ７０１）、データフローに挿入する（Ｓ７０２）。次に、状態レジスタの出力信号が伝播する「組み合わせ回路／ラッチ」を見つけ（Ｓ７０３）、その「組み合わせ回路／ラッチ」がデータフローに存在していなければ（Ｓ７０４のＮＯ）データフローに挿入する（Ｓ７０５）。一つのデータフローに同じ「組み合わせ回路／ラッチ」が重複しないようにする理由は、例えば一つのデータフロー中に同じ組み合わせ回路が複数ある場合、最後段にある組み合わせ回路の出力結果が、それ以前の組み合わせ回路の出力結果を上書きしてしまうため、最後段以外のＡ　は無駄なためである。
【００４３】
ここでは、この「組み合わせ回路／ラッチ」にあたる回路は、制御信号出力部Ａ２と次状態決定部Ａ３であるとする。データフロー内の回路の出力信号が伝播する、全ての「組み合わせ回路／ラッチ」をデータフローに挿入した後（Ｓ７０６）、データフローの前方要素である「組み合わせ回路／ラッチ」の入力が、後方要素である「組み合わせ回路／ラッチ」の入力とならないような順番に、データフロー内の「組み合わせ回路／ラッチ」の並べ替えを行ない、処理を終了する（Ｓ７０７）。この並べ替えをおこなう理由は、このデータフローの順に、計算機上で実行可能なプログラム言語（例えばＣ言語）に変換をするよう想定しているので、データの流れる順番にデータフローの要素を並べる必要があるからである。
【００４４】
こうして、図１のデータフロー解析ステップ（Ｓ１０１）における状態レジスタからのデータフローの生成、すなわち、データフローの状態レジスタや「組み合わせ回路／ラッチ」から成るデータフローが生成される。以下、その具体例を説明する。
【００４５】
例：状態レジスタからのデータフローを求める。
状態レジスタをユーザから指定されたとして、あるプログラムに対する状態レジスタからのデータフローは、次のように求められる。まず、ユーザから指定された状態レジスタとして、以下の状態レジスタが見つけられ、データフローに挿入される。
【００４６】
【数１】
／／状態レジスタ
ｓｔａｔｅ　＜＝　ｎｅｘｔ＿ｓｔａｔｅ；
【００４７】
次に、状態レジスタの出力信号が伝播する「組み合わせ回路／ラッチ」が見つけられ、データフローに挿入される。ここでは以下の、制御信号出力部と次状態決定部が見つけられ、　データフローに挿入される。
【００４８】
【数２】
／／制御信号出力部
ｃａｓｅ　（ｓｔａｔｅ）
０：ｂｅｇｉｎ
ｍ１ｃ　＜＝　１’ｂ０；
ｍ２ｃ　＜＝　１’ｂ０；
ｍ３ｃ　＜＝　１’ｂ０；
ｖ３ｃ　＜＝　１’ｂ１；
ｖ４ｃ　＜＝　１’ｂ１；
ｖ６ｃ　＜＝　１’ｂ０；
ｖ５ｃ　＜＝　１’ｂ０；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
ｅｎｄ
１：ｂｅｇｉｎ
ｍ１ｃ　＜＝　１’ｂ１；
ｍ２ｃ　＜＝　１’ｂ１；
ｍ３ｃ　＜＝　１’ｂ１；
ｖ３ｃ　＜＝　１’ｂ０；
ｖ４ｃ　＜＝　１’ｂ０；
ｖ６ｃ　＜＝　１’ｂ１；
ｖ５ｃ　＜＝　１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｅｎｄ
２：ｂｅｇｉｎ
ｍ１ｃ　＜＝　１’ｂ０；
ｍ２ｃ　＜＝　１’ｂ０；
ｍ３ｃ　＜＝　１’ｂ０；
ｖ３ｃ　＜＝　１’ｂ０；
ｖ４ｃ　＜＝　１’ｂ０；
ｖ６ｃ　＜＝　１’ｂ１；
ｖ５ｃ　＜＝　１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｅｎｄ
ｅｎｄｃａｓｅ
／／次状態決定部
ｃａｓｅ　（ｓｔａｔｅ）
０：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　１；
ｅｎｄ
１：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　２；
ｅｎｄ
２：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　０；
ｅｎｄ
ｅｎｄｃａｓｅ
【００４９】
（２−２−２）データパス部レジスタからのデータフローを生成…図８
図８は、データパス部レジスタＢ１からのデータフロー生成ステップにおける動作フローを示す。データパス部のレジスタＢ１とは、データパス部Ｂで同期信号に同期して動作するレジスタを指す。まず、データパス部Ｂのレジスタを見つけ（Ｓ８０１）、状態レジスタＡ１からのデータフローとは異なる、新たなデータフローに挿入する（Ｓ８０３）。ただし、データフローに既にそのレジスタが存在していた場合は挿入しない（Ｓ８０２）。
【００５０】
全てのデータパス部レジスタを挿入した後（Ｓ８０４のＹＥＳ）、データフローの前方要素であるレジスタの出力が、後方要素であるレジスタの入力とならないような順番に、並べ替えをおこなう（Ｓ８０５）。この並べ替えをおこなう理由は、このデータフローの順に、計算機上で実行可能なプログラム言語（例えばＣ言語）に変換をすることを想定しているので、前方要素であるレジスタの出力が、後方要素であるレジスタの入力になっていた場合、上から順番に実行されると、これらのレジスタが同時に動作することを期待しているＨＤＬのデータの流れと、矛盾が生じてしまうためである。
【００５１】
次に、データフローに挿入されたデータパス部レジスタの出力信号から信号が伝播する「組み合わせ回路／ラッチ」を見つけ（Ｓ８０６）、その「組み合わせ回路／ラッチ」がデータフローに存在していなければ（Ｓ８０７のＮＯ）順次データフローに挿入する（Ｓ８０８）。
【００５２】
信号が伝播する「組み合わせ回路／ラッチ」全てがデータフローに挿入されたら（Ｓ８０９のＹＥＳ）、データフローへの回路の挿入は終了し、データフロー内の「組み合わせ回路／ラッチ」の並べ替えを、状態レジスタからのデータフロー生成ステップと同様に行ない（Ｓ８１０）、処理を終了する。こうして、データパス部レジスタや「組み合わせ回路／ラッチ」等から成るデータフローが、生成される。
【００５３】
例１：データパス部レジスタのデータフローにおける順番について。
データフローにおいて、以下のようなレジスタの並びがあってははならない。なぜなら、計算機上で実行可能なプログラム言語（例えばＣ言語）に変換した際、信号ａ　への代入が実行され、信号ｉｎ　が信号ｏｕｔ　に筒抜けになってしまうからである。ハードウェアでは、例えば同じ同期信号の立ち上がりに同期する２つのレジスタは、信号の立ち上がり時のみに同時に動作して、その後は動作しないので、信号ｉｎ　と信号ｏｕｔ　は筒抜けにはならない。
【数３】
ａ　＜＝　ｉｎ；ｏｕｔ　＜＝　ａ；
そのため、上記のような場合はレジスタの順番を以下のように変えることで対処する。
【数４】
ｏｕｔ　＜＝　ａ；ａ　＜＝　ｉｎ；
【００５４】
また、以下のようなレジスタの並びの場合、順番を入れ替えてもやはりハードウェアとの矛盾が生じてしまう。
【数５】
ｏｕｔ　＜＝　ｉｎ；ｉｎ　＜＝　ｏｕｔ；
そのため、上記のような場合は一時的な変数を作成して対処する。
【数６】
ｔｍｐ＿ｏｕｔ　＜＝　ｉｎ；
ｉｎ　＜＝　ｏｕｔ；
ｏｕｔ　＝　ｔｍｐ＿ｏｕｔ；
【００５５】
例２：　データパス部レジスタのデータフローの例。
あるプログラムに対するデータパス部レジスタからのデータフローの例を以下に示す。以下の例において、データフローの前半はレジスタからなり、後半は「組み合わせ回路／ラッチ」からなる。レジスタの並びによる問題や、同じ「組み合わせ回路／ラッチ」が選択される問題は生じていないことが分かる。
【００５６】
【数７】
＜ＲＥＧＩＳＴＥＲ＞
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ｂ＿ｍｕｘ＿ｃ；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ａ＿ｍｕｘ＿ｃ；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｉｆ（（ｖ３ｃ＝＝１’ｂ１））
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｉｆ（（ｖ４ｃ＝＝１’ｂ１））
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝ｍ３ｃ；
ｍ２ｃ＿ｏｕｔ　＜＝ｍ２ｃ；
ｍ１ｃ＿ｏｕｔ　＜＝ｍ１ｃ；
ｉｆ（（ｖ６ｃ＝＝１’ｂ１））
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｉｆ（（ｖ５ｃ＝＝１’ｂ１））
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
＜ＣＯＭＢ＿ＢＬＯＣＫ＞
ｂ＿ｍｕｘ＿ｏｕｔ　＝（（ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ３＿ｏｕｔ　：　ｖ５＿ｏｕｔ）；ａ＿ｍｕｘ＿ｏｕｔ　＝（（ａ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ４＿ｏｕｔ　：　ｖ６＿ｏｕｔ）；ｍｕ３＿ｏｕｔ　＝（（ｍ３ｃ＿ｏｕｔ＝＝１’ｂ１）？　ａ＿ｍｕｘ＿ｏｕｔ　：　ｖ２＿ｏｕｔ）；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｍｕ３＿ｏｕｔ＋ｂ＿ｍｕｘ＿ｏｕｔ）；ｍｕ１＿ｏｕｔ　＝（（ｍ１ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ１＿ｏｕｔ　：　ｂ＿ｍｕｘ＿ｏｕｔ）；
ｍｕ２＿ｏｕｔ　＝（（ｍ２ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ２＿ｏｕｔ　：　ａ＿ｍｕｘ＿ｏｕｔ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕ１＿ｏｕｔ＊ｍｕ２＿ｏｕｔ）；
【００５７】
（２−２−３）外部入力信号からのデータフロー生成…図９
図９は、図１のデータフロー解析ステップ（Ｓ１０２）における外部入力信号からのデータフロー生成の動作フローを示す。まず、右辺が外部入力信号と定数のみからなる「組み合わせ回路／ラッチ」を見つけ（Ｓ９０１）、新たなデータフローに挿入する（Ｓ９０２）。ただし、データフローに既にその「組み合わせ回路／ラッチ」が存在していた場合は挿入しない（Ｓ９０２のＹＥＳ）。
【００５８】
全ての「組み合わせ回路／ラッチ」を挿入した後（Ｓ９０４のＹＥＳ）、挿入された回路の出力信号と外部入力信号と定数のみから右辺が構成される「組み合わせ回路／ラッチ」を見つけ（Ｓ９０５）、データフローに挿入する（Ｓ９０７）。この場合も、データフローに既にその「組み合わせ回路／ラッチ」が存在していた場合は挿入しない（Ｓ９０６のＹＥＳ）。また、データフローの挿入に当たっては、他のデータフロー生成ステップと同様の理由により、同じ回路が重複しないようにする。
【００５９】
データフロー内の全ての要素の全ての出力を探索した後は（Ｓ９０８のＹＥＳ）、やはり他のデータフロー生成ステップと同様に、データフローの前方要素が後方要素の入力とならないような順番に、要素の並べ替えを行い（Ｓ９０９）、処理を終了する。
【００６０】
（２−３）制御構造の再構築ステップ（Ｓ１０３）…図１０
前記のようにして、図１のデータフロー解析ステップ（Ｓ１０２）において、状態レジスタＡ１、データパス部のレジスタＢ１、及び外部信号からのデータフローが生成された後は、状態レジスタＡ１からのデータフローに基づいて制御構造を再構築する。
すなわち、状態の存在と状態間の遷移を明らかにするためには、回路の制御構造を知ることが必要であって、回路の制御構造は、状態レジスタ、制御信号出力部、次状態決定部を解析することで知ることが出来る。状態レジスタ、制御信号出力部、次状態決定部から成るデータフローは、データフロー解析ステップで求められた、状態レジスタからのデータフローに相当する。
【００６１】
図１０は、制御構造再構築ステップにおける動作フローを示す。
状態レジスタからのデータフロー解析ステップ（Ｓ１０２）で求められた、状態レジスタからのデータフローより、状態レジスタを選択し（Ｓ１００１）、新たなデータフローである制御構造再構築データフローに挿入する（Ｓ１００２）。このとき、状態レジスタが条件分岐式であり、かつ、条件部（ｉｆ　文とｃａｓｅ　文の条件式やｃａｓｅ　文のラベルに相当）に状態レジスタを含む場合、これをステートマシン本体（ＦＳＭ）とする。
【００６２】
また、状態レジスタがステートマシン本体ではなかった場合（Ｓ１００３のＮＯ）、状態レジスタからのデータフローより、状態レジスタの出力信号が伝播する「組み合わせ回路／ラッチ」を選択し（Ｓ１００４）、同様に制御構造データフローに挿入し（Ｓ１００５）、ステートマシン本体かどうかの判定を行なう（Ｓ１００６）。この場合のステートマシン本体の判定も、条件分岐式であり、かつ、条件部（ｉｆ　文とｃａｓｅ　文の条件式やｃａｓｅ文のラベルに相当）に状態レジスタを含む時とする。
【００６３】
ステートマシン本体の発見が終了したら（Ｓ１００３のＹ、Ｓ１００６のＹＥＳ）、状態レジスタからのデータフロー内の要素のうち、制御構造再構築データフロー内に含まれていない要素列をステートマシン本体の各分岐箇所の式の後にコピーする（Ｓ１００７）。ここで、ステートマシン本体中のそれぞれの分岐内は、それぞれの状態とみなすことができる。こうして出来た制御構造再構築データフローを、制御構造とみなす（Ｓ１００８）。
【００６４】
例：制御構造として、ステートマシン本体（ＦＳＭ）を抽出する。
一般的にＲＴＬのＨＤＬにおいて、制御部ＡはＦＳＭで記述された仕様を満たすように構成される。ここでは、制御構造として、ＦＳＭを例に挙げて説明する。
ＦＳＭは一般的に、状態レジスタＡ１、制御信号出力部Ａ２、次状態決定部Ａ３により構成され、実現される。そのため、状態レジスタＡ１、制御信号出力部Ａ２、次状態決定部Ａ３を含むデータフローを解析することで、ＦＳＭを抽出することが可能である。
【００６５】
状態レジスタＡ１からのデータフローを求めるステップにおける例から抽出されたＦＳＭは以下のようになる。次状態決定部Ａ３は、制御信号出力部Ａ２の中にコピーされ、条件式が計算されることで単純な式に変換された。
【００６６】
【数８】
ｓｔａｔｅ　＜＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｃａｓｅ　（ｓｔａｔｅ）
０：ｂｅｇｉｎｍ１ｃ　＜＝　１’ｂ０；
ｍ２ｃ　＜＝　１’ｂ０；
ｍ３ｃ　＜＝　１’ｂ０；
ｖ３ｃ　＜＝　１’ｂ１；
ｖ４ｃ　＜＝　１’ｂ１；
ｖ６ｃ　＜＝　１’ｂ０；
ｖ５ｃ　＜＝　１’ｂ０；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　１；
ｅｎｄ
１：ｂｅｇｉｎ
ｍ１ｃ　＜＝　１’ｂ１；
ｍ２ｃ　＜＝　１’ｂ１；
ｍ３ｃ　＜＝　１’ｂ１；
ｖ３ｃ　＜＝　１’ｂ０；
ｖ４ｃ　＜＝　１’ｂ０；
ｖ６ｃ　＜＝　１’ｂ１；
ｖ５ｃ　＜＝　１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　２；
ｅｎｄ
２：ｂｅｇｉｎ
ｍ１ｃ　＜＝　１’ｂ０；
ｍ２ｃ　＜＝　１’ｂ０；
ｍ３ｃ　＜＝　１’ｂ０；
ｖ３ｃ　＜＝　１’ｂ０；
ｖ４ｃ　＜＝　１’ｂ０；
ｖ６ｃ　＜＝　１’ｂ１；
ｖ５ｃ　＜＝　１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　０；
ｅｎｄ
ｅｎｄｃａｓｅ
【００６７】
また、抽出されたＦＳＭの状態遷移図を図１１に示す。図１１では、それぞれの状態ＳＴＡＴＥ１，ＳＴＡＴＥ２，ＳＴＡＴＥ３と、各状態における制御信号の出力式が表されている。
【００６８】
（２−４）データフロー再構築ステップ（Ｓ１０４）図１２，図１３
このステップでは、再構築された制御構造の各状態において、動作するデータパス部のレジスタＢ１からのデータフローを生成する。そのために、前記データフロー解析ステップ（Ｓ１０２）において、データパス部レジスタＢ１からのデータフローを求める処理により出力された、データフローを元に、データフローの再構築を行う。すなわち、図１２の動作フローに示すように、制御構造から所定の状態を選択して現状態とし（Ｓ１２０１）、その現状態のデータパス部レジスタからのデータフローを再構築する（Ｓ１２０２）。そして、この処理を制御構造内の全ての状態について行う（Ｓ１２０３）。ここで、動作するレジスタとは、制御信号を入力とし、かつ、動作するデータパス部のレジスタか、または、どの状態でも動作するレジスタのことを指す。
【００６９】
図１３は、前記図１２におけるデータフローの再構築ステップ（Ｓ１２０２）の詳細を示す動作フローである。この図１３に示すように、データパス部のレジスタを、データパス部レジスタからのデータフロー生成ステップから出力されるデータフローから見つける（Ｓ１３０１）。そのレジスタがデータパス部再構築データフローに存在しておらず（Ｓ１３０２のＮＯ）、かつ、現状態で動作する場合は（Ｓ１３０３のＹＥＳ）、そのレジスタは制御信号を入力とするか否かを判定する（Ｓ１３０４）。そのレジスタが制御信号を入力とする場合には、制御信号を入力して削除されない分岐式を削除した後（Ｓ１３０５）、新たなデータフローであるデータパス部再構築データフローに挿入する（Ｓ１３０６）。一方、そのレジスタが制御信号を入力としない場合には（Ｓ１３０４のＮＯ）、そのまま新たなデータフローであるデータパス部再構築データフローに挿入する（Ｓ１３０６）。
【００７０】
例１：動作するデータパス部レジスタをデータパス部再構築データフローに挿入する。
ある状態における制御信号が以下のような場合、
【数９】
ｅ１　＜＝　１’ｂ０；
ｅ２　＜＝　１’ｂ１；
以下のレジスタは動作しないので、データパス部再構築データフローには挿入されない（Ｓ１３０３のＮＯ）。
【数１０】
ｉｆ　（ｅ１　＝＝　１’ｂ１）ｏｕｔ１　＜＝　ｉｎ１；
【００７１】
以下のレジスタは動作するので、データパス部再構築データフローに挿入される（Ｓ１３０３のＹＥＳ）。
【数１１】
ｉｆ　（ｅ２　＝＝　１’ｂ１）ｏｕｔ２　＜＝　ｉｎ２；
また、以下のレジスタは、どの状態でも動作するので、データパス部再構築データフローに常に挿入される（Ｓ１３０３のＹＥＳ）。
【数１２】
ｏｕｔ３　＜＝　ｉｎ３；
【００７２】
ある状態において動作すると認められたレジスタに、条件分岐式が記述されており、かつ、制御信号を代入することで条件分岐が一意に決定される場合、選択されない分岐式をレジスタから削除することができる（Ｓ１３０５）。
【００７３】
例２：選択されない分岐式をレジスタから削除
ある状態における制御信号が以下のような場合、
【数１３】
ｅ１　＜＝　１’ｂ１；
ｅ２　＜＝　１’ｂ０；
以下のレジスタにおいて、ｅｌｓｅ　ｉｆ　の分岐式は選択されることがないので、削除の対象となり（Ｓ１３０５）、
【数１４】
ｉｆ　（ｅ１　＝＝　１’ｂ１）ｏｕｔ１　＜＝　ｉｎ１；
ｅｌｓｅ　ｉｆ　（ｅ２　＝＝　１’ｂ１）ｏｕｔ２　＜＝　ｉｎ２；
以下のような、簡潔な形に変形され、データパス部再構築データフローに挿入される（Ｓ１３０６）。
【数１５】
ｏｕｔ１　＜＝　ｉｎ１；
【００７４】
前記のようにしてデータパス部のレジスタＢ１からのデータフロー内の全てのレジスタを探索した後は（Ｓ１３０７）、データパス部再構築データフロー内の要素である、現状態で動作するレジスタの出力信号が伝播する「組み合わせ回路／ラッチ」を、データパス部レジスタからのデータフロー内から選択し（Ｓ１３０８）、データパス部再構築データフロー内に存在しない場合（Ｓ１３０９のＮＯ）、順次、データパス部再構築データフローに挿入する（Ｓ１３１０）。そして、データパス部再構築データフロー内の全ての要素の全ての出力を探索した後は（Ｓ１３１１のＹＥＳ）、データパス部レジスタＢ１からのデータフロー再構築ステップを終了する。
【００７５】
このようにして本ステップにおいては、レジスタから、選択されない分岐式を削除したことにより（Ｓ１３０５）、信号が伝播しない「組み合わせ回路／ラッチ」は選択されないため、冗長性が削除されたデータフローの形に再構築される。こうして、データパス部レジスタや「組み合わせ回路／ラッチ」等から成る再構築されたデータフローが、制御構造の状態数分、生成される。
【００７６】
例３：データパス部データフロー再構築の例
データパス部レジスタからのデータフローの生成ステップで例にあげたデータフローに対して、制御構造再構築ステップで例にあげたＦＳＭの状態０でのデータパス部データフロー再構築の例を以下に示す。状態０での制御信号は以下である。
【００７７】
【数１６】
／／制御信号
ｍ１ｃ　＜＝　１’ｂ０；
ｍ２ｃ　＜＝　１’ｂ０；
ｍ３ｃ　＜＝　１’ｂ０；
ｖ３ｃ　＜＝　１’ｂ１；
ｖ４ｃ　＜＝　１’ｂ１；
ｖ６ｃ　＜＝　１’ｂ０；
ｖ５ｃ　＜＝　１’ｂ０；
ａ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
ｂ＿ｍｕｘ＿ｃ　＜＝　１’ｂ１；
【００７８】
また、再構築前のデータフローは以下である。
【００７９】
【数１７】
／／データフロー
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ｂ＿ｍｕｘ＿ｃ；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ａ＿ｍｕｘ＿ｃ；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｉｆ（（ｖ３ｃ＝＝１’ｂ１））
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｉｆ（（ｖ４ｃ＝＝１’ｂ１））
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝ｍ３ｃ；
ｍ２ｃ＿ｏｕｔ　＜＝ｍ２ｃ；
ｍ１ｃ＿ｏｕｔ　＜＝ｍ１ｃ；
ｉｆ（（ｖ６ｃ＝＝１’ｂ１））
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｉｆ（（ｖ５ｃ＝＝１’ｂ１））
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
＜ＣＯＭＢ＿ＢＬＯＣＫ＞
ｂ＿ｍｕｘ＿ｏｕｔ　＝（（ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ３＿ｏｕｔ　：　ｖ５＿ｏｕｔ）；ａ＿ｍｕｘ＿ｏｕｔ　＝（（ａ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ４＿ｏｕｔ　：　ｖ６＿ｏｕｔ）；ｍｕ３＿ｏｕｔ　＝（（ｍ３ｃ＿ｏｕｔ＝＝１’ｂ１）？　ａ＿ｍｕｘ＿ｏｕｔ　：　ｖ２＿ｏｕｔ）；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｍｕ３＿ｏｕｔ＋ｂ＿ｍｕｘ＿ｏｕｔ）；ｍｕ１＿ｏｕｔ　＝（（ｍ１ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ１＿ｏｕｔ　：　ｂ＿ｍｕｘ＿ｏｕｔ）；
ｍｕ２＿ｏｕｔ　＝（（ｍ２ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ２＿ｏｕｔ　：　ａ＿ｍｕｘ＿ｏｕｔ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕ１＿ｏｕｔ＊ｍｕ２＿ｏｕｔ）；
【００８０】
上で示した制御信号により動作するレジスタを選択してデータフローを再構築した結果のデータフローを以下に示す。
【００８１】
【数１８】
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ｂ＿ｍｕｘ＿ｃ；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝ａ＿ｍｕｘ＿ｃ；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝ｍ３ｃ；
ｍ２ｃ＿ｏｕｔ　＜＝ｍ２ｃ；
ｍ１ｃ＿ｏｕｔ　＜＝ｍ１ｃ；
ｂ＿ｍｕｘ＿ｏｕｔ　＝（（ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ３＿ｏｕｔ　：　ｖ５＿ｏｕｔ）；ａ＿ｍｕｘ＿ｏｕｔ　＝（（ａ＿ｍｕｘ＿ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ４＿ｏｕｔ　：　ｖ６＿ｏｕｔ）；ｍｕ３＿ｏｕｔ　＝（（ｍ３ｃ＿ｏｕｔ＝＝１’ｂ１）？　ａ＿ｍｕｘ＿ｏｕｔ　：　ｖ２＿ｏｕｔ）；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｍｕ３＿ｏｕｔ＋ｂ＿ｍｕｘ＿ｏｕｔ）；ｍｕ１＿ｏｕｔ　＝（（ｍ１ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ１＿ｏｕｔ　：　ｂ＿ｍｕｘ＿ｏｕｔ）；
ｍｕ２＿ｏｕｔ　＝（（ｍ２ｃ＿ｏｕｔ＝＝１’ｂ１）？　ｖ２＿ｏｕｔ　：　ａ＿ｍｕｘ＿ｏｕｔ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕ１＿ｏｕｔ＊ｍｕ２＿ｏｕｔ）；
【００８２】
（２−５）再構築されたデータパス部データフローに対し，信号代入と冗長な式の削除を行なうステップ（Ｓ１０５）…図１４
図１４は、本ステップ（Ｓ１０５）の動作フローを示す。本ステップにおいては、前記のデータフロー再構築ステップ（Ｓ１０４）で再構築されたデータパス部データフローに、ある状態で動作するレジスタと信号が伝播する「組み合わせ回路／ラッチ」が挿入された後、その状態における制御信号を、再構築されたデータパス部データフローの先頭に挿入し（Ｓ１４０１）、データフロー内の後式への前式の代入をおこなう（Ｓ１４０２）。その後、再構築されたデータパス部データフローから冗長な式を削除し（Ｓ１４０３）、最後に再構築されたデータパス部データフローの先頭から現状態の制御信号を削除する（Ｓ１４０５）。
【００８３】
ただし、前記のデータフロー内の後式への前式の代入ステップ（Ｓ１４０２）には、以下のような条件がある。
（１）　前式と後式がどちらもレジスタの場合は代入不可。
（２）　後式の出力に、前式の入力信号と一致する信号が存在した場合、後式より後の式には、前式は代入不可。
（３）　前式が、入力と出力に同じ信号が存在する場合は代入不可。
（４）　代入される信号がｉｎｏｕｔ　信号の場合は代入不可。
【００８４】
例１：　代入ができない例
以下の場合、式２の出力に、式１の入力信号と一致する信号が存在するため、式２より後の式、つまり式３以降には、式１を代入することができない。
【数１９】
／／　代入前
ｂ　＝　ｃ；　　　／／式１
ｃ　＝　ａ　＊　ｂ；　／／式２
ａ　＝　ａ　＋　ｂ；　／／式３
【００８５】
もし代入すると以下のようになり、代入前とは明らかに結果が異なってしまう。
【数２０】
／／　代入後
ｂ　＝　ｃ；　／／式１
ｃ　＝　ａ　＊　ｃ；　／／式２
ａ　＝　ａ　＋　ｃ；　／／式３
【００８６】
本ステップ（Ｓ１０５）は、この式代入ステップ（Ｓ１４０２）で処理を終えてもかまわないが、この後、冗長な式を削除することで（Ｓ１４０３）、さらに好ましい結果を得ることが出来る。すなわち、再構築されたデータフロー内において、式の代入を行なったことにより、条件分岐式の条件分岐が一意に決定される場合、選択されない分岐式を式から削除する。また、削除された式からのみ信号が伝播していく「組み合わせ回路／ラッチ」も、再構築されたデータフローから削除する。
【００８７】
例２　代入と冗長な式を削除した例
データパス部レジスタからのデータフロー再構築ステップの例において示した、再構築したデータフローの結果に対して，制御信号を先頭に挿入して、信号代入をおこなって、選択されない分岐式を削除し、制御信号を削除した結果を以下に示す。
【００８８】
【数２１】
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｖ３＿ｉｎ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ｖ４＿ｉｎ；
ｍｕ３＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）；
（ＲＤＣ）［ＳＥＬ］　１７ｍｕ１＿ｏｕｔ　＝ｖ３＿ｉｎ；
ｍｕ２＿ｏｕｔ　＝ｖ４＿ｉｎ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）；
【００８９】
（２−６）制御構造とデータフローの併合ステップ（Ｓ１０６）…図１５
図１５は、制御構造とデータフローの併合ステップにおける動作フローを示す。本ステップ（Ｓ１０６）においては、制御構造再構築ステップの出力である制御構造の中から、１つの状態を選択し、データパス部データフロー再構築ステップの出力である、それぞれの状態のデータフローの中からその状態にあたるデータフローを選択し、状態にデータフローをマッピングする。マッピングは、制御構造中の全状態に対しておこなう。
【００９０】
すなわち、図１５に示すように、制御構造から所定の状態を選択して現状態とし（Ｓ１５０１）、現状態の再構築されたデータパス部データフローを併合する（Ｓ１５０２）。制御構造内の全ての状態を選択してデータフローの併合を行った後は（Ｓ１５０３のＹＥＳ）、外部入力からのデータフロー生成ステップにより得た、データフローを制御構造の先頭に付加する（Ｓ１５０４）。こうして併合されたものを、ビヘイビアレベルの中間語として出力する（Ｓ１５０５）。
【００９１】
例：ＦＳＭとデータパス部データフローの併合。
ここでは、制御構造再構築ステップにおいて、ＦＳＭを出力した場合の例を示す。制御構造再構築ステップから出力されたＦＳＭに、データパス部データフローの再構築ステップから出力されたデータフローを挿入した後のＦＳＭは以下のようになる。これを、中間語として出力する。
【００９２】
【数２２】
ｓｔａｔｅ　＜＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｃａｓｅ（ｓｔａｔｅ）
０：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ０；
ｍ２ｃ　＜＝１’ｂ０；
ｍ３ｃ　＜＝１’ｂ０；
ｖ３ｃ　＜＝１’ｂ１；
ｖ４ｃ　＜＝１’ｂ１；
ｖ６ｃ　＜＝１’ｂ０；
ｖ５ｃ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ１；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ１；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　１；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｖ３＿ｉｎ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ｖ４＿ｉｎ；
ｍｕ３＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）；
ｍｕ１＿ｏｕｔ　＝ｖ３＿ｉｎ；
ｍｕ２＿ｏｕｔ　＝ｖ４＿ｉｎ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）；
ｅｎｄ
１：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ１；
ｍ２ｃ　＜＝１’ｂ１；
ｍ３ｃ　＜＝１’ｂ１；
ｖ３ｃ　＜＝１’ｂ０；
ｖ４ｃ　＜＝１’ｂ０；
ｖ６ｃ　＜＝１’ｂ１；
ｖ５ｃ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　２；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
ｍｕ３＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）；
ｍｕ１＿ｏｕｔ　＝ｖ１＿ｉｎ；
ｍｕ２＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）；
ｅｎｄ
２：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ０；
ｍ２ｃ　＜＝１’ｂ０；
ｍ３ｃ　＜＝１’ｂ０；
ｖ３ｃ　＜＝１’ｂ０；
ｖ４ｃ　＜＝１’ｂ０；
ｖ６ｃ　＜＝１’ｂ１；
ｖ５ｃ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　０；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
ｍｕ３＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）；
ｍｕ１＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ｍｕ２＿ｏｕｔ　＝ｖ６＿ｏｕｔ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）；
ｅｎｄ
ｅｎｄｃａｓｅ
【００９３】
（２−７）中間語の冗長な式の削除ステップ（Ｓ１０７）…図１６
制御構造とデータフローの併合ステップで得た中間語は、その前のステップで、制御信号がデータフローに代入されたり、データフロー内の式間での代入が行われているため、データフロー内の式の入力信号の種類が少なくなっており、同じ信号が多く存在するようになる。そのため、代入前には必要であった式が不要になることがある。このステップ（Ｓ１０７）では、中間語に対して冗長な式を削除する。
【００９４】
図１６は、本ステップの作業処理の一例を示すフローチャートである。すなわち、中間語から所定の式を選択して（Ｓ１６０１）、その選択した式の全ての出力信号が中間語内の任意の式の入力となっているかを判定し、入力となっている場合には（Ｓ１６０２のＮＯ）、ステップＳ１６０１に戻り次の式を選択する。入力となっていない場合には（Ｓ１６０２のＹＥＳ）、選択した式の全ての出力信号が外部信号でないか否かを判定し、外部信号である場合には（Ｓ１６０３のＮＯ）、ステップＳ１６０１に戻り次の式を選択する。外部信号でない場合には（Ｓ１６０３のＹＥＳ）、選択した式を中間語から削除する（Ｓ１６０４）。この作業を全ての式について実施し、中間語から全ての式の選択を行った後（Ｓ１６０５のＹＥＳ）、本ステップの処理を終了する。
【００９５】
ところで、中間語に対して冗長な式を削除する本ステップ（Ｓ１０７）において、具体的に冗長な式とは、その式のすべての出力信号に対して、それぞれを入力とする任意の式が存在しない場合を指す。ただし以下のような条件がある。
条件：出力信号が外部信号の場合、削除不可。
以下、この条件に従って、中間語の冗長な式を削除する処理の具体例を示す。。
【００９６】
例：中間語の冗長な式を削除する。
制御構造とデータフローの併合ステップで得た中間語が以下のような場合、出力信号が、外部出力信号でなく、かつ、どの式の入力にもなっていない式は冗長であるため削除される。
【００９７】
【数２３】
ｓｔａｔｅ　＜＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｃａｓｅ（ｓｔａｔｅ）
０：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ０；
ｍ２ｃ　＜＝１’ｂ０；
ｍ３ｃ　＜＝１’ｂ０；
ｖ３ｃ　＜＝１’ｂ１；
ｖ４ｃ　＜＝１’ｂ１；
ｖ６ｃ　＜＝１’ｂ０；
ｖ５ｃ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ１；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ１；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　１；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｖ３＿ｏｕｔ　＜＝ｖ３＿ｉｎ；
ｖ４＿ｏｕｔ　＜＝ｖ４＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｖ３＿ｉｎ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ｖ４＿ｉｎ；
ｍｕ３＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）；
ｍｕ１＿ｏｕｔ　＝ｖ３＿ｉｎ；
ｍｕ２＿ｏｕｔ　＝ｖ４＿ｉｎ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）；
ｅｎｄ
１：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ１；
ｍ２ｃ　＜＝１’ｂ１；
ｍ３ｃ　＜＝１’ｂ１；
ｖ３ｃ　＜＝１’ｂ０；
ｖ４ｃ　＜＝１’ｂ０；
ｖ６ｃ　＜＝１’ｂ１；
ｖ５ｃ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　２；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ１；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
ｍｕ３＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）；
ｍｕ１＿ｏｕｔ　＝ｖ１＿ｉｎ；
ｍｕ２＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）；
ｅｎｄ
２：ｂｅｇｉｎ
ｍ１ｃ　＜＝１’ｂ０；
ｍ２ｃ　＜＝１’ｂ０；
ｍ３ｃ　＜＝１’ｂ０；
ｖ３ｃ　＜＝１’ｂ０；
ｖ４ｃ　＜＝１’ｂ０；
ｖ６ｃ　＜＝１’ｂ１；
ｖ５ｃ　＜＝１’ｂ１；
ａ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｂ＿ｍｕｘ＿ｃ　＜＝１’ｂ０；
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　０；
ｂ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ａ＿ｍｕｘ＿ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ２＿ｏｕｔ　＜＝ｖ２＿ｉｎ；
ｖ１＿ｏｕｔ　＜＝ｖ１＿ｉｎ；
ｍ３ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ２ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｍ１ｃ＿ｏｕｔ　＜＝１’ｂ０；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
ｖ５＿ｏｕｔ　＜＝ｍｕｌ＿ｏｕｔ；
ｂ＿ｍｕｘ＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ａ＿ｍｕｘ＿ｏｕｔ　＝ａｄｄ＿ｏｕｔ；
ｍｕ３＿ｏｕｔ　＝ｖ２＿ｉｎ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）；
ｍｕ１＿ｏｕｔ　＝ｍｕｌ＿ｏｕｔ；
ｍｕ２＿ｏｕｔ　＝ｖ６＿ｏｕｔ；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）；
ｅｎｄ
ｅｎｄｃａｓｅ
【００９８】
以下は前記の中間語から冗長な式を削除して再構築したものを示している。この再構築されたＦＳＭを、ビヘイビアレベルの中間語として出力する。
【００９９】
【数２４】
ｓｔａｔｅ　＜＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｃａｓｅ（ｓｔａｔｅ）
０：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　１；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）；
ｅｎｄ
１：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　２；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）；
ｅｎｄ
２：ｂｅｇｉｎ
ｎｅｘｔ＿ｓｔａｔｅ　＜＝　０；
ｖ６＿ｏｕｔ　＜＝ａｄｄ＿ｏｕｔ；
｛＿ａｄｄ＿＿ｔｍｐ，ａｄｄ＿ｏｕｔ｝　＝（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）；
｛＿ｍｕｌ＿＿ｔｍｐ，ｍｕｌ＿ｏｕｔ｝　＝（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）；
ｅｎｄ
ｅｎｄｃａｓｅ
【０１００】
（３）ビヘイビアレベルの中間語を、計算機上で実行可能なプログラム言語に変換するステップ（Ｓ１０８）
このステップ（Ｓ１０８）では、前記構成要素解析（Ｓ１０１）から、制御構造とデータフローの併合（Ｓ１０７）までのステップによって得られた中間語から、目的コード生成を行う。すなわち、制御構造とデータフローの併合ステップ（Ｓ１０６）、または、中間語の冗長式削除ステップ（Ｓ１０７）により出力されたビヘイビアレベルの中間語に対し、計算機上で実行可能なプログラム言語への変換をする。
【０１０１】
ここでは、計算機上で実行可能なプログラム言語の例としてＣ言語を挙げて、説明する。中間語は、上から式を逐次的に実行してもＨＤＬのデータの流れと矛盾が生じないようになっている。そのため、基本的に中間語の式をそのままの順序で、１対１で対応するＣ言語に変換することにより、目的とするＣ言語を生成できる。具体的な変換のルールの一例を表２，表３に示す。表２は、ポート、ネット、レジスタの変換ルールであり、表３はその他の変換ルールを示す。ただし、この中間語では数字はすべて２進数で表現されているものとする。
【０１０２】
【表１】
2004021841.tif 000003
【０１０３】
【表２】
2004021841.tif 000004
【０１０４】
ここで、連接演算はＣ言語には無い演算であるため、連接と等価な新たな式を生成する必要があるが、このとき、新たに生成された式のすべての出力信号に対して、それぞれを入力とする任意の式がＦＳＭ中に存在しない場合その式は削除する。ただし以下のような条件がある。
条件：出力信号が外部信号の場合、削除不可。
【０１０５】
例１：連接をＣ言語に変換する。
以下のような連接式の場合、信号ｃ　の下位８　ビットを信号ｂ　に入力するために、２５５　とビットごとのＡＮＤ　演算を行なう。また、信号ｃ　の上位８　ビットを信号ａ　に入力するため、信号ｃ　を８　ビット右シフトし、２５５　とビットごとのＡＮＤ　演算を行なう。
【数２５】
ｗｉｒｅ　［７：０］　ａ，　ｂ；
ｗｉｒｅ　［１５：０］　ｃ；
｛ａ，　ｂ｝　＝　ｃ；
【０１０６】
変換を行なった結果、以下のように、等価に変換される。
【数２６】
ｕｎｓｉｇｎｅｄ　ｌｏｎｇ　ａ，　ｂ，　ｃ；
ｂ　＝　ｃ　＆　２５５Ｕ；
ａ　＝　（ｃ　＞＞　８）＆　２５５Ｕ；
【０１０７】
例２：Ｃ言語へ変換する。
制御構造とデータフローの併合ステップで例にあげた中間語をＣ言語に変換した例を、以下に示す。基本的に、それぞれの式は１対１でＣ言語に変換されており、連接については上記の例に従って変換されている。
【０１０８】
【数２７】
ｓｔａｔｅ　＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｓｗｉｔｈ　（ｓｔａｔｅ）｛
ｃａｓｅ　０：
ｎｅｘｔ＿ｓｔａｔｅ　＝　１；
ａｄｄ＿ｏｕｔ　＝　（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）＆　２５５ＵＬ；
＿ａｄｄ＿＿ｔｍｐ　＝　（（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）＞＞　８）＆　１ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）＆　２５５ＵＬ；
＿ｍｕｌ＿＿ｔｍｐ　＝　（（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）＞＞　８）＆　２５５ＵＬ；
ｂｒｅａｋ；
ｃａｓｅ　１：
ｎｅｘｔ＿ｓｔａｔｅ　＝　２；
ｖ６＿ｏｕｔ　＝　ａｄｄ＿ｏｕｔ；
＿ａｄｄ＿＿ｔｍｐ　＝　（（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）＞＞　８）＆　１ＵＬ；
ａｄｄ＿ｏｕｔ　＝　（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）＆　２５５ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）＆　２５５ＵＬ；
＿ｍｕｌ＿＿ｔｍｐ　＝　（（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）＞＞　８）＆　２５５ＵＬ；
ｂｒｅａｋ；
ｃａｓｅ　２：
ｎｅｘｔ＿ｓｔａｔｅ　＝　０；
ｖ６＿ｏｕｔ　＝　ａｄｄ＿ｏｕｔ；
ａｄｄ＿ｏｕｔ　＝　（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）＆　２５５ＵＬ；
＿ａｄｄ＿＿ｔｍｐ　＝　（（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）＞＞　８）＆　１ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）＆　２５５ＵＬ；
＿ｍｕｌ＿＿ｔｍｐ　＝　（（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）＞＞　８）＆　２５５ＵＬ；
ｂｒｅａｋ；
｝
【０１０９】
その後、連接によって新たに生成された式のうち、冗長な式は削除し、以下のＣ言語ソースを得る。
【０１１０】
【数２８】
ｓｔａｔｅ　＝　ｎｅｘｔ＿ｓｔａｔｅ；
ｓｗｉｔｃｈ　（ｓｔａｔｅ）｛
ｃａｓｅ　０：
ｎｅｘｔ＿ｓｔａｔｅ　＝　１；
ａｄｄ＿ｏｕｔ　＝　（ｖ２＿ｉｎ＋ｖ３＿ｉｎ）＆　２５５ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｖ３＿ｉｎ＊ｖ４＿ｉｎ）＆　２５５ＵＬ；
ｂｒｅａｋ；
ｃａｓｅ　１：
ｎｅｘｔ＿ｓｔａｔｅ　＝　２；
ｖ６＿ｏｕｔ　＝　ａｄｄ＿ｏｕｔ；
ａｄｄ＿ｏｕｔ　＝　（ａｄｄ＿ｏｕｔ＋ｍｕｌ＿ｏｕｔ）＆　２５５ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｖ１＿ｉｎ＊ｖ２＿ｉｎ）＆　２５５ＵＬ；
ｂｒｅａｋ；
ｃａｓｅ　２：
ｎｅｘｔ＿ｓｔａｔｅ　＝　０；
ｖ６＿ｏｕｔ　＝　ａｄｄ＿ｏｕｔ；
ａｄｄ＿ｏｕｔ　＝　（ｖ２＿ｉｎ＋ｍｕｌ＿ｏｕｔ）＆　２５５ＵＬ；
ｍｕｌ＿ｏｕｔ　＝　（ｍｕｌ＿ｏｕｔ＊ｖ６＿ｏｕｔ）＆　２５５ＵＬ；
ｂｒｅａｋ；
｝
【０１１１】
（４）シミュレーションの実行。
以上にように本実施の形態によって、ＲＴＬのＶｅｒｉｌｏｇ−ＨＤＬソースから計算機上で実行可能なプログラム言語が変換された結果、これを利用してシミュレーションを実行することが可能になる。すなわち、ＭＰＵ／ＬＳＩ組み込みシステムの開発において、要求される機能を、システムの性能、製造コスト、開発コスト、消費電力などのパラメータを最適にするように、ハードウェアとソフトウェアに機能分割する必要がある。システム開発の上流で上記のような最適な機能分割を行なうような方法を、ハードウェア／ソフトウェア協調設計と呼ぶ。この最適な機能分割を行なうためには、設計レベルでハードウェア／ソフトウェア協調シミュレーションを行い、その結果を元に機能分割を検討するという作業を繰り返すことになる。
【０１１２】
このとき、ハードウェアはビヘイビアレベルで記述されており、このため、高速な検証が可能である。そのため、既にＲＴＬになったＨＤＬに対して本発明による変換をおこない、計算機上で実行可能なビヘイビアレベルプログラム言語を得ることで、ソフトウェアと組み合わせて高速な協調シミュレーションが可能となる。また、ＲＴＬ−ＨＤＬのＩＰを本発明により、計算機上で実行可能なプログラム言語に変換することで、やはりソフトウェアと組み合わせてシミュレーションが可能となる。
【０１１３】
また、ＬＳＩ設計の下流においてソフトウェアの検証を行なう際、ＲＴＬ−ＨＤＬの代わりに本発明により変換されたプログラム言語ソースを用いることで、高速なシミュレーションが可能となる。
【０１１４】
具体的なシミュレーションの方法を図１８に示す。本発明により変換され出力されたプログラム言語１は、ビヘイビアレベルのハードウェアプログラム言語ソース２やハードウェアプログラム言語ヘッダ３、及びソフトウェアプログラム言語ソース４やソフトウェアプログラム言語ヘッダ５などとともにプリプロセッサ６、コンパイラ７及びリンカ８に送られ、プリプロセス、コンパイル、リンクを行うことで、実行プログラム９を得て、シミュレーションの実行が可能となる。また、ビヘイビアレベルのハードウェアオブジェクト１０（例えば既存のＩＰ）とリンクしてシミュレーションすることも可能である。
【０１１５】
（５）実施の形態の効果
前記の実施の形態によって出力された計算機上で実行可能なプログラム言語を、従来技術により得られたプログラム言語と比較することで、発明の効果を示す。すなわち、入力したＶｅｒｉｌｏｇ−ＨＤＬソースが３００行から構成されている場合に、これを変換することによってＶｅｒｉｌｏｇ２Ｃ＋＋の出力したＣ＋＋言語ソースコードと、本発明により変換された計算機上で実行可能なプログラム言語（ここではＣ言語を用いた）とを表３に示す。この表３は、Ｃ／Ｃ＋＋ソースの有効コード行数と、出力ソースコードにｇｃｃ　によりコンパイルしたアセンブラコードのステップ数の比較を示す。
【０１１６】
【表３】
2004021841.tif 000005
【０１１７】
この表３により、確かに出力ソースコードの有効コード行数と、アセンブラコードのステップ数において、本発明に優位性があり、このことから、演算数の少ないソースコードが出力されていることが分かる。
【０１１８】
【発明の効果】
以上の通り、本発明によれば、制御部とデータパス部からなるハードウェア動作記述において、制御部から出力される制御信号とその信号によって決定されるデータパス部の等価回路を解析することにより、元の動作記述の入出力関係を保ったまま、最小の演算で等価な動作を行うプログラム言語を得ることができる。特に、ハードウェア動作記述から、ハードウェアの動作および計算機言語への変換において、冗長な演算を含まない出力結果を得ることが可能になり、得られた計算機言語の実行速度が格段に向上する。その結果、これを利用したシミュレーションも高速に行うことが可能となる。
【図面の簡単な説明】
【図１】本発明における各処理の一例を示すフローチャート。
【図２】本発明における構成要素解析ステップにおいて構成されたクラス図の一例を示す図。
【図３】本発明における上位層モジュールへの下位層モジュールのコピーの例を示す階層図。
【図４】ＲＴＬ回路の構成の例を示す回路図。
【図５】ソースとデータフローの対応の例を示す図。
【図６】本発明におけるデータフロー解析ステップにおいて構成されたクラス図の例を示す図。
【図７】本発明における状態レジスタからのデータフロー生成ステップの一例を示すフローチャート。
【図８】本発明におけるデータパス部レジスタからのデータフロー生成ステップの一例を示すフローチャート。
【図９】本発明における外部入力信号からのデータフロー生成ステップの一例を示すフローチャート。
【図１０】本発明における制御構造再構築ステップの一例を示すフローチャート。
【図１１】本発明における制御構造再構築抽出ステップで、制御構造の例としてＦＳＭを適用した場合の、抽出されたＦＳＭを示す図。
【図１２】本発明におけるデータフロー再構築ステップの作業フロー全体を示すフローチャート。
【図１３】本発明における各状態のデータフロー再構築ステップの一例を示すフローチャート。
【図１４】本発明における再構築されたデータパス部データフローの信号代入ステップと冗長式削除ステップの一例を示すフローチャート。
【図１５】本発明における制御構造とデータフローの併合ステップの一例を示すフローチャート。
【図１６】本発明における中間語の冗長式削除ステップの一例を示すフローチャート。
【図１７】本発明における計算機上で実行可能なプログラム言語変換ステップの一例を示すフローチャート。
【図１８】本発明におけるシミュレーション実行ステップの一例を示すフローチャート。
【図１９】制御部Ａとデータパス部Ｂとを有するハードウェアの実行順序（並行動作）を示す図。
【図２０】図１９のハードウェアに関して、Ｖｅｒｉｌｏｇ２Ｃ＋＋が出力する計算機上で実行可能なプログラム言語の実行順序（逐次動作）を示す図。
【図２１】図１９のハードウェアに関して、本発明が出力する計算機上で実行可能なプログラム言語の実行順序（逐次動作）を示す図。
【符号の説明】
１…プログラム言語
２…ハードウェアプログラム言語ソース
３…ハードウェアプログラム言語ヘッダ
４…ソフトウェアプログラム言語ソース
５…ソフトウェアプログラム言語ヘッダ
６…プリプロセッサ
７…コンパイラ
８…リンカ８
９…実行プログラム９
１０…ハードウェアオブジェクト
【図１】
2004021841.tif 000006
【図２】
2004021841.tif 000007
【図３】
2004021841.tif 000008
【図４】
2004021841.tif 000009
【図５】
2004021841.tif 000010
【図６】
2004021841.tif 000011
【図７】
2004021841.tif 000012
【図８】
2004021841.tif 000013
【図９】
2004021841.tif 000014
【図１０】
2004021841.tif 000015
【図１１】
2004021841.tif 000016
【図１２】
2004021841.tif 000017
【図１３】
2004021841.tif 000018
【図１４】
2004021841.tif 000019
【図１５】
2004021841.tif 000020
【図１６】
2004021841.tif 000021
【図１７】
2004021841.tif 000022
【図１８】
2004021841.tif 000023
【図１９】
2004021841.tif 000024
【図２０】
2004021841.tif 000025
【図２１】
2004021841.tif 000026