动态数组是一个unpacked数组,其大小可以在运行时更改。
需要使用 new 操作符实例化一个动态数组,使用[]表示。在实例化过程中,会设置动态数组的大小。动态数组声明的语法如下:
data_type array_name [ ];
下面是简单的动态数组示例:
module darray; integer da [ ]; //dynamic array ‘da’ of type integer initial begin da = new[4]; //construct and allocate a size of 4 elements $display($stime,,, da size = %0d,da.size); da.delete( ); //delete elements of an array $display($stime,,, da size = %0d,da.size); da = '{1,2,3,4}; //array initialization $display($stime,,, da = ,da); end endmodule
仿真log:
0 da size = 40 da size = 00 da = '{1, 2, 3, 4}v c s s i m u l a t i o n r e p o r t
上面的module声明了一个名为“da[]”的动态数组,其中数据项的类型为integer。
dynamic arrays – resizing
下面的示例展示了systemverilog动态数组的大小更改。
module darray; bit [7:0] d_array1[ ]; initial begin //memory allocation d_array1 = new[2]; $display($stime,,, d_array1 size = %0d,d_array1.size); $display(); //array assignment - changes the size of the array d_array1 = {2,3,4}; //add 1 more element to the array $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1); $display(); d_array1[2]=5; $display($stime,,, d_array1[0]=,d_array1[0]); $display($stime,,, d_array1[1]=,d_array1[1]); $display($stime,,, d_array1[2]=,d_array1[2]); $display($stime,,, d_array1=,d_array1); $display(); d_array1[3]=6; //will not change the size of the array or //add a new element - warning $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1); $display(); d_array1 = {2,3,4,6}; $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1); $display(); //increase the size of d_array1 d_array1 = new [d_array1.size( ) + 1] (d_array1) ; $display($stime,,, d_array1 size = %0d,d_array1.size);$display($stime,,,d_array1=,d_array1); end endmodule
仿真log:
0 d_array1 size = 2 0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h4} 0 d_array1[0]= 2 0 d_array1[1]= 3 0 d_array1[2]= 5 0 d_array1='{'h2, 'h3, 'h5} 0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h5} 0 d_array1 size = 4 0 d_array1='{'h2, 'h3, 'h4, 'h6} 0 d_array1 size = 50 d_array1='{'h2, 'h3, 'h4, 'h6, 'h0} v c s s i m u l a t i o n r e p o r t
声明一个动态数组d_array1.
分配2个数据项大小
d_array1 = new[2]; $display($stime,,, d_array1 size = %0d,d_array1.size); 0 d_array1 size = 2
初始化数组,增加了一个数据项,表明动态数组的数据项是可以动态更改的:
//array assignment - changes the size of the array d_array1 = {2,3,4}; //add 1 more element to the array $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1);
仿真log打印:
0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h4}
改变第2个数据项的值,然后打印所有的动态数组值。
d_array1[2]=5; //change the value of 2nd element $display($stime,,, d_array1[0]=,d_array1[0]); $display($stime,,, d_array1[1]=,d_array1[1]); $display($stime,,, d_array1[2]=,d_array1[2]); $display($stime,,, d_array1=,d_array1);
仿真log打印:
0 d_array1[0]= 2 0 d_array1[1]= 3 0 d_array1[2]= 5 0 d_array1='{'h2, 'h3, 'h5}
给不存在的index 3数据项赋值,结果是什么都不会发生,下面的赋值会被忽略:
d_array1[3]=6; //will not change the size of the array –//warning $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1);
仿真log会打印:
0 d_array1 size = 3 0 d_array1='{'h2, 'h3, 'h5}
结果是什么都不会发生,上面的赋值会被忽略。
总结来说动态数组的大小只能通过重新初始化来更改。
d_array1 = {2,3,4,6}; $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1);------------------------- 0 d_array1 size = 4 0 d_array1='{'h2, 'h3, 'h4, 'h6}
以及
d_array1 = new [d_array1.size( ) + 1] (d_array1); //increase the size of d_array1 $display($stime,,, d_array1 size = %0d,d_array1.size); $display($stime,,, d_array1=,d_array1);---------------------------0 d_array1 size = 50 d_array1='{'h2, 'h3, 'h4, 'h6, 'h0}
copying of dynamic arrays
可以将一个动态数组复制到另一个动态数组。
module darray; //copying of arrays int oarray [ ]; int carray [ ]; initial begin // allocate 5 memory locations to oarray and // initialize with values oarray = new [5]; oarray = '{1, 2, 3, 4, 5}; carray = oarray; // copy oarray to carray $display (carray = %p, carray); // grow size by 1 and copy existing elements to the carray carray = new [carray.size( ) + 1] (carray); $display(carray size = %0d,carray.size); // assign value 6 to the newly added location [index 5] carray [carray.size( ) - 1] = 6; $display(carray[5]=%0d,carray[5]); // display contents of new carray $display (carray = %p, carray); oarray = carray; //copy carray to oarray $display (oarray = %p, oarray); // display size of both arrays $display (oarray.size( ) = %0d, carray.size( ) = %0d, oarray.size( ), carray.size( )); end endmodule
我们声明了两个动态数组,即“oarray”和“carray”。我们初始化“oarray”,然后复制到“carray”。然后我们增加carray的大小,将它复制回“oarray”中。
仿真log:
carray = '{1, 2, 3, 4, 5}carray size = 6carray[5]=6carray = '{1, 2, 3, 4, 5, 6}oarray = '{1, 2, 3, 4, 5, 6}oarray.size( ) = 6, carray.size( ) = 6 v c s s i m u l a t i o n r e p o r t
初始化数组oarray并初始化大小为5。然后复制
“oarray”到“carray。”
carray = '{1, 2, 3, 4, 5}
重新初始化“carray”,动态数组大小增加1。所以,现在新创建的carray的大小将是6:
carray size = 6
然后我们给第6个数据项赋值6,然后打印整个数组:
carray [5] = 6carray = '{1,2,3,4,5,6}
现在,复制“carray”回“oarray”并打印整个数组“oarray”。
oarray = '{1,2,3,4,5,6}
最后,我们显示原始的“oarray”和复制的“carray”的大小。它们应该是一样的。
oarray.size( ) = 6, carray.size( ) = 6
总结来说,oarray和carray操作的实际上是同一个数组,只是通过不同的指针而已。
dynamic array of arrays
动态数组也可以多维,即动态数组中每一个数据项都是一个另外的动态数组。
module darray; int abc[ ][ ]; //array of arrays initial begin abc = new[3]; //sub array still not created $display(abc = ,abc); //create sub-arrays foreach (abc[i]) begin abc[i] = new[4]; $display(abc[%0d] = %p, i, abc[i]); end $display(abc = ,abc); //assign values to array and sub-array foreach(abc[i , j]) begin abc[i][j] = (j+1)+i; end //display foreach (abc[i , j]) begin $display(abc[%0d][%0d] = %0d, i, j, abc[i][j]); end $display(abc = ,abc); end endmodule
仿真log:
abc = '{'{}, '{}, '{}}abc[0] = '{0, 0, 0, 0}abc[1] = '{0, 0, 0, 0}abc[2] = '{0, 0, 0, 0}abc = '{'{0, 0, 0, 0} , '{0, 0, 0, 0} , '{0, 0, 0, 0} }abc[0][0] = 1abc[0][1] = 2abc[0][2] = 3abc[0][3] = 4abc[1][0] = 2abc[1][1] = 3abc[1][2] = 4abc[1][3] = 5abc[2][0] = 3abc[2][1] = 4abc[2][2] = 5abc[2][3] = 6abc = '{'{1, 2, 3, 4} , '{2, 3, 4, 5} , '{3, 4, 5, 6} } v c s s i m u l a t i o n r e p o r t
我们声明一个名为“abc”的二维动态数组。然后我们分配内存,让它有三个元素(abc = new[3])。注意,此时只有第一维动态数组完成了初始化,第二维动态数组仍然没有进行初始化,所以都为空数组。
abc = '{'{}, '{}, '{}}
接下来,使用for循环为每个第二维数组初始化(int类型的默认值为0)
abc[0] = '{0, 0, 0, 0}abc[1] = '{0, 0, 0, 0}abc[2] = '{0, 0, 0, 0}
然后就可以再次使用foreach语法遍历赋值和打印每个数据项了。注意所使用的语法。
foreach(abc[i , j])abc[0][0] = 1abc[0][1] = 2abc[0][2] = 3abc[0][3] = 4abc[1][0] = 2abc[1][1] = 3abc[1][2] = 4abc[1][3] = 5abc[2][0] = 3abc[2][1] = 4abc[2][2] = 5abc[2][3] = 6abc = '{'{1, 2, 3, 4} , '{2, 3, 4, 5} , '{3, 4, 5, 6} }
什么是BLDC电机?BLDC电机是如何旋转的?
物联网与无障碍追求
医疗健康政策支持力度加大 医疗器械行业迎来发展机遇
电动汽车联合充电系统对CCS连接器的要求
智慧校园系统的产品特性
SystemVerilog动态数组的大小更改展示
随心运动随时沟通 vivo WATCH 2智能手表全渠道开售
断路器锁的应用能够确保隔离开关的安全系数
戴尔多款产品亮相北京国际设计周,以科技赋能创作
Acrel-3200远程预付费系统在江西平安象湖沃尔玛的应用
vivo的iqoo为什么不走中低端路线
盼达与百度联手打造的无人驾驶共享汽车5月底启动试点
微软发布WinUI 3第三个预览版 ARM64 PC原生支持
基于MSP430单片机实现CPFSK调频数据广播接收机的设计
FM收音机接收机解决方案介绍
凯迪拉克推出Super Cruise,以加强智能驾驶系统
2009年中国电子元件行业十大创新企业
光纤耦合器使用方法
什么牌子运动蓝牙耳机好用,运动蓝牙耳机推荐性价比
基于射频无线收发器实现双绞线的故障检测方案