网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> EDA >> HDL >> 文章正文
  [组图]SystemVerilog中的动态数组           ★★★ 【字体:
SystemVerilog中的动态数组
作者:FPGA技术…    文章来源:FPGA技术网    点击数:    更新时间:2008-1-1    
SystemVerilog数组简介

    在SystemVerilog中,根据数组声明的方式不同,数组可以分为两大类:压缩数组非压缩数组。如果数组的上下边界在变量类型和变量名之间声明,那么这样的数组被称为压缩数组;如果数组的边界在变量名之后声明,那么这样的数组被称为非压缩数组。当然一个数组既可以具有压缩的部分也可以具有非压缩的部分。这几种数组类型的简单示例如下:

    在上面的例子中,无论是声明压缩数组还是非压缩数组,也不管它们的维数如何,它们都具有一个共同点:它们都是静态声明的。一旦以这种方式声明了数组,分析这些声明的EDA工具将会为这些数组静态地分配内存,并且此后我们没有办法对其进行改变。因此,一旦声明了这样的数组,我们也就没有办法改变数组的尺寸。

    为什么我们需要动态数组

    然而,有时我们希望在声明数组的时候并不确定它的尺寸。例如,对于可变数据流的临时缓冲区、具有可变数目元素的列表都需要数组的尺寸可以动态地发生变化。当然,我们也可以声明一个非常大的数组并假定它可以容纳最大数目的数据,然而这种方法既不安全也缺乏效率。那么现在的问题就是:我们怎样声明一个尺寸可以动态改变的数组呢?
    
    SystemVerilog的动态数组类型就可以满足这个需求。从某种意义上讲,动态数组等价于C语言中的malloc库函数,它允许我们动态地改变一个数组的尺寸。

    动态数组的声明

    动态数组使得我们能够在声明数组的时候不指定数组元素的数目,我们可以在运行时定义数组元素的数目。然而动态数组带来的好处也需要一定的代价,对动态数组的使用存在一些限制,这些限制包括:

  • 动态数组中动态的部分必须是非压缩的,压缩数组不能是动态的。  
  • 动态数组的非压缩部分必须是一维的。不允许使用多维的动态数组。 

    动态数组的声明语法如下: 

    注意:空的方括号[]指示该数组是一个动态数组。下面是几个动态数组声明的例子:

    在这个例子中,有几个方面需要注意:

  1. 变量a_reg_array仅在其非压缩的部分是动态的,其压缩的部分仍然是静态的。这个例子显示:将静态的压缩部分与动态的非压缩部分混合是可以的; 
  2. 变量b_reg_array具有两维的压缩部分。动态部分只能是非压缩的并且是一维的;
  3. 变量int_array显示了一种压缩部分不是一个数组的情况。

    处理动态数组
    在声明了动态数组之后,我们可以使用几个内建的操作符和方法来有效地使用动态数组,包括:

  • new[]操作符 
  • size()内建方法 
  • delete()内建方法
  • new[]操作符

    new[]操作符用来产生或修改一个动态数组的深度。考虑下面的例子:

    在上面的例子中,在声明了int_array数组之后并没有为其分配内存空间,因此这个时候使用数组元素是非法的。元素内存的分配是使用new操作符实现的。此后,使用数组索引为0到24的元素是合法的。
    
    new[]操作符的另外一个用法是修改现存的动态数组。在下面的例子中,int_array2是第二个动态数组。 

    在上面例子中的最后一行,new[50]为int_array2产生了50个数组元素。接下来(int_array)将int_array的元素拷贝到int_array2的前25个位置,int_array2中余下的25个位置会保留为空。
    
    现在我们再考虑另外一种情况,假如int_array2中元素的数目小于int_array中元素的数目,比如说int_array2中只有15个元素,那么现在会怎样呢?在这种情况下,int_array中仅前15个元素会被拷贝到int_array2。
     
    new[]操作符的另外一个用法是修改现存动态数组的尺寸,如下面的例子所示:

 

    size()方法

    size()方法以整数的形式返回一个动态数组的尺寸:

    如果此时动态数组还没有产生,那么size()方法返回0。

    delete()方法

    delete()方法简单地删除动态数组的所有元素并将它保持为它最初声明时候的状态。例如:

    正象我们希望的那样,一个删除后的动态数组的尺寸为0。

    一个可运行的例子

    最后,我们以一个可以实际运行的例子结束本文,示例如下:

    上面的例子在ModelSim SE 6.1a下的运行结果如下:

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    systemverilog学习的一个好网…
    SystemVerilog语言简介(一)
    SystemVerilog语言简介(二)
    SystemVerilog语言简介(三)
    SystemVerilog语言简介(四)
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号