(57)【特許請求の範囲】
【請求項１】
（１）高水準言語コードの変換対象部分(translation-targeted section)をプログラミングディレクティブ(programming directive)を用いて表示する段階；
（２）前記高水準言語コードを前記変換対象部分をサブルーチンとして含むハードウェア部分コード及び前記高水準言語コードの残り部分と前記変換対象部分が前記サブルーチンを呼び出すためのラッパー(wrapper)に振り替えられた部分を含むソフトウェア部分コードに分割(partition)する段階； 
（３）前記ソフトウェア部分コード及びハードウェア部分コードをメインコンパイラによって前記メインコンパイラのターゲットアセンブリコード生成の直前段階の低水準IR(Intermediate Representation)コードにコンパイルし、前記ハードウェア部分コードに対応する前記低水準IRコードをHLL-to-HDL(High-level language code to hardware description language)変換機によってHDLコードに変換し、前記ソフトウェア部分コードに対応する前記低水準IRコードを実行できるコードにコンパイルする段階；及び
（４）前記ソフトウェア部分コードは、メインコアで実行されて、前記HDLコードは、専用ハードウェアで実行される段階とを含む高水準言語コードのHDLコードへの変換方法。
【請求項２】
前記（２）段階の前記ハードウェア部分コードは、前記高水準言語コードの一つ以上のサブルーチン(subroutine)/関数(function)を含み、前記ソフトウェア部分コードは、前記ハードウェア部分コードへのサブルーチン/関数呼び出し(call)ステートメント(statement)または呼び出し命令を含むことを特徴とする請求項１記載の高水準言語コードのHDLコードへの変換方法。
【請求項３】
前記（３）段階は： 
前記ソフトウェア部分コード及びハードウェア部分コードを前記メインコンパイラによって実行できるコードにコンパイルする段階；
前記メインコンパイラのリンカ(linker)によって一定のデータオフセット(constant data offset)を含むリンキング(linking)ログファイルを生成する段階；
前記メインコンパイラによって実行できるソフトウェアコードの全てのソフトウェア関数及び変数の住所を含むシンボルテーブル(symbol table)を生成する段階；及び
前記HLL-to-HDL変換機によって前記リンキングログファイル及びシンボルテーブルを参照して、前記ハードウェア部分コードのHDLコードを生成する段階を含むことを特徴とする請求項１に記載の高水準言語コードのHDLコードへの変換方法。
【請求項４】
前記HLL-to-HDL変換機は、前記ソフトウェア部分コードに定義されたソフトウェアの関数及び変数のアドレスレゾリューション(resolution)のために、前記リンキングログファイル及びシンボルテーブルを活用し、前記ハードウェア部分コードのストリングコンスタン(String constant)のアドレスレゾリューション(address resolution)のために、前記リンキングログファイル及びシンボルテーブルを活用することを特徴とする請求項３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項５】
前記高水準言語コードのサブルーチン(subroutine)/関数(function)から生成された前記HDLコードは：
ターゲットアセンブリコード生成と同一方式で前記低水準IRコードからHDLにマッピング(mapping)して生成されるデータパス(datapath)；及び
前記データパスを制御する制御ユニット(control unit)を含み、
前記制御ユニット(control unit)は前記低水準IRコードの複数のベーシックブロック(basic blocks)の間のコントロールフロー情報(control flow information)に基づいて、前記HLL-to-HDL(High-level language code to hardware description language)変換機のHDLコード生成器(HDL code generator)によって生成されることを特徴とする請求項１に記載の高水準言語コードのHDLコードへの変換方法。
【請求項６】
前記高水準言語コードのサブルーチン/関数のHDLへの変換方法は、
生成された前記HDLコードが一つ以上のブロックモジュールを前記データパスとして含み、トップモジュールを前記制御ユニットとして含むbasic-block-by-basic-block生成方法または、
生成された前記HDLコードが前記データパス及び前記制御ユニットを全て含む一つのモジュールを含むfunction-by-function生成方法の中でいずれか一つであることを特徴とする請求項５に記載の高水準言語コードのHDLコードへの変換方法。
【請求項７】
前記basic-block-by-basic-block生成方法の前記一つ以上のブロックモジュールは、前記低水準IRコードのベーシックブロック(basic blocks)と同一の機能を遂行し、
前記トップモジュールは、前記一つ以上のブロックモジュールのインスタンス(instances)を生成し、前記一つ以上のブロックモジュールを活性化(enabling)/非活性化(disabling)によって実行順序を定めることを特徴とする請求項６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項８】
前記basic-block-by-basic-block生成方法の前記ブロックモジュール及び前記トップモジュールは、有限状態機械(Finite State Machine)の形態であって、一つのブロックモジュールは、前記低水準IRコードのベーシックブロック内部の連続的(consecutive)低水準IRインストラクション(instructions)の一つのシーケンスを遂行する有限状態機械のステート(state)セット(set)であって、
有限状態機械のステートは、前記低水準IRインストラクションの遅延推定値(delay estimation)及びdata/control依存性に基づいたことを特徴とする請求項６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項９】
前記basic-block-by-basic-block生成方法の前記トップモジュールは、前記一つ以上のブロックモジュールの中の一つまたはその以上のブロックモジュールが動作できるようにすることが可能であって、前記ブロックモジュールの中の一つまたはその以上のブロックモジュールに入力を割り当てて作動させた後、作動された前記一つまたはその以上のブロックモジュールの動作が終わるまで待ち、作動された前記一つまたはその以上のブロックモジュールは、割り当てられた入力をもって自分のコードを実行し、自分のレジスタセットまたは他のブロックモジュールと共有するレジスタセットに出力を保存(buffer)した後、前記トップモジュールに制御フロー出力(Control Flow Outcome)と一緒にレジスタセットに保存された前記出力を提供(return)し、前記トップモジュールは、前記制御フロー出力に基づき、前記一つ以上のブロックモジュールの中で次に実行されるブロックモジュールを決定することを特徴とする請求項６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１０】
前記function-by-function生成方法の前記データパス及びハードウェア関数の制御ユニットは、一つのHDLモジュールに含まれ、一つの有限状態機械から構成(implement)され、
前記データパスは、前記有限状態機械の出力信号(output signals)を生成し、前記制御ユニットは、前記有限状態機械のステート変化(transition)を制御し、
前記データパスは、高水準言語のサブルーチン/関数における全てのベーシックブロックから生成され、前記高水準言語コードのサブルーチン/関数のベーシックブロックの低水準IRインストラクションから生成された有限状態機械の一つのセットであって、
有限状態機械のステートは、前記低水準IRインストラクションの遅延推定値(delay estimation)及びdata/control依存性に基づくことを特徴とする請求項６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１１】
前記function-by-function生成方法の前記制御ユニットは、高水準言語コードのサブルーチン/関数の制御フロー情報(control flow information)に基づき、前記有限状態機械のステートを変化させることによって、前記データパスを制御することを特徴とする請求項１０に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１２】
前記（３）段階の前記高水準言語コードから生成された前記HDLコードは、前記コンパイルされたソフトウェア部分コードとスタック(stack)を含むメモリ領域を共有して前記メインコアのソフトウェアスタックレイアウトに従い、
共有する前記メモリ領域は、スピルドバリュー(spilled value)の保存、レジスタファイル及びリターンアドレスの保存、前記ハードウェア部分コードとコンパイルされた前記ソフトウェア部分コードの間の関数アーギュメント(argument)の伝達に使われることを特徴とする請求項２に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１３】
前記（４）段階の専用ハードウェアは、前記高水準言語コードのサブルーチン/関数から各々生成され：
前記HLL-to-HDL変換機によってHWID(Hardware identification number、ハードウェア識別番号)が付与されたHWIP(Hardware Intellectual Properties)セット；及び
前記HWIPを制御するハードウェアコントローラ(hardware controller)を含み、
前記HWIDは、前記ソフトウェア部分コードと前記ハードウェア部分コードのシンボルテーブルに記述されたターゲットアドレスまたは前記ターゲットアドレスから再計算された固有番号であることを特徴とする請求項１に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１４】
前記ハードウェアコントローラは、前記HWIPと前記メインコアとの間にアーギュメント(arguments)を伝達することによって、前記HWIPを制御し、前記HWIPと前記メインコアとの間の呼び出し制御信号(calling control signals)を通じて前記HWIPとメインコアの実行順序を制御し、
前記ハードウェアコントローラは、前記HWIPと前記メインコアで実行されるソフトウェアとの間の呼び出しシーケンスによって一つ以上のHWIPまたはメインコアを活性化させ、
前記メインコアが前記ハードウェアコントローラとして使えられることを特徴とする請求項１３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１５】
前記（４）段階の前記メインコアと前記専用ハードウェアとの間の通信インターフェースは、
前記メインコアと前記専用ハードウェアが緩く(loosely)連結(coupled)され、前記専用ハードウェアが前記メインコアとインタラプティング(interrupting)によって通信する疎結合(loose coupling)、または、
前記メインコアと前記専用ハードウェアが固く(tightly)連結され、前記専用ハードウェアと前記メインコアが制御信号を互いに直接取り交わすことのできる密結合(tight coupling)であることを特徴とする請求項１に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１６】
前記（４）段階は：
コンパイルされた前記ソフトウェア部分コードを前記メインコアで実行する段階；
コンパイルされた前記ソフトウェア部分コードが実行される間に一つ以上の前記HWIPの実行が必要である場合、前記メインコアによって前記専用ハードウェアの前記ハードウェアコントローラを活性化させ、呼び出しデータを伝送する段階；
前記専用ハードウェアの前記ハードウェアコントローラによって対象となる一つ以上の前記HWIPを活性化させて呼び出しデータを伝送する段階；
活性化された前記HWIPのコードを実行し、実行結果をメモリとシステムレジスタとに保存し、活性化された前記一つ以上のHWIPの実行終了を前記ハードウェアコントローラに通知する段階；
前記ハードウェアコントローラによって活性化された前記一つ以上のHWIPの実行終了を前記メインコアに通知する段階；及び
前記メインコアによって前記メモリとシステムレジスタとに保存された実行結果をもって前記コンパイルされたソフトウェア部分コードを引き続き実行する段階を含むことを特徴とする請求項１３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１７】
前記メインコアから前記専用ハードウェアに伝送される前記呼び出しデータは：
スタックポインタ、リンクレジスタ、アーギュメントレジスタ及び前記メインコアに依存する他のレジスタを含むシステムレジスタ；及び
対象となる一つ以上の前記HWIPのHWID及び活性信号(enable signal)を含む制御信号を含むことを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１８】
対象となる一つ以上の前記HWIPのアーギュメントは、前記メインコアからシステムレジスタのアーギュメント及び前記HDLコードとコンパイルされた前記ソフトウェア部分コードとの間に共有するスタックスペースを用いて伝送されることを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項１９】
前記（４）段階の前記メインコアは、
前記メインコアと前記専用ハードウェアとが密結合(tight coupling)である場合には、前記メインコアのISA(Instruction Set Architecture)の専用インストラクションを用いて前記専用ハードウェアと通信したり、制御信号を伝送し、
前記メインコアと前記専用ハードウェアとが疎結合(loose coupling)である場合には、通信機能を遂行するAPI関数媒介体を呼び出す(calling)ことによって、前記専用ハードウェアと通信したり、制御信号を伝送することを特徴とする請求項１に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２０】
前記メインコアと前記専用ハードウェアとが疎結合である場合、前記ハードウェアコントローラを活性化する場合、前記メインコアは、自分のレジスタ値でハードウェアのレジスタをアップデートすることを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２１】
前記ハードウェアコントローラによって前記専用ハードウェアのHWIPセットの中のいずれか一つが活性化される場合、活性化された前記HWIPは、
前記メインコアと前記専用ハードウェアとが密結合である場合には、前記メインコアからデータを直接読み込み、
前記メインコアと前記専用ハードウェアとが疎結合である場合には、前記ハードウェアコントローラのレジスタ値を読み込むことを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２２】
前記専用ハードウェアの前記ハードウェアコントローラは、活性化された前記HWIPの実行完了において、
前記メインコアと前記専用ハードウェアとが疎結合である場合には、前記メインコアをインタラプティング(interrupting)することによって前記メインコアに通知し、
前記メインコアと前記専用ハードウェアとが密結合である場合には、制御信号を前記メインコアに伝送することによって、前記メインコアに通知することを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２３】
前記専用ハードウェアの前記HWIPは、前記メインコアで実行中のコンパイルされた前記ソフトウェア部分コードへのクロスコール(cross call)を遂行することが可能であって、
前記クロスコール遂行は：
前記HWIPによって前記ハードウェアコントローラにコンパイルされた前記ソフトウェアを呼び出す(call)必要があることを知らせるための呼び出しデータ(calling data)を準備し、制御信号(control signal)を伝送する段階；
前記ハードウェアコントローラによって前記メインコアに前記クロスコールについて通知する段階；
前記メインコアによって前記呼び出しデータを前記メインコアのレジスタにコピーし、 呼び出された前記コンパイルされたソフトウェア部分コードのコードを実行し、呼び出された前記コンパイルされたソフトウェア部分コードの実行が完了される場合、これを前記ハードウェアコントローラに通知する段階；
前記ハードウェアコントローラによって呼び出された前記コンパイルされたソフトウェア部分コードの実行完了について、呼び出した前記HWIPに通知する段階；及び
前記HWIPによって呼び出された前記コンパイルされたソフトウェア部分コードの実行結果をもって自分のコードを引き続き実行する段階を含むことを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２４】
前記HWIPから前記制御信号(control signal)を受信する場合、前記ハードウェアコントローラは、
前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記メインコアをインタラプティング(interrupting)することによって、前記クロスコールについて前記メインコアに通知し、
前記メインコアと前記ハードウェアコントローラとが密結合の場合には、前記制御信号を前記メインコアに直接伝送することによって、前記クロスコールについて前記メインコアに通知することを特徴とする請求項２３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２５】
呼び出された前記コンパイルされたソフトウェア部分コードの実行が完了されると、
前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記メインコアは、前記ハードウェアコントローラのシステムレジスタ値で自分のレジスタをアップデートし、前記ソフトウェア部分コードのリターン値及びリターンアドレスを前記ハードウェアコントローラのレジスタに記入(write)し、
前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記メインコアは、呼び出す前記HWIPから入力値を直接読み込むことを特徴とする請求項２３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２６】
前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記HWIPは、呼び出された前記コンパイルされたソフトウェア部分コードのリターンデータ及びリターンアドレスを前記ハードウェアコントローラのシステムレジスタから読み込み、
前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記HWIPは、前記コンパイルされたソフトウェア部分コードのリターンデータ及びリターンアドレスを前記メインコアのレジスタ値から直接読み込むことを特徴とする請求項２３に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２７】
前記専用ハードウェアのいずれか一つの前記HWIPは、他のHWIPまたは自分自身への呼び出し(call)が遂行可能であって、
前記呼び出しは：
前記いずれか一つのHWIPによって前記ハードウェアコントローラに呼び出す(call)必要があることを知らせるための呼び出しデータ(calling data)を準備し、制御信号(control signal)を伝送する段階；
前記ハードウェアコントローラによって呼び出しアドレスを検査(examining)し、前記他のHWIPまたは前記いずれか一つのHWIPを活性化する段階；
前記他のHWIPまたは前記いずれか一つのHWIPによって自分のレジスタに前記呼び出しデータ(calling data)をコピーし、自分のコードを実行し、実行完了の時、これを前記ハードウェアコントローラに通知する段階；
前記ハードウェアコントローラによって呼び出された前記他のHWIPまたは前記いずれか一つのHWIPの実行完了について前記いずれか一つのHWIPに通知する段階；及び
前記いずれか一つのHWIPによって呼び出された前記他のHWIPまたは前記いずれか一つのHWIPの実行結果をもって自分のコードを引き続き実行する段階を含むことを特徴とする請求項１６に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２８】
前記呼び出しデータは：
スタックポインタ、リンクレジスタ、アーギュメントレジスタ、リターンレジスタを含むシステムレジスタ；及び
呼び出しの対象の前記他のHWIPまたは自分自身のアドレス及び活性信号(enable signal)を含む制御信号を含み、
前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、呼び出しの対象の前記他のHWIPまたは前記いずれか一つのHWIPを呼び出す前に、前記いずれか一つのHWIPによって前記呼び出しデータで前記ハードウェアコントローラの内部の共有する前記システムレジスタをアップデートすることを特徴とする請求項２７に記載の高水準言語コードのHDLコードへの変換方法。
【請求項２９】
前記他のHWIPのアーギュメントは、アーギュメントレジスタ及び前記複数のHWIPらの間に共有するスタックスペースを通じて前記いずれか一つのレジスタから伝送されることを特徴とする請求項２７に記載の高水準言語コードのHDLコードへの変換方法。
【請求項３０】
前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記他のHWIPは活性化された場合、前記ハードウェアコントローラの内部のシステムレジスタで自分のレジスタをアップデートし、
前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記他のHWIPは活性化された場合、前記いずれか一つのHWIPのレジスタ値を直接読み込むことを特徴とする請求項２７に記載の高水準言語コードのHDLコードへの変換方法。
【請求項３１】
前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、前記他のHWIPは実行完了の時、自分のリターン値(value)及びリターンアドレスを前記ハードウェアコントローラの内部のレジスタに記入(write)することを特徴とする請求項２７に記載の高水準言語コードのHDLコードへの変換方法。
【請求項３２】
前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、前記いずれか一つのHWIPは、前記他のHWIPのリターン値(value)及びリターンアドレスを前記ハードウェアコントローラの内部のレジスタから読み込み、
前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記いずれか一つのHWIPは、前記他のHWIPのリターン値(value)及びリターンアドレスを前記他のHWIPのレジスタから直接読み込むことを特徴とする請求項２７に記載の高水準言語コードのHDLコードへの変換方法。
【請求項３３】
プログラミングディレクティブがと表示された(marked with programming directive)変換対象高水準言語コードから前記プログラミングディレクティブを読み込んだ後、前記変換対象高水準言語コードを前記プログラミングディレクティブが表示された部分をサブルーチンとして含むハードウェア部分コードと前記高水準言語コードの前記プログラミングディレクティブが表示された部分を除外した残り部分と前記プログラミングディレクティブが表示された部分が前記サブルーチンを呼び出すためのラッパーに振り替えられた部分を含むソフトウェア部分コードとに分割するHLL-to-HLLソース変換機；
前記ソフトウェア部分コード及びハードウェア部分コードをコンパイルするメインコンパイラ； 
前記ハードウェア部分コードをデータパス及びコントロールユニットを含むHDLコードに変換するHLL-to-HDL変換機；
コンパイルされた前記ソフトウェア部分コードを実行するメインコア；及び
前記メインコアと連動して変換された前記HDLコードを実行する専用ハードウェアを含みながら、
前記HLL-to-HDL変換機は、フロントエンド(front end)及びミドルエンド(middle end)とHDLバックエンド(backend)とを含み、
前記HLL-to-HDL変換機のフロントエンド(front end)及びミドルエンド(middle end)は前記メインコンパイラのフロントエンド(front end)及びミドルエンド(middle end)と同一で、前記HLL-to-HDL変換機は自然的に(natuarally)HDLコード生成の過程でコンパイルされた前記ソフトウェア部分コードのリンケージ規約(linkage convention）に従い、
前記HDLバックエンドは：
シンタックス(syntax)がHDLシンタックスとセマンティクス(semantics)に従い、低水準IRコードをHDLにマッピングするマシン記述ファイル(machine description file)；及び
HDLコードジェネレーター(generator)を含むことを特徴とする高水準言語コードのHDLコードへの変換システム 。
【請求項３４】
前記HLL-to-HDL変換機の前記フロントエンド及びミドルエンドは、前記ハードウェア部分コードを低水準IRコードに変換し、前記HLL-to-HDL変換機の前記HDLバックエンドは、前記低水準IRコードをHDLコードに変換することを特徴とする請求項３３に記載の高水準言語コードのHDLコードへの変換システム 。
【請求項３５】
前記高水準言語コードのサブルーチン/関数に該当する前記HDLコードの生成は、
生成された前記HDLコードが一つ以上のブロックモジュールを前記データパスとして含み、トップモジュールを前記コントロールユニットとして含むbasic-block-by-basic-block生成方法、または
生成された前記HDLコードが前記データパス及び前記コントロールユニットを全て含む一つのモジュールを含むfunction-by-function生成方法の中のいずれか一つであることを特徴とする請求項３３に記載の高水準言語コードのHDLコードへの変換システム 。
【請求項３６】
前記HDLコードのハードウェア関数の前記データパスは、前記HDLバックエンドのマシン記述ファイルによって前記低水準IRコードから直接生成され、
前記HDLコードのハードウェア関数のコントロールユニットは、前記HDLコードジェネレーターによって前記低水準IRコードの複数のベーシックブロックらの間のコントロール依存性に基づいて生成され、
前記データパス及び前記コントロールユニットは、有限状態機械(FSM)の形態であることを特徴とする請求項３３に記載の高水準言語コードのHDLコードへの変換システム 。
【請求項３７】
前記basic-block-by-basic-block生成方法の場合、 
前記ブロックモジュールは、連続的な低水準IRコードインストラクションのシーケンスから生成された有限状態機械のセット(set)であって、
前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ/コントロール依存性に基づいてなって、
前記ブロックモジュールは、前記低水準IRコードのベーシックブロックと同一機能を遂行し、
前記トップモジュールは、前記ブロックモジュールを活性化/非活性化さて、前記ブロックモジュールの実行順序を定めることを特徴とする請求項３５に記載の高水準言語コードのHDLコードへの変換システム 。
【請求項３８】
前記basic-block-by-basic-block生成方法の場合、
前記トップモジュールが一回に一つまたはその以上のブロックモジュールが動作するように、前記一つ以上のブロックモジュールの中の一つまたはその以上のブロックモジュールに入力を割り当てて活性化させた後、活性化された前記一つまたはその以上のブロックモジュールの実行が終わるまで待ち、
活性化された前記一つまたはその以上のブロックモジュールは、割り当てられた入力をもって自分のコードを実行し、自分のレジスタセットに出力を保存(buffer)した後、前記トップモジュールに制御フロー出力(Control Flow Outcome)と一緒にレジスタセットに保存された前記出力を提供(return)し、
前記トップモジュールは、前記制御フロー出力に基づいて前記一つ以上のブロックモジュールの中で次に実行されたブロックモジュールを決定することを特徴とする請求項３５に記載の高水準言語コードのHDLコードへの変換システム。
【請求項３９】
前記function-by-function生成方法の場合、
前記高水準言語コードのサブルーチン/関数に該当する生成された前記HDLコードの前記データパス及び前記コントロールユニットは、一つのモジュールに含まれ、有限状態機械と具現(implement)され、
前記データパスは、前記有限状態機械の出力ロジック(output logic)を生成し、前記コントロールユニットは、前記有限状態機械のステート変移(transition)を制御し、
前記データパスは、前記高水準言語コードのサブルーチン/関数の全てのベーシックブロックの低水準IRコードインストラクションの連続的シーケンスから生成され、
前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ/コントロール依存性に基づいてなることを特徴とする請求項３５に記載の高水準言語コードのHDLコードへの変換システム 。
【請求項４０】
HLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステムにおいて、
前記HLL-to-HDL変換機はフロントエンド及びミドルエンドとHDLバックエンドとを含み、
前記フロントエンド及びミドルエンドは前記高水準言語コードのコンパイルに活用されるメインコンパイラのフロントエンド及びミドルエンドと同一であり、
前記 HDLバックエンドは：
HDLシンタックスとセマンティクスに従うシンタックスを有し、ターゲットアセンブリコード(target assembly code)生成と同一方式で低水準IRコードをHDLコードにマッピングする変換機；及び
前記メインコンパイラのフロントエンド及びミドルエンドによって前記高水準言語コードから前記ターゲットアセンブリコード生成の直前に変換された低水準IRコードから前記HDLコードを生成するHDLジェネレーター(generator)を含むことを特徴とするHLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステム。
【請求項４１】
前記HLL-to-HDL変換機によって前記高水準言語コードのサブルーチン/関数から生成された前記HDLコードは、データパス及びコントロールユニットを含み、
前記データパス及び前記コントロールユニットは、有限状態機械の形態で具現されることを特徴とする請求項４０に記載のHLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステム。
【請求項４２】
basic-block-by-basic-block生成方法の場合、前記HDLコードは、前記高水準言語コードのサブルーチン/関数から生成された一つまたはその以上のブロックモジュールを前記データパスとして含み、トップモジュールをコントロールユニットとして含み、
function-by-function生成方法の場合、前記HDLコードは、データパス及び前記コントロールユニットの両者を全て含む一つのモジュールを含むことを特徴とする請求項４１に記載のHLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステム。
【請求項４３】
前記basic-block-by-basic-block生成方法の場合、前記データパスは、一つまたはその以上のブロックモジュールを含み、前記ブロックモジュールは、ベーシックブロックの低水準IRコードインストラクションから生成される有限状態機械のセットであって、
前記function-by-function生成方法の場合、前記データパスは、前記高水準言語コードのサブルーチン/関数の全てのベーシックブロックの低水準IRコードインストラクションから生成される有限状態機械のセットであって、
前記二つの方法全てにおいて、前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ依存性に基づいてなることを特徴とする請求項４２に記載のHLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、C、C＋＋、フォートラン、ジャバなどのような高水準言語コードをVerilog及びVHDLのようなHDLコードに変換する方法及びシステムに関するものであって、より具体的には、高水準言語コードのコンパイラに付け加わえられるHDLバックエンド(Back End)を用いて高水準言語からなるコードをHDL(Hardware Description Language)コードに変換した後、変換されたHDLコードを論理合成し、メインコアと連動されるようにすることによって、応用プログラムの速度を向上させることができる高水準言語コードをHDLコードに変換する方法及びシステムに関する。また、専用ハードウェアで実行される変換されたHDLコードと、メインコアで実行されるソフトウェアコードとの間のクロスコール及びハードウェア内部での再帰呼び出し(recursive call)のためのフレームワークに関する。
【背景技術】
【０００２】
過去数十年の間、デジタル回路の設計は、半導体の製造技術の急激な発展によって速く進化してきた。初期のデジタル回路は、真空管とトランジスターとから設計され、一つのチップの上に論理回路を集積した集積回路(IC、Integrated Circuit)がその後に続いた。技術の発展によって、論理回路(Gate)の数がとても少なかったSSI(Small Scale Integration)からMSI(Medium Scale Integration)、チップの上に数千個のGateを集積しなけばならないLSI(Large Scale Integration)、及びLSIの複雑性よりずっと大きな複雑性を有するVLSI(Very Large Scale Integration)技術に発展した。以後、汎用プロセッサー(General Purpose Processor)、DSPs(Digital Signal Processors)、及びASICs(Application Specific Integrated Circuit)等のようなVLSIは徐々により活用されている。
【０００３】
Fortran、Pascal、Cのようなプログラミング言語は、長い間、順次的に動作するコンピュータープログラムの記述に使われた。これと同じく、デジタル回路の設計者達は、デジタル回路を記述することのできる標準化された言語の必要性を感じてきて、これによって作られたのが、HDL(Hardware Description Language)である。HDLは、ハードウェアの特性と合う同時発生の過程を記述することができて、代表的HDLがVerilogHDLとVHDLである。Verilog HDLはGateway Design Automationから始まって、VHDLはDARPA(アメリカ国防高等研究計画局)の支援で開発された。デジタル回路の開発者達はデジタルシステムの発展のためにHDLを活用し、設計されたHDLコードはHDLコンパイラによって合成(synthesize)された。
【０００４】
現在、多くのシステム開発者達はマイクロプロセッサーより、ワット当たりの性能が優れる点及びASICより設計の柔軟性を有するため、FPGA(Field Programmable Gate Array)を自分達の開発プラットフォームに加える必要性を感じており、時々汎用プロセッサーまたはDSPsをFPGAに取り替えて活用している。しかし、HDLコードを用いてFPGAを活用するためには、ハードウェア設計における多くの知識が要求され、これによってたいていのソフトウェア開発者達のFPGAの活用にあたって、現実的に困難がある。従って、ハードウェアの構成における心配なしに、概念的水準の言語である高水準言語コードをもってハードウェアシステムを開発する必要性が増えており、このため、一般的に活用される高水準言語コードをHDLコードに変換するツールの必要性が増えている。 
【０００５】
従って、このような問題を解決するために、従来のソフトウェアレベルの言語コードをHDLコードに変換してくれるツール乃至方法について多くの研究が行われてきた。しかし、高水準言語コードをHDLコードに変換することにおいて、ハードウェアとソフトウェアとのプログラミングに概念的に大きな差が存在し、これによってポインタ、二次元アレーなどのソフトウェア言語の全てのsyntaxをHDL言語で表現することに大きな困難があるため、従来のツール乃至方法は、単にSystemC、SA-CまたはStreams-Cのようなシステムレベル言語コードのHDLコードへの変換のみを支援するか、または高水準言語のHDLへの直接変換を支援しても、ただ高水準言語からなるsyntaxの一部分のみを直接変換するだけで、多くの限界点を有していた。
【０００６】
さらに、ハードウェアとソフトウェアにおけるコード生成での差異点のため、ソフトウェアとハードウェアとの間のクロスコール(cross call)乃至ハードウェア内部での再帰呼び出し(recursive call)を支援しない問題点があった。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
前記のような問題点を解決するための本発明の目的は、変換対象高水準言語コードにおける修正がなくても、全ての高水準言語のsyntax及びsemanticsが変換可能であって、メインコンパイラが支援する全ての高水準言語コードをHDLコードに変換する方法を提供する。
【０００８】
本発明の他の目的は、ソフトウェアのメインコンパイラが支援する全ての高水準言語コードの全てのsyntax及びsemanticsをHDLコードに変換して、同時に高水準言語からなるコードに使う全ての最適化(optimization)が活用できるHLL-to-HDL(High-Level Language Code to HDLCode)変換機を提供する。
【０００９】
本発明のまた他の目的は、メインコアで実行されるソフトウェアコードと、専用ハードウェアで実行されるHDLコードとの間にcross call及び専用ハードウェアで実行されるHDLコードとの間の再帰呼び出し(recursive call)を制限なく支援するコンパイル(compilaton)及び実行(execution)フレームワーク(framework)を提供する。
【課題を解決するための手段】
【００１０】
前記の目的を達成するための本発明の一実施例によると、（１）高水準言語コードの変換対象部分(translation-targeted section)をプログラミングディレクティブ(programming directive)を用いて表示する段階；（２）表示された前記高水準言語コードの変換対象部分をハードウェア部分コード及び前記高水準言語コードの残り部分をソフトウェア部分コードに分割(partition)する段階；（３）前記ソフトウェア部分コード及びハードウェア部分コードをメインコンパイラによってコンパイルし、前記ハードウェア部分コードをHLL-to-HDL(High-level language code to hardware description language)変換機によってHDLコードに変換される段階；及び（４）前記ソフトウェア部分コードはメインコアで実行され、前記HDLコードは専用ハードウェアで実行される段階とを含む高水準言語コードのHDLコードへの変換方法を提供する。
【００１１】
好ましい実施例として、前記（２）段階の前記ハードウェア部分コードは、前記変換対象高水準言語コードの一つ以上のサブルーチン(subroutine)/関数(function)を含み、前記ソフトウェア部分コードは、前記ハードウェア部分コードへのサブルーチン/関数呼び出し(call)ステートメント(statement)または呼び出し命令を含むことを特徴とする。
【００１２】
また、前記（３）段階は：前記ソフトウェア部分コード及びハードウェア部分コードをメインコンパイラによって実行できるコードにコンパイルする段階；前記メインコンパイラリンカ(linker)によって一定のデータオフセット(constant data offset)を含むリンキング(linking)ログファイルを生成する段階；前記メインコンパイラによって実行できるソフトウェアコードの全てのソフトウェア関数及び変数の住所を含むシンボルテーブル(symbol table)を生成する段階；及び前記HLL-to-HDL変換機によって前記リンキングログファイル及びシンボルテーブルを参照して前記ハードウェア部分コードのHDLコードを生成する段階を含むことを特徴とする。
【００１３】
また、前記HLL-to-HDL変換機は、前記ソフトウェア部分コードに定義されたソフトウェアの関数及び変数の住所レゾリューション(resolution)のために、前記リンキングログファイル及びシンボルテーブルを活用して、前記ハードウェア部分コードのストリングコンスタント(String constant)等の住所レゾリューション(address resolution)のために前記リンキングログファイル及びシンボルテーブルを活用することを特徴とする。 
【００１４】
また、前記（３）段階の前記HLL-to-HDL変換機による前記ハードウェア部分コードのHDLコードへの変換は：前記ハードウェア部分コードを前記メインコンパイラのターゲットアセンブリコード生成の直前段階の低水準IR(Intermediate Representation)コードに変換する段階；及び前記低水準IRコードをHDLコードに変換する段階を含み、前記変換は、前記メインコアの標準呼出リンケージ規約(standard call linkage convention)を保持することを特徴とする。
【００１５】
また、前記高水準言語コードのサブルーチン(subroutine)/関数(function)から生成された前記HDLコードは：ターゲットアセンブリコード生成と同一方式で前記低水準IRコードからHDLにマッピング(mapping)して生成されるデータパス(datapath)；及び前記低水準IRコードのベーシックブロックら(basic blocks)の間のコントロールフロー情報(control flow information)に基づいて、前記HDLバックエンドの内部のHDLコード生成器(HDLcode generator)によって生成され、前記データパスを制御する制御ユニット(control unit)を含むことを特徴とする。
【００１６】
また、前記高水準言語コードのサブルーチン/関数のHDLへの変換方法は、生成された前記HDLコードが一つ以上のブロックモジュールを前記データパスとして含み、トップモジュールを前記制御ユニットとして含むbasic-block-by-basic-block生成方法または生成された前記HDLコードが前記データパス及び前記制御ユニットを全て含む一つのモジュールを含むfunction-by-function生成方法の中のいずれか一つであることを特徴とする。
【００１７】
また、前記basic-block-by-basic-blockコード生成方法の前記一つ以上のブロックモジュールは、前記低水準IRコードのベーシックブロック(basic blocks)と同一機能を遂行し、前記トップモジュールは、前記一つ以上のブロックモジュールのインスタンス(instances)を生成し、前記一つ以上のブロックモジュールを活性化(enabling)/非活性化(disabling)によって実行順序を定めることを特徴とする。
【００１８】
また、前記basic-block-by-basic-blockコード生成方法の前記ブロックモジュール及び前記トップモジュールは、有限状態機械(Finite State Machine)の形態であって、一つのブロックモジュールは、前記低水準IRコードのベーシックブロックの内部の連続的(consecutive)低水準IRインストラクション(instructions)の一つのシーケンスを遂行する有限状態機械のステート(state)セット(set)であって、有限状態機械のステートは、前記低水準IRインストラクションの遅延推定値(delay estimation)及びdata/control依存性に基づくことを特徴とする。
【００１９】
また、前記basic-block-by-basic-blockコード生成方法の前記トップモジュールは、前記一つ以上のブロックモジュールの中の一つまたはその以上のブロックモジュールが動作するようにすることができて、前記ブロックモジュールの中の一つまたはその以上のブロックモジュールに入力を割り当てて作動させた後、作動された前記一つまたはその以上のブロックモジュールの動作が終わるまで待ち、作動された前記一つまたはその以上のブロックモジュールは、割り当てられた入力をもって自分のコードを実行し、自分のレジスタセットまたは他のブロックモジュールと共有するレジスタセットに出力を保存(buffer)した後、前記トップモジュールに制御フロー出力(Control Flow Outcome)と一緒にレジスタセットに保存された前記出力を提供(return)し、前記トップモジュールは前記制御フロー出力に基づいて前記一つ以上のブロックモジュールの中で次に実行されるブロックモジュールを決定することを特徴とする。
【００２０】
また、前記function-by-functionコード生成方法の前記データパス及びハードウェア関数の制御ユニットは、一つのHDLモジュールに含まれて、一つの有限状態機械から構成(implement)され、前記データパスは、前記有限状態機械の出力信号(output signals)を生成し、前記制御ユニットは、前記有限状態機械のステート変化(transition)を制御し、前記データパスは、高水準言語のサブルーチン/関数における全てのベーシックブロックから生成され、前記高水準言語コードのサブルーチン/関数のベーシックブロックの低水準IRインストラクションから生成された有限状態機械の一つのセットであって、有限状態機械のステートは、前記低水準IRインストラクションの遅延推定値(delay estimation)及びdata/control依存性に基づくことを特徴とする。
【００２１】
また、前記function-by-functionコード生成方法の前記制御ユニットは、高水準言語コードのサブルーチン/関数の制御フロー情報(control flow information)に基づいて前記有限状態機械のステートを変化させることによって、前記データパスを制御することを特徴とする。
【００２２】
また、前記（３）段階の前記高水準言語コードから生成された前記HDLコードは、前記コンパイルされたソフトウェアコードとスタック(stack)とを含むメモリ領域を共有し、前記メインコアのソフトウェアスタックレイアウトを従い、共有する前記メモリ領域は、スピルドバリュー(spilled value)の保存、レジスタファイル及びリターンアドレスの保存、前記ハードウェアコードとコンパイルされた前記ソフトウェア部分コードとの間の関数アーギュメント(argument)の伝達等に使われることを特徴とする。
【００２３】
また、前記（４）段階の専用ハードウェアは、前記高水準言語コードのサブルーチン/関数から各々生成され：前記HLL-to-HDL変換機によってHWID(Hardware identification number、ハードウェア識別番号)が付与されたHWIP(Hardware Intellectual Properties)セット；及び前記HWIPを制御するハードウェアコントローラ(hardware controller)を含み、前記HWIDは、前記ソフトウェア部分コードと前記ハードウェア部分コードのシンボルテーブルに記述されたターゲットアドレスまたは前記ターゲットアドレスから再計算された固有番号であることを特徴とする。
【００２４】
また、前記ハードウェアコントローラは、前記HWIPらと前記メインコアとの間にアーギュメント(arguments)を伝達することによって前記HWIPらを制御し、前記HWIPらとメインコアとの間の呼び出し制御信号(calling control signals)を通じて前記HWIPらとメインコアの実行順序を制御し、前記ハードウェアコントローラは、前記HWIPらと前記メインコアで実行されるソフトウェアとの間の呼び出しシーケンスによって一つ以上のHWIPらまたはメインコアを活性化させ、前記メインコアが前記ハードウェアコントローラとして使われることを特徴とする。
【００２５】
また、前記（４）段階の前記メインコアと前記専用ハードウェアとの間の通信インターフェースは、前記メインコアと前記専用ハードウェアが緩く(loosely)連結(coupled)されて、前記専用ハードウェアが前記メインコアとインタラプティング(interrupting)によって通信する疎結合(loose coupling)、または前記メインコアと前記専用ハードウェアが固く(tightly)連結されて、前記専用ハードウェアと前記メインコアが制御信号を互いに直接取り交すことができる密結合(tight coupling)であることを特徴とする。
【００２６】
また、前記（４）段階は：コンパイルされた前記ソフトウェア部分コードを前記メインコアで実行する段階；前記コンパイルされたソフトウェア部分コードが実行される間に一つ以上の前記HWIPの実行が必要である場合、前記メインコアによって前記専用ハードウェアの前記ハードウェアコントローラを活性化させて呼び出し(calling)データを伝送する段階；前記専用ハードウェアの前記ハードウェアコントローラによって対象となる一つ以上の前記HWIPを活性化させて呼び出しデータを伝送する段階；活性化された前記HWIPのコードを実行し、実行結果をメモリとシステムレジスタに保存し、活性化された前記一つ以上のHWIPの実行終了を前記ハードウェアコントローラに通知する段階；前記ハードウェアコントローラによって活性化された前記一つ以上のHWIPの実行終了を前記メインコアに通知する段階；及び前記メインコアによって前記アップデートされたデータをもって前記コンパイルされたソフトウェア部分コードを引き続き実行する段階を含むことを特徴とする。 
【００２７】
また、前記メインコアから前記専用ハードウェアに伝送される前記呼び出しデータは：スタックポインタ、リンクレジスタ、アーギュメントレジスタ及び前記メインコアに依存する他のレジスタを含むシステムレジスタ；及び対象となる一つ以上の前記HWIPのHWID及び活性信号(enable signal)を含む制御信号を含むことを特徴とする。
【００２８】
また、対象となる一つ以上の前記HWIPのアーギュメントは、前記メインコアからシステムレジスタのアーギュメント及び前記HDLコードとコンパイルされた前記ソフトウェアコードとの間に共有するスタックスペースを用いて伝送されることを特徴とする高水準言語コードのHDLコードへの変換方法。
【００２９】
また、前記（４）段階の前記メインコアは、前記メインコアと前記専用ハードウェアとが密結合(tight coupling)である場合には、前記メインコアのISA(Instruction Set Architecture)の専用インストラクションを用いて前記専用ハードウェアと通信するか、制御信号を伝送し、前記メインコアと前記専用ハードウェアとが疎結合(loose coupling)である場合には、通信機能を遂行するAPIファンクション媒介体を呼び出す(calling)ことによって、前記専用ハードウェアと通信するか、制御信号を伝送することを特徴とする。
【００３０】
また、前記メインコアと前記専用ハードウェアとが疎結合である場合、前記ハードウェアコントローラを活性化する場合、前記メインコアは、自分のレジスタ値でハードウェアのレジスタをアップデートすることを特徴とする。
【００３１】
また、前記ハードウェアコントローラによって前記専用ハードウェアのHWIPのいずれか一つが活性化される場合、活性化された前記HWIPは、前記メインコアと前記専用ハードウェアが密結合である場合には、前記メインコアからデータを直接読み込み、前記メインコアと前記専用ハードウェアとが疎結合である場合には、前記ハードウェアコントローラのレジスタ値を読み込むことを特徴とする。
【００３２】
また、前記専用ハードウェアの前記ハードウェアコントローラは、活性化された前記HWIPの実行完了において、前記メインコアと前記専用ハードウェアとが疎結合である場合には、前記メインコアをインタラプティング(interrupting)することによって前記メインコアに通知し、前記メインコアと前記専用ハードウェアとが密結合である場合には、制御信号を前記メインコアに伝送することによって前記メインコアに通知することを特徴とする。
【００３３】
また、前記専用ハードウェアの前記HWIPは、前記メインコアで実行中のコンパイルされた前記ソフトウェア部分コードへのクロスコール(cross call)が遂行可能であって、前記クロスコール遂行は：前記HWIPによって前記ハードウェアコントローラにコンパイルされた前記ソフトウェアを呼び出す(call)必要があることを知らせるための呼び出しデータ(calling data)を準備して制御信号(control signal)を伝送する段階；前記ハードウェアコントローラによって前記メインコアに前記クロスコールについて通知する段階；前記メインコアによって前記呼び出しデータを前記メインコアのレジスタにコピーし、呼び出された前記コンパイルされたソフトウェア部分コードのコードを実行し、呼び出された前記コンパイルされたソフトウェア部分コードの実行が完了される場合、これを前記ハードウェアコントローラに通知する段階；前記ハードウェアコントローラによって呼び出された前記コンパイルされたソフトウェア部分コードの実行完了について呼び出した前記HWIPに通知する段階；及び前記HWIPによって呼び出された前記コンパイルされたソフトウェア部分コードの実行結果をもって自分のコードを引き続き実行する段階を含むことを特徴とする。
【００３４】
また、前記HWIPから前記制御信号(control signal)を受信する場合、前記ハードウェアコントローラは、前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記メインコアをインタラプティング(interrupting)することによって、前記クロスコールについて前記メインコアに通知し、前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記制御信号を前記メインコアに直接伝送することによって、前記クロスコールについて前記メインコアに通知することを特徴とする。
【００３５】
また、呼び出された前記コンパイルされたソフトウェア部分コードの実行が完了されると、前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記メインコアは、前記ハードウェアコントローラのシステムレジスタ値で自分のレジスタをアップデートし、前記ソフトウェア部分コードのリターン値及びリターンアドレスを前記ハードウェアコントローラのレジスタに記入(write)し、前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記メインコアは、呼び出す前記HWIPから入力値を直接読み込むことを特徴とする。
【００３６】
また、前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記HWIPは、呼び出された前記コンパイルされたソフトウェア部分コードのリターンデータ及びリターンアドレスを前記ハードウェアコントローラのシステムレジスタから読み込み、前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記HWIPは前記コンパイルされたソフトウェア部分コードのリターンデータ及びリターンアドレスを前記メインコアのレジスタ値から直接読み込むことを特徴とする。
【００３７】
また、前記専用ハードウェアのいずれか一つの前記HWIPは、他のHWIPまたは自分自身への呼び出し(call)が遂行可能であって、前記呼び出しは：前記いずれか一つのHWIPによって前記ハードウェアコントローラに呼び出す(call)必要があることを知らせるための呼び出しデータ(calling data)を準備し、制御信号(control signal)を伝送する段階；前記ハードウェアコントローラによって呼び出しアドレスを検査(examining)し、前記他のHWIPまたは前記いずれか一つのHWIPを活性化する段階；前記他のHWIPまたは前記いずれか一つのHWIPによって自分のレジスタに前記呼び出しデータ(calling data)をコピーし、自分のコードを実行し、実行完了の時、これを前記ハードウェアコントローラに通知する段階；前記ハードウェアコントローラによって呼び出された前記他のHWIPまたは前記いずれか一つのHWIPの実行完了について、前記いずれか一つのHWIPに通知する段階；及び前記いずれか一つのHWIPによって呼び出された前記他のHWIPまたは前記いずれか一つのHWIPの実行結果をもって、自分のコードを引き続き実行する段階を含むことを特徴とする。
【００３８】
また、前記呼び出しデータは：スタックポインタと、リンクレジスタと、アーギュメントレジスタと、リターンレジスタとを含むシステムレジスタ；及び呼び出しの対象の前記他のHWIPまたは自分自身のアドレス及び活性信号(enable signal)を含む制御信号を含み、前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、呼び出しの対象の前記他のHWIPまたは前記いずれか一つのHWIPを呼び出す前に、前記いずれか一つのHWIPによって前記呼び出しデータに前記ハードウェアコントローラの内部の共有する前記システムレジスタをアップデートすることを特徴とする。 
【００３９】
また、前記他のHWIPのアーギュメントは、アーギュメントレジスタ及び前記HWIPらの間に共有するスタックスペースを通じて、前記いずれか一つのレジスタから伝送されることを特徴とする。
【００４０】
また、前記メインコアと前記ハードウェアコントローラとが疎結合である場合には、前記他のHWIPは、活性化された場合、前記ハードウェアコントローラの内部のシステムレジスタに自分のレジスタをアップデートし、前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記他のHWIPは活性化された場合、前記いずれか一つのHWIPのレジスタ値を直接読み込むことを特徴とする。
【００４１】
また、前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、前記他のHWIPは実行完了の時、自分のリターン値(value)及びリターンアドレスを前記ハードウェアコントローラの内部のレジスタに記入(write)することを特徴とする。
【００４２】
また、前記メインコアと前記ハードウェアコントローラとが疎結合されていて、全ての前記HWIPが前記ハードウェアコントローラの内部のシステムレジスタセットを共有する場合には、前記いずれか一つのHWIPは、前記他のHWIPのリターン値(value)及びリターンアドレスを前記ハードウェアコントローラの内部のレジスタから読み込み、前記メインコアと前記ハードウェアコントローラとが密結合である場合には、前記いずれか一つのHWIPは、前記他のHWIPのリターン値(value)及びリターンアドレスを前記他のHWIPのレジスタから直接読み込むことを特徴とする。
【００４３】
本発明の他の実施例によると、プログラミングディレクティブと表示された変換対象高水準言語コードから前記プログラミングディレクティブを読み込んだ後、前記変換対象高水準言語コードをハードウェア部分コードとソフトウェア部分コードとに分割するHLL-to-HLLソース変換機；前記ソフトウェア部分コード及びハードウェア部分コードをコンパイルするメインコンパイラ；前記ハードウェア部分コードをデータパス及びコントロールユニットを含むHDLコードに変換するHLL-to-HDL変換機；コンパイルされた前記ソフトウェア部分コードを実行するメインコア；及び前記メインコアと連動して変換された前記HDLコードを実行する専用ハードウェアを含む高水準言語コードのHDLコードへの変換システムを提供する。
【００４４】
好ましい実施例として、前記ハードウェア部分コードは、前記変換対象高水準言語コードの一つ以上のサブルーチン/関数を含み、前記ソフトウェア部分コードは、前記変換対象高水準言語コードの残り部分及び前記ハードウェア部分コードへの関数呼び出しを含むことを目的とする。
【００４５】
また、前記HLL-to-HDL変換機は、前記メインコンパイラのフロントエンド(front end)及びミドルエンド(middle end)とHDLバックエンド(backend)とを含み、前記HLL-to-HDL変換機は、自然的に(natuarally)HDLコード生成過程からコンパイルされた前記ソフトウェア部分コードのリンケージ規約(linkage convention)を従い、前記HDLバックエンドは：シンタックス(syntax)がHDLシンタックスとセマンティクス(semantics)を従い、低水準IRコードをHDLにマッピングするマシン記述ファイル(machine description file)；及びHDLコードジェネレーター(generator)を含むことを特徴とする。
【００４６】
また、前記HLL-to-HDL変換機の前記メインコンパイラのフロントエンド及びミドルエンドは、前記ハードウェア部分コードを低水準IRコードに変換し、前記HLL-to-HDL変換機の前記HDLバックエンドは、前記低水準IRコードをHDLコードに変換することを特徴とする。
【００４７】
また、前記高水準言語コードのサブルーチン/関数に該当する前記HDLコードの生成は、生成された前記HDLコードが一つ以上のブロックモジュールを前記データパスとして含み、トップモジュールを前記制御ユニットとして含むbasic-block-by-basic-block生成方法、または生成された前記HDLコードが前記データパス及び前記制御ユニットを全て含む一つのモジュールを含むfunction-by-function生成方法の中のいずれか一つであることを特徴とする。
【００４８】
また、前記HDLコードのハードウェア関数の前記データパスは、前記HDLバックエンドのマシン記述ファイルによって前記低水準IRコードから直接生成され、前記HDLコードのハードウェア関数のコントロールユニットは、前記HDLコード生成器によって前記低水準IRコードのベーシックブロックらの間のコントロール依存性に基づいて生成され、前記データパス及び前記コントロールユニットは、有限状態機械(FSM)の形態であることを特徴とする。
【００４９】
また、前記basic-block-by-basic-block生成方法の場合、前記ブロックモジュールは、連続的低水準IRコードインストラクションのシーケンスから生成された有限状態機械のセット(set)であって、前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ/コントロール依存性に基づいてなって、前記ブロックモジュールは、前記低水準IRコードのベーシックブロックと同一機能を遂行し、前記トップモジュールは、前記ブロックモジュールを活性化/非活性化させ、前記ブロックモジュールの実行順序を定めることを特徴とする。
【００５０】
また、前記basic-block-by-basic-block生成方法の場合、前記トップモジュールが一回に一つまたはその以上のブロックモジュールが動作するように、前記一つ以上のブロックモジュールの中の一つまたはその以上のブロックモジュールに入力を割り当てて、活性化させた後、活性化された前記一つまたはその以上のブロックモジュールの実行が終わるまで待ち、活性化された前記一つまたはその以上のブロックモジュールは、割り当てられた入力をもって自分のコードを実行し、自分のレジスタセットに出力を保存(buffer)した後、前記トップモジュールに制御フロー出力(Control Flow Outcome)と一緒にレジスタセットに保存された前記出力を提供(return)し、前記トップモジュールは、前記制御フロー出力に基づいて前記一つ以上のブロックモジュールの中で次に実行されるブロックモジュールを決定することを特徴とする。
【００５１】
また、前記function-by-function生成方法の場合、前記高水準言語コードのサブルーチン/関数に該当する生成された前記HDLコードの前記データパス及び前記コントロールユニットは、一つのモジュールに含まれ、有限状態機械と具現(implement)され、前記データパスは、前記有限状態機械の出力ロジック(output logic)を生成し、前記コントロールユニットは、前記有限状態機械のステート変移(transition)を制御し、前記データパスは、前記高水準言語コードのサブルーチン/関数の全てのベーシックブロックの低水準IRコードインストラクションの連続的シーケンスから生成され、前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ/コントロール依存性に基づいてなることを特徴とする。
【００５２】
本発明のまた他の実施例によると、HLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステムにおいて、前記HLL-to-HDL変換機は：
【００５３】
メインコンパイラのフロントエンドとミドルエンド；及びHDLバックエンドを含むことを特徴とするHLL-to-HDL変換機を用いて高水準言語コードをHDLコードに変換するシステムが提供される。
【００５４】
好ましい実施例として、前記HDLバックエンドは：HDLシンタックスとセマンティクスを従うシンタックスを有して、ターゲットアセンブリコード(target assembly code)生成と同一方式で低水準IRコードをHDLコードにマッピングする変換機；及び前記メインコンパイラのフロントエンド及びミドルエンドによって前記高水準言語コードから前記ターゲットアセンブリコード生成の直前に変換された低水準IRコードから前記HDLコードを生成するHDLジェネレーター(generator)を含むことを特徴とする。
【００５５】
また、前記HLL-to-HDL変換機によって前記高水準言語コードのサブルーチン/関数から生成された前記HDLコードは、データパス及びコントロールユニットを含み、前記データパス及び前記コントロールユニットは、有限状態機械の形態と具現されることを特徴とする。
【００５６】
また、basic-block-by-basic-block生成方法の場合、前記HDLコードは、前記高水準言語コードのサブルーチン/関数から生成された一つまたはその以上のブロックモジュールを前記データパスとして含み、トップモジュールをコントロールユニットとして含み、function-by-function生成方法の場合、前記HDLコードは、データパス及び前記コントロールユニットの両者を全部含む一つのモジュールを含むことを特徴とする。
【００５７】
また、前記basic-block-by-basic-block生成方法の場合、前記データパスは一つまたはその以上のブロックモジュールを含み、前記ブロックモジュールは、ベーシックブロックの低水準IRコードインストラクションから生成される有限状態機械セットであって、前記function-by-function生成方法の場合、前記データパスは、前記高水準言語コードのサブルーチン/関数の全てのベーシックブロックの低水準IRコードインストラクションから生成される有限状態機械セットであって、前記二つの方法全てにおいて、前記有限状態機械のステート(state)分割は、前記低水準IRコードインストラクションの遅延推定値及びデータ依存性に基づいてなることを特徴とする。
【発明の効果】
【００５８】
本発明による高水準言語コードのHDLコードへの変換システム及び方法は、変換対象高水準言語コードにおける修正がなくても、全ての高水準言語のsyntax及びsemanticsが変換可能であって、メインコンパイラが支援する全ての高水準言語コードをHDLコードに変換できる有利な効果がある。
【００５９】
また、全ての高水準言語のsyntax及びsemanticsで使用可能であって、メインコンパイラが支援する全ての高水準言語コードをHDLコードに変換することができて、メインコンパイラを基本コンパイラとして使うことによって、高水準言語からなるコードに使う全ての最適化(optimization)が使用できる有利な効果がある。
【００６０】
また、専用ハードウェアで実行される変換されたHDLコードとメインコアで実行されるソフトウェアコードとの間のクロスコール及びハードウェアの内部での再帰呼び出し(recursive call)を通じてHDLコードとソフトウェアコードが連動されるようにすることによって応用プログラムの速度を向上させることができる有利な効果がある。
【図面の簡単な説明】
【００６１】
【図１】本発明の一実施例による高水準言語コードのHDLコードへの変換システムの構造図である。
【図２】本発明の一実施例による高水準言語コードのHDLコードに変換する過程を示す順序図である。
【図３】本発明の一実施例による変換対象言語がC言語である場合において、本発明のシステムの構成を示す例示図である。
【図４】本発明の他の実施例による変換対象言語がC言語である場合のシステムの構成を示す例示図である。
【図５】本発明の一実施例によるHLL-to-HDL変換機によってハードウェア部分コードをHDLコードに変換する過程を示す順序図である。
【図６】本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のデータパスとしてのHDLブロックモジュールとコントロールユニットとしてのトップモジュールとの間の制御フロー及び通信を示すブロックダイアグラムである。
【図７】本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合の低水準IRコードのベーシックブロックからHDLコードのブロックモジュールのコード生成を示すブロックダイアグラムである。
【図８】本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のコントロールユニットとしてのトップモジュールのVerilogHDLコードを示す例示図である。
【図９】本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のコントロールユニットとブロックモジュールのインスタンスを含むVerilogHDLコードのトップモジュールを示す例示図である。
【図１０】本発明の一実施例によるfunction-by-function方法を用いてC関数から生成されたデータパス及びコントロールユニットを示すブロックダイアグラムである。
【図１１】本発明の一実施例によるメインコアと専用ハードウェアとの間のコミュニケーションを示すブロックダイアグラムである。
【図１２】本発明の一実施例によるメインコアで実行されるソフトウェア部分コードと専用ハードウェアで実行されるハードウェア部分コードとの間のコーリングプロシージャー(calling procedure)を示す順序図である。
【図１３】本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合のソフトウェア部分コードとハードウェア部分コードとの間のクロスコールを支援するためのSW/HWインターフェース及びハードウェアコントローラを示すブロックダイアグラムである。
【図１４】本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合のメインコアで実行されるソフトウェア部分コードと専用ハードウェアで実行されるハードウェア部分コードとの間のクロスコールを遂行するメカニズムを示す例示図である。
【図１５】本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合の図１４のメインコアと専用ハードウェアとの間のクロスコールの例示コードにおけるクロスコールインプリメンテーションを示す例示図である。
【図１６】本発明の一実施例によるメインコアと専用ハードウェアとが密結合である場合のメインコアと専用ハードウェアとの間のコミュニケーションインターフェースを示すブロックダイアグラムである。
【図１７】本発明の一実施例によるメインコアと専用ハードウェアとが密結合である場合の図１６のクロスコールインプリメンテーションを示すブロックダイアグラムである。
【図１８】本発明の一実施例によるメインコアと専用ハードウェアとが密結合である場合の図１６のクロスコールインプリメンテーションを示すブロックダイアグラムである。
【発明を実施するための形態】
【００６２】
以下添付した図面を参照して、本発明の好ましい実施例を詳しく説明する。
【００６３】
図１は、本発明による高水準言語コードのHDLコードへの変換システムの構造図である。
【００６４】
図１を参照すると、本発明の高水準言語コードのHDLコードへの変換システムは、HLL-to-HLLソース変換機（１１０）、GCC(GNU Compiler Collection)のようなメインコンパイラ（１２０）、変換対象高水準言語コードをVerilogのようなHDLに変換するHLL-to-HDL変換機（１３０）、ARM(Advanced RISC Machine)のようなメインコア（１４０）及びFPGA(Field Programmable Gate Array)のような専用ハードウェア（１５０）を含むことがわかる。
【００６５】
前記HLL-to-HLLソース変換機（１１０）は、高水準言語コードの変換対象コードセクションにプログラミングディレクティブ(programming directive)による表示がある場合、前記プログラミングディレクティブを読み込んだ後、前記変換対象高水準言語コードをハードウェア部分コードとソフトウェア部分コードとに分割(partition)する。この時、前記ハードウェア部分コードは、前記変換対象高水準言語コードの中の特定または多数のプログラムで繰り返して使われる独立された命令群であるサブルーチン/関数部分であって、前記ソフトウェア部分コードは、前記変換対象高水準言語コードの残り部分及び前記ハードウェア部分コードへの関数呼び出しを含む。
【００６６】
前記メインコンパイラ（１２０）は、前記HLL-to-HLLソース変換機（１１０）によってパーティションされた前記ソフトウェア部分コード及びハードウェア部分コードを一緒にコンパイルして実行できる(executable)コードに変換する役割を果たす。
【００６７】
前記HLL-to-HDL変換機（１３０）は、前記HLL-to-HLLソース変換機（１１０）によってパーティションされた前記ハードウェア部分コードをHDLコードに変換する役割を果たす。
【００６８】
前記メインコア（１４０）及び前記専用ハードウェア（１５０）は、各々前記メインコンパイラ（１２０）によってコンパイルされたソフトウェア部分コードと前記変換機（１３０）によって変換されたHDLコードとを互いに協力して実行する役割を果たす。
【００６９】
図２は、本発明の一実施例による高水準言語コードのHDLコードへの変換する過程を示す順序図である。
【００７０】
図２を参照すると、本発明による高水準言語コードのHDLコードへの変換方法は、変換対象高水準言語コードをプログラミングディレクティブと表示する段階（S２１０）、表示された前記コードをハードウェア部分コードとソフトウェア部分コードとにパーティションする段階（S２２０）、前記ソフトウェア部分コード及びハードウェア部分コードをメインコンパイラで一緒にコンパイルする段階（S２３０）、前記ハードウェア部分コードをHDLコードに変換する段階（S２４０）、コンパイルされた前記ソフトウェア部分コードをメインコアで実行する段階（S２５０）及び変換された前記HDLコードを専用ハードウェアで実行する段階（S２６０）を含むことがわかる。この時、前記メインコアと前記専用ハードウェアとは互いに連動して実行される。
【００７１】
図３及び図４は、本発明の二つの実施例による変換対象言語がC言語である場合において、本発明のシステムの構成を示す例示図である。
【００７２】
図３及び図４を参照すると、先に説明したように、まず、高水準プログラミング言語のC言語からなる変換対象コードの変換対象セクションにプラグマのようなプログラミングディレクティブを用いて表示する。この時、表示されたコード部分はループ（図面内の#pragma hardware forの部分）、サブルーチン（#pragma hardwareセクション）、または#pragma hardwareと表示した変換対象コード内のどの部分（セクション）でもできる。以後、前記HLL-to-HLLソース変換機（１１０）は、プログラミングディレクティブと表示された高水準言語コードを読み込んだ後、前記プログラミングディレクティブと表示されたコードセクションをサブルーチンに変換する。前記表示されたコードセクション以外の高水準言語コードの残り部分が前記ソフトウェア部分コードに該当する。前記ハードウェア部分コード及びソフトウェア部分コードは、一つの共通したファイルに保存され、または各々違うファイルに保存されることができる。生成されたハードウェア関数は、プレフィックス(prefix)hw_func_とHWID番号(hardware identification number)と命名される（図４のhw_func_１を参照）。抜粋された(extracted)コードセクションは、ラッパ(wrapper)と名付けられたAPI関数呼び出しに取り替えられる。ハードウェアコードはソフトウェアと違ってアドレスがないため、固有のハードウェアアイデンティフィケーションナンバーのHWIDが各々のハードウェア関数に付与され、付与されたHWIDは生成されたハードウェア関数を識別するに使われる。
【００７３】
前記コードにおける前処理過程が完了された後、前記ソフトウェア部分コードと前記ハードウェア部分コードは、GCCコンパイラのようなメインコンパイラ１２０によって一緒にコンパイルされ、前記ハードウェア関数は、前記HLL-to-HDL変換機（１３０）によって相応するVerilogコードに変換される。
【００７４】
一例として、一般的な変数及び関数のarr[１０]及びprintfがソフトウェアコードに宣言（declare）された場合、これらはhw_func_１にハードウェアからアクセス（access）される。このような場合、ソフトウェア部分とハードウェア部分が一緒に構成されないなら、ハードウェアは前記一般的な変数（global variable）シンボルのアドレスがわからない。シンボルテーブルは全てのグローバル変数及び関数のアドレスのみならず、データセクションのベースアドレスも含む。よって、前記グローバルシンボルのアドレスレゾリューション（resolution）のために前記シンボルテーブルを用いて前記ハードウェア部分コードとソフトウェア部分コードを一緒にコンパイルする。
【００７５】
しかし、前記ハードウェア部分コードの"arr[%d]=%d"のようなコンスタントストリング（constant string）は 変数ではなく、シンボルテーブルに含まれないため、これらは ".rodata"セクションに保存される。コンスタントのアドレスは３変数の合計で計算される。即ち、コンスタントのアドレスは、前記シンボルテーブルの".rodata"セクションの開始アドレス、前記HLL-to-HDL変換機の変換対象であるインプットソースファイルのコンスタントオフセットアドレス(constant's offset address)及び本発明によって修正されたGCCリンカのファイルオフセットアドレスを通じて定められる。
【００７６】
ソフトウェアの関数がソフトウェアではなく、ハードウェアによって実行されるため、メインコンパイラは、前記ソフトウェア部分コードとハードウェア部分コードを一緒にコンパイルする。また、前記ソフトウェア部分コードのコンピレーション(compilation)過程のコード最適化(optimization)で、ソフトウェアで実行される必要のない場合、前記関数部分は除外されることができる。即ち、デッドコード削除(deadcode elimination)がなることができる。一例として、ライブラリ関数の"printf"は、ハードウェア部分コードの"hw_func_１"関数からの呼び出し(call)のためにソフトウェア部分コードに含まれることができる。また、ハードウェアコンピレーションもコンスタントオフセット情報を正しく計算するために、全体のソースコードをコンパイルする。しかし、ハードウェア関数のみがVerilogのようなHDLコードに変換され、残りのセクションはHLL-to-HDL変換機によって無視され、変換されない。
【００７７】
生成されたHDLコードは、ハードウェアコンパイラによって合成されて(synthesized)FPGAのような専用ハードウェア（１５０）で実行され、その反面、コンパイルされたソフトウェア部分コードは、ARMのようなメインコア（１４０）で実行される。
【００７８】
図５は、本発明の一実施例によるHLL-to-HDL変換機によってハードウェア部分コードをHDLコードに変換する過程を示す順序図である。
【００７９】
図５を参照すると、高水準言語からなるハードウェア部分コードをVerilogのようなHDLコードに変換する過程は、高水準言語コードをRTLコードのような低水準IR(Intermediate Representation)に変換する段階（S４１０）及びターゲットアセンブリコード(targeted assembly code)生成の直前の段階の前記RTLのような低水準IRコードからVerilogのようなHDLコードを生成する段階（S４２０）からなることがわかる。
【００８０】
前記低水準IR(Intermediate Representation)に変換する段階（S４１０）及びターゲットアセンブリコード(targeted assembly code)生成の直前の段階の前記RTLのような低水準IRコードからVerilogのようなHDLコードを生成する段階（S４２０）は、GCCのようなメインコンパイラフロントエンド及びミドルエンドとHDLバックエンドとを含むHLL-to-HDL変換機によって遂行される。
【００８１】
前記ハードウェア部分コードをGCCのRTLのような低水準IRコードに変換する段階（S４１０）は、前記HLL-to-HDL変換機のメインコンパイラフロントエンド及びミドルエンドによってなり、前記低水準IRコードからVerilogのようなHDLコードを生成する段階は、前記HLL-to-HDL変換機のHDLバックエンドによってなる。この時、前記HLL-to-HDL変換機は、他のバックエンドによってターゲットアセンブリコード生成に使われる直前の低水準IRコードを活用して前記HDLコードを生成する。この時、低水準IRコードは、入力高水準言語とは無関係であるため、前記HLL-to-HDL変換機は、メインコンパイラが支援する全ての高水準言語からなるコードをHDL言語に変換することができる。
【００８２】
以下、前記RTLのような低水準IRからVerilogのようなHDLコードが生成される方法を詳しく説明する。
【００８３】
メインコンパイラとしてGCCコンパイラが使われ、変換されたHDLがVerilogである場合を例として説明すると、GCCコンパイラのミドルエンド部分は、アルゴリズムをアセンブリ言語に変換する前に、前記アルゴリズムを最適化するため、RTLと呼ばれるIR(Intermediate Representation)を使う。GCCのRTLは"*.md"のようなマシン記述ファイル(machine description file)によって媒介変数と示される(parameterized)抽象的記述(abstract description)である。GCCの前記マシン記述ファイル "*.md"は、関数ユニット(functional unit)、レジスタファイル及びインストラクションセットアーキテクチャー(instruction set architecture)のような目的プロセッサーについて定義する。本発明によるHDLバックエンドは、前記低水準RTLのVerilogコードへの変換を容易にするためにインストラクションパターンがVerilogシンタックスを従うように構成される。
【００８４】
RTLのベーシックブロックを綿密に検討すると、RTLとVerilogが多くの類似点を有していることがわかる。RTLの場合、Cポインタ及び複雑なデータ構造における全てのメモリアクセスは、単純なメモリアクセスに単純化され(convert)、全ての種類のコントロールステートメントは、ブランチ(branches)及びジャンプインストラクションに変換される。また、RTLはthree-addressコードを従い、これはVerilogステートメントに容易に変換ができる。全てのRTLのオペレーター(operator)もまたVerilogのオペレーションによって表現が可能であって、RTLベーシックブロックのlive-in及びlive-outレジスタはVerilogモジュールのinput/outputデータの形式に変換ができる。Verilogのブロックモジュールは、input/outputデータを通じて、互いに通信(communication)ができる。さらに、RTLでのレジスタの使用は、Verilogのregデータ変数(reg data variables)に対応する。
【００８５】
ソフトウェアRTLの不在タイミングコントロール(absent timing control)及び並行性(concurrency)の問題は、有限状態機械(FSM、finite state machine)の導入で解決できる。有限状態機械は、ハードウェアで並行実行(concurrent execution)を活用(exploit)しながらも、ソフトウェアの実行シーケンスを保持することができる。有限状態機械の各々のステートは、プログラムアドレスのように固有に番号が付けられ、一つのステートは一クロックサイクル(one clock cycle)内の実行を示す。一つの有限状態機械ステートには、一つまたはその以上のRTLインストラクションが実行できて、または時間のかかるRTLインストラクション(time-consuming RTL instruction)の場合には、複数の有限状態機械ステートにかけて実行される。また、多数個のインストラクションが互いに独立的である場合には、一つのステート内に多数個のインストラクションが並列的に実行されることができる。並列的に実行されるインストラクションの数が多いほど、FPGAのような専用ハードウェアの実行速度はもっと速くなる。しかし、関数呼び出し、掛け算、割り算及びメモリアクセスのようないくつかのインストラクションは、一つのステート内で実行されることができなく、従って、HDLバックエンドは、多数個の有限状態機械のステートにかけて実行できるようにコードを生成する。実行中のステートでの全てのインストラクションが実行された後、ステート変数(例えば、プロセッサーのPC、program counter等)は、次のステート番号に合わせられる。non-blockingアサインメントの"＜＝"が生成されたコードに使われる。
【００８６】
Ｉ/Ｏ機器及びメモリシステムを除いた一般的ハードウェアシステムは、データパス(レジスタ、関数ユニット等)と前記データパスを制御するためのコントロールユニットとを含む。従って、変換されたHDLコードのサブルーチンは、一つのデータパス及び一つにコントロールユニットを含むようにHLL-to-HDL変換機によって変換される。前記データパスは、一つ以上のVerilogブロックモジュールとして具現され、前記コントロールユニットは、一つのVerilogコントロールモジュールと具現される。一つのベリログブロックモジュールは、一つのRTLベーシックブロックから構成される。
【００８７】
図６は、本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のデータパスとしてのHDLブロックモジュールとコントロールユニットとしてのトップモジュールとの間の制御フロー及び通信を示すブロックダイアグラムである。
【００８８】
図６を参照すると、GCCで関数のRTLコードは数個の基本ブロックら(basic blocks)に分かれて、各々の基本ブロックは、ただ一つのエントリポイント(entry point)及び一つのエグジットポイント(exit point)を有する。従って、コードの制御のフローは、基本ブロックのエンド部分で定められる。即ち、現在実行中の基本ブロック乃至前処理ブロックが自分の次に実行される基本ブロック乃至後処理ブロックを指定する。前処理機と後処理機との間の入力及び出力情報はレジストファイルである。この時、後処理機の実行においては、前処理機によってアップデートされたレジスタファイルが使われる。
【００８９】
また、図６を参照すると、本発明のHDLモジュールは、RTLのような低水準IRコードの基本ブロックの役割と同一役割を遂行するブロックモジュールら（５６０乃至５９０）とブロックモジュールの実行を制御して、その実行順序を定めるためのトップモジュール（５５０）を含むことがわかる。低水準IRコードのレジスタファイルは、前記ブロックモジュールの入力(input)及び出力(output)シグナルと具現(implement)される。前記トップモジュール（５５０）は、複数の多くのブロックモジュールの間の実行を制御する。即ち、前記トップモジュールは、ブロックモジュールに入力を割り当ててブロックモジュールを活性化させ、前記活性化されたブロックモジュールは、割り当てられた入力をもって自分のコードを実行し、自分のレジスタセットまたは他のブロックモジュールと共有するレジスタセットに出力を保存(buffer)した後、前記トップモジュール（５５０）に制御フロー出力(control flow outcome)と一緒にレジスタセットに保存された出力を提供(return)する。以後、前記トップモジュール（５５０）は、前記制御フロー出力に基づいて次に実行されるブロックモジュールを決定する。このような方式(mechanism)を用いてブロックモジュールによるデータ経路とトップモジュールによる制御経路とが分離されることができる。
【００９０】
一例として、図６のブロックモジュール０（５６０）またはブロックモジュール２（５８０）のようにブランチインストラクションを含むブロックモジュールは、次に実行されるブロックモジュールの決定のためにbranch_result（例えば、比較命令の結果）をコントロールモジュールに該当するトップモジュール（５５０）に伝送する。以後、前記トップモジュールは、enable_bbのような信号を通じて、次に実行されるブロックモジュールを活性化させ、活性化されたブロックモジュールがinput_selectシグナルを通じて自分以前に実行されたブロックモジュールから正しい入力を選択することを手伝う。
【００９１】
前記ブロックモジュールのボディーコード(body code)は、本発明のマシン記述ファイル(machine description file)によってRTLのような低水準IRコードから直接(directly)生成される。これと違ってトップモジュールのボディーコードは、低水準IRコードの基本ブロックらの情報に基づいた本発明のHDL制御生産部(HDLcontrol generator)によって生成され、本発明のHLL-to-HDL変換機の出力は、数個のブロックモジュールと一つのトップモジュールとを一つに含む。
【００９２】
以下、本発明のbasic-block-by-basic-block方法のブロックモジュールのためのHDLコード生成について説明する。
【００９３】
図７は、本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合の低水準IRコードのベーシックブロックからHDLコードのブロックモジュールのコード生成を示すブロックダイアグラムである。参照符号（１）乃至（６）は、アセンブリコード、RTLインストラクション及びこれに相応するVerilogコードの一対一対応を表現するために使われた。有限状態機械の各ステートらには番号が付与されていて、それらは、caseステートメントに示されている。
【００９４】
全てのブロックモジュール及びトップモジュールは、Verilogコンビネーション"always"ブロックを用いた有限状態機械(FSM、Finite State Machine)の形態で生成される。図７を参照すると、インストラクションシーケンスは、各々が有限状態機械の一つの段階に該当するように数個の部分と分離され、現在実行中の段階の全ての命令語が実行された後、段階変数が以後実行される段階番号となるようにしたことがわかる。 
【００９５】
各々のFSM段階は、一つのクラックサイクル以内に実行され、従って、一つのFSM段階は、一つまたは多数個の低水準IR命令語を実行することができる。一つの段階で実行される命令語の数が多いほど、FPGAのような専用ハードウェアの実行速度は、もっと速くなる。命令語らが一つの段階内で実行されるための条件は、つまり命令語らが並列的であるべきということである。即ち、命令語らが互いに独立的であるべきということである。本発明のHLL-to-HDL変換機は、命令語らの遅延推定値(delay estimation)及びデータ依存性に基づいて、低水準IR命令語らをいかに分割するかを決定する。足し算、引き算、配分(assignment)、行移動(shift)及び演算(logic operation)は、時間のかかる作業ではないため、一つの周期(cycle)の中で実行されるものと考慮され、このような時間のかからない命令語らは、並列的でさえあれば、一つのFSM段階内に多数個が含まれることができる。しかし、掛け算、割り算及びメモリアクセスは、時間のかかる作業に該当し、従って、これらに基づいた命令語らは、掛け算、割り算及びメモリアクセス等が終わるまで待った後、次の周期に実行される。
【００９６】
例えば、図７のHDLブロックモジュールが活性化された場合(コードの開始部分で活性化される)、ステート変数"pc"はステート０とセットされ、レジスタregs９及びregs１０は、前処理機から入力された入力値(live-in value)"*_in_４"と初期化される。前記変数"pc"は、次に実行されるステートを示し、これは一般プロセッサーのプログラムカウンター(program counter)と類似である。
【００９７】
図７を参照すると、メモリロード(load)インストラクションは、二ステートにかけて実行される。即ち、ステート０でメモリサービスを要請し、ステート１でメモリステータス(status)をチェックしてメモリからデータを受領する。３番目のステートの命令は、足し算であって、これは４番目のステートの命令であるメモリ保存と並列的に実行される。これは、これらの命令が互いに独立的であるためである。前記メモリ保存インストラクションは、ステート３（４番目のステート）のメモリ初期化(initialization)とステート４のメモリステータスチェックとの二つのステートに分割されている。
【００９８】
最後に、ステート５でブランチ出力(outcome)信号は、"regs１０"の値で決定され、終了信号(finish signal)は、コントロールモジュールであるトップモジュールに実行が終了されたことを知らせるためにセット(set)される。
【００９９】
次に、basic-block-by-basic-block方法のトップモジュールのHDLコード生成について説明する。
【０１００】
図８は、本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のコントロールユニットとしてのトップモジュールのVerilogHDLコードを示す例示図である。トップモジュールは、本発明のHLL-to-HDL変換機によってブロックモジュールの制御と実行順序(schedule)を定めるために生成される。前記トップモジュールも固有の番号を有するステートらからなる有限状態機械の形式となっている。トップモジュールは、ブロックモジュールを活性化(enable)/非活性化(disable)させるために、enable_bbシグナルを使う。ブロックモジュールは、自分のHWID(hardware identification number)に相応するビットポジション(bit position)がセットされると活性化される。例えば、"enable_bb ＜＝ ４'b０００１"は、４個のブロックモジュールがこれによって制御されて、ブロックモジュール０が活性化されることを示す。ブロックモジュールが活性化された場合、ブロックモジュールは、自分の前処理であるブロックモジュールからの入力値をもって自分のボディーコード(body code)を実行し、自分の次に実行されるブロックモジュールの入力値に該当する出力値をレジスタセットに保存(buffer)する。仮に、ブロックモジュールが条件付きブランチ(conditional branch)で完了される場合、実行完了時にサクセッサー(successor)信号を通じてブランチ出力をトップモジュールにリターンする。トップモジュールは、前記ブランチ出力を考えて、次に実行されるブロックモジュール(successor block module)を決定する。
【０１０１】
図９は、本発明の一実施例によるbasic-block-by-basic-block方法を用いた場合のコントロールユニットとブロックモジュールのインスタンスを含むVerilogHDLコードのトップモジュールを示す例示図である。
【０１０２】
トップモジュールの主要任務の二つとは、ブロックモジュールに入力(input)/出力(output)を割り当てることと、ブロックモジュールの実行順序(schedule)を決めることである。入力/出力信号を割り当てるために、トップモジュールは、ブロックモジュールのインスタンス(instance)を生成する。これは、qブロックモジュールは、モジュールを定義して直ちに使うことができなく、ただ構造的機能的の定義であるだけであるため、定義されたモジュールを使用するためには、instantiationが必要であるためである。
【０１０３】
トップモジュールは、現在実行されたブロックモジュールの出力を次に実行されるブロックモジュールに入力で割り当てる。ブロックモジュールらの間の前処理機と後処理機(predecessor/successor)との間の関係は、RTL基本ブロックらの間の前処理機と後処理機との間の関係と同じである。
【０１０４】
トップモジュールには、ブロックモジュールらの実行順序を決めるための制御部が具備される。前記制御部もFSM形式と構成され(implement)、従って、次のような機能をするようになる。即ち、作動活性化信号(enable signals)をセッティング(setting)することによって、ブロックモジュールを活性化/非活性化(enable/disable)させ、中断信号(interrupt signal)を生成して、プログラム(ソフトウェア)が実行終了を示すようにする。
【０１０５】
図９を参照すると、前記説明したように、トップモジュールは、制御部を含めていて、変数を宣言し、ブロックモジュールに入力信号を割り当てて、ブロックモジュールインスタンスを生成することがわかる。また、前記制御部は、FSM形式を取っていることがわかる。
【０１０６】
次に、本発明の一実施例によるfunction-by-function方法の高水準言語コードのサブルーチンのVerilogコード生成について説明する。
【０１０７】
図１０は、本発明の一実施例によるfunction-by-function方法を用いてC関数から生成されたデータパス及びコントロールユニットを示すブロックダイアグラムである。図６乃至８を参照して、先に説明した低水準IRコードの各々のベーシックブロックをHDLブロックモジュールに生成するbasic-block-by-basic-blockコード生成の場合、生成されたHDLコードを容易に制御してデバッグ(debug)することができる。しかし、basic-block-by-basic-block方法によって生成されたHDLコードは、各々のブロックモジュールにおける別個のレジスタファイルがインプリメントされなければならないため、多くのリソース(resource)を消費することになる。従って、ハードウェア関数のベーシックブロックの数が多くなる場合、生成されたHDLコードは、大きい数字のレジスタを必要とされることになり、これによってFPGAのような専用ハードウェアのリソースを枯渇されるようにすることができる。
【０１０８】
従って、リソースの消費を減らすため、高水準言語コードの全体低水準IRコードをジェネラルデータパス(general datapath)に変換するfunction-by-function方法が活用される。即ち、全体高水準言語コードの関数は、ただ一つの一般レジスタファイル(global register file)を活用する。Cコード及びRTL制御フローが図１０の（a）及び（b）に示されていて、コントロールユニットとデータパスを含むCコード及びRTL制御フローに該当する変換されたVerilogコードは、図１０の（c）及び（d）に各々示されている。
【０１０９】
図１０の（c）及び（d）を参照すると、前記データパス及びコントロールユニットは、一つの有限状態機械(FSM、finite state machine)から構成されることがわかる。前記コントロールユニットは、有限状態機械のステート変数"nx_pc"値を変更させ、前記データパスは、有限状態機械の出力を生成するためのレジスタファイルと関数ユニット(functional unit)とを含めている。本発明によるHLL-to-HDL変換機は、一つのベーシックブロックを有限状態機械のステートブロックに変換させ、全てのベーシックブロックのステートは、グローバルデータパスを形状するために組み合わせられる。低水準IRコードのベーシックブロックは、一つのエントリ(entry)ポイントと一つのエグジット(exit)ポイントのみを有しているため、これに相応するHDLコードの一つのステートブロックも一つのエントリポイントとエグジットポイントとを有する。ステートブロックのエントリステートは、これに相応する低水準IRコードのベーシックブロックのナンバーと番号付けられる。このような番号付与の方式は、ブロックステートらの間の制御フローの変化をとても容易にできるようにする。例えば、前記コントロールユニットがベーシックブロック３のエントリコードへのジャンプを求める場合、これは、ステートブロック３にジャンプするといいことが即刻的にわかる。従って、ベーシックブロックの一番大きい番号がｎである場合、ｎまでの数は、ブロックステートらのエントリステートの番号を付与するために使われ、数字ｎ＋１は、関数のエグジットステートブロックのために使われる。ｎ＋２以後の数は、ベーシックブロック内部のステートらのために使われる。前記データパスは、一般的ソフトウェアの関数と同様にリンクと被呼出者保存レジスタ(link and callee-saved registers)を開始時のスタックにプッシュ(push)し、完了(end)時にポッピング(popping)する。たとえ各々のハードウェア関数が別途のレジスタファイルを有している場合でも、プッシュとポッピングは、再帰的関数(recursive function)を支援するために依然として必要である。
【０１１０】
データパス構成(implementation)の一例が図１０（d）に示されている。ハードウェア関数のRTLコードは、２から６までの五個のベーシックブロックを含めている。リンクレジスタ"reg０"は、ステート２でスタックにプッシュ(push)され、ステートブロック５のステート１６及びブロック６のステート１９で再保存(restore)される。C関数はレジスタ集約的(register intensive)でないため、コンパイラは、呼出者保存レジスタ(caller-saved registers)の"reg７＜＝ reg１４"のみを実行するために使い、従って、リンクレジスタを除いたその他の被呼出者保存レジスタ(callee-saved register)を保存(save)する必要がない。Cの一般アレー(global array C)の基本アドレス(based address)は、ステート３で"reg９"に割り当てられて、ループのボディー計算(loop body calculation)は、ブロック４のステート４、１２、１３、１４、１５で実行された。図１０（a）ループのアレー要素（array element）"c[i]"は、ステート図１０（d）のステート４、１２及び１３で"reg７"に使われる。前記アレー要素は、ステート１４で"reg１４"に"reg１４ ＜＝ reg７＋reg１４；"のように蓄積される。図１０（a）ループのスレショルド(threshold)"ｎ"は、一番目のアーギュメントレジスタである"reg１２"に保存され、従って、前記コントロールユニットのステート１５でブランチディシジョン(branch decision)を定めるために"reg８"に保存されたループの導入(induction)変数"i"は"successor[４] ＝ (reg８ ！＝reg１２)；"のように"reg１２"と比較される。
【０１１１】
図１０（c）を参照すると、生成されたコントロールユニットは、二つの"always"ブロックを含むことがわかる。即ち、ステート変数"pc"のためのものと組み合わせられた次のステート"nx_pc"の二ブロックを含むことがわかる。比較(comparison)及びジャンプ命令を除いたほとんどの低水準IRインストラクションは、データパスで実行される。ジャンプ命令は、ベーシックブロックらの間の制御フローを変更させる。即ち、ステート変数の"pc"値を変更させることである。従って、これはデータパスでなく、コントロールユニット内に具現される。比較命令は、ジャンプ命令を遂行するための条件を設定するために使われ、従って、ジャンプ命令と同様にデータパスから除外される。比較動作は、連続的割り当て(continuous assignment)を通じてチェックされ、従って、遂行による遅延を最小化することができる。例えば、ベーシックブロック２のレジスタ１２の "reg１２"値が０より大きいかにおける比較(comparison)チェックは、図１０（c）のステートメント"assign successor[２]＝(reg１２ ＜＝ ０)"と具現される。制御フローがベーシックブロック２の最後に到達した場合、"successor[２]"の値は正しく設定され、これは、コントロールユニットによって実行ステートを変更するためのジャンプ命令を遂行するために使われる。図１０のベーシックブロック２は、二つの継承者(successor)を有し、これは、ベーシックブロック３と６である。即ち、"１０： nx_pc ＜＝ successor[２] ？ ６ ： ３；"ステートメントによってブランチの条件を充たす場合には、ベーシックブロック６に制御フローが進行され、そうでない場合、ベーシックブロック３が次の実行のために選択される。
【０１１２】
関数の最後の部分に制御フローは、エグジットステートで進行され（図１０（c）のステート７を参照）、実行中の関数のエグジット状態(status)を示すために、図１０（c）の"assign finish ＝ (pc＝＝７)；"のようなステートメントによって連続的割り当て(continuous assignment)で終了信号が設定される。このようなエグジットステートは、RTLベーシックブロックのエグジットと同一である。以後ステート変数は、図１０（c）の"２２： nx_pc＜＝２２；"のようなステートメントによってストール状態(stall status)に変更される。
【０１１３】
次に、エンベデッドマイクロプロセッサーのARMのようなメインコアとFPGAのような専用ハードウェアとの間の情報交換について説明する。
【０１１４】
図１１は、本発明の一実施例によるメインコアと専用ハードウェアとの間のコミュニケーションを示すブロックダイアグラムである。図１１を参照すると、メインコアと専用ハードウェアは、メモリと活性化信号(enable signal)のような制御信号(control signal)とアーギュメント(argument)を通じて情報交換をすることがわかる。
【０１１５】
次に、メインコアと専用ハードウェアとの間の呼出規約(calling convention)について説明する。
【０１１６】
図１２は、本発明の一実施例によるメインコアで実行されるソフトウェア部分コードと専用ハードウェアで実行されるハードウェア部分コードとの間のコーリングプロシージャー(calling procedure)を示す順序図である。図１２を参照すると、開始点からメインコアでコンパイルされたソフトウェア部分コードが実行され（S１０１０）、前記ソフトウェア部分コードが専用ハードウェアのHWIP(Hardware Intellectual Property)の実行が必要か否かについて判断し（S１０２０）、専用ハードウェアの実行が必要である場合、作動活性化信号(enable signal)及びパラメーターを専用ハードウェアに伝送して専用ハードウェアを呼び出し（S１０３０）、活性化された専用ハードウェアは、呼び出されたHWIPを実行し（S１０４０）、実行完了後、実行結果でデータをアップデートし、実行完了について前記メインコアに通知し（S１０５０）、専用ハードウェアの実行完了を通知されたメインコアは、アップデートされたデータでソフトウェア部分コードの実行を再開（S１０６０）することがわかる。以後、それ以上の専用ハードウェアのHWIPの実行の必要ない場合、プログラムは終了される。
【０１１７】
図１３は、本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合のソフトウェア部分コードとハードウェア部分コードとの間のクロスコールを支援するためにソフトウェア（SW）/ハードウェア（HW）インターフェース及びハードウェアコントローラを示すブロックダイアグラムである。
【０１１８】
図１３に示したように、メインコアと専用ハードウェアとが疎結合である場合のクロスコールを支援するために、二つの追加的ハードウェア構成要素(hardware components)のSW/HWインターフェース及びハードウェアコントローラが追加される。専用ハードウェアの前記SW/HWインターフェースモジュールは、クロスコールの時に一定のインターフェースが提供されるように、メインコアに該当するソフトウェアを包装(wrap)するために具現される。前記SW/HWインターフェースモジュールは、専用ハードウェアからメインコアへのコミュニケーションの細部事項を隠し、ハードウェアコントローラがその他のハードウェアコンポーネントと同一方式でソフトウェアであるメインコアと通信できるようにする。前記SW/HWのHWID(hardware identification number)は、図１３に示したように、デフォルト(default)値０と設定されていて、SW/HWインターフェースは、HWIDの一つである。
【０１１９】
前記ハードウェアコントローラは、前記SW/HWインターフェース及びハードウェア構成要素(components)を制御し、スケジューリング(scheduling)するために具現された。このため、前記ハードウェアコントローラはハードウェアモジュールとの間に共有される共有レジスタセットを含み、前記共有レジスタセットは四個のアーギュメントレジスタ、ハードウェアスタックポインタ及びリンクレジスタを含む。前記ハードウェアコントローラは、一回に一つのHWIPを活性化させ、活性化されたHWIPのみが全てのシステムリソースにアクセスでき、残りのモジュールらは、アクセスできないようにブロックされる（図１３のHW module１を参照）。
【０１２０】
図１４は、本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合のメインコアで実行されるソフトウェア部分コードと専用ハードウェアで実行されるハードウェア部分コードとの間のクロスコールを遂行するメカニズムを示す例示図である。
【０１２１】
図１４を参照すると、変換対象Cコードにプログラミングディレクティブが表示されていることがわかる。図１４では"min 関数"と"for ループ"関数がHDLコードへの変換対象と表示されている。C-to-Cソース変換機は、図１４のPreprocessed codeに示されたように、"for ループ"に該当する"hw_func_1"及び"min 関数"に該当する"hw_func_２"の二つのハードウェアサブルーチンを生成する。変換対象オリジナルコードのfor ループは、専用ハードウェアとのコミュニケーションを遂行するために、API ラッパ(wrapper)関数への呼び出し(call)と取り替えられた。このようなラッパファンクションの一番目のアーギュメントは、呼び出されたハードウェア関数のHWIDを示し（例えば、１の場合、ハードウェア関数 hw_func_１を示す）、残りのアーギュメントは、被呼出者に伝達される変数パラメーターを示す。ラッパ関数の細部事項は図１５（d）に示されている。
【０１２２】
図１５は、本発明の一実施例によるメインコアと専用ハードウェアとが疎結合である場合の図１４のメインコアと専用ハードウェアとの間のクロスコールの例示コードにおけるクロスコールインプリメンテーションを示す例示図である。
【０１２３】
メインコアと専用ハードウェアとが疎結合である場合、専用ハードウェアは、メインコアと別途のシステムレジスタを使い、メインコアとインターラプト(interrupting)を通じてコミュニケーションする。また、前記メインコアは、コミュニケーションのためにラッパというAPIを使う。
【０１２４】
図１５を参照すると、図１５（a）は、ソフトウェアのAPIラッパ関数がHWIP１(hardware intellectual property １)、即ち、"hw_func_１"を呼び出す場合の実行フロー(execution flow)を示し、実行段階は（１）乃至（５）と番号が付与された。
【０１２５】
段階（１）で、前記ラッパ関数は、HWIP１の最初の四個のアーギュメント（a、 b、 c及びd）をアーギュメントレジスタに保存し、最後のアーギュメントeを自分のスタックに保存し、前記SW/HWインターフェースを通じて専用ハードウェアのハードウェアコントローラのリンクレジスタにリターンアドレスを保存する。以後、前記ラッパ関数はHWIP１の実行のために、活性化信号(enable signal)である"HWID＝１"をコントローラに伝送する。
【０１２６】
段階（２）で、前記ハードウェアコントローラは、HWIP１モジュールを活性化させる。HWIP１の実行開始点で、HWIP１は、前記ハードウェアコントローラのスタックポインタ値を読み込み、自分のスタックスペースを割り当てる。HWIP１は、前記ハードウェアコントローラのリンクレジスタから自分のリターンアドレスを自分のスタックに保存し、自分のボディーコードの実行を始める。
【０１２７】
段階（３）で、HWIP１の実行が完了された場合、HWIP１は、前記スタックスペースを再保存して、リターンアドレスと一緒に終了信号(finish signal)を前記ハードウェアコントローラに伝送する。
【０１２８】
段階（４）で、前記ハードウェアコントローラは、前記ラッパ関数を活性化させるために前記SW/HWインターフェースを通じてメインコアにインターラプトシグナルを伝送する。
【０１２９】
段階（５）で、HWIP１の実行完了をラッパ関数に知らせるためにインターラプトハンドラーは、一般終了変数を設定し、前記ラッパ関数は終了される。
【０１３０】
図１５（d）は、前記ラッパ関数の擬似コード(pseudo code)を示す。ハードウェア関数を呼び出した(call)後、前記ラッパ関数は、呼び出されたハードウェア関数の実行完了(ソフトウェアがハードウェアを呼び出した場合)または呼び出されたハードウェアが他のソフトウェア関数を呼び出す(ソフトウェアがハードウェアを呼び出し、またハードウェアがソフトウェアを呼び出す場合)ことを待つ。呼び出されたハードウェア関数がソフトウェアにリターンする場合、前記ラッパは終了し、ハードウェア関数が他のソフトウェア関数を呼び出す場合、前記ラッパは、呼び出しを手伝う。
【０１３１】
ハードウェア関数からのソフトウェア関数への呼び出しも反対の場合と類似である。図１４の"hw_func_１"が"max"関数を呼び出す場合をみてみると、実行シーケンスは、図１５（b）に示されていて、実行順序は、次のようである。
【０１３２】
（１）HWIP１が"max"関数の最初の四個のアーギュメントの"a、b、c及びd"をハードウェアコントローラのアーギュメントレジスタに保存し、最後のアーギュメントの"e"を自分のスタックの底(bottom)に保存する。また、HWIP１は、前記ハードウェアコントローラのリンクレジスタに自分のリターンステートを保存する。以後、HWIP１は、hwid＝０と一緒に"max"関数の実際アドレスをsw_addr信号で前記ハードウェアコントローラに伝送し、この時、 呼び出される関数のためにhwid＝０も一緒に伝送する。
【０１３３】
（２）前記ハードウェアコントローラは、HWIP１モジュールを非活性化(disable)させ、"max"関数呼び出しのためにSW/HWインターフェースを通じてメインコアをインターラプトする。
【０１３４】
（３）インターラプトハンドラーは、グローバル変数を通じてラッパ関数に前記呼び出し(call)について通知する（図１５（d）のhw_calledを参照）。前記ラッパ関数は、前記メインコアのスタックポインタをアップデートし、アーギュメントレジスタを前記ハードウェアコントローラの値でアップデートし、自分のローカルスタックに前記HWIP１のリターンステートを 保存し、前記"max"関数を呼び出す。
【０１３５】
（４）前記"max"関数の実行が完了されると、前記ラッパ関数は、前記"max"関数のリターン値と終了信号を前記ハードウェアコントローラに伝送して、前記SW/HWインターフェースを通じてリターンステートを再保存する。
【０１３６】
（５）前記ハードウェアコントローラは、リンクレジスタからリターンステートを提供することによってHWIP１を活性化させる。
【０１３７】
図１５（c）は、図１４のHWIP１の"hw_func_１"がHWIP２の"hw_func_２"を呼び出す場合を示し、呼び出しプロセスは次のようである。
【０１３８】
（１）HWIP１は、前記ハードウェアコントローラのアーギュメントレジスタとスタックにアーギュメントを保存し、前記ハードウェアコントローラのリンクレジスタにリターンステートを保存する。以後、HWIP１は、呼び出し対象関数を示す"hwid＝２"と一緒に呼び出し信号(call signal)を前記ハードウェアコントローラに伝送する。
【０１３９】
（２）前記ハードウェアコントローラは、HWIP２を活性化させ、HWIP２は、HWIP１のリターンステートを自分のスタックに保存する。
【０１４０】
（３）HWIP２の実行完了の時、HWIP２は、呼び出した関数のHWIP１のリターンステートと一緒に終了信号を前記ハードウェアコントローラに伝送する。
【０１４１】
（４）前記ハードウェアコントローラは、HWIP１をまた活性化させ、HWIP１は、自分の元のステートで実行を再開する。
【０１４２】
次に、メインコアと専用ハードウェアとが密結合(tight coupling)である場合のメインコアと専用ハードウェア との間の呼出規約について説明する。
【０１４３】
図１６は、本発明の一実施例によるメインコアと専用ハードウェアとが密結合である場合のメインコアと専用ハードウェアとの間のコミュニケーションインターフェースを示すブロックダイアグラムである。
【０１４４】
図１６を参照すると、前記メインコアと前記専用ハードウェアのHWIPらの間のコミュニケーションは、インターコネクションネットワーク(interconnection network)を通じてなることがわかる。前記インターコネクションネットワークは、バスシステム及び前記バスシステムを制御するためのハードウェアコントローラを含む。全てのHWIP及びメインコアは、前記バスシステムを通じて他のコンポーネントが自分らのレジスタファイルを読み込めるように構成される。パブリックレジスタ(public register)は、スタックポインタ、リンクレジスタ、アーギュメントレジスタ及び関数(function)リターンレジスタを含む。従って、前記ハードウェアコントローラ内に別途のシステムレジスタセットを必要としない。
【０１４５】
前記メインコアのインターフェースは、前記ハードウェアコントローラがインターラプト信号を使うかわりに、直接制御信号を伝送したり、受信できるようにしていて、前記メインコアとHWIPらは、all-to-allネットワークトポロジー(topology)によって連結されていないため、一つのコンポーネントが他のコンポーネントと通信することを求める場合、前記ハードウェアコントローラを通じて、通信(communicate)すべきである。前記ハードウェアコントローラは、前記メインコアとHWIPの呼び出し制御信号(call control signal)を検査(examine)し、決定によって、呼び出しシーケンス(calling sequence)に基づいて、対象となるコンポーネントを活性化させ、コンポーネントがバスにデータを伝送できるようにする。メインコア乃至HWIPが呼び出しを求める場合、呼び出し制御信号及び被呼出者のアドレスを前記ハードウェアコントローラに伝送し、前記ハードウェアコントローラは呼び出し対象を確認して、呼出者を非活性化させ、被呼出者を活性化させ、呼出者のレジスタをバスが読み込めるようにする。被呼出者が呼出者にリターンする場合、被呼出者も同様に終了信号(finish signal)とリターンアドレスを前記ハードウェアコントローラに伝送する。前記ハードウェアコントローラは、リターンアドレスをチェックして呼出者を確認し、被呼出者のリターンデータをバスが読み込めるようにし、被呼出者を非活性化させて、呼出者をまた活性化させる。
【０１４６】
図１７及び１８は、本発明の一実施例によるメインコアと専用ハードウェアとが密結合である場合の図１６のクロスコールインプリメンテーションを示すブロックダイアグラムである。
【０１４７】
コミュニケーションオーバーヘッドを減らすために、前記メインコアのインターフェースは、前記専用ハードウェアとよりよい相互協力ができるようにもディファイ(modify)される。即ち、software-to-hardcore呼び出しを遂行するために中間(intermediate)段階を減少させるために、"hcall"と呼ばれる特殊命令(special instruction)が前記メインコアのISAに加えられる。コンパイリングする場合、 メインコンパイラは、被呼出者がハードウェア部分コードを具現されるか、ソフトウェア部分コードと具現されるかをチェックし、ハードウェア関数である場合、メインコンパイラは、一般ファンクションコールインストラクションのかわりに"hcall"インストラクションを自動的に生成する。"hcall" インストラクションの使用は、前記メインコアがsoftware-to-hardwareクロスコールを一つの機械命令(machine instruction)のきで直接遂行できるようにする。インストラクションセットを修正(modify)しなければ、前記メインコアは、専用ハードウェアとの通信(communicate)のために、図１４のラッパ関数のような中間API関数を使わなければならなく、この場合、高いオーバーヘッドを免れない。
【０１４８】
図１７を参照すると、本発明によるsoftware-to-hardware cross call遂行は、（１）乃至（６）の６段階からなることがわかる。
【０１４９】
（１）"hcall"インストラクションが実行段階である場合、"hcall"インストラクションは、メインコアパイプラインをストール(stall)するために"nx_pc_unready"信号を開始されるように(trigger)する。
【０１５０】
（２）前記信号は、フェッチ(Fetch)コントローラコンポーネントがインストラクションフェッチング(fetching)プロセスをストール(stall)するようにし、前記メインコアが"hcall"インストラクション以後の全てのインストラクションを前記パイプラインとインストラクションキュー(instruction queue)からフラッシュ(flush)するようにする。
【０１５１】
（３）前記"hcall"が、write back段階で実行される場合、呼び出しについて通知するために、"hw_enable"信号が被呼出者(callee)のHWIDと一緒にハードウェアコントローラに伝送され、また、一般的呼び出しのようにおリターンアドレスのための次の実行アドレスがリンクレジスタに保存される。
【０１５２】
（４）ハードウェア側から、前記ハードウェアコントローラは、伝送されたHWID値に基づいて"hw_enable"信号及びコントロールシグナル"called"を用いて呼び出されたHWIP１を活性化させる。 
【０１５３】
（５）活性化されたHWIP１は、メインコアのスタックポインタ、アーギュメントレジスタ、リンクレジスタなどの出力値(output value)をこれらに該当する自分のレジスタにコピーし、実行を開始する。HWIP１の実行完了の時、HWIP１は、終了信号を前記ハードウェアコントローラに伝送し、前記ハードウェアコントローラは、リンクレジスタ内のHWIP１のリターンアドレスをチェックして呼出者(caller)が前記メインコアであることを確認する。
【０１５４】
（６）確認後、前記メインコントローラは、被呼出者(callee)のHWIP１の終了ステータス(status)を知らせるために"hw_fin"信号を伝送する。
【０１５５】
前記メインコアは、フェッチングプロセスを活性化させ、スタックポインタ、リンク及びリターンレジスタなどを被呼出者の値で調整(set)する。以後、前記メインコアは、リンクレジスタのハードウェア関数のリターンアドレスから実行を再開する。
【０１５６】
図１８を参照すると、本発明によるhardware-to-software cross call遂行は、（１）乃至（５）の５段階からなることがわかる。
【０１５７】
（１）HWIP１は、呼び出し信号(call signal)及び呼び出し対象関数のアドレスを説明する"target_addr"信号を含む制御信号をハードウェアコントローラに伝送する。また、HWIP１は、自分のリンクレジスタに自分の次のステートのアドレスを保存し、アーギュメントを自分のアーギュメントレジスタとスタックスペースに保存する。
【０１５８】
（２）前記ハードウェアコントローラは、"target_addr"信号を検査して呼び出される関数がメインコアのソフトウェア関数であることを確認し、ハードウェア関数からの呼び出しについて前記メインコアに通知するために"sw_enable"信号を伝送する。呼び出された場合、呼び出されたソフトウェア被呼出者(callee)を実行するため、前記メインコアは、呼出者(caller)のデータをバスを通じて自分のレジスタにコピーし、自分のプログラムカウンターレジスタを"target_addr"信号値と設定し、フェッチングインストラクションを活性化させる。
【０１５９】
（３）被呼出者の実行完了の時、前記メインコアは、呼出者のHWIP１にリターンする。呼び出したハードウェア関数(function)にリターンする場合、前記メインコアは、一般的ソフトウェアリターンと違って、対象アドレスにジャンプしないで、フェッチングインストラクションをストール(stall)し、パイプラインをフラッシュするために"nx_pc_unready"信号を設定する。
【０１６０】
（４）Write back段階にハードウェアリターンインストラクションは、"sw_fin"信号を前記ハードウェアコントローラに伝送する。
【０１６１】
（５）前記ハードウェアコントローラは、リンクレジスタ値を検査して、呼出者(caller)がHWIP１であることを確認し、"hw_enable"信号でHWIP１を活性化させる。再活性化された場合、HWIP１は、被呼出者(callee)のリターン値を読み込んだ後、リンクレジスタ内の自分のステート変数をアップデートし、該当ステートから実行を再開する。 
【０１６２】
以上、本発明の実施例による高水準言語コードのHDLコードへの変換方法及びシステムについて説明したが、本発明は、前記実施例に制限されず、多くの変型が本発明の思想内に本発明の属する技術分野で通常の知識を有した者によって可能となることは勿論のことである。
【図１】
0005568566.tif 000002
【図２】
0005568566.tif 000003
【図３】
0005568566.tif 000004
【図４】
0005568566.tif 000005
【図５】
0005568566.tif 000006
【図６】
0005568566.tif 000007
【図７】
0005568566.tif 000008
【図８】
0005568566.tif 000009
【図９】
0005568566.tif 000010
【図１０】
0005568566.tif 000011
【図１１】
0005568566.tif 000012
【図１２】
0005568566.tif 000013
【図１３】
0005568566.tif 000014
【図１４】
0005568566.tif 000015
【図１５】
0005568566.tif 000016
【図１６】
0005568566.tif 000017
【図１７】
0005568566.tif 000018
【図１８】
0005568566.tif 000019