SystemVerilog array operation

Keywords: Google

There are many built-in methods in SystemVerilog to help with array search and sorting.

Array manipulation simply traverses array elements, each of which evaluates the expression specified in the with clause. The iterator parameter specifies a local variable that can be used within the with expression to reference the current element in the iteration. If no parameter is provided, item is the name used by default.

Array locator method

For some of these methods, the with clause and expresison are required, while for others, they are optional.

Mandatory "with" clause

These methods are used to filter elements from an existing array based on a given expression. All elements that satisfy the given expression are put into the array and returned. Therefore, the with clause is required for the following methods.

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

Example

module tb;
  int array[9] = '{4, 7, 2, 5, 7, 1, 6, 3, 1};
  int res[$];
 
  initial begin
    res = 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: %p", res);
 
    res = array.find_last with (item <= 7 & item > 3);
    $display ("find_last       : %p", res);
 
    res = array.find_last_index(x) with (x < 3);
    $display ("find_last_index : %p", res);
  end
endmodule
 
Simulation Log
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 an element with a minimum value or an expression whose result is a minimum value
max() Returns the element with the maximum value, or the result of its expression is the maximum value
unique() Returns all elements that have a unique value or whose expression evaluates to a unique value
unique_index() Returns the index of all elements with a unique value or whose expression results in 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
 
Simulation Log
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 sorting method

Method Description
reverse() Reverse the order of elements in an array
sort() Sort arrays in ascending order, optionally using the with Clause
rsort() Sort the array in descending order, optionally using the with Clause
shuffle() Randomizes the order of elements in an array. with clause is not allowed here

Example

module tb;
  int array[9] = '{4, 7, 2, 5, 7, 1, 6, 3, 1};
 
  initial begin   
    array.reverse();
    $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
 
Simulation Log
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 sorting on a class

class Register;
  string name;
  rand bit [3:0] rank;
  rand bit [3:0] pages;
 
  function new (string name);
    this.name = name;
  endfunction
 
  function void print();
    $display("name=%s rank=%0d pages=%0d", name, rank, pages);
  endfunction
 
endclass
 
module tb;
  Register 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
 
Simulation Log
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 method

Method Description
sum() Returns the sum of all array elements
product() Returns the product of all array elements
and() Returns the bitwise sum 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
 
Simulation Log
ncsim> run
sum     = 10
product = 24
and     = 0x0
or      = 0x7
xor     = 0x4
ncsim: *W,RNQUIE: Simulation is complete.

reference:
[1]https://www.chipverify.com/systemverilog/systemverilog-array-manipulation

Published 80 original articles, won praise 7, visited 5107
Private letter follow

Posted by jhlove on Sat, 22 Feb 2020 19:40:17 -0800