ループ文
ループ文としては、次の6種類があります。
1)、forever
2)、repeat()
3)、while()
4)、for( ; ; )
5)、do ... while ();
6)、foreach
6つのうち、forever、repeat、while、forはVerilog HDLからサポートされています。
ただし、forに関しては、次のような機能が追加されました。
for( int i = 0 ; i < 10 ; i++ )
最初の初期化部分で変数(この例では、i)の宣言ができるようになりました。
Verilog HDLでは、変数はfor文の外側で宣言する必要がありました。
また、最後の部分では、++や--などの構文も使えるようになりました。
++や--は、SystemVerilogで追加された構文です。この他に、+=、-=なども使えます。
残りの2つの構文(do ... whileとforeach)は、SystemVerilogで追加されたものです。
do ... whileは、whileに対して条件が最後になっただけです。
一方、foreachは配列などの各要素に対して繰り返し行う場合に使います。
string msg [2] = '{ "hello", "world" };
foreach( msg [ i ] )
$display( i , msg[i] );
この例では、文字列型の配列msgの各要素を表示するというものです。
foreachを使うことで、わかりやすい表現ができるようになりました。
これと同じことをforを使って行うと、次のようになります。
for( int i = 0 ; i < 2 ; i++ )
$display( i , msg[i] );
foreachの方が短いし、各配列に対する処理だということが分かります。
なお、foreachの中で使われる変数は、forと違って宣言する必要はありません。
配列が2次元以上の場合は、次元の数だけ変数を使うことになります。
int array[5][4][3];
foreach( array[i, j, k] )
foreachの中で [ と ] の間に次元数分の変数を書くことになります(次元数分の変数がなければいけません)。