if 文
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 52/90。
if 文は、条件が真(true)である場合にのみコードを実行する意思決定ブロックです。if 文は条件をチェックします。
もし条件が true (1) なら、内部のコードが実行されます。もし条件が false (0) なら、コードはスキップされます。
構文:
if (condition) begin
// 条件が真のときにコードが実行されます
end簡単な例
if (reset) begin
count = 0;
endこの例では:
beginとendは、コードブロックの 開始 と 終了 をマークするために使用されます
resetが 1 (true) の場合、beginとendの中のコードが実行され、countは 0 になります。resetが 0 (false) の場合、中のコードはスキップされ、何も起こりません。
begin と end は、他のプログラミング言語における波括弧 { } のように機能します。これらはステートメントをグループ化し、どのコードが if 条件に属するかをVerilogが認識できるようにします。ここではステートメントが1つしかありませんが、一貫性のために begin と end を使用することは依然として良い習慣です。
Alwaysブロック内のIf文
always @(posedge clk) begin
if (reset)
count <= 0;
end注: 単一の文の場合、begin と end は省略可能です。例えば、上記の always ブロックでは、文が1つしかないため、if の後に begin/end は必要ありません。
条件は任意の式にすることができます
if (a > b) begin
max = a;
end
if (a && b) begin
out = 1;
end
if (data == 8'hFF) begin
match = 1;
end重要なルール
| ルール | 説明 |
|---|---|
| 条件は1ビットである必要があります | または、0か1に評価される式である必要があります |
複数のステートメントには begin / end が必要です | 他の言語の { } のようなものです |
begin/end がない場合、1つのステートメントのみが続きます | 次の行のみが対象となります |
チャレンジ
作業内容:
- 不足している
if文を追加して、正しく動作するようにしてください。
enableが1のとき、outはa & bと等しくなる必要があります。enableが0のとき、outは0のまま(変化しない)である必要があります。
スターターコードは out = 0 を初期値として設定し、両方のケースをテストします。
チートシート
if文は、条件が真(1)の場合にのみコードを実行し、偽(0)の場合はスキップします。
if (condition) begin
// 条件が真のときに実行されます
end単一のステートメントの場合、begin/endは省略可能です:
always @(posedge clk) begin
if (reset)
count <= 0;
end条件は、0または1として評価される任意の式にすることができます:
if (a > b) begin max = a; end
if (a && b) begin out = 1; end
if (data == 8'hFF) begin match = 1; end主なルール:
- 複数のステートメントをグループ化するには、
begin/endを使用します(他の言語の{ }に相当します) begin/endがない場合、直後の1行のみがifに属します
自分で試してみよう
module if_challenge;
reg a, b, enable;
reg out = 0;
initial begin
a = 1;
b = 1;
// テストケース 1: enable = 1
enable = 1;
// TODO: if文を追加 (out = a & b)
$display("enable=1: out = %d (should be 1)", out);
// テストケース 2: enable = 0
enable = 0;
out = 0;
// TODO: outは0のままにする
$display("enable=0: out = %d (should be 0)", out);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。