(57)【特許請求の範囲】
【請求項１】
ライトアクセスされるライトアクセス配列と、リードアクセスされるリードアクセス配列とが用いられて、高位合成の対象となる回路の動作が記述されている動作記述コードを、入力するコード入力部と、
前記動作記述コードを解析し、前記動作記述コード実行時の各ライトアクセスアドレスの使用順序と、前記動作記述コード実行時の各リードアクセスアドレスの使用順序とを判断するアクセス順序判断部と、
前記アクセス順序判断部により判断されたリードアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のライトアクセスアドレスの使用順序を変更するライトアクセス順序変更処理、及び前記アクセス順序判断部により判断されたライトアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のリードアクセスアドレスの使用順序を変更するリードアクセス順序変更処理のいずれかを行うアクセス順序変更部とを有し、
前記高位合成では、
アドレス値が共通するライトアクセスアドレスとリードアクセスアドレスとの対ごとに、対になるライトアクセスアドレスとリードアクセスアドレスとの間で使用タイミングに差がある場合に、使用タイミングの差を吸収するバッファが生成され、
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、
前記コード入力部により入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するライトアクセスアドレスの使用順序を導出し、導出した使用順序に沿ってライトアクセスアドレスの使用順序を変更し、
前記リードアクセス順序変更処理において、
前記コード入力部により入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するリードアクセスアドレスの使用順序を導出し、導出した使用順序に沿ってリードアクセスアドレスの使用順序を変更することを特徴とする回路設計支援装置。
【請求項２】
前記アクセス順序変更部は、
ライトアクセスアドレスの使用順序を変更しても前記高位合成の対象となる回路の動作が変化しないか否か、及びリードアクセスアドレスの使用順序を変更しても前記高位合成の対象となる回路の動作が変化しないか否かを判断し、
判断結果に基づき、前記ライトアクセス順序変更処理及び前記リードアクセス順序変更処理のいずれかを行うことを特徴とする請求項１に記載の回路設計支援装置。
【請求項３】
前記アクセス順序変更部は、
ライトアクセスアドレスの使用順序を変更しても前記高位合成の対象となる回路の動作が変化しない一方で、リードアクセスアドレスの使用順序を変更すると前記高位合成の対象となる回路の動作が変化してしまう場合に、前記ライトアクセス順序変更処理を行い、
リードアクセスアドレスの使用順序を変更しても前記高位合成の対象となる回路の動作が変化しない一方で、ライトアクセスアドレスの使用順序を変更すると前記高位合成の対象となる回路の動作が変化してしまう場合に、前記リードアクセス順序変更処理を行い、
ライトアクセスアドレスの使用順序及びリードアクセスアドレスの使用順序のいずれを変更しても前記高位合成の対象となる回路の動作が変化しない場合に、前記ライトアクセス順序変更処理及び前記リードアクセス順序変更処理のいずれかを行うことを特徴とする請求項２に記載の回路設計支援装置。
【請求項４】
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、
前記アクセス順序判断部により判断されたリードアクセスアドレスの使用順序を変更することなく、前記高位合成で生成されるバッファの個数が減少するライトアクセスアドレスの使用順序を導出し、
前記リードアクセス順序変更処理において、
前記アクセス順序判断部により判断されたライトアクセスアドレスの使用順序を変更することなく、前記高位合成で生成されるバッファの個数が減少するリードアクセスアドレスの使用順序を導出することを特徴とする請求項１に記載の回路設計支援装置。
【請求項５】
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、
前記高位合成で生成されるバッファの個数が最少となるライトアクセスアドレスの使用順序を導出し、
前記リードアクセス順序変更処理において、
前記高位合成で生成されるバッファの個数が最少となるリードアクセスアドレスの使用順序を導出することを特徴とする請求項１に記載の回路設計支援装置。
【請求項６】
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、
前記アクセス順序判断部により判断されたリードアクセスアドレスの使用順序と一致するように、ライトアクセスアドレスの使用順序を変更することを特徴とする請求項１に記載の回路設計支援装置。
【請求項７】
前記アクセス順序変更部は、
前記リードアクセス順序変更処理において、
前記動作記述コード実行時に同期して用いられる２つ以上のリードアクセスアドレスをグルーピングし、
リードアクセスアドレスのグループごとに、グループ内の２つ以上のリードアクセスアドレスのうち、同じアドレス値のライトアクセスアドレスが使用されるタイミングが最も遅いリードアクセスアドレスを基準リードアクセスアドレスとするとともに、基準リードアクセスアドレスと同じアドレス値のライトアクセスアドレスを基準ライトアクセスアドレスとし、
基準リードアクセスアドレス間の使用順序が基準ライトアクセスアドレス間の使用順序と一致するように、リードアクセスアドレスのグループ単位で、リードアクセスアドレスの使用順序を変更することを特徴とする請求項１に記載の回路設計支援装置。
【請求項８】
前記アクセス順序判断部は、
前記動作記述コードから複数のループ文を抽出し、
抽出したループ文から、配列名が共通するライトアクセス配列とリードアクセス配列を抽出し、
配列名が共通するライトアクセス配列とリードアクセス配列を対にし、
ライトアクセス配列とリードアクセス配列の対ごとに、ライトアクセスアドレスの使用順序と、リードアクセスアドレスの使用順序とを判断し、
前記アクセス順序変更部は、
ライトアクセス配列とリードアクセス配列の対ごとに、前記ライトアクセス順序変更処理及び前記リードアクセス順序変更処理のいずれかを行うことを特徴とする請求項１に記載の回路設計支援装置。
【請求項９】
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、前記動作記述コードを書き換えてライトアクセスアドレスの使用順序を変更し、
前記リードアクセス順序変更処理において、前記動作記述コードを書き換えてリードアクセスアドレスの使用順序を変更することを特徴とする請求項１に記載の回路設計支援装置。
【請求項１０】
前記アクセス順序変更部は、
前記ライトアクセス順序変更処理において、変更後のライトアクセスアドレスの使用順序が示されるライトアクセスアドレス使用順序情報を、前記動作記述コードを書き換えるコード書換え装置に出力し、前記コード書換え装置に、前記ライトアクセスアドレス使用順序情報に示されるライトアクセスアドレスの使用順序に沿って前記動作記述コードの書き換えを行わせてライトアクセスアドレスの使用順序を変更し、
前記リードアクセス順序変更処理において、変更後のリードアクセスアドレスの使用順序が示されるリードアクセスアドレス使用順序情報を、前記動作記述コードを書き換えるコード書換え装置に出力し、前記コード書換え装置に、前記リードアクセスアドレス使用順序情報に示されるリードアクセスアドレスの使用順序に沿って前記動作記述コードの書き換えを行わせてリードアクセスアドレスの使用順序を変更することを特徴とする請求項１に記載の回路設計支援装置。
【請求項１１】
ライトアクセスされるライトアクセス配列と、リードアクセスされるリードアクセス配列とが用いられて、高位合成の対象となる回路の動作が記述されている動作記述コードを、コンピュータが、入力するコード入力ステップと、
前記コンピュータが、前記動作記述コードを解析し、前記動作記述コード実行時の各ライトアクセスアドレスの使用順序と、前記動作記述コード実行時の各リードアクセスアドレスの使用順序とを判断するアクセス順序判断ステップと、
前記コンピュータが、前記アクセス順序判断ステップにより判断されたリードアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のライトアクセスアドレスの使用順序を変更するライトアクセス順序変更処理、及び前記アクセス順序判断ステップにより判断されたライトアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のリードアクセスアドレスの使用順序を変更するリードアクセス順序変更処理のいずれかを行うアクセス順序変更ステップとを有し、
前記高位合成では、
アドレス値が共通するライトアクセスアドレスとリードアクセスアドレスとの対ごとに、対になるライトアクセスアドレスとリードアクセスアドレスとの間で使用タイミングに差がある場合に、使用タイミングの差を吸収するバッファが生成され、
前記アクセス順序変更ステップで前記ライトアクセス変更順序処理が行われる場合に、
前記ライトアクセス順序変更処理において、前記コンピュータは、
前記コード入力ステップにより入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するライトアクセスアドレスの使用順序を導出し、導出した使用順序に沿ってライトアクセスアドレスの使用順序を変更し、
前記アクセス順序変更ステップで前記リードアクセス順序変更処理が行われる場合に、
前記リードアクセス順序変更処理において、前記コンピュータは、
前記コード入力ステップにより入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するリードアクセスアドレスの使用順序を導出し、導出した使用順序に沿ってリードアクセスアドレスの使用順序を変更することを特徴とする回路設計支援方法。
【請求項１２】
ライトアクセスされるライトアクセス配列と、リードアクセスされるリードアクセス配列とが用いられて、高位合成の対象となる回路の動作が記述されている動作記述コードを、入力するコード入力ステップと、
前記動作記述コードを解析し、前記動作記述コード実行時の各ライトアクセスアドレスの使用順序と、前記動作記述コード実行時の各リードアクセスアドレスの使用順序とを判断するアクセス順序判断ステップと、
前記アクセス順序判断ステップにより判断されたリードアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のライトアクセスアドレスの使用順序を変更するライトアクセス順序変更処理、及び前記アクセス順序判断ステップにより判断されたライトアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のリードアクセスアドレスの使用順序を変更するリードアクセス順序変更処理のいずれかを行うアクセス順序変更ステップとをコンピュータに実行させるプログラムであって、
前記高位合成では、
アドレス値が共通するライトアクセスアドレスとリードアクセスアドレスとの対ごとに、対になるライトアクセスアドレスとリードアクセスアドレスとの間で使用タイミングに差がある場合に、使用タイミングの差を吸収するバッファが生成され、
前記アクセス順序変更ステップで前記ライトアクセス変更順序処理が行われる場合に、
前記ライトアクセス順序変更処理において、前記コンピュータに、
前記コード入力ステップにより入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するライトアクセスアドレスの使用順序を導出させ、導出された使用順序に沿ってライトアクセスアドレスの使用順序を変更させ、
前記アクセス順序変更ステップで前記リードアクセス順序変更処理が行われる場合に、
前記リードアクセス順序変更処理において、前記コンピュータに、
前記コード入力ステップにより入力された動作記述コードがそのまま前記高位合成に用いられる場合に比べて、前記高位合成で生成されるバッファの個数が減少するリードアクセスアドレスの使用順序を導出させ、導出された使用順序に沿ってリードアクセスアドレスの使用順序を変更させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、回路設計を支援する回路設計支援装置に関する。
より具体的には、動作記述コード（以下、単に「動作記述」ともいう）からレジスタ転送レベルを自動生成する高位合成（動作合成）を利用した半導体設計を支援する回路設計支援装置に関する。
【背景技術】
【０００２】
従来の半導体集積回路設計では、回路に含まれるレジスタとレジスタ間の組み合わせ回路の動作を記述するレジスタ転送レベル（ＲＴＬ）をハードウェア記述言語で設計していた。
近年では集積回路の回路規模が増大しており、ＲＴＬ設計時間を多大に要することが問題となっている。
そこで、ＲＴＬよりも抽象度が高い高級言語であるＣ言語、Ｃ＋＋言語、ＳｙｓｔｅｍＣ言語などを用いて自動的にＲＴＬを生成する高位合成技術が提唱されており、これを実現する高位合成ツールが市販されている。
特許技術文献１では、この高位合成ツールへの入力の前処理として、冗長なメモリを削除するために、冗長なメモリの発生要因となる配列記述箇所を検出し、自動的に配列を削除することで、小回路規模な集積回路を得ることが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−２３８０５４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、特許文献１では、添え字がループ変数のみで表現されている配列だけを削除の対象としており、削除できない配列については依然として配列要素分のメモリが必要であるという課題がある。
【０００５】
この発明は、上記のような課題を解決することを主な目的としており、冗長なバッファを有効に削減することを主な目的とする。
【課題を解決するための手段】
【０００６】
本発明に係る回路設計支援装置は、
ライトアクセスされるライトアクセス配列と、リードアクセスされるリードアクセス配列とが用いられて、高位合成の対象となる回路の動作が記述されている動作記述コードを、入力するコード入力部と、
前記動作記述コードを解析し、前記動作記述コード実行時の各ライトアクセスアドレスの使用順序と、前記動作記述コード実行時の各リードアクセスアドレスの使用順序とを判断するアクセス順序判断部と、
前記アクセス順序判断部により判断されたリードアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のライトアクセスアドレスの使用順序を変更するライトアクセス順序変更処理、及び前記アクセス順序判断部により判断されたライトアクセスアドレスの使用順序に基づいて前記動作記述コード実行時のリードアクセスアドレスの使用順序を変更するリードアクセス順序変更処理のいずれかを行うアクセス順序変更部とを有することを特徴とする回路設計支援装置。
【発明の効果】
【０００７】
本発明によれば、ライトアクセスアドレスの使用順序又はリードアクセスアドレスの使用順序の変更により、ライトアクセスの順序とリードアクセスの順序とを整合させてバッファを減らすことができる。
【図面の簡単な説明】
【０００８】
【図１】実施の形態１に係る半導体設計支援装置の構成例を示す図。
【図２】実施の形態１に係る処理部の動作例を示すフローチャート図。
【図３】実施の形態１に係る高級言語で記述されたコードの例を示す図。
【図４】実施の形態１に係るループテーブルの例を示す図。
【図５】実施の形態１に係る配列テーブルの例を示す図。
【図６】実施の形態１に係るループテーブル（依存関係判定後）の例を示す図。
【図７】実施の形態１に係るアクセス遅延テーブルの例を示す図。
【図８】実施の形態１に係る高級言語で記述された他のコードの例を示す図。
【図９】実施の形態１に係るアクセス遅延テーブル（ライト依存なし、リード依存あり）の例を示す図。
【図１０】実施の形態１に係るアクセス遅延テーブル（ライト依存あり、リード依存なし）の例を示す図。
【図１１】実施の形態１の手法を適用しない場合のブロック図と性能の例を示す図。
【図１２】実施の形態１の手法を適用した場合（ライト依存なし、リード依存あり）のブロック図と性能の例を示す図。
【図１３】実施の形態１の手法を適用した場合（ライト依存あり、リード依存なし）のブロック図と性能の例を示す図。
【図１４】実施の形態１に係る半導体設計支援装置のハードウェア構成例を示す図。
【発明を実施するための形態】
【０００９】
実施の形態１．
本実施の形態では、回路間にあるメモリ、またはレジスタ数を削減し、かつ低遅延で演算結果を出力可能なコードを得るための半導体設計支援装置を説明する。
より具体的には、本実施の形態で説明する半導体設計支援装置は、演算間の依存関係を抽出し、演算の順序を変更する。
そして、本実施の形態に係る半導体設計支援装置によれば、設計者の能力に依存することなく高性能で小回路規模なハードウェア構成（アーキテクチャ）を短時間で得ることができる。
【００１０】
図１は、実施の形態１に係る半導体設計支援装置を用いた高位合成システムの構成を示すブロック図である。
図１において、半導体設計支援装置１は、処理部３とテーブル記憶部４とファイル記憶部５を備える。
半導体設計支援装置１は、回路設計支援装置に相当する。
高位合成装置２は、高級言語による動作記述コードを受理して、ＲＴＬを生成する装置である。
半導体設計支援装置１から高位合成装置２へ高位合成が可能な動作記述コードを与えることで目的とするＲＴＬを得ることができる。
【００１１】
処理部３は、高位合成の対象となる高級言語で記述された動作記述コードを入力し、配列のアクセス依存関係を検出し、低遅延、小回路規模になるように配列のアクセス順序を変更する。
処理部３は、コード入力部、アクセス順序判断部及びアクセス順序変更部に相当する。
テーブル記憶部４は、処理部３の処理結果が示されるテーブルや、処理部３が参照するテーブルを記憶する。
ファイル記憶部５は、処理部３が入力した動作記述コードを記憶する。
また、ファイル記憶部５は、処理部３が変更した後の動作記述コードを記憶してもよい。
【００１２】
次に、実施の形態１の動作を説明する。
図２は、実施の形態１の半導体設計支援装置１の動作の流れを示すフローチャートである。
このフローチャートにある機能は処理部３で実行され、必要なときにテーブル記憶部４とファイル記憶部５とのデータのやりとりが行われる。
動作を説明するにあたり図３に例示する動作記述コードを用いる。
なお、図３のコードは本実施の形態に係る動作を説明するために必要な一部を抜き出して示したものであり、動作記述としては不完全なものである。
この記述を高位合成装置２に直接入力すれば、最初のループと次のループの間にＮ個のデータを格納するためのバッファ（メモリ、あるいはレジスタ）が必要となる。
最初のループが終了しないと次のループに処理が移れないため、結果であるｏｕｔが出力されるには時間を要することが問題となる。
【００１３】
まず、半導体設計支援装置１が動作を開始すると、処理部３は高位合成の対象となる動作記述のファイル、ここでは図３に示すコードを受理し（ステップＳＴ１：コード受理）、ファイル記憶部５に格納する。
【００１４】
次に、処理部３は、ファイル記憶部５のコード（図３）を読み出し、ｆｏｒ文の抽出を行う（ステップＳＴ２：ｆｏｒ文の抽出）。
この抽出では図４に示すように各ｆｏｒ文にループＩＤ（Ｉｄｅｎｔｉｆｉｅｒ）とその記述箇所（行数）をテーブル記憶部４に書き込む。
図４のテーブルをループテーブルと呼ぶ。
【００１５】
次に、処理部３は、ループテーブル（図４）に基づき、動作記述コード（図３）を解析し、ループＩＤ毎にループ内にある配列名、配列ＩＤ、アクセス方法、アクセス数、トータルアクセス数を抽出し、テーブル記憶部４へ書き込む（ステップＳＴ３：配列アクセス関係抽出）。
ここで書き込まれるテーブルを配列テーブルと呼ぶ。
配列名は、コード中に記載がある配列変数名である。
アクセス方法は、式中に該当する配列が左辺にある場合はライト、右辺にある場合はリードとする。
アクセス数は、該当する配列に何度アクセスしたかを示す。
このアクセス数は、繰り替えし回数あたりのアクセス数となる。
図３のコードの場合、ｄａｔ変数は２回のリードアクセスが発生している（ｄａｔ［ｉ］とｄａｔ［Ｎ−ｉ］）ため、ここでは２となる。
トータルアクセス数は、該当する配列がｆｏｒループ間に何回アクセスされるかを示す。
図３のコードから配列アクセス関係を抽出した結果を図５に示す。
【００１６】
なお、ライトアクセスの配列をライトアクセス配列ともいい、リードアクセスの配列をリードアクセス配列ともいう。
図５では、２行目の「ｄａｔ」と４行目の「ｏｕｔ」がライトアクセス配列であり、１行目の「ｍｅｍ」と３行目の「ｄａｔ」がリードアクセス配列である。
また、ライトアクセス配列の配列要素をライトアクセスアドレスともいい、リードアクセス配列の配列要素をリードアクセスアドレスともいう。
ライトアクセスアドレスは、それぞれライトアクセスのアクセス先のアドレスであり、リードアクセスアドレスは、それぞれリードアクセスのアクセス先のアドレスである。
図３のコードでは、１つ目のｆｏｒ文のｄａｔ［ｉ］の各ｉの値が、ライトアクセスアドレスである。
同様に、２つ目のｆｏｒ文のｄａｔ［ｉ］の各ｉの値が、リードアクセスアドレスである。
【００１７】
次に、ステップＳＴ１で作成したループテーブルからループＩＤ毎に繰り返し文（ｆｏｒ文）の中で、前のイタレーションが次のイタレーションに影響を与えるかを調べる（ステップＳＴ４：依存関係判定）。
具体的には、繰り返し文中にある任意の変数が参照後、代入を行っている場合は依存ありとし、それ以外を依存なしとする。
図３のコードの場合、１つ目のｆｏｒ文では、変数ｃｏｕｎｔについての参照（ｃｏｕｎｔ！＝１０）後に、代入（ｃｏｕｎｔ＋＋）が行われているので、１つ目のｆｏｒ文では依存関係がある。
一方、２つ目のｆｏｒ文では、このような変数はないので、２つ目のｆｏｒ文では依存関係がない。
なお、依存関係があるｆｏｒ文に含まれるライトアクセスアドレス又はリードアクセスアドレスの使用順序を変更すると高位合成の対象となる回路の動作が変化してしまう。
このため、依存関係があるｆｏｒ文に含まれるライトアクセスアドレス又はリードアクセスアドレスの使用順序を変更することはできない。
一方、依存関係がないｆｏｒ文に含まれるライトアクセスアドレス又はリードアクセスアドレスは使用順序しても高位合成の対象となる回路の動作が変化しない。
このため、依存関係がないｆｏｒ文に含まれるライトアクセスアドレス又はリードアクセスアドレスの使用順序は変更することはできる。
【００１８】
ステップＳＴ４で抽出された依存関係の有無は、テーブル記憶部４のループテーブルに依存関係を追記される。
図６は、依存関係の有無が追記された後のループテーブルを示す。
なお、動作記述コードにおいて、処理として実行順序をあらかじめ決めておきたい場合がある。
例えば画像データなどは座標順にデータが入力される場合がある。
そのため、動作記述コードに順序変更不可の情報を付加して、あるいはオプションとして、処理部３がそれを解析し、依存関係情報を生成してもよい。
図８は、リード順序の変更が禁止されている動作記述コードの例である。
なお、図８の動作記述コードについては後述する。
【００１９】
次に、処理部３は、配列テーブル（図５）を参照し、同一配列ＩＤをアクセスするアドレス（添え字）計算を行い、アクセス遅延テーブルを作成し、作成したアクセス遅延テーブルをテーブル記憶部４に格納する（ステップＳＴ５：アクセス遅延算出）。
より具体的には、処理部３は、配列名が共通するライトアクセス配列とリードアクセス配列を抽出し、配列名が共通するライトアクセス配列とリードアクセス配列を対にし、ライトアクセス配列とリードアクセス配列の対ごとに、動作記述コード実行時のライトアクセスアドレスの使用順序と、動作記述コード実行時のリードアクセスアドレスの使用順序とを判断する。
図５の例では、配列名が共通するライトアクセス配列とリードアクセス配列であるｄａｔを対にし、ｄａｔ（Ｗ：２行目）のライトアクセスアドレスの使用順序と、ｄａｔ（Ｒ：３行目）のリードアクセスアドレスの使用順序とを判断する。
【００２０】
図７は、図３のコードを解析して得られたアクセス遅延テーブルである。
アクセス遅延テーブルには、サイクル数、ライトアクセスアドレス、リードアクセスアドレス、アクセス遅延、アクセスコストを書き込む。
【００２１】
サイクル数は、時間情報であり、１サイクル目、２サイクル目といったようにサイクルをインクリメントして記述する。
この上限はループのトータルアクセス数である。
【００２２】
ライトアクセスアドレスは、ループを展開して得られるライトアクセスする配列の添え字である。
ライトアクセスアドレスの欄に示される数字は、それぞれライトアクセスアドレスを表しており、ライトアクセスアドレスの欄には、動作記述コード実行時のライトアクセスアドレスの使用順序が記述されている。
リードアクセスアドレスは、リードアクセスする各配列について記載する。
図３のコード例の場合、２つのリードアクセス（ｄａｔ［ｉ］とｄａｔ［Ｎ−ｉ］）が発生するため、この項目は２つ存在する。
リードアクセスアドレスは、ループを展開して得られるリードアクセスする配列の添え字である。
リードアクセスアドレスの欄に示される数字は、それぞれリードアクセスアドレスを表しており、リードアクセスアドレスの欄には、動作記述コード実行時のリードアクセスアドレスの使用順序が記述されている。
なお、リード制約について、１サイクルで２つのデータを読み込むことが可能である場合、それを追加情報として処理部３に与えてもよい。
【００２３】
アクセス遅延は、アドレス値が共通するライトアクセスアドレスのサイクル数とリードアクセスアドレスのサイクル数との関係を表す。
例えば、ライトアクセスアドレス６はサイクル７で発生している一方で、対応するリードアクセスアドレス６はサイクル１３で発生している。
リードアクセスアドレス６のアクセス遅延は、対応するライトアクセスアドレス６のサイクル数である「７」となる。
また、例えば、リードアクセスアドレス１５はサイクル２で発生している一方で、対応するライトアクセスアドレス１５はサイクル１６で発生している。
リードアクセスアドレス１５のアクセス遅延は、対応するライトアクセスアドレス１５のサイクル数である「１６」となる。
【００２４】
アクセスコストは、複数のリードがある場合はもっともアクセス遅延が大きい値をアクセスコストとする。
【００２５】
図３のコードでは、１６サイクル目に、リードアクセスアドレス０とリードアクセスアドレス１５の両方の値が揃うので、ループＩＤ２のｏｕｔ［０］＝ｄａｔ［０］＋ｄａｔ［１５−０］が実行可能である。
リードアクセスアドレス１とリードアクセスアドレス１４はリードアクセスアドレス１５の後に発生するので、１７サイクル目に、リードアクセスアドレス１とリードアクセスアドレス１４についての、ループＩＤ２のｏｕｔ［１］＝ｄａｔ［１］＋ｄａｔ［１５−１］が実行可能である。
リードアクセスアドレス２とリードアクセスアドレス１３は更に１サイクル後なので、１８サイクル目に、リードアクセスアドレス２とリードアクセスアドレス１３についての、ループＩＤ２のｏｕｔ［２］＝ｄａｔ［２］＋ｄａｔ［１５−２］が実行可能である。
このように、図７のアクセスコストの欄には、ｉ＝０、１、２、３．．．の各々について、ループＩＤ２のｏｕｔ［ｉ］＝ｄａｔ［ｉ］＋ｄａｔ［Ｎ−ｉ］が実行可能なサイクル数をかっこ書で示している。
図７に示すように、図３のループＩＤ２の処理が終了するまでには、２３サイクルを要する。
【００２６】
例えば、リードアクセスアドレス１とリードアクセスアドレス１４についてみれば、サイクル数２のときにライトアクセスアドレス１のライトが行われ、サイクル数１５のときにライトアクセスアドレス１４のライトが行われている。
一方で、ループＩＤ２のｏｕｔ［１］＝ｄａｔ［１］＋ｄａｔ［１５−１］の処理が行われるのは１７サイクル目なので、ライトアクセスアドレス１の値はサイクル数２からサイクル数１７までの間、ライトアクセスアドレス１４の値はサイクル数１５からサイクル数１７までの間、ライトタイミングとリードタイミングとの間のタイミング差を吸収するためのバッファに保持しておく必要がある。
同様に、ライトアクセスアドレス２の値はサイクル数３からサイクル数１８までの間、ライトアクセスアドレス１３の値はサイクル数１４からサイクル数１８までの間、バッファに保持しておく必要がある。
他のアドレス値でも同様であり、リードアクセスアドレス０〜１５の全てについて、ライトされた値を保持しておくためのバッファが必要であり、計１６個のバッファを設ける必要がある。
このように、図３のコードを実行する場合には、ライトアクセスの順序とリードアクセスの順序に整合がとれていないため、高位合成において１６個のバッファを生成する必要がある。
本実施の形態に係る半導体設計支援装置１では、このようなライトアクセスの使用順序とリードアクセスの使用順序の不整合を抑制するものである。
【００２７】
次に、処理部３は、ライトあるいはリードのアクセス順序の変更を行う（ステップＳＴ６：アクセス順序変更）。
より具体的には、処理部３は、ループテーブル（図６）と配列テーブル（図５）を参照し、動作記述コードが以下の４つのケースのいずれに該当するかを判断する。
アクセスケース１：「ライト依存あり」で「リード依存あり」
アクセスケース２：「ライト依存なし」で「リード依存あり」
アクセスケース３：「ライト依存なし」で「リード依存なし」
アクセスケース４：「ライト依存あり」で「リード依存なし」
ここで、「ライト依存あり」とは、ライトアクセスアドレスの使用順序を変更すると高位合成の対象となる回路の動作が変化してしまうため、ライトアクセスアドレスの使用順序を変更できないことを意味する。
一方、「ライト依存なし」とは、ライトアクセスアドレスの使用順序を変更しても高位合成の対象となる回路の動作が変化しないため、ライトアクセスアドレスの使用順序を変更できることを意味する。
また、「リード依存あり」とは、リードアクセスアドレスの使用順序を変更すると高位合成の対象となる回路の動作が変化してしまうため、リードアクセスアドレスの使用順序を変更できないことを意味する。
一方、「リード依存なし」とは、リードアクセスアドレスの使用順序を変更しても高位合成の対象となる回路の動作が変化しないため、リードアクセスアドレスの使用順序を変更できることを意味する。
【００２８】
アクセスケース１の場合は、ライト及びリードのアクセス順序は固定化されるため、本実施の形態による高性能化はできないので、ここで処理を終了する。
【００２９】
アクセスケース２の場合は、ライトの書き込み順序は変更可能であるため、ライトアクセス順をリードアクセス順に合わせることが可能である。
なお、リードアクセス順に合わせてライトアクセス順を変更する処理を、ライトアクセス順序変更処理という。
【００３０】
アクセスケース３の場合、どちらも依存関係はないので、ライトアクセス順又はリードアクセス順のどちらかを固定として他方の順序を変更する。
ライトアクセス順、リードアクセス順のいずれを固定とするかは、アクセスコストが小さいほうを選べばよい。
【００３１】
アクセスケース４の場合は、リードの書き込み順序は変更可能であるため、リードアクセス順をライトアクセス順に合わせることが可能である。
なお、ライトアクセス順に合わせてリードアクセス順を変更する処理を、リードアクセス順序変更処理という。
【００３２】
ここでは、アクセスケース２について説明する。
図８は、ライト依存なしでリード依存ありの場合のコード例である。
図８の１つ目のループのライトアクセス配列ｄａｔ［ｉ］は、依存関係がない。
一方、２つ目のループでは、リード固定オプションを付加してある。
これはループ文自体に依存関係はないが、設計上ｏｕｔ配列にたいして０、１、２、３．．．とコードで示した順序で処理を行いたい場合に付加されるオプションである。
このオプションを処理部３が解析し、依存関係判定において、該当するループＩＤに依存関係あり（２つ目のループで「リード依存」あり）と判断される。
前述のように、ライト側（１つ目のループ）は依存関係がないため、ｆｏｒ文中どのｉからライトアクセスを始めてもよい。
つまり、リード側（２つ目のループ）のｄａｔ（リードアクセス配列）が要求する順序でライトアクセスを行い、ライトアクセス結果をリード側のｄａｔに渡すことで処理が高速になる。
【００３３】
このように、アクセスケース２の場合は、処理部３は、リードアクセス順にライトを実行できるように変更ライトアクセスアドレスをアクセス遅延テーブルに書き込む。
図９に、図８のコードに対応させて、変更ライトアクセスアドレスと更新したアクセスコストを付加した遅延テーブルを示す。
なお、図８のコードの２つ目ループの内容と図３の２つ目のループの内容が同じであり、図８のコードの場合も、ライトアクセスの順序を変更する前のアクセス遅延テーブル（図２のＳＴ５：アクセス遅延算出の後のアクセス遅延テーブル）は、図７に示すものと同じである。
図９のアクセス遅延テーブルでは、リードアクセスアドレスの順序と一致するように、ライトアクセスアドレスの順序を変更している（ライトアクセス順序変更処理）。
なお、遅延コストが０のため、図８の１つ目のループと２つ目のループの間にバッファは必要なく、１つ目のループの結果を直接２つ目のループが受けとることができる。
【００３４】
図９のようにライトアクセスの順序を変更すると、ライトアクセスアドレスｉへのライトの直後にリードアクセスアドレスｉからのリードが発生するため、１６サイクルで処理が終了する。
また、前述したように、ライトアクセスとリードアクセスとの間のタイミング差がないので、バッファも不要である。
【００３５】
本実施の形態に係る手法を適用しない場合、図８のコードを高位合成してＲＴＬを生成すると、図１１に示すブロック図、および性能になる。
バッファはＮ個分必要であり、さらに１つ目のループ（図１１ではＡ１と表記）の処理が終了した後に、２つ目のループ（図１１ではＢ１と表記）の処理が開始されている。
【００３６】
本実施の形態に係る手法を適用してライトアクセス順序を変更し、図８のコードを高位合成してＲＴＬを生成すると、図１２に示すブロック図、および性能になる。
本実施の形態によれば、図１２に示すように中間バッファは必要なく、１つ目のループ（図１２ではＡ１と表記）の処理を全て待つことなく、２つ目のループ（図１２ではＢ１と表記）の処理が開始可能となり、高速に処理が可能となる。
【００３７】
アクセスケース３：「ライト依存なし」で「リード依存なし」の場合は、ライト依存ありとリード依存なしの場合（アクセスケース４）とライト依存なしとリード依存ありの場合（アクセスケース２）との２つの場合を処理し、アクセスコストが小さくなるほうを選べばよい。
【００３８】
アクセスケース４：「ライト依存あり」で「リード依存なし」の場合、リード側のアクセス順序をアクセスコストが小さくなるように変更する。
図３のコード例は、アクセスケース４に該当する。
図３コードの場合のアクセス順序変更の図を図１０に示す。
【００３９】
図３のコードを処理する場合は、例えば、処理部３は以下のアルゴリズムに従ってリードアクセスアドレスの順序を変更する。
【００４０】
まず、処理部３は、図３のコードの実行時に同期して用いられる２つのリードアクセスアドレスをグルーピングし、リードアクセスアドレスのグループ（以下、グループを「ペア」という）を生成する。
例えば、図７のリード１のアクセスアドレス７とリード２アクセスアドレス８はループＩＤ２で同時に処理されるものであるため、ペアになる。
そして、処理部３は、リードアクセスアドレスのペアごとに、ペア内の２つのリードアクセスアドレスのうち、同じアドレス値のライトアクセスアドレスの使用タイミングが遅いリードアクセスアドレスを基準リードアクセスアドレスとするとともに、基準リードアクセスアドレスと同じアドレス値のライトアクセスアドレスを基準ライトアクセスアドレスとする。
更に、処理部３は、基準リードアクセスアドレス間の使用順序が基準ライトアクセスアドレス間の使用順序と一致するように、リードアクセスアドレスのペア単位で、リードアクセスアドレスの使用順序を変更する。
【００４１】
図７の例では、リードアクセスアドレス（０、１５）、（１、１４）、（２、１３）、（３、１２）、（４、１１）、（５、１０）、（６、９）、（７、８）がペアとなる。
更に、リードアクセスアドレス（１５、１４、１３、１２、１１、１０、９、８）が基準リードアクセスアドレスとなる。
また、基準リードアクセスアドレスと同じアドレス値のライトアクセスアドレスが基準ライトアクセスアドレスとなる。
そして、処理部３は、基準リードアクセスアドレス間の使用順序が基準ライトアクセスアドレス間の使用順序（８、９、１０、１１、１２、１３、１４、１５）と一致するように、リードアクセスアドレスのペア単位で、リードアクセスアドレスの使用順序を変更する。
この結果、図１０に示すように、リードアクセスアドレスの順序が、（７、８）、（６、９）、（５、１０）、（４、１１）、（３、１２）、（２、１３）、（１、１４）、（０、１５）という順序に変更される。
【００４２】
上述のリードアクセスアドレスの順序変更アルゴリズムの考え方は以下の通りである。
【００４３】
ライトアクセスアドレスの使用順序は固定されているので、ループＩＤ２で最初に処理可能となるのは、ライトアクセスアドレス７とライトアクセスアドレス８の処理の直後に処理可能となるリードアクセスアドレス７とリードアクセスアドレス８である。
そのため、リードアクセスアドレス７とリードアクセスアドレス８のペアを最初にリードアクセスの対象とする。
この場合、リードアクセスアドレス７へのアクセスは、ライトアクセスアドレス７へのアクセスが行われるサイクル８のときに可能なので、リードアクセスアドレス７のアクセス遅延は８となる。
また、リードアクセスアドレス８へのアクセスは、ライトアクセスアドレス８へのアクセスが行われるサイクル９のときに可能なので、リードアクセスアドレス８のアクセス遅延は９となる。
この結果、リードアクセスアドレス７とリードアクセスアドレス８のペアとしてのアクセス遅延は９となる。
つまり、９サイクル目の時点で、リードアクセスアドレス７とリードアクセスアドレス８の両方の値が揃っているので、ループＩＤ２のｏｕｔ［７］＝ｄａｔ［７］＋ｄａｔ［１５−７］が実行可能である。
その他のペアについてはデータがそろっていないため処理が開始できない。
次のサイクルでライトアクセスアドレス９がアクセスされるが、既にサイクル７でライトアクセスアドレス６へのアクセスが行われているので、サイクル１０の時点で、リードアクセスアドレス６とリードアクセスアドレス９が演算開始可能となる。
このように演算可能となる処理から順に演算するようにリードアクセスアドレスの処理順序を変更する。
【００４４】
図１０に示す順序でリードアクセスアドレスの順序を変更すると、最後のペアであるリードアクセスアドレス０とリードアクセスアドレス１５を用いたｏｕｔ［０］＝ｄａｔ［０］＋ｄａｔ［１５−０］は、１６サイクル目で実現できる。
このため、図３の動作記述コードをそのまま高位合成の対象とした場合のサイクル数である２３（図７）に比べて大幅に処理時間を短縮することができる。
また、図１０の順序の場合は、リードアクセスアドレス８〜１５からのリードは、ライトアクセスアドレス８〜１５へのライトの直後に行われるため、リードアクセスアドレス８〜１５についてはバッファが不要であり、リードアクセスアドレス０〜７についての８個のバッファで済む（バッファ数を最少個数とすることができる）。
このため、図３の動作記述コードをそのまま高位合成の対象とした場合のバッファ数である１６個に比べて大幅にバッファ数を削減することができる。
【００４５】
このように、リードアクセスアドレスの順序を変更することで、遅延コストが小さくなることで、ループＩＤ２が出力するデータの遅延が小さくなり、この結果、低レイテンシな処理が可能となる。
つまり、本実施の形態の手法によらない場合は、データ数Ｎ個分のレジスタ、あるいはメモリが必要であるが、本実施の形態によりアクセス順序を変更することにより、バッファ数が半分で済む。
さらに、本実施の形態の手法によらない場合は、１６サイクル目の後にループＩＤ２の処理を開始するが、本実施の形態によりアクセス順序を変更することにより、８サイクル目の後にループＩＤ２の処理を開始することが可能となり、低レイテンシとなる。
バッファ容量は半分になり、さらにループ１の計算途中からループ２の演算が開始可能となり、高速に処理が可能となる。
【００４６】
図１３にアクセスケース４の場合のブロック図と性能を示す。
図１３に示すように、図１１の場合に比べて中間バッファのサイズが小さく、また、１つ目のループ（図１３ではＡ１と表記）の処理を全て待つことなく、２つ目のループ（図１３ではＢ１と表記）の処理が開始可能となり、高速に処理が可能となる。
【００４７】
以上説明したように、アクセスケース２、アクセスケース４のいずれの場合も、図３の動作記述コードがそのまま高位合成に用いられる場合に比べて、高位合成で生成されるバッファの個数が減少するライトアクセス又はリードアクセスの順序を導出し、導出したライトアクセス又はリードアクセスの順序に沿ってライトアクセスアドレス又はリードアクセスアドレスの使用順序を変更している。
【００４８】
そして、処理部３は、最後に、アクセス順序を変更したコードを生成し、アクセス順序の変更後のコードをファイル記憶部５に格納する（ステップＳＴ７：コード生成）。
変更記述箇所は、ループテーブル（図６）に記載ある行数から判断する。
ここで、コード生成は、アクセス遅延テーブル（図９又は図１０）から、更新されたアクセスになるようにループを展開して記述する。
つまり、処理部３は、図８のコードの１つ目のループ文を、図９の変更ライトアクセスの順序でライトアクセスされる記述に書き換える。
また、処理部３は、図３のコードの２つ目のループ文を、図１０の変更リードアクセスアドレスの順序でリードアクセスされる記述に書き換える。
【００４９】
なお、処理部３が動作記述コードを書き換える代わりに、処理部３が図９の変更ライトアクセスの内容を示す情報（ライトアクセスアドレス使用順序情報の例）を高位合成装置２（コード書き換え装置の例）に出力し、高位合成装置２に、図８のコードの１つ目のループ文を、図９の変更ライトアクセスの順序でライトアクセスされる記述に書き換えさせるようにしてもよい。
同様に、処理部３が図１０の変更リードアクセスアドレスの内容を示す情報（リードアクセスアドレス使用順序情報の例）を高位合成装置２（コード書き換え装置の例）に出力し、高位合成装置２に、図３のコードの２つ目のループ文を、図１０の変更リードアクセスアドレスの順序でリードアクセスされる記述に書き換えさせるようにしてもよい。
【００５０】
以上、本実施の形態では、
高位合成の対象となる設計回路の動作を記述した動作記述を入力とし、入力した動作記述の中から、複数の配列変数の依存関係を抽出し、配列を実現するメモリ、あるいはレジスタ数を削減する、または遅延が小さくなるように配列にライトする、またはリードする順序を変更するコードを生成する処理部を備えた半導体設計支援装置を説明した。
【００５１】
最後に、本実施の形態に示した半導体設計支援装置１のハードウェア構成例を図１４を参照して説明する。
半導体設計支援装置１はコンピュータであり、半導体設計支援装置１の各要素はプログラムにより処理を実行することができる。
半導体設計支援装置１のハードウェア構成としては、バスに、演算装置９０１、外部記憶装置９０２、主記憶装置９０３、通信装置９０４、入出力装置９０５が接続されている。
【００５２】
演算装置９０１は、プログラムを実行するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
外部記憶装置９０２は、例えばＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）やフラッシュメモリ、ハードディスク装置である。
主記憶装置９０３は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
通信装置９０４は、高位合成装置２やその他の装置と通信を行う。
入出力装置９０５は、例えば、マウス、キーボード、ディスプレイ装置である。
【００５３】
プログラムは、通常は外部記憶装置９０２に記憶されており、主記憶装置９０３にロードされた状態で、順次演算装置９０１に読み込まれ、実行される。
プログラムは、図１に示す「処理部３」として説明している機能を実現するプログラムである。
更に、外部記憶装置９０２にはオペレーティングシステム（ＯＳ）も記憶されており、ＯＳの少なくとも一部が主記憶装置９０３にロードされ、演算装置９０１はＯＳを実行しながら、図１に示す「処理部３」の機能を実現するプログラムを実行する。
また、本実施の形態の説明において、「〜の判断」、「〜の判定」、「〜の抽出」、「〜の算出」、「〜の導出」、「〜の解析」、「〜の検知」、「〜の設定」、「〜の登録」、「〜の選択」、「〜の生成」、「〜の入力」、「〜の出力」等として説明している処理の結果を示す情報やデータや信号値や変数値が主記憶装置９０３にファイルとして記憶されている。
また、暗号鍵・復号鍵や乱数値やパラメータが、主記憶装置９０３にファイルとして記憶されてもよい。
【００５４】
なお、図１４の構成は、あくまでも半導体設計支援装置１のハードウェア構成の一例を示すものであり、半導体設計支援装置１のハードウェア構成は図１４に記載の構成に限らず、他の構成であってもよい。
また、本実施の形態に示した高位合成装置２も、図１４のハードウェア構成をしていてもよいし、他のハードウェア構成であってもよい。
【００５５】
また、本実施の形態に示す手順により、本発明に係る回路設計支援方法を実現可能である。
【符号の説明】
【００５６】
１  半導体設計支援装置、２  高位合成装置、３  処理部、４  テーブル記憶部、５  ファイル記憶部。
【図１】
0005979966.tif 000002
【図２】
0005979966.tif 000003
【図３】
0005979966.tif 000004
【図４】
0005979966.tif 000005
【図５】
0005979966.tif 000006
【図６】
0005979966.tif 000007
【図７】
0005979966.tif 000008
【図８】
0005979966.tif 000009
【図９】
0005979966.tif 000010
【図１０】
0005979966.tif 000011
【図１１】
0005979966.tif 000012
【図１２】
0005979966.tif 000013
【図１３】
0005979966.tif 000014
【図１４】
0005979966.tif 000015