0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog动态数组的大小更改展示

芯片验证工程师 来源:芯片验证工程师 作者:验证哥布林 2022-10-21 09:43 次阅读

动态数组是一个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 = 4
0 da size = 0
0 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 = 5
0 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 = 5
0 d_array1='{'h2, 'h3, 'h4, 'h6, 'h0}

Copying ofDynamic 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 = 6
carray[5]=6
carray = '{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] = 6
carray = '{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 ofArrays

动态数组也可以多维,即动态数组中每一个数据项都是一个另外的动态数组。

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] = 1
abc[0][1] = 2
abc[0][2] = 3
abc[0][3] = 4
abc[1][0] = 2
abc[1][1] = 3
abc[1][2] = 4
abc[1][3] = 5
abc[2][0] = 3
abc[2][1] = 4
abc[2][2] = 5
abc[2][3] = 6
abc = '{'{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] = 1
abc[0][1] = 2
abc[0][2] = 3
abc[0][3] = 4
abc[1][0] = 2
abc[1][1] = 3
abc[1][2] = 4
abc[1][3] = 5
abc[2][0] = 3
abc[2][1] = 4
abc[2][2] = 5
abc[2][3] = 6

abc = '{'{1, 2, 3, 4} , '{2, 3, 4, 5} , '{3, 4, 5, 6} }




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 动态数组
    +关注

    关注

    0

    文章

    3

    浏览量

    5934

原文标题:SystemVerilog中的动态数组

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labview能否对动态数组的元素每循环一次就比较一次大小

    labview能否对一个动态数组,每进行一次循环,就比较一下本次元素值和上次元素值的大小,若大于上次循环元素,则记录,不大于,则不记录
    发表于 11-16 17:11

    转一篇Systemverilog的一个牛人总结

    Systemverilog数据类型l 合并数组和非合并数组1)合并数组:存储方式是连续的,中间没有闲置空间。例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个
    发表于 08-27 14:50

    更新数组元素同时可更改数组大小

    大神们,求助,在我的程序中需要输入一个2维数组作为数据输入,但是当第一次写入数据后,就确定了该数组的维度和大小,当我再次更改数据时,就不能改变数组
    发表于 05-10 16:24

    emOsprey动态数组的特性

    来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey动态数组???不知道你是否听说过 C99 有一个动态数组的特性,也就是说,
    发表于 01-11 06:28

    变长数组动态数组区别

    动态数组是指在声明时,没有确定数组大小数组,它可以随程序需要而重新指定大小
    的头像 发表于 09-28 15:20 1548次阅读

    SystemVerilog数组的赋值、索引和切片

    数组可以作为参数传递给子程序,当数组作为值传递给子程序时,会将这个数组复制一份传递给子程序。
    的头像 发表于 10-20 10:13 3919次阅读

    SystemVerilog中的操作方法

    SystemVerilog提供了几个内置方法来支持数组搜索、排序等功能。
    的头像 发表于 10-31 10:10 1843次阅读

    SystemVerilog中可以嵌套的数据结构

    SystemVerilog中除了数组、队列和关联数组等数据结构,这些数据结构还可以嵌套。
    的头像 发表于 11-03 09:59 1232次阅读

    网络和变量的未压缩数组

    SystemVerilog有两种类型的数组:压缩数组和非压缩数组。压缩数组是连续存储的位的集合,通常称为向量。非压缩
    的头像 发表于 02-09 14:50 497次阅读
    网络和变量的未压缩<b class='flag-5'>数组</b>

    C语言中的数组空间动态开辟

    C语言中的数组空间动态开辟 在C语言中,必不可少的需要使用到数组,通常为了动态的开辟数组空间,可以使用 malloc 函数,在C++中可以使
    的头像 发表于 02-10 12:42 1570次阅读

    使用SystemVerilog解决数组问题

    数独是一种非常流行的游戏,数独本质上也是一个约束问题,所以我们可以让SystemVerilog的约束求解器来帮助我们解决。 约束求解器的精妙之处就是,我们只描述约束限制,繁重的数值生成工作由工具来帮我们完成。 你只需“既要...又要...”,其他的让下人干吧。
    的头像 发表于 03-08 14:06 983次阅读

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的Systemverilog数组约束示例。
    的头像 发表于 03-08 13:12 625次阅读

    一些有趣的数组相关的SystemVerilog约束

    我们在工作中常常会针对数组施加各式的约束,下面列举一下有趣的**Systemverilog数组约束**示例
    的头像 发表于 05-30 11:13 451次阅读

    带你了解SystemVerilog中的关联数组

    SystemVerilog中,我们知道可以使用动态数组实现数组元素个数的动态分配,即随用随分
    的头像 发表于 06-09 09:46 4750次阅读
    带你了解<b class='flag-5'>SystemVerilog</b>中的关联<b class='flag-5'>数组</b>

    动态数组和C++ std::vector详解

    std::vector是C++的默认动态数组,其与array最大的区别在于vector的数组动态的,即其大小可以在运行时
    的头像 发表于 07-19 11:07 719次阅读