アダルト・ヴァイオリン May the force be with you..

2009年9月10日

回路状態とステートマシン

Filed under: Weblog — い~ぐる @ 9:52 PM

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から暫定サポート

Linuxを使う上の落とし穴

Filed under: Weblog — い~ぐる @ 10:58 AM

某所のLinuxカーネル読解講座で、私が直接担当している部分の内容的は、
・スケジューラ
・メモリ管理
・デバイスドライバ

なのだが、サブテーマとして
・Linuxを使う上の落とし穴
ということを考えながら教材を作っている。

メインテーマ以外に、下記の内容をカーネルソースコードと対比させながら調べ、例題を含め、しっかり実習して、サンプルコードも受講者には配布するので、次の日から仕事に使える。

・メモリ参照順序によるプログラム性能の差
  ・メモリアロケータ
  ・キャッシュ
  ・TLB
・デバイスドライバの作り方
  ・procfsエントリの作り方
  ・sysctlエントリの作り方
  ・割込みを使う例
  ・タイマを使う例
  ・タスクレットを使う例
  ・ワークキューを使う例
  ・時間にクリチカルなデバイスを用いた実装演習

この経済状況で、参加者が減少し、講座は閉鎖の危機だそうだが、これらの内容が役に立つ人はまだまだ多いはずなので、単に閉鎖してももったいない気がする。

Powered by WordPress