Fig.1 Method Interface
-
メソッドの開始と引数の転送は func_req_valid 信号と func_req_ready 信号のハンドシェイク。
-
ハンドシェイクのプロトコルは VALID-then-READY プロトコルに従います。
VALID-then-READY に関しては、『VALID 信号と READY 信号によるハンドシェイクの注意点』を参照してください。- 呼び出し側は引数(func_req_<num>_<name>)に有効な値を出力すると共に func_req_valid信号 をHigh レベルにします。
- メソッド側は受け入れ可能ならば func_req_ready 信号を High レベルにします。
- func_req_valid 信号と func_req_ready 信号が共に High レベルになった時、引数(func_req_<num>_<name>)の転送が完了しメソッドは処理を開始します。
- 呼び出し側は一旦 func_req_valid 信号を High レベルにしたら、func_req_ready 信号 がHigh レベルになるまで func_req_valid信号を Low レベルにしてはいけません。
- 呼び出し側は一旦 func_req_valid 信号を High レベルにしたら、func_req_ready 信号が High レベルになるまで引数(func_req_<num>_<name>)の値を変更してはいけません。
- メソッド側は一旦 func_req_ready 信号を High レベルにしたら、func_req_valid 信号は High レベルになるまで func_req_ready 信号を Low レベルにしてはいけません。
- 呼び出し側は func_req_valid 信号を High レベルにするために func_req_ready 信号が High レベルになるのを待ってはなりません。
- メソッド側は func_req_ready 信号を High レベルにするために func_req_valid 信号が High レベルになるのを待ってもかまいません。
-
メソッドの終了と戻り値の転送は func_res_valid 信号と func_res_ready 信号のハンドシェイク。
-
ハンドシェイクのプロトコルは VALID-then-READY プロトコルに従います。
VALID-then-READY に関しては、『VALID 信号と READY 信号によるハンドシェイクの注意点』を参照してください。- メソッド側は戻り値(func_res_<num>_<name>)に有効な値を出力すると共に func_res_valid信号 をHigh レベルにします。
- 呼び出し側は受け入れ可能ならば func_res_ready 信号を High レベルにします。
- func_res_valid 信号と func_res_ready 信号が共に High レベルになった時、戻り値(func_res_<num>_<name>)の転送が完了します。
- メソッド側は一旦 func_res_valid 信号を High レベルにしたら、func_res_ready 信号 がHigh レベルになるまで func_res_valid信号を Low レベルにしてはいけません。
- メソッド側は一旦 func_res_valid 信号を High レベルにしたら、func_res_ready 信号が High レベルになるまで戻り値(func_res_<num>_<name>)の値を変更してはいけません。
- 呼び出し側は一旦 func_res_ready 信号を High レベルにしたら、func_res_valid 信号は High レベルになるまで func_res_ready 信号を Low レベルにしてはいけません。
- メソッド側は func_res_valid 信号を High レベルにするために func_res_ready 信号が High レベルになるのを待ってはなりません。
- 呼び出し側は func_res_ready 信号を High レベルにするために func_res_valid 信号が High レベルになるのを待ってもかまいません。
-
戻り値(func_res_<num>_<name>)の数は0以上です。戻り値が無い場合でも、func_res_valid 信号と func_res_ready 信号のハンドシェイクでメソッドの終了を示します。
-
引数の数は0以上です。
-
引数の信号名は func_req_<num>_<name> です。
- <num> は必須ですが、_<name> は省略可能です。
- <name> がある場合の命名規則は sprintf("%s_req_%d_%s", <func>, <num>, <name>)です。
- <name> が無い場合の命名規則は sprintf("%s_req_%d", <func>, <num>)です。
- <func> はメソッドの名前です。
- <num> は引数の番号を示します。
- <name> は引数の名前を示します
- 引数の信号名に <num> を入れた理由は、引数の信号名をソートした時に <num> が無いと順番が判らなくなるのと、 valid や readyという名前の引数があったとき、func_req_valid とか func_req_ready という信号名になってしまうからです。さすがに番号から始まる引数名は無いでしょう。
-
呼び出し側は一旦 func_req_valid 信号を High レベルにしたら、func_req_ready 信号が High レベルになるまで引数(func_req_<num>_<name>)の値を変更してはいけません。
-
戻り値(func_res_<num>_<name>)の数は0以上です。
-
戻り値の信号名は func_res_<num>_<name> です。
- <num> は必須ですが、_<name> は省略可能です。
- <name> がある場合の命名規則は sprintf("%s_res_%d_%s", <func>, <num>, <name>)です。
- <name> が無い場合の命名規則は sprintf("%s_res_%d", <func>, <num>)です。
- <func> はメソッドの名前です。
- <num> は戻り値の番号を示します。
- <name> は戻り値の名前を示します
- 戻り値の信号名に <num> を入れた理由は、戻り値の信号名をソートした時に <num> が無いと順番が判らなくなるのと、 valid や readyという名前の引数があったとき、func_res_valid とか func_res_ready という信号名になってしまうからです。
-
メソッド側は一旦 func_res_valid 信号を High レベルにしたら、func_res_ready 信号が High レベルになるまで戻り値(func_res_<num>_<name>)の値を変更してはいけません。
-
メソッドのリクエスト(function request)とレスポンス(function response)以外に、メソッドが動作中(busy)なのか待ち状態(idle)なのかを示すための func_busy 信号があります。
-
この信号の主な目的は、メソッドが今どのような状態なのかを外部から判別するためです。例えば、次のような用途に使うことを想定しています。
- 呼び出し側が func_req_valid 信号を High レベルにする前にこの信号を見て busy ならばメソッドの呼び出しを遅らせて別の処理をします。
- 何らかの事情でメソッドが無限ループやデッドロックに陥った状態を判別します。これは特にデバッグ時に重宝します。
メソッドの開始(function request)のハンドシェイクとメソッドの終了(function response)のハンドシェイクを別々にして、かつ同じようなプロトコルで対称性を持たせることで、下の図のようなメソッドをチェーンのようにつなげることが出来ます。
Fig.2 method chain
このように各メソッドをデーターフローのノードとして扱えるため、状況に応じて、Fork や Joinのような柔軟な構成をとることが出来ます。