foreach構文
 
 配列に関してfor loop 構文の自動化を推し進めたものです。
 
次のコードで、mem[j] は、mem という配列名に対して、jという添え字(インデックス)を宣言しています。 for loop と違うのは、インデックスjの初期値や、ステップ処理、終了判定の記述が必要ないことです。これらは、内部で自動化されており、本質的には、for loopと同じループ処理になります。
 
module foreach_test;
 
	reg [31:0] mem [1:20];
 
 
	 initial begin
		   foreach (mem[j]) begin
    			mem[j]=j;
   			 $display("mem[%2d]=%d",j,mem[j]);
		  end
 
	 end
 
 
 
endmodule
 

 添え字順が重要で、各々配列の次元に対応します。最も変化の遅いインデックスが最初になり、変化の速いインデックスが最後になります。
 
 module foreach_test;
 
	reg [3:4][2:0][6:1] mem [3][3:1][5:7];
 
 
         initial begin
		foreach (mem[j,k,l,m,n]) begin
			mem[j][k][l][m][n]=j+k+l+m+n;
			$display("mem[%2d][%2d][%2d][%2d][%2d]=%2d",j,k,l,m,n,mem[j][k][l][m][n]);
 
 
		end
		 
	end
 
 
 
endmodule
 
 
 
この結果は、下のようになります。[left:right] のレンジがあった場合leftから出発し、rightに至ります。unpacked次元の[3] は、内部表現が[0:2] となりますので、
0から始まって、2に至るイタレーションループになります。

***** Veritak SV Engine Version 0.420 Build May.10.2011 *****
mem[ 0][ 3][ 5][ 3][ 2]=13
mem[ 0][ 3][ 5][ 3][ 1]=12
mem[ 0][ 3][ 5][ 3][ 0]=11
mem[ 0][ 3][ 5][ 4][ 2]=14
mem[ 0][ 3][ 5][ 4][ 1]=13
mem[ 0][ 3][ 5][ 4][ 0]=12
mem[ 0][ 3][ 6][ 3][ 2]=14
mem[ 0][ 3][ 6][ 3][ 1]=13
mem[ 0][ 3][ 6][ 3][ 0]=12
mem[ 0][ 3][ 6][ 4][ 2]=15
mem[ 0][ 3][ 6][ 4][ 1]=14
mem[ 0][ 3][ 6][ 4][ 0]=13
mem[ 0][ 3][ 7][ 3][ 2]=15
mem[ 0][ 3][ 7][ 3][ 1]=14
mem[ 0][ 3][ 7][ 3][ 0]=13
mem[ 0][ 3][ 7][ 4][ 2]=16
mem[ 0][ 3][ 7][ 4][ 1]=15
mem[ 0][ 3][ 7][ 4][ 0]=14
mem[ 0][ 2][ 5][ 3][ 2]=12
mem[ 0][ 2][ 5][ 3][ 1]=11
mem[ 0][ 2][ 5][ 3][ 0]=10
mem[ 0][ 2][ 5][ 4][ 2]=13
mem[ 0][ 2][ 5][ 4][ 1]=12
mem[ 0][ 2][ 5][ 4][ 0]=11
mem[ 0][ 2][ 6][ 3][ 2]=13
mem[ 0][ 2][ 6][ 3][ 1]=12
mem[ 0][ 2][ 6][ 3][ 0]=11
mem[ 0][ 2][ 6][ 4][ 2]=14
mem[ 0][ 2][ 6][ 4][ 1]=13
mem[ 0][ 2][ 6][ 4][ 0]=12
mem[ 0][ 2][ 7][ 3][ 2]=14
mem[ 0][ 2][ 7][ 3][ 1]=13
mem[ 0][ 2][ 7][ 3][ 0]=12
mem[ 0][ 2][ 7][ 4][ 2]=15
mem[ 0][ 2][ 7][ 4][ 1]=14
mem[ 0][ 2][ 7][ 4][ 0]=13
mem[ 0][ 1][ 5][ 3][ 2]=11
mem[ 0][ 1][ 5][ 3][ 1]=10
mem[ 0][ 1][ 5][ 3][ 0]= 9
mem[ 0][ 1][ 5][ 4][ 2]=12
mem[ 0][ 1][ 5][ 4][ 1]=11
mem[ 0][ 1][ 5][ 4][ 0]=10
mem[ 0][ 1][ 6][ 3][ 2]=12
mem[ 0][ 1][ 6][ 3][ 1]=11
mem[ 0][ 1][ 6][ 3][ 0]=10
mem[ 0][ 1][ 6][ 4][ 2]=13
mem[ 0][ 1][ 6][ 4][ 1]=12
mem[ 0][ 1][ 6][ 4][ 0]=11
mem[ 0][ 1][ 7][ 3][ 2]=13
mem[ 0][ 1][ 7][ 3][ 1]=12
mem[ 0][ 1][ 7][ 3][ 0]=11
mem[ 0][ 1][ 7][ 4][ 2]=14
mem[ 0][ 1][ 7][ 4][ 1]=13
mem[ 0][ 1][ 7][ 4][ 0]=12
mem[ 1][ 3][ 5][ 3][ 2]=14
mem[ 1][ 3][ 5][ 3][ 1]=13
mem[ 1][ 3][ 5][ 3][ 0]=12
mem[ 1][ 3][ 5][ 4][ 2]=15
mem[ 1][ 3][ 5][ 4][ 1]=14
mem[ 1][ 3][ 5][ 4][ 0]=13
mem[ 1][ 3][ 6][ 3][ 2]=15
mem[ 1][ 3][ 6][ 3][ 1]=14
mem[ 1][ 3][ 6][ 3][ 0]=13
mem[ 1][ 3][ 6][ 4][ 2]=16
mem[ 1][ 3][ 6][ 4][ 1]=15
mem[ 1][ 3][ 6][ 4][ 0]=14
mem[ 1][ 3][ 7][ 3][ 2]=16
mem[ 1][ 3][ 7][ 3][ 1]=15
mem[ 1][ 3][ 7][ 3][ 0]=14
mem[ 1][ 3][ 7][ 4][ 2]=17
mem[ 1][ 3][ 7][ 4][ 1]=16
mem[ 1][ 3][ 7][ 4][ 0]=15
mem[ 1][ 2][ 5][ 3][ 2]=13
mem[ 1][ 2][ 5][ 3][ 1]=12
mem[ 1][ 2][ 5][ 3][ 0]=11
mem[ 1][ 2][ 5][ 4][ 2]=14
mem[ 1][ 2][ 5][ 4][ 1]=13
mem[ 1][ 2][ 5][ 4][ 0]=12
mem[ 1][ 2][ 6][ 3][ 2]=14
mem[ 1][ 2][ 6][ 3][ 1]=13
mem[ 1][ 2][ 6][ 3][ 0]=12
mem[ 1][ 2][ 6][ 4][ 2]=15
mem[ 1][ 2][ 6][ 4][ 1]=14
mem[ 1][ 2][ 6][ 4][ 0]=13
mem[ 1][ 2][ 7][ 3][ 2]=15
mem[ 1][ 2][ 7][ 3][ 1]=14
mem[ 1][ 2][ 7][ 3][ 0]=13
mem[ 1][ 2][ 7][ 4][ 2]=16
mem[ 1][ 2][ 7][ 4][ 1]=15
mem[ 1][ 2][ 7][ 4][ 0]=14
mem[ 1][ 1][ 5][ 3][ 2]=12
mem[ 1][ 1][ 5][ 3][ 1]=11
mem[ 1][ 1][ 5][ 3][ 0]=10
mem[ 1][ 1][ 5][ 4][ 2]=13
mem[ 1][ 1][ 5][ 4][ 1]=12
mem[ 1][ 1][ 5][ 4][ 0]=11
mem[ 1][ 1][ 6][ 3][ 2]=13
mem[ 1][ 1][ 6][ 3][ 1]=12
mem[ 1][ 1][ 6][ 3][ 0]=11
mem[ 1][ 1][ 6][ 4][ 2]=14
mem[ 1][ 1][ 6][ 4][ 1]=13
mem[ 1][ 1][ 6][ 4][ 0]=12
mem[ 1][ 1][ 7][ 3][ 2]=14
mem[ 1][ 1][ 7][ 3][ 1]=13
mem[ 1][ 1][ 7][ 3][ 0]=12
mem[ 1][ 1][ 7][ 4][ 2]=15
mem[ 1][ 1][ 7][ 4][ 1]=14
mem[ 1][ 1][ 7][ 4][ 0]=13
mem[ 2][ 3][ 5][ 3][ 2]=15
mem[ 2][ 3][ 5][ 3][ 1]=14
mem[ 2][ 3][ 5][ 3][ 0]=13
mem[ 2][ 3][ 5][ 4][ 2]=16
mem[ 2][ 3][ 5][ 4][ 1]=15
mem[ 2][ 3][ 5][ 4][ 0]=14
mem[ 2][ 3][ 6][ 3][ 2]=16
mem[ 2][ 3][ 6][ 3][ 1]=15
mem[ 2][ 3][ 6][ 3][ 0]=14
mem[ 2][ 3][ 6][ 4][ 2]=17
mem[ 2][ 3][ 6][ 4][ 1]=16
mem[ 2][ 3][ 6][ 4][ 0]=15
mem[ 2][ 3][ 7][ 3][ 2]=17
mem[ 2][ 3][ 7][ 3][ 1]=16
mem[ 2][ 3][ 7][ 3][ 0]=15
mem[ 2][ 3][ 7][ 4][ 2]=18
mem[ 2][ 3][ 7][ 4][ 1]=17
mem[ 2][ 3][ 7][ 4][ 0]=16
mem[ 2][ 2][ 5][ 3][ 2]=14
mem[ 2][ 2][ 5][ 3][ 1]=13
mem[ 2][ 2][ 5][ 3][ 0]=12
mem[ 2][ 2][ 5][ 4][ 2]=15
mem[ 2][ 2][ 5][ 4][ 1]=14
mem[ 2][ 2][ 5][ 4][ 0]=13
mem[ 2][ 2][ 6][ 3][ 2]=15
mem[ 2][ 2][ 6][ 3][ 1]=14
mem[ 2][ 2][ 6][ 3][ 0]=13
mem[ 2][ 2][ 6][ 4][ 2]=16
mem[ 2][ 2][ 6][ 4][ 1]=15
mem[ 2][ 2][ 6][ 4][ 0]=14
mem[ 2][ 2][ 7][ 3][ 2]=16
mem[ 2][ 2][ 7][ 3][ 1]=15
mem[ 2][ 2][ 7][ 3][ 0]=14
mem[ 2][ 2][ 7][ 4][ 2]=17
mem[ 2][ 2][ 7][ 4][ 1]=16
mem[ 2][ 2][ 7][ 4][ 0]=15
mem[ 2][ 1][ 5][ 3][ 2]=13
mem[ 2][ 1][ 5][ 3][ 1]=12
mem[ 2][ 1][ 5][ 3][ 0]=11
mem[ 2][ 1][ 5][ 4][ 2]=14
mem[ 2][ 1][ 5][ 4][ 1]=13
mem[ 2][ 1][ 5][ 4][ 0]=12
mem[ 2][ 1][ 6][ 3][ 2]=14
mem[ 2][ 1][ 6][ 3][ 1]=13
mem[ 2][ 1][ 6][ 3][ 0]=12
mem[ 2][ 1][ 6][ 4][ 2]=15
mem[ 2][ 1][ 6][ 4][ 1]=14
mem[ 2][ 1][ 6][ 4][ 0]=13
mem[ 2][ 1][ 7][ 3][ 2]=15
mem[ 2][ 1][ 7][ 3][ 1]=14
mem[ 2][ 1][ 7][ 3][ 0]=13
mem[ 2][ 1][ 7][ 4][ 2]=16
mem[ 2][ 1][ 7][ 4][ 1]=15
mem[ 2][ 1][ 7][ 4][ 0]=14
 
 
添え字を省略した場合、当該次元のループは、生成されません。ただし、コンマであっても、添え字があったものとして、配列次元との対応は維持されます。 
 module foreach_test;
 
	reg [3:4][2:0][6:1] mem [3][3:1][5:7];
 
 
         initial begin
		foreach (mem[,,,m,n]) begin
 
	 
			mem[1][1][1][m][n]=1+1+1+m+n;
	
 
			$display("mem[1][1][1][%2d][%2d]=%2d",m,n,mem[1][1][1][m][n]);
 
 
                
        endend
 
 
 
endmodule
結果です。
 
***** Veritak SV Engine Version 0.420 Build May.10.2011 *****
mem[1][1][1][ 3][ 2]= 8
mem[1][1][1][ 3][ 1]= 7
mem[1][1][1][ 3][ 0]= 6
mem[1][1][1][ 4][ 2]= 9
mem[1][1][1][ 4][ 1]= 8
mem[1][1][1][ 4][ 0]= 7