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