verilog~if文の使い方とif文優先度
- 2019.11.18
- Quartus verilog
- if文, verilog, verilog HDL, ノンブロッキング代入, ブロッキング代入, 使い方, 優先度
初めに
こんにちは、Keymaleです。今回はif文の使い方を説明します。基本的にはc言語とかpythonとかと同じです。構造的な書き方からまず見てみましょう
if文の書き方
基本的な書き方
if文の書き方は以下のようになっています。
if("条件文")begin
"実行文"
end
”条件文”の実行結果が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文の書き方は以下のようになっています。
if("条件文①")begin
"実行文①"
end else if ("条件文②")begin
"実行文②"
end else if ("条件文③")begin
"実行文③"
end
条件文①がTrueならば実行文①が実行され、もし条件文①がFalseで条件文②がTrueなら実行文②が実行され、条件文①も条件文②もFalseで条件文③がTrueなら実行文③が実行されます。
仮に条件文①も条件文②も条件文③も満たすときは一番上に記述されている条件文①の時に実行文①が優先されます。これは実行文がブロッキング文、ノンブロッキング文で記述されていても同じです。if文もしくはelse if文、後述するelse文のどれかが上から順に実行されるため、すべての条件が満たされるときは実行文①のみが実行されます。else if文はいくら追加しても問題ありません。
else 文の書き方
else文の書き方は以下のようになっています。
if("条件文①")begin
"実行文①"
end else if ("条件文②")begin
"実行文②"
end else begin
"実行文③"
end
条件文①も②も満たされないときにelse文に記述されている実行文③が実行されます。
always文内のif文の優先順位
例としてまず以下の文のような条件を考えます。
parameter test = 2;
reg [7:0] a = 0;
reg [7:0] b = 0;
always@(posedge clk)begin
a <= 1;
b <= 1;
if(test == 2)begin
b <= 2;
end
end
testの値が2なのでbの値は2になります。if文が実行されるので、bの値は2になりますが、if文内にaへの代入文がありません。この場合はaはalwaysの代入文である1が代入されます。上の実行結果は
a = 1
b = 2
それではelse文が加わった場合を見てみましょう。
parameter test = 2;
reg [7:0] a = 0;
reg [7:0] b = 0;
always@(posedge clk)begin
a <= 1;
b <= 1;
if(test == 1)begin
b <= 2;
end else begin
a <= 3;
end
end
こちらの実行結果は
a = 3
b = 1
となります。それでは以下の例ではどのような結果になるでしょうか?
parameter test = 2;
reg [7:0] a = 0;
reg [7:0] b = 0;
always@(posedge clk)begin
if(test == 2)begin
b <= 2;
end else begin
a <= 3;
end
a <= 1;
b <= 1;
end
こちらの実行結果は
a = 1
b = 1
となります。実はノンブロッキング代入文でも実行文の書く位置によって実行結果が変わります。ブロッキング代入文では上から順に実行され、ノンブロッキング代入文では同時に行われると思っていた方も多いと思うのですが、こちらは注意が必要です。ノンブロッキング代入文でもalways内ではif文、else文の後の実行文が優先される点に気を付けください。ブロッキング文はもちろん後半に書かれている分まで実行されるため、上記の書き方でブロッキング文の場合は同様の結果となります。
まとめ
基本的な優先順位は以下のようになります。
always文内では
if文、else文後の実行文>if文,else文などのtrueの条件がある実行文>if文より前に記述されている実行文
混乱を避けるためにif文、else文内にそれぞれすべての実行文を記述するのがいいと思います。if文を用いる場合はそれ以外の部分に実行文を書かないようにしましょう。場所によって結果が変わるので、バグを発生しやすいです。
-
前の記事
verilog~UART通信受信機(RX)編~ 2019.06.05
-
次の記事
verilog~整数から浮動小数点へ変換とその逆も~ 2020.05.20
Awesome post! Keep up the great work! 🙂
なかなか難しい~~ 頑張ります!
チタン認印さん
コメントありがとうございます。
分からないところがあれば聞いてください。