(57)【要約】【課題】【解決手段】ＨＤＬシミュレータを用いずに、ハードウェアの検証をクロックサイクル単位で行う汎用プログラミング言語モデルを作成する。【解決手段】動作記述を解析した動作解析情報からレジスタトランスファーレベルのハードウェアを高位合成する高位合成装置において、動作が割り当てられたコンポーネントの動作情報と、それらのコンポーネントの接続を示すデータパス情報と、コントローラの状態遷移情報とから、サイクルアキュレートモデル生成部１１３によって、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成してサイクルアキュレートモデルを作成する。【選択図】    図２
2004348606.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアの動作が表現された動作記述を解析し、該解析された動作情報からレジスタトランスファーレベルのハードウェアを高位合成する高位合成装置において、
動作が割り当てられたコンポーネントの動作情報と、これらのコンポーネントの接続を示すデータパス情報と、コントローラの状態遷移情報とから、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、これらの作成された各計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成するサイクルアキュレートモデル生成手段を有する高位合成装置。
【請求項２】
前記サイクルアキュレートモデル生成手段は、前記レジスタの状態およびコントローラの状態を保存するためにそれぞれ、読み出し用変数および書き込み用変数の２種類の変数と、これらの変数を格納するための読み出し用記憶領域および書き込み用記憶領域とを設定する請求項１に記載の高位合成装置。
【請求項３】
前記サイクルアキュレートモデル生成手段は、１クロックサイクルの検証を行うために、前記レジスタの状態を計算するための計算式およびコントローラの状態を計算するための計算式を用いて、読み出し用変数の値からレジスタおよびコントローラの状態を計算し、この計算結果を書き込み用変数として保存させる関数と、書き込み用変数として保存された計算結果を読み出し用変数として保存させる関数とを作成し、これらの作成された各関数の式を汎用プログラミング言語による記述として生成する請求項２に記載の高位合成装置。
【請求項４】
前記サイクルアキュレートモデル生成手段は、前記コンポーネントに記憶装置が含まれている場合に、該記憶装置の状態を計算するための計算式を作成し、この作成した計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成する請求項１〜３の何れかに記載の高位合成装置。
【請求項５】
前記サイクルアキュレートモデル生成手段は、前記記憶装置の状態を保存するために、読み出し用変数および書き込み用変数の２種類の各変数と、これらの変数を格納するための読み出し用記憶領域および書き込み用記憶領域とを設定する請求項４に記載の高位合成装置。
【請求項６】
前記サイクルアキュレートモデル生成手段は、１クロックサイクルの検証を行うために、前記記憶装置の状態を計算するための計算式を用いて、読み出し用変数の値から記憶装置の状態を計算し、この計算結果を書き込み用変数として保存させる関数と、書き込み用変数として保存された計算結果を読み出し用変数として保存させる関数とを作成し、これらの作成した関数の式を汎用プログラミング言語による記述として生成する請求項５に記載の高位合成装置。
【請求項７】
請求項１〜６の何れかに記載の高位合成装置を用いて、
動作が割り当てられたコンポーネントの動作情報と、これらのコンポーネントの接続を示すデータパス情報と、コントローラの状態遷移情報とから、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、これらの作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成するサイクルアキュレートレベルでのハードウェア検証用プログラミング言語モデルを生成するハードウェア検証用モデル生成方法。
【請求項８】
前記コンポーネントに記憶装置が含まれている場合に、請求項４〜６の何れかに記載の高位合成装置を用いて記憶装置の状態を計算する計算式を作成し、この作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成する請求項７に記載のハードウェア検証用モデル生成方法。
【請求項９】
請求項１〜６の何れかに記載の高位合成装置によって作成された計算式を用いて、レジスタの状態およびコントローラの状態を計算し、この計算結果を用いてハードウェアの動作を検証するハードウェア検証方法。
【請求項１０】
前記コンポーネントに記憶装置が含まれている場合に、請求項４〜６の何れかに記載の高位合成装置によって作成された計算式を用いて、記憶装置の状態を計算し、この計算結果を用いてハードウェアの動作を検証する請求項９に記載のハードウェア検証方法。
【請求項１１】
請求項２、３、５または６に記載の高位合成装置によって作成された計算式を用いて、
読み出し用変数の値からレジスタの状態およびコントローラの状態を計算し、計算結果を書き込み用変数として保存させる計算ステップと、
該計算ステップで得られた計算結果を読み出し用変数として保存させる更新ステップとを行うことによって、ハードウェアの１クロックサイクルの検証を行う請求項９に記載のハードウェア検証方法。
【請求項１２】
請求項５または６に記載の高位合成装置によって作成された計算式を用いて、
読み出し用変数の値から記憶装置の状態を計算し、この計算結果を書き込み用変数として保存させる計算ステップと、
該計算ステップで得られた計算結果を読み出し用変数として保存させる更新ステップとを行うことによって、ハードウェアの１クロックサイクルの検証を行う請求項１０に記載のハードウェア検証方法。
【請求項１３】
前記更新ステップにおいて、記憶装置の状態については、計算ステップで計算された要素についてのみ更新動作を行う請求項１２に記載のハードウェア検証方法。
【請求項１４】
前記計算ステップにおいて、同一クロックサイクルに重複して計算を行っても計算結果が同じであるコンポーネントについては、計算実行中のクロックサイクルで既に計算済みであれば、それらの計算を重複して行わないようにした請求項１１〜１３の何れかに記載のハードウェア検証方法。
【請求項１５】
請求項７〜１４の何れかに記載の方法の各処理手順をコンピュータに実行させる制御プログラム。
【請求項１６】
請求項１５に記載の制御プログラムが記録されたコンピュータ読み取り可能な可読記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ハードウェアをサイクルアキュレートレベル（サイクルまたはクロックの精度）で検証するための汎用プログラミング言語によるモデルを生成することができる高位合成装置、ハードウェア検証用モデル生成方法およびハードウェア検証方法に関する。
【０００２】
【従来の技術】
近年、大規模なシステムＬＳＩの開発においては、設計されたハードウェアの動作がシステムに与えられた要求仕様を満たすか否かを検証する必要がある。
【０００３】
従来、サイクルアキュレートレベルでハードウェアの検証を行うためには、ＨＤＬ（Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）シミュレータが用いられており、ＨＤＬシミュレータでハードウェアの動作速度などのパフォーマンスを測定することによって、システムに与えられた仕様が満たされているか否かが検証されている。
【０００４】
一般に、ＨＤＬシミュレータでは、ＶＨＤＬなどのハードウエア記述言語で記述された回路動作のシミュレーションが行われる。このＨＤＬシミュレータによって、回路内の信号の変化をクロックサイクルより短い時間単位で監視し、その変化を、接続される信号に伝搬するイベント駆動方式によってシミュレーションが行われる。
【０００５】
ハードウェアとソフトウェアとからなるシステムにおいて、ハードウェア記述言語で記述されたハードウェアの動作と、汎用プログラミング言語で記述されたソフトウェアの動作とを協調検証する場合には、ハードウェアはＨＤＬシミュレータを用いてデバッグされ、ソフトウェアはソフトデバッガなどを用いてデバッグされる。
【０００６】
このようなＨＤＬシミュレータを用いない検証方法として、特許文献１には、汎用プログラミング言語を用いてハードウェアの動作をシミュレーションし、ハードウェアとソフトウェアとを協調検証する手法が記載されている。
【０００７】
また、特許文献２には、ハードウェアの全演算器の動作を示す動作記述を作成し、汎用プログラミング言語による検証モデルを生成することによって、ハードウェアのサイクルアキュレートレベルでの検証を高速に行うことができるという手法が開示されている。
【０００８】
【特許文献１】
特開平１０−１４９３８２号公報
【特許文献２】
特開２００１−１４３５６号公報
【０００９】
【発明が解決しようとする課題】
しかしながら、イベント駆動方式でシミュレーションを進めるＨＤＬシミュレータによる検証では、シミュレーションの時間単位がクロックサイクルより短い。よって、ハードウェアをサイクルアキュレートレベルで検証するためには冗長で無駄な計算が多く、効率が悪くなるという問題がある。また、シミュレーションされる回路の規模が大きいか、またはテストパターンが長い場合などには、シミュレーションのために必要な計算量が非常に多くなり、シミュレーションに時間がかかるという問題もある。さらに、ＨＤＬシミュレータは高価であり、システムＬＳＩの開発コストが増加するという問題もある。
【００１０】
さらに、ハードウェア記述言語で記述されたハードウェアをＨＤＬシミュレータでデバッグし、また、汎用プログラミング言語で記述されたソフトウェアをソフトデバッガでデバッグすることによって、ハードウェアとソフトウェアとを協調させて検証する場合には、言語が異なるデバッガを用いる。よって、言語間のマッチングを取るために手間がかかり、効率が悪くなるという問題もある。
【００１１】
上記特許文献１では、並列動作するハードウェアをＣ言語などの汎用プログラミング言語にて表現し、これをデバッグすることによって、ハードウェアとソフトウェアとの協調検証における高効率化が図られている。
【００１２】
しかしながら、この特許文献１に開示されている手法では、ハードウェアのアルゴリズムレベルにおける検証は可能であるが、サイクルアキュレートレベルでの検証精度は低く、システムに与えられた動作周波数などの要求仕様を満たすか否かを検証することはできない。
【００１３】
また、特許文献２に開示されている検証モデルは、高位合成された回路の動作に対して、サイクルアキュレートレベルで同等の動作を実行させることができると記載されているが、任意のクロックサイクルにおける回路の状態を観測することはできない。ハードウェアのデバッグにおいて、回路内部の状態、特にレジスタの値とコントローラの状態とを確認することは、ハードウェアの不具合となる原因を究明するための材料となることが多いため、回路内部の状態を確認することは重要である。
【００１４】
本発明は、上記従来の問題を解決するもので、ＨＤＬシミュレータを用いずに、ハードウェアの検証をクロックサイクル単位で行う汎用プログラミング言語モデルを作成することができる高位合成装置、ハードウェア検証用モデル生成方法およびハードウェア検証方法を提供することを目的とする。
【００１５】
【課題を解決するための手段】
本発明の高位合成装置は、ハードウェアの動作が表現された動作記述を解析し、該解析された動作情報からレジスタトランスファーレベルのハードウェアを高位合成する高位合成装置において、動作が割り当てられたコンポーネントの動作情報と、これらのコンポーネントの接続を示すデータパス情報と、コントローラの状態遷移情報とから、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、これらの作成された各計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成するサイクルアキュレートモデル生成手段を有するものであり、そのことにより上記目的が達成される。
【００１６】
また、好ましくは、本発明の高位合成装置におけるサイクルアキュレートモデル生成手段は、前記レジスタの状態およびコントローラの状態を保存するためにそれぞれ、読み出し用変数および書き込み用変数の２種類の変数と、これらの変数を格納するための読み出し用記憶領域および書き込み用記憶領域とを設定する。
【００１７】
さらに、好ましくは、本発明の高位合成装置におけるサイクルアキュレートモデル生成手段は、１クロックサイクルの検証を行うために、前記レジスタの状態を計算するための計算式およびコントローラの状態を計算するための計算式を用いて、読み出し用変数の値からレジスタおよびコントローラの状態を計算し、この計算結果を書き込み用変数として保存させる関数と、書き込み用変数として保存された計算結果を読み出し用変数として保存させる関数とを作成し、これらの作成された各関数の式を汎用プログラミング言語による記述として生成する。
【００１８】
さらに、好ましくは、本発明の高位合成装置におけるサイクルアキュレートモデル生成手段は、前記コンポーネントに記憶装置が含まれている場合に、該記憶装置の状態を計算するための計算式を作成し、この作成した計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成する。
【００１９】
さらに、好ましくは、本発明の高位合成装置におけるサイクルアキュレートモデル生成手段は、前記記憶装置の状態を保存するために、読み出し用変数および書き込み用変数の２種類の各変数と、これらの変数を格納するための読み出し用記憶領域および書き込み用記憶領域とを設定する。
【００２０】
さらに、好ましくは、本発明の高位合成装置におけるサイクルアキュレートモデル生成手段は、１クロックサイクルの検証を行うために、前記記憶装置の状態を計算するための計算式を用いて、読み出し用変数の値から記憶装置の状態を計算し、この計算結果を書き込み用変数として保存させる関数と、書き込み用変数として保存された計算結果を読み出し用変数として保存させる関数とを作成し、これらの作成した関数の式を汎用プログラミング言語による記述として生成する。
【００２１】
本発明のハードウェア検証用モデル生成方法は、請求項１〜６の何れかに記載の高位合成装置を用いて、動作が割り当てられたコンポーネントの動作情報と、これらのコンポーネントの接続を示すデータパス情報と、コントローラの状態遷移情報とから、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、これらの作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成するサイクルアキュレートレベルでのハードウェア検証用プログラミング言語モデルを生成するものであり、そのことにより上記目的が達成される。
【００２２】
また、好ましくは、本発明のハードウェア検証用モデル生成方法において、コンポーネントに記憶装置が含まれている場合に、請求項４〜６の何れかに記載の高位合成装置を用いて記憶装置の状態を計算する計算式を作成し、この作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成する。
【００２３】
本発明のハードウェア検証方法は、請求項１〜６の何れかに記載の高位合成装置によって作成された計算式を用いて、レジスタの状態およびコントローラの状態を計算し、この計算結果を用いてハードウェアの動作を検証するものであり、そのことにより上記目的が達成される。
【００２４】
また、好ましくは、本発明のハードウェア検証方法において、コンポーネントに記憶装置が含まれている場合に、請求項４〜６の何れかに記載の高位合成装置によって作成された計算式を用いて、記憶装置の状態を計算し、この計算結果を用いてハードウェアの動作を検証する。
【００２５】
さらに、好ましくは、本発明のハードウェア検証方法において、請求項２、３、５または６に記載の高位合成装置によって作成された計算式を用いて、読み出し用変数の値からレジスタの状態およびコントローラの状態を計算し、計算結果を書き込み用変数として保存させる計算ステップと、該計算ステップで得られた計算結果を読み出し用変数として保存させる更新ステップとを行うことによって、ハードウェアの１クロックサイクルの検証を行う。
【００２６】
さらに、好ましくは、本発明のハードウェア検証方法にいて、請求項５または６に記載の高位合成装置によって作成された計算式を用いて、読み出し用変数の値から記憶装置の状態を計算し、この計算結果を書き込み用変数として保存させる計算ステップと、該計算ステップで得られた計算結果を読み出し用変数として保存させる更新ステップとを行うことによって、ハードウェアの１クロックサイクルの検証を行う。
【００２７】
さらに、好ましくは、本発明のハードウェア検証方法における更新ステップにおいて、記憶装置の状態については、計算ステップで計算された要素についてのみ更新動作を行う。
【００２８】
さらに、好ましくは、本発明のハードウェア検証方法における計算ステップにおいて、同一クロックサイクルに重複して計算を行っても計算結果が同じであるコンポーネントについては、計算実行中のクロックサイクルで既に計算済みであれば、それらの計算を重複して行わないようにする。
【００２９】
本発明の制御プログラムは、請求項７〜１４の何れかに記載のハードウェア検証用モデル生成方法またはハードウェア検証方法の各処理手順をコンピュータに実行させるものである。
【００３０】
本発明の可読記録媒体は、請求項１５に記載の制御プログラムが記録されたコンピュータ読み取り可能である。
【００３１】
上記構成により、以下に、本発明の作用について説明する。
【００３２】
本発明にあっては、ハードウェアの動作が表現された動作記述（ビヘイビア記述）を解析し、その解析された動作情報からハードウェアを自動合成する高位合成装置において、その高位合成の結果、割り当てられた演算器やレジスタなどのコンポーネントの動作情報と、それらの接続を示すデータパスの情報と、それらのコンポーネントを制御するコントローラの状態遷移情報とから、レジスタの状態を計算する計算式と、コントローラの状態を計算する計算式とを作成し、これらの計算式を汎用プログラミング言語の記述として生成する。
【００３３】
Ｃ言語等の高級プログラミング言語では、逐次処理が行われるため、そのプログラムの処理サイクルと検証のサイクルとを時間的に対応させる必要がある。処理のサイクル単位で考えると、処理の最初（読み出し時に対応）の変数（レジスタの値に対応）と、処理後（書き込み時に対応）の変数（レジスタの値に対応）とは、同じ変数であっても、時間的に変化しているからである。このため、ハードウェアが複数のレジスタを含んでおり、また、それらレジスタが相互の値を参照して動作する場合に、レジスタへの入力データを計算する順番によっては、正確な値を算出できないことがある。例えば、レジスタ１によってレジスタ２で保存されている値が参照され、レジスタ２によってレジスタ１で保存されている値が参照される場合、（１）レジスタ１の動作を計算した後、レジスタ２の動作を計算する場合と、（２）レジスタ２の動作を計算した後、レジスタ１の動作を計算する場合とでは、計算結果が異なることがある。
【００３４】
この問題を解決するために、本発明では、書き込み用変数および読み出し用変数と、それらの変数を格納する領域とを設定する。読み出し用変数を用いて、実際のハードウェアにおいて１クロックサイクルで何らかの演算などが行われた後でレジスタに入力されるデータを計算式により求め、この計算結果を書き込み用変数としてバッファやレジスタなどの書き込み用記憶領域に保存させる計算ステップと、書き込み用変数として保存されている計算結果を読み出し用変数としてバッファやレジスタなどの読み出し用記憶領域に保存させる更新ステップとを順番に行う。これによって、ハードウェアの１クロックサイクルのシミュレーションを行うことができる。
【００３５】
コンポーネントとしてＲＡＭなどの記憶装置が含まれている場合には、レジスタと同様に、記憶装置の状態を計算する計算式を作成し、この計算式を汎用プログラミング言語の記述として生成することによって、ＲＡＭなどの記憶装置を含むハードウェアに対しても、サイクルアキュレートレベルでの検証を行うことができる。
【００３６】
本発明によれば、従来技術のように、動作速度が遅く、高価なＨＤＬシミュレータを用いなくても、ハードウェアのパフォーマンスを高速に検証することができる。また、検証用モデルは、汎用プログラミング言語で記述されているので、ソフトウェアによって表現されたハードウェア以外の動作部分と組み合わせることができ、ハードウェア／ソフトウェア協調設計を容易に行うことができる。また、クロックサイクル単位でハードウェアの動作を記述することができるので、任意のサイクル数だけシミュレーションを行ったり、任意のタイミングでシミュレーションを止めたりすることができる。これは、ハードウェアのデバッグを行うために有効である。
【００３７】
ＲＡＭなどの複数の要素を有するものに対して入力データを計算する場合に、マルチ入力可能なメモリではなく、１クロックサイクル中に一つの要素に対してのみデータ入力が行われるのであれば、その入力された要素についてのみ、保存される値（変数）を更新することも可能である。これによって、一度計算された部分は次に計算されるまで更新されないようにして、効率を向上させることができる。
【００３８】
また、クロックサイクルレベルで変化していない変数であれば、同一クロックサイクルに重複して計算を行っても計算結果が同じとなるため、変化した部分のみ、保存される値（変数）を更新することも可能である。これによって、計算実行中のクロックサイクルで既に計算済みの部分は、それらの計算が重複して行われないように保存しておき、次回以降、その保存された値を用いることにより、効率を向上させることができる。複数の類似の処理ルートがある場合には、特に有効である。
【００３９】
【発明の実施の形態】
以下に、本発明の高位合成装置の実施形態１〜３について、図面を参照しながら説明する。
【００４０】
（実施形態１）
ハードウェアの高位合成とは、ハードウェアの構造に関する情報は含まれず、処理の動作のみが記述された動作記述から、ＲＴＬ（レジスタ・トランスファ・レベル）の論理回路を自動生成するコンピュータシステムによる技術である。高位合成の手法としては、“Ｈｉｇｈ−Ｌｅｖｅｌ  Ｓｙｎｔｈｅｓｉｓ”，  Ｋｌｕｗｅｒ  Ａｃａｄｅｍｉｃ  Ｐｕｂｌｉｓｈｅｒｓや、特開平５−格納部１０格納部１１４１号公報などに詳細が記載されているので、ここでは基本的な動作についてのみ説明する。なお、本実施形態１〜３で説明するハードウェアの高位合成においては、回路の並列動作を記述することができるものとする。また、本実施形態１〜３では、汎用プログラミング言語としてＣ言語を用いるものとする。
【００４１】
図１は、本発明の高位合成装置の実施形態１における要部構成を示すブロック図である。
【００４２】
図１において、高位合成装置１０は、コンピュータシステムにて構成され、各部を制御して制御プログラムを実行する制御部１１と、制御プログラムおよびそのデータなどが記録されたＲＯＭ１２と、制御部１１の制御時にワークメモリとして働くＲＡＭ１３と、回路設計に必要な各種データが記録されていると共に、コントローラ情報やデータパス情報など各種生成結果情報を記憶するデータベース１４と、ユーザによる操作指令入力を可能とする操作部１５と、各種画像表示が為される表示部１６とを有し、ハードウェアの動作が表現された動作記述を解析し、この解析された動作記述から、演算処理を示す節点とデータの流れを示す入出力枝により生成されたコントロールデータフローグラフを用いて、ＲＴＬ（レジスタトランスファレベル）の所望のハードウェア（回路図）を自動合成（自動設計）する。この場合、ＲＯＭ１２には、ＦＤやＣＤ（光ディスク）などの可読記録媒体から制御プログラムおよびそのデータがインストールされている。
【００４３】
制御部１１はＣＰＵ（中央演算処理装置）で構成されており、制御プログラムに基づいて、図２に示すサイクルアキュレートモデル自動生成部１１３などの各種機能手段（機能部）による各処理手順を順次実行するようになっている。
【００４４】
図２は、本発明の高位合成装置の実施形態１における制御部の要部構成を示すブロック図である。
【００４５】
図２において、この高位合成装置は、ハードウェアの動作記述格納部格納部１０１と、構文解析・字句解析部１０２と、ブロック分割部１０３と、ＣＤＦＧ（コントロールデータフローグラフ）生成部１０４と、スケジューリング部１０５と、演算器・レジスタの割り当て部１０６と、データパス生成部１０７と、コントローラ生成部１０８と、ＲＴＬ記述自動生成部１１２と、サイクルアキュレートモデル自動生成部１１３と、ＲＴＬ記述格納部１１４と、汎用プログラミング言語モデル格納部１１５とを有している。
【００４６】
本実施形態１の高位合成装置において、ハードウェアの動作記述格納部１０１からの動作記述は、構文解析・字句解析部１０２によって解析された後、ブロック分割部１０３で、並列動作の記述に従って、回路がブロック分割される。その後、ＣＤＦＧ生成部１０４では、分割された各ブロックにおいてコントロールデータフローグラフ（ＣＤＦＧ）が作成される。さらに、スケジューリング部１０５によって、ＣＤＦＧの各ノードについて、スケジューリングが行われる。演算器・レジスタの割り当て部１０６で、スケジューリングされた各ノードについて、演算器やレジスタなどのハードウェアが割り当てられて、各コンポーネントについての動作情報が作成される。その作成された動作情報がコンポーネント動作情報格納部１０９に記憶される。
【００４７】
次に、データパス生成部１０７では、演算器・レジスタの割り当て部１０６でハードウェアにアロケーション（割り当て）された各演算器やレジスタの接続関係から、回路のデータパス情報が作成される。その作成されたデータパス情報がデータパス情報格納部１１１に記憶される。
【００４８】
さらに、コントローラ生成部１０８では、各ブロックのコントローラ回路が生成され、コントローラ回路の状態遷移を含むコントローラ情報が作成される。その作成されたコントローラ情報がコントローラ情報格納部１１０に記憶される。
【００４９】
ＲＴＬ記述自動生成部１１２では、演算器やレジスタなどのコンポーネント動作情報格納部１０９と、コントローラ情報格納部１１０と、回路のデータパス情報格納部１１１とからＲＴＬ記述が生成される。その生成されたＲＴＬ記述がＲＴＬ記述格納部１１４に記憶される。
【００５０】
また、サイクルアキュレートモデル自動生成部１１３では、ハードウェアをサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルがサイクルアキュレートモデルとして生成される。その生成されたサイクルアキュレートモデルがサイクルアキュレートモデル格納部１１５に記憶される。
【００５１】
本実施形態１の高位合成装置と従来の高位合成装置との違いは、このサイクルアキュレートモデル自動生成部１１３が設けられていることである。このサイクルアキュレートモデル自動生成部１１３で生成された汎用プログラミング言語モデルは、ＬＳＩなどのハードウェアを高位合成にて生成した際に、シミュレーションやデバッグを、クロック単位（サイクル単位）で確認できるようにしたものである。このサイクルアキュレートモデルは、汎用プログラミング言語で記述されているため、ＲＴＬレベルの各部分を検証する際に、正確かつ高速に検証を行うことができる。
【００５２】
以下に、本発明の特徴構成である図２に示すサイクルアキュレートモデル自動生成部１１３およびサイクルアキュレートモデル格納部１１５について、さらに詳細に説明する。
【００５３】
図３は、本発明の実施形態１として、図２のサイクルアキュレートモデル自動生成部１１３によるサイクルアキュレートモデル生成処理が行われる回路の一例を示す図である。
【００５４】
図３において、この回路は、本発明の高位合成装置によって生成された回路であって、一つの定数２０１と、一つのレジスタ２０２と、一つのコントローラ２０３と、一つの外部入力ポート２０４と、一つの演算器２０５と、一つの外部出力ポート２０６とを有している。図３では、定数２０１にＣ、レジスタ２０２にＲ、コントローラ２０３にＣＴＲＬ、演算器２０５にＯＰ、外部入力ポート２０４にＩ、外部出力ポート２０６にＯの記号を付けている。
【００５５】
演算器２０５では、定数２０１およびレジスタＲとの値が入力されて演算処理が行われ、演算結果が外部出力ポート２０６から出力されると共にレジスタ２０２に格納されるようになっている。また、演算器２０５は、外部入力ポート２０４の値によって状態が制御されるコントローラ２０３によって制御されるようになっている。
【００５６】
図４は、図３に示す回路例について、図２のコンポーネント動作情報格納部１０９に格納されるコンポーネント動作情報の構成例を示す図である。ここでは、ハードウェアのコンポーネントとして、図３に示す定数２０１と、レジスタ２０２と、演算器２０５とについてのコンポーネント動作情報が含まれている。
【００５７】
図４に示すように、各コンポーネントの動作情報には、それぞれの入出力ポートについての情報も含まれており、定数Ｃについては出力ポートＯ１、レジスタＲについては入力ポートＩ１および出力ポートＯ１、演算器ＯＰについては入力ポートＩ１、Ｉ２、Ｉ３および出力ポートＯ１の情報が含まれている。
【００５８】
演算器ＯＰでは、入力ポートＩ３の値が‘０’のときに、入力ポートＩ１の値と入力ポートＩ２の値とを加算する演算が行われ、Ｉ３の値が‘１’のときには、Ｉ１の値からＩ２の値を減算する演算が行われものとする。
【００５９】
図５は、図３に示す回路例について、図２のコントローラ情報格納部１１０に格納されるコントローラ情報の構成例を示す図である。ここでは、図３に示すコントローラ２０３の情報が含まれている。
【００６０】
図３のコントローラ２０３は、図５に示すように、“ステートＡ”と“ステートＢ”との二つのステート（状態）を有し、“ステートＡ”のときには‘０’が出力され、“ステートＢ”のときには‘１’が出力されるものとする。また、コントローラ２０３への入力が‘０’のときには、そのまま状態が維持され、コントローラへ２０３の入力が‘１’のときには状態が変化されるものとする。図６は、図３に示す回路例について、コントローラ２０３の状態遷移を図示したものである。
【００６１】
図７は、図３に示す回路例について、図２のデータパス情報格納部１１１に格納されたデータパス情報の構成例を示す図である。ここでは、図３に示す回路のデータパス情報が含まれている。
【００６２】
図７に示すように、例えば定数Ｃの出力ポートＯ１の値は、演算器ＯＰの入力ポートＩ１に入力され、レジスタＲの出力ポートＯ１の値は、演算器ＯＰの入力ポートＩ２に入力され、コントローラＣＴＲＬの出力ポートＯ１の値は、演算器ＯＰの入力ポートＩ３に入力される。また、外部入力ポートＩの値は、コントローラＣＴＲＬの入力ポートＩ１に入力される。さらに、演算器ＯＰの出力ポートＯ１の値は、外部出力ポートＯに入力されると共にレジスタＲの入力ポート１１に入力される。
【００６３】
上記構成により、図４に示すコンポーネント動作情報と、図５に示すコントローラ情報と、図７に示す回路のデータパス情報とから、この回路をサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデル（サイクルアキュレートモデル）を自動生成するサイクルアキュレートモデル生成処理の各処理手順について説明する。
【００６４】
まず、コンポーネント動作情報格納部１０９に格納されているコンポーネント動作情報から、この回路に含まれるレジスタＲの情報を抽出する。図３に示す回路の場合、レジスタＲの情報が抽出される。
【００６５】
次に、レジスタＲの状態（値）を計算するために、読み出し用変数と書き込み用変数とを用意し、バッファやレジスタにそれらの変数を格納するための領域を設ける。本実施形態１では、図８に示すように、読み出し用変数Ｒ＿ｒｄａｔａと書き込み用変数Ｒ＿ｗｄａｔａとして表す。
【００６６】
読み出し用変数Ｒ＿ｒｄａｔａは、シミュレーションしようとするクロックサイクルでのレジスタＲの値を示している。また、書き込み用変数Ｒ＿ｗｄａｔａは、シミュレーションしようとするクロックサイクルの次のクロックサイクルでのレジスタＲの値を示している。
【００６７】
次に、コントローラＣＴＲＬの状態を計算するために、読み出し用変数と書き込み用変数とを用意し、バッファやレジスタにそれらの変数を格納するための領域を設ける。本実施形態１では、図９に示すように、読み出し用ｃＳＴＡＴＥと書き込み用変数ｎＳＴＡＴＥとして表す。
【００６８】
読み出し用変数ｃＳＴＡＴＥは、シミュレーションしようとするクロックサイクルでのコントローラＣＴＲＬのステート（状態）を示している。また、書き込み用変数ｎＳＴＡＴＥは、シミュレーションしようとするクロックサイクルの次のクロックサイクルでのコントローラＣＴＲＬのステートを示している。
【００６９】
次に、コントローラの各状態を表す定数を用意する。図５に示すコントローラ情報格納部１１０に格納されたコントローラ情報では、コントローラＣＴＲＬのステートは、“ステートＡ”と“ステートＢ”とによって構成される。本実施形態１では、図１０に示すように、“ステートＡ”をＳＴＡＴＥ＿Ａとして表し、“ステートＢ”をＳＴＡＴＥ＿Ｂとして表す。
【００７０】
さらに、次のクロックサイクルでのレジスタＲ（レジスタ２０２）の値Ｒ＿ｗｄａｔａ（書き込み用変数）を求める計算式を作成する。
【００７１】
図７に示すデータパス情報格納部１１１に格納されたデータパス情報によれば、レジスタＲの入力は、演算器ＯＰ（演算器２０５）の出力と接続されている。図１１に、レジスタＲの値Ｒ＿ｗｄａｔａ（書き込み用変数）の計算を行う式の一例を示す。この例では、演算器ＯＰの計算は、関数ｅｘｅｃＯＰ（  ）として表されており、定数Ｃ、レジスタＲの値Ｒ＿ｒｄａｔａ（読み出し用変数）およびコントローラＣＴＲＬ（コントローラ２０３）の値ＣＴＲＬ＿Ｏ１が入力されて計算が行われる。
【００７２】
図４に示すコンポーネント動作情報格納部１０９に格納されたコンポーネント動作情報によれば、演算器ＯＰの処理は、入力Ｉ３が‘０’のときには入力Ｉ１とＩ２の値が加算され、‘１’のときにはＩ１からＩ２の値が減算される。この処理の例を図１２に示している。この図１２に示す例では、演算器ＯＰの入力Ｉ１、Ｉ２、Ｉ３がそれぞれ、引数ｉｎｐｕｔ１、ｉｎｐｕｔ２、ｉｎｐｕｔ３とされている。また、入力Ｉ３が‘０’でも‘１’でもないときには、エラー処理関数ｅｒｒｏｒ（  ）が実行される。
【００７３】
図７に示すデータパス情報格納部１１１に格納されたデータパス情報によれば、演算器ＯＰの入力Ｉ１は定数Ｃの出力であり、また、入力Ｉ２はレジスタＲの出力であり、さらに、入力Ｉ３はコントローラＣＴＲＬの出力である。
【００７４】
よって、図１１に示すレジスタＲの書き込み用変数Ｒ＿ｗｄａｔａの計算式においては、演算器ＯＰの計算を行う関数ｅｘｅｃＯＰ（  ）の引数として、ｉｎｐｕｔ１には定数Ｃの値が、ｉｎｐｕｔ２にはレジスタＲの値Ｒ＿ｒｄａｔａ（読み出し用変数）が、ｉｎｐｕｔ３にはコントローラＣＴＲＬの出力を示すＣＴＲＬ＿Ｏ１の値が代入されている。
【００７５】
次に、コントローラＣＴＲＬの次の状態ｎＳＴＡＴＥを計算する式を作成する。
【００７６】
図５に示すコントローラ情報格納部１１０に格納されたコントローラ情報によれば、コントローラＣＴＲＬ（コントローラ２０３）の出力は、コントローラＣＴＲＬのステートが”ステートＡ“のときには‘０’で、”ステートＢ“のときには‘１’である。よって、コントローラＣＴＲＬの出力ＣＴＲＬ＿Ｏ１は、図１３に示すような式で表すことができる。
【００７７】
また、図５に示すコントローラ情報によれば、コントローラＣＴＲＬは、入力Ｉ１の値が‘０’のときにはそのままの状態を維持し、‘１’のときには状態を遷移させる。また、図７に示すデータパス情報によれば、コントローラＣＴＲＬの入力Ｉ１は、外部入力Ｉの値である。これらの条件から、コントローラＣＴＲＬの次の状態を計算する式は、図１４に示すように表すことができる。この図１４に示す例では、コントローラＣＴＲＬ２０３の入力Ｉ１が‘０’でも‘１’でもないときには、エラー処理関数ｅｒｒｏｒ（  ）が実行される。
【００７８】
次に、レジスタＲ（書き込み用変数Ｒ＿ｗｄａｔａ）の計算式と、コントローラＣＴＲＬの状態（書き込み用変数ｎＳＴＡＴＥ）を計算する式とを実行するための関数を作成する。ハードウェアのシミュレーションでは、この関数を実行することによって、読み出し用変数を用いてレジスタの状態およびコントローラの状態を計算し、計算結果を書き込み用変数に保存するという計算ステップの処理が行われる。
【００７９】
図１５に、レジスタＲの計算式と、コントローラＣＴＲＬの状態を計算する式とを実行するための関数の例ｃａｌｃｕｌａｔｅ＿ｃｉｒｃｕｉｔ（  ）を示す。ここでは、図１１に示すレジスタＲの計算式と、図１４に示すコントローラＣＴＲＬの状態を計算する式とが実行される。
【００８０】
ｃａｌｃｕｌａｔｅ＿ｃｉｒｃｕｉｔ（  ）において、レジスタＲの計算式と、コントローラＣＴＲＬの状態を計算する式との実行順序は、変えてもよい。これは、各計算が、レジスタＲの読み出し用記憶領域Ｒ＿ｒｄａｔａと、コントローラＣＴＲＬの読み出し用記憶領域ｃＳＴＡＴＥとを用いて行われており、これらの値は、関数ｃａｌｃｕｌａｔｅ＿ｃｉｒｃｕｉｔ（  ）の中では変更されない。よって、各計算の処理順序を変えても計算結果は変わらないからである。このように計算の順序を変えても良いため、Ｃ言語などの逐次処理系の言語を用いて、ハードウェアをサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルを生成する場合に、計算するハードウェアの順序を決める必要がなく、効率を向上させることができる。
【００８１】
次に、読み出し用変数を更新するための関数を作成する。ハードウェアのシミュレーションでは、この関数を実行することによって、計算ステップで計算された結果（書き込み用変数の値）を、読み出し用変数に更新するという更新ステップの処理が行われる。
【００８２】
図１６に、レジスタＲの計算式と、コントローラＣＴＲＬの状態を計算する式とによって計算された結果を、読み出し用変数に更新するための関数の例ｕｐｄａｔｅ＿ｃｉｒｃｕｉｔ（  ）を示す。ここでは、レジスタＲの読み出し用Ｒ＿ｒｄａｔａに書き込み用Ｒ＿ｗｄａｔａの値が代入される。また、コントローラＣＴＲＬの読み出し用ｃＳＴＡＴＥに、書き込み用ｎＳＴＡＴＥの値が代入される。
【００８３】
以上のようにして、図３に示す回路をサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデル（サイクルアキュレートモデル格納部１１５に格納されるサイクルアキュレートモデル）が生成される。
【００８４】
以上により、本実施形態１で生成されたサイクルアキュレートモデルによれば、図１５に示す計算ステップの関数ｃａｌｃｕｌａｔｅ＿ｃｉｒｃｕｉｔ（  ）を実行した後、図１６に示す更新ステップの関数ｕｐｄａｔｅ＿ｃｉｒｃｕｉｔ（  ）を実行することによって、図３に示す回路の１クロックサイクル分の動作をシミュレーションすることができる。また、レジスタＲの値や、コントローラＣＴＲＬの状態などが変数として保存されているので、任意のクロックサイクルにおいて、それらの値を検証することができる。例えば、ハードウェアのデバッグを行う場合に、あるクロックサイクルで何らかの不具合が発生しているのであれば、本実施形態１によって生成されたサイクルアキュレートモデルを用いて、そのクロックサイクルまでシミュレーションを実行させ、そのときのレジスタＲの値やコントローラＣＴＲＬの状態を観測することによって、その不具合の原因を究明することができる。
【００８５】
これに対して、特許文献１に開示されている従来技術では、クロック単位（サイクル単位）での確認ができず、イベント単位での確認しかできない。また、特許文献２に開示されている従来技術では、高位合成された回路の動作に対して、サイクル単位で同等の動作（真似）をさせることはできるが、その状態を記憶させる記憶部（レジスタや変数）が設けられていないため、サイクル単位での観測を行って不具合が生じている部分を検出することはできない。
【００８６】
また、本実施形態１で生成されたサイクルアキュレートモデルによれば、ＨＤＬシミュレータによるデバッグよりも高速に実行することができる。また、Ｃ言語などの汎用プログラミング言語で記述されているので、安価なＣコンパイラがあればシミュレーションを行うことができるため、高価なＨＤＬシミュレータを用意する必要がない。本実施形態１のＣ言語で記述されたサイクルアキュレートモデルを用いた検証結果では、ＲＴＬの回路をＨＤＬシミュレータのみで検証したときと比べて、６倍〜４０倍程度も高速にシミュレーションを行うことができた。なお、ＬＳＩの内容によって、結果が大きく異なることは、容易に推測できると考えられるが、少なくとも高速にシミュレーションを実行することは可能である。
【００８７】
（実施形態２）
本実施形態２では、コンポーネントとしてＲＡＭなどの記憶装置が含まれている回路について、サイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルを生成する例について説明する。
【００８８】
図１７は、本発明の実施形態２として、図２に示すサイクルアキュレートモデル自動生成部１１３Ａによるサイクルアキュレートモデル生成処理が行われる回路の一例を示す図である。
【００８９】
図１７において、この回路は、メモリ３０５（ＲＡＭ１）に対して、外部からアドレスデータ３０１と、書き込みデータ３０２と、書き込み許可信号３０３と、読み出し許可信号３０４とが入力されている。また、メモリ３０５からは、読み出しデータ３０６が外部へ出力されている。図１７では、アドレスデータ３０１にはＡｄｄｒ、書き込みデータ３０２にはＤｉｎ、書き込み許可信号３０３にはＷｅｎ、読み出し許可信号３０４にはＲｅｎ、メモリ３０５にはＲＡＭ１、読み出しデータ３０６にはＤｏｕｔの記号を付けている。また、メモリ３０５の各要素にはＥ０、Ｅ１、Ｅ２、Ｅ３、・・・、Ｅｎ（ｎは自然数）の記号を付けている。
【００９０】
図１８に、図１７に示すメモリ３０５の動作モデルを表すＶＨＤＬ記述の一例を示している。図１８に示す例では、メモリ３０５（ＲＡＭ１）は、クロックに同期して値Ｄｏｕｔの読み出し、またはＤｉｎの書き込み処理が行われる。１クロックサイクル中に読み出し、または書き込みが行われる要素は、アドレスＡｄｄｒによって一つだけ示されるものとする。また、このメモリ３０５の動作モデルでは、書き込み要求Ｗｅｎおよび読み出し要求Ｒｅｎは、値‘１’でアクティブとされ、ＲＡＭ１に対するＷｅｎとＲｅｎとが同一クロックサイクル中に同時アクティブになった場合には、書き込み動作が優先されるようになっている。
【００９１】
図１９および図２０に、図１７に示すメモリ３０５について、図１８に示すＶＨＤＬ記述と同等の動作が行われるように、本実施形態２の汎用プログラミング言語モデル（サイクルアキュレートモデル）を生成した例を示している。
【００９２】
図１９では、読み出し用変数ＲＡＭ１＿ｒｄａｔａの値を用いてＲＡＭ１の状態を計算し、書き込み用変数ＲＡＭ１＿ｗｄａｔａに保存する計算ステップの処理を行うための関数として、ｃａｌｃｕｌａｔｅ＿ＲＡＭ１（  ）が表されている。
【００９３】
図２０では、計算ステップで計算された結果（書き込み用変数の値）を、読み出し用変数に更新する更新ステップの処理を行うための関数として、ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）が表されている。
【００９４】
図１９および図２０に示す関数ｃａｌｃｕｌａｔｅ＿ＲＡＭ１（  ）および関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）において、ＲＡＭ１の読み出し用変数は配列ＲＡＭ１＿ｒｄａｔａ［  ］として表され、書き込み用変数は配列ＲＡＭ１＿ｗｄａｔａ［  ］として表されている。ＲＡＭ１＿ｒｄａｔａ［  ］は、シミュレーションしようとするクロックサイクルでのＲＡＭ１の値を表し、ＲＡＭ１＿ｗｄａｔａ［  ］は、シミュレーションしようとするクロックサイクルの次のクロックサイクルでのＲＡＭ１の値を表す。また、ＲＡＭ１の要素数を定数ＳＩＺＥで表している。
【００９５】
図１９に示す関数ｃａｌｃｕｌａｔｅ＿ＲＡＭ１（  ）では、図１８に示すＶＨＤＬ記述のモデルと同様に、書き込み要求Ｗｅｎと読み出し要求Ｒｅｎとが同一クロックサイクル中に同時にアクティブになった場合に、書き込み動作が優先されている。
【００９６】
図２０に示す関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）では、上記実施形態１において図３に示す回路を用いて説明したレジスタＲの更新処理と同様に、読み出し用変数ＲＡＭ１＿ｒｄａｔａ［  ］の値に、書き込み用変数ＲＡＭ１＿ｗｄａｔａ［  ］の値が更新されている。
【００９７】
ところで、図１８に示すＲＡＭ１の動作モデルでは、１クロックサイクル中に読み出し、または書き込みが行われる要素は、アドレスＡｄｄｒで示される一つの要素だけである。したがって、図２０に示す関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）は、図２１に示す関数ｕｐｄａｔｅ＿ＲＡＭ１（  ）として表すことができる。
【００９８】
図２０に示す関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）では、ＲＡＭ１の全ての要素について更新処理が行われるのに対して、図２１に示す関数ｕｐｄａｔｅ＿ＲＡＭ１（  ）では、計算ステップで用いられる関数ｃａｌｃｕｌａｔｅ＿ＲＡＭ１（  ）において、書き込み処理が行われた要素についてのみ更新処理が行われるようになっている。
【００９９】
図２０に示す関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）と、図２１に示すｕｐｄａｔｅ＿ＲＡＭ１（  ）とを比較すると、その処理時間は大きく異なっており、図２０に示す関数ｕｐｄａｔｅ＿ＲＡＭ１＿ａｌｌ（  ）に比べて、図２１に示す関数ｕｐｄａｔｅ＿ＲＡＭ１（  ）によれば、高速に読み出し変数ＲＡＭ１＿ｒｄａｔａの更新処理を行うことができる。
【０１００】
このように、メモリなどの記憶装置をサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルを生成するときに、計算ステップで計算された要素についてのみ、読み出し変数の更新処理を行うようにすると、シミュレーション時間を短縮化することができるため、効率を向上させることができる。
【０１０１】
（実施形態３）
図２２は、本発明の実施形態３として、図２のサイクルアキュレートモデル自動生成部１１３Ｂによるサイクルアキュレートモデル生成処理が行われる回路の一例を示す図である。
【０１０２】
図２２に示す例では、図３に示す回路が一つの回路ブロック２０７として表されている。回路ブロック２０７の外部出力ポート２０６は、回路ブロック２０８の外部入力ポート２０９および回路ブロック２１１の外部入力ポート２１２に接続されている。また、回路ブロック２０８において、外部入力ポート２０９はレジスタ２１０に接続され、回路ブロック２１１において、外部入力ポート２１２はレジスタ２１３に接続されている。図２２では、外部入力ポート２０９にＩ２、外部入力ポート２１２にＩ３の記号を付けている。また、レジスタ２１０にＲ２、レジスタ２１３にはＲ３の記号を付けている。
【０１０３】
図２３に、図２２のレジスタＲ２の読み出し用変数Ｒ２＿ｒｄａｔａの値を用いてレジスタＲ２の状態を計算し、書き込み用変数Ｒ２＿ｗｄａｔａに保存する計算ステップの処理を行うための関数としてのｃａｌｃｕｌａｔｅ＿ｂｌｏｃｋ２を示している。
【０１０４】
図２４に、図２２のレジスタＲ３の読み出し用変数Ｒ３＿ｒｄａｔａの値を用いてレジスタＲ３の状態を計算し、書き込み用変数Ｒ３＿ｗｄａｔａに保存する計算ステップの処理を行うための関数としてのｃａｌｃｕｌａｔｅ＿ｂｌｏｃｋ３を示している。
【０１０５】
図２３に示す関数ｃａｌｃｕｌａｔｅ＿ｂｌｏｃｋ２（  ）と、図２４に示す関数ｃａｌｃｕｌａｔｅ＿ｂｌｏｃｋ３（  ）とにおいて、回路ブロック２０８および回路ブロック２１１に含まれるレジスタＲ２およびＲ３の次のクロックサイクルでの値（書き込み用変数Ｒ２＿ｗｄａｔａおよびＲ３＿ｗｄａｔａ）を求める計算式は、いずれも、回路ブロック２０７からの外部出力Ｏの値を参照して行われる。
【０１０６】
図７に示す回路ブロック２０７のデータパス情報によれば、外部出力Ｏの値は演算器ＯＰの計算式によって求められる。この演算器ＯＰの計算式は、図１１に示すレジスタＲの計算式のように、関数ｅｘｅｃＯＰ（  ）で表される。したがって、回路ブロック２０８の計算ステップと、回路ブロック２１１の計算ステップにおいては、何れも、関数ｅｘｅｃＯＰ（  ）が実行される。
【０１０７】
本実施形態３では、この関数ｅｘｅｃＯＰ（  ）の計算結果が一度得られると、そのときのクロックサイクルを記憶しておき、その後、同一のクロックサイクルのシミュレーションにおいて、再びｅｘｅｃＯＰ（  ）が実行されても、同じ計算を行わないように工夫をする。
【０１０８】
図２５に、このような工夫を施した関数ｅｘｅｃＯＰ（  ）の例を示している。
【０１０９】
図２５に示す関数ｅｘｅｃＯＰ（  ）では、クロックサイクルの値を示すための二つの変数ｃｙｃｌｅ＿ｌａｓｔ＿ｃａｌｃｕｌａｔｅｄと、ｃｙｃｌｅ＿ｃｕｒｒｅｎｔ＿ｃａｌｃｕｌａｔｅとが用いられている。変数ｃｙｃｌｅ＿ｌａｓｔ＿ｃａｌｃｕｌａｔｅｄは、関数ｅｘｅｃＯＰ（  ）の処理において、最後に演算器ＯＰによる計算が実行されたシミュレーションのクロックサイクルの値を表している。また、変数ｃｙｃｌｅ＿ｃｕｒｒｅｎｔ＿ｃａｌｃｕｌａｔｅは、シミュレーションしようとするクロックサイクルの値を表している。
【０１１０】
図２５に示すように、変数ｃｙｃｌｅ＿ｃｕｒｒｅｎｔ＿ｃａｌｃｕｌａｔｅが、変数ｃｙｃｌｅ＿ｌａｓｔ＿ｃａｌｃｕｌａｔｅｄの値に満たない場合には、それは、関数ｅｘｅｃＯＰ（  ）がシミュレーションしようとするクロックサイクルにおいて、まだ一度も実行されていないことを示している。このときには、演算器ＯＰによる計算が行われ、変数ｃｙｃｌｅ＿ｌａｓｔ＿ｃａｌｃｕｌａｔｅｄの値が、変数ｃｙｃｌｅ＿ｃｕｒｒｅｎｔ＿ｃａｌｃｕｌａｔｅの値に更新される。また、それ以外の場合には、関数ｅｘｅｃＯＰ（  ）がシミュレーションしようとするクロックサイクルにおいて、実行済みであることを示しているので、計算は行われない。
【０１１１】
これによって、同一クロックサイクル中に複数回、関数ｅｘｅｃＯＰ（  ）が実行されても、演算器ＯＰによる計算が実行されるのは１回だけである。したがって、シミュレーション時間を短縮化することができ、効率を向上させることができる。
【０１１２】
以上により、本実施形態１〜３によれば、図２に示すように、ハードウェアの動作が表現された動作記述格納部１０１からの動作記述を解析し、その動作解析情報からレジスタトランスファーレベルのハードウェアを高位合成する高位合成装置において、動作が割り当てられたコンポーネントの動作情報を格納するコンポーネント動作情報格納部１０９と、それらのコンポーネントの接続を示すデータパス情報を格納するデータパス情報格納部１１１と、コントローラの状態遷移情報を格納するコントローラ情報格納部１１０とから、サイクルアキュレートモデル生成部１１３（または１１３Ａ、１１３Ｂ）によって、レジスタの状態を計算するための計算式と、コントローラの状態を計算するための計算式とを作成し、作成された計算式を、サイクルアキュレートレベルでハードウェアを検証するための汎用プログラミング言語による記述として生成してサイクルアキュレートモデルを作成する。これによって、従来のＨＤＬシミュレータを用いずに、ハードウェアの検証をクロックサイクル単位で行う汎用プログラミング言語モデルを作成することができる。
【０１１３】
【発明の効果】
以上により、本発明によれば、ハードウェアのサイクルアキュレートレベルでの検証を、従来のＨＤＬシミュレータによる検証に比べて、高速かつ安価に行うことができる。また、任意のクロックサイクルにおいて、ハードウェアを構成するレジスタの状態やコントローラの状態、メモリなどの記憶装置の状態を観測することができるため、ハードウェアのデバッグ効率を向上させることができる。
【０１１４】
また、ハードウェアを構成するレジスタ、コントローラ、メモリなどの記憶装置の各状態をシミュレーションする際に、読み出し用変数と書き込み用変数との二つの変数を設定することによって、それらの計算順序を決定する必要がないため、モデルの生成を効率良く行うことができる。
【０１１５】
また、メモリなどの記憶装置をシミュレーションするときには、計算処理が行われた要素についてのみ、更新処理を行うことによって、シミュレーション速度をさらに高速化させることができる。
【０１１６】
さらに、同一クロックサイクルに重複して計算が行われる場合に、計算結果が同じである演算器や出力ポートなどの計算については、シミュレーション実行中のクロックサイクルをチェックし、そのクロックサイクルにおいて既に計算済みであれば、それらの出力を求める計算を重複して行わないようにすることによって、シミュレーション速度をさらに高速化させることができる。
【０１１７】
システムＬＳＩの設計において、ハードウェアとソフトウェアとからなるシステムを検証するときに、本発明の高位合成装置を用いてハードウェアを汎用プログラミング言語モデルとして生成することによって、そのオブジェクトコードと、ソフトウェアのオブジェクトコードとをリンクさせることが可能であり、ハードウェアのシミュレーションとソフトウェアのシミュレーションとを、クロックサイクルレベルで同期を取りながら実行させることができる。したがって、ハードウェアとソフトウェアとからなるシステムについて、サイクルアキュレートレベルでのデバッグおよび検証を効率良く行うことができる。
【図面の簡単な説明】
【図１】本発明の高位合成装置の実施形態１における要部構成を示すブロック図である。
【図２】本発明の高位合成装置の実施形態１における制御部の構成例を示すブロック図である。
【図３】本発明の実施形態１として、ハードウェアをサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルが生成される回路の一例を示す回路図である。
【図４】図３に示す回路のコンポーネント動作情報を示す図である。
【図５】図３に示す回路のコントローラ情報を示す図である。
【図６】図３に示す回路におけるコントローラの状態遷移を示す図である。
【図７】図３に示す回路のデータパス情報を示す図である。
【図８】図３に示す回路例について、レジスタの読み出し用記憶領域と、書き込み用記憶領域とを、Ｃ言語の変数として表す記述を示す図である。
【図９】図３に示す回路例について、コントローラの読み出し用記憶領域と、書き込み用記憶領域とを、Ｃ言語の変数として表す記述を示す図である。
【図１０】図３に示す回路例について、コントローラの状態を表すためのＣ言語の定数を定義する記述を示す図である。
【図１１】図３に示す回路例について、レジスタの状態を計算する計算式を示す図である。
【図１２】図３に示す回路例について、演算器の計算を実行する式を、Ｃ言語の関数として示す記述を示す図である。
【図１３】図３に示す回路例について、コントローラの出力値を表す式を示す図である。
【図１４】図３に示す回路例について、コントローラの状態を計算する計算式を示す図である。
【図１５】図３に示す回路例について、計算ステップの処理を示す記述を示す図である。
【図１６】図３に示す回路例について、更新ステップの処理を示す記述を示す図である。
【図１７】本発明の実施形態２として、ハードウェアをサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルが生成される回路の一例を示す回路図である。
【図１８】図１７に示す回路例について、メモリの動作モデルを表すＶＨＤＬ記述を示す図である。
【図１９】図１７に示す回路例について、計算ステップの処理を示す記述を示す図である。
【図２０】図１７に示す回路例について、更新ステップの処理を示す記述を示す図である。
【図２１】図１７に示す回路例について、効率化を図った更新ステップの処理例を示す記述を示す図である。
【図２２】本発明の実施形態３として、ハードウェアをサイクルアキュレートレベルでシミュレーション可能な汎用プログラミング言語モデルが生成される回路の一例を示す回路図である。
【図２３】図２２に示す回路例について、ブロック２に含まれるレジスタの計算ステップの処理を示す記述を示す図である。
【図２４】図２２に示す回路例について、ブロック３に含まれるレジスタの計算ステップの処理を示す記述を示す図である。
【図２５】図２２に示す回路例について、計算を重複して行わない工夫を施した処理例を示す記述を示す図である。
【符号の説明】
１０  高位合成装置
１１  制御部
１２  ＲＯＭ
１３  ＲＡＭ
１４  データベース
１５  操作部
１６  表示部
１０１    ハードウェアの動作記述格納部
１０２    構文解析・字句解析部
１０３  ブロック分割部
１０４    ＣＤＦＧ生成部
１０５    スケジューリング部
１０６    演算器・レジスタの割り当て部
１０７    データパス生成部
１０８    コントローラ生成部
１０９    コンポーネント動作情報格納部
１１０    コントローラ情報格納部
１１１    データパス情報格納部
１１２    ＲＴＬ動作記述自動生成部
１１３    サイクルアキュレートモデル自動生成部
１１４    ＲＴＬ記述格納部
１１５    サイクルアキュレートモデル格納部
２０１    定数（定数Ｃ）
２０２、２１０、２１３    レジスタ（レジスタＲ、Ｒ２、Ｒ３）
２０３    コントローラ（コントローラＣＴＲＬ）
２０４、２０９、２１２    外部入力ポート（外部入力ポートＩ、Ｉ１、Ｉ２）
２０５    演算器（演算器ＯＰ）
２０６    外部出力ポート（外部出力ポートＯ）
２０７    回路ブロック１
２０８    回路ブロック２
２１１    回路ブロック３
３０１    アドレスデータ
３０２    書き込みデータ
３０３    書き込み許可信号
３０４    読み出し許可信号
３０５    メモリ（ＲＡＭ１）
３０６    読み出しデータ
【図１】
2004348606.tif 000003
【図２】
2004348606.tif 000004
【図３】
2004348606.tif 000005
【図４】
2004348606.tif 000006
【図５】
2004348606.tif 000007
【図６】
2004348606.tif 000008
【図７】
2004348606.tif 000009
【図８】
2004348606.tif 000010
【図９】
2004348606.tif 000011
【図１０】
2004348606.tif 000012
【図１１】
2004348606.tif 000013
【図１２】
2004348606.tif 000014
【図１３】
2004348606.tif 000015
【図１４】
2004348606.tif 000016
【図１５】
2004348606.tif 000017
【図１６】
2004348606.tif 000018
【図１７】
2004348606.tif 000019
【図１８】
2004348606.tif 000020
【図１９】
2004348606.tif 000021
【図２０】
2004348606.tif 000022
【図２１】
2004348606.tif 000023
【図２２】
2004348606.tif 000024
【図２３】
2004348606.tif 000025
【図２４】
2004348606.tif 000026
【図２５】
2004348606.tif 000027