JPWO2004036463A1 - コンパイラ及び論理回路の設計方法 - Google Patents

コンパイラ及び論理回路の設計方法 Download PDF

Info

Publication number
JPWO2004036463A1
JPWO2004036463A1 JP2004544923A JP2004544923A JPWO2004036463A1 JP WO2004036463 A1 JPWO2004036463 A1 JP WO2004036463A1 JP 2004544923 A JP2004544923 A JP 2004544923A JP 2004544923 A JP2004544923 A JP 2004544923A JP WO2004036463 A1 JPWO2004036463 A1 JP WO2004036463A1
Authority
JP
Japan
Prior art keywords
description
program
variable
circuit
language
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2004544923A
Other languages
English (en)
Other versions
JP3909073B2 (ja
Inventor
匡亮 谷本
匡亮 谷本
丈良夫 鎌田
丈良夫 鎌田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Renesas Technology Corp
Original Assignee
Renesas Technology Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Renesas Technology Corp filed Critical Renesas Technology Corp
Publication of JPWO2004036463A1 publication Critical patent/JPWO2004036463A1/ja
Application granted granted Critical
Publication of JP3909073B2 publication Critical patent/JP3909073B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F30/00Computer-aided design [CAD]
    • G06F30/30Circuit design

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Evolutionary Computation (AREA)
  • Geometry (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Design And Manufacture Of Integrated Circuits (AREA)

Abstract

コンパイラは、クロック境界及びレジスタ代入文によりステートメントレベルでの並列動作の記述をサイクル精度で記述可能な擬似C記述(1)を入力とし、レジスタ代入文の識別を行い(S2)、実行可能なC記述(3)を生成すると共に、状態数削減を行ったステートマシンを抽出し、0サイクルで実行されるループが存在するか否かを判定し(S5)、もしなければ、論理合成可能な回路記述(4)を生成する。これにより、クロック境界を明示的にC記述内に挿入した擬似C記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似C記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。

Description

本発明はプログラム記述からシミュレーション用のプログラム記述又はハードウェアを特定する回路記述を自動生成する技術に関し、例えばパイプライン動作される論理回路、例えばCPU(Central Processing Unit)等の論理回路の設計に適用して有効な技術に関する。
プログラム言語を用いてディジタル回路の回路記述を生成する技術がある。特許文献1に記載の技術では、レジスタを示す変数と、レジスタの入力を示す変数とに分け、モジュール部での処理の後に第2の変数から第1の変数に一括して代入する一括代入部を設けている。特許文献2には、汎用プログラム言語で回路動作を記述したプログラムの中から、順次制御する部分を特定処理部で特定し、その後、変換処理部で、前記順次制御する部分の記述を、ステートマシンとして動作するように汎用プログラム言語を用いて変換し、その変換後のプログラムを取得し、続いて、プログラム生成処理部で、前記変換後のプログラムの中から並行動作する部分を抽出し、この抽出部分の全てをアクセスするプログラムを生成する、というものである。
特許文献1:特開2002−49652号公報
特許文献2:特開平10−149382号公報
特許文献1によれば、▲1▼回路動作を示すモジュール、▲2▼レジスタ代入を行う一括代入部、▲3▼クロック同期で繰り返すループ部の3つの構成がらなっており、特に▲3▼内で▲1▼の実行後に▲2▼を実行する事を特徴としている。しかしながら、▲1▼がクロック境界を含まず、必ず▲3▼に含まれる構成となるため、複数サイクルにまたがる回路動作を記述する為には、回路動作をクロック境界で分割する必要がある。例えば、ある条件が成立したときは、前サイクルで実行した回路動作の途中から回路動作を行うという記述を行わなければならないが、そのような記述を行うのは困難である。特に、ストール動作を伴うパイプライン動作を行う回路を特許文献1に示す方法で記述すると、煩雑な作業を伴い、かつプログラム記述が複雑なものになる虞のあることが本発明者によって見出された。
特許文献2によれば、▲1▼汎用言語で記述したプログラムから順次処理部を識別し、ステートマシンを表す汎用プログラム記述に変換、▲2▼関数レベルでの並列性の抽出、▲3▼ハード化するプログラムとそれを制御するソフトプログラムの結合の自動化、▲4▼順次処理部内でハード化する際にフリップフロップやラッチを必要とする部分を識別してHDLに変換、の4つを特徴点がある。しかしながら、クロック境界を明示的に与えられる手段がなく、サイクル精度での記述を直接行う事が出来ない。特許文献2の実施例によれば、クロック境界は関数から関数への間であり、例えばある条件が成立したときは、前サイクルで実行した回路動作の途中から回路動作を行うという記述を行うのが困難である。特に、ストール動作を伴うパイプライン動作を行う回路を特許文献2に示す方法で記述することは可能であるが、煩雑な作業を伴い、かつプログラム記述が複雑になる虞のあることが本発明者によって見出された。
本発明の目的は、本発明の目的は、クロック境界を明示的に記述したプログラム記述からハードウェア記述を自動生成することができるコンパイラを提供することにある。
本発明の別の目的は、ストール動作を伴うパイプライン動作が可能な回路のプログラム記述又は回路記述を容易に得る事ができるコンパイラを提供することにある。
本発明の更に別の目的は、ストール動作を伴うパイプライン動作が可能な回路の設計を行うことができる論理回路の設計方法を提供することにある。
本発明の上記並びにその他の目的と新規な特徴は本明細書の以下の記述と添付図面から明らかにされるであろう。
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
〔1〕本発明の概要を全体的に説明する。即ち、クロック境界(記述子$)及びレジスタ代入文(演算子=$を挟む記述)によりステートメントレベルでの並列動作の記述をサイクル精度で記述可能な擬似C記述(1)を入力とし、レジスタ代入文の識別を行い(S2)、実行可能なC記述(3)を生成するする(S3およびS4)と共に、状態数削減を行ったステートマシンを抽出し、0サイクルで実行されるループが存在するか否かを判定し(S5)、もしなければ、論理合成可能な回路記述(4)を生成する(S6)。
上記より、クロック境界を明示的にC記述内に挿入した擬似C記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似C記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。
擬似C記述から一般のCコンパイラによるコンパイルが可能なC記述を出力することができる。状態(ステート)数削減を行うので、記述で与えたクロック境界の数+1以下のステート数のステートマシンを伴う回路記述を出力することができる。
ステートマシンを意識する事なくプログラム・レベルで機能設計を行う事ができるため、記述量が低減され、開発期間の短縮のみならず品質向上にも寄与する。
また、一般のクロック境界を指定しないプログラム・レベルでの記述では表現できない、バス・インターフェース回路や調停回路の記述が可能となる。特に、レジスタ代入が記述可能である為、ステートメントレベルでの並列性を考慮した記述を行う事が可能であり、ストール動作を伴うパイプライン動作のような複雑な回路動作をC記述よりも少ないコード量で容易に記述可能である。
また、一般のCコンパイラでコンパイル可能なC記述へ変換する為、高速なシミュレーションが可能となり、機能検証工数の大幅な低減が可能となる。従って、機能設計における論理設計、論理検証の双方の大幅な工数削減が可能となる。
クロック境界を指定したプログラム記述からミーリー(Mealy)型のステートマシンが生成可能であるので、プログラム・レベルでのモデル検査を行う事が可能である。
高位合成ツールが不得意とする、サイクル精度を要求される例えば、キャッシュ・コントローラやDMAコントローラの開発に適用可能であり、設計期間の短縮に大きく寄与する。
〔2〕本発明に係るコンパイラの第1形態では、コンパイラは、所定のプログラム言語を流用して記述された第1プログラム記述(1)を回路記述(4)に変換可能であって、前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文(演算子=$を挟む記述)とクロック境界記述($)を含み、前記回路記述は、前記第1プログラム記述が特定する回路動作を実現するハードウェアを所定のハードウェア記述言語で特定する。
本発明に係るコンパイラの第2形態では、コンパイラは、所定のプログラム言語を流用して記述された第1プログラム記述を所定のプログラム言語を用いた第2プログラム記述(3)に変換可能であり、前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文(演算子=$を挟む記述)とクロック境界記述($)を含む。前記第2プログラム記述は、前のサイクルの状態を参照可能に前記レジスタ代入文を変形した変形代入文(13)と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文(12)とを含む。
本発明に係るコンパイラの第3形態では、コンパイラは、所定のプログラム言語を流用して記述された第1プログラム記述(1)を、所定のプログラム言語を用いた第2プログラム記述(3)と回路記述(4)に変換可能である。前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む。前記第2プログラム記述は、前のサイクルの状態を参照可能に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述とを含む。前記回路記述は、前記第2プログラム記述で定義されるハードウェアを所定のハードウェア記述言語で特定する。
前記所定のプログラム言語は例えばC言語である。前記ハードウェア記述言語は例えばRTLレベルの記述言語である。
〔3〕本発明に係る論理回路の設計方法の第1形態では、タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文(演算子=$を挟む記述)とクロック境界記述($)を含む第1プログラム記述(1)を入力する第1処理(S1)と、前記第1プログラム記述に基づいて前記タイミング仕様を満足する回路情報を生成する第2処理と、を含む。
前記第2処理は、前記第1プログラム記述を変換して、前記レジスタ代入文が入力変数と出力変数を用いて変形される(S2)と共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する(S4)記述(13,12)を含む第2プログラム記述(3)を、前記回路情報として生成する処理を含んでよい。
前記第2処理は、前記第2プログラム記述に基づいて前記タイミング仕様を満足するハードウェアを所定のハードウェア記述言語で特定するための回路記述(4)を更に別の前記回路情報として生成する処理を含んでよい。
前記第2プログラム記述を用いて設計対象回路のシミュレーションを行う第3処理を更に含んでもよい。
上記第2処理に関し、前記レジスタ代入文が入力変数と出力変数を用いて変形される(S2)記述(13)を含む第2プログラム記述(5)と、前記クロック境界記述に対応させて前記入力変数を出力変数に代入する(S4)記述(12)を含む第3プログラム記述(3)とを、分けて把握することも可能である。このとき、第3処理によりシミュレーションは第3プログラム記述に基づいて行うことになる。
〔4〕本発明に係る論理回路の設計方法の第2形態では、タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第1プログラム記述を入力する入力処理(S1)と、前記レジスタ代入文が入力変数と出力変数を用いて変形される(S2)と共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する(S4)記述(13,12)を含み、前記所定のプログラム言語で記述された第2プログラム記述を生成する変換処理とを含む。
前記変換処理は、第1プログラム記述に基づいてCFGを生成する過程で、前記CFGに前記クロック境界記述に対応してクロック境界ノードを設定し、前記クロック境界ノードの後に、前記レジスタ代入記述を挿入する処理であってよい。
第2プログラム記述に対してそのCFGを利用しながらステート遷移毎の変数表を作成しながらコード最適化を行う最適化処理を更に含んでもよい。
前記変数表においてステート間で変数に変化のない部分を前置保持を要する部分として抽出し、抽出された部分に、出力変数に入力変数を代入する代入記述を追加する前置保持処理を更に含んでもよい。
前記前置保持処理を経た変数表の各ステート遷移毎の変数と引数に基づいてステートマシンを構成するコードの抽出を行う抽出処理を更に含んでもよい。
前記抽出処理で抽出されたステートマシン構成コードと第2プログラム記述を参照しながら、前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する回路記述を生成する処理を更に含んでもよい。
前記第1プログラム記述に対して0サイクルで実行されるループが存在するか否かが判定され、存在しないと判別されたときに前記変換処理が行なわれる。
第1図は本発明に係る論理回路の設計方法を例示するフローチャートである。
第2図は第1図の設計方法を適用して設計すべき回路例を示すブロック図である。
第3図は第2図の回路動作仕様を示すタイミングチャートである。
第4図は第2図の設計対象回路の擬似Cプログラムを例示する説明図である。
第5図はレジスタ代入文識別処理(S2)によって得られる追加変数宣言の記述とレジスタ代入文書き換えの記述を示す説明図である。
第6図は擬似C記述に基づくCFG作成過程の一つの過程を示す説明図である。
第7図は擬似C記述に基づくCFG作成過程の別の過程を示す説明図である。
第8図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第9図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第10図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第11図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第12図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第13図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第14図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第15図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第16図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第17図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第18図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第19図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第20図は擬似C記述に基づくCFG作成過程の更に別の過程を示す説明図である。
第21図は擬似C記述に基づくCFG作成過程の最終過程を示す説明図である。
第22図は説明を簡単化するために第21図のCFGに対してクロック境界や分岐の始点・終点、及びループの始点・終点の情報を付加していないCFGを例示する説明図である。
第23図は第22図のCFGに対するフラグ挿入状態を例示する説明図である。
第24図はレジスタ代入記述挿入文の挿入位置をCFG上で例示する説明図である。
第25図はC記述生成処理(S4)を経て得られる実行可能な変換C記述(Cプログラム)の最初の一部を例示する説明図である。
第26図は第25図に続く実行可能な変換C記述(Cプログラム)の一部を例示する説明図である。
第27図は第26図に続く実行可能な変換C記述(Cプログラム)の最後の部分を例示する説明図である。
第28図はステート数削減処理の第1のルールを示す説明図である。
第29図はステート数削減処理の第2のルールを示す説明図である。
第30図は第22図のCFGに対してステート数削減を行った結果を例示する説明図である。
第31図はステート数削減等の処理を行ったCFGに対してステートの割り当てを行った状態を例示する説明図である。
第32図は前記コード最適化の処理を説明するために特別に簡素化した例としてコード最適化対象とされる擬似Cプログラムを示す説明図である。
第33図は第32図の擬似Cプログラムに基づいて得られたCFGを例示する説明図である。
第34図は第33図のCFGに対してステート割り当てが行なわれた状態を例示する説明図である。
第35図は第34図のCFGに対してステートマシン生成のための変数表作成処理過程の最初の状態を例示する説明図である。
第36図は第35図に続く変数表作成処理過程の次の状態を例示する説明図である。
第37図は第36図に続く変数表作成処理過程の次の状態を例示する説明図である。
第38図は第37図に続く変数表作成処理過程の次の状態を例示する説明図である。
第39図は第38図に続く変数表作成処理過程の次の状態を例示する説明図である。
第40図は第39図の生成過程を経て生成された変数表を例示する説明図である。
第41図は第40図の変数表に対して冗長ステートメント削除を行ったとき、削除されるべきステートメントを例示する説明図である。
第42図は第41図に対して冗長ステートメントが削除された結果の変数表を例示する説明図である。
第43図は冗長ステートメントが削除された結果をCFGで示す説明図である。
第44図は第42図の変数表に対してローカル変数削除を行ったとき削除されるべき変数を例示する説明図である。
第45図はローカル変数削除処理が行なわれた結果をCFGで示す説明図である。
第46図は冗長ステートメント削除処理及びローカル変数削除処理が行なわれて最終的に更新された変数表を例示する説明図である。
第47図は後工程の前置保持解析により変数表に前置保持“retain“の記述が追加された状態を例示する説明図である。
第48図はコードの最適化として更に演算式の簡約化を行った例をCFGで示す説明図である。
第49図は第32図乃至第48図で特別に簡素化した別の例を用いて説明したコード最適化の処理を第31図に示されるステート割り当てが行われた後に施すことによって得られる最適化後のCFGを例示する説明図である。
第50図は第49図に対する最適化処理後の変数表を示す説明図である。
第51図は前置保持解析のアルゴリズムを例示する説明図である。
第52図は前置保持解析の結果に対応する変数表を示す説明図である。
第53図は第52図に対し“retain”を実際のコードで上書きした変数表を示す説明図である。
第54図は開始ステートST0におけるステートマシン抽出処理を示す説明図である。
第55図は第54図に対しretain情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第56図は開始ステートST1におけるステートマシン抽出処理を示す説明図である。
第57図は第56図に対しretain情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第58図は開始ステートST2におけるステートマシン抽出処理を示す説明図である。
第59図は第58図に対しretain情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子を示す説明図である。
第60図はHDL記述生成処理(S6)にて生成されたHDL記述の最初の一部を示す説明図である。
第61図は第60図に続くHDL記述の一部を示す説明図である。
第62図は第61図に続くHDL記述の最後の部分を示す説明図である。
《設計方法の概略》
第1図には本発明に係る論理回路の設計方法が例示される。同図に示される設計方法は、擬似C記述(擬似Cプログラム)1の作成、擬似Cプログラム1に対するコンパイル処理2に大別される。コンパイル処理2では、擬似Cプログラム1を、レジスタ代入記述を変形代入文とした擬似Cプログラム(5に格納)、および実行可能なC記述(Cプログラム)3に変換し、また、そのCプログラム3をRTL(Register Transfer Level)などのHDL(Hardware Description Language)記述4に変換する。
前記擬似Cプログラム1は、サイクル精度で回路動作を特定可能とするクロック境界記述(単にクロック境界とも記す)及びレジスタ代入文を含み、ステートメントレベルでの並列記述を可能にしたプログラムである。擬似C記述とは、前記クロック境界及びレジスタ代入文が定義されているない所謂ネイティブのC言語記述とは相違するという意味で用いられている。プログラム言語としてC言語以外の高級言語をベースとすることを妨げるものではない。
コンパイル処理2は、図示を省略するコンピュータ装置がコンパイラを実行し、擬似Cプログラム1を読み込んで行なわれる。先ず擬似Cプログラム1が読み込まれる(S1)。読み込まれた擬似Cプログラム1に対しては、レジスタ代入文の識別が行なわれ、識別されたレジスタ代入文を、前のサイクルの状態を参照可能に変形し、換言すれば、入力変数と出力変数を用いて変形する(S2)。変形されたレジスタ代入文を変形代入文とも称する。レジスタ代入文が変形代入文に変形された擬似Cプログラムはレジスタ情報記憶部5に格納される。レジスタ代入文が変形代入文に変形された擬似Cプログラムは前記レジスタ情報記憶部5から取り出されて、そのコントロール・フロー・グラフ(以下CFGと記す)が生成される(S3)。生成されたCFGは中間表現記憶部6に格納される。前記中間表現記憶部6に格納されたCFG及び前記レジスタ情報記憶部5に格納された擬似Cプログラムは、実行可能なC記述プログラムに変換される(S4)。例えば、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文が挿入される。換言すれば、クロック境界記述に対応させて前記変形代入文の入力変数を出力変数に代入するレジスタ代入記述挿入文が挿入される。
前記擬似Cプログラム5等に基づいてHDL記述4を得る場合、先ずそれらを入力してステートマシンの生成が行なわれる(S5)。ステートマシン生成(S5)は、ステート数削減処理(S5A)、コードの最適化(S5B)、HDL記述に則するための前置保持解析(S5C)、及びステートマシン抽出(S5D)に大別される。ステート数削減処理(S5A)とコードの最適化(S5B)は最適化処理の範疇に属する処理と把握してもよい。コードの最適化(S5B)の段階では、0サイクルで実行されるループが存在するか否かを判定し、もしなければ、HDL記述に則するための前置保持解析(S5C)、及びステートマシン抽出(S5D)が行われる。前記C記述プログラムを得るときには、例えばクロック境界ノードに前記レジスタ代入記述挿入文を挿入すればよかったが、HDL記述を得るときはクロック境界でレジスタ値が変化しない場合にもそれを明示的に記述しておくことが必要とされる。そのために、前置保持解析(S5C)が行なわれる。生成されたステートマシンはステート遷移毎の変数表に基づいて生成される。生成されたステートマシンはステートマシン記憶部7に保持される。保持されたステートマシン等に基づいてHDL記述4が生成される(S6)。
HDL記述4は論理合成ツールを利用することによって論理回路図データに変換可能にされる。前記C記述3は前記論理合成される論理回路のシミュレーションなどに利用される。
以下に、上記擬似Cプログラムとそのコンパイル処理を詳細に説明する。以下の詳細説明は第2図の回路に第3図の仕様を満足させる回路の設計を一例とする。
《設計対象回路》
第2図には第1図の設計方法を適用して設計すべき回路例が示される。設計対象回路10はストール動作を伴うパイプライン加算回路である。その動作仕様は以下の通りである。
(1)入力信号valid_aが立ち上がると、信号レベルのハイレベルとなったサイクルの入力信号aの値を取り込む。ここではvalid_aが立ち上がり変化を問題にする。
(2)入力信号valid_aの立ち上がりの次サイクル以降で、入力信号valid_bの信号レベルがハイレベルとなると、そのサイクルでの入力信号bの値を取り込む。入力信号valid_bに対してはレベル検出だけで充分とされ、エッジ変化の検出は不要とされる。
(3)上記(1)(2)の動作でaとbが取り込まれたなら、その次サイクルでaとbの加算結果を出力信号outにより送出し、その同一サイクルに出力信号valid_outの信号レベルをハイレベルとし、次サイクルで出力信号valid_outの信号レベルをロウレベルとする。
(4)出力信号outは(1)(2)(3)の動作での新たな加算結果が代入されない限り、同じ値を出力する。
(5)出力信号valid_outは(1)(2)(3)の動作で出力信号outへ新たな加算結果が代入されたサイクルのみ信号レベルがハイとなり、それ以外はロウレベルを出力する。
第3図には第2図の回路動作仕様を示すタイミングチャートである。同図において、出力データ送出と入力データ取り込みが同一サイクルで行われており、パイプライン動作となっている。例えばa2の入力とa1+b1の出力が並列化されている。また、入力信号valid_aの立ち上がりの次サイクル以降で入力信号valid_bの値が1となった次のサイクルで出力データ送出が行われる為、ストール動作を伴うパイプライン動作となっている。例えばb1の取込み後におけるb2の取込みは2サイクル待たされている。
《擬似Cプログラム》
第4図には前記設計対象回路10の擬似Cプログラムが例示される。第4図に記述において11は、設計対象回路10の回路動作を記述した回路動作記述部である。同図に示される擬似Cプログラムの記述は以下の通りである。即ち、
1行目:C言語でのライブラリ呼び出し、
2〜7行目:関数pipelineのプロトタイプ宣言部、
8〜14行目:main関数部、
9〜10行目:main関数のローカル変数宣言部。出力信号はポインタ型で宣言、
11〜12行目:main関数のローカル変数の初期化(出力信号のみ初期化、特に出力信号に対してRTLへの変換時にレジスタが推定される場合ここで指定した初期値がリセット値となる)、
15〜36行目:pipeline関数部、
18〜20行目:pipeline関数のローカル変数宣言部(特にローカル変数に対してRTLへの変換時にレジスタが推定される場合ここで指定した初期値がリセット値となる)、
21〜35行目:回路動作記述部11、である。
回路動作記述部11の詳細は以下の通りである。即ち、
21、35行目:無限ループにより回路を表現、
22行目:入力変数valid_aのローカル変数valid_a_tmpへのレジスタ代入文(ここで、0x0001&valid_aにより、入力変数valid_aの有効ビット幅が1ビットである事を指定している)、
23行目:valid_aが1‘b1でvalid_a_tmpが1’b0であるか否かの判定文(即ち、valid_aが立ち上がりであるか否かの判定文。特に、0x0001&valid_a_tmpにより、ローカル変数valid_a_tmpの有効ビット幅が1ビットである事を指定している)、
24行目:入力信号aのローカル変数a_tmpへの代入文(特に、0x7FFF&aにより、入力変数aの有効ビット幅が15ビットである事を指定している)、
25行目:クロック境界、
26行目:gotoラベル、
27〜28行目:入力変数valid_bが1‘b1であれば、ローカル変数b_tmpに入力変数bを代入し、そうでなければクロック境界を1つまたいでラベルLへ分岐する事を表している(特に、0x0001&valid_bにより、入力変数bの有効ビット幅が1ビットである事を、0x7FFF&bにより、入力変数bの有効ビット幅が15ビットである事を表している)、
29行目:ローカル変数a_tmpとローカル変数b_tmpの和の出力変数outへのレジスタ代入文、
30行目:定数0x0001の出力変数valid_outへのレジスタ代入文、
31行目:23行目のif文の判定が成立しなかった場合の分岐。即ち、valid_aが立ち上がりでなかった場合の分岐を表す、
32行目:クロック境界、
33行目:定数0x0000の出力信号valid_outへのレジスタ代入文、である。
上記記号“$”はクロック境界記述を意味し、記号“=$”レジスタ代入を意味する。それらはC言語の汎用的な記述子及び演算子ではない。これを用いた擬似Cプログラムは、その意味においてC言語を流用したプログラム記述と言うことができる。
上記回路動作記述部11より明らかなように、クロック境界記述及びレジスタ代入文によりステートメントレベルで並列動作をサイクル精度で簡単に記述可能になる。サイクル精度とは、クロックサイクルとの同期が意図される、ということである。
第4図の回路動作記述部11の記述内容について説明する。入力変数valid_aをローカル変数valid_a_tmpに代入する事で、if文によるvalid_aの立ち上がり判定を行い、もし立ち上がりであった場合は、ローカル変数a_tmpに入力信号aを取り込み、次のサイクルで入力信号valid_bが1‘b1であるか否かを判定する。もしそうなら入力信号bの値をローカル変数b_tmpに代入し、そうでなければ次のサイクルでもう一度入力信号valid_bが1‘b1であるか否かを判定する。これを入力信号valid_bが1‘b1となるまで繰り返す。この動作がストール動作に対応している。さて、ローカル変数a_tmpとb_tmpの和は取り込んだaとbの値の和を表しており、それを出力変数outへレジスタ代入し、同時に1‘b1を出力信号valid_outへレジスタ代入している。これにより、入力信号aとbを取り込んだ1サイクル後での加算結果とvalid_out信号が1‘b1である事を表現している。if文によるvalid_aの立ち上がり判定を行い、立ち上がりでない場合は、1サイクル後に1‘b0をvalid_outへレジスタ代入している。valid_aの立ち上がりは高々2サイクルに1回しか起こり得ないので、変数outへの新たな代入が29行目で行われた時のみvalid_outが1‘b1となり、それ以外の場合は、1‘b0となる。
第4図の第22行におけるレジスタ代入文は、サイクル精度で動作を特定するのに順序回路としてのレジスタを想定しており、左辺(valid_a_tmp)はレジスタの出力、即ち前サイクルの値を保持している変数として把握可能である。レジスタ代入文の右辺(0x0001&valid_a)は現時点のレジスタ入力として把握可能である。また、第4図の第29行目及び第30行目に記載のレジスタ代入文に関しては、その後の第32行におけるクロック境界記述でクロックが消費されるようになっているが、第2図及び第3図の回路仕様ではその次サイクルでoutを出力するとあり、結果として、out、valid_outに関しては必然的にサイクル精度の記述が必要になるため、それらの記述にはレジスタ代入文が用いられている。
《レジスタ代入文識別》
次にレジスタ代入文識別処理S2について説明する。前記レジスタ代入文識別処理部では、代入文であって、=と右辺の間に$が付加された文を識別し、回路動作記述部11内のレジスタ代入文、レジスタ代入文の左辺の変数の型と初期値を記憶し、識別したレジスタ代入文
Figure 2004036463
の記述に変更する。signal_latched_iは現時点の入力が与えられる入力変数、signal_latched_oは1サイクル前の出力が当てられる出力変数として把握することが可能である。変数宣言部に変更により生じた新たな変数
Figure 2004036463
を先に記憶しておいた変数の型と初期値を参照して追加する。例えば、
Figure 2004036463
の場合は、
Figure 2004036463
を追加する。特に、レジスタ代入の左辺の変数が、ポインタ型の場合(記号*が付されている)は、そのポインタ型を用いて変数宣言を行う。例えば、
Figure 2004036463
の場合は、
Figure 2004036463
を追加する。特に、追加対象となった変数に対して、同じ型で初期値を0としたフラグ変数も追加予定として、記憶する。この例の場合、
Figure 2004036463
を追加予定変数として記憶する。尚、上記変更を行った記述も記憶する。また、変数の初期値はHDL変換時に該変数へのレジスタ推定が行われた場合、リセット時の値として用いる。
第5図にはレジスタ代入文識別処理S2によって得られる結果が例示される。第4図の擬似Cプログラム対して追加変数宣言の記述と変形代入文(レジスタ代入文書き換え)13の記述が変更されている。
《CFG生成》
次にCFG生成処理について説明する。CFGとは、一般に各関数内部において制御の流れを示すグラフを意味する。
CFG生成処理では、回路動作記述部11を読み込んで、CFGの作成を行う。特にwhileやfor等のループ及びifやcase等の条件分岐、goto文によるラベルへのラベル分岐を識別する為のノードを持つCFGの作成を行う。要するに、whileやfor等のループ及びifやcase等の条件分岐、goto文によるラベルへのラベル分岐をノードに持つCFGを作成する。各文をプログラムの終了迄読み込み、以下の手順1)〜7)でノードを作成しながらプログラムの流れに沿って、ノード間の接続を有向辺(向きが付いている辺)で接続する事でCFGを作成する。第6図から第21図には手順1)〜7)によるCFGの作成過程が順を追って示される。各図にはループ文スタック、分岐文スタック、生成途中のCFGが示される。
1)ループの開始であれば、ループ文スタックにその行番号とwhileやfor等のループを表す終端記号を登録し、ループ開始ノード(NDs)を作成し、行番号と終端記号をノードに付加する。また、forやwhileループ終了条件があれば、その条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
2)ループの終了であれば、ループ文スタックから先頭にある情報を取り去り、ループ終了を表すループ終了ノードを作成し、行番号と“end of終端記号”をノードに付加する。但し、continueやbreakはループの終了としては扱わない。また、do−whileループ終了条件があれば、その条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
3)条件分岐の開始であれば、分岐文スタックにその行番号とifやcase等の分岐を表す終端記号を登録し、条件分岐開始ノードを作成し、行番号と終端記号をノードに付加する。また、分岐条件を適当な記号に代入し、出力枝に付加し、付加した条件を割り当てた記号との対で記憶する。
4)条件分岐の終了であれば、分岐文スタックから先頭にある情報を取り去り、条件分岐終了を表す条件分岐終了ノードを作成し、行番号と“end of終端記号”をノードに付加する。
5)ラベルであれば、ラベルを表すラベルノードを作成し、行番号とラベル記号をノードに付加する。
6)クロック境界であれば、クロック境界ノードを作成し、行番号と$をノードに付加する。
7)上記以外であれば、行番号と文を付加したノードを作成し、1)〜6)の何れかに出会うまでノードをマージする。
上記手順によるCFGが作成されるが、以下の説明では、その説明を簡単化するために、第22図に例示されるように、クロック境界や分岐の始点・終点、及びループの始点・終点の情報を付加していないCFGを用いて説明を行う。特に、クロック境界ノードのみ黒丸で、それ以外のループ、条件分岐、ラベル分岐ノードを白丸で表現する。
《C記述生成》
前記C記述生成処理S4について説明する。C記述生成処理S4では、前記レジスタ代入文識別処理で追加予定変数として記憶しておいた変数で、レジスタ代入部識別処理で変更した部分(変形代入文)の直下に対応するフラグ変数に1を代入する文の挿入を行い、レジスタ代入文の左辺の変数への代入文でレジスタ代入文でない代入文の直下に対応するフラグ変数に0を代入する文の挿入を行う。また同時に、ローカル変数宣言部に、レジスタ代入文識別部で記憶しておいた変数宣言を追加する。第23図ではflg_valid_a_tmp=1、flg_valid_out=1のフラグが挿入されている。
次にレジスタ代入記述挿入文が決定される。前記レジスタ代入文識別処理S2において、識別されたレジスタ代入文の右辺の変数全てに対して、レジスタ代入記述挿入文が作成される。即ち、
Figure 2004036463
を作成する。これをレジスタ代入文識処理で識別したレジスタ代入文の
Figure 2004036463
右辺の変数全てに対して作成する。例の場合には、下記記述
が得られる。
上記レジスタ代入記述挿入文は、第24図に例示されるように、クロック境界ノードの直下に挿入される。第24図においてレジスタ代入記述挿入文には参照符号12が付されている。このようにして行なわれるC記述への変換は、各ノードに付加された行番号等の情報を元に、深さ優先探索等のアルゴリズム(DFS)を用いて、CFGを探索する事で挿入文の順番を考慮して行えば良い。尚、適度にコメント文を挿入しても良い。
第25図乃至第27図には上記C記述生成処理S4を経て得られる実行可能な変換C記述(Cプログラム)3の全体が例示される。
《ステートマシン生成−ステート数削減》
前記ステートマシンの生成処理S5について説明する。ステート数削減処理S5Aは例えば第1又は第2のルールに従って行なわれる。ステート数削減処理の第1のルールは第28図に例示される。即ち、ループ開始・終了ノード、条件分岐開始・終了ノード、ラベル分岐ノードの何れかであって、入力辺が複数あるノードを探索し、その入力辺の内2つ以上の入力辺にクロック境界がある場合は、同図に示すグラフ変形を行う。ステート数削減処理の第2のルールは第29図に例示される。即ち、ループ開始・終了ノード、条件分岐開始・終了ノード、ラベル分岐ノードの何れかであって、出力辺が複数あり且つ出力辺に付加された条件が入力信号も出力信号の何れも含まず、2本以上の出力辺にクロック境界が付加されたノードを探索し、その前段のクロック境界が出力辺のクロック境界を含まない場合、同図に示すグラフ変形を行う。第30図には第22図のCFGに対してステート数削減を行った結果が例示される。
《ステートマシン生成−コード最適化》
コード最適化処理S5Bでは前記ステート数削減等の処理を行ったCFGに対しては第31図に例示されるようにステートの割り当てを行う。第31図に従えば、
回路動作部の開始文に対応するCFG上のノードに初期ステートを割り当て、CFG上のクロック境界ノードにステートを割り当てる。但し、開始ノードへの入力辺が1つしか存在せずクロック境界が付加されている場合は、既に割り当てた初期ステートを削除する。尚、最適化の第1ルールにより、初期ステート削除が起こる必要十分条件は、開始ノードへの入力辺が1つしか存在せずクロック境界が付加されている事である事に注意することが望ましい。また、得られるステート数は、必ず回路動作部に記述したクロック境界の数+1以下となる事に注意すべきである。
ここで、前記コード最適化の処理を、特別に簡素化した別の例を用いて、第32図乃至第48図を参照しながら説明する。
第32図はコード最適化対象とされる擬似Cプログラムを示す。この擬似Cプログラムに基づいて得られたCFGは第33図に例示される。第34図には第33図のCFGに対してステート割り当てが行なわれた状態を例示する。
第35図から第40図まではステートマシン生成のための変数表作成処理の様子が順を追って例示される。変数表の作成は、以下の(1)〜(3)の手順で行う。(1)ローカル変数を取得し、(2)関数の引数を取得し、(3)割り当てたステートからステートに到達するまでCFGを下位側に辿って、ステート遷移を識別すると共に変数の定義・参照の情報を取得する。この段階で、両端がクロック境界ではないループが発見されると、ゼロサイクル・ループを検出したとして、ユーザに通知し、処理を終了。ゼロサイクル・ループの発生は、生成される回路に組合せ回路からなるループ回路が存在する事を意味しており、ループ回路の存在は生成される回路に重大なミスがあることを意味する。第35図にはステートST0からST1への一つのステート遷移におけるローカル変数と引数が例示される。第36図にはステートST0からST1への別のステート遷移におけるローカル変数と引数が例示される。第37図にはステートST0からST2へのステート遷移におけるローカル変数と引数が例示される。第38図にはステートST1からST0へのステート遷移におけるローカル変数と引数が例示される。第39図にはステートST2からSTへのステート遷移におけるローカル変数と引数が例示される。第35図から第39図に示される夫々のステート遷移で得られたローカル変数と引数に基づいて、第40図に例示される変数表が生成される。第40図の変数表の記述において、def[n]:n行目で変数定義されている事を表し、
use@var[m]:m行目で変数varへの代入に用いられている事を表し、
pred(cond){...}:条件condの分岐が成立した場合、{...}が実施される事を表し、
def[l]use:1行目で自変数への代入に用いられている事を表し、
use@pred(cond):条件condで用いられている事を表す、とされる。
最適化処理は例えば第40図の変数表に基づいて行なわれる。最適化処理の一つは冗長ステートメントの削除である。
冗長ステートメントの削除として、第1に、同一変数に対して、ステート遷移のカラム内でdefが2つ以上存在する場合には、1)又は2)の処理を行う。即ち、
1)下記1−1),1−2)をdefの後段に存在するpred(cond){...}の手前まで(pred(cond){...}の有無に関わらず)実施する。1−1):defの後段にuseを伴うdefがない場合は、最後のdefに対応するステートメントのみ残す。1−2):defの後段にuseを伴うdefがある場合は、useを伴うdefの後段にuseを伴わないdefがあれば、そのdefのみを残し、そうでなければuseを伴うdefの前段のdefとuseを伴うdefを残し、これを変化が無くなるまで繰り返し、残ったdefに対応するステートメントのみ残す。
2)defの後段にpred(cond){...}が無ければ終了し、あれば下記2−1),2−2)を実施する。2−1):pred(cond){...}の条件がdefの結果を参照している場合には終了とする。2−2):pred(cond){...}の条件がdefの結果を参照していない場合は、1)へ分岐とする。
冗長ステートメントの削除処理として、第2に、useがどのステート遷移にも存在しない変数は削除とする。
上記処理手順により第40図の変数表に対して冗長ステートメント削除を行ったとき、削除されるべきステートメントは第41図に示される。同図において削除されるべきステートメントには斜め破線が明示されている。第42図には冗長ステートメントが削除された結果の変数表が例示される。第43図には冗長ステートメントが削除された結果をCFGで表している。
最適化処理のもう一つはローカル変数の削除である。このローカル変数の削除処理として、第1に、各変数のステート遷移カラムに於いて、下記1)〜3)を左から順次変化が無くなる迄実施する。即ち、
1)defの後段にpred(cond){...}を挟まずuseが存在する場合には、1−1)、1−2)、1−3)、1−4)を行う。1−1):use自体がuse@predの場合は代入操作を実施し、defを削除し、1−2)の場合は@の変数がローカル変数でuse@predとして用いられている場合は代入操作を実施せず、1−3):@の変数がローカル変数でuse@predとして用いられていない場合は代入操作を実施し、defを削除し、1−4):@の変数が引数の場合は代入操作を実施し、defを削除する。
2)defの後段にpred(cond){...}を挟んでuseが存在し、pred(cond){...}の条件で用いられている変数が引数の場合は1−1)から1−4)を適用する。
3)defの後段にpred(cond){...}を挟んでuseが存在し、pred(cond){...}の条件で用いられている変数がローカル変数の場合には、3−1)、3−2)を行う。3−1):pred(cond){...}の条件がdefの結果を参照していない場合は1−1)から1−4)を適用し、3−2):pred(cond){...}の条件がdefの結果を参照している場合は代入操作を実施しない。
ローカル変数の削除処理として、第2に、defがどのステート遷移カラムにも存在しない変数は削除し、代入操作後のCFGを再び解析して、変数表を更新する。
第42図の変数表に対してローカル変数削除を行ったとき、削除されるべき変数は第44図に示される。同図において削除されるべき変数には斜め破線が明示されている。第45図にはローカル変数削除処理が行なわれた結果をCFGで表している。
第46図には冗長ステートメント削除処理及びローカル変数削除処理が行なわれて最終的に更新された変数表が例示される。この変数表により、必要となるローカル変数が管理されることになる。第46図において、defが存在しない部分では、出力変数とローカル変数の前置保持が必要である事が識別できる。ステートの遷移において当然前置保持されなければならないからである。従って、その部分には、前置保持を必要とすることが容易に識別可能になる。第47図に例示されるように、後工程の前置保持解析により、その部分に、前置保持“retain“が追加されることになる。
コードの最適化として更に、第48図に例示されるような演算式の簡約化が行なわれる。
《ステートマシン生成−前置保持解析》
ここからの説明は再度第2図及び第3図の仕様を満足させる回路設計の例に話しを戻す。第32図乃至第48図では特別に簡素化した別の例を用いて前記コード最適化の処理を説明したが、第31図に示されるステート割り当てが行われた後に、それと同様の最適化処理を施すことにより、第49図の最適化後のCFGを得ることができ、また、第50図の変数表が得られる。最適化処理後の第50図の変数表には前置保持“retain“は明示されていない。次に説明する前置保持解析で取得される。
第51図には前置保持解析のアルゴリズムが例示される。前置保持解析は、出力変数とローカル変数に対して、状態遷移のカラムにてdefが全く存在しない場合、その状態遷移では前置保持が必要となる。また、defが存在したとしても、pred()が付加されている場合は、各出力変数・ローカル変数の各状態遷移に対して、第51図に示されるような図を作成して、pred()による分岐の中でどの部分で前置保持が必要となるかを識別する。特に、レジスタ代入文識別処理で新たに追加したローカル変数に対しては、_iが付加されている変数のみに対して前置保持が必要かの解析を行う。また、例え、変数表にpred()の情報がなくても必要ならCFGを解析し直して付加する。
第51図に示される図の作成は、pred()の条件を分岐として、use、def等のノードを持つ木を作成する事で行う。そして木のdefより下位の部分木を削除し、最上位ノード以外で下位ノードにdefが存在しないノードを前置保持が必要なノードとして識別する。
ここで、最上位ノードとは、木の根から一番距離が近いdefがuseのノードまでのノードとその兄弟ノード全てを指す。
例えば、変数varの状態遷移STn−>STmでの変数表からの情報が、pred(cond_0){pred(cond_1){use@var_1[j],pred(cond_2){def[k],pred(cond_3){def[s]}}}である場合、第51図のようになる。
第52図には前置保持解析の結果に対応する変数表が例示される。前置保持を要する部分には“retain”が追加される。
変数表において“retain”の部分に追加すべき実際のコードは変数表から取得することができる。即ち、前置保持解析結果の変数表からの情報取得処理では、変数表のカラムでretainが挿入された、出力変数・ローカル変数を取得し、例えば変数名が
1)レジスタ代入文の左辺の変数の場合は、sig=sig_o;
2)レジスタ代入文識別部で追加した変数であって、_iが付加されている変数の場合は、sig_i=sig_o;
3)その他の変数の場合は、nxt_sig=sig;
として記憶しておく。特に、retainにpred()が付加されている場合は、例えば、pred(cond_0){pred(cond_1){pred(!cond_2){retain}}}に対しては、変数が3)の場合で変数名がsigの場合、pred(cond_0){pred(cond_1){pred(!cond_2){nxt_sig=sig}}}として記憶する。以上の情軸を変数表に上書き登録する。第53図には“retain”が実際のコードで上書きされた変数表が例示される。更に、nxt_sigといった具合にnxt_を付加した変数を記憶しておく。第53図の例の場合、nxt_を付加した変数は、a_tmpのみである。
《ステートマシン生成−ステートマシン抽出》
次にステートマシン抽出処理S5Dについて説明する。ステートマシン抽出処理S5Dでは、割り当てた各ステートから深さ優先探索でクロック境界即ちステートであって初期ステートでないステートに到達するまで探索し、その探索で得られたループでも条件分岐でもラベル分岐でもないノードの情報を取得し、変数表のretain情報とマージして、HDL記述に用いるステートマシンの抽出を行う。例えば第54図には開始ステートST0の例が示される。ステートの記述は、特に制限されないが、各ステートからDFSでコードを生成する。この場合ステート変数は、nxt_state=ST0;等の形式として、コード生成を行う。
特に、retain情報にてnxt_が付加された変数はもとの変数名ではなくnxt_が付加された変数名を用いてHDL記述に用いるステートマシンの抽出を行う。また、信号と定数との&演算はビット幅解析に用いたので、不要となるため削除する。尚、定数は入力左辺のビット数を勘案してHDLの2進表記に変換してHDL記述に則した記述とする。
変数表のretain情報の取得では、各状態遷移カラムから、深さ優先探索を開始したステートと同じステートを開始ステートするカラムを全て取得し、retainが開始ステートのみに依存するか、到達ステートにも依存するか、または到達ステートと分岐条件に依存するかを識別し、開始ステートにのみ依存する場合以外は、retain情報のpred()とCFGの分岐条件を比較する事で、HDLコードの適切な位置にretain情報として変数表に格納した代入式を挿入する。第55図にはretain情報に応ずるコードを変数表から抜き出してステートマシンの抽出に利用する様子が例示される。
第54図及び第55図には開始ステートST0におけるHDL記述に則したステートマシン記述の取得例が示される。第56図及び第57図の例は開始ステートST1におけるHDL記述に則したステートマシン記述の取得例が示される。第58図及び第59図の例は開始ステートST2におけるHDL記述に則したステートマシン記述の取得例が示される。
《HDL記述生成処理》
HDL記述生成処理S6において、モジュール宣言は、回路動作記述部を含むC記述の関数宣言から、型とポインタを表す*を削除したものにclkとreset_nを加えたものをHDL記述として生成する。入出力宣言は、前記関数宣言での引数であって、代入式の左辺にのみ存在する変数を出力とし、代入式の右辺にのみ存在する変数を入力とし、ビット幅はC記述の記述内容で説明した方法で識別し、HDL記述として生成する。reg宣言はC記述に記載されていたローカル変数で、これまでの変換仮定で最終的に残った変数と、これまでの変換仮定で追加された変数とを識別し、clkとreset_nのreg宣言文とともにHDL記述として生成する。CFG生成過程で分岐条件に割り当てた変数のwire宣言のHDL記述を生成し、前記割り当てた変数への分岐条件の代入文をassign文としてHDL記述を生成する。また、割り当てたステートを2進数で表す為のparameter宣言文のHDL記述を生成する。
また、レジスタ代入文に関しては、全てのレジスタ代入文とその右辺の変数宣言を取得し、例えば、取得した情報が
Figure 2004036463
Figure 2004036463
の場合、
Figure 2004036463
のようなHDL記述を生成する。
次いで、ステートマシン抽出部で得たnxt_が付加された変数の記憶を参照し、その変数の宣言部を取得し、例えば、
この例の場合、a_tmpが対象となるが、
Figure 2004036463
であり、reg宣言記述生成時に、
Figure 2004036463
なる代入から有効ビット幅が15ビットである事が解っているので、下記
Figure 2004036463
Figure 2004036463
の記述を生成する。
また、抽出されたステートマシンのHDL記述をつなげ、各ステートでの代入文の左辺に対して、レジスタ代入の左辺の変数とレジスタ代入文識別部で追加した変数には、対応する_oの変数を代入し、それ以外の変数には初期値を代入した文を作成し、nxt_state=ST0;なる文を作成し、case文のdefaultに対応する部分を作成し、それもつなげ、右辺の変数とwire宣言した変数をorで並べ、下記
Figure 2004036463
の記述を生成し、case文の間につなげたHDL記述を挿入し、最後の行にendmoduleを付加する事でHDL記述を生成する。行数は付加しただけである。
第60図乃至第62図にはHDL記述生成処理S6にて生成されたHDL記述が例示される。
以上説明した設計方法によれば、以下の作用効果を得る。
クロック境界を明示的にC記述内に挿入した擬似C記述を入力し、レジスタ代入文によるステートメントレベルでの並列記述を可能にした擬似C記述を入力するから、ストール動作を伴うパイプライン動作が表現可能である。
ステートマシンを意識する事なくプログラム・レベルで機能設計を行う事ができるため、記述量が低減され、開発期間の短縮のみならず品質向上にも寄与する。
また、一般のクロック境界を指定しないプログラム・レベルでの記述では表現できない、バス・インターフェース回路や調停回路の記述が可能となる。特に、レジスタ代入が記述可能である為、ステートメントレベルでの並列性を考慮した記述を行う事が可能であり、ストール動作を伴うパイプライン動作のような複雑な回路動作をC記述よりも少ないコード量で容易に記述可能である。
また、一般のCコンパイラでコンパイル可能なC記述へ変換する為、高速なシミュレーションが可能となり、機能検証工数の大幅な低減が可能となる。従って、機能設計における論理設計、論理検証の双方の大幅な工数削減が可能となる。
高位合成ツールが不得意とする、サイクル精度を要求される例えば、キャッシュ・コントローラやDMAコントローラの開発に適用可能であり、設計期間の短縮に大きく寄与する。
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
例えば、以上説明したプログラム記述及び回路記述は一例であり種々の論理設計に適用することができる。HDLは必ずしもRTLに限定されない。プログラム記述言語はC言語に限定されず、その他の高級言語であってもよい。更にJava(登録商標)等の仮想マシン言語などを用いることも可能である。
本発明は、CPUなどの論理回路の設計に広く適用することができる。

