LRM読解(Chap.5 Scheduling semantics)

2008/09/16Verilog::文法import

LRM 5. スケジューリング意味論?(Scheduling semantics)

5.1 モデルの実行(Execution of a model)

本章では,エレメント間の振る舞いを示す.特にイベントスケジューリングと実行について.
Verilog-HDLの処理構造は,ブロックやプロセスの並列実行にあります.
そのため,処理順序の決定方法等をユーザに明確に示す必要があります.が,simulator依存です,といっているみたい...?(勝手な意訳)




5.2 イベントシミュレーション(Event simulation)

1つのデザインは,接続された実行またはプロセスのスレッドから成る.

プロセスは,以下の特徴を持つobjectである.

  • 評価されることができる
  • ステート(状態)を持てる
  • 入力の変化に対して出力を出すことができる

また,プロセスは以下を含む:

  • primitives
  • modules
  • initial procedural blocks
  • always procedural blocks
  • continuous assignments
  • asynchronous tasks
  • procedural assignment statements

命名されたイベントと同様にシミュレートされる回路の NETや変数の値の変化がアップデートイベントであると考えられます。
(自力:シミュレーション対象の回路内の,全てのnetや変数の値の変化は,update eventを考慮している.(excite翻訳のほうが正しそうだな..)プロセスは、イベントをアップデートするために敏感(sensitive)です。
アップデートイベントが実行されるとき、そのイベントに敏感なすべてのプロセスが任意のオーダーで評価されます。
また、プロセスの評価は,evaluation eventとして知られているイベントです。

イベントに加えて、シミュレータの別のキーは時間です。
"simulation time"は、それがシミュレートされる回路にかかる実際の時間をモデル化するためにシミュレータによって保持された時間の値を参照するために使用されます。

この章では,"time"は,シミュレーション時間と共に互換性を持って使用されます。(おなじっちゅうこっちゃ?)


イベントは,異なる時間に起こりえます.
イベントの動向(track)をおさえて、それらが正しいオーダーで処理されるのを確実にするために、イベントは,要求された"simulation time"まで,イベント待ち行列に保たれます。(意訳)
イベントを待ち行列(queue)に置くのは,"scheduling an event"と呼ばれます。

In order to keep track of the events and to make sure they are processed in the correct order,
the events are kept on an event queue, ordered by simulation time.



5.3 階層状のイベント待ち行列(The stratified event queue)

表形式で順序,トリガを引くやつ,負荷情報を記載すると良い.Verilogイベントキューは,論理的に5つの異なる領域に分割されています.イベントは5つのどの領域にも追加できますが,削除はアクティブな領域からのみ可能です.

event name remark
active現在の"simulation time"で起きた,順不同に処理ができる*1イベント
inactive現在の"simulation time"で起きたが,activeイベントのあとに処理ができるイベント
non blocking assign update以前の"simulation time"で評価されたが,現在の"simulation time"でassignedされるイベント.active/inactive処理は先.
monitor上の3つのイベントが終わってから処理されるイベント
future未来の"simulation time"で起こるイベント."future inactive events"と"future non blocking assignment update events"に分けられる.

※処理優先度は上位から.

すべてのアクティブなイベント処理は,"simulation cycle"と呼ばれます.
即時処理のためのあらゆるアクティブなイベントを選ぶ自由度は,Verilog HDLの「非-決定論」の不可欠の源です。
明白なゼロ遅延(#0記述)が、processの中断と,現在時刻のinactive eventとして加えられることを要求します.
そのため,processは,現在の時刻の次のシミュレーションサイクルに再開されます.

ノンブロッキング代入(9.2.2参照)は,現在または後のシミュレーション時刻にスケジューリングされた,ノンブロッキング代入更新イベントを作り出します.
$monitorと$strobeのシステムタスク(17.1参照)は,各々の引数のためにモニタイベントを作成します.
これらのイベントはあらゆる連続した時間間隔で,絶え間なく再始動(be re-enabled)にされます.
モニターイベントは,いかなる他のイベントも引き起こすことができないので,独立です.
tf_synchronize() (25.58参照) や vpi_register_cb(cb_readwrite) (27.33参照)のようなPLI関数によってスケジューリングされたcall back proceduresは,inactiveイベントとして扱われるものとします.




5.4 Verilogシミュレーションのリファレンスモデル(The Verilog simulation reference model)

前節までのまとめで,事例を示す.簡単なイベント処理フローを示し,その説明を補足している.シミュレータを作る方,HDL記述をどのように解釈されるのかを理解するのに有用であろう.

5.4.1 Determinism

begin-end blockを1単位として,イベントqueで処理の停止/再開を行う.ノンブロッキング代入で,代入先が同じ変数の場合,記述順に"ノンブロッキング代入イベント"が生成され,queueに入る.したがって,イベント処理時には,一瞬前の値が入るが,最終的には最後に記述している値を保持することになる.


5.4.2 Nondeterminism

非決定の一例は, active eventがqueueから取り出され,あらゆるオーダで実行されることにより発生する.
ビヘイビアブロック内の,時間制御制約の無い命令文が,1つのイベントで実行してはならないときに生じる(意訳)
時間制御(命令)文は,#式・@式構文である(9.7参照)
ビヘイビア文を評価しいている全ての時には,シミュレータは実行を停止し,イベントキュー上のペンディングしているactive eventのような完了したイベントをおき続けるべきである.(意訳:キューの話が意味を取り違えているかもしれない.)
この効果は,プロセス実行のインタリーブを可能にする.インタリーブ実行の順序は,非決定論者的で,ユーザ制御下にはない.




5.5 レースコンディション(Race conditions)

式評価や,ネット更新イベントの実行は,混ぜられるので,レースコンディションが起こりえる.

assign p = q;
initial begin
     q = 1;
  #1 q = 0;
     $display(p);
end

シミュレータは,1か0を表示することは正しい.
qに対する0代入は,pに対する更新イベントを有効にする.
シミュレータは,連続して,$displayタスクを実行するか,$displayタスクが後に続いたpのための更新を実行するでしょう.




5.6 Scheduling implication of assignments

代入は,以下のようにプロセスとイベントに変換される.

5.6.1 連続代入文(Continuous assignment)

連続代入文(6章参照)は,プロセスと式中のソース要素の感度(sensitive)に対応する.
式の値が変化したとき,目標を決定するため,現在の値を用いて,active update eventをイベント待ち行列に追加します.


5.6.2 手続き上の連続した代入(Procedural continuous assignment)

手続き上の連続した代入(assign文かforce代入文(9.3参照))は,式中のソース要素の感度プロセスに対応します.
式の値が変化したとき,目標を決定するため,現在の値を用いて,active update eventをイベント待ち行列に追加します.
deassign文やrelease文は,対応する代入やforce文を無効にする.


5.6.3 Blocking assignment

遅延付きブロッキング代入文(9.2.1参照)は,右辺の値を現在の値を用いて計算ます.そのあと,実行中のプロセスを中断し,未来のイベントとしてスケジューリングされます.
もし,遅延がゼロならば,そのプロセスは現在時刻のinactiveイベントとしてスケジューリングされます.
プロセスから返ってきたとき,(または,遅延指定が無かったとき,即時に返ってきたとき),そのプロセスは左辺への代入を評価し,左辺の更新に基づくイベントを有効にします.
プロセスが再開したときの値は,目標を決定するために使われる.
実行は,その後,次のシーケンシャル文か他のアクティブイベントに続くでしょう.


5.6.4 Non blocking assignment

このtime stepでdelayがゼロのときで,かつ future eventでdelayがゼロではないときのノンブロッキング代入更新イベントでは,ノンブロッキング代入文(9.2.2参照)は,常に更新された値を計算し,更新のスケジュールをします.(ごめん わからん)
更新がイベント待ち行列に置かれると,有効な値は右辺の値と左辺の目標の両方を計算するのに使用されます.

A NON BLOCKING ASSIGNMENT STATEMENT  always computes the updated value and schedules the update
as a NON BLOCKING ASSIGN UPDATE EVENT, either in this TIME STEP if the delay is zero or as a future event if the delay is nonzero.

5.6.5 Switch (transistor) processing

LRM 5.4で示すイベントドリブンシミュレーションアルゴリズムは,片方向信号のフローに依存し,各々のイベントに対して独立に処理可能です.入力が読まれ,結果が計算され,そして更新がスケジュールされます.
Verilog HDLは,ビヘイビアとゲートレベルモデリングに加えて,スイッチレベルモデリングを提供します.
スイッチは双方向信号のフローを提供し,スイッチによって接続されたノードの連携処理を必要とします.
スイッチをモデル化するVerilog HDLソース要素は,tran, tranif0, tranif1, rtran, rtranif0, and rtranif1と呼ばれる様々な形式のトランジスタです.
スイッチ処理は,入力と出力が相互作用するので,ネットの全てのノードのために適切な値を決定する前に,双方向のスイッチで接続されたネットですべてのデバイスを考えるものとします.
シミュレータは,リラクゼーションテクニックを用いることで,これを可能にします.
そのシミュレータは,どのようなときにでも,tran処理ができます.
それは他のアクティブなイベントの実行で混ぜ合わされた特定の時に,tran-connected eventのサブセットとして処理できます.(意訳あやしい. 全部怪しいけれどw)

いくつかのトランジスタにゲート値xがあると、さらなる改善が必要です。

概念的に簡単なテクニックは,完全に伝導・非伝導のトランジスタのすべての可能な組み合わせに設定した,これらのトランジスタで,繰り返してネットワークを解決することです。(意訳:スイッチON/OFFの状態組み合わせを全部見ればOKということでしょう)
すべての場合におけるユニークなロジックレベルを持っているどんなノードも,このレベルと等しい定常応答(steady-state)を持ちます.他のすべてのノードには、定常応答Xがあります.(直訳そのまま.理解できてません.>< )


5.6.6 Port connections

ポート接続手順は,暗黙の連続したassign文か,暗黙の双方向の接続で処理します.
双方向接続は,2つのネットの間で常にenableにされたtran接続に類似していますが,(信号)強度の減少を伴いません.
ポート接続ルールは,値を受け取るのが,ネットまたは構造的なネット式(structural net expression)であることを要求します.ポートは,以下に示すような接続されたオブジェクトを宣言することで,常に表すことができます.

  • input port:外側の式から,ローカルのネット(input)への連続代入(continuous assignment*2
  • output port:ローカルのoutput式から,外側のネットへの連続代入
  • inout:ローカルネットから外側のネットへの,強度減衰の無いトランジスタ接続

5.6.7 Functions and tasks

task parameterとfunction parameterは値渡しとなり,起動時にコピーインされ,リターン時にコピーアウトされます.
functionリターン時のコピーアウトは,どんなブロッキング代入のように同じ挙動で振る舞います.
※意味が通じないナ... functionの値を貰うのは,ノンブロッキング代入と同じ扱いよ,ということかな.

*1 : activeより後ろで処理できないイベント,という意味だろう

*2 : "continuous"とわざわざ着いているのはなんだろう….moduleのポート接続のことかと思ったけど違うのかな...portという型があるんだっけ(汗