procとfunctionという新しい概念を入れる。
新しいといっても、functionはinstrselfの異形であり、
procは、stage+taskの簡易版である。つまり、functionは同一クロック内でのアクションを定義し、procは起動した次のクロックにおけるアクションを定義する。
1クロックで終了するfunctionと異なり、procは明示的にfinishするか、別のprocもしくはstageを起動するまで、実行を続ける。
どちらも、構文上の分り易さをねらったものだ。
functionを定義するには、
func_name 名前(引数リスト);
で定義する。引数リストには、sel変数を指定する。
procを定義するには、
proc_name 名前(引数リスト);
で定義する。引数リストには、レジスタ変数を指定する。
実行本体は、制御実行文として、
function 名前 アクション
proc 名前 アクション
のように記述する。
これらを用いる例を↓に示す。
module t { input a; output f; sel b,c; reg d,e,g; func_name x(b,c); proc_name y(d,e); { x(a,a); } /* 共通動作で、function xを起動 */ function x { f= b&c; y(b,c);} /* xから、proc yを起動 */ proc y { g := d|e; if(g) finish;} /* gが1ならyをfinish */ }
プロトタイプはできているが、もう少し確認してから、アップロード予定
追記
procやfunctionの書式を使うと、instr_argという書式が不恰好に思えてきて、instroutやinstrinなどの引数定義をfunc_nameに合わせてみる。
(従来通りのやり方も使える)
declare文では、例えば、
declare test1 { input a,b; output f; instrin exe(a,b); }
のように、従来のように、引数を別に記述していたのに比べて、
記述量も減るし、分り易くなったと思う。
instroutも同様の拡張をした。