Claims (20)

  1. 所定のプログラム言語を流用して記述された第1プログラム記述を回路記述に変換可能なコンパイラであって、
    前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
    前記回路記述は、前記第1プログラム記述が特定する回路動作を実現するハードウェアを所定のハードウェア記述言語で特定することを特徴とするコンパイラ。
  2. 所定のプログラム言語を流用して記述された第1プログラム記述を所定のプログラム言語を用いた第2プログラム記述に変換可能なコンパイラであって、
    前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
    前記第2プロダラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文とを含むことを特徴とするコンパイラ。
  3. 所定のプログラム言語を流用して記述された第1プログラム記述を、所定のプログラム言語を用いた第2プログラム記述と回路記述に変換可能なコンパイラであって、
    前記第1プログラム記述は、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含み、
    前記第2プログラム記述は、前のサイクルの状態を参照可能にする為に前記レジスタ代入文を変形した変形代入文と、前記クロック境界記述に対応して前記変形代入文の変数をサイクル変化に伴うレジスタの変化に対応させるレジスタ代入記述挿入文とを含み、
    前記回路記述は、前記第2プログラム記述で定義されるハードウェアを所定のハードウェア記述言語で特定することを特徴とするコンパイラ。
  4. 前記所定のプログラム言語はC言語であることを特徴とする請求項1乃至3の何れか1項記載のコンパイラ。
  5. 前記ハードウェア記述言語はRTLレベルの記述言語であることを特徴とする請求項1又は3記載のコンパイラ。
  6. タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第1プログラム記述を入力する第1処理と、
    前記第1プログラム記述に基づいて前記タイミング仕様を満足する回路情報を生成する第2処理と、を含むことを特徴とする論理回路の設計方法。
  7. 前記第2処理は、前記第1プログラム記述を変換して、レジスタ代入文が入力変数と出力変数を用いて変形されると共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含む第2プログラム記述を前記回路情報として生成する処理を含むことを特徴とする請求項6記載の論理回路の設計方法。
  8. 前記第2処理は、前記第2プログラム記述を変換して、前記タイミング仕様を満足するハードウェアを所定のハードウェア記述言語で特定するための回路記述を更に別の前記回路情報として生成する処理を含むことを特徴とする請求項7記載の論理回路の設計方法。
  9. 前記プログラム言語はC言語であることを特徴とする請求項8記載の論理回路の設計方法。
  10. 前記第2プログラム記述を用いて設計対象回路のシミュレーションを行う第3処理を更に含むことを特徴とする請求項9記載の論理回路の設計方法。
  11. 前記第2処理は、前記第1プログラム記述を変換して、前記レジスタ代入文が入力変数と出力変数を用いて変形された記述を含む第2プログラム記述を前記回路情報として生成する処理を含むことを特徴とする請求項6記載の論理回路の設計方法。
  12. 前記第2処理は、前記第2プログラム記述を変換して、前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含み、所定のプログラム言語で記述されてコンピュータで実行可能なむ第3プログラム記述を、前記回路情報として生成する処理を含むことを特徴とする請求項11記載の論理回路の設計方法。
  13. 前記第3プログラム記述を用いて設計対象回路のシミュレーションを行う第3処理を更に含むことを特徴とする請求項12記載の論理回路の設計方法。
  14. タイミング仕様に基づいて回路動作を定義するために、所定のプログラム言語を流用して記述され、サイクル精度で回路動作を特定可能とするレジスタ代入文とクロック境界記述を含む第1プログラム記述を入力する入力処理と、
    前記レジスタ代入文が入力変数と出力変数を用いて変形されると共に前記クロック境界記述に対応させて前記入力変数を出力変数に代入する記述を含み、前記所定のプログラム言語で記述された第2プログラム記述を生成する変換処理と、を含むことを特徴とする論理回路の設計方法。
  15. 前記変換処理は、第1プログラム記述に基づいてCFGを生成する過程で、前記CFGに前記クロック境界記述に対応してクロック境界ノードを設定し、前記クロック境界ノードの後に、前記レジスタ代入記述を挿入することを特徴とする請求項14記載の論理回路の設計方法。
  16. 第2プログラム記述に対してそのCFGを利用しながらステート遷移毎の変数表を作成しながらコード最適化を行う最適化処理を更に含むことを特徴とする請求項15記載の論理回路の設計方法。
  17. 前記変数表においてステート間で変数に変化のない部分を前置保持を要する部分として抽出し、抽出された部分に、出力変数に入力変数を代入する記述を追加する前置保持処理を更に含むことを特徴とする請求項16記載の論理回路の設計方法。
  18. 前記前置保持処理を経た変数表の各ステート遷移毎の変数と引数に基づいてステートマシンを構成するコードの抽出を行う抽出処理を更に含むことを特徴とする請求項17記載の論理回路の設計方法。
  19. 前記抽出処理で抽出されたステートマシン構成コードと第2プログラム記述を参照しながら、前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する処理を更に含むことを特徴とする請求項18記載の論理回路の設計方法。
  20. 前記第1プログラム記述に対して0サイクルで実行されるループが存在するか否かが判定され、存在しないと判別されたときに前記回路仕様を満足する回路のハードウェアを所定のハードウェア記述言語で記述する処理を行うことを特徴とする請求項14記載の論理回路の設計方法。
