For文、If文、三項演算子
For文
同じパターンを繰り返し記述する際にfor文を使用しての冗長記述を前回説明しました。For文はC言語と同じ文法で、
for ( 型宣言 変数名=初期値; 終了条件; 繰り返し式 ) begin
...
end
に従います。
always_ff、always_comb内にも使用でき、一般的に型はintを用いて変数を宣言し、その変数はfor内に記述しているオブジェクトのポジション指定にも使用します。また構造体のインデックスとして使用することもあります。
If文
優先順位を持つ条件を列挙して条件に合った処理を行いたい場合もあります。この場合If文を使用します。これもc言語と同じ文法で、
if ( 条件式1 ) begin
...
end
else if ( 条件式2 ) begin
...
end
else if ( 条件式3 ) begin
...
end
...
else begin
...
end
のように記述します。
条件式は論理演算を含む式をを記述できます。処理系によると思いますが、0以外の定数式は常に条件が成り立っている(真と呼びます)と暗黙に判断されます。単にオブジェクトの値の場合は0以外の時に条件が真と判断されます。
条件式1から順に優先順位を持たせているので、条件式2が真であっても同時に条件式1が真であれば条件式1を処理します。また、条件式3が処理されるのは条件式1と2の条件が成立しない時、かつ条件式3が真の時です。
always_ff @( posedge clock )
内に記述する場合はclockの立ち上がりをイベントとして条件式判定を行い適切なif文内の処理(代入操作)を行います。また、always_comb
内に記述する場合は常に条件式判定を行い適切なif文内の処理(割り当て操作)を行います。この時 else begin ... end
文がない記述では全ての条件が真でないということになるので割当は行われず、割り当てているオブジェクトは不定を含むことになるので注意してください。さらに複数のオブジェクトへ割り当てていて各if文内で全てのオブジェクトへ割り当てていない場合も不定が内在する可能性があります。
三項演算子
一つのオブジェクトに対して条件別に割り当てを変えたい場合、if文でも書けますが、他の言語同様に三項演算子が用意されています。
assign obj_hoge = ( 条件式 ) ? 式1 : 式2;
条件式内容はif文と同じです。この条件が真の時式1の結果をオブジェクトobj_hogeへ割り当てます。それ以外の場合(偽と呼びます)は式2の結果を割り当てます。HDLはハードウェアを記述する言語なので式1と式2両方とも存在し、回路として実装されます。
そして条件を複数記述することができます。この場合例えば
assign obj_hoge = ( 条件式1 ) ? 式1 :
( 条件式2 ) ? 式2 :
( 条件式3 ) ? 式3 :
...
式x;
のように記述し、条件式nが真の時式nの結果が代入されます。最後に条件式のない式xを記述する必要があります。ない場合エラーになります。