3.6 ステージ


3.2節で SFL ではハードウェアの動作を手続きで表現すると説明しました.ステージはこの手続きを表現するための構成要素です.ソフトウェアではどんなに複雑であっても手続きは一本しかありません.しかし一本の手続きではハードウェアの並列性を表現するのは困難です.そこで手続きを複数書けるようにステージという構成要素を考えたわけです.

複数のステージを制御するには

ステージを複数使用することにより,複雑な制御を簡明に記述することができます.

(1) 並列制御 : あるステージから他の二つ以上のステージへ下請け的処理を生成して,自身はその終了を待つようにして並列度を向上できます.下請け的処理の生成はジョブの生成により記述します.下請けステージは処理が完了した段階でジョブを終了させます.

(2) おいてきぼり制御 : 処理の結果をすぐには必要としない場合には,他のステージへ下請け的処理を生成して,自身はその終了を待たずに先へ行くようにして並列度を向上できます.このときも,下請け的処理の生成はジョブの生成により記述します.

(3) パイプライン制御 : 処理を複数のステージで流れ作業的に行うようにして並列度を向上できます.複数のステージ間の処理の受け渡しは,ジョブの転送により記述します.

ここで,ジョブの生成とは「自身が動作状態であることとは別の新たな動作状態であることを,他のステージに生成すること」です.ジョブの転送とは「他のステージへ自身が動作状態であることを転送する(渡す)」ことです.ジョブの終了とは「動作状態であることを終了(消滅)させる」ことです.ジョブとは「ステージ間で生成,転送,終了される動作状態であること」です.ジョブの数を増やすことが並列度を上げることになります.

パイプライン制御におけるステージ,タスク,ジョブの関係

これまでの説明ではイメージがいまひとつはっきりしないと思いますのでパイプライン制御を例に,ステージ,タスク,ジョブの関係を説明します.

<図3.2> ステージ,タスク,ジョブの関係



図3.2 に示すように,ハードウェアの動作では,「空間のひろがり」と「時間の流れ」の両方を考える必要があるために,ステージやジョブ,タスクの概念が用意されています.ステージは手続きを実行する構成要素ですが,複数のステージは空間的に分れて存在しています.イメージとしては職場の中の人間をステージ,伝票をジョブと考えると良いでしょう.「複数ステージにわたって実施される一連の処理」をジョブと呼びます.ジョブは,マシン・サイクルごとに見れば,いずれかのステージに存在します.このとき,ジョブが存在するステージは,動作状態にあります.

ジョブを,あるステージから他のステージに渡すことをジョブの転送とよびます.ジョブの転送を行ったステージは「タスクがリセット」されることで動作状態でなくなり,ジョブの転送を受けたステージは「タスクがセット」されることで動作状態となります.LSI の中でジョブというものを本当に移動させるわけにはいかないのでタスクのセット・リセットに置き換えているわけです.

図3.2 ではジョブが三つありますが,これらが同じ処理であったとしても,ジョブとしては別々のものだと考えます.

複数ステージの記述例

次に,図3.2の処理を SFL でどう記述するかを説明します.

モジュールの外部端子やステージ以外の構成は 3.3節で述べたように

タイプ名 インスタンス名{,インスタンス名};

で定義できるのですが,ステージは構造が複雑ですから記述も複雑となります.ステージの記述は大きく二つの部分に分けられ,一つはステージの存在を宣言する部分,もう一つはステージの内容を定義する部分となります.ステージの存在の宣言では,タスクと引数の定義もいっしょに行います.この例ではステージが A,B,C と 3つありますので,まず,

stage_name A {
task a () ;
}
stage_name B {
task b () ;
}
stage_name C {
task c () ;
}

と宣言します.タスクは各ステージに 1個のみとすると本来名前をつけて区別する必要はないのですが,何か名前をつけて下さい.ここでは単に a,b,c としました.タスクは 1ステージに複数個宣言することもできます.

次にステージ本体の定義を記述します.仕事をしたふりをする (何もしない) ステージであれば次の様になります.

stage A {
relay B.b() ;
}
stage B {
relay C.c() ;
}
stage C {
finish ;
}

これらの記述で図3.2 のパイプライン動作が記述できたことになります.ステージ A,B,C は状態遷移をせず,単にジョブを次のステージへ転送 (たらい回し) しているだけですが,状態遷移を行う場合は,

stage X {
state_name st1, st2 ;
first_state st1;
state st1 par {
....
}
stage st2 par {
....
}
}

のように記述します.ここでも実際の各状態の内容を定義する前にどのような状態が存在するかの宣言 (state_name の部分) が必要です.


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

ホームページに戻る