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.