verilog~if文の使い方とif文優先度

初めに

こんにちは、Keymaleです。今回はif文の使い方を説明します。基本的にはc言語とかpythonとかと同じです。構造的な書き方からまず見てみましょう

if文の書き方

基本的な書き方

if文の書き方は以下のようになっています。

”条件文”の実行結果がtrueの場合に”実行文”が処理されます。条件文には以下のようなものがあります。

意味
a == b aとbが同じならTrue
a != b aとbが異なるならTrue
a > b aがbより大きいならTrue
a < b aがbより小さいならTrue
a >= b aがb以上ならTrue
a <= b aがb以下ならTrue

beginとend は実行文が1行の時は記述は必要なく、複数行の時は必要になります。個人的にには、すべてのif文にはbegin end でくくり、インデントなどを共通化して記述したほうが見やすいですし、間違いも少なくなると思うので、 begin end はすべて記述したほうがいいです。

else if文の書き方

else if文の書き方は以下のようになっています。

条件文①がTrueならば実行文①が実行され、もし条件文①がFalseで条件文②がTrueなら実行文②が実行され、条件文①も条件文②もFalseで条件文③がTrueなら実行文③が実行されます。
仮に条件文①も条件文②も条件文③も満たすときは一番上に記述されている条件文①の時に実行文①が優先されます。これは実行文がブロッキング文、ノンブロッキング文で記述されていても同じです。if文もしくはelse if文、後述するelse文のどれかが上から順に実行されるため、すべての条件が満たされるときは実行文①のみが実行されます。else if文はいくら追加しても問題ありません。

else 文の書き方

else文の書き方は以下のようになっています。

条件文①も②も満たされないときにelse文に記述されている実行文③が実行されます。

always文内のif文の優先順位

例としてまず以下の文のような条件を考えます。

testの値が2なのでbの値は2になります。if文が実行されるので、bの値は2になりますが、if文内にaへの代入文がありません。この場合はaはalwaysの代入文である1が代入されます。上の実行結果は
a = 1
b = 2
それではelse文が加わった場合を見てみましょう。

こちらの実行結果は
a = 3
b = 1
となります。それでは以下の例ではどのような結果になるでしょうか?

こちらの実行結果は
a = 1
b = 1
となります。実はノンブロッキング代入文でも実行文の書く位置によって実行結果が変わります。ブロッキング代入文では上から順に実行され、ノンブロッキング代入文では同時に行われると思っていた方も多いと思うのですが、こちらは注意が必要です。ノンブロッキング代入文でもalways内ではif文、else文の後の実行文が優先される点に気を付けください。ブロッキング文はもちろん後半に書かれている分まで実行されるため、上記の書き方でブロッキング文の場合は同様の結果となります。

まとめ

基本的な優先順位は以下のようになります。

always文内では
if文、else文後の実行文>if文,else文などのtrueの条件がある実行文>if文より前に記述されている実行文

混乱を避けるためにif文、else文内にそれぞれすべての実行文を記述するのがいいと思います。if文を用いる場合はそれ以外の部分に実行文を書かないようにしましょう。場所によって結果が変わるので、バグを発生しやすいです。