JP2004544923A 2002-10-15 2003-10-07 コンパイラ及び論理回路の設計方法 Expired - Fee Related JP3909073B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP2002300073 2002-10-15
JP2002300073 2002-10-15
PCT/JP2003/012839 WO2004036463A1 (ja) 2002-10-15 2003-10-07 コンパイラ及び論理回路の設計方法

Publications (2)

Publication Number Publication Date
JPWO2004036463A1 true JPWO2004036463A1 (ja) 2006-02-16
JP3909073B2 JP3909073B2 (ja) 2007-04-25

Family

ID=32104971

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004544923A Expired - Fee Related JP3909073B2 (ja) 2002-10-15 2003-10-07 コンパイラ及び論理回路の設計方法

Country Status (4)

Country Link
US (2) US20050289518A1 (ja)
JP (1) JP3909073B2 (ja)
AU (1) AU2003271116A1 (ja)
WO (1) WO2004036463A1 (ja)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
TW200725415A (en) * 2005-12-30 2007-07-01 Tatung Co Ltd Method for automatically translating high level programming language into hardware description language
JP4770657B2 (ja) 2006-09-13 2011-09-14 日本電気株式会社 パイプライン合成システム、方法及びプログラム
JP4293562B2 (ja) * 2006-11-07 2009-07-08 シャープ株式会社 ハードウェア検証用プログラミング記述生成装置、高位合成装置、ハードウェア検証用プログラミング記述生成方法、ハードウェア検証用プログラム生成方法、制御プログラムおよび可読記録媒体
JP5050985B2 (ja) * 2008-04-30 2012-10-17 富士通株式会社 検証支援プログラム、検証支援装置および検証支援方法
JP5163350B2 (ja) * 2008-05-19 2013-03-13 富士通株式会社 検証支援プログラム、検証支援装置および検証支援方法
US8407681B2 (en) * 2008-05-23 2013-03-26 International Business Machines Corporation System and method for changing variables at runtime
US20100070951A1 (en) * 2008-09-15 2010-03-18 Horizon Semiconductors Ltd. Generic assembler
JP5093508B2 (ja) * 2008-10-15 2012-12-12 日本電気株式会社 ループ最適化システム、ループ最適化方法、及びループ最適化用プログラム
TW201020915A (en) * 2008-11-21 2010-06-01 Univ Nat Taiwan Parametric EDA function tool and method of simplifying EDA programming language
US9304749B2 (en) * 2013-09-12 2016-04-05 Marvell World Trade Ltd. Method and system for instruction scheduling
US10180826B2 (en) 2015-10-22 2019-01-15 Advanced Micro Devices, Inc. Estimation of bit widths of variables based on liveness
US11093682B2 (en) 2019-01-14 2021-08-17 Microsoft Technology Licensing, Llc Language and compiler that generate synchronous digital circuits that maintain thread execution order

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6192504B1 (en) * 1997-05-14 2001-02-20 International Business Machines Corporation Methods and systems for functionally describing a digital hardware design and for converting a functional specification of same into a netlist
US6226776B1 (en) * 1997-09-16 2001-05-01 Synetry Corporation System for converting hardware designs in high-level programming language to hardware implementations
US6175946B1 (en) * 1997-10-20 2001-01-16 O-In Design Automation Method for automatically generating checkers for finding functional defects in a description of a circuit
JP2002049652A (ja) * 2000-08-03 2002-02-15 Hiroshi Yasuda デジタル回路設計方法、そのコンパイラーおよびシミュレータ
US6530073B2 (en) * 2001-04-30 2003-03-04 Lsi Logic Corporation RTL annotation tool for layout induced netlist changes
JP3803561B2 (ja) * 2001-06-29 2006-08-02 松下電器産業株式会社 論理回路設計方法
JP4153732B2 (ja) * 2002-06-19 2008-09-24 株式会社東芝 ハードウェア動作記述変換方法及びそのためのプログラム

