SFLでは、ステートマシンはステージ記述内のみで許されている。ただし、ステートマシンの動作とステージの動作は独立していて、ステージが呼び出されても状態レジスタは初期化されない。
ステートとステージが独立というのは納得できる設計だけれど、独立なら、ステージ内という制限も緩和可能では?
と思い立ち、{ } ブロック(parの拡張NSL文法)内に状態を記述できるようにした。未確認だが、状態のネストもできるように作った(はず)。
状態遷移は、あるFSMの状態を変更するという意味であり、ステージを起動するなどとは本質的に異なる。state文は当該状態における動作を記述する。
SFLでは、ステージと組み合わされて状態が説明されるため、きわめてわかりにくい。パイプライン制御を行なう時には、パイプラインステージ内で状態を回すのは、よほどコルーチン的な変わった制御をするとき以外にはない。(普通は、パイプラインレジスタから制御をもらうように作るはず)
ところが、パイプラインと関係ない回路ではFSMで状態を回すのは常識である。なので、これらを組み合わせず、独立に扱うことで、幅広い設計分野に自然な記述が可能となる。
初期状態は、最初に記述された状態に自動的にする。ブロック内に状態宣言があるかどうかを最初の宣言文で判定するため、記述順序には制限があるので、注意。
下記の例は、st1~st3を延々と繰り返す遷移を行なう。状態レジスタはクロック同期なので、毎サイクル新しい状態に遷移する。
moudule test {
{
state_name st1,st2,st3;
state st1 goto st2;
state st2 goto st3;
state st3 goto st1
}
}
たとえば、次のような使い方は、よく行なわれるかも?
moudule test2 {
control_in trans;
function trans {
state_name st1,st2,st3;
state st1 goto st2;
state st2 goto st3;
state st3 goto st1
}
}
この回路は、外部から制御入力transを受けたときにのみ、状態を回す。状態が有効なのは、このブロックが有効なとき(すなわち、transが入ってきたときのみ)なことに注意。
20090910から暫定サポート