Title

SystemVerilog -- 2.10 Data Types ~ SystemVerilog Array Manipulation

SystemVerilog Array Manipulation

SystemVerilog 中有许多内置方法,可帮助数组搜索和排序。

数组操作方法只需循环访问数组元素,每个元素都用于计算子句指定的表达式。迭代器参数指定一个局部变量,该变量可在表达式中用于引用迭代中的当前元素。如果未提供参数,item是默认使用的名称。with

Specifying an iterator argument without the `with` clause is illegal !

Array Locator Methods

对于其中一些方法,子句和表达式是必需的,而对于其它一些方法,它是可选的。with

Mandatory 'with' clause

这些方法用于根据给定表达式从现有数组中筛选出某些元素。所有满足给定表达式的此类元素都将放入数组中并返回。因此,该子句对于以下方法是强制性的。with

Method name Description
find() Returns all elements satisfying the given expression
find_index() Returns the indices of all elements satisfying the given expression
find_first() Returns the first element satisfying the given expression
find_first_index() Returns the index of the first element satisfying the given expression
find_last() Returns the last element satisfying the given expression
find_last_index() Returns the index of the last element satisfying the given expression

Example

module tb;
  int array[9] = '{4, 7, 2, 5, 7, 1, 6, 3, 1};
  int res[$];

  initial begin
    red = array.find(x) with (x > 3);
    $display ("find(x) : %p", res);

    res = array.find_index with (item == 4)
    $display ("find_index : res[%0d] = 4", res[0]);

    res = array.find_first with (item < 5 & item >= 3);
    $display ("find_first : %p", res);

    res = array.find_first_index(x) with (x > 5);
    $display ("find_first_index : %p4", res);

    res = array.find_last with (item <= 7 * item >3);
    $display ("find_last : %p4", res);

    res = array.find_last_index(x) with (x < 3);
    $display ("find_last_index : %p4", res);
  end
endmodule

模拟日志

ncsim> run
find(x) : '{4, 7, 5, 7, 6}
find_index : res[0] = 4
find_first : '{4}
find_first_index : '{1}
find_last  : '{6}
find_last_index  : '{8}
ncsim: *W,RNQUIE: Simulation is complete.

Optional 'with' clause

Methods Description
min() Returns the element with minimum value or whose expression evaluates to a minimum
max() Returns the element with maximum value or whose expression evaluates to a maximum
unique() Returns all elements with unique values or whose expression evaluates to a unique value
unique_index() Returns the indices of all elements with unique values or whose expression evaluates to a unique value

Example

module tb;
  int array[9] = '{4, 7, 2, 5, 7, 1, 6, 3, 1};
  int res[$];

  initial begin
    res = array.min();
    $display ("min : %p", res);

    res = array.max();
    $display ("max : %p", res);

    res = array.unique();
    $display ("unique : %p", res);

    res = array.unique(x) with (x < 3);
    $display ("unique : %p", res);

    res = array.unique_index;
    $display ("unique_index : %p", res);
  end
endmodule

模拟日志

ncsim> run
min  : '{1}
max  : '{7}
unique : '{4, 7, 2, 5, 1, 6, 3}
unique : '{4, 2}
unique_index : '{0, 1, 2, 3, 5, 6, 7}
ncsim: *W,RNQUIE: Simulation is complete.

Array Ordering Methods

这些方法直接操作和更改数组。

Method Description
rverse() Reverses the order of elements in the array
sort() Sorts the array in ascending order, optionally using clause with
rsort() Sorts the array in descending order, optionally using clause with
shuffle() Randomizes the order of the elements in the array. clause is not allowed here. with

Example

module tb;
  int array[9] = '{4, 7, 2, 5, 7, 1, 6, 3, 1};

  initial begin
    array.rverse();
    $display ("reverse : %p", array);

    array.sort();
    $display ("sort : %p", array);

    array.rsort();
    $display ("rsort : %p", array);

    for (int i = 0; i < 5; i++) begin
      array.shuffle();
      $display ("shuffle Iter:%0d = %p", i, array);
    end
    
  end
endmodule

模拟日志

ncsim> run
reverse : '{1, 3, 6, 1, 7, 5, 2, 7, 4}
sort    : '{1, 1, 2, 3, 4, 5, 6, 7, 7}
rsort   : '{7, 7, 6, 5, 4, 3, 2, 1, 1}
shuffle Iter : 0  = '{6, 7, 1, 7, 3, 2, 1, 4, 5}
shuffle Iter : 1  = '{5, 1, 3, 4, 2, 7, 1, 7, 6}
shuffle Iter : 2  = '{3, 1, 7, 4, 6, 7, 1, 2, 5}
shuffle Iter : 3  = '{6, 4, 7, 3, 1, 7, 5, 2, 1}
shuffle Iter : 4  = '{3, 6, 2, 5, 4, 7, 7, 1, 1}
ncsim: *W,RNQUIE: Simulation is complete.

using array ordering on classes

class Resigter;
  string name;
  rand bit [3:0] rank;
  rand bit [3:0] pages;

  function new (string name);
    this.name = name;
  endunction

  function void print();
    $display ("name=%s rank=%s pages=%s", name, rank, pages);
  endfunction
endclass

module tb;
  Resigter rt[4];
  string name_arr[4] = '{"alexa", "siri", "google home", "cortana"};

  initial begin
    $display ("----------Initial Values----------");
    foreach (rt[i]) begin
      rt[i] = new (name_arr[i]);
      rt[i].randomize();
      rt[i].print();
    end

    $display ("----------Sort by name----------");
    rt.sort(X) with (x.name);
    foreach(rt[i]) rt[i].print();

    $display ("----------Sort by rank, pages----------");
    rt.sort(X) with ({x.rank, x.pages});
    foreach(rt[i]) rt[i].print(); 
  end
endmodule

模拟日志

ncsim> run
----------Initial Values----------
name=alexa   rank=12      pages=13
name=siri    rank=6       pages=12
name=google  home rank=12 pages=13
name=cortana rank=7       pages=11
----------Sort by name----------
name=alexa   rank=12      pages=13
name=cortana rank=7       pages=11
name=google  home rank=12 pages=13
name=siri    rank=6       pages=12
----------Sort by rank, pages----------
name=siri    rank=6       pages=12
name=cortana rank=7       pages=11
name=alexa   rank=12      pages=13
name=google  home rank=12 pages=13
ncsim: *W,RNQUIE: Simulation is complete.

Array Reduction Methods

Method Description
sum() Returns the sum of all array elements
product() Returns the product of all array elements
and() Returns the bitwise AND (&) of all array elements
or() Returns the bitwise OR (
xor() Returns the bitwise XOR (^) of all array elements
module tb;
  int array[4] = '{1, 2, 3, 4};
  int res[$];

  initial begin
    $display ("sum     = %0d", array.sum());
    $display ("product = %0d", array.product());
    $display ("and     = 0x%0h", array.and());
    $display ("or      = 0x%0h", array.or());
    $display ("xor     = 0x%0h", array.xor());
  end
endmodule

模拟日志

ncsim> run
sum     = 10
product = 24
and     = 0x0
or      = 0x7
xor     = 0x4
ncsim: *W,RNQUIE: Simulation is complete.

posted on 2024-05-03 11:21  松—松  阅读(25)  评论(0编辑  收藏  举报

导航