(57)【要約】【課題】  シミュレーション速度を高速化する。ソースコードの可読性、保守性を上げ、設計期間を短縮する。設計段階での誤りをシミュレーション以外の手段で検査できるようにする。【解決手段】  ＲＴＬ記述からビット幅指定をなくすことにより、シミュレーション速度を上げ、可読性、保守性を上げる。ビット幅指定のないＲＴＬからビット幅指定のあるＲＴＬへの自動変換手段を提供し、ビット幅決定の工程を自動化し、設計期間を短縮する。さらに既存の論理合成ツール、シミュレータ上で動作できるようにする。ビット幅を人手で指定する手段を提供し、自動で推定したビット幅と照合して矛盾があれば警告する手段を提供する。【選択図】  図２
2006190085.tif 000002
【特許請求の範囲】
【請求項１】
デジタル回路のモデリング方法であって、
デジタル回路のソースコードを、ビット幅未確定の変数を含んだレジスタ転送レベルで記述することを特徴とするデジタル回路のモデリング方法。
【請求項２】
前記ビット幅未確定の変数はビット幅を同一幅に揃えてシミュレーションを行うようにした請求項１記載のデジタル回路のモデリング方法。
【請求項３】
デジタル回路の設計方法であって、
デジタル回路のソースコードを、ビット幅未確定の変数を含んだレジスタ転送レベルで記述する状態遷移規則定義ステップと、
前記ソースコードをコンパイルした後、回路動作を確認するシミュレーションを行うシミュレーションステップと、
前記シミュレーションステップを経たソースコードに基づいて、前記複数の変数のビット幅を所望の値にそれぞれ決定し、該ビット幅が決定された前記変数を有するソースコードを生成するビット幅定義ステップと、
前記ビット幅が決定された変数を有するソースコードに基づいて、論理合成を行い、ゲートレベルのデジタル回路に変換する論理合成ステップと
を具えたことを特徴とするデジタル回路の設計方法。
【請求項４】
前記ビット幅未確定の変数はビット幅を同一幅に揃えてシミュレーションを行うようにした請求項３記載のデジタル回路の設計方法。
【請求項５】
前記ビット幅定義ステップは、
ビット幅未確定の変数を含んだ前記レジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、
前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、
入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、
前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、
前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップと、
を含むことを特徴とする請求項３記載のデジタル回路の設計方法。
【請求項６】
前記ビット幅定義ステップにおいて決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証するステップ
をさらに具えたことを特徴とする請求項３ないし５のいずれかに記載のデジタル回路の設計方法。
【請求項７】
ビット幅決定方法であって、
ビット幅未確定の変数を含んだレジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、
前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、
入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、
前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、
前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップと
を具えたことを特徴とするビット幅決定方法。
【請求項８】
前記ビット幅定義手段において決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証する手段
を具えたことを特徴とする請求項７に記載のビット幅決定方法。
【請求項９】
コンピュータにより、請求項８記載のビット幅決定方法を実行可能なことを特徴とするプログラム。
【請求項１０】
コンピュータにより実行される請求項９記載のプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
【請求項１１】
論理合成方法であって、
ビット幅未定義の変数を含んだレジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、
前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、
入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、
前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、
前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップと、
前記ビット幅が決定された変数を有するソースコードに基づいて、論理合成を行い、ゲートレベルのデジタル回路に変換する論理合成ステップと
を具えたことを特徴とする論理合成方法。
【請求項１２】
コンピュータにより、請求項１１記載の論理合成方法を実行可能なことを特徴とするプログラム。
【請求項１３】
コンピュータにより実行される請求項１２記載のプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
【請求項１４】
ビット幅変換装置であって、
ビット幅未定義の変数を含んだレジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析手段と、
前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出手段と、
入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索手段と、
前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当て手段と、
前記構文解析の解析結果及び前記ビット幅割り当て手段から得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力手段と
を具えたことを特徴とするビット幅変換装置。
【請求項１５】
前記ビット幅定義手段において決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証する手段
を具えたことを特徴とする請求項１４に記載のビット幅変換装置。
【請求項１６】
請求項１４または１５に記載のビット幅変換装置を具えたことを特徴とする論理合成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デジタル回路のモデリング方法及び設計方法に関し、特に、レジスタトランスファレベル（ＲＴＬ：  Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ）での記述、論理合成、検証する方法に関する。
【背景技術】
【０００２】
デジタル回路のシミュレータおよび論理合成装置の入力としてＲＴＬ記述が広く用いられている。ＲＴＬ記述ができるものとして、ハードウェア記述言語として知られているＶＨＤＬ、およびＶｅｒｉｌｏｇ−ＨＤＬ、およびＣ言語ベースのＳｙｓｔｅｍＣなどが広く使用されている。しかし、ハードウェア記述言語の言語仕様上、あるいは論理合成装置の制約により、全ての変数にはビット幅があらかじめ割り当てられている必要がある。
【０００３】
図１１は、従来の設計例のフローチャートを示す。
図１１の設計フローのステップのうち、ステップ１０２とステップ１０３は回路設計の中心をなす。
【０００４】
この従来の設計フローでは、ステップ１０３は人手で行う必要がある。状態遷移規則とビット幅の定義に矛盾が生じないよう人間が考えながら慎重に行う必要があり、そのためステップ１０２とステップ１０３との間にやりとりが発生する。また、この過程で誤りも発生しやすい。また、計算の途中結果を保持する変数を定義する必要があるが、この場合もその途中結果がどの範囲の値をとりうるか、人間が計算して必要最小限のビット幅を割り当てなければならない。ビット幅の定義が実際に必要とされるより小さすぎると予期せぬ動作が発生する。しかも、回路シミュレータも論理合成装置もこのような誤りを警告しない。
【０００５】
また、回路シミュレータは標準で４値論理を扱う。すなわち、０、１、Ｘ（不定）、Ｚ（ハイ・インピーダンス）である。しかしながら、特に設計初期の段階で４値論理が必要な部分はそれほど多くない。４値論理の計算は通常の演算の２倍以上の時間がかかる。また、ビット幅を限定するのにも演算処理が必要である。このため、ＲＴＬ記述のシミュレーションはハードウェアの動作を完全に模擬できる利点があるが、必要以上の演算処理により時間がかかるという欠点もある。
【０００６】
そこで、ビット幅の情報を人手で与えるのを最小限にして、回路の論理的構造を解析してビット幅を自動的に計算する方法がある（例えば、特許文献１）。
【０００７】
また、動作合成の直前にビット幅を確定する方法もある（例えば、特許文献２）。特許文献２では、ＲＴＬより抽象度の高い動作記述でＣ言語を使ってハードウェアを記述することにより、Ｃ言語のビット幅の仕様（１６、３２あるいは６４ビット）がそのままハードウェアに反映されてしまい、ビットが冗長になるという問題を指摘し、Ｃ＋＋を使って冗長のないビット幅を使うことができると述べている。
【０００８】
【特許文献１】特開平５−５４０９８号公報
【特許文献２】特開２００３−２１６６７８号公報（第１３頁、図９、図１０参照）
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかし、特許文献１の方法によれば、入力のビット幅、記憶素子のビット幅、およびビット幅計算ライブラリを必要とする。特許文献１の方法は変数のビット幅から推定する方法であり、変数の定義域を厳密に解析する方法ではないため、ｎビットの変数でも２ｎ種類全ての場合をとらない変数の場合、推定結果に無駄を生じる可能性がある。
【００１０】
また、特許文献２では、冗長のないビット幅を自動的に決定する手段を提供していない。
【００１１】
そこで、本発明の目的は、ＲＴＬ記述を簡略化し、かつシミュレーション速度を高速化することが可能な、デジタル回路のモデリング方法、ビット幅決定方法、デジタル回路の設計装置、並びにビット幅変換装置を提供することにある。
【００１２】
また、本発明の他の目的は、ビット幅決定にかかる工程を自動化し、設計期間を短縮することが可能な、デジタル回路のモデリング方法及び設計方法を提供することにある。
【課題を解決するための手段】
【００１３】
本発明は、デジタル回路のモデリング方法であって、デジタル回路のソースコードを、ビット幅未定義の変数を含んだレジスタ転送レベルで記述することを特徴とする。
【００１４】
前記ビット幅未確定の変数はビット幅を同一幅に揃えてシミュレーションを行うようにしてもよい。
【００１５】
本発明は、デジタル回路の設計方法であって、デジタル回路のソースコードを、ビット幅未定義の変数を含んだレジスタ転送レベルで記述する状態遷移規則定義ステップと、前記ソースコードをコンパイルした後、回路動作を確認するシミュレーションを行うシミュレーションステップと、前記シミュレーションステップを経たソースコードに基づいて、前記複数の変数のビット幅を所望の値にそれぞれ決定し、該ビット幅が決定された前記変数を有するソースコードを生成するビット幅定義ステップと、前記ビット幅が決定された変数を有するソースコードに基づいて、論理合成を行い、ゲートレベルのデジタル回路に変換する論理合成ステップとを具えたことを特徴とする。
【００１６】
前記状態遷移規則定義ステップにおいて、前記変数のうち、真及び偽の２値論理をとる変数はそのビット幅を１ビットとし、該変数以外の変数はそのビット幅を多ビットとしてもよい。
【００１７】
前記ビット幅定義ステップは、ビット幅未定義の変数を含んだ前記レジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップとを含んでもよい。
【００１８】
前記ビット幅定義ステップにおいて決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証するステップを具えてもよい。
【００１９】
本発明は、ビット幅決定方法であって、ビット幅未定義の変数を含んだＲＴＬで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップとを具えたことを特徴とする。
【００２０】
前記ビット幅定義手段において決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証する手段を具えてもよい。
【００２１】
本発明は、コンピュータにより、上記記載のビット幅決定方法を実行可能なプログラムを提供する。
【００２２】
本発明は、コンピュータにより実行される上記記載のプログラムを記録したコンピュータ読み取り可能な記録媒体を提供する。
【００２３】
本発明は、論理合成方法であって、ビット幅未定義の変数を含んだレジスタ転送レベルで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析ステップと、前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出ステップと、入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索ステップと、前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当てステップと、前記構文解析の解析結果及び前記ビット幅割り当てステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力ステップと、前記ビット幅が決定された変数を有するソースコードに基づいて、論理合成を行い、ゲートレベルのデジタル回路に変換する論理合成ステップとを具えたことを特徴とする。
【００２４】
本発明は、コンピュータにより、上記記載の論理合成方法を実行可能なプログラムを提供する。
【００２５】
本発明は、コンピュータにより実行される上記記載のプログラムを記録したコンピュータ読み取り可能な記録媒体を提供する。
【００２６】
本発明は、ビット幅変換装置であって、ビット幅未定義の変数を含んだＲＴＬで記述されたデジタル回路のソースコードに対して、構文解析を行う構文解析手段と、前記構文解析の解析結果に基づいて、前記ソースコード内にあるレジスタの初期状態と、前記ソースコードの状態遷移関数とを抽出する初期状態及び状態遷移関数抽出手段と、入力信号の状態及び前記初期状態に基づいて、前記状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う状態探索手段と、前記像計算の結果に基づいて、前記変数のビット幅を所望の値に決定するビット幅割り当て手段と、前記構文解析の解析結果及び前記ビット幅割り当て手段から得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成するソースコード出力手段とを具えたことを特徴とする。
【００２７】
前記ビット幅定義手段において決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、該比較により両者の値が一致しているかどうかを検証する手段を具えてもよい。
【００２８】
本発明は、上記記載のビット幅変換装置を具えた論理合成装置を提供する。
【発明の効果】
【００２９】
本発明によれば、状態遷移規則を定義し、シミュレーションステップを経たソースコードに基づいて、複数の変数のビット幅を所望の値にそれぞれ決定し、該ビット幅が決定された変数を有するソースコードを生成し、ビット幅が決定された変数を有するソースコードに基づいて論理合成を行ってゲートレベルのデジタル回路に変換するようにしたので、ビット幅を指定したＲＴＬ記述に比べて簡便な記述とすることができ、また、抽象度が高いことから、シミュレーション速度も速くすることができ、さらに、ビット幅を指定した場合と同等の数値厳密性を保つことができ、これにより、ソースコードの可読性、保守性を上げ、設計期間を短縮でき、設計段階での誤りをシミュレーション以外の手法で検査することができる。
【００３０】
また、本発明によれば、各変数のビット幅を指定しないＲＴＬを定義し、ビット幅を指定しないＲＴＬ記述からビット幅を指定した従来のＲＴＬ記述を生成する処理を適用するようにしたので、ＲＴＬよりさらに上流側の処理で抽象度の高い動作記述で変数のビット幅を指定する処理を不要とすることができる。
【００３１】
さらに、本発明によれば、入力のビット幅を変更しなければならない場合においてもそれに合わせて全ての変数のビット幅が自動的に最適な値に調整することができ、必要な情報は入力の状態集合および初期状態集合のみで、記憶素子のビット幅もビット幅計算ライブラリも不要とすることができる。
【００３２】
さらにまた、本発明によれば、記憶素子のビット幅をあらかじめ指定した場合、状態遷移規則から推定されるビット幅と矛盾がないか検査する機能も提供でき、ビット幅の推定は変数の定義域を厳密に解析することによって行うことから、ビット幅のみを指定した推定方法に比べて冗長度の小さいビット幅を推定することができる。
【発明を実施するための最良の形態】
【００３３】
以下、図面を参照して、本発明の実施の形態を詳細に説明する。  
［第１の例］
本発明の第１の実施の形態を、図１〜図４に基づいて説明する。  
（構成）
図１は、本発明に係る、ビット幅変換装置１の構成を示す。
【００３４】
本装置１は、ビット幅定義部４と、論理合成部５と、検証部６とを備える。なお、その他の構成として、装置全体の統括的な制御を行うＣＰＵ１０と、主制御プログラム等を記憶したＲＯＭ１１と、演算処理や本発明に係る制御プログラム等を記憶したＲＡＭ１２、データ入出力部１３等も備えている。
【００３５】
ビット幅定義部４は、シミュレーションステップを経たビット幅未定義の変数を含むソースコードに基づいて、ビット幅未定義の変数のビット幅を所望の値にそれぞれ決定し、該ビット幅が決定された変数を有するソースコードを生成する機能をもつ。
【００３６】
論理合成部５は、ビット幅が決定された変数を有するソースコードに基づいて、論理合成を行い、ゲートレベルのデジタル回路に変換する機能をもつ。
【００３７】
検証部６は、ビット幅定義部４において決定されたビット幅の値と、あらかじめ指定されたビット幅の値とを比較し、それらが一致しているかどうかを検証する。なお、この検証部６は、システム構成の必要性に応じて任意に装備される。
【００３８】
（動作）
ここでは、デジタル回路のモデリング方法について説明する。
なお、本例では、Ｃ＋＋言語を使ってＲＴＬ記述を行うが、本発明は使用言語を限定するものではない。
【００３９】
図２は、本発明に係るデジタル回路のモデリング方法を示すフローチャートである。
まず、状態遷移規則定義２０２の工程では、デジタル回路のソースコードを、ビット幅未定義の変数を含んだＲＴＬ（Ｒｅｇｉｓｔｅｒ  Ｔｒａｎｓｆｅｒ  Ｌｅｖｅｌ、レジスタ転送レベル）で記述する。この工程では、従来の方法で見られた変数のビット幅定義２０４と並行して行う必要は無く、ビット幅を意識する必要も無い。ビット幅を意識しない設計は次の通りである。
【００４０】
ここで、ステップ２０２の状態遷移規則定義の工程において、変数のうち、真及び偽の２値論理をとる変数はそのビット幅を１ビットとし、それ以外の変数はそのビット幅を多ビットとする。
【００４１】
例えば、Ｃ＋＋でＲＴＬを記述する場合、変数を宣言するにあたり、明らかに「真」か「偽」の２値しかとらない変数はｂｏｏｌ型として宣言し、それ以外はｉｎｔ型で宣言する。これにより、ｉｎｔ型で宣言した変数はＣ＋＋コンパイラの仕様にも依存するが、多くのコンパイラでは３２ビット確保される。
【００４２】
Ｃ＋＋でＲＴＬを記述する際、ｉｎｔ型で宣言される変数のビット幅を意識する必要のある場合はそれほど多くなく、ＲＴＬで状態遷移規則を記述する際、ほとんどの場合ビット幅無制限という仮定で設計を行うことができる。
【００４３】
３２ビットを超えそうな場合は６４ビット型（Ｍｉｃｒｏｓｏｆｔ社のＶｉｓｕａｌ  Ｃ＋＋を使用する場合、＿＿ｉｎｔ６４型）を使用する。ｉｎｔ型を使うことにより、シミュレーションに使用するＣＰＵに最も適したビット幅で計算されるため、高速にシミュレーションすることができる。
【００４４】
ステップ２０３のシミュレーションの工程では、ソースコードをコンパイルした後、回路動作を確認するシミュレーションを行う。例えば、Ｃ＋＋で記述された回路は通常のＣ＋＋コンパイラでコンパイルすることにより実行イメージを作成し、ビット幅を確定しないでシミュレーションを実行する。
【００４５】
シミュレーションを行い、正しい動作が得られたならば、本装置１を使用してステップ２０４の変数のビット幅定義の工程を実行する。
【００４６】
シミュレーションステップを経たソースコードに基づいて、複数の変数のビット幅を所望の値にそれぞれ決定し、ビット幅が決定された変数を備えるソースコードを生成する。例えば、Ｃ＋＋でビット幅未確定の状態で記述されたソースコードを入力し、ビット幅が全て指定されたＶｅｒｉｌｏｇで記述されたＲＴＬのソースコードを出力する。
【００４７】
その後は、ステップ２０５の論理合成の工程を経て、ゲートレベルの回路に変換され、設計を完了する。
【００４８】
なお、レジスタ転送レベル（ＲＴＬ）とは、回路を乗算器、算術論理ユニット、レジスタファイルといった機能ユニット間の同期転送として回路を記述する抽象度レベルのことをいう。
【００４９】
ゲートレベルとは、回路をＡＮＤ，ＯＲ，ＮＯＴあるいはフリップフロップの組み合わせで記述する抽象度レベルのことであり、回路図と同等である。
【００５０】
＜具体例＞
次に、デジタル回路のモデリング方法の具体例について説明する。
以下、従来の処理と比較して説明していく。
【００５１】
具体例として、無限インパルス応答（ＩＩＲ）のデジタルフィルタの設計例について説明する。なお、言語は、ＳｙｓｔｅｍＣを使用した。
【００５２】
図３は、前述した従来技術の図１１のフローチャートに対応したプログラム１００の１例を示すものであり、言語としてＳｙｓｔｅｍＣを使用して記述した無限インパルス応答（ＩＩＲ）のデジタルフィルタの設計を比較して示す例である。
【００５３】
図３のプログラムにおいて、図１１のステップ１０２に相当する部分は、４２０〜４２５行目の文である。
【００５４】
ここで入力信号ｉｎおよび内部状態を表す信号ｚｒｅｇに演算処理あるいは写像を施し、得られた値を次の状態を表す値としてｚｒｅｇに代入する。この文は４１１行目によって、クロック信号ｃｌｋの立ち上がりエッジで駆動されることが指定される。よって、クロックｃｌｋの立ち上がりエッジの前後でのｚｒｅｇの変化を表しているので、これが状態遷移規則に当たる。
【００５５】
図１１のステップ１０３に相当する部分は、４０５〜４０７行目の文であり、ｓｃ＿ｕｉｎｔ＜１０＞あるいはｓｃ＿ｕｉｎｔ＜２０＞と宣言されている部分である。
【００５６】
状態を表す変数ｚｒｅｇがとりうる値は、４２０〜４２５行目の文を見て設計者が注意深く追跡した結果、０〜２２０−１までの値をとりうることがわかる。
【００５７】
そこで、２０ビットあればこれらの値を表現するのに必要十分であるという判断を下し、２０ビット符号なしと宣言している。それから出力である変数ｏｕｔはｚｒｅｇを１０ビット右シフトしたものであるから、１０ビット符号なしでよいとわかる。
【００５８】
もし、４２０〜４２５行目の文を書き換えた場合、設計者は再度ｚｒｅｇの取りうる範囲を評価し、ビット幅を変更する必要あると判断した場合は関連する４０５〜４０７行目の文におけるビット幅を修正する。
【００５９】
このように、図１１のステップ１０２とステップ１０３とは、互いにフィードバックがある。
【００６０】
次に、図４は、本発明に係る図２のフローチャートに対応したプログラム２００の１例を示すものであり、言語としてＳｙｓｔｅｍＣを使用して記述した無限インパルス応答（ＩＩＲ）のデジタルフィルタの設計例を示す。
【００６１】
前述した従来の図３のプログラム例では変数ｏｕｔおよびｚｒｅｇがビット幅および符号を指定して宣言されているのに対して、本発明に係る図４のプログラム例では全てｉｎｔ型で宣言する。
【００６２】
図４のプログラムにおいて、図２のステップ２０２に相当する工程は、５２０〜５２５行目の文であり、形式的には、ステップ４２０〜４２５行目と変わりは無い。
【００６３】
しかし、従来の図３のプログラムでは、状態遷移規則である４２０〜４２５行目の文を修正した場合、４０５〜４０７行目の文における変数のビット幅を修正する必要が生じることがあるのに対して、本発明の図４のプログラムでは、５２０〜５２５行目の文を修正するだけでよい。
【００６４】
従来の図３のプログラムでは、４０５〜４０７行目の文における修正を忘れると予期せぬ動作となるのに対して、本発明の図４のプログラムでは、その危険性がない。
【００６５】
ただし、従来の図３のプログラムも、本発明の図４のプログラムも設計しようとするデジタル回路を表現したものであると同時にＣ＋＋のプログラムであるので既存のＣ＋＋コンパイラを使ってコンパイルし、コンピュータ上で実行することができる。
【００６６】
このコンパイルされたＣ＋＋プログラムを実行する工程が、従来の図１１のステップ１０４あるいは本発明の図２のステップ２０３に相当するシミュレーションである。
【００６７】
本発明の図４のプログラムには、ビット幅の情報が入っていないが、ビット幅を指定した従来の図３のプログラムと同一のシミュレーション結果が得られる。
【００６８】
シミュレーション結果を解析し、予期していた動作となっていれば、従来技術では、図１１のステップ１０５の論理合成の工程にかける。これは、市販の論理合成装置を使ってゲートレベルに変換する。実際のＬＳＩになるまでにはさらにレイアウトなどいくつかの工程があるが、本発明とは関係ないので省略する。
【００６９】
図１１のステップ１０４の終了時点では正しく動作する図３のソースコードがあり、全ての変数にビット幅が定義されている。このようなソースコードを処理できる論理合成装置は市販されている。
【００７０】
一方、図２のステップ２０３の終了時点では正しく動作する図４のソースコードがあるが、ｏｕｔおよびｚｒｅｇは確定していない。既存の論理合成装置は処理を拒絶するか、Ｃ＋＋コンパイラと同一解釈をして多くの場合ｉｎｔ型を符号付３２ビットと解釈する。しかし、ｚｒｅｇは２０ビットあればよいので１２ビット分無駄な回路が生成される。
【００７１】
図２のステップ２０４は、この問題を解決するために存在する。すなわち、ステップ２０４では、本発明の図４のプログラムで表されたソースコードを、従来の図３のプログラムの形式に自動変換する。その際、各変数を表現できる必要十分なビット幅を自動的に決定する。ステップ２０４の入力および出力は本例ではＳｙｓｔｅｍＣであるが、Ｖｅｒｉｌｏｇ−ＨＤＬなど別の言語で出力してもよい。これにより、既存の論理合成装置で論理合成できる。
【００７２】
なお、５０５行目にある入力変数ｉｎにはビット幅を指定する必要がある。これはｉｎがどの変数にも依存していないため、ｉｎのとりうる範囲を推定できないためである。但し、ｉｎが他のモジュールの出力に接続されている場合で、そのモジュールの出力の変数の取りうる範囲が推定できるのであれば、ｉｎの宣言にビット幅を指定する必要は無い。
【００７３】
［第２の例］
本発明の第２の実施の形態を、図５〜図１０に基づいて説明する。なお、前述した第１の例と同一部分については、その説明を省略し、同一符号を付す。
【００７４】
（構成）
図５は、ビット幅変換装置５０の構成例を示す。このビット幅変換装置５０は、前述した第１の例の図１に示したデジタル回路の設計装置１内のビット幅定義部４の処理に対応するものである。
【００７５】
ビット幅変換装置５０は、ビット幅未確定のソースコード５１が入力されるソースコード入力部５２と、構文解析部５３と、状態遷移規則抽出部５４と、状態検索部５５と、ビット幅割り当て部５６と、ビット幅の確定したソースコード６２を出力するソースコード出力部５７と、解析木記憶部５８と、記号表記憶部５９と、状態遷移関数記憶部６０と、既到達状態集合記憶部６１とからなる。
【００７６】
（動作）
次に、本装置５０の動作について説明する。
ここでは、ビット幅決定方法について説明する。
【００７７】
図６は、ビット幅を指定しないＲＴＬ記述からビット幅を指定したＲＴＬ記述に変換する処理例を示すフローチャートである。
【００７８】
この図６のフローチャートは、前述した図２のフローチャートにおけるステップ２０４の詳細を示すものである。
【００７９】
このビット幅を指定しないＲＴＬ記述からビット幅を指定したＲＴＬ記述に変換する理由は、ビット幅を指定しないＲＴＬを論理合成できる論理合成装置は存在しないので、論理合成する際にはビット幅を指定したＲＴＬ記述を生成する図２のステップ２０４の工程が必要となるからである。
【００８０】
以下、図６を用いて、ビット幅を指定しないＲＴＬからビット幅を指定したＲＴＬを生成する処理において、ビット幅推定の手順について説明する。
【００８１】
ビット幅推定のために必要なものは、ステップ３０２のＣ＋＋ソースコードである。
【００８２】
まず、ステップ３０３の工程では、ビット幅未定義の変数を含んだステップ３０２に示すＲＴＬで記述されたデジタル回路のソースコードに対して、構文解析を行う。
【００８３】
ステップ３０４の初期状態及び状態遷移関数を抽出する工程では、構文解析の解析結果に基づいて、ソースコード内にあるレジスタの初期状態と、ソースコードの状態遷移関数とを抽出する。
【００８４】
ここで、抽出された状態遷移関数は、現在の状態と入力の状態の直積集合から１クロック先の状態への写像を表現する。また、リセット直後のレジスタの初期状態は、ソースコード中にあるリセット信号を指定して、リセット時の代入文から求める。リセット状態が定義されていなければ定数を代入している代入文から求める。定数を代入している代入文が存在しない場合は０を初期状態とする。
【００８５】
ステップ３０６の状態探索の工程では、入力信号の状態及び初期状態に基づいて、状態遷移関数による像計算を状態集合が変化しなくなるまで繰り返し行う。
【００８６】
すなわち、ステップ３０４で得られた初期状態集合定義を最初の既到達状態集合として、既到達状態集合を状態遷移関数で写像した像集合を既到達状態集合に追加することを繰り返し、最終的には既到達状態が変化しなくなるまで続ける。
【００８７】
ステップ３０７の工程では、ステップ３０６の状態探索の像計算の結果、全ての変数のとりうる状態が数値として得られるので、この数値を表現できる必要最小限なビット幅を割り当てる。
【００８８】
最後に、ステップ３０８のビット幅付きＲＴＬソースコードを出力する工程では、構文解析の解析結果及びビット幅割り当てのステップから得られたビット幅の情報に基づいて、ビット幅が決定された変数を有するソースコードを生成する。
【００８９】
例えば、ステップ３０３にてＣ＋＋ソースコードを構文解析した結果と、ステップ３０７にて割り当てたビット幅の情報とを結合し、Ｃ＋＋ソースコードとして出力する。
論理合成を行う場合は、ＶＨＤＬソースコードやＶｅｒｉｌｏｇソースコードとして出力してもよい。
【００９０】
ここで、レジスタに関しては仕様上ビット幅が確定できることも少なくない。この場合については状態集合をあらかじめ与えることができるので状態探索にかかる処理を省略することができ、より高速に全変数のビット幅を推定することができる。
【００９１】
また、この場合でも状態探索を行い、あらかじめ指定されたビット幅と比較し、一致していなければ警告を出すという使い方をすれば、前述した第１の例の検証部６に相当する検証装置として構成することもできる。
【００９２】
また、本発明により出力されるデータを、前述した第１の例の論理合成部５に相当する論理合成装置に取り込むことができる。
【００９３】
すなわち、図２のステップ２０４の変数のビット幅定義の工程に対応する本発明にかかる図６のフローチャートで処理されて出力されるデータを、図２のフローチャートにおけるステップ２０５の論理合成の工程に取り込むと、ビット幅が確定していないＲＴＬのソースコードを入力できるように、従来の論理合成装置の仕様を拡張できる。これにより、状態探索と最適化を同時に行うことができ、本例で示したように、一旦ビット幅を確定してから論理合成する従来の方法に比べて、短時間で論理合成を完了することができる。
【００９４】
＜具体例＞
次に、ビット幅決定方法の具体例について説明する。
図７は、ビット幅が未確定の変数を含むソースコードを、ビット幅が全て確定したソースコードに変換する処理のフローチャートを示す。
【００９５】
設計者は、図７に示す、ステップ５０１のビット幅が未確定の変数を含むソースコードを作成し、シミュレーションを行ってそれが期待通り動作することを確認する（図２のステップ２０２、２０３参照）。
【００９６】
図７のステップ５０２の構文解析処理では、ステップ２０２、２０３を経て作成されたステップ５０１のソースコードを構文解析し、解析木と記号表を生成し、それぞれ図５の５８、５９に格納する。
【００９７】
例えば、図４のプログラムの５２０〜５２５行目の文を構文解析した解析木は、図８で示されたような構造になる。また、同じく図４のソースコードを構文解析して生成された記号表は、図９のような構造になる。
【００９８】
図７のステップ５０３のクロックエッジ駆動関数抽出処理では、図５の解析木記憶部５８に格納された解析木をたどり、図５の記号表記憶部５９に格納された記号表に登録された関数のなかからクロックエッジで駆動される関数を検索する。
【００９９】
図８、図９の例を参照すると、まず大域的記号表７０１の中から種類が「モジュール」として登録された項目７０４が抽出される。
【０１００】
項目７０４に所属する局所的記号表７０２がさらに探索され、種類が「関数」として登録されている項目７０６が抽出される。
【０１０１】
項目７０６の名前ｃｌｏｃｋ＿ｅｖｅｎｔを持つ項目を解析木の中の図４のプログラムの５１０〜５１１行目の文に相当する部分が探索され、ｃｌｏｃｋ＿ｅｖｅｎｔがそこに登録されていることがわかる。
【０１０２】
さらに、図４のプログラムの１１行目の記述により、クロック変数ｃｌｋの立ち上がりエッジにて駆動されていることがわかるので、項目７０６は、クロックエッジ駆動関数と判定される。
【０１０３】
図７のステップ５０４の代入文抽出処理では、ステップ５０３のクロックエッジ抽出処理で、クロックエッジ駆動関数と判定された全ての関数を解析木から探索し、代入文を全て抽出する。
【０１０４】
図７のステップ５０５の状態遷移規則抽出処理では、ソースコードの中から状態遷移規則を表す部分を解析木の中から抽出し、状態遷移関数として、次のステップ５０９の状態探索処理に適したデータ構造に変換し、図５の状態遷移関数記憶部６０に格納する。
【０１０５】
図７のステップ５０６の状態変数抽出処理では、各モジュールに所属する局所的記号表の中から種類が「変数」として登録されたものを抽出する。
【０１０６】
ここで、ステップ５０６の状態変数抽出処理の動作を、図８および図９の例で説明する。
【０１０７】
まず、大域的記号表７０１の中から種類が「モジュール」として登録された変数名ＩＩＲＦｉｌｔｅｒの項目７０４を選択し、それに所属する局所的記号表７０２をさらに検索する。項目７０２の中から種類が「変数」として登録されたｚｒｅｇの項目７０５があるのでそれを抽出する。次に、ステップ５０４で抽出された代入文を解析し、左辺にｚｒｅｇが現れるかどうかを解析する。図４のプログラムの５２１、５２４行目の文、それに対応する解析木６０２、６０３は左辺にｚｒｅｇが現れているのでｚｒｅｇは状態変数と判定し、記号表の項目７０５の種類を「変数」から「状態変数」に書き換える。状態変数は、最終的には記憶素子に割り当てられる変数である。
【０１０８】
図７のステップ５０７の初期状態抽出処理では、ステップ５０７で抽出された全ての状態変数に対してステップ５０４の代入文抽出処理で抽出された代入文を検査し、定数が代入されていればその定数を初期状態集合として図５の既到達状態集合記憶部６１に格納する。複数の定数代入があれば全て初期状態集合として図５の既到達状態集合記憶部６１に格納する。また「リセット信号」として指定された信号が存在すればそれによって代入される文を探索し、その右辺値の状態集合を初期状態集合とする。ただし、右辺値の状態集合が未知であれば警告を出して０を初期状態集合に加える。
【０１０９】
「リセット信号」の指定は＃ｐｒａｇｍａ指令によって指定する。５０４行目にその例が示されている。定数代入と「リセット信号」による代入のいずれも存在しなければ警告を出して０だけを初期状態集合として図５の既到達状態集合記憶部６１に加える。図４の例では、５２１行目が定数代入と「リセット信号」による代入の両方を満たしているので０が初期状態集合になる。
【０１１０】
図７のステップ５０８の依存関係解析処理では、ステップ５０４の代入文抽出処理で抽出された代入文を全て解析し、依存関係グラフとして格納する。
【０１１１】
図１０は、図４のプログラムにおけるソースコードに現れた変数の依存関係グラフを示す。
【０１１２】
左辺に現れる変数は右辺に表れる全ての変数に依存するので、その依存関係を依存関係枝として表し、さらに、代入文が選択文の中に入っている場合は条件式に現れる変数にも依存するので、それも依存先に加える。図４のプログラム例では、５２４行目の代入文の左辺にｚｒｅｇがあり、右辺にｉｎがあるのでｚｒｅｇはｉｎに依存する。さらに、５２４行目の代入文は５２０行目の条件選択文の中に含まれているので５２０行目のｉｆ文の（）内の変数ｒｅｓｅｔにも依存する。また、５１９行目はＳｙｓｔｅｍＣの解釈では代入の扱いで、ｏｕｔはｚｒｅｇに依存する。
【０１１３】
ステップ５０９の状態探索処理では、図５の既到達状態集合記憶部６１に格納された既到達集合に対してステップ５０５の状態遷移規則抽出処理で抽出され、図５の状態遷移関数記憶部６０に格納された状態遷移関数で写像を行い、その結果得られた像集合と写像前の既到達状態集合との和を求めて図５の既到達状態集合記憶部６１に書き戻す。前記処理を繰り返し行い、前記処理によって図５の既到達状態集合記憶部６１に格納された既到達状態集合が変化しなくなったら探索を終了する。
【０１１４】
場合によっては記憶領域に不足が生じることがあるので、この場合はエラー（状態爆発）として処理を中止する。
【０１１５】
また、図７のステップ５０８の依存関係解析処理による変数の依存関係は、状態変数が複数あった場合の状態探索を行う変数の順序を決定する。つまり、依存関係の根元にある変数から状態探索を行い、状態が確定したら次の順位の変数の状態探索を行うという具合に順次、状態探索を行う。
【０１１６】
場合によっては依存関係がループになっていることがある。この場合はループになっている変数をまとめて状態探索する。全ての状態変数をまとめて状態探索する方法もあり、より正確な状態探索を行うことができるが、必要な記憶領域が多くなる。
【０１１７】
図７のステップ５０９の状態探索処理がステップ５０６の状態変数抽出処理で抽出された全ての変数の処理を終えると、図５の既到達状態集合記憶部６１に格納された既到達状態集合は全ての状態変数のとりうる範囲が記録されている。
【０１１８】
図７のステップ５１０のビット幅割り当て処理では、図５の既到達状態集合記憶部６１に格納された既到達状態集合を解析してとりうる範囲を全て表現できる必要最小限のビット幅を割り当てる。
【０１１９】
図７のステップ５１０のビット幅割り当て処理では、記号表の中で型がｉｎｔで登録されている変数をｓｃ＿ｉｎｔ＜ｎ＞あるいはｓｃ＿ｕｉｎｔ＜ｎ＞に書き換える。
【０１２０】
図７のステップ５１１のソースコード出力処理では、ビット幅の確定した記号表と解析木とからビット幅の確定したソースコード６２を出力する。
【０１２１】
（従来例との比較）
ビット幅決定方法に関して、特許文献１の方法は入力、出力、記憶素子のビット幅をあらかじめ与えておく必要がある。また、ビット幅計算のためのライブラリを用意しておく必要がある。
【０１２２】
これに対して、本発明は、入力のビット幅あるいは取り得る値の範囲を与えておくだけでよい。
【０１２３】
また、最適化方法に関して、特許文献１の方法は、与えられた入力と記憶素子のビット幅から推定された出力のビット幅があらかじめ与えられた出力のビット幅より大きい場合、出力のビット幅から逆算して必要なビット幅を推定し直す方法である。
【０１２４】
これに対して、本発明は、入力のビット幅と、ソースコードから指定あるいは推定された初期状態から状態探索を行い、到達可能な状態を全て列挙することによって全ての変数の取りうる範囲を正確に求め、それを元にビット幅を割り当てる方法である。
【０１２５】
出力は入力および状態変数に依存するので出力のビット幅が既知である必要はない。仮に出力のビット幅が与えられた場合は、推定されたビット幅と与えられたビット幅に違いがある場合、その出力変数はオーバーフローを起こすか、無駄なビットがあることになる。特にオーバーフローは設計上のミスである。特許文献１の方法では、出力のビット幅を与えることが必要条件であるので、このようなミスを検知することはできない。
【０１２６】
特許文献１の方法は、動作記述を対象としている。
これに対して、本発明は、動作記述より抽象度の低いＲＴＬ記述を対象としている。動作記述は動作合成装置により、一旦ＲＴＬ記述に変換される。
【０１２７】
一方、本発明によりＲＴＬ記述でのビット幅の指定が一部の入力変数以外には不要になるため、動作記述でもビット幅を考慮する必要がなくなり、特許文献１の必要性は消滅する。
【図面の簡単な説明】
【０１２８】
【図１】本発明のビット幅変換装置の構成を示すブロック図である。
【図２】デジタル回路のモデリング方法を示すフローチャートである。
【図３】従来技術の図１１のフローチャートに対応したプログラムの１例を示す説明図である。
【図４】本発明に係る図２のフローチャートに対応したプログラムの１例を示す説明図である。
【図５】本発明の第２の実施の形態である、ビット幅を指定しないＲＴＬ記述からビット幅を指定したＲＴＬ記述に変換する処理例を示すブロック図である。
【図６】ビット幅を指定しないＲＴＬ記述からビット幅を指定したＲＴＬ記述に変換する処理例を示すフローチャートである。
【図７】ビット幅が未確定の変数を含むソースコードを、ビット幅が全て確定したソースコードに変換する処理のフローチャートである。
【図８】図４のプログラムの文を構文解析した解析木の構造を示す説明図である。
【図９】図４のソースコードを構文解析して生成された記号表の構造を示す説明図である。
【図１０】図４のプログラムにおけるソースコードに現れた変数の依存関係を示す説明図である。
【図１１】従来の設計例を示すフローチャートである。
【符号の説明】
【０１２９】
１  ビット幅変換装置
４  ビット幅定義部
５  論理合成部
６  検証部
１０  ＣＰＵ
１１  ＲＯＭ
１２  ＲＡＭ
５０  ビット幅変換装置
５１  ソースコード
５２  ソースコード入力部
５３  構文解析部
５４  状態遷移規則抽出部
５５  状態検索部
５６  ビット幅割り当て部
５７  ソースコード出力部
５８  解析木記憶部
５９  記号表記憶部
６０  状態遷移関数記憶部
６１  既到達状態集合記憶部
６２  ソースコード
【図１】
2006190085.tif 000003
【図２】
2006190085.tif 000004
【図３】
2006190085.tif 000005
【図４】
2006190085.tif 000006
【図５】
2006190085.tif 000007
【図６】
2006190085.tif 000008
【図７】
2006190085.tif 000009
【図８】
2006190085.tif 000010
【図９】
2006190085.tif 000011
【図１０】
2006190085.tif 000012
【図１１】
2006190085.tif 000013