SECONDS (Sfl Extended CONversational Design System)は,PARTHENONシステムの SFL動作シミュレータです.SECONDSは,会話型のシステムで,すべての制御(SFLの読み 込みやシミュレーション・パターンの設定など)はコマンドで行います.SECONDSでは,
(1) コマンドは,listening-streamから文字列として読み込まれ,
(2) コマンドによるシミュレーション結果は,speaking-streamに文字列として出力され,
(3) エラー発生時のエラー・メッセージはclaiming-streamに文字列として出力されます.
なお,SECONDS起動時にそれぞれのストリームは,
listening-stream :標準入力として設定されます.speaking-stream :標準出力
claiming-stream :標準エラー出力
● シミュレーション手順
SECONDSでのシミュレーション作業は,通常,以下の手順で行います.
(1) SFLの読み込み (sflread,sflloadコマンド)
(2) シミュレーション・イメージの構築 (install,autoinstallコマンド)
(3) シミュレーション・パターンの設定 (set,sch_addコマンド)
(4) プローブの設定 (rpt_addコマンド)
(5) forwardコマンドの実行
以上の手順により,プローブ(複数可)の値が,時系列としてspeaking-streamに出力されます.
● タイミングのモデル
SECONDSは,SFLが対象とする同期式の順序回路を「0-遅延の遅延モデル」でシミュレートします.
すなわち,図5.1のようなクロックが想定され,メモリ,レジスタ,ステージ,タスク,セグメント といった「記憶をもつオブジェクト(レジスタ系ファシリティ)」の値は,このクロックを契機 にして一斉に更新されます.
一方,制御端子,データ端子などの「記憶のないオブジェクト(端子系ファシリティ)」の値や, SFLの条件式,レジスタ系ファシリティの入力は,レジスタ系ファシリティの変化後にただちに変化 します.このあと,次のクロックが入るまで,オブジェクトの値が変わることはありません(ハザー ドなどの現象は観測されない).
実際の回路との対応で考えると,シミュレーション結果として観測できる値は,'↑' で示した, (次のクロックが入る直前の)すべての信号値が安定した時点での値です.クロックとクロックの間 をシミュレーション・タイムと呼びます.最初のinstallコマンドが発行された時点 (シミュレーション・イメージが作成された時点)で,シミュレーション・タイムは 0 に設定されます.
● 競合の解決 (conflict resolution)
SFLでは,タスク,制御端子への書き込みは ORゲートが介在し,その他のファシリティへの書き込み には 3ステート・ゲートが介在するものと仮定しています.
したがって,タスクの終了("0"の書き込み)とタスクの生成("1"の書き込み) が同じタスクを対象にした場合には,次のシミュレーション・タイムにおけるタスクの値は, "1"となります.しかし,その他のファシリティへの書き込みでは,二つ以上の異なる値 が書き込まれた場合,エラーが出力されます.このとき,SECONDSのアルゴリズムによりどれか一つの 値が選択されますが,どの値が選択されるかは予測不能です.シミュレーションを続けることはできますが, その後のシミュレーション結果は保証されません.
● 4値モデル
SECONDSが値として扱うビット列の各ビットの値は,"0","1","u", "z"の 4値で,それぞれ,
"0":論理偽を表します.ハイ・インピーダンスは,すべての演算で,"u"と等価な値として扱われます. "u"と"z"の扱いが異なるのは,ファシリティの値を報告するときだけです."1":論理真
"u":真偽不明
"z":ハイ・インピーダンス(ドライブされていない)
● "u"の演算
SFLには,多くの演算子がありますが,一般に"u"が演算対象となるときは, "u"の代わりに"0"と"1"で演算してみて,結果が等しいビットは, その値が演算結果となり,結果が異なるビットは,"u"が演算結果となります. 表5.1にAND,OR,NOT演算における真理値表を示します.
<表5.1> "u" の演算例
SECONDSでシミュレーションを行うには,まず対象となるSFL記述を sflreadコマンドや sflloadコマンドで読み込みます.しかしそれだけでは,シミュレーションはできません. これらは,回路を構成するための部品(モジュール・クラス)を集めてくるだけです. 実際にシミュレーションをするには,これらの部品を配置して,回路を構成しなければなりません. SECONDSでは,部品を配置することをインスタンスを作るといい,できた回路を シミュレーション・イメージと呼びます.シミュレーション・イメージは,最初に作られた インスタンスをルートとする木構造をしています.
モジュールの構成要素は,ノードとなり,SFLのブロック構造にしたがって,モジュール配下に 木構造を作ります.もちろん,サブモジュールも親モジュールの構成要素です.さらに,SFLの条件 や実行文もモジュールの構成要素として,シミュレーション・イメージのノードとなります.
<図5.2> 不完全なシミュレーション・イメージとパス名
<図5.3> 完全なシミュレーション・イメージとパス名
図5.2は,Sub-Aをサブモジュールとしてもつあるモジュールのインスタンスをトップ・モジュールと
して作成した直後のシミュレーション・イメージ概念図です.このときSub-Aのインスタンスは作ら
れていません(穴があいている)が,ノードとしては存在しており(サブモジュール・ノード),
Sub-Aのインスタンスを作らなくてもシミュレーションは行えます(この場合,サブ
モジュール・ノード配下の入力端子はトップ・モジュールの出力端子と同等,出力端子は
トップ・モジュールの入力端子と同等の扱いとなる).図5.3は,Sub-Aのインスタンス作られた
あとのシミュレーション・イメージです.
シミュレーション・イメージは,利用者に単一のネーム・スペースを提供します. シミュレーション・イメージ内の特定のノードを表すのには,基準となるノードから, そのノードに至る道に沿って経由するノードの名前を連ねます(パス名). 基準となるノードは,「ルート("/")」,「現在位置(".")」, 「マーカ位置("~")」のいずれかです.
なお,親ノード(ルートに近いノード)を表すためには,「特別な名前 ".." 」を用います. SFLの条件や実行文は,もともと名前をもっていませんが,シミュレーション・イメージでは ブロック内での記述順に番号が付けられ,この番号が名前になります.
名前と名前の間は,'/'または'.'で区切らなくてはなりません.ただし,モジュール名および, 特別な名前である"."または".."に続く区切り記号には '/' を使います. モジュール名のあとに'.'を使うと,サブモジュール・ノードを指定することになります (穴あき状態のときのみ有効).なお,基準ノードに現在位置を指定するときには, はじめの "./" は省略できます.
現在位置,マーカ位置は,move,marker コマンドにより,シミュレーション・イメージの任意のノードに位置付けることができます(シミュレー ション・イメージが作られた時点では,両方とも "/" にセットされている).
SFLで名前を与えられたオブジェクトは,モジュールおよびサブモジュールを除き, 値をもちます(ステージ,セグメントは,状態を値としてもち,状態はそれ自身を値としてもつ). これらをファシリティと呼びます.モジュールがインスタンシェートされると, ファシリティはSFLで宣言されたタイプにしたがって,以下のように初期設定されます.
reg :全ビット "u"ファリシティの値は,setコマンド(メモリ・ファシリティには memset,memclrコマンド) を使って任意に変更することができます(状態ファシリティを除く).reg_wr :全ビット "0"
reg_ws :全ビット "1"
mem :全ワードの全ビット "u"
stage :初期状態
segment :ステージの初期状態
task :"0" (インアクティブ)
制御入力端子 :"0" (アサートされていない)
データ入力端子 :全ビット"z" (ドライブされていない)
その他 :リフレッシュにより計算される
これらのコマンドで設定された値は,レジスタ系ファシリティでは,そのレジスタが更新されるまで が有効期間となりますが,端子系ファシリティでは,現在のシミュレーション・タイムのみが 有効期間となります.
入力端子などの値をシミュレーション・タイムを越えて有効なものとしたい場合には, holdコマンドを使うことができます.holdコマンドは, 端子系ファシリティのsetコマンドの有効期間を延ばすとともに,setコマンド以外での値の変更を 禁止します. hold状態は,releaseコマンドにより解除されます. 端子系ファシリティに対してreleaseコマンド が発行されると,その端子に対する直前のsetコマンドの値も無効になります.
ファシリティの値は,printコマンドにより表示させることができます.
SECONDSがコマンドを受け付けるのは,図5.1に示した時点ですから,installや
setコマンド
などにより,回路自身やその構成要素の値が変わると,端子系ファシリティの値や,条件値,
次のクロックでレジスタ系ファシリティにロードすべき値も変わってきます.
これらの値を再計算することをリフレッシュと呼びます.
printコマンドの実行時に,エラー・メッセージが報告されたれり,
されなかったりすることがあります.これは,SECONDSは再計算が必要なときにのみ,以下のリフ
レッシュ動作を行うからです.
(1) 端子系ファシリティの値や,条件値,レジスタ更新時の計算
(2) リクエスト機能
(3) エラーのレポート
ここでリクエスト機能とは,ある端子系ファシリティの値が,(1) で必要になったにもかかわらず,
そのファシリティがドライブされないときに,利用者に対してその値を問いわせる機能です.
この機能は,req_addコマンドで登録されたデータ端子にしか
機能しません.SECONDSの起動時には,本機能はオフになっているため,使用するときは,
requestコマンドで本機能をオンにする必要があります.
● リフレッシュ
forwardコマンドは,SECONDSにおけるシミュレーションの中心的 なコマンドで,リフレッシュ動作を繰り返しながらシミュレーション・タイムを進めるとともに, スケジュールの実行やレポートの出力も行います.
● スケジュール機能
sch_addコマンドにより実行を予約されたコマンド列を, 指定されたシミュレーション・タイムに実行する機能です.setコマンドをスケジュールすることにより, シミュレーション・パターン を定義することができます.
● レポート機能
forwardコマンドのサイクルごとに,rpt_addによって指定された ファシリティの値を指定された 形式で表示する機能です.SECONDS起動時には,本機能はオンになっていますが, reportコマンドによりオフにすることもできます. レポート機能がオフにされているあいだは,レポートの出力はスキップされます.
● forwardコマンドのステップ
forwardコマンドは,以下のようなステップを停止時刻に達するまで繰り返します. ただし,シミュレーション・タイムがstopコマンドで指定した時刻 (無指定時は stop +1000 が指定されているとみなされる)に達すると,forwardコマンドで指定した シミュレーション・タイムに達する以前でも,forwardコマンドは終了します.
(1) 停止時刻の計算
(2) シミュレーション・タイムとレジスタの更新
(3) スケジュールされたスクリプトを実行
(4) レポートの出力
(5) 停止時刻に達していればforwardコマンドを終了,そうでなければ (2) 以下の繰り返し
(2)~(4) では,必要に応じてリフレッシュを行います.なお,forwardコマンドで指定した 停止時刻が,現在のシミュレーション・タイムの場合,forwardコマンドは,リフレッシュ動作 のみが単独で実行されます.エラー・レポートを再度表示させたいときに使用してください.
listen,evalコマンドによって, コマンドの入力(listening-stream)を切り替えることができます. listening-streamの切り替えは,DOSのバッチ・ファイルの実行のように,ファイルまたは文字列 に格納されたコマンド列(スクリプト)を実行させることになります. このとき,listen,evalコマンドに与えられた第nパラメータは, スクリプトの第(n-1)パラメータ変数にセットされます.
SECONDSの起動は,標準入力をスクリプトとして,コマンド・インタプリンタを起動させることに ほかなりません.したがって,SECONDSの起動時のコマンド・ライン・パラメータは,標準入力ス クリプトへのパラメータとなります.
SECONDSは,コマンド入力の短縮,スクリプトの見やすさ,スクリプト間での情報のやりとりなど ために,変数の概念をサポートしています.変数には,番号で引用($n)されるパラメータ変数の ほかに,名前で引用($name)されるローカル変数とグローバル変数があります.ローカル変数は defineコマンドで定義され,一つのスクリプト内だけで有効です. グローバル変数はsetenv コマンドで定義され,SECONDS内でいつでも有効です.
同じ名前のローカル変数とグローバル変数が定義されているときは,ローカル変数の引用が優先 されます.以下の変数は,SECONDSでシステム定義された変数です.また,SECONDS起動時の環境 変数は,グローバル変数として定義されています.ただし,setenvコマンドで再定義しても exec コマンドで実行されるDOSコマンドの環境には影響しません.
ARGC :スクリプトに与えられたパラメータの数ARGL :スクリプトに与えられたパラメータ列
POSIT :シミュレーション・イメージ内の現在位置
MARKER :シミュレーション・イメージ内のマーカ位置
TIME :現在のシミュレーション・タイム
● メタキャラクタ
以下に示す文字は,SECONDSのコマンド・インタプリンタによって,特別な意味が与えられています (これをメタキャラクタとよぶ).
<new1ine> <space> <tab> ; # ' " $ \
SECONDSのコマンドは「メタキャラクタ ';'または<new1ine>で区切られたトークン列」で, トークンは「メタキャラクタ <newline>,<space>,<tab>,';',',','#' で 区切られた文字列」です.最初のトークンがコマンド名,残りのトークンがそのコマンドのパラメ ータとなります.コマンド名がSECONDSに用意されているコマンドであれば,該当するコマンド処理 ルーチンが実行されます.そうでなければ,コマンド名"listen"が,省略されているもの とみなされます.
● コメント
メタキャラクタ'#'に続く<new1ine>までのすべての文字は,コメントとして無視されます (<new1ine>自身はメタキャラクタ).
● 変数の置換
メタキャラクタ'$'に続く数字または,メタキャラクタを含まない31文字までの文字列は変数名 とみなされ,その変数として定義されている文字列に置き換えられます. 変数名に続く'\'は,変数名の終わりを表すだけで,メタキャラクタでも文字でもありません. 数字 n の変数は,スクリプトに渡された n 番目のパラメータで定義されます.
● クォーティング
メタキャラクタ '\' を前置することにより,それに続くメタキャラクタを通常の文字とすること ができます(クォーティング).ただし,"\<new1ine>" は,メタキャラクタ <space>と解釈されます.シングル・クォートで囲まれた文字列中では,すべての メタキャラクタがクォートされます.ただし,"\'","\\" はそれぞれ 文字 ''','\' となり,"\<new1ine>" は無視されます. ダブル・クォートで囲まれた文字列中では,'$' を除いたメタキャラクタがクォートされます. ただし,"\"","\$","\\" はそれぞれ 文字 '"','$','\'となり,"\<new1ine>" は無視されます.
SECONDSのコマンド一覧を表5.2に示します.
<表5.2> SECONDS のコマンド一覧
ビット列パラメータ
整数パラメータ
書式の指定
乱数による時刻の指定
SECONDSでは,ビット列パラメータとして,2進,8進,10進,16進およびこれらを混合した表記が可能です.
ビット列定数 ::= ビット部分列 {ビット部分列 }ビット列定数の最初のビット部分列が 2進表記である場合は,先頭の'B'は省略してもかまいません. ビット幅の指定が省略された場合,ビット幅は,2,8,16進表記では数字の字数を1,3,4倍したもの が仮定され,10進表記では一律32ビットと仮定されます.ビット部分列 ::= 2進表記 | 8進表記 | 10進表記 | 16進表記
2進表記 ::= B[ビット幅%]2進数字{2進数字}
8進表記 ::= O[ビット幅%]8進数字{8進数字}
10進表記 ::= D[ビット幅%]10進数字{10進数字}
16進表記 ::= X[ビット幅%]16進数字{16進数字}
2進数字 ::= 0 | 1 | u | ?
8進数字 ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | u | ?
10進数字 ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
16進数字 ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
| a | b | c | d | e | f | u | ?ビット幅 ::= 整数
ビット幅が指定された場合にそれが省略時の仮定と異なる場合,指定されたビット幅のほうが大きけ れば上位ビット(左側)に'0'が追加され,指定されたビット幅のほうが小さければ,上位ビットが 切り捨てられます.
また,ビット幅が指定された場合,2,8,16進表記では,表記内で一度だけ2,8,16進数字の後に '*'を用いることができます.これは,前の数字の適当な回数(0回を含む)の繰り返しを意味します. 繰り返しの回数は,指定されたビット幅からその前後の2,8,16進数字列から仮定されるビット幅 を引いたビット幅を(下位ビットから)満たすように決定されます.
また,set,memset, memclrコマンドの valueパラメータは,数字として'?'を使うことも できます(2,8,16進の場合).これは,その部分のビット値を変えないことを意味します. 各表記内の数字列の中には,'B','O','D','X','%'以外の任意の文字を入れて, 数字列を区切ってもかまいません.これらの文字はすべて無視されます.
setコマンドでビット列定数の例(以下のsetコマンドはすべて等価)を次に示します.
set reg "3%1*0 X5%-b X?** O6%455"本コマンドを実行すると,regの値は以下のように変化します.set reg "3%1*0 X5%b X? O6%455"
set reg "B110 B01011 B???? B101101"
reg: uuu uuuuu uuuu uuuuuu → 110 01011 uuuu 101101
SECONDSでは,整数パラメータとして 2進,8進,10進,16進の表現が可能です. はじめに,基数 'B','O','D','X'を置き,各表現での数字を続けてください(基数の 指定がない場合には,10進表現とみなされる).
なお,forward, stop, sch_addコマンドの stoptime あるいは time パラメータは, 整数に'+'を前置することにより,コマンド発行時のシミュレーション・タイムからの相対時刻 を指定することができます.
printコマンド,rpt_addコマンドの formatパラメータは文字列で,'\'に続く文字は, 'n','t'を除きそのまま出力されます."\n","\t"はそれぞれ, <newline>,<tab>が出力されます.'\'に前置されていない'%'に続く数文字 はファシリティの値の表示形式を指定し,下記に示すような文字列に置換されます. それ以外の文字は,そのまま出力されます.
表示形式の指定は,"%{digit}変換指示文字" というパターンとして解釈されます. 変換指示文字が't'または'T'である場合を除いて数えて,書式内のn番目の変換指示が, n番目の facilityパラメータが指定するファシリティの値をどのように出力するかを決定します. digit の系列は,置換された結果出力される文字数を指定します.文字数が省略されると, 値の出力に必要な文字数となります.
変換指示文字の小文字,大文字の違いは,ドライブされていない端子系ファシリティの値の表示 の仕方が異なることです.大文字の指定では,'z'が表示されますが,小文字の指定では何も表示 されません.
<変換指示文字> <出力>なお,8進,16進表示で,3,4ビットの中に 1ビットでも"u"または"z"があれば, 該当する表示位置には,'u'または'z'が表示されます.また,10進表示では,ファシリティの値に 1ビットでも"u"または"z"があれば,すべて'u'または'z'が表示されます.b または B :ファシリティの値の 2進数表示
o または O :ファシリティの値の 8進数表示
d または D :ファシリティの値の 10進数表示
x または X :ファシリティの値の 16進数表示
s または S :ステージ,セグメント・ファシリティの状態名
t または T :現時刻の 10進数表示
print,rpt_addコマンドで,メモリ・ファシリティのあるアドレス・ワードの値を出力したいときは, そのファシリティ名に続けて"@アドレス"を指定します.アドレスは整数です.
sch_addコマンドの timeパラメータでは,絶対あるいは相対による 直接的な時刻の指定以外に,乱数を使ってスケジュール時刻をばらつかせることができます.
乱数は,一様分布に従うもの,指数分布に従うもの,正規分布に従うもの,と3種類を指定する ことができます.パラメータの指定方法は以下のとおりです.乱数を利用するときは,すべて 相対指定になります('+'はつけてはいけない)
%u min max min 以上,max 以下の一様分布 %e min max mean 平均 meam の指数分布( min 以上,max 以下のみ採用) %n min max mean variant 平均 mean,分散 variant の正規分布( min 以上,max 以下のみ採用)