3.4 時間


SFL言語は,「単相クロックの同期回路」を対象としているので,レジスタやメモリまたは記憶要素で構成されるステージの状態,タスク,セグメントの戻り状態は,クロックに同期して変化します.ここでは考え易いように単相クロックの同期回路を対象とすると説明しましたが,実際の回路ではマスタ・クロック,スレーブ・クロックで更新されるマスタ・スレーブ・ラッチによるレジスタでもかまいません.要はある契機でレジスタが一斉に更新されることがポイントです.

また,SFL言語では最初のクロック投入の前にパワー・オン・リセットが行われ,ステージの状態は初期状態とされ,タスクを表すレジスタはリセットされます.レジスタはその種類によりセット,リセットまたは不定 (unknown) のままとされます.メモリは不定のままとされます.

SFL言語ではシステム・リセットやユニット・リセットなどを扱うための特別な形式はありません.各種のリセットは,通常の動作として設計・記述しなければなりません.これらはすべて同期リセットとなります.

マシン・サイクル

クロックから次のクロックまでをマシン・サイクルといいます.厳密に考える必要はありませんが,クロックはマシン・サイクルに含めないとする方が考えやすいでしょう.クロックはマシン・サイクルとマシン・サイクルを区切る契機ということになります.

ステージの動作の記述例

制御端子の動作,ステージの動作はマシン・サイクルを時間の最小単位として記述します.マシン・サイクル内の前後関係は指定しません.たとえば,

state st1 par {
goto st2 ;
out = counter ;
counter := in ;
do() ;
}

は,「あるステージが st1 という状態にあるマシン・サイクルでは,

 goto st2 ;

out = counter ;

counter := in ;

do() ;

を実行する」ことを表し,これら四つの動作は,記述の順序に関係なく並列に実行されます.

ここで par は複数の動作をまとめるキーワードで,また st2 は別の状態,out はデータ出力端子, counter はレジスタ名,in はデータ入力端子,do は制御出力端子の名称とします.

counter:=in; というレジスタへの書き込みによって,レジスタの値が更新されるのはクロックの時点です.更新された値が参照できるのは,次のマシン・サイクルです.またレジスタの値は,次に更新されるまで保存されます.

ステージの状態は状態レジスタにより保持されているので goto st2; という状態遷移によって,ステージの状態が変更されるのはクロックの時点です.ステージの状態が変更された状態となるのは,次のマシン・サイクルです.またステージの状態は,次に変更されるまで変わりません.

一方,out=counter; というデータ端子への値の出力では,データ端子の値はすぐに更新されます.たとえば,a,b,c が皆データ端子だとして,

par { a = b;
b = c;
c = 0x4; /* 0x4 は 16進数の 4 を表す */
}

では,このマシン・サイクルで,a,b,c は,ともに 4 になります.また,データ端子の値が複数のマシン・サイクルにわたって保存されることはありません.

レジスタやステージの状態の更新の契機とデータ端子の値の変化のタイミングが違うことを説明してきましたが,要はその要素が「レジスタのような記憶素子」か「単なる端子」なのかでこの違いが決まります.従って動作主体(ステージ,制御端子)の起動に関しても同様で,「ステージのタスクのセット,リセットの結果が反映されるのは次のマシンサイクルから」,「制御端子の起動はすぐに反映される」ということになります.したがって,この節の最初の例の do(); という制御端子の起動は,このマシン・サイクルでただちに実行されます.

複数動作の記述例

レジスタやメモリへの書き込みや状態遷移,タスクのセット,リセットはクロックの時点で行われること,データ端子への値の出力や制御端子の起動はすぐに行われることから,あるマシン・サイクル内の複数の動作は記述された順序によらず,同一の結果となります.たとえば,

state st1  any {
flg : if ( do().result ) reg2 := in ;
else : reg1 := in ;
}

instruct do par {
result = 0b1 ;
}

は「あるステージが st1 という状態であるとき,flg が 1 ならば

if ( do ().result ) reg2 := in ;

を実行し,そうでなければ

reg1 := in ;

を実行する.また制御端子 do が起動されたときは

result = 0b1 ;

を実行する」と読みます.また

if ( do().result ) reg2 := in ;

は「もしdo().result が 1 ならば

reg2 := in ;

を実行する」と読みます.また

do().result

は「制御端子 do を引数なしで起動して結果を result に得る」と読みます。キーワードの any や if については 3.10節で説明します。

さてこの例では,あるときflg が "0" ならば,論理的には制御端子 do の動作は実行されず,result の値は"値なし"となりますが,if ( do().result ) の条件参照も実行されないので,エラーとはならず,結局 reg1 :=in; のみが実行されます.値なしの要素を条件参照してはならないという説明は 3.10節で行います.

実際の回路では,flg が組み合わせ回路の出力であれば,その値が定常状態に落ち着くまでは "1" や "0" に振動することがあり,その結果として制御端子 do の値,さらに result の値やレジスタ reg2 への書き込み信号も "1" や "0" に振動します.しかし,「すべての組み合わせ論理が定常状態になってからレジスタへの書き込みを行う」というのが SFL言語のモデルであり,SFL言語のモデルが成立していれば論理的な動作と実際の回路の動作の結果は同じになります.


ハードウェア動作の記述言語〜 SFL のページへ戻る

ホームページに戻る