SystemVerilog数组是允许在单个变量中存储许多值的数据结构。 foreach循环仅用于遍历此类数组,并且是最简单的方法。
Syntax
foreach循环从0开始遍历每个索引。如果foreach循环中有多个语句,则它们必须与所有其他过程块一样,用begin和end关键字括起来。
foreach(<variable>[<iterator>])
// 单一陈述
foreach(<variable>[<iterator>]) begin
// 多个陈述
end
Example #1: Single dimensional Arrays
module tb;
int array[5] = '{1, 2, 3, 4, 5};
int sum;
initial begin
//在这里,“ i”是迭代器,可以使用任何您喜欢的名称命名。使用foreach循环遍历从索引0到结尾的每个元素。
foreach (array[i])
$display ("array[%0d] = %0d", i, array[i]);
// foreach循环中的多个语句需要使用begin end结构,我们正在计算数组中所有数字的总和。由于foreach中有2条语句,因此应该有一个begin-end
foreach (array[l_index]) begin
sum += array[l_index];
$display ("array[%0d] = %0d, sum = %0d", l_index, array[l_index], sum);
end
end
endmodule
Simulation Log
ncsim> run
array[0] = 1
array[1] = 2
array[2] = 3
array[3] = 4
array[4] = 5
array[0] = 1, sum = 1
array[1] = 2, sum = 3
array[2] = 3, sum = 6
array[3] = 4, sum = 10
array[4] = 5, sum = 15
ncsim: *W,RNQUIE: Simulation is complete.
注意,foreach只是以下for循环的简化版本:
for (int i = 0; i < $size(array); i++) begin
// for循环内的语句
end
Example #2: Multidimensional Arrays
module tb;
int md_array [5][2] = '{'{1,2}, '{3,4}, '{5,6}, '{7,8}, '{9,10}};
initial begin
// 首先使用“ i”遍历第一维
foreach (md_array[i])
// 对于第一维“ i”中的每个元素,使用“ j”遍历第二维
foreach (md_array[i][j])
$display("md_array[%0d][%0d] = %0d", i, j, md_array[i][j]);
end
endmodule
Simulation Log
ncsim> run
md_array[0][0] = 1
md_array[0][1] = 2
md_array[1][0] = 3
md_array[1][1] = 4
md_array[2][0] = 5
md_array[2][1] = 6
md_array[3][0] = 7
md_array[3][1] = 8
md_array[4][0] = 9
md_array[4][1] = 10
ncsim: *W,RNQUIE: Simulation is complete.
参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-foreach-loop