(57)【要約】【課題】  安価に、かつ、高速にサイクルアキュレートレベルでハードウェアを検証可能な汎用プログラミング言語で記述された検証用モデルを、従来に比べて少ない計算量で生成する。【解決手段】  ＣＤＦＧ生成手段１０９によりハードウェアの動作記述１０７からＣＤＦＧを生成し、スケジューリング手段１１０によりＣＤＦＧをハードウェア仕様として要求される動作周波数でスケジューリングしてステート毎に割り振り、サイクルアキュレートモデル生成手段１１１によりステート毎にハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成する。ＣＤＦＧに含まれるノードの動作情報を用いて各ノードの動作モデルを生成し、ノードの接続情報を用いて各ノードの動作モデルを計算する際の順序付けを行うことにより、各ステートでシミュレーション可能なモデルを生成することができる。【選択図】  図１
2006139729.tif 000002
【特許請求の範囲】
【請求項１】
ハードウェアを検証可能な汎用プログラミング言語モデルを自動生成するハードウェア検証用プログラミング言語モデル生成装置であって、
該ハードウェアの動作が表現された動作記述を解析した動作情報から該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成手段と、
ハードウェア仕様として要求される動作周波数で該コントロールデータフローグラフをスケジューリングして各ステート毎に割り振るスケジューリング手段と、
該各ステート毎に該コントロールデータフローグラフを用いて、該ハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成するサイクルアキュレートモデル生成手段とを有するハードウェア検証用プログラミング言語モデル生成装置。
【請求項２】
前記サイクルアキュレートモデル生成手段は、
前記各ステートでシミュレーション可能なモデルを生成するために、前記コントロールデータフローグラフに含まれる各ノードの動作情報を用いて該各ノードの動作モデルを生成し、該各ノードの接続情報を用いて該各ノードの動作モデルを計算する際の順序付けを行う動作モデル生成部を有する請求項１に記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項３】
前記サイクルアキュレートモデル生成手段は、
あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、該あるノードの出力値をレジスタに保存するための計算式を、該あるノードの出力結果を示すモデルを用いて生成する該レジスタへの入力値計算式生成部を有する請求項１または２に記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項４】
前記サイクルアキュレートモデル生成手段は、
あるノードまたはレジスタの出力が記憶装置への入力として使用される場合に、該あるノードまたはレジスタの出力値を該記憶装置に保存するための計算式を、該あるノードまたはレジスタの出力結果を示すモデルを用いて生成する該記憶装置への入力値計算式生成部を有する請求項１〜３のいずれかに記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項５】
前記サイクルアキュレートモデル生成手段は、
前記ハードウェアの動作モデルを、前記各ステートでシミュレーション可能なモデルとして、汎用プログラミング言語の関数を用いて表現する請求項１〜４のいずれかに記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項６】
前記コントロールデータフローグラフ生成手段は、
前記ハードウェアの構造に関する記述が含まれず、処理の動作のみが記述された動作記述を解析する構文解析・字句解析部と、
該構文解析・字句解析部で解析した並列動作に従って回路のブロック分割を行うブロック分割部と、
分割した各ブロック毎に、該ハードウェアによって実行される演算内容がノードで表され、該ノード間のデータの流れが枝で表されたコントロールデータフローグラフを生成するコントロールデータフローグラフ生成部とを有する請求項１に記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項７】
前記各ノードの動作情報は、前記各ノード毎に、少なくとも、該ノードが演算か否か、また、該ノードが演算の場合にどのような種類の演算を行うのか、該ノードが演算でない場合にどのような機能を有するのかを示す演算内容と、階層と、前記ステートの番号とを含む請求項２に記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項８】
前記各ノードの接続情報は、該ノードの出力先と入力先とを示す情報を含む請求項２に記載のハードウェア検証用プログラミング言語モデル生成装置。
【請求項９】
請求項１〜８のいずれかに記載のハードウェア検証用プログラミング言語モデル生成装置と、
前記スケジューリング結果として得られるステートの実行順序に従って、前記サイクルアキュレートモデル生成手段によって生成された関数を実行することによって、前記ハードウェアのシミュレーションを行うシミュレーション手段とを有するコンピュータシステム。
【請求項１０】
ハードウェアを検証可能な汎用プログラミング言語記述を自動生成するハードウェア検証用プログラミング言語モデル生成方法であって、
該ハードウェアの動作が表現された動作記述を解析した動作情報から該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップと、
ハードウェア仕様として要求される動作周波数で該コントロールデータフローグラフをスケジューリングして各ステート毎に割り振るスケジューリングステップと、
該各ステート毎に該コントロールデータフローグラフを用いて、該ハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成するサイクルアキュレートモデル生成ステップとを有するハードウェア検証用プログラミング言語モデル生成方法。
【請求項１１】
前記サイクルアキュレートモデル生成ステップは、
前記各ステートでシミュレーション可能なモデルを生成するために、前記コントロールデータフローグラフに含まれる各ノードの動作情報を用いて該各ノードの動作モデルを生成し、該各ノードの接続情報を用いて該各ノードの動作モデルを計算する際の順序付けを行う動作モデル生成ステップを有する請求項１０に記載のハードウェア検証用プログラミング言語モデル生成方法。
【請求項１２】
前記サイクルアキュレートモデル生成ステップは、
あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、該あるノードの出力値をレジスタに保存するための計算式を、該あるノードの出力結果を示すモデルを用いて生成する該レジスタへの入力値計算式生成ステップを有する請求項１０または１１に記載のハードウェア検証用プログラミング言語モデル生成方法。
【請求項１３】
前記サイクルアキュレートモデル生成ステップは、
あるノードまたはレジスタの出力が記憶装置への入力として使用される場合に、該あるノードまたはレジスタの出力値を該記憶装置に保存するための計算式を、該あるノードまたはレジスタの出力結果を示すモデルを用いて生成する該記憶装置への入力値計算式生成ステップを有する請求項１０〜１２のいずれかに記載のハードウェア検証用プログラミング言語モデル生成方法。
【請求項１４】
前記サイクルアキュレートモデル生成ステップは、
前記ハードウェアの動作モデルを、前記各ステートでシミュレーション可能なモデルとして、汎用プログラミング言語の関数を用いて表現する請求項１０〜１３のいずれかに記載のハードウェア検証用プログラミング言語モデル生成方法。
【請求項１５】
前記コントロールデータフローグラフ生成ステップは、
前記ハードウェアの構造に関する記述が含まれず、処理の動作のみが記述された動作記述を解析する構文解析・字句解析ステップと、
該構文解析・字句解析ステップで解析した並列動作に従って回路のブロック分割を行うブロック分割ステップと、
分割した各ブロック毎に、該ハードウェアによって実行される演算内容がノードで表され、該ノード間のデータの流れが枝で表されたコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップとを有する請求項１０に記載のハードウェア検証用プログラミング言語モデル生成方法。
【請求項１６】
請求項１０〜１５のいずれかに記載のハードウェア検証用プログラミング言語モデル生成方法の各ステップと、
前記スケジューリング結果として得られるステートの実行順序に従って、前記サイクルアキュレートモデル生成ステップによって生成された関数を実行することによって、前記ハードウェアのシミュレーションを行うシミュレーションステップとを有するハードウェアシミュレーション方法。
【請求項１７】
請求項１０〜１６のいずれかに記載の方法の各ステップをコンピュータによって実行するための処理手順が記述された制御プログラム。
【請求項１８】
請求項１７に記載の制御プログラムが格納されたコンピュータ読み取り可能な可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハードウェアを検証可能な汎用プログラミング言語記述を自動生成するためのハードウェア検証用プログラミング言語モデル生成装置、これを用いたハードウェア検証用プログラミング言語モデル生成方法、コンピュータシステム、これを用いたハードウェアシミュレーション方法、この方法をコンピュータに実行させるための制御プログラムおよびその制御プログラムが格納されたコンピュータ読み出し可能な可読記憶媒体に関する。
【背景技術】
【０００２】
システムＬＳＩの開発において、設計されたハードウェアの動作がシステムＬＳＩに与えられた要求仕様を満たすか否かを検証する必要がある。
【０００３】
従来は、サイクルアキュレートレベルでハードウェアの検証を行うために、ＨＤＬ（Ｈａｒｄｗａｒｅ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌａｎｇｕａｇｅ）シミュレータが用いられていた。この方法では、ＨＤＬシミュレータによって動作速度などのパフォーマンス測定が行われ、与えられた仕様を満たしているか否かが検証される。一般に、ＨＤＬシミュレータにおいては、ＶＨＤＬなど、ハードウェア記述言語で記述された回路動作がシミュレーションされる。ＨＤＬシミュレータでは、回路内の信号の変化がクロックサイクルよりも短い時間単位で監視され、その信号変化を接続する信号に伝搬させるというイベント駆動方式によってシミュレーションが行われている。
【０００４】
また、ハードウェア記述言語で記述されたハードウェアと、汎用プログラミング記述言語で記述されたソフトウェアとを協調させて検証する場合には、ハードウェアはＨＤＬシミュレータを用いデバッグされ、ソフトウェアはソフトデバッガなどでデバッグされる。また、例えば特許文献１には、汎用プログラミング言語を用いてハードウェアの動作をシミュレーションし、ハードウェアとソフトウェアとの協調検証を行う方法が開示されている。この従来技術では、並列動作するハードウェアがＣ言語などの汎用プログラミング言語で表現され、これをソフトデバッガによってデバッグすることによって、ハードウェアとソフトウェアとの協調検証の効率化が図られている。
【０００５】
さらに、例えば特許文献２には、高位合成により、ハードウェアで実行される全演算の動作を示す記述を作成し、汎用プログラミング言語による検証モデルを生成することによって、ハードウェアのサイクルアキュレートレベルでの検証を高速に行うことができるという方法が開示されている。この従来技術では、コントロールデータフローグラフがステートに分割されてステート毎の動作情報が抽出され、分割されたコントロールデータフローグラフにハードウェアが割り付けられてデータパス情報が抽出される。動作情報とデータパス情報とから各ステート内で動作する演算器が各動作条件に分割され、演算器がレベル付けされて各演算の動作を実行する順序が決められることによって、サイクルアキュレートレベルで検証可能なモデルが生成される。
【０００６】
なお、サイクルアキュレートレベルとは、ハードウェアの動作について、そのハードウェアの状態をクロックサイクル単位で示すことが可能な精度レベルのことである。例えば、クロックの立ち上がりに同期して動作するハードウェアにおいては、そのクロックの立ち上がりエッジにおけるハードウェア中のレジスタやメモリなどの記憶装置の状態を示すことが可能なレベルのことである。
【０００７】
また、高位合成とは、ハードウェアの構造に関する情報は含まれず、処理の動作のみが記述された動作記述から、ＲＴＬ（レジスタ・トランスファ・レベル）の論理回路を自動生成する技術であり、例えば特許文献３にその詳細が説明されている。
【０００８】
また、ステートとは、各クロックサイクル毎に実行される動作のことである。
【特許文献１】特開平１０−１４９３８２号公報
【特許文献２】特開２００１−１４３５６号公報
【特許文献３】特開平５−１０１１４１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記従来技術ではそれぞれ、以下のような問題がある。
【００１０】
上記ＨＤＬシミュレータによる検証では、イベント駆動方式でシミュレーションが進められるため、シミュレーションの時間単位がクロックサイクルよりも短い。よって、ハードウェアのサイクルアキュレートレベルでの検証を行うためには、冗長かつ無駄な計算が多くなり、効率が悪いという問題がある。また、シミュレーションされる回路の規模が大きいか、またはテストパターンが長くなると、シミュレーションに必要な計算量が非常に多くなり、シミュレーションに時間がかかるという問題がある。さらに、ＨＤＬシミュレータは高価であり、システムＬＳＩの開発コストが増えるという問題もある。
【００１１】
また、ハードウェアとソフトウェアとの協調検証を行うために、ハードウェア記述言語で記述されたハードウェアをＨＤＬシミュレータでデバッグし、汎用プログラミング言語で記述されたソフトウェアをソフトデバッガでデバッグする方法では、言語が異なるデバッガを用いるため、検証効率が悪いという問題がある。また、特許文献１に開示されている従来技術では、ハードウェアのアルゴリズムレベルにおける検証は可能であるが、サイクルアキュレートレベルでの検証を行うことはできない。よって、システムに与えられた動作周波数などの要求仕様をハードウェアが満たすか否かを検証することはできない。
【００１２】
さらに、特許文献２に開示されている従来技術では、回路規模が大きくなると、ハードウェアの割り付けおよびデータパス情報の抽出を行うために多大な時間が必要となり、また、動作条件から演算器のレベル付けおよび演算の実行順序を決定するための計算量も多くなるため、検証効率が悪くなるという問題がある。
【００１３】
このように、従来技術では、いずれも、ＬＳＩ設計・開発におけるＴＡＴ（ターン・アラウンド・タイム；問題があった場合に後戻りして処理する時間）が長くなり、また、開発コストが増加するという問題がある。
【００１４】
本発明は、上記従来の問題を解決するもので、安価かつ高速にサイクルアキュレートレベルでハードウェアを検証可能な汎用プログラミング言語で記述された検証用モデルを、従来に比べて少ない計算量で生成することにより、短いＴＡＴと低コストでＬＳＩ設計・開発に寄与できるハードウェア検証用プログラミング言語モデル生成装置、これを用いたハードウェア検証用プログラミング言語モデル生成方法、コンピュータシステム、これを用いたハードウェアシミュレーション方法、この方法をコンピュータに実行させるための制御プログラムおよびその制御プログラムが格納されたコンピュータ読み出し可能な可読記憶媒体を提供することを目的とする。
【課題を解決するための手段】
【００１５】
本発明のハードウェア検証用プログラミング言語モデル生成装置は、ハードウェアを検証可能な汎用プログラミング言語モデルを自動生成するハードウェア検証用プログラミング言語モデル生成装置であって、該ハードウェアの動作が表現された動作記述を解析した動作情報から該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成手段と、ハードウェア仕様として要求される動作周波数で該コントロールデータフローグラフをスケジューリングして各ステート毎に割り振るスケジューリング手段と、該各ステート毎に該コントロールデータフローグラフを用いて、該ハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成するサイクルアキュレートモデル生成手段とを有しており、そのことにより上記目的が達成される。
【００１６】
また、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置におけるサイクルアキュレートモデル生成手段は、前記各ステートでシミュレーション可能なモデルを生成するために、前記コントロールデータフローグラフに含まれる各ノードの動作情報を用いて該各ノードの動作モデルを生成し、該各ノードの接続情報を用いて該各ノードの動作モデルを計算する際の順序付けを行う動作モデル生成部を有する。
【００１７】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置におけるサイクルアキュレートモデル生成手段は、あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、該あるノードの出力値をレジスタに保存するための計算式を、該あるノードの出力結果を示すモデルを用いて生成する該レジスタへの入力値計算式生成部を有する。
【００１８】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置におけるサイクルアキュレートモデル生成手段は、あるノードまたはレジスタの出力が記憶装置への入力として使用される場合に、該あるノードまたはレジスタの出力値を該記憶装置に保存するための計算式を、該あるノードまたはレジスタの出力結果を示すモデルを用いて生成する該記憶装置への入力値計算式生成部を有する。
【００１９】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置におけるサイクルアキュレートモデル生成手段は、前記ハードウェアの動作モデルを、前記各ステートでシミュレーション可能なモデルとして、汎用プログラミング言語の関数を用いて表現する。
【００２０】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置におけるコントロールデータフローグラフ生成手段は、前記ハードウェアの構造に関する記述が含まれず、処理の動作のみが記述された動作記述を解析する構文解析・字句解析部と、該構文解析・字句解析部で解析した並列動作に従って回路のブロック分割を行うブロック分割部と、分割した各ブロック毎に、該ハードウェアによって実行される演算内容がノードで表され、該ノード間のデータの流れが枝で表されたコントロールデータフローグラフを生成するコントロールデータフローグラフ生成部とを有する。
【００２１】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置における各ノードの動作情報は、前記各ノード毎に、少なくとも、該ノードが演算か否か、また、該ノードが演算の場合にどのような種類の演算を行うのか、該ノードが演算でない場合にどのような機能を有するのかを示す演算内容と、階層と、前記ステートの番号とを含む。
【００２２】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成装置における各ノードの接続情報は、該ノードの出力先と入力先とを示す情報を含む。
【００２３】
本発明のコンピュータシステムは、請求項１〜８のいずれかに記載のハードウェア検証用プログラミング言語モデル生成装置と、前記スケジューリング結果として得られるステートの実行順序に従って、前記サイクルアキュレートモデル生成手段によって生成された関数を実行することによって、前記ハードウェアのシミュレーションを行うシミュレーション手段とを有し、そのことにより上記目的が達成される。
【００２４】
本発明のハードウェア検証用プログラミング言語モデル生成方法は、ハードウェアを検証可能な汎用プログラミング言語記述を自動生成するハードウェア検証用プログラミング言語モデル生成方法であって、該ハードウェアの動作が表現された動作記述を解析した動作情報から該ハードウェアのコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップと、ハードウェア仕様として要求される動作周波数で該コントロールデータフローグラフをスケジューリングして各ステート毎に割り振るスケジューリングステップと、該各ステート毎に該コントロールデータフローグラフを用いて、該ハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成するサイクルアキュレートモデル生成ステップとを有し、そのことにより上記目的が達成される。
【００２５】
また、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成方法におけるサイクルアキュレートモデル生成ステップは、前記各ステートでシミュレーション可能なモデルを生成するために、前記コントロールデータフローグラフに含まれる各ノードの動作情報を用いて該各ノードの動作モデルを生成し、該各ノードの接続情報を用いて該各ノードの動作モデルを計算する際の順序付けを行う動作モデル生成ステップを有する。
【００２６】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成方法におけるサイクルアキュレートモデル生成ステップは、あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、該あるノードの出力値をレジスタに保存するための計算式を、該あるノードの出力結果を示すモデルを用いて生成する該レジスタへの入力値計算式生成ステップを有する。
【００２７】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成方法におけるサイクルアキュレートモデル生成ステップは、あるノードまたはレジスタの出力が記憶装置への入力として使用される場合に、該あるノードまたはレジスタの出力値を該記憶装置に保存するための計算式を、該あるノードまたはレジスタの出力結果を示すモデルを用いて生成する該記憶装置への入力値計算式生成ステップを有する。
【００２８】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成方法におけるサイクルアキュレートモデル生成ステップは、前記ハードウェアの動作モデルを、前記各ステートでシミュレーション可能なモデルとして、汎用プログラミング言語の関数を用いて表現する。
【００２９】
さらに、好ましくは、本発明のハードウェア検証用プログラミング言語モデル生成方法におけるコントロールデータフローグラフ生成ステップは、前記ハードウェアの構造に関する記述が含まれず、処理の動作のみが記述された動作記述を解析する構文解析・字句解析ステップと、該構文解析・字句解析ステップで解析した並列動作に従って回路のブロック分割を行うブロック分割ステップと、分割した各ブロック毎に、該ハードウェアによって実行される演算内容がノードで表され、該ノード間のデータの流れが枝で表されたコントロールデータフローグラフを生成するコントロールデータフローグラフ生成ステップとを有する。
【００３０】
本発明のハードウェアシュミレーション方法は、請求項１０〜１５のいずれかに記載の上記ハードウェア検証用プログラミング言語モデル生成方法の各ステップと、前記スケジューリング結果として得られるステートの実行順序に従って、前記サイクルアキュレートモデル生成ステップによって生成された関数を実行することによって、前記ハードウェアのシミュレーションを行うシミュレーションステップとを有し、そのことにより上記目的が達成される。
【００３１】
本発明の制御プログラムは、請求項１０〜１６のいずれかに記載の上記方法の各ステップをコンピュータによって実行するための処理手順が記述された制御プログラムであって、そのことにより上記目的が達成される。
【００３２】
本発明の可読記憶媒体は、請求項１７に記載の制御プログラムが格納されたコンピュータ読み取り可能な媒体であって、そのことにより上記目的が達成される。
【００３３】
上記構成により、以下、本発明の作用を説明する。
【００３４】
本発明にあっては、ハードウェアの動作記述からコントロールデータフローグラフを生成し、そのコントロールデータフローグラフをハードウェア仕様として要求される動作周波数でスケジューリングしてステート毎に割り振る。そして、ステート毎にコントロールデータフローグラフを用いて、ハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成する。
【００３５】
コントロールデータフローグラフに含まれるノードの動作情報を用いて各ノードの動作モデルを生成し、ノードの接続情報を用いて各ノードの動作モデルを計算する際の順序付けを行うことによって、各ステートでシミュレーション可能なモデルを生成することができる。また、各ステートでシミュレーション可能なモデルを汎用プログラミング言語の関数を用いて表現し、スケジューリング結果として得られるステートの実行順序に従って、その関数を実行することによって、サイクルアキュレートレベルでハードウェアのシミュレーションを行うことができる。
【００３６】
また、あるノードの出力がステートを超えて他のノードへの入力として使用される場合には、そのノードの出力値をレジスタに保存するための計算式を、そのノードの出力結果を示すモデルを用いて生成することによって、各ステートにおけるレジスタへの入力値の計算を行うことができる。また、ハードウェアへの割り付け処理を行うことによって、フリップフロップなどによって構成されるハードウェア内部のレジスタとして、任意のクロックサイクルにおけるレジスタの状態を観測することができる。
【００３７】
さらに、あるノードまたはレジスタの出力が記憶装置への入力として使用される場合に、そのノードまたはレジスタの出力値を記憶装置に保存するための計算式を、そのノードまたはレジスタの出力結果を示すモデルを用いて生成することによって、各ステートにおけるレジスタまたは記憶装置への入力値の計算を行うことができる。また、ハードウェアへの割り付け処理を行うことによって、フリップフロップなどによって構成されるハードウェア内部のレジスタやメモリなどによって構成されるハードウェア内部の記憶装置として、任意のクロックサイクルにおけるレジスタや記憶装置の状態を観測することができる。
【発明の効果】
【００３８】
以上により、本発明によれば、ハードウェアのサイクルアキュレートレベルでの検証を、ＨＤＬシミュレータによる検証に比べて、高速にかつ安価に行うことが可能となる。また、ハードウェアとソフトウェアとの協調検証を行う場合でも、ハードウェアの検証を汎用プログラミング言語で記述されたモデルを用いて行うことができるため、言語の異なるデバッガを用いることなく、サイクルアキュレートレベルでの検証を効率良く行うことが可能である。
【００３９】
また、本発明によれば、任意のクロックサイクルにおけるハードウェア内部のレジスタや記憶装置の状態を観測することができるため、ハードウェアのデバッグ効率を向上させることができる。
【００４０】
さらに、本発明によれば、コントロールデータフローグラフを用いてモデルを生成するため、高位合成においてスケジューリング以降に行われる処理であるデータパス情報の生成処理が不要となる。したがって、回路規模が大きくなった場合に動作モデルを生成するための計算時間を大幅に削減することができる。
【００４１】
以上のことから、本発明によれば、ＬＳＩ設計・開発におけるＴＡＴを短くすることができると共に、開発コストを削減することができる。
【発明を実施するための最良の形態】
【００４２】
以下に、本発明のハードウェア検証用プログラミング言語モデル生成装置およびこれを用いたハードウェア検証用プログラミング言語モデル生成方法の実施形態をコンピュータシステムに適用した場合について、図面を参照しながら詳細に説明する。
【００４３】
図１は、本発明の実施形態に係るハードウェア検証用プログラミング言語モデル生成装置を実現するためのコンピュータシステムの構成例を示すブロック図である。
【００４４】
図１において、ハードウェア検証用プログラミング言語モデル生成装置として機能するコンピュータシステム１００は、出力装置としてのモニタ装置１０１、キーボードなどの入力装置１０２および計算機本体１０３を有しており、計算機本体１０３には制御手段としてのＣＰＵ（中央演算処理ユニット）１０４、ワークメモリなどの記憶装置１０５および磁気ディスク（ＦＤ）、光ディスク（ＣＤ）およびハードディスク（ＨＤＤ）などの可読記憶媒体（ここではＨＤＤ）１０６を有している。
【００４５】
ＨＤＤ１０６には、ハードウェアの動作記述１０７と、本実施形態のハードウェア検証用プログラミング言語モデル生成装置の動作をコンピュータによって実行するための処理手順が記述されたハードウェア検証用プログラミング言語モデル生成プログラムおよびシュミレーションプログラムなどの制御プログラムからなる高位合成手段１０８とが格納されている。このプログラムはコンピュータ起動時にＨＤＤ１０６から記憶装置１０５のワークメモリに読み込まれて、ＣＰＵ１０４によって実行されるようになっている。
【００４６】
この高位合成手段１０８は、高位合成法により、ハードウェアの動作が表現された動作記述を解析した動作情報からハードウェアのコントロールデータフローグラフ（ＣＤＦＧ）を生成するＣＤＦＧ生成手段１０９と、ハードウェア仕様として要求される動作周波数でＣＤＦＧをスケジューリングしてステート毎に割り振るスケジューリング手段１１０と、ステート毎にＣＤＦＧを用いて、ハードウェアをサイクルアキュレートレベルで検証可能な動作モデルを汎用プログラミング言語で表現した記述として生成するサイクルアキュレートモデル生成手段１１１とを有している。
【００４７】
また、本発明のコンピュータシステム１００は、ＣＰＵ１０４が、高位合成手段１０８に含まれる制御プログラムに基づいて、スケジューリング結果として得られるステートの実行順序に従って、サイクルアキュレートモデル生成手段１１１によって生成された関数を実行することによって、ハードウェアのシミュレーションを行うシミュレーション手段（図示せず）をさらに有している。
【００４８】
なお、高位合成手法としては、特許文献３に詳細が述べられているため、ここではその詳細な説明は省略する。本実施形態では、高位合成により回路の並列動作を記述できるものとする。また、本実施形態において生成されるハードウェアをサイクルアキュレートレベルで検証可能なモデルは、汎用プログラミング言語のＣ言語で記述されるものとする。
【００４９】
以下に、上記構成により、本実施形態のハードウェア検証用プログラミング言語モデル生成方法について説明する。
【００５０】
図２は、本実施形態におけるハードウェア検証用プログラミング言語モデル生成方法を説明するためのフロー図である。
【００５１】
図２において、図１のコントロールデータフローグラフ生成手段１０９は、ハードウェアの動作記述１０７を解析する構文解析・字句解析部２０２と、構文解析・字句解析部２０２で解析した並列動作の記述に従って回路のブロック分割を行うブロック分割部２０３と、ブロック分割部２０３で分割した各ブロック毎に、コントロールデータフローグラフ（ＣＤＦＧ）を生成するＣＤＦＧ生成部２０４とを有している。
【００５２】
スケジューリング部２０５は、ハードウェア仕様として与えられる動作周波数でＣＤＦＧをスケジューリングしてステート毎に割り振る。図１のスケジューリング手段１１０はスケジューリング部２０５を有している。
【００５３】
サイクルアキュレートモデル生成部２０８は、動作モデル生成部２１０と、レジスタへの入力値計算式生成部２１１と、記憶装置への入力値計算式生成部２１２とを有している。図１のサイクルアキュレートモデル生成手段１１１はサイクルアキュレートモデル生成部２０８を有している。
【００５４】
動作モデル生成部２１０は、ＣＤＦＧに含まれるノードの動作情報を用いて各ノードの動作モデルを生成し、ノードの接続情報を用いて各ノードの動作モデルを計算する際の順序付けを行う。各ノードの動作モデルを計算する際の順序付けとは、各ノードの入力接続先や出力接続先の情報を用いて各ノードをレベル付けし、レベルの小さい順でソートすることである。
【００５５】
レジスタへの入力値計算式生成部２１１は、あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、そのノードの出力値をレジスタに保存するための計算式を、そのノードの出力結果を示すモデルを用いて生成する。
【００５６】
記憶装置への入力値計算式生成部２１２は、あるノードまたはレジスタの出力がメモリなどの記憶装置への入力として使用される場合に、そのノードまたはレジスタの出力値を記憶装置に保存するための計算式を、そのノードまたはレジスタの出力結果を示すモデルを用いて生成する。
【００５７】
上記構成により、ハードウェアの動作記述１０７は、構文解析・字句解析部２０２によって解析された後、ブロック分割部２０３によって並列動作の記述に従って回路のブロック分割が行われる。各ブロックにおいて、ＣＤＦＧ生成部２０４によってＣＤＦＧが作成される。ＣＤＦＧとは、ハードウェアの動作がノードとノード間を接続する枝とを用いて表現されたものである。ノードはハードウェア中で動作する演算などを示し、ノード間の枝はデータの流れを示している。あるノードから出力されたデータは、そのノードに接続されている枝を通り、接続先のノードの入力として用いられる。
【００５８】
スケジューリング部２０５では、ＣＤＦＧの各ノードについてハードウェアに与えられた動作周波数で回路が動作可能なようにスケジューリングが行われる。このスケジューリングの結果、ＣＤＦＧの各ノードについて、演算が処理されるステート情報などの動作情報２０６と、他ノードとの接続情報２０７とが生成される。ＣＤＦＧの各ノードの接続情報２０７には、ノードの入出力がレジスタに接続されているか否かの情報も含まれている。
【００５９】
この動作情報２０６と接続情報２０７を用いて、サイクルアキュレートモデル生成部２０８によって、ハードウェアをサイクルアキュレートレベルで検証（シミュレーション）可能なモデルを汎用プログラミング言語で表現した記述２０９が生成される。
【００６０】
さらに、ＣＰＵ１０４は、高位合成手段１０８に含まれる制御プログラムに基づいて、スケジューリング結果として得られるステートの実行順序に従って、サイクルアキュレートモデル生成部２０８によって生成された記述２０９（関数）を実行することによって、ハードウェアのシミュレーションを行うことができる。
【００６１】
以下に、サイクルアキュレートモデル生成部２０８において、各ノードの動作モデル生成部２１０によってスケジューリングされたＣＤＦＧの各ステートにおける演算の動作を表現したモデルを生成し、レジスタへの入力値計算式生成部２１１によってレジスタへの入力値を求める計算式を生成し、メモリなど記憶装置への入力値計算式生成部２１２によってメモリなどの記憶装置への入力値を求める計算式を生成する方法について、詳細に説明する。
【００６２】
まず、動作モデル生成部２１０によって、ＣＤＦＧに含まれるノードの動作情報を用いて各ノードの動作モデルを生成し、ノードの接続情報を用いて各ノードの動作モデルを計算する際の順序付けを行い、あるノードの出力がステートを超えて他のノードへの入力として使用される場合に、レジスタへの入力値計算式生成部２１１によって、そのノードの出力値をレジスタに保存するための計算式を、そのノードの出力結果を示すモデルを用いて生成する事例について説明する。
【００６３】
図３は、本実施形態のハードウェア検証用プログラミング言語生成方法について、レジスタへの入力値を求めるための計算式を生成する処理手順を説明するためのＣＤＦＧの一例を示す図である。
【００６４】
図３において、ＣＤＦＧは、”Ａ”という演算を行うノード３０１と、”Ｂ”という演算を行うノード３０２と、”Ｃ”という演算を行うノード３０３と、”Ｄ”という演算を行うノード３０４と、”Ｅ”と言う演算を行うノード３０５と、”Ｆ”という演算を行うノード３０６と、”Ｇ”という演算を行うノード３０７と、内部に条件分岐する真（Ｔ）および偽（Ｆ）の二つのノードを有するブランチノード３０８と、そのブランチノード３０８の内部で条件が真（Ｔ）のときに動作するノード３０９と、偽のときに動作するノード３１０と、”Ｈ”という演算を行うノード３１１と、”Ｉ”という演算を行うノード３１２とを有している。
【００６５】
これらのノードは、ステートの区切りとして、区切り３１３と区切り３１４とで仕切られている。これらの区切りは、ハードウェアの動作クロックの区切りと一致している。ノード３０１〜３０３はステートｎに含まれ、ノード３０４〜３０７はステートｎ＋１に含まれ、ノード３０８〜３１２はステートｎ＋２に含まれている。
【００６６】
また、クロックが進んでステートが変わる場合には、ノードの出力結果を保存するためのレジスタが必要となる場合がある。図３中、ｒ１からｒ８までは、そのレジスタを示している。例えば、ノード３０１の出力結果はレジスタｒ１に蓄積され、ステートの区切り３１３を超えてノード３０４および３０５の入力として用いられる。また、ノード３０２の出力結果はレジスタｒ２に蓄積され、ステートの区切り３１３を超えてノード３０４および３０５の入力として用いられる。さらに、ノード３０３の出力結果はレジスタｒ３に蓄積され、ステートの区切り３１３を超えてレジスタｒ６の入力として用いられる。さらに、ノード３０６の出力結果はレジスタｒ４に蓄積され、ステートの区切り３１４を超えてノード３１１および３１２のいずれかの入力として用いられる。さらに、ノード３０７の出力結果はレジスタｒ５に蓄積され、ステートの区切り３１４を超えてノード３１１および３１２のいずれかの入力として用いられる。さらに、ノード３１１の出力結果はレジスタｒ７に蓄積され、ノード３１２の出力結果はレジスタｒ８に蓄積される。
【００６７】
図４は、図３の各ノードについて、図２のＣＤＦＧの各ノードの動作情報２０６の一例を示す図である。なお、ノードの動作情報２０６としては、各ノード毎に、演算の種類、階層、ステート番号および補足情報といった項目が含まれる。また、演算の種類は、そのノードが演算であるか否か、また、演算の場合にはどのような種類の演算を行うのか、一方、演算でない場合にはどのような機能を有するノードであるのかといった情報を示す。
【００６８】
図４に示すように、ノード３０１、３０２、３０３、３０４、３０５、３０６、３０７、３１１および３１２はそれぞれ演算種類”Ａ”、”Ｂ”、”Ｃ”、”Ｄ”、”Ｅ”、”Ｆ、”Ｇ、”Ｈ”および”Ｉ”をそれぞれ行う各演算ノードである。
【００６９】
また、ノード３０８、ノード３０９およびノード３１０は演算ではなく、内部に階層構造を有するノードである。ノード３０８は内部にノード３０９とノード３１０の二つのノードを有するブランチノード（Ｂｒａｎｃｈ）である。また、ノード３０９は内部にノード３１１を有する真ブロック（Ｔｒｕｅ  Ｂｌｏｃｋ）であり、ノード３１０は内部にノード３１２を有する偽ブロック（Ｆａｌｓｅ  Ｂｌｏｃｋ）である。このような階層構造に関する情報も、ノードの動作情報の一つである。
【００７０】
また、各ノードが動作するステートに関する情報も、この動作情報２０６内に含まれている。例えば、ノード３０１〜３０３はステート番号”ｎ”にスケジューリングされており、ノード３０４〜３０７はステート番号”ｎ＋１”にスケジューリングされており、ノード３０８〜３１２はステート番号”ｎ＋２”にスケジューリングされている。
【００７１】
さらに、内部で条件分岐を有するノード３０８などについては、その分岐先を示す補足情報も含まれる。例えば、ノード３０８には条件分岐によって条件が”真”であればノード３０９に、条件が”偽”であればノード３１０に分岐する。
【００７２】
図５は、図３の各ノードについて、図２のＣＤＦＧの各ノードの接続情報２０７の一例を示す図である。なお、このノードの接続情報としては、例えばノードの出力先と入力先とを示す情報とが挙げられる。
【００７３】
図５に示すように、ノード３０１、３０２、３０３、３０６、３０７、３１１および３１２については、出力の接続先が全てレジスタであるため、レジスタの名前が示された情報となる。
【００７４】
また、ノード３０４と３０５については、出力の接続先が別のノードであるため、それぞれ接続先のノード名が示された情報となっている。
【００７５】
さらに、各ノードにおいて、入力の接続先についても、同様に、ノードとレジスタとによって示されている。
【００７６】
例えばノード３０４および３０５は二つの入力を有するノードであり、一方の入力１にはレジスタｒ１の値が入力され、他方の入力２にはレジスタｒ２の値が入力されている。また、ノード３０６〜３０８は一つの入力を有するノードであり、それぞれノード３０４、３０５およびレジスタｒ６の値が入力されている。さらに、ノード３１１および３１２は二つの入力を有するノードであり、一方の入力１にはレジスタｒ４の値が入力され、他方の入力２にはレジスタｒ５の値が入力されている。
【００７７】
図６は、図３の各ノードについて、図２の各ノードの動作モデル生成部２１０によって、図４のノードの動作情報２０６を用いて各ノードの動作モデルを生成する一例を示す図である。
【００７８】
図６において、各ノードの入力値と出力値とを表すために、ノードの番号に入力側は”ｉｎ”という添え字を付け、出力側は”ｏｕｔ”という添え字を付けて示している。例えば、ノード３０１の入力値を示す場合には”３０１ｉｎ”となる。また、入力値が二つある場合には、”ｉｎ１”と”ｉｎ２”として示している。
【００７９】
演算を行うノードについては、演算の種類をそれぞれ”Ａ”、”Ｂ”、”Ｃ”、”Ｄ”、”Ｅ”、”Ｆ”、”Ｇ”、”Ｈ”および”Ｉ”として動作モデルを表現している。
【００８０】
例えば、ノード３０４の動作モデルは、入力値”３０４ｉｎ１”と”３０４ｉｎ２”とが演算の種類”Ｄ”で演算されるということを示している。具体的に説明すると、例えば演算”Ｄ”が足し算の場合、Ｃ言語の足し算を行う演算子”＋”を用いて、動作モデルは”３０４ｏｕｔ  ＝  ３０４ｉｎ１  ＋  ３０４ｉｎ２”となる。
【００８１】
一方、演算以外のノードについて、例えばノード３０８では、条件分岐によって、内部のノード３０９の動作を示すＣ言語の関数”３０９（）”と、ノード３１０の動作を示すＣ言語の関数”３１０（）”のいずれか一方が実行される。この動作モデルをＣ言語の３項演算子を用いて表現している。また、ノード３０９では、内部のノード３１１の動作を示すＣ言語の関数実行の表現を用いて”３１１（）”と表現している。さらに、ノード３１０では、内部のノード３１２の動作を示すＣ言語の関数実行の表現を用いて”３１２（）”と表現している。
【００８２】
次に、各ノードの動作モデルを計算する順序を決定する方法について説明する。なお、順序の決定は、ステート毎に行われる。計算順序は、図２の各ノードの動作モデル生成部２１０によって、ノードの接続情報２０７を用いて各ノードをレベル付けし、レベルの小さい順でソートすることによって決定される。
【００８３】
レベル付けの手順としては、（１）全ノードのレベルを０とし、（２）あるノードの接続情報から、そのノードの出力先のノードを取り出して、（３）取り出されたノードのレベルを、そのノードに入力されるノードのレベルの中で最大値のもの＋１とする。上記（２）と（３）の手順をステート中の全ノードに適用することによって、レベル付けが行われる。また、階層を有するノードの場合には、その階層中のノードについて、上記手順によってレベル付けが行われる。
【００８４】
上記手順に従って、各ステートでノードにレベル付けを行って計算順序を決定すると、図３に示す事例では、ステートｎにおいて、ノード３０１、３０２および３０３は当該ステート中に出力先となるノードが無いために全て同じレベルとなる。よって、動作モデルの計算はどのノードから行ってもよい。
【００８５】
また、ステートｎ＋１において、ノード３０４の出力はノード３０６に接続されているため、ノード３０４のレベルを”０”とすると、ノード３０６のレベルは”１”となる。よって、ノード３０４の動作モデルを計算した後、ノード３０６の動作モデルを計算する。 同様に、ノード３０５の出力はノード３０７に接続されているため、ノード３０５の動作モデルの計算の後にノード３０７の動作モデルを計算する。
【００８６】
ステートｎ＋２においては、階層を有するノード３０８の動作モデルの計算のみを行う。
【００８７】
図７は、図３に示すステートの区切り３１３を超えるときに、更新されるレジスタへの入力値の計算式の一例を、レジスタへの入力値計算式生成部２１１によって、図５に示すノードの接続情報２０７を用いて生成した図である。
【００８８】
この生成する手順としては、まず、ＣＤＦＧの各ノードの動作情報２０６から、当該ステートに割り当てられているノードを抽出する。その抽出の結果、ノード３０１、３０２および３０３が得られる。
【００８９】
次に、ＣＤＦＧの各ノードの接続情報２０７から、ノードの出力がレジスタに接続されているノードを抽出する。その抽出の結果、ノード３０１がレジスタｒ１に、ノード３０２がレジスタｒ２に、さらに、ノード３０３がレジスタｒ３に接続されているという情報が得られる。
【００９０】
次に、当該ステートで計算される各レジスタへ、そのレジスタに接続されているノードまたはレジスタの出力値を代入するモデルを生成する。この生成の結果、レジスタｒ１、ｒ２およびｒ３に、それぞれノード３０１、３０２および３０３からの出力値が入力されるように、計算式が生成される。
【００９１】
図８は、図３に示すステートの区切り３１４を超えるときに、更新されるレジスタへの入力値の計算式を、レジスタへの入力値計算式生成部２１１によって、図５に示すノードの接続情報２０７を用いて生成した図である。
【００９２】
この生成手順は、先に説明したステートの区切り３１３を超えるときと同じである。その生成の結果、レジスタｒ４、ｒ５およびｒ６に、それぞれノード３０６、３０７およびレジスタｒ３からの出力値が入力されるように、レジスタへの入力値の計算式が生成される。なお、レジスタｒ６への入力計算式は”ｒ６＝ｒ３ｏｕｔ”と生成されている。これは、ｒ６への入力がレジスタｒ３の出力であることを示している。
【００９３】
図９は、図３に示すステートの区切り３１５を超えるときに、更新されるレジスタへの入力値の計算式を、レジスタへの入力値計算式生成部２１１によって、図５に示すノードの接続情報２０７を用いて生成した図である。
【００９４】
この生成手順は、先に説明したステートの区切り３１３を超えるときと同じである。その生成の結果、レジスタｒ７およびｒ８に、それぞれノード３１１および３１２からの出力値が入力されるように、計算式が生成される。
【００９５】
なお、図５に示すノードの接続情報２０７では、レジスタｒ７とレジスタｒ８への接続情報が、ノード３１１とノード３１２からの出力となっている。また、図４に示すノードの動作情報２０６からノード３１１とノード３１２の階層構造を調べると、ノード３１１はノード３０９の階層に含まれ、ノード３１２はノード３１０の階層に含まれている。また、ノード３０９とノード３１０は、動作条件が与えられているノード３０８の階層に含まれている。これらの情報から、レジスタｒ７とｒ８へのデータ入力は、ノード３０８の動作条件の分岐によって、いずれか一方のみが実行される。
【００９６】
図１０は、図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎについて、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【００９７】
図１０において、ノード３０１、３０２および３０３では、ＮＯＴ演算”！”が行われるものとする。また、ノードの入出力を表す変数は”ｎｏｄｅ３０１ｉｎ”、“ｎｏｄｅ３０１ｏｕｔ”のように表現されている。この表現方法は、以下の図１１および図１２に示す計算式でも同様とする。
【００９８】
さらに、図１０〜図１２において、ノードの出力がステートを超えて別のノードへの入力として使用される場合に、レジスタへの入力値計算式を用いて、その出力値がレジスタに入力される。
【００９９】
さらに、図１０〜図１２に示す事例では、”ｎｅｘｔ＿ｆｕｎｃ”という関数へのポインタが定義されており、このポインタを用いて、次のステートで実行されるステートの関数が登録されている。本実施形態で生成されたモデルを用いた回路シミュレーションでは、この”ｎｅｘｔ＿ｆｕｎｃ”の関数を実行することによって、順次シミュレーションするサイクルを進めることができる。
【０１００】
図１１は、図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎ＋１について、関数ＳＴＡＴＥ＿ｎ１＿ｆｕｎｃの中にまとめた記述例を示す図である。
【０１０１】
図１１において、ノード３０４では足し算が、ノード３０５では引き算が、ノード３０６と３０７ではＮＯＴ演算が行われるものとする。
【０１０２】
図１２は、図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎ＋２について、関数ＳＴＡＴＥ＿ｎ２＿ｆｕｎｃの中にまとめた記述例を示す図である。本実施形態において、ステート番号ｎ＋２では、レジスタｒ６で示される値によって、ノード３０９の動作を実行するか、またはノード３１０の動作を実行するかが選択される。
【０１０３】
図１２において、ノード３０９およびノード３１０の動作は、それぞれ個別の関数として表現されている。
【０１０４】
ノード３０９の関数ｆｕｎｃ＿ｎｏｄｅ３０９の中では、ノード３０９の階層に含まれるノード３１１の動作が実行される。ノード３１１の動作についても、また、関数としてｆｕｎｃ＿ｎｏｄｅ３１１と表現されている。ノード３１１で掛け算が行われるものとすると、ｆｕｎｃ＿ｎｏｄｅ３１１は図１２に示すようになる。
【０１０５】
また、ノード３１０の関数ｆｕｎｃ＿ｎｏｄｅ３１２の中では、ノード３１０の階層に含まれるノード３１２の動作が実行される。ノード３１２の動作も、また、関数としてｆｕｎｃ＿ｎｏｄｅ３１２と表現されている。ノード３１２で割り算が行われるものとすると、ｆｕｎｃ＿ｎｏｄｅ３１２は図１２に示すようになる。
【０１０６】
以上のように、図１０〜図１２で示されるＣ言語記述を用いることによって、スケジューリング後のＣＤＦＧにおける各ステートについて、レジスタへの入力値の計算を行うことが可能となる。
【０１０７】
また、スケジューリング結果として得られるステートの実行順序に従って、サイクルアキュレートモデル生成手段１１１によって生成された関数を実行することによって、ハードウェアのサイクルアキュレートレベルでのシミュレーションを行うことが可能となる。      
【０１０８】
さらに、ハードウェアへの割り付け処理を行うことによって、フリップフロップなどで実現されるハードウェア内のレジスタについて、値をサイクルアキュレートレベルで観測することも可能となる。
【０１０９】
次に、動作モデル生成部２１０によって、ＣＤＦＧに含まれるノードの動作情報２０６を用いて各ノードの動作モデルを生成し、ノードの接続情報２０７を用いて各ノードの動作モデルを計算する際の順序付けを行い、あるノードまたはレジスタの出力がメモリなどの記憶装置への入力として使用される場合に、記憶装置への入力値計算式生成部２１２によって、そのノードまたはレジスタの出力値を記憶装置に保存するための計算式を、そのノードまたはレジスタの出力結果を示すモデルを用いて生成する事例について詳細に説明する。
【０１１０】
図１３は、本実施形態のハードウェア検証用プログラミング言語モデル生成方法について、メモリなどの記憶装置への入力値を求めるための計算式を生成する処理手順を説明するためのＣＤＦＧの一例を示す図である。
【０１１１】
図１３において、ＣＤＦＧは、”Ｊ”という演算を行うノード１３０１と、”Ｗｒｉｔｅ”という演算を行うノード１３０２とを有する。
【０１１２】
これらのノードは、ステートの区切りとして、区切り１３０３と区切り１３０４とによって仕切られている。これらの区切りは、ハードウェアの動作クロックの区切りと一致している。
【０１１３】
図１４は、図１３の各ノードについて、図２のＣＤＦＧの各ノードの動作情報２０６を示す図である。
【０１１４】
図１４において、ノード１３０１は演算種類”Ｊ”を行う演算ノードであり、ノード１３０２はメモリにデータ書き込みを行うというノードである。また、ノード１３０１とノード１３０２は、共にステート番号”ｎ”にスケジューリングされている。
【０１１５】
図１５は、図１３の各ノードについて、図２のＣＤＦＧの各ノードの接続情報２０７を示す図である。
【０１１６】
図１５において、ノード１３０１は一つの出力と二つの入力を有しており、ノード１３０１の入力１および２にはそれぞれレジスタｒ９およびレジスタｒ１０の値が入力され、ノード１３０１からの出力値はノード１３０２に出力されている。また、ノード１３０２は出力がなく、二つの入力を有しており、一方の入力１から入力されるノード１３０１からの値はメモリに書き込まれるデータとして使用され、他方の入力２から入力されるレジスタｒ１１の値はメモリにデータを書き込むためのアドレス情報として使用されるものとする。
【０１１７】
図１６は、図１３の各ノードについて、図２のノードの動作モデル生成部２１０によって、ノードの動作情報２０６を用いて各ノードの動作モデルを生成した図である。
【０１１８】
図１６において、ノード１３０１の動作モデルは、入力値”１３０１ｉｎ１”と”１３０２ｉｎ２”とが演算の種類”Ｊ”で演算されるということを示している。また、ノード１３０２の動作モデルは、入力値”１３０２ｉｎ１”が”ＭＥＭ”によってメモリなどの記憶装置のアドレス”１３０２ｉｎ２”に書き込まれるということを示している。
【０１１９】
図１７は、図１６に示す計算式を、Ｃ言語の表現を用いて、図１３に示すステート番号ｎについて、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【０１２０】
図１７において、ノード１３０１では足し算が行われるものとする。ここでは、ノードの入出力を表す変数は”ｎｏｄｅ１３０１ｉｎ”、“ｎｏｄｅ１３０１ｏｕｔ”のように表現されている。さらに、ノードやレジスタの出力がメモリなどの記憶装置への入力として使用される場合に、メモリなどの記憶装置への入力値計算式を用いて、その出力値がメモリに保存される。
【０１２１】
”ＭＥＭ”は、メモリのモデルをＣ言語における変数の配列を用いて表現したものである。本実施形態では、メモリへの書き込み動作を変数の配列への代入操作で表現しているが、これは、メモリへの書き込みが単一の機能ブロックからのみ行われると仮定しているためである。
【０１２２】
ここで言う機能ブロックとは、回路内部で一連の動作を行う論理部分をまとめたものであり、図２に示すブロック分割部２０３によって生成される。この機能ブロックは、一つの回路中に複数存在させることが可能であり、各機能ブロックは並列に動作可能である。よって、複数の機能ブロックが存在し、それぞれの機能ブロックから同一のメモリなどの記憶装置への書き込みが行われる場合には、書き込み動作が同じクロックサイクル中に実行されることも考えられる。よって、このような複数の機能ブロックからの書き込み動作を調停する処理が必要となる場合がある。以下に、この調停処理について説明する。
【０１２３】
図１８は、メモリなどの記憶装置への書き込み動作において、調停が必要な場合の処理について説明するための構成例を示すブロック図である。
【０１２４】
図１８の事例では、三つの機能ブロック１８０１、１８０２および１８０３と、一つの調停処理部１８０４と、一つのメモリ１８０５とが設けられており、各機能ブロック１８０１〜１８０３からメモリ１８０５に対して書き込み動作が行われるものとする。
【０１２５】
機能ブロック１８０１からの書き込み動作は、その要求を調停回路（調停処理部１８０４）に伝えるための”ｒｅｑ１”と、その要求に対する返答”ａｃｋ１”を用いて行われる。これと同様に、機能ブロック１８０２および１８０３についても、それぞれ、”ｒｅｑ２”と“ａｃｋ２”、および“ｒｅｑ３”と“ａｃｋ３”を用いて書き込み動作が行われる。
【０１２６】
調停処理部１８０４によって書き込み動作が受理されると、書き込みを行わせる機能ブロックに対してのみ”ａｃｋ”が発行されるものとする。各機能ブロックでは、”ａｃｋ”が通知されたことを以って書き込み動作が完了したことが検知される。
【０１２７】
このように、調停が必要なメモリへの書き込み動作を、本実施形態の動作モデルを用いた記述として表現すると、図１７で示した計算式は図１９に示すように表現される。
【０１２８】
なお、図１９に示す計算式は、図１８に示す機能ブロック１８０１に含まれるものとする。
【０１２９】
図１９において、ノード１３０２の入力”１３０２ｉｎ２”にレジスタｒ１１からの値が入力され、ノード１３０１で入力値”１３０１ｉｎ１”と”１３０２ｉｎ２”とが足し算される。機能ブロック１８０１からの書き込み要求を調停回路に伝えるための”ｒｅｑ１”が”１”とされ、ノード１３０２で入力値”１３０２ｉｎ１”がメモリなどの記憶装置のアドレス”１３０２ｉｎ２”に書き込まれる。書き込み動作が完了すると、その書き込み要求に対する返答”ａｃｋ１”が”１”とされる。ポインタ”ｎｅｘｔ＿ｆｕｎｃ”によって登録されている関数が実行されることによって、順次シミュレーションするサイクルが進められる。
【０１３０】
図２０は、図１８の調停処理部１８０４で行われる処理の一例を示ず図である。
【０１３１】
図２０において、関数”ａｒｂｉｔｒａｔｉｏｎ”の中では、各機能ブロックからの書き込み要求のチェック（ｒｅｑ１〜３が”１”であるか否かのチェック）と、書き込み動作の排他制御（”ｉｆ”と”ｅｌｓｅ ｉｆ”による制御）、および書き込み完了の通知（ａｃｋ１〜３を”１”とする）が行われている。
【０１３２】
以上のように、図１７、図１９および図２０で示されるＣ言語記述を用いることによって、スケジューリング後のＣＤＦＧにおける各ステートについて、メモリなどの記憶装置への入力値の計算を行うことが可能となる。
【０１３３】
また、スケジューリング結果として得られるステートの実行順序に従って、サイクルアキュレートモデル生成手段１１１によって生成された関数を実行することによって、ハードウェアのサイクルアキュレートレベルでのシミュレーションを行うことが可能となる。      
【０１３４】
さらに、ハードウェアへの割り付け処理を行うことによって、メモリなどで実現されるハードウェア内の記憶装置について、値をサイクルアキュレートレベルで観測することも可能となる。
【０１３５】
以上により、本実施形態によれば、ＣＤＦＧ生成手段１０９によりハードウェアの動作記述１０７からＣＤＦＧを生成し、スケジューリング手段１１０によりＣＤＦＧをハードウェア仕様として要求される動作周波数でスケジューリングしてステート毎に割り振り、サイクルアキュレートモデル生成手段１１１によりステート毎にハードウェアの動作モデルを汎用プログラミング言語で表現した記述として生成する。ＣＤＦＧに含まれるノードの動作情報を用いて各ノードの動作モデルを生成し、ノードの接続情報を用いて各ノードの動作モデルを計算する際の順序付けを行うことにより、各ステートでシミュレーション可能なモデルを生成する。これによって、安価かつ高速にサイクルアキュレートレベルでハードウェアを検証可能な汎用プログラミング言語で記述された検証用モデルを、従来に比べて少ない計算量で生成することができる。
【０１３６】
なお、以上のように、本発明の好ましい実施形態を用いて本発明を例示してきたが、本発明は、この実施形態に限定して解釈されるべきものではない。本発明は、特許請求の範囲によってのみその範囲が解釈されるべきであることが理解される。当業者は、本発明の具体的な好ましい実施形態の記載から、本発明の記載および技術常識に基づいて等価な範囲を実施することができることが理解される。本明細書において引用した特許、特許出願および文献は、その内容自体が具体的に本明細書に記載されているのと同様にその内容が本明細書に対する参考として援用されるべきであることが理解される。
【産業上の利用可能性】
【０１３７】
本発明は、システムＬＳＩの開発・設計に用いられ、ハードウェアを検証可能な汎用プログラミング言語記述を自動生成するためのハードウェア検証用プログラミング言語モデル生成装置、これを用いたハードウェア検証用プログラミング言語モデル生成方法、コンピュータシステム、これを用いたハードウェアシミュレーション方法、この方法をコンピュータに実行させるための制御プログラムおよびその制御プログラムが格納されたコンピュータ読み出し可能な可読記憶媒体の分野において、ハードウェアのサイクルアキュレートレベルでの検証を、ＨＤＬシミュレータによる検証に比べて、高速にかつ安価に行うことが可能となる。また、ハードウェアとソフトウェアとの協調検証を行う場合でも、ハードウェアの検証を汎用プログラミング言語で記述されたモデルを用いて行うことができるため、言語の異なるデバッガを用いることなく、サイクルアキュレートレベルでの検証を効率良く行うことが可能である。
【０１３８】
また、本発明によれば、任意のクロックサイクルにおけるハードウェア内部のレジスタや記憶装置の状態を観測することによって、ハードウェアのデバッグ効率を向上させることができる。
【０１３９】
さらに、本発明によれば、コントロールデータフローグラフを用いてモデルを生成することによって、回路規模が大きくなった場合に、動作モデルを生成するための計算時間を大幅に削減することができる。
【０１４０】
以上のことから、本発明によれば、ＬＳＩ設計・開発におけるＴＡＴを短くすることができると共に、開発コストを削減することができる。
【図面の簡単な説明】
【０１４１】
【図１】本発明の実施形態に係るハードウェア検証用プログラミング言語モデル生成装置を実現するためのコンピュータシステムの構成例を示すブロック図である。
【図２】本実施形態におけるハードウェア検証用プログラミング言語モデル生成方法を説明するためのフロー図である。
【図３】本実施形態のハードウェア検証用プログラミング言語生成方法について、レジスタへの入力値を求めるための計算式を生成する処理手順を説明するためのＣＤＦＧの一例を示す図である。
【図４】図３の各ノードについて、図２のＣＤＦＧの各ノードの動作情報の一例を示す図である。
【図５】図３の各ノードについて、図２のＣＤＦＧの各ノードの接続情報の一例を示す図である。
【図６】図３の各ノードについて、図２の各ノードの動作モデル生成部によって、図４のノードの動作情報を用いて各ノードの動作モデルを生成する一例を示す図である。
【図７】図３に示すステートｎの区切り３１３を超えるときに、更新されるレジスタへの入力値の計算式の一例を、レジスタへの入力値計算式生成部によって、図５に示すノードの接続情報を用いて生成した図である。
【図８】図３に示すステートｎ＋１の区切り３１４を超えるときに、更新されるレジスタへの入力値の計算式の一例を、レジスタへの入力値計算式の生成部によって、図５に示すノードの接続情報を用いて生成した図である。
【図９】図３に示すステートｎ＋２の区切り３１５を超えるときに、更新されるレジスタへの入力値の計算式の一例を、レジスタへの入力値計算式の生成部によって、図５に示すノードの接続情報を用いて生成した図である。
【図１０】図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎについて、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【図１１】図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎ＋１について、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【図１２】図６〜図９に示す計算式を、Ｃ言語の表現を用いて、図３に示すステート番号ｎ＋２について、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【図１３】本実施形態のハードウェア検証用プログラミング言語モデル生成方法について、メモリなどの記憶装置への入力値を求めるための計算式を生成する処理手順を説明するためのＣＤＦＧの一例を示す図である。
【図１４】図１３の各ノードについて、図２のＣＤＦＧの各ノードの動作情報を示す図である。
【図１５】図１３の各ノードについて、図２のＣＤＦＧの各ノードの接続情報を示す図である。
【図１６】図１３の各ノードについて、図２のノードの動作モデル生成部によって、ノードの動作情報を用いて生成された各ノードの動作モデルを示す図である。
【図１７】図１６に示す計算式を、Ｃ言語の表現と用いて、図１３に示すステート番号ｎについて、関数ＳＴＡＴＥ＿ｎ＿ｆｕｎｃの中にまとめた記述例を示す図である。
【図１８】メモリなどの記憶装置への書き込み動作において、調停が必要な場合の処理について説明するための構成例を示すブロック図である。
【図１９】図１７の記述例を、メモリなどの記憶装置への書き込み動作において調停処理が必要とされる場合に変更した記述例を示す図である。
【図２０】図１８の調停処理部で行われる処理の一例を示す図である。
【符号の説明】
【０１４２】
１００  コンピューターシステム
１０１  モニタ装置
１０２  入力装置
１０３  計算機本体
１０４  ＣＰＵ
１０５  記憶装置
１０６  ＨＤＤ（ハードディスク）
１０７  ハードウェアの動作記述
１０８  高位合成手段（プログラム）
１０９  ＣＤＦＧ生成手段
１１０  スケジューリング手段
１１１  サイクルアキュレートモデル生成手段
２０２  構文解析・字句解析部
２０３  ブロック分割部
２０４  ＣＤＦＧ生成部
２０５  スケジューリング部
２０６  ＣＤＦＧの各ノードの動作情報
２０７  ＣＤＦＧの各ノードの接続情報
２０８  サイクルアキュレートモデル生成部
２０９  サイクルアキュレートモデルの記述
２１０  動作モデル生成部
２１１  レジスタへの入力値計算式生成部
２１２  記憶装置への入力値計算式生成部
【図１】
2006139729.tif 000003
【図２】
2006139729.tif 000004
【図３】
2006139729.tif 000005
【図４】
2006139729.tif 000006
【図５】
2006139729.tif 000007
【図６】
2006139729.tif 000008
【図７】
2006139729.tif 000009
【図８】
2006139729.tif 000010
【図９】
2006139729.tif 000011
【図１０】
2006139729.tif 000012
【図１１】
2006139729.tif 000013
【図１２】
2006139729.tif 000014
【図１３】
2006139729.tif 000015
【図１４】
2006139729.tif 000016
【図１５】
2006139729.tif 000017
【図１６】
2006139729.tif 000018
【図１７】
2006139729.tif 000019
【図１８】
2006139729.tif 000020
【図１９】
2006139729.tif 000021
【図２０】
2006139729.tif 000022