【IEEE_SV-7.5】动态数组Dynamic arrays

7.5 Dynamic arrays

动态数组是非合并数组,它的大小可以在仿真运行时可以被设置或改变。未初始化的动态数组大小是零。动态数组的大小是通过new构造函数或数组赋值设置。动态数组支持所有的数据类型作为元素类型,包括数组。
动态数组的维度在数组声明中表示。任何在数组声明中的非合并维度可能是一个动态数组维度。
例如:

bit [3:0] nibble[]; //4bit向量的动态数组
integer mem[2][]; //2个动态integer类型的子数组组成的固定大小的非合并数组

注意为了让一个标识符代表一个动态数组,它必须用一个动态数组维来声明为最左边的未合并维度。
new[]构造函数用来设置或改变数组的大小和初始化它的元素。
内置size()方法返回当前数组的大小。
内置delete()方法删除所有元素,产生一个空数组。

7.5.1 New[]

new构造函数设置动态数组的大小,初始化元素。当左边表示一个动态数组时,它可以出现在变量声明赋值表达式右边的位置和阻塞过程赋值。

blocking_assignment ::= // from A.6.2
...
| nonrange_variable_lvalue = dynamic_array_new
...
dynamic_array_new ::= new [ expression ] [ ( expression ) ]

( expression ):
可选择的。用来初始化动态数组的数组。
new构造函数遵守SystemVerilog优先规则。因为方括号和圆括号有相同的优先级,new构造函数的参数运算是从左到右:首先 expression , 然后( expression )。
动态数组声明可能包含一个new构造函数作为右侧的声明赋值。

int arr1 [][2][3] = new [4];  //arr1大小是4。元素是固定大小的数组,因此不要求初始化。
int arr2 [][] = new [4]; //arr2大小是4.动态子数组没有固定大小和未初始化。
int arr3 [1][2][] = new [4]; //错误。尽快arr3包含动态子数组,但是arr3不是一个动态数组。

动态数组可以在过程上下文中使用block赋值中的new构造函数初始化:

int arr[2][][];
arr[0] = new [4]; //动态子数组arr[0]的大小是4
arr[0][0] = new [2]; //合法,arr[0][n],n是从0到3
arr[1][0] = new [2]; //不合法,arr[1]没有初始化,所以arr[1][0]不存在
arr[0][] = new [2]; //不合法,语法错误-没有左侧下标维度
arr[0][1][2] = new[2]; //不合法,arr[0][1][1]是一个int,不是一个动态数组

在这两种情况下,如果new构造函数调用没有指定初始化表达式,元素被初始化为多对应类型的默认值。
可选择的初始化表达式被用来初始化动态数组。当它出现时,它应该是一个与左侧动态数组兼容赋值的数组。

int idest[], isrc[3] = '{5, 6, 7};
idest = new[3](isrc); //设置大小和数组元素数据值(5, 6, 7)

size参数不需要匹配初始化数组的大小。当初始化数组的大小更大时,它被截断以匹配size参数;当它更小时,初始化数组用默认值填充以达到指定的大小。

int src[3], dest1[], dest2[];
src = '{2, 3, 4};
dest1 = new[2] (src);  //dest1的元素是{2, 3}
dest2 = new[4] (src);  //dest2的元素是{2, 3, 4,0}

这种行为提供了一种调整动态数组大小的机制,同时保留它的内容。一个已经存在的动态数组可以通过使用它调整大小作为左侧项和初始化表达式。

integer addr[]; //声明动态数组
addr = new[100]; //创建一个元素的动态数组
...
//动态数组大小扩大一倍,保留之前存在的值。
//之前存在的对addr元素的引用已经过时。
addr = new[200](addr);

使用new构造函数重新调整大小或重新初始化一个之前初始化的动态数组是毁坏性的;之前存在的数组数据不被保留(除非用之前的元素重新初始化—参考之前),所有之前存在的对元素的引用都过时。

7.5.2 Size()

size()方法的原型如下:
function int size();
size返回当前动态数组的大小或者当数组没有被创建时返回0。

int j = addr.size;
addr = new[addr.size()*4](addr); //四倍addr数组

7.5.3 Delete()

delete()的原型如下:
delete()方法清空了数组,导致一个零大小的数组。

int ab[] = new[N]; //创建一个大小为N的临时数组
//使用ab
ab.delete; //删除数组元素
$display("%d", ab.size()); //打印0

补充内容:
只要基本数据类型相同,动态数组和定宽数组就可以互相赋值。

int dyn[], dz[];
dyn = new[5]; //分配五个元素,都为0
foreach(dyn[j]) dyn[j] = j; //对元素进行初始化
dz[0] = 5; //修改赋值的值
dz = dyn;//复制动态数组
dyn = new[20](dyn); //分配20个整数,并进行赋值
dyn = new[100];  //分配100个新的整数
dyn = new[0]; //不分配空间
bit [7:0] mask[] = '{8'b0000_0000, 8'b0000_1111, 8'b1111_0000};
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值