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