SystemVerilog foreach loop

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

发布了91 篇原创文章 · 获赞 7 · 访问量 5254

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104465118