Also Published As

Publication number Publication date
WO2004036463A1 (ja) 2004-04-29
JP3909073B2 (ja) 2007-04-25
WO2004036463A9 (ja) 2005-01-20
AU2003271116A1 (en) 2004-05-04
US20050289518A1 (en) 2005-12-29
US20080098336A1 (en) 2008-04-24

Similar Documents

Publication Publication Date Title
US8930922B2 (en) Software-to-hardware compiler with symbol set inference analysis
JP3835754B2 (ja) 集積回路の設計方法及びそれによって設計された集積回路
US8473926B2 (en) Software-to-hardware compiler
US7143388B1 (en) Method of transforming software language constructs to functional hardware equivalents
US6135647A (en) System and method for representing a system level RTL design using HDL independent objects and translation to synthesizable RTL code
US7509604B1 (en) Method and apparatus for formally comparing stream-based designs
US9501269B2 (en) Automatic source code generation for accelerated function calls
US20080098336A1 (en) Compiler and logic circuit design method
US8904367B1 (en) Auto pipeline insertion
JP5910108B2 (ja) 高位合成装置,高位合成方法,高位合成プログラム,集積回路の設計方法
JP2007528059A (ja) ソフトウェアのモデル化、抽象、および分析のためのシステムと方法
US8332833B2 (en) Procedure control descriptor-based code specialization for context sensitive memory disambiguation
SNOW III AUTOMATION OF MODULE SET INDEPENDENT REGISTER-TRANSFER LEVEL DESIGN.
US7086047B1 (en) Determining hardware generated by high level language compilation through loop optimizations
JP2006285333A (ja) 動作合成装置及び方法
Fauth Beyond tool-specific machine descriptions
Skarman et al. Spade: an expression-based HDL with pipelines
US6952817B1 (en) Generating hardware interfaces for designs specified in a high level language
US7111274B1 (en) Scheduling hardware generated by high level language compilation to preserve functionality of source code design implementations
JP7407192B2 (ja) フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置
JP2006190085A (ja) デジタル回路のモデリング方法及び設計方法
JP7026563B2 (ja) 高位合成方法、高位合成プログラム、高位合成装置
JPH02176938A (ja) 機械語命令最適化方式
JP5233354B2 (ja) プロパティ検証システム、プロパティ検証方法、及びプログラム
Todman et al. Combining imperative and declarative hardware descriptions

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20050425

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20060606

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20060807

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20060807

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20061003

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20061130

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20061213

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20070116

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20070119

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110126

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110126

Year of fee payment: 4

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110126

Year of fee payment: 4

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110126

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20120126

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130126

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20130126

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140126

Year of fee payment: 7

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees