initialとalwaysキーワード
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/09 07:27 UTC 版)
「Verilog」の記事における「initialとalwaysキーワード」の解説
Varilogの処理を宣言する方法には、alwaysキーワードとinitialキーワードという異なる2つの方法がある。alwaysキーワードは、自由に実行される処理を表す。initialキーワードは、ちょうど1回だけ実行される処理を表す。2つの処理はともに、シミュレーター時刻0に実行が開始され、ともにブロックの終わりまで実行される。alwaysブロックの場合、処理がブロックの最後に到達すると、実行が再度スケジュールされる。よくある間違いは、initialブロックは常にalwaysブロックの前に最初に実行されるというものである。実際には、initialブロックは、1回目の実行時に終了する特殊なalways-ブロックであると考えるとよい。 // 例:initial begin a = 1; // reg a の値を 0 に束縛する #1; // 1 単位時間待つ b = a; // reg a の値を reg b の値に束縛する endalways @(a or b) // a または b が *変更された* タイミングで処理が行われるbegin if (a) c = b; else d = ~b;end // このブロックが終了すると、先頭から処理が再開される (例: @ event-control)always @(posedge a) // reg a が low から high に変更されるたびに実行される a <= b; 上記2つは、これら2つのキーワードの典型的な使用例であるが、更に2つの特徴的な使用例がある。最もよく使うのが、信号強度を書いたリスト@(...)なしでalwaysキーワード使用する方法である。alwaysは以下のように使用することもできる。 always begin // always は時刻0に実行が始まり、*決して* 終了しない clk = 0; // clk を 0 にセットする #1; // 1 単位時間待つ clk = 1; // clk を 1 にセットする #1; // 1 単位時間待つ end // 実行を続ける — したがって、begin から実行が再開する alwaysキーワードは、C言語のwhile(1) {..}構造と同じように無限ループとして振る舞う。 もう1つの特徴的な使用例は、initialキーワードにforeverキーワードを追加するというものである。 次の例は、上のalwaysの例と同等である。 initial forever // 時刻 0 で実行が開始され、begin/end の間の処理を永遠に (forever) 繰り替える begin clk = 0; // clk を 0 にセットする #1; // 1 単位時間待つ clk = 1; // clk を 1 にセットする #1; // 1 単位時間待つ end
※この「initialとalwaysキーワード」の解説は、「Verilog」の解説の一部です。
「initialとalwaysキーワード」を含む「Verilog」の記事については、「Verilog」の概要を参照ください。
- initialとalwaysキーワードのページへのリンク