Verilog要求在声明定宽数组时必须给出数组的上下界,在system verilog中可以只给出数组宽度。
int c_style[4];
c_strle = '{
0,1,2,3};
int array1[2][3];
array1 = '{'{
0,1,2},'{
3,4,5}};
int decend[5];
decend = '{
0,1,2,3,4};
decend[0:2] = '{
0,1,2};//为前三个元素赋值
decend = '{
5{
9}}; //{9,9,9,9,9}
decend = '{
5,6,default:1}; //{5,6,1,1,1}
在存储时是连续的:
bit[2:0] [7:0] array5 //定义3个8bit的合并数组
非合并数组:
在存储时是不连续的:
bit[7:0] array4[2:0]
bit[7:0] array4[3] //定义3个8bit的非合并数组
bit[3:0] [7:0] barray[3]; //生成具有3个合并元素的非合并数组
动态数组可以在仿真时分配空间或调整数组宽度
int dyn[],d2[];//声明动态数组
initial begin
dyn = new[5]; //分配5个元素
foreach (dyn[j]) dyn[j] = j;//对元素进行初始化
d2 = dyn;//复制动态数组
d2[0] = 5;//修改复制值
dyn = new[100];//分配100个新的整数值
dyn.delete();//删除所有元素
end
SystemVerilog提供了关联数组类型,用来保存稀疏矩阵的元素。这意味着当你对一个非常大地址空间进行寻址时,SystemVerilog只为实际写入的元素分配空间。
类似哈希数组
int data_as[bit [31:0]]
int为存储数据类型,bit[63:0]为寻址的类型
data_as = '{
1:20,2:21,3:22};
if(data_as.first(data_index))begin
do
begin
$diaplay("data_as[0x%0d] is 0x%0d",data_index, data_as[data_index]);
end
while(data_as.next(data_index));
end
输出:
data_as[0x0] is 0x20
data_as[0x1] is 0x21
data_as[0x2] is 0x22
方法:
方法 | 描述 |
---|---|
.num() | 返回元素个数 |
.delete(index) | 删除index索引的键和值,如果不加index则删除所有键和值 |
.exists(index) | 检查index键是否在数组中 |
.first(var) | 将第一个键赋给var |
.last(var) | 将最后一个键赋给var |
.next(var) | 将下一个键赋给var,如果后面没有键,则返回最后一个键 |
.prev(var) | 将上一个键赋给var,如果前面没有键,则返回第一个键 |
想要在非合并数组中查找数据,可以使用数组定位方法,数组定位方法会搜索满足expression的数组元素或者数组索引,这些方法的返回值通常是一个队列
方法 | 描述 |
---|---|
min() | 返回最小元素组成的队列 |
max() | 返回最大元素组成的队列 |
unique() | 返回数组具有唯一值的队列,即重复值只留下一个 |
int f[6] = '{
1,6,2,6,8,6};
int tq[$];
tq = f.min();//1
tq = f.max();//{8}
tq = f.unique();//{1,2,6,8}
方法 | 描述 |
---|---|
find() | 返回所有满足with表达式的元素 |
find_index() | 返回所有满足with表达式的元素索引 |
find_first() | 返回满足with表达式的第一个元素 |
find_first_index() | 返回满足with表达式的第一个元素索引 |
find_last() | 返回满足with表达式的最后一个元素 |
find_last_index() | 返回满足with表达式的最后一个元素索引 |
int d[] = '{
9,1,8,3,4,4};
int tq[$];
tq = d.find with (item > 3);//{9,8,4,4}
tq = d.find_index with (item > 3);//{0,2,4,5}
tq = d.find_first with (item > 99);//{}
tq = d.find_first_index with (item == 8);//{2}
数组支持以下排序方法:
方法 | 描述 |
---|---|
revert() | 对数组中的元素进行逆排序,此方法不能与with条件语句一起使用。 |
sort() | 按升序对数组进行排序 |
rsort() | 按降序对数组进行排序 |
shuffle() | 按随机顺序对数组进行排序,此方法不能与with条件语句一起使用。 |
数组缩减方法是把一个数组缩减成一个值,这个值的类型与数组元素的类型相同,或者与with表达式值的类型相同。
方法 | 数组 |
---|---|
sum() | 返回所有数组元素的和,如果指定with表达式,则返回所有数组元素with表达式计算值的和 |
product()积 | 返回所有数组元素的积,如果指定with表达式,则返回所有数组元素with表达式计算值的积 |
and() | 返回所有数组元素的与,如果指定with表达式,则返回所有数组元素with表达式计算值的与 |
or() | 返回所有数组元素的或,如果指定with表达式,则返回所有数组元素with表达式计算值的或 |
xor() | 返回所有数组元素的或非,如果指定with表达式,则返回所有数组元素with表达式计算值的或非 |
byte f[] = {
1, 2, 3, 4 };
int tq;
tq = f.sum ; // y becomes 10 => 1 + 2 + 3 + 4
tq = f.product ; // y becomes 24 => 1 * 2 * 3 * 4
tq = f.xor with ( item + 4 ); // y becomes 12 => 5 ^ 6 ^ 7 ^ 8
队列和链表相似,可以在一个队列中任何地方增加或删除元素,在性能上要优于动态数组
q2[$] = {
3,4};
q[$] = {
0,2,5};
方法:
方法 | 含义 |
---|---|
insert(i,j) | 在i位置插入元素j |
delete(i) | 删除在i位置的元素 |
push_front(i) | 在队列前面插入元素 |
push_back(i) | 在队列末尾插入元素 |
pop_front | 输出队列最前元素 |
pop_back | 输出队列最后元素 |
总结:
参考文献:SystemVreilog验证测试平台编写指南 - [美]克里斯.斯皮尔
参考:https://blog.csdn.net/qq_33332955/article/details/107641152