04. メソッド(関数)の定義
メソッド(関数)には、以下の2種類の定義があります。
- function
- task
functionは返り値の定義もあり、一般的なプログラムで定義する関数に相当します。functionは、基本的に0シミュレータ時間で処理され、時間の概念がありません。例えば、ある信号の状態待ち、イベント待ち、クロック同期処理を記述することはできません。
一方taskは、返り値の定義がない関数です。実行には時間の概念があり、シミュレータ時間を消費する処理を記述することが出来ます。ある信号の状態待ち、イベント待ちやクロック同期処理などを記述するのに適しています。
★実行について
これらの関数は、定義しただけでは動作しません。initialブロックから呼び出されたときに実行されます。この場合、taskもfunctionも呼び出し可能です。taskは、内部から他のtaskやfunctionを呼び出すことができます。functionは、内部から外のfunctionを呼び出すことができますが、taskは呼び出せません。何故なら、taskは時間を消費する記述ができますが、functionは時間を消費する記述ができないからです。
★functionからtaskを呼び出す ~ fork - join_none
特定の方法を使えばfunction内部でtaskを呼び出すことができます。それには、fork - join文法を使います。以下のように記述することで実現できます。
fork
task_A(...);
join_none
fork - joinは、複数の処理ブロックを同時に実行するものです。forkで始まり、joinで閉じるわけですが閉じる記述には
- join
- join_any
- join_none
があります。joinは、複数の処理ブロックを同時に実行し、実行したすべての処理ブロックの動作が完了するまで待ちます。join_anyは、複数の処理ブロックを同時に実行したあと、どれか1つの処理ブロックが動作完了するのを待ちます。join_noneは、複数の処理ブロックを同時に実行するだけで、どの処理ブロックの動作完了も待ちません。つまり、functionからみればfork - join_noneで実行した処理ブロックの完了を待つ必要がないため、時間を消費しないものと捉えられます。