Skip to content

Instantly share code, notes, and snippets.

@ikwzm
Last active March 12, 2017 23:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ikwzm/bab67c180f2f1f3291998fc7dbb5fbf0 to your computer and use it in GitHub Desktop.
Save ikwzm/bab67c180f2f1f3291998fc7dbb5fbf0 to your computer and use it in GitHub Desktop.
method-interface

Method Interface

Signals and Timing Chart example

Fig.1 Method Interface

Fig.1 Method Interface


メソッドの開始と引数の転送 - function request

  • メソッドの開始と引数の転送は 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 レベルになるのを待ってもかまいません。

メソッドの終了と戻り値の転送 - function response

  • メソッドの終了と戻り値の転送は 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 信号のハンドシェイクでメソッドの終了を示します。

メソッドの引数 - function arguments

  • 引数の数は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>)の値を変更してはいけません。

メソッドの戻り値 - function return value

  • 戻り値(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 busy

  • メソッドのリクエスト(function request)とレスポンス(function response)以外に、メソッドが動作中(busy)なのか待ち状態(idle)なのかを示すための func_busy 信号があります。

  • この信号の主な目的は、メソッドが今どのような状態なのかを外部から判別するためです。例えば、次のような用途に使うことを想定しています。

    • 呼び出し側が func_req_valid 信号を High レベルにする前にこの信号を見て busy ならばメソッドの呼び出しを遅らせて別の処理をします。
    • 何らかの事情でメソッドが無限ループやデッドロックに陥った状態を判別します。これは特にデバッグ時に重宝します。

メソッドのチェーン

メソッドの開始(function request)のハンドシェイクとメソッドの終了(function response)のハンドシェイクを別々にして、かつ同じようなプロトコルで対称性を持たせることで、下の図のようなメソッドをチェーンのようにつなげることが出来ます。

Fig.2 method chain

Fig.2 method chain


このように各メソッドをデーターフローのノードとして扱えるため、状況に応じて、Fork や Joinのような柔軟な構成をとることが出来ます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment