(57)【要約】【課題】ハードウェアを汎用プログラミング言語で表現した記述として、機能ブロックの動作を示す計算式を計算する順番によらず、サイクル精度で正確に検証する動作モデルを生成することができるハードウェア検証用プログラミング記述生成装置を得る。【解決手段】通信動作を含むステートにおいて、該ステートのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作までの計算式、および受信動作からの計算式の２つの計算式に分割して生成する手段４１０を備え、機能ブロックの各ステートの回路動作を表す計算式を、送信を行うまでと、受信を行うまでの２段階で計算するようにした。【選択図】図１
2011053805.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する装置であって、
ハードウェアの構造に関する情報を含まず、回路動作のみが記述されたハードウェアの動作記述から、該ハードウェアを複数の機能ブロックに分割し、分割された機能ブロック毎に動作記述を解析して得られる動作情報から、該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成手段と、
ハードウェア仕様として要求される動作周波数で、生成したコントロールデータフローグラフをスケジューリングして各ステートに回路動作を割り振るスケジューリング手段と、
通信動作を含むステートでのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作が行われるまでの動作の計算式、および受信動作が行われてからの動作の計算式を含む２以上の計算式に分割して生成する計算式生成手段と、
該分割した２以上の計算式に基づいて、該ハードウェアを汎用プログラミング言語で表現した記述として、サイクル精度で検証する動作モデルを生成する動作モデル生成手段と
を有する、ハードウェア検証用プログラミング記述生成装置。
【請求項２】
請求項１に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記通信動作を基準として分割した計算式を用い、最初に送信動作の計算式を計算するフェーズと、次に受信動作の計算式を計算するフェーズとの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項３】
請求項１に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記通信動作を基準として分割した計算式を用い、２つ以上の機能ブロックが存在する場合に、全ての機能ブロックにおける送信動作の計算式を計算するフェーズと、次に全ての機能ブロックにおける受信動作の計算式を計算するフェーズとの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項４】
請求項１に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記通信動作を基準として分割して得られた２以上の計算式のうちの１つを、
２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズとの計３フェーズに分けて計算し、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項５】
請求項４に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記２フェーズ目の計算において、任意の通信路の計算式を計算する際に、該通信路が依存している通信路の計算を先に行うような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項６】
請求項４に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記２フェーズ目の計算において、通信路の計算式を計算した結果が３フェーズ目の計算において用いられるような通信路を抽出し、抽出された通信路の計算式から計算を開始するような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項７】
請求項４に記載のハードウェア検証用プログラミング記述生成装置において、
前記動作モデル生成手段は、
前記複数の通信路の計算式を計算する処理で、通信路の計算式が計算済みかどうかを示すフラグを用い、１フェーズ目の計算において、全ての通信路についてのフラグを未計算の状態に設定し、２フェーズ目の計算において、通信路の計算式が計算された後、フラグを計算済みの状態に設定することで、ハードウェアをサイクル精度で検証する動作モデルを生成する、ハードウェア検証用プログラミング記述生成装置。
【請求項８】
ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する方法であって、
ハードウェアの構造に関する情報を含まず、回路動作のみが記述されたハードウェアの動作記述から、該ハードウェアを複数の機能ブロックに分割し、分割された機能ブロック毎に動作記述を解析して得られる動作情報から、該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップと、
ハードウェア仕様として要求される動作周波数で、生成したコントロールデータフローグラフをスケジューリングして各ステートに回路動作を割り振るスケジューリングステップと、
通信動作を含むステートでのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作が行われるまでの動作の計算式、および受信動作が行われてからの動作の計算式を含む２以上の計算式に分割して生成する計算式生成ステップと、
該２以上の計算式に基づいて、該ハードウェアを汎用プログラミング言語で表現した記述として、サイクル精度で検証する動作モデルを生成する動作モデル生成ステップとを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項９】
請求項８に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
前記通信動作を基準として分割した計算式を用い、最初に送信動作の計算式を計算するフェーズと、次に受信動作の計算式を計算するフェーズの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１０】
請求項８に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
前記通信動作を基準として分割した計算式を用い、２つ以上の機能ブロックが存在する場合に、全ての機能ブロックにおける送信動作の計算式を計算するフェーズと、次に全ての機能ブロックにおける受信動作の計算式を計算するフェーズの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１１】
請求項８に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
前記通信動作を基準として分割して得られた２以上の計算式のうちの１つを、
２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズの計３フェーズに分けて計算し、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１２】
請求項１１に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
前記２フェーズ目の計算において、任意の通信路の計算式を計算する際に、該通信路が依存している通信路の計算を先に行うような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１３】
請求項１１に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
前記２フェーズ目の計算において、通信路の計算式を計算した結果が３フェーズ目の計算において用いられるような通信路を抽出し、抽出された通信路の計算式から計算を開始するような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１４】
請求項１１に記載のハードウェア検証用プログラミング記述生成方法において、
前記動作モデル生成ステップは、
複数の通信路の計算式を計算する処理で、通信路の計算式が計算済みかどうかを示すフラグを用い、１フェーズ目の計算において、全ての通信路についてのフラグを未計算の状態に設定し、２フェーズ目の計算において、通信路の計算式が計算された後、フラグを計算済みの状態に設定することで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ハードウェア検証用プログラミング記述生成方法。
【請求項１５】
ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する方法における各ステップの処理をコンピュータにより行うための制御プログラムであって、
前記各ステップの処理は、請求項８から請求項１４にいずれかに記載のハードウェア検証用プログラミング記述生成方法における各処理ステップである、制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェア検証用プログラミング記述生成装置、ハードウェア検証用プログラミング記述生成方法、及び制御プログラムに関し、特に、ハードウェアの動作を検証できる汎用プログラミング記述を生成する装置及び方法、並びにこの方法をコンピュータにより行うための制御プログラムに関するものである。
【背景技術】
【０００２】
システムＬＳＩのハードウェア部分を設計するため、従来はＲＴＬ（レジスタ・トランスファ・レベル）での設計技術が用いられてきた。しかし大規模化、複雑化するシステムを設計するためには膨大な時間と労力が必要となることから、効率的に設計作業を進めるため高位合成技術が用いられるようになってきた。高位合成技術とは、ハードウェアの構造に関する情報は含まず、処理の動作のみを記述した動作記述から、ＲＴＬ（レジスタ・トランスファ・レベル）の論理回路を自動生成する技術である。
【０００３】
高位合成の手法としては、例えば、特許文献１で提案されているような方法がある。この方法は、ハードウェアの動作を表すために従来からハードウェアの設計言語として用いられてきたＨＤＬ（Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）言語に比べ抽象度の高い言語、例えばＣ言語やＣ＋＋言語などを用いて書かれた動作記述を解析し、設計仕様で与えられるクロック周波数で動作が可能なようにハードウェア動作をスケジューリングし、必要に応じて演算器やレジスタのアロケーションを行い、ＦＳＭ（Ｆｉｎｉｔｅ  Ｓｔａｔｅ  Ｍａｃｈｉｎｅ：有限状態機械）で構成される制御回路と、演算などを行うデータパス回路とをＨＤＬ言語として出力するものである。
【０００４】
ところで、このように高位合成技術などによって得られたＨＤＬ言語で表現された回路は、設計仕様どおりに動作するかを検証する必要がある。このため、従来の検証方法ではハードウェアの検証にＨＤＬシミュレータを用いていた。この検証方法は、ＨＤＬシミュレータにテストパターンを入力し、シミュレーションして得られる出力が期待する値かどうかを検証するものである。
【０００５】
しかしハードウェアの動作が複雑になり、より多くの、また長いテストパターンを必要とする場合、従来のようにＨＤＬシミュレータを用いた検証には多大な時間と労力が必要となる。
【０００６】
そこで、この検証に要する時間を短縮する目的で、特許文献２や特許文献３などでは、高位合成技術を用いたハードウェアのクロックサイクル精度の動作モデルの生成方法が提案されている。
【０００７】
これらの技術を用いると、従来のＨＤＬシミュレータのように、信号変化のイベント単位で行われる計算に比べ、レジスタの値をクロックサイクル単位で計算するだけでよく、シミュレーションに必要な計算量を大幅に削減できる。
【０００８】
例えば、特許文献３には、Ｃ言語などによるハードウェアの動作記述からＣＤＦＧ（コントロール・データ・フロー・グラフ）を生成し、ハードウェアの設計仕様で要求される動作周波数でハードウェアが動作可能なようにハードウェア動作をスケジューリングし、ＣＤＦＧに含まれるノードをステート毎に割り振り、各ノードが持つ動作情報を用いて動作モデルを生成し、ＣＤＦＧの枝情報を用いて各ノードの動作モデルを計算する順序付けを行い、レジスタへの入力値を求めるための計算式を作成する技術が開示されている。
【０００９】
ここで、ＣＤＦＧのノードとは、ハードウェアで実現されるべき演算動作、例えば加算、減算、乗算、除算などを表したもので、各ノードは演算の実行順序などから前後関係を持ち、有向な枝で結ばれている。例えば、図３は、図２で示すようなハードウェアの動作記述を高位合成して得られるＣＤＦＧの例を示している。この例で示すＣＤＦＧ３００のノードには、入力ａとｂを乗算するノード３０１、入力ｃとｄを乗算するノード３０２、および各乗算ノードの結果を加算するノード３０３がある。上記特許文献３では、このようにしてＣＤＦＧから作成されたＲＴＬ論理回路におけるレジスタへの入力値の計算式をクロックサイクル単位で計算することで、ハードウェアのシミュレーションをＨＤＬシミュレータに比べて高速に行う手法を提案している。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平５−１０１１４１号公報
【特許文献２】特開２００４−３４８６０６号公報
【特許文献３】特開２００６−１３９７２９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ところで、特許文献３の手法では、ハードウェアに含まれるレジスタへの入力値の計算式をクロックサイクル精度で計算し、シミュレーションを行う。また、入力値の計算が行われるレジスタは、高位合成の過程でスケジューリングされたＣＤＦＧの各ステートに含まれるレジスタである。そして、計算するステートを順番に進めていくことでハードウェアのクロックサイクル精度のシミュレーションが実現できる。
【００１２】
ところが、一般的にハードウェアは、複数の並列に動作する機能ブロックで構成されることが多い。特許文献３の手法を用いて複数の機能ブロックのサイクル精度の動作モデルを生成した場合、各機能ブロックの計算を行う順番は特に決められておらず、以下のような問題が生ずる場合がある。
【００１３】
［課題  １］
まず、第１の課題について説明する。
【００１４】
データを授受するために、また機能ブロック間で動作の同期を取るために、機能ブロック間で通信動作を行う場合がある。
【００１５】
図４は、２つの並列に動作する機能ブロックの動作（１つのステートに対応する動作）を記述した例である。
【００１６】
図４に示す記述にある”ｐａｒ”は、続く括弧｛｝で囲まれた動作が並列に行われることを意味する。”ｓｅｎｄ”は通信を表す関数で、データを送信する機能を持つ。第１引数には通信に用いる通信路の名前を指定し、第２引数には通信するデータを指定する。また、”ｒｅｃｅｉｖｅ”も通信を表す関数で、データを受信する機能を持つ。第１引数には通信に用いる通信路の名前を指定する。
【００１７】
図５は、図４で示すハードウェアの動作を、ブロック図として表したものである。このブロック図では、２つの機能ブロック、つまり機能ブロックＡ５０１と機能ブロックＢ５０２があり、通信路ｃｈａｎｎｅｌを用いてデータの通信を行う回路が示されている。この通信では、機能ブロックＡにインスタンスされている記憶素子ｒｅｇｉｓｔｅｒＡの値が、通信路ｃｈａｎｎｅｌで機能ブロックＢにインスタンスされている記憶素子ｒｅｇｉｓｔｅｒＢに送信される。
【００１８】
図６は、図５で示す各機能ブロックのＣＤＦＧの例を示している。
【００１９】
図６（ａ）で示すように、例えば機能ブロックＡでは、ｓｔａｔｅＡ＿０からｓｔａｔｅＡ＿５で示すステートで回路動作が順番に変遷していく。また図６（ｂ）で示すように、機能ブロックＢでも同様に、ｓｔａｔｅＢ＿０からｓｔａｔｅＢ＿５で示すステートで順番に回路動作が変遷していく。ここでは、機能ブロックＡ５０１は、ステートｓｔａｔｅＡ＿３でｃｈａｎｎｅｌを用いた送信（ｓｅｎｄ）動作６０１がスケジューリングされており、また一方の機能ブロックＢ５０２は、ステートｓｔａｔｅＢ＿３でｃｈａｎｎｅｌからの受信（ｒｅｃｅｉｖｅ）動作６０２がスケジューリングされているものとする。
【００２０】
図７は、機能ブロックＡ５０１および機能ブロックＢ５０２の各ステートで回路動作が変遷していく様子を示している。
【００２１】
なお、本明細書中においては、図７、図９、図１０、図３０、図３１における丸付き数字１〜５は、クロックサイクル（Ｃ１）〜（Ｃ５）を示している。
【００２２】
図７に示すクロックサイクル（Ｃ３）のとき、機能ブロックＡ５０１のステートはｓｔａｔｅＡ＿３であり、機能ブロックＢ５０２のステートはｓｔａｔｅＢ＿３であるとすると、クロックサイクル（Ｃ３）で該両機能ブロックＡ及びＢ間でデータの授受が行われる。
【００２３】
図８は、図６で示す回路のクロックサイクル精度の検証用モデルを、特許文献３で示す手法を用いて汎用プログラミング言語のＣ言語で生成した例である。
【００２４】
図８に示す例では、通信路ｃｈａｎｎｅｌを変数ｃｈａｎで表し、かつ機能ブロックＡ５０１のｒｅｇｉｓｔｅｒＡを変数ｒｅｇＡで表し、また機能ブロックＢ５０２のｒｅｇｉｓｔｅｒＢを変数ｒｅｇＢで表している。また、各機能ブロックの各ステートの動作を関数として表している。例えば機能ブロックＡのステートｓｔａｔｅＡ＿０の動作を関数ｓｔＡ＿０で表している。
【００２５】
図６で示すように、機能ブロックＡ５０１のステートｓｔａｔｅＡ＿３で、通信路ｃｈａｎｎｅｌを用いた送信動作がスケジューリングされているので、関数ｓｔＡ＿３では、ｃｈａｎｎｅｌを表す変数ｃｈａｎに、ｒｅｇｉｓｔｅｒＡを表す変数ｒｅｇＡの値を代入する。また一方で、機能ブロックＢ５０２においては、ステートｓｔａｔｅＢ＿３で通信路ｃｈａｎｎｅｌからの受信動作がスケジューリングされているので、関数ｓｔＢ＿３では、ｃｈａｎｎｅｌを表す変数ｃｈａｎの値を、ｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢに代入している。
【００２６】
図８において、関数ｓｔＡ＿０、ｓｔＡ＿１、ｓｔＡ＿２、ｓｔＡ＿４、ｓｔＡ＿５、およびｓｔＢ＿０、ｓｔＢ＿１、ｓｔＢ＿２、ｓｔＢ＿４、ｓｔＢ＿５の中身は省略している。
【００２７】
次に、機能ブロックＡと機能ブロックＢのステートを表す関数（以下、計算式ともいう。）を順番に計算するシミュレータを作成する。このシミュレータを用いて回路のサイクル精度のシミュレーションを行う。特許文献３などによると、シミュレータにおいて、機能ブロックＡ及びＢのステートを表す関数を計算する際、計算を行う順番、つまりいずれの機能ブロックのものから計算するかは特に決められていない。
【００２８】
図９は、機能ブロックＡのステートの計算式をまず計算し、次に機能ブロックＢのステートの計算式を計算するようなシミュレータの例を示している。
【００２９】
図９に示すシミュレータでは、図７で示すクロックのタイミング（Ｃ１）〜（Ｃ５）で各ステートの動作が計算されるものとする。図９に示す例では、クロックのタイミング（Ｃ３）で機能ブロックＡのステートｓｔａｔｅＡ＿３を表す関数ｓｔＡ＿３を実行し、続いて機能ブロックＢのステートｓｔａｔｅＢ＿３を表す関数ｓｔＢ＿３を実行したのち、機能ブロックＢのｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢの値をＣ言語の標準入出力ライブラリ関数であるｐｒｉｎｔｆを用いて標準出力にダンプする。ｒｅｇｉｓｔｅｒＢの値を調べることで、通信路ｃｈａｎｎｅｌで正しくデータが通信できたかどうか判断することができる。
【００３０】
図１０は、図９に示すシミュレータの例に対して、機能ブロックＢから計算を始める場合のシミュレータの例を示している。
【００３１】
図９に示すシミュレータの例と同様にｓｔａｔｅＢ＿３、およびｓｔａｔｅＡ＿３の計算が終了した時点でｒｅｇＢの値をダンプする。図９、及び図１０で示すシミュレータを用いてシミュレーションすると、それぞれのシミュレータでは、ダンプされる値が異なる。
【００３２】
つまり、図９で示すシミュレータでは、機能ブロックＡのｒｅｇｉｓｔｅｒＡの値が正しく通信される。一方、図１０で示すシミュレータでは、ｒｅｇｉｓｔｅｒＡの値が正しく通信されない。それでは、図１０で示すシミュレータで正しく通信できない理由を考察すると、図８で示す各ステートの計算式（ステートを示す関数）において、関数ｓｔＢ＿３をまず計算し、続いて関数ｓｔＡ＿３を計算するので、関数ｓｔＡ＿３において変数ｃｈａｎに変数ｒｅｇＡの値が代入される前に、関数ｓｔＢ＿３において変数ｒｅｇＢの値に変数ｃｈａｎの値を代入しているからである。つまり、機能ブロックの計算を行う順番（つまり、各ステートの関数の計算を機能ブロックＡ及びＢのいずれからはじめるか）によっては、回路の動作がサイクル精度で正しくシミュレーションできない場合がある。
【００３３】
［課題  ２］
次に第２の課題について説明する。
【００３４】
複数の通信路を用い、複数の機能ブロック間で通信を行う場合がある。
【００３５】
図１１は、２つの並列に動作する機能ブロック間で、複数の通信路を用いて通信を行う動作を記述した例を示している。
【００３６】
図１１に示す動作記述にある”ｐａｒ”は、続く括弧｛｝で囲まれた動作が並列に動作することを意味する。”ｐａｒ”に続く括弧｛｝の中には、更に括弧｛｝で囲まれた２つのブロックがある。この２つのブロックが並列に動作する。各ブロック中の回路動作はシーケンシャルに行われる。図４に示す動作記述の例と同様に、”ｓｅｎｄ”は通信を表す関数で、データを送信する機能を持つ。第１引数には通信に用いる通信路の名前を指定し、第２引数には通信するデータを指定する。また、”ｒｅｃｅｉｖｅ”も通信を表す関数で、データを受信する機能を持つ。第１引数には通信に用いる通信路の名前を指定する。”ｌｏｇｉｃ＿Ａ１”、”ｌｏｇｉｃ＿Ａ２”、”ｌｏｇｉｃ＿Ｂ１”、”ｌｏｇｉｃ＿Ｂ２”の各関数は何らかの演算動作を表しており、ハードウェアでは組み合わせロジックとして高位合成されるものとする。また、”ｔｍｐＡ１”、”ｔｍｐＡ２”、”ｔｍｐＢ１”、”ｔｍｐＢ２”は、これらの関数の第１引数である。
【００３７】
図１２は、図１１で示すハードウェアの動作を、その回路を示すブロック図として表したものである。２つの機能ブロックＡ１２０１と機能ブロックＢ１２０２があり、５個の通信路ｃｈａｎｎｅｌ１、ｃｈａｎｎｅｌ２、ｃｈａｎｎｅｌ３、ｃｈａｎｎｅｌ４、ｃｈａｎｎｅｌ５を用いてデータの通信を行う回路のブロック図を示している。この通信では、機能ブロックＡにインスタンスされている記憶素子ｒｅｇｉｓｔｅｒＡから出力された値を、５個の通信路で通信し、また各々の通信路ｃｈａｎｎｅｌ２、ｃｈａｎｎｅｌ４、ｃｈａｎｎｅｌ１、ｃｈａｎｎｅｌ３で通信された値”ｔｍｐＡ１”、”ｔｍｐＡ２”、”ｔｍｐＢ１”、”ｔｍｐＢ２”を組み合わせロジックＡ１、Ａ２、Ｂ１、Ｂ２で演算し、演算された値を機能ブロックＢにインスタンスされている記憶素子ｒｅｇｉｓｔｅｒＢに入力する。
【００３８】
図１３は、図１１で示す各機能ブロックのＣＤＦＧの例を示している。図１３で示すように、例えば機能ブロックＡではｓｔａｔｅＡ＿０からｓｔａｔｅＡ＿５で示すステートで順番に回路動作が変遷していく。また機能ブロックＢでも同様にｓｔａｔｅＢ＿０からｓｔａｔｅＢ＿５で示すステートで順番に回路動作が変遷していく。
【００３９】
ここでは、機能ブロックＡは、ステートｓｔａｔｅＡ＿３で、ｃｈａｎｎｅｌ１を用いた送信（ｓｅｎｄ）動作がスケジューリングされており、かつｃｈａｎｎｅｌ２を用いて受信（ｒｅｃｅｉｖｅ）動作を行い、受信した値を組み合わせロジック  Ａ１１２０５を用いて演算し、演算した結果をｃｈａｎｎｅｌ３を用いて送信する動作がスケジューリングされており、かつｃｈａｎｎｅｌ４を用いて受信動作を行い、受信した値を組み合わせロジック  Ａ２１２０６を用いて演算し、演算した結果をｃｈａｎｎｅｌ５を用いて送信する動作がスケジューリングされているものとする。
【００４０】
また、一方の機能ブロックＢは、ステートｓｔａｔｅＢ＿３でｃｈａｎｎｅｌ１からの受信動作を行い、受信した値を組み合わせロジック  Ｂ１１２０７を用いて演算し、演算した結果をｃｈａｎｎｅｌ２を用いて送信する送信動作がスケジューリングされており、かつｃｈａｎｎｅｌ３を用いて受信動作を行い、受信した値を組み合わせロジック  Ｂ２１２０８を用いて演算し、演算した結果をｃｈａｎｎｅｌ４を用いて送信する動作がスケジューリングされており、かつｃｈａｎｎｅｌ５を用いた受信動作がスケジューリングされているものとする。
【００４１】
ｓｔａｔｅＡ＿３およびｓｔａｔｅＢ＿３にスケジューリングされている送信動作、受信動作、そして組み合わせロジックを用いた演算は同一クロックサイクル中で計算される。
【００４２】
図１４は、図１１で示す回路のクロックサイクル精度の検証用モデルを、特許文献３で示す手法を用いて、汎用プログラミング言語のＣ言語で生成した例である。図１４では、それぞれの通信路をＣ言語の変数で次のように表している。
【００４３】
・  ｃｈａｎｎｅｌ１  →  ｃｈａｎ１
・  ｃｈａｎｎｅｌ２  →  ｃｈａｎ２
・  ｃｈａｎｎｅｌ３  →  ｃｈａｎ３
・  ｃｈａｎｎｅｌ４  →  ｃｈａｎ４
・  ｃｈａｎｎｅｌ５  →  ｃｈａｎ５
また、機能ブロックＡのｒｅｇｉｓｔｅｒＡを変数ｒｅｇＡで表し、また機能ブロックＢのｒｅｇｉｓｔｅｒＢを変数ｒｅｇＢで表している。更に、各機能ブロックの各ステートの動作を関数として表している。ただし図１４で示す例においては、ステートｓｔａｔｅＡ＿３の動作を表す関数ｓｔＡ＿３と、ｓｔａｔｅＢ＿３の動作を表す関数ｓｔＢ＿３以外の関数、つまりｓｔＡ＿０、ｓｔＡ＿１、ｓｔＡ＿２、ｓｔＡ＿４、ｓｔＡ＿５、およびｓｔＢ＿０、ｓｔＢ＿１、ｓｔＢ＿２、ｓｔＢ＿４、ｓｔＢ＿５の関数は省略している。また図１４に示す動作モデルの例において、図１２で示す各組み合わせロジックの動作を個々の関数で表している。組み合わせロジックＡ１１２０５の演算を実行するための関数をｌｏｇｉｃ＿Ａ１とし、他の組み合わせロジック１２０６、１２０７、１２０８も同様に関数ｌｏｇｉｃ＿Ａ２、ｌｏｇｉｃ＿Ｂ１、ｌｏｇｉｃ＿Ｂ２として表している。各組み合わせロジックの演算内容については省略するが、各組み合わせロジック間で演算内容は異なるものとする。
【００４４】
図１３で示すように、機能ブロックＡ１２０１のステートｓｔａｔｅＡ＿３で、通信路ｃｈａｎｎｅｌ１を用いた送信動作がスケジューリングされているので、ｃｈａｎｎｅｌ１を表す変数ｃｈａｎ１にｒｅｇｉｓｔｅｒＡを表す変数ｒｅｇＡの値を代入する。また、ｃｈａｎｎｅｌ２から受信した値を組み合わせロジックＡ１で演算し、ｃｈａｎｎｅｌ３に送信する動作がスケジューリングされているので、関数ｌｏｇｉｃ＿Ａ１を用いて変数ｃｈａｎ２の値を演算し、ｃｈａｎ３に代入している。また、ｃｈａｎｎｅｌ４から受信した値を組み合わせロジックＡ２で演算し、ｃｈａｎｎｅｌ５に送信する動作もスケジューリングされているので、関数ｌｏｇｉｃ＿Ａ２を用いて変数ｃｈａｎ４の値を演算し、ｃｈａｎ５に代入している。
【００４５】
また一方で、機能ブロックＢにおいては、ステートｓｔａｔｅＢ＿３でｃｈａｎｎｅｌ１から受信した値を組み合わせロジックＢ１で演算し、ｃｈａｎｎｅｌ２に送信する動作がスケジューリングされているので、関数ｌｏｇｉｃ＿Ｂ１を用いて変数ｃｈａｎ１の値を演算し、ｃｈａｎ２に代入している。また、ｃｈａｎｎｅｌ３から受信した値を組み合わせロジックＢ２で演算し、ｃｈａｎｎｅｌ４に送信する動作がスケジューリングされているので、関数ｌｏｇｉｃ＿Ｂ２を用いて変数ｃｈａｎ３の値を演算し、ｃｈａｎ４に代入している。更に、ｃｈａｎｎｅｌ５から受信した値をｒｅｇｉｓｔｅｒＢに保存するので、ｃｈａｎｎｅｌ５を表す変数ｃｈａｎ５の値をｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢに代入している。
【００４６】
次に、機能ブロックＡと機能ブロックＢのステートを表す関数を順番に計算するシミュレータを作成する。このシミュレータを用いて回路のサイクル精度のシミュレーションを行う。特許文献３などによると、シミュレータで機能ブロックの計算を行う順番は特に決められていない。図５に示す回路と同様に、図７に示すクロックサイクルＣ１〜Ｃ５のタイミングで各ステートが変遷しているとすると、図１２に示す回路も図９、および図１０で示すシミュレータでシミュレーションが行える。図１２に示す回路を、図９および図１０で示すシミュレータを用いてシミュレーションすると、それぞれのシミュレーションでダンプされる値が異なる。しかも、双方のシミュレータともに誤った値がダンプされる。
【００４７】
図９で示すシミュレータでは、関数ｓｔＡ＿３において、組み合わせロジックＡ１の演算に変数ｃｈａｎ２の値を用いる。しかし、変数ｃｈａｎ２の値は関数ｓｔＢ＿３の計算を実行しないと正しく求まらない（図１４参照）。同様に図１０で示すシミュレータでは、関数ｓｔＢ＿３において、組み合わせロジックＢ１の演算に変数ｃｈａｎ１の値を用いるが、変数ｃｈａｎ１の値は関数ｓｔＡ＿３の計算を実行しないと正しく求まらない（図１４参照）。
【００４８】
つまり、機能ブロックの計算を行う順番（各ステートを表す関数の計算を機能ブロックＡ及びＢのいずれのものから行うか）によらず、常に回路の動作が正しくサイクル精度でシミュレーションできない。
【００４９】
本発明は、上記のような問題点を解決するためになされたもので、ハードウェアを汎用プログラミング言語で表現した記述として、機能ブロックの計算する順番によらず、サイクル精度で正確に検証する動作モデルを生成することができるハードウェア検証用プログラミング記述生成装置、及びハードウェア検証用プログラミング記述生成方法、並びにこの方法をコンピュータにより行うための制御プログラムを得ることを目的とする。
【課題を解決するための手段】
【００５０】
本発明に係るハードウェア検証用プログラミング記述生成装置は、ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する装置であって、ハードウェアの構造に関する情報を含まず、回路動作のみが記述されたハードウェアの動作記述から、該ハードウェアを複数の機能ブロックに分割し、分割された機能ブロック毎に動作記述を解析して得られる動作情報から、該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成手段と、ハードウェア仕様として要求される動作周波数で、生成したコントロールデータフローグラフをスケジューリングして各ステートに回路動作を割り振るスケジューリング手段と、通信動作を含むステートでのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作が行われるまでの動作の計算式、および受信動作が行われてからの動作の計算式を含む２以上の計算式に分割して生成する計算式生成手段と、該分割した２以上の計算式に基づいて、該ハードウェアを汎用プログラミング言語で表現した記述として、サイクル精度で検証する動作モデルを生成する動作モデル生成手段とを有するものであり、そのことにより上記目的が達成される。
【００５１】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記通信動作を基準として分割した計算式を用い、最初に送信動作の計算式を計算するフェーズと、次に受信動作の計算式を計算するフェーズとの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５２】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記通信動作を基準として分割した計算式を用い、２つ以上の機能ブロックが存在する場合に、全ての機能ブロックにおける送信動作の計算式を計算するフェーズと、次に全ての機能ブロックにおける受信動作の計算式を計算するフェーズとの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５３】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記通信動作を基準として分割して得られた２以上の計算式のうちの１つを、２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズとの計３フェーズに分けて計算し、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５４】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記２フェーズ目の計算において、任意の通信路の計算式を計算する際に、該通信路が依存している通信路の計算を先に行うような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５５】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記２フェーズ目の計算において、通信路の計算式を計算した結果が３フェーズ目の計算において用いられるような通信路を抽出し、抽出された通信路の計算式から計算を開始するような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５６】
本発明は、上記ハードウェア検証用プログラミング記述生成装置において、前記動作モデル生成手段は、前記複数の通信路の計算式を計算する処理で、通信路の計算式が計算済みかどうかを示すフラグを用い、１フェーズ目の計算において、全ての通信路についてのフラグを未計算の状態に設定し、２フェーズ目の計算において、通信路の計算式が計算された後、フラグを計算済みの状態に設定することで、ハードウェアをサイクル精度で検証する動作モデルを生成するものであることが好ましい。
【００５７】
本発明に係るハードウェア検証用プログラミング記述生成方法は、ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する方法であって、ハードウェアの構造に関する情報を含まず、回路動作のみが記述されたハードウェアの動作記述から、該ハードウェアを複数の機能ブロックに分割し、分割された機能ブロック毎に動作記述を解析して得られる動作情報から、該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップと、ハードウェア仕様として要求される動作周波数で、生成したコントロールデータフローグラフをスケジューリングして各ステートに回路動作を割り振るスケジューリングステップと、通信動作を含むステートでのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作が行われるまでの動作の計算式、および受信動作が行われてからの動作の計算式を含む２以上の計算式に分割して生成する計算式生成ステップと、該２以上の計算式に基づいて、該ハードウェアを汎用プログラミング言語で表現した記述として、サイクル精度で検証する動作モデルを生成する動作モデル生成ステップとを有するものであり、そのことにより上記目的が達成される。
【００５８】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、前記通信動作を基準として分割した計算式を用い、最初に送信動作の計算式を計算するフェーズと、次に受信動作の計算式を計算するフェーズの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有することが好ましい。
【００５９】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、前記通信動作を基準として分割した計算式を用い、２つ以上の機能ブロックが存在する場合に、全ての機能ブロックにおける送信動作の計算式を計算するフェーズと、次に全ての機能ブロックにおける受信動作の計算式を計算するフェーズの計２フェーズの計算を行い、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有することが好ましい。
【００６０】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、前記通信動作を基準として分割して得られた２以上の計算式のうちの１つを、２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズの計３フェーズに分けて計算し、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有する、ことが好ましい。
【００６１】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、前記２フェーズ目の計算において、任意の通信路の計算式を計算する際に、該通信路が依存している通信路の計算を先に行うような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有するものであることが好ましい。
【００６２】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、前記２フェーズ目の計算において、通信路の計算式を計算した結果が３フェーズ目の計算において用いられるような通信路を抽出し、抽出された通信路の計算式から計算を開始するような順番で計算を進めることで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有することが好ましい。
【００６３】
本発明は、上記ハードウェア検証用プログラミング記述生成方法において、前記動作モデル生成ステップは、複数の通信路の計算式を計算する処理で、通信路の計算式が計算済みかどうかを示すフラグを用い、１フェーズ目の計算において、全ての通信路についてのフラグを未計算の状態に設定し、２フェーズ目の計算において、通信路の計算式が計算された後、フラグを計算済みの状態に設定することで、ハードウェアをサイクル精度で検証する動作モデルを生成する処理ステップを有することが好ましい。
【００６４】
本発明に係る制御プログラムは、ハードウェアの動作を検証可能な汎用プログラミング記述による動作モデルを生成する方法における各ステップの処理をコンピュータにより行うための制御プログラムであって、前記各ステップの処理は、上述したハードウェア検証用プログラミング記述生成方法における各処理ステップであり、そのことにより上記目的が達成される。
【００６５】
以下、本発明の作用について説明する。
【００６６】
本発明においては、ハードウェア検証用プログラミング記述生成装置において、ハードウェアの構造に関する情報を含まず、処理動作のみが記述されたハードウェアの動作記述から、該ハードウェアを機能ブロックに分割し、分割された機能ブロック毎にコントロールデータフローグラフを生成し、ハードウェア仕様として要求される動作周波数でコントロールデータフローグラフをスケジューリングして各ステートに回路動作を割り振し、通信動作を含むステートに対応するハードウェアの動作を表す計算式を、通信動作を基準として、送信動作までの計算式、および受信動作からの計算式を含む２以上の計算式に分割して生成し、このような２以上の計算式から、該ハードウェアを汎用プログラミング言語で表現した記述として、サイクル精度で検証する動作モデルを生成するので、上記課題１が解決される。
【００６７】
つまり、シミュレータが動作モデルをこれを表す計算式に基づいて検証する際、シミュレータは、個々の機能ブロックにおける通信動作を含むステートの回路動作の計算を、通信動作の前後で分けて行うこととなる。これにより、通信の結果変動する値を、通信の前の経路動作の計算に用いることがなくなり、データを授受するために、また機能ブロック間で動作の同期を取るために、機能ブロック間で通信動作を行う場合でも、機能ブロックの計算を行う順番に（各ステートの回路動作をいずれの機能ブロックから行うかに）よらずに、正しく回路の動作をサイクル精度でシミュレーションすることができる。
【００６８】
また、ハードウェア検証用プログラミング記述生成装置において、２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズの計３フェーズの計算が行われるよう、ハードウェアをサイクル精度で検証する動作モデルを生成するので、そのことにより上記課題２が解決される。つまり、複数の通信路を用い、複数の機能ブロック間で通信を行う場合でも、機能ブロックの計算を行う順番によらず、常に回路の動作が正しくサイクル精度でシミュレーションできる。
【発明の効果】
【００６９】
以上のように本発明によれば、ハードウェアを汎用プログラミング言語で表現した記述として、機能ブロックの計算する順番によらず、サイクル精度で正確に検証する動作モデルを生成することができるという効果がある。
【図面の簡単な説明】
【００７０】
【図１】図１は、本発明の実施形態に係るハードウェア検証用プログラミング記述生成装置として機能するコンピュータシステムの基本処理を説明する図である。
【図２】図２は、ハードウェアの動作記述の例を示す図である。
【図３】図３は、図２に示すハードウェアの動作記述を高位合成して得られるＣＤＦＧの例を示す図である。
【図４】図４は、２つの並列動作を持つハードウェアの動作記述の例を示す図である。
【図５】図５は、図４に示すハードウェアを示すブロック図である。
【図６】図６は、図４に示すハードウェアの動作記述を高位合成して得られる各機能ブロックのＣＤＦＧを示す図である。
【図７】図７は、図４に示すハードウェアのタイミングチャートの例を示す図である。
【図８】図８は、図４に示すハードウェアの従来のサイクル精度の動作モデルの例を示す図である。
【図９】図９は、図４に示すハードウェアの従来のサイクル精度のシミュレータの例を示す図である。
【図１０】図１０は、図９に示すシミュレータの別の従来例を示す図である。
【図１１】図１１は、２つの並列動作を持つハードウェアの動作記述の例を示す図である。
【図１２】図１２は、図１１に示すハードウェアを示すブロック図である。
【図１３】図１３は、図１１に示すハードウェアの動作記述を高位合成して得られる各機能ブロックのＣＤＦＧを示す図である。
【図１４】図１４は、図１１に示すハードウェアの従来のサイクル精度の動作モデルの例を示す図である。
【図１５】図１５は、本発明の実施形態によるハードウェア検証用プログラミング記述生成装置を説明する図であり、送信ノードの抽出、受信ノードの抽出、および通信の依存関係を調査するためのアルゴリズムを示している。
【図１６】図１６は、図４に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＡに対応する第１及び第２フェーズ目の動作モデルを示す図である。
【図１７】図１７は、図４に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＢに対応する第１及び第２フェーズ目の動作モデルを示す図である。
【図１８】図１８は、図４に示すハードウェアに対応する、本発明の手法を用いたサイクル精度のシミュレータの例を示す図である。
【図１９】図１９は、図４に示すハードウェアに対応する、本発明の手法を用いたサイクル精度のシミュレータとして、図１８に示すシミュレータとは別の例を示す図である。
【図２０】図２０は、図１１に示すハードウェアの通信の依存関係を表で示す図である。
【図２１】図２１は、通信の情報を保存するデータ構造の例を示す図である。
【図２２】図２２は、図２１に示すデータ構造の配列を示す図である。
【図２３】図２３は、図１１に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＡ及びＢの第１フェーズ目の動作モデルを示す図である。
【図２４】図２４は、図１１に示すハードウェアの通信動作を表した、本発明による検証モデルの例を示す図である。
【図２５】図２５は、図１１に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＡ及びＢの第２フェーズ目の動作モデルを示す図である。
【図２６】図２６は、通信の情報を保存するデータ構造の例を示す図である。
【図２７】図２７は、図１１に示すハードウェアの通信動作を表した、本発明による動作モデルの例を示す図である。
【図２８】図２８は、図１１に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＡ及びＢの第２フェーズ目の動作モデルを示す図である。
【図２９】図２９は、図１１に示すハードウェアから本発明の手法を用いて生成した、機能ブロックＡ及びＢの第３フェーズ目の動作モデルを示す図である。
【図３０】図３０は、図１１に示すハードウェアに対応する、本発明の手法を用いたサイクル精度のシミュレータの例を示す図である。
【図３１】図３１は、図１１に示すハードウェアに対応する、本発明の手法を用いたサイクル精度のシミュレータの例として、図３０に示すシミュレータとは別の例を示す図である。
【発明を実施するための形態】
【００７１】
以下、図面を用いて本発明の実施の形態を説明する。
【００７２】
図１は、本発明の実施形態によるハードウェア検証用プログラミング記述生成装置を説明する図であり、ハードウェアをサイクル精度で検証可能なプログラミング記述を生成するための、高位合成の手段を具備する装置の例を示している。
【００７３】
なお、本実施形態で述べるハードウェア検証用プログラミング記述の高位合成においては、回路をその機能単位でブロックに分割した形で動作を記述でき、各機能ブロックを並列動作可能なハードウェアの動作記述を可能とする。また本実施形態における、ハードウェアをサイクル精度で検証可能なプログラミング記述は、汎用プログラミング言語のＣ言語によるものとする。なお他の言語でも同様に記述できる。
【００７４】
本発明の実施形態に係るハードウェア検証用プログラミング記述生成装置として機能するコンピュータシステム１００は、モニタ装置１、キーボードなどの入力装置２、計算機本体３を含み、計算機本体３は、ＣＰＵ（中央演算処理ユニット）３１、メモリなどの可読記憶媒体３２、および磁気ディスクなどの可読記憶媒体３３を備えている。磁気ディスクなどの可読記憶媒体３３には、本発明の、ハードウェアをサイクル精度で検証可能なプログラミング記述を高位合成するためのハードウェア高位合成プログラム４が含まれる。
【００７５】
このハードウェア高位合成プログラム４によりＣＰＵ３１には以下の手段が構築される。
【００７６】
・  ハードウェアの動作記述を構文解析・字句解析する手段（構文解析・字句解析手段）４０１
・  ハードウェアの動作記述を、機能ブロック単位で並列動作するハードウェアの回路ブロック（機能ブロック）に分割する手段（機能ブロック分割手段）４０２
・  各機能ブロックに対して、ＣＤＦＧ（コントロール・データフロー・グラフ）を生成する手段（ＣＤＦＧ生成手段）４０３
・  各機能ブロックに対応する、ハードウェアに与えられた設計仕様の動作周波数の制約を満たすためにＣＤＦＧのノードをスケジューリングし、ノードをステートに割り振る手段（スケジューリング・ステート割り振り手段）４０４
・  各機能ブロックにおける、手段４０４でスケジューリングされたステートのノードのうち、通信における送信動作を表すノードを抽出する手段（送信ノード抽出手段）４０５
・  各機能ブロックにおける、手段４０４でスケジューリングされたステートのノードのうち、通信における受信動作を表すノードを抽出する手段（受信ノード抽出手段）４０６
・  各機能ブロックにおける、手段４０５で抽出された送信動作を表すノードのうち、送信するデータが他の通信から影響を受けているか、また手段４０６で抽出された受信動作を表すノードのうち、受信したデータが他の通信に影響を与えるかを調査する手段（通信依存調査手段）４０７
・  各機能ブロックに対して、手段４０７で調査した結果、他の通信に依存している送信動作がある場合、該通信を識別する情報と、該通信が依存している通信を識別する情報と、該通信の計算式と、該計算式の未実行・実行済みを判別するためのフラグとを含むデータ構造を作成し、該データ構造を登録するためのリストを作成し、リストにデータ構造を登録、削除するなどの制御記述を生成する手段（通信リスト制御記述生成手段）４０８
・  各機能ブロックに対して、手段４０８で生成した制御記述を用いて、通信の計算式を計算する順番を制御する記述を生成する手段（計算順序制御記述生成手段）４０９
・  各機能ブロックに対して、通信動作を含むステートの計算を、通信動作を基準として複数の計算フェーズに分割し、各計算フェーズに対応する分割された計算を順番に実行することで、ハードウェアをサイクル精度で検証できる動作モデルを、プログラミング言語で表現した記述として生成する手段（動作モデル記述生成手段）４１０
ここで、手段４０１、手段４０２，手段４０３、および手段４０４については、特許文献３で述べられている手法を用いることとする。
【００７７】
つまり、構文解析・字句解析部４０１は、図４に示すようなハードウェアの動作記述を解析して論理回路を構成する。ブロック分割部４０２は、構文解析・字句解析部４０１で得られた論理回路を並列動作の記述に従って図５に示すような複数の機能ブロックに分割する。
【００７８】
さらに、ＣＤＦＧ生成部４０３は、例えば図５に示す各機能ブロックに関するＣＤＦＧを作成する。このＣＤＦＧは、ハードウェアの動作がノードとノード間を接続する枝とを用いて表現されたものである。ノードはハードウェア中で動作する演算などを示し、ノード間の枝はデータの流れを示している。あるノードから出力されたデータは、そのノードに接続されている枝を通り、接続先のノードの入力として用いられる。
【００７９】
さらに、スケジューリング・ステート割り振り手段４０４は、ＣＤＦＧの各ノードについてハードウェアに与えられた動作周波数で回路が動作可能なようにスケジューリングを行う。図６（ａ）及び（ｂ）は、図５に示す各機能ブロックＡ及びＢに対応するＣＤＦＧにスケジューリングを施したものを示している。
【００８０】
以下、図５に示す２つの機能ブロックＡ及びＢの間で、１つの通信路を用いて通信を行うハードウェアの、サイクル精度で検証可能な動作モデルを、プログラミング言語で表現した記述として生成する具体的な処理を実施例１として説明する。
【００８１】
また、２つの機能ブロック間で、依存関係のある複数の通信路を用いて通信を行うハードウェアの、サイクル精度で検証可能な動作モデルを、プログラミング言語で表現した記述として生成する具体的な処理を実施例２として説明する。
【００８２】
（実施例１）
実施例１では、図４で示すような回路動作に対して高位合成を行い、図５で示すようなブロック構成のハードウェアを、サイクル精度で検証可能な動作モデルを生成することを考える。
【００８３】
図４に示す回路動作を、図１で示すハードウェア高位合成プログラム４で高位合成すると、図１のＣＤＦＧ生成手段４０３、およびスケジューリング・ステート割り振り手段４０４を経て、図６で示すようなスケジューリングされたＣＤＦＧが、機能ブロックＡのＣＤＦＧ（図６（ａ））及び機能ブロックＢのＣＤＦＧ（図６（ｂ））として得られる。
【００８４】
次に各機能ブロックについて、送信ノード、および受信ノードを抽出する。また抽出する際に、送信ノード、受信ノードが他の通信に依存しているかどうか調査する。
【００８５】
図１５は、送信ノード抽出手段４０５、受信ノード抽出手段４０６、および通信の依存調査手段４０７のアルゴリズムを示したものである。アルゴリズムの詳細は次のとおりである。
【００８６】
ｓ１：抽出開始
送信ノード、および受信ノードを抽出する処理（抽出処理）を開始する。
【００８７】
ｓ２：抽出するステートを選択
機能ブロックの複数のステートから任意のステートを選択する。
【００８８】
ｓ３：全ステートでの抽出完了？
機能ブロックの全てのステートで抽出処理が終了したか判定する。
【００８９】
終了していない場合は、ｓ４に進む。
【００９０】
終了している場合は、ｓ１４に進む。
【００９１】
ｓ４：ステートに含まれるノードを収集
ＣＤＦＧデータベースｄ１から抽出対象ステートに含まれる全てのノード情報を収集する。
【００９２】
ｓ５：調査するノードを選択
ｓ４で収集したノードから任意のノードを選択する。
【００９３】
ｓ６：全ノードの調査完了？
ステートの全てのノードで調査処理が終了したか判定する。
【００９４】
終了していない場合は、ｓ７に進む。
【００９５】
終了している場合は、ｓ２に進む。
【００９６】
ｓ７：ノード情報を調査
ノードの動作情報を調査する。
【００９７】
例えば、ノードの動作情報は、送信ノードあるいは受信ノードであることを示す情報、通信の依存関係を示す情報を含んでいる。
【００９８】
ｓ８：送信ノード？
ノードの動作情報が送信を表すノードであるか判定する。
【００９９】
送信ノードである場合、ｓ１０に進む。
【０１００】
送信ノードでない場合、ｓ９に進む。
【０１０１】
ｓ９：受信ノード？
ノードの動作情報が受信を表すノードであるか判定する。
【０１０２】
受信ノードである場合、ｓ１２に進む。
【０１０３】
受信ノードでない場合、ｓ５に進む。
【０１０４】
ｓ１０：通信の依存関係を調査
送信するデータが、同一ステップ中に存在する他の通信ノードから影響を受けているかどうか、依存関係を調査する。依存関係は、ＣＤＦＧのノードは有向性のある枝で接続しているので、枝に沿ってノードをたどることで調査できる。
【０１０５】
例えば、図１３で示すようなＣＤＦＧの場合、送信ノード１３０４の接続をたどっていくと、ノード１３０３に接続されており、更にたどると、受信ノード１３０２に接続されている。つまり、送信ノード１３０４は、受信ノード１３０２から影響を受けていることが分かる。
【０１０６】
ｓ１１：送信ノードのデータベースに保存
ｓ１０で調査した依存関係の有無を含め、送信ノードの動作情報を、送信ノードを集めたデータベースｄ２に保存する。
【０１０７】
ｓ１２：通信の依存関係を調査
受信したデータが、同一ステップ中に存在する他の通信ノードに影響を与えているかどうか、依存関係を調査する。依存関係は、ＣＤＦＧのノードは有向性のある枝で接続しているので、枝に沿ってノードをたどることで調査できる。
【０１０８】
例えば、図１３で示すようなＣＤＦＧの場合、受信ノード１３０５の接続をたどっていくと、ノード１３０６に接続されており、更にたどると、送信ノード１３０７に接続されている。つまり、受信ノード１３０５は、送信ノード１３０７に影響を与えていることが分かる。
【０１０９】
ｓ１３：受信ノードのデータベースに保存
ｓ１２で調査した依存関係の有無を含め、受信ノードの動作情報を、受信ノードを集めたデータベースｄ３に保存する。
【０１１０】
ｓ１４：抽出終了
このアルゴリズムを図６のＣＤＦＧに当てはめると、機能ブロックＡにおいては、ｓ８の処理で送信ノードにノード６０１が該当すると判断され、データベースｄ２に登録される。また、一方の機能ブロックＢにおいては、ｓ９の処理で受信ノードにノード６０２が該当すると判断され、データベースｄ３に登録される。
【０１１１】
２つの機能ブロックＡ及びＢ間で、１つの通信路を用いて通信を行うハードウェアの場合、図１に示す、通信のリストを制御する記述の生成手段４０８と、計算順序を制御する記述の生成手段４０９は用いない。これらの手段は複数の通信路を用いた通信で必要となるので、後述の実施例２で説明する。
【０１１２】
次に、抽出した送信ノードのデータベースｄ２と、受信ノードのデータベースｄ３の情報を用いて、送信動作までの計算式と、受信動作からの計算式とから、ステートの動作をサイクル精度で検証できる動作モデルを生成する。
【０１１３】
まず、機能ブロックＡのステートｓｔａｔｅＡ＿３の動作モデルを作成する。図６の機能ブロックＡのステートｓｔａｔｅＡ＿３に含まれるノード６０１が、送信ノードとしてデータベースｄ２に登録されているので、ｓｔａｔｅＡ＿３における送信動作までの計算を行うフェーズは、図１６に示すようなＣ言語の記述として生成する。
【０１１４】
関数ｓｔＡ＿３＿１ｓｔＰｈａｓｅは、ｓｔａｔｅＡ＿３の送信動作までの計算を行うフェーズの動作モデルである。ここではｒｅｇｉｓｔｅｒＡを表す変数ｒｅｇＡの値を、通信路を表す変数ｃｈａｎに代入している。一方の関数ｓｔＡ＿３＿２ｎｄＰｈａｓｅは、ｓｔａｔｅＡ＿３の受信動作からの計算を行うフェーズの動作モデルであるが、このステートでは受信動作が無いため、関数の中身は空である。
【０１１５】
次に、機能ブロックＢのステートｓｔａｔｅＢ＿３の動作モデルを作成する。図６の機能ブロックＢのステートｓｔａｔｅＢ＿３に含まれるノード６０２が、受信ノードとしてデータベースｄ３に登録されているので、ｓｔａｔｅＢ＿３における受信動作からの計算を行うフェーズは、図１７に示すようなＣ言語の記述として生成する。関数ｓｔＢ＿３＿２ｎｄＰｈａｓｅは、ｓｔａｔｅＢ＿３の受信動作からの計算を行うフェーズの動作モデルである。ここでは通信路ｃｈａｎｎｎｅｌを表す変数ｃｈａｎの値を、ｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢに代入している。一方の関数ｓｔＢ＿３＿１ｓｔＰｈａｓｅは、ｓｔａｔｅＢ＿３の送信動作までの計算を行うフェーズの動作モデルであるが、このステートでは送信動作が無いため、関数の中身は空である。以後の説明では、送信動作までの計算を行うフェーズを第１フェーズ目として表現し、受信動作からの計算を行うフェーズを第２フェーズ目として表現する。
【０１１６】
２つの計算フェーズで構成された動作モデルを用いたシミュレータを作成し、シミュレーションを走らせ、動作が正しく計算されるか確認する。
【０１１７】
図１８で示すシミュレータは、機能ブロックＡのステートの計算式をまず計算し、次に機能ブロックＢのステートの計算式を計算するようなシミュレータの例である。
【０１１８】
図１８のシミュレータでは、図７で示すクロックのタイミングＣ１〜Ｃ５で各ステートの動作が計算されるものとする。図１８の例では、機能ブロックＡのステートｓｔａｔｅＡ＿３の第１フェーズ目の関数ｓｔＡ＿３＿１ｓｔＰｈａｓｅを計算し、続いて機能ブロックＢのステートｓｔａｔｅＢ＿３の第１フェーズ目の関数ｓｔＢ＿３＿１ｓｔＰｈａｓｅを計算する。次に機能ブロックＡの第２フェーズ目の関数ｓｔＡ＿３＿２ｎｄＰｈａｓｅを計算し、機能ブロックＢの第２フェーズ目の関数ｓｔＢ＿３＿２ｎｄＰｈａｓｅを計算する。
【０１１９】
機能ブロックＡのステートｓｔａｔｅＡ＿３と機能ブロックＢのｓｔａｔｅＢ＿３の計算を完了した時点で、機能ブロックＢのｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢの値をＣ言語の標準入出力ライブラリ関数であるｐｒｉｎｔｆを用いて標準出力にダンプする。ｒｅｇｉｓｔｅｒＢの値を調べることで、通信路ｃｈａｎｎｅｌで正しくデータが通信できたかどうか判断することができる。
【０１２０】
図１９は、図１８で示すシミュレータに対して、機能ブロックＢから計算を始める場合のシミュレータの例を示している。図１８の例と同様にｓｔａｔｅＢ＿３、およびｓｔａｔｅＡ＿３の計算が終了した時点でｒｅｇＢの値をダンプする。
【０１２１】
図１８、及び図１９で示すシミュレータを用いて、図５に示す機能ブロックＡ及びＢのタイミングＣ３のステートの動作をシミュレーションすると、ダンプされる値は同じである。どちらの計算でも、変数ｃｈａｎに変数ｒｅｇＡの値を代入し終えてから、変数ｒｅｇＢに変数ｃｈａｎの値を代入している。つまり、どちらのシミュレータでもｒｅｇｉｓｔｅｒＡの値が、正しくｒｅｇｉｓｔｅｒＢに送信されている。
【０１２２】
以上のことから、通信動作を含むステートにおいて、該ステートのハードウェアの動作を表す計算式を、通信動作を基準として、送信動作までの計算式、および受信動作からの計算式の２つの計算式に分割して生成し、かつ送信動作までの計算式を計算するフェーズと、次に受信動作からの計算式を計算するフェーズの計２フェーズの計算を順番に行うことで、機能ブロックの計算する順番によらず正確にサイクル精度でシミュレーションが可能となる。
【０１２３】
（実施例２）
本実施例２では、図１１で示すような回路動作に対して高位合成を行い、図１２で示すようなブロック構成のハードウェアを、サイクル精度で検証可能な動作モデルを生成することを考える。
【０１２４】
図１１で示すような回路動作を、図１で示すハードウェア高位合成プログラム４で高位合成すると、図１のＣＤＦＧ生成手段４０３、およびスケジューリング・ステート割り振り手段４０４を経て、図１３（ａ）、（ｂ）で示すようなスケジューリングされたＣＤＦＧが得られる。
【０１２５】
次に各機能ブロックについて、送信ノード、および受信ノードを抽出する。また抽出する際に、送信ノード、受信ノードが他の通信に依存しているかどうか調査する。送信ノード、受信ノードの抽出、および通信の依存関係の調査手段については、上記実施例１で、図１５を用いて説明したアルゴリズムを用いる。
【０１２６】
本実施例２では、図１５に示すアルゴリズムの詳細な説明は省略する。
【０１２７】
図１５に示すアルゴリズムを図１３に示すＣＤＦＧに当てはめると、機能ブロックＡにおいては、ステップｓ８の処理で送信ノードにノード１３０１、１３０４、および１３０７が該当すると判断され、データベースｄ２に登録される。またステップｓ９の処理で受信ノードにノード１３０２、および１３０５が該当すると判断され、データベースｄ３に登録される。
【０１２８】
一方の機能ブロックＢにおいては、ステップｓ８の処理で送信ノードにノード１３１０、および１３１３が該当すると判断され、データベースｄ２に登録される。またステップｓ９の処理で受信ノードにノード１３０８、１３１１、および１３１４が該当すると判断され、データベースｄ３に登録される。更に通信の依存関係を調査する。
【０１２９】
図２０は、データベースｄ２とｄ３に登録されているノード情報について、通信の依存関係を、ＣＤＦＧのノードと枝の情報から調査して得られた結果を表している。通信動作の番号（Ｍ１〜Ｍ１０）は説明のために付けた番号で、他に意味はない。ブロックの列は、該通信動作が含まれる機能ブロックを表している。通信路の列は、通信動作が用いる通信路を識別するためのものである。影響を受ける通信の列は、該通信が影響を受ける通信路を識別するためのもので、影響を与える通信の列は、該通信が影響を与える通信路を識別するためのものである。
【０１３０】
図２０に示す情報をもとに、図１３のＣＤＦＧにおいて通信動作が行われる機能ブロックＡのステートｓｔａｔｅＡ＿３、および機能ブロックＢのステートｓｔａｔｅＢ＿３のサイクル精度の動作モデルを作成する。
【０１３１】
動作モデルは、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または通信する値が他の通信路に影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズの計３フェーズの計算で構成される。
【０１３２】
以降の説明では、最初のフェーズを第１フェーズ目、次のフェーズを第２フェーズ目、最後のフェーズを第３フェーズ目と表現して説明する。第１フェーズ目に含まれる通信としては、図２０に示す表から、通信の種類が送信（ｓｅｎｄ）であり、かつ影響を受ける通信が無いものは、通信動作Ｍ１のみである。
【０１３３】
次に第２フェーズ目に含まれる通信としては、図２０に示す表から、通信の種類が送信（ｓｅｎｄ）であり、かつ影響を受ける通信があるものは、通信動作Ｍ３、Ｍ５、Ｍ７、Ｍ９の４つであり、通信の種類が受信（ｒｅｃｅｉｖｅ）であり、かつ影響を与える通信があるものは、通信動作Ｍ２、Ｍ４、Ｍ６、Ｍ８の４つである。
【０１３４】
最後の第３フェーズ目に含まれる通信としては、図２０に示す表から、通信の種類が受信（ｒｅｃｅｉｖｅ）であり、かつ影響を与える通信が無いものは、通信動作Ｍ１０のみである。第２フェーズ目の通信について、通信を識別するための情報と、該通信が依存している通信を識別する情報と、該通信の計算式などの情報を格納するためのデータ構造を作成する。
【０１３５】
図２１は、他の通信に依存している通信動作について、各種情報を格納するためのデータ構造をＣ言語の構造体を用いて表現した例である。該構造体の中では、通信を識別するための情報としてｄｅｓｔｉｎａｔｉｏｎという変数を用いている。また通信が依存している通信を識別するための情報として、ｓｏｕｒｃｅという変数を用いている。更に通信動作を表す関数を指し示すポインタとして、関数ポインタｆｕｎｃｔｉｏｎを用いている。
【０１３６】
続いて、このデータ構造を登録するためのリストを作成する。本実施形態の実施例２では、配列として表現した場合を説明する。
【０１３７】
図２２は、図２１のデータ構造を配列として実装した例であり、図２３に示すように４個の要素を持つ配列としている。
【０１３８】
それでは各フェーズに含まれる通信動作の計算について、例を用いて説明する。
【０１３９】
〔第１フェーズ目の通信動作の計算〕
図２３は、図１２に示す機能ブロックＡのステートｓｔａｔｅＡ＿３と、図１２に示す機能ブロックＢのステートｓｔａｔｅＢ＿３の第１フェーズ目の計算を関数で表した動作モデルを示している。関数ｓｔＡ＿３＿１ｓｔＰｈａｓｅでは、通信動作Ｍ１の通信を表現するために、通信路ｃｈａｎｎｅｌ１を表す変数ｃｈａｎ１に、ｒｅｇｉｓｔｅｒＡを表す変数ｒｅｇＡの値を代入している。また、第２フェーズ目の計算で用いるデータ構造を図２１で示す構造体を用い、各メンバ変数とメンバ関数を設定し、図２２で示すデータ構造のリストに登録している。
【０１４０】
図２３に示す構造体に設定している値で、ｃ２、ｃ３、ｃ４、ｃ５は通信路を識別するためのものである。これらは、Ｃ言語のｅｎｕｍなどを用いて表現できる。また、ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３、ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５、ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２、ｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４は通信動作を計算するための関数である。
【０１４１】
図２４は、通信動作を計算するための関数の例であり、図２０に示す表にある通信動作Ｍ２、Ｍ３、Ｍ４、Ｍ５、Ｍ６、Ｍ７、Ｍ８、およびＭ９について表している。通信の種類が送信（ｓｅｎｄ）であり、かつ影響を受ける通信である通信動作Ｍ３、Ｍ５、Ｍ７、Ｍ９と、通信種類が受信（ｒｅｃｅｉｖｅ）であり、かつ影響を与える通信である通信動作Ｍ２、Ｍ４、Ｍ６、Ｍ８については、相互に影響を及ぼす送信と受信をペアにすることができる。
【０１４２】
例えば、通信動作Ｍ３に着目すると、この通信は通信路ｃｈａｎｎｅｌ３を用いた送信である。通信路ｃｈａｎｎｅｌ３に影響を与える通信動作としては通信動作Ｍ２がある。通信動作Ｍ２とＭ３をペアにし、通信動作Ｍ２で受信したデータをもとに通信動作Ｍ３で送信するという一連の動作を関数で表す。
【０１４３】
図２４で表す関数ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３が、通信動作Ｍ２とＭ３の一連の動作を表した関数に該当する。残りの通信動作については、通信動作Ｍ４とＭ５をペアにし、また通信動作Ｍ６とＭ７をペアにし、また通信動作Ｍ８とＭ９をペアにし、それぞれの通信動作を関数で表す。通信動作Ｍ４とＭ５のペアに該当する関数は、ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５であり、通信動作Ｍ６とＭ７のペアに該当する関数は、ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２であり、通信動作Ｍ８とＭ９のペアに該当する関数は、ｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４である。
【０１４４】
これらの関数では、図２１のデータ構造と、図２２のデータ構造の配列を用い、通信動作が依存する通信動作を先に演算するようにしている。
【０１４５】
例えば、通信の関数ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３について説明する。この関数については、通信路ｃｈａｎｎｅｌ２で受信した値を組み合わせロジックＡ１で演算し、演算した結果を通信路ｃｈａｎｎｅｌ３に送信する動作を表している。この関数では、まず図２２に示す配列から各データ構造を調べ、通信を識別する情報、つまりデータ構造のメンバ変数ｄｅｓｔｉｎａｔｉｏｎがｃｈａｎｎｅｌ２であるデータ構造を見つける。図２３で示している配列の設定によると、メンバ変数ｄｅｓｔｉｎａｔｉｏｎがｃｈａｎｎｅｌ２であるデータ構造は、配列の３番目の要素であるｔｒａｎｓａｃｔｉｏｎ［２］となる。所望のデータ構造が見つかれば、そのデータ構造が持つ関数へのポインタを表すメンバ変数ｆｕｎｃｔｉｏｎで示される関数を先に実行する。配列の３番目の要素であるｔｒａｎｓａｃｔｉｏｎ［２］のメンバ変数ｆｕｎｃｔｉｏｎで示される関数は、図２３で示している設定によると、関数ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２となる。よって関数ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２を先に実行する。続いて、通信の関数ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３の計算、つまり組み合わせロジックＡ１を用いた演算を行う。
【０１４６】
また図２３において、関数ｓｔＢ＿３＿１ｓｔＰｈａｓｅでは第１フェーズ目に該当する通信動作は無い。第２フェーズ目の計算で用いるデータ構造体を図２１で示す構造体を用い、機能ブロックＡと同様に各メンバ変数とメンバ関数を設定する。
【０１４７】
〔第２フェーズ目の通信動作の計算〕
図２５は、第２フェーズ目の計算を関数で表した動作モデルの例を示している。この例では、通信路の計算式を計算した結果が、３フェーズ目の計算において用いられるような通信路について、計算を行っている。第３フェーズ目で計算される通信動作はＭ１０である。通信動作Ｍ１０の通信路はｃｈａｎｎｅｌ５であり、通信路ｃｈａｎｎｅｌ５に対して送信動作を行う通信を表した関数は、図２４において、ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５である。よってｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５の計算を行う。第１フェーズ目の説明で述べたように、図２４に示す関数では、通信の依存関係に沿って、依存関係がある通信の計算を先に進めていく。具体的には、次の順番で計算される。
【０１４８】
１．ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２
２．ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３
３．ｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４
４．ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５
また、第２フェーズ目の通信動作の計算において他の手順で計算を進めても良い。図２２に示すデータ構造に、通信路の計算式が計算済みかどうかを示すフラグを追加し、第１フェーズ目の通信動作の計算時点において該フラグを未計算の状態に設定し、第２フェーズ目の通信動作の計算において、通信路の計算式が計算された後、フラグを計算済みの状態に設定することで、重複して同じ計算を行わないようにすることができる。
【０１４９】
図２６は、図２２に示すデータ構造に通信路の計算式が計算済みかどうかを示すフラグを追加したデータ構造の例である。メンバ変数ｆｉｎｉｓｈは、例えば、通信路の計算式が未計算のときは’０’であるとし、また計算済みの場合は’１’であるとすることで、計算が未実行なのかどうかを判別することができる。このフラグは第１フェーズ目で未計算の状態に設定する。
【０１５０】
図２７は、図２６に示すデータ構造を用いて第２フェーズ目の通信動作を表した関数である。図２４で説明した関数と比較すると、変数ｆｉｎｉｓｈを用いて、通信が依存する通信の計算式が未実行なのか実行済みなのかを判定し、未実行である場合にのみ、依存する通信の関数、つまり計算を実行するようにしている。更に各通信において、計算を実行したあとに変数ｆｉｎｉｓｈを実行済みの状態に設定している。
【０１５１】
図２８は、第２フェーズ目の計算を図２７に示す関数を用いて行う場合の動作モデルの例である。図２２で示したデータ構造の配列について、順番にデータ構造が示す通信動作の関数を実行する。順番に実行しても、計算の未実行・実行済みを表すフラグによって、重複して計算が行われることはない。このフラグが無い場合、データ構造の配列を順番に実行すると、通信動作が重複して計算され、誤った値が算出される。フラグが無い場合の通信動作の関数が実行される順番は次のようになる。
【０１５２】
順番１．図２２に示す配列の０番目の要素には、ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３が入っているので、該関数を実行する。
【０１５３】
順番２．ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３はｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２に依存しているので、先にｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２が計算される。ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２は他の通信に依存していないので、ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２の計算式であるｃｈａｎ２  ＝  ｌｏｇｉｃ＿Ｂ１（ｃｈａｎ１）の計算が実行される。
【０１５４】
順番３．次にｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３の計算式ｃｈａｎ３  ＝  ｌｏｇｉｃ＿Ａ１（ｃｈａｎ２）が計算される。
【０１５５】
順番４．図２２に示す配列の１番目の要素には、ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５が入っているので、該関数を実行する。
【０１５６】
順番５．ｆｕｎｃｔｉｏｎ＿ｃ４ｔｏｃ５はｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４に依存しているので、先にｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４が計算される。
【０１５７】
順番６．ｆｕｎｃｔｉｏｎ＿ｃ３ｔｏｃ４はｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３に依存しているので、先にｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３が計算される。
【０１５８】
順番７．ｆｕｎｃｔｉｏｎ＿ｃ２ｔｏｃ３はｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２に依存しているので、先にｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２が計算される。ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２は他の通信に依存していないので、ｆｕｎｃｔｉｏｎ＿ｃ１ｔｏｃ２の計算式であるｃｈａｎ２  ＝  ｌｏｇｉｃ＿Ｂ１（ｃｈａｎ１）の計算が実行される。
【０１５９】
順番７の計算において、計算式は順番２で既に実行されているので、重複した計算が行われる。例えばｌｏｇｉｃ＿Ｂ１が加算を表すものであれば、この関数が複数回実行されることで、誤って加算された結果が算出される。
【０１６０】
〔第３フェーズ目の計算〕
図２９は機能ブロックＡのステートｓｔａｔｅＡ＿３と、機能ブロックＢのステートｓｔａｔｅＢ＿３の第３フェーズ目の計算を関数で表した動作モデルである。
【０１６１】
関数ｓｔＡ＿３＿３ｒｄＰｈａｓｅでは、該当する通信動作はない。よって関数の中身は空である。
【０１６２】
関数ｓｔＢ＿３＿３ｒｄＰｈａｓｅでは、図２０に示す表の通信動作Ｍ１０の通信を表現する。通信路ｃｈａｎｎｅｌ５を表す変数ｃｈａｎ５の値を、ｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢに代入している。
【０１６３】
３つの計算フェーズで構成された動作モデルを用いたシミュレータを作成し、シミュレーションを走らせ、動作が正しく計算されるか確認する。
【０１６４】
図３０で示すシミュレータは、機能ブロックＡのステートの計算式をまず計算し、次に機能ブロックＢのステートの計算式を計算するよう構成されたシミュレータの例である。
【０１６５】
図３０に示すシミュレータは、図２３に示す第１フェーズ目の計算を関数で表した動作モデル、図２５あるいは図２８に示す第２フェーズ目の計算を関数で表した動作モデル、及び図２９第３フェーズ目の計算を関数で表した動作モデルにより構成されており、このシミュレータでは、図７で示すクロックのタイミングＣ１〜Ｃ５で各ステートの動作が計算されるものとする。図３０に示す例では、機能ブロックＡのステートｓｔａｔｅＡ＿３の第１フェーズ目の関数ｓｔＡ＿３＿１ｓｔＰｈａｓｅを計算し、次に機能ブロックＢのステートｓｔａｔｅＢ＿３の第１フェーズ目の関数ｓｔＢ＿３＿１ｓｔＰｈａｓｅを計算する。
【０１６６】
続いて、第２フェーズ目の関数ｓｔＡＢ＿３＿２ｎｄＰｈａｓｅを計算する。最後に機能ブロックＡのステートｓｔａｔｅＡ＿３の第３フェーズ目の関数ｓｔＡ＿３＿３ｒｄＰｈａｅｓを計算し、次に機能ブロックＢの第３フェーズ目の関数ｓｔＢ＿３＿３ｒｄＰｈａｓｅを計算する。
【０１６７】
機能ブロックＡのステートｓｔａｔｅＡ＿３と機能ブロックＢのｓｔａｔｅＢ＿３の計算を完了した時点で、機能ブロックＢのｒｅｇｉｓｔｅｒＢを表す変数ｒｅｇＢの値をＣ言語の標準入出力ライブラリ関数であるｐｒｉｎｔｆを用いて標準出力にダンプする。ｒｅｇｉｓｔｅｒＢの値を調べることで、全ての通信路で正しくデータが通信できたかどうか判断することができる。
【０１６８】
図３１は、図３０に示す例に対して、機能ブロックＢから計算を始める場合のシミュレータの例を示している。
【０１６９】
図３０に示す例と同様にｓｔａｔｅＢ＿３、およびｓｔａｔｅＡ＿３の計算が終了した時点でｒｅｇＢの値をダンプする。図３０、及び図３１で示すシミュレータを用いてシミュレーションすると、ダンプされる値は同じである。どちらの計算でも、第１フェーズ目で変数ｃｈａｎ１に変数ｒｅｇＡの値を代入し、第２フェーズ目で通信の依存関係に沿って通信動作が正しく計算され、第３フェーズ目で変数ｒｅｇＢに変数ｃｈａｎ５の値を代入している。つまり、どちらのシミュレータでもｒｅｇｉｓｔｅｒＡの値が、正しくｒｅｇｉｓｔｅｒＢに送信されている。
【０１７０】
以上のことから、２つ以上の機能ブロックが存在し、かつ２つ以上の通信路を用い、かつ通信路で通信する値が他の通信に依存している場合、通信する値が他の通信路から影響を受けない送信動作の計算式を計算するフェーズと、次に、通信する値が他の通信路から影響を受けている、または影響を与えている通信動作の計算式を計算するフェーズと、最後に全ての機能ブロックにおいて、受信する値が他の通信路に影響を与えていない受信動作の計算式を計算するフェーズの計３フェーズの計算を行い、２フェーズ目の計算において、任意の通信路の計算式を計算する際に、該通信路が依存している通信路の計算を先に行うような順番で計算を進めることで、機能ブロックの計算する順番によらず正確にサイクル精度でシミュレーションが可能となる。
【０１７１】
以上のように、本発明の好ましい実施形態を用いて本発明を例示してきたが、本発明は、この実施形態に限定して解釈されるべきものではない。本発明は、特許請求の範囲によってのみその範囲が解釈されるべきであることが理解される。当業者は、本発明の具体的な好ましい実施形態の記載から、本発明の記載および技術常識に基づいて等価な範囲を実施することができることが理解される。本明細書において引用した特許、特許出願および文献は、その内容自体が具体的に本明細書に記載されているのと同様にその内容が本明細書に対する参考として援用されるべきであることが理解される。
【産業上の利用可能性】
【０１７２】
本発明は、ハードウェア検証用プログラミング記述を生成する装置および方法、並びにこの方法をコンピュータにより行うための制御プログラムの分野において、ハードウェアを汎用プログラミング言語で表現した記述として、機能ブロックの計算する順番によらず、サイクル精度で正確に検証する動作モデルを生成することができる装置および方法、並びにこの方法をコンピュータにより行うための制御プログラムを提供することができる。
【符号の説明】
【０１７３】
１  モニタ装置
２  キーボードなどの入力装置
３  計算機本体
４  ハードウェア高位合成プログラム
３１  制御部（ＣＰＵ）
３２  メモリなどの可読記録媒体
３３  磁気ディスクなどの可読記録媒体
１００  ハードウェア検証用プログラミング記述生成装置としてのコンピュータシステム
４０１  構文解析・字句解析手段
４０２  機能ブロック分割手段
４０３  ＣＤＦＧ生成手段
４０４  スケジューリング・ステート割り振り手段
４０５  送信ノード抽出手段
４０６  受信ノード抽出手段
４０７  通信依存調査手段
４０８  通信リスト制御記述生成手段
４０９  計算順序制御記述生成手段
４１０  動作モデル記述生成手段
【図１】
2011053805.tif 000003
【図２】
2011053805.tif 000004
【図３】
2011053805.tif 000005
【図４】
2011053805.tif 000006
【図５】
2011053805.tif 000007
【図６】
2011053805.tif 000008
【図７】
2011053805.tif 000009
【図８】
2011053805.tif 000010
【図９】
2011053805.tif 000011
【図１０】
2011053805.tif 000012
【図１１】
2011053805.tif 000013
【図１２】
2011053805.tif 000014
【図１３】
2011053805.tif 000015
【図１４】
2011053805.tif 000016
【図１５】
2011053805.tif 000017
【図１６】
2011053805.tif 000018
【図１７】
2011053805.tif 000019
【図１８】
2011053805.tif 000020
【図１９】
2011053805.tif 000021
【図２０】
2011053805.tif 000022
【図２１】
2011053805.tif 000023
【図２２】
2011053805.tif 000024
【図２３】
2011053805.tif 000025
【図２４】
2011053805.tif 000026
【図２５】
2011053805.tif 000027
【図２６】
2011053805.tif 000028
【図２７】
2011053805.tif 000029
【図２８】
2011053805.tif 000030
【図２９】
2011053805.tif 000031
【図３０】
2011053805.tif 000032
【図３１】
2011053805.tif 000033