动态数组的创建不一定非要new[]

Verilog中我们经常会使用到数组,但是在Verilog中定义的数组都是静态的数组,即数组的大小在编译的时候就确定下来了,这时就存在一种情况,当定义数组时指定了对应数组的大小,而实际使用时可能并不一定要使用定义时指定的那么大的数组,这时就会造成数组空间的浪费。为了减小空间的浪费,在SystemVerilog中引入了动态数组结构,动态数组大小的确定是在仿真的过程中根据需要动态分配指定的,不再像静态数组那样在声明时就要指定好,这样就可以根据具体需要指定数组大小从而避免存储空间的浪费。本文将通过示例,说明动态数组在SystemVerilog中如何进行定义和常用方法如何使用。

1 动态数组声明格式

data_type array_id[];

其中

data_type为该动态数组中元素的类型;

array_id为该动态数组的标识符或者成为动态数组名;

2 动态数组常用方法

2.1 new

动态数组在使用前可以通过new[number]为其分配空间,其格式如下:

array_id.new[number];

其中

array_id为数组名;

number为指定的数组大小(容量);

【示例】

【仿真结果】

示例中,声明了动态数组arr,然后在过程块中使用new[7]arr开辟了7个元素的空间,每个元素的宽度为8位,并且类型为bit,所以此时如果对数组中的元素进行访问,那么每个元素的值为数据类型的默认值,如本例中为0。示例中代码第5行对数组进行初始化,初始化后,arr中的7个元素就有了初始值。

除了示例中使用new[]直接给动态数组开辟分配空间外,还可以使用下例中的方法实现对数组进行“初始化”。

【示例】

【仿真结果】 

示例中,arr1通过new[7]开辟了空间并进行了初始化,arr2并没有通过new[]开辟空间,但是通过赋值语句实现了arr1arr2的复制操作,从而实现了对于arr2的初始化。同时,在示例中第8行对arr1的第0个元素进行修改后,将arr1arr2分别输出,从结果可以看到,arr1的改变并不影响arr2之前复制的值,也就是说,通过赋值语句实现了对于arr2空间的开辟和初始化。示例中复制后的arr1arr2的大小一样,如果期望给arr2开辟更大的空间并且还保留arr1的内容应该如何实现呢?

【示例】

【仿真结果】 

示例中,使用new[10]arr2分配10个元素空间并进行复制把新的数组arr2开始的7个数用旧的数组arr1中的元素覆盖,即通过new在开辟空间的同时对数组进行了复制操作。这里有一点需要注意,因为给arr2开辟10个元素空间后将arr1中的7个元素复制到了arr2中,所以arr2数组的前7个元素实际上是被赋值了的,但是arr2的最后3个元素是没有赋值的,所以此时对于arr2中没有赋值的空间进行访问时,返回的结果为该数组指定的数据类型的默认值,此示例中arr2数组元素的数据类型为logic,默认值是x,所以arr2[7]\arr2[8]\arr2[9]均为x

动态数组除了使用new[]这种方式开辟空间外,在使用时,还可以不通过new[]或者复制的方式,直接使用具体的数值对数组进行赋值,此时数组的大小取决于给数组赋值的数值的个数。

【示例】

【仿真结果】 
示例中,在声明了数组arr之后,并没有使用new[]arr进行空间的开辟,而是直接对arr进行了赋值操作,此时会自动按照给arr赋值的数组元素的个数开辟对应的空间,即动态数组开辟空间不一定非要使用new[],可以根据具体需要指定。

2.2 删除数组

动态数组可以使用delete()删除数组,删除后的数组不具有任何元素,一般情况下,在使用完对应的数组后,最好都对其占用的空间进行清除操作,这样可以避免存储空间的占用。删除操作格式如下:

        array_id.delete();

【示例】

【仿真结果】
示例中,在调用arr.delete()之前,通过arr.size()获取到arr数组的大小为7,经过arr.delete()之后,arr.size()获取到arr数组的大小为0,此时因为arr中没有元素了,所有foreach不会执行。注意,示例中使用size()函数可以获取到数组的大小。

通过上述示例,关于动态数组可以总结以下几点:

Ø 动态数组的容量大小是在程序运行的过程中根据需要指定的;

Ø 动态数组的创建是通过new[]实现的,不是new()

Ø new[]中指定的数字为该动态数组中元素个数;

Ø 对于动态数组开辟空间除了使用new[]方式之外,还可以间接的通过复制其他已经初始化的数组实现;

Ø 可以通过new[]方式开辟新空间的同时复制原数组(另一个被复制数组)中的内容;

Ø 对于数组中未初始化的元素,其值为该数组数据类型的默认值;

Ø 不通过new[]方式开辟空间,可以在具体使用时直接对其进行赋值操作;

Ø 通过delete()删除后的数组,其中没有任何元素,其大小为0

Ø 通过size()可以获取当前数组的大小;


全部评论
学到了,感谢分享
点赞 回复 分享
发布于 2022-10-18 20:48 陕西

相关推荐

点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务