はじめに
ちょっと内輪で必要になったので各種高位合成ツールが生成するモジュールの外部インターフェースをまとめてみました。まだ未完成です。これからいろいろと追加していく予定。
Synthesijer Method Interface
Fig.1 Synthesijer Method Interface
- 制御は func _req と func _busy の2本のハンドシェイク。
- func _busy が L の時に func _req を H にすることでメソッド呼び出し(cycle 1)。
- func _busy が H になった時点で速やかに func _req をL にする(cycle 2)。ただし次のクロックの立ち上がり(cycle 3)まで H でも可。
- メソッドの引数は func _req が H の時に有効な値を入力(cycle 2)。
- メソッドの終了は func _busy が H から L に遷移したことで判別する(cycle 6)。
- メソッドの戻り値は func _busy が H からL に遷移したサイクル(cycle 6)の一つ前のサイクル(cycle 5)で出力されるようだ。
- cycle 5 でなんらかの信号を出力してくれると、呼び出し側としては1サイクル早くシーケンスを進めることが出来るのにと思わないでもない。
Polyphony Method Interface
Fig.2 Polyphony Method Interface
- 制御は func _ready、 func _valid、 func _accept の3本。
-
func _ready を H にすることでメソッド呼び出し(cycle 1)。
ただしモジュールが動作中かどうかを示す信号が提供されていないので、メソッド呼び出しに関してハンドシェイクが出来ないのが難点。メソッド実行中に func _ready を H にしても無視される。 - メソッドの引数は func _ready が H の時に有効な値を入力(cycle 2)。
- メソッドの戻り値は func _valid が H の時有効(cycle 5〜)
- メソッドの終了は func _valid が H の時に func _accept を H にした時(cycle 5)。
- メソッド終了(cycle 5)以降も func _valid は H の状態であることに注意。次のメソッド開始まで H の状態を保つ。
Vivado-HLS Method Interface
Fig.3 Vivado-HLS ap_ctrl_hs Interface (non-pipeline)
- メソッドの開始は ap_start と ap_ready でハンドシェイク。
ap_start を H にすることでメソッド開始。ap_ready が H になるまで ap_start は H の状態を保つ。 - メソッドの引数は ap_start が H の時に有効な値を入力(cycle 1-5)。
- メソッドの終了は ap_done が H になったことで判別(cycle 5)。
- メソッドの戻り値は ap_done が H の時有効(cycle 5)。
- メソッドが動作中は ap_idle は L になる。
- パイプライン処理で無い場合は、ap_ready が H になるタイミングは ap_done が H になるタイミングと同じ(cycle 5)。
- パイプライン処理の場合は下の図のようにap_ready が H になるタイミングと ap_done が H になるタイミングがズレる。
Fig.4 Vivado-HLS ap_ctrl_hs Interface (pipeline)