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

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

3天内不再提示

size()和$size这两种方式有什么样的区别呢?

sanyue7758 来源:硅芯思见 2023-03-23 16:53 次阅读

在使用SystemVerilog或者UVM进行编码的过程中,经常会用到数组(包括队列等),经常需要对这些数组进行遍历,有时候我们为了遍历这些数组需要获取这些数组有多少个元素之后才会使用for循环对数组进行遍历,为了获取到数组中元素的个数,经常会用到“$size(数组名)”和“数组名.size”两种方式,那么同样是获取数组元素个数会存在两种方式呢?这两种方式有什么样的区别呢?下面我们通过示例进行说明。

1 $size()

$size()函数是用来查询指定数组指定维的元素数,函数返回值为integer型,该函数有两个参数,第一个参数数组名,第二个参数为要查询的数组的维数表达式,其中第二个参数为可选,默认缺省值为1.

【示例】

b2369314-c957-11ed-bfe3-dac502259ad0.png

仿真结果】

b26a10c2-c957-11ed-bfe3-dac502259ad0.png

示例中,“num=$size(arr)”没有指定要查询数组的哪一维,则此时默认是查询arr第一维共有2个元素,与“num1=$size(arr,1)”相同,即如果使用$size()时仅指定了数组名,则默认查询的是数组第一维的元素数目;

“num0=$size(arr,0)”中,因为数组arr并没有第0维,所以此时$size()返回为0;

“num2=$size(arr,2)”中,指定查询数组第2维,示例中第2维索引为“[0:2]”,所以此时查询返回值为3;

“num3=$size(arr,3)”中,指定查询数组第3维,示例中第3维索引为“[3:0]”,所以此时查询返回值为4;

“num4=$size(arr,4)”中,指定查询数组第4维,示例中第4维索引为“[4:0]”,所以此时查询返回值为5;

可见,$size()可以通过指定函数的第二个参数查询数组指定维中包含的元素数目;虽然$size()可以返回数组对应维数的元素个数,但是前提是该维数要有对应的存储空间分配,否则将会出现一些不期望的问题。如下例。

【示例】

b27692e8-c957-11ed-bfe3-dac502259ad0.png

【仿真结果】

b2880406-c957-11ed-bfe3-dac502259ad0.png

示例中,“num1=$size(arr,2)”获取数组第2维元素个数,但是此时第二维并没有完全分配空间,所以此时在编译阶段就报错了。虽然代码第6行“arr[2]=new[4]”,但这只是给了数组arr第1维中第2个元素对应的动态数组分配了4个存储空间,并没有给arr数组第2维所有的元素分配空间,所以此时如果访问数组第1维第2个元素中包含多少个元素是可以查询到的。如下例。

【示例】

b2a123f0-c957-11ed-bfe3-dac502259ad0.png

【仿真结果】

b2b76048-c957-11ed-bfe3-dac502259ad0.png

示例中,在查询时需要注意此时$size()函数的第一个参数要指定为数组arr第1维中第2个元素,此时编译没有问题主要就是因为对于arr第1维中第2个元素中对应的动态数组进行空间的分配。所以在使用$size()函数时,一定要注意要访问的维度对应的数组元素的空间是否已经分配存在。

2数组名.size()

方法原型如下:

function int size();

该函数的调用方式是通过“数组名.size()”的方式调用,不能在size()函数中指定参数列表。

【示例】

b2c0ecbc-c957-11ed-bfe3-dac502259ad0.png

【仿真结果】

b2e0a34a-c957-11ed-bfe3-dac502259ad0.png

示例中,定义了一个定宽数组arr,然后通过“数组名.size()”的方式获取数组中元素的个数,但是这是编译报错,这是因为在SystemVerilog中已经不支持对于定宽数组通过“数组名.size()”的方式获取数组中元素的个数。但是对于动态数组、关联数组、队列还是可以使用的。如下例。

【示例】

b2ed4f64-c957-11ed-bfe3-dac502259ad0.png

【仿真结果】

b308663c-c957-11ed-bfe3-dac502259ad0.png

示例中,分别声明了动态数组、队列和关联数组这些非定宽数组,对这些非定宽数组通过“数组名.size()”的方式获取到了数组中元素的个数分别为4,5,6,可见“数组名.size()”的使用仅限于非定宽类数组。那么对于这类数组可不可以使用$size()方法呢?请看下例。

【示例】

b3170ca0-c957-11ed-bfe3-dac502259ad0.png

【仿真结果】

b3263aea-c957-11ed-bfe3-dac502259ad0.png

示例中,通过$size()方法可以获得动态数组、队列和关联数组这些非定宽数组所包含的元素的个数,但是在使用时,一定要注意对于元素空间的开辟

从上数这几个示例可以看到,对于非定款数组获取数组元素个数时可以使用size()方法和$size,但是对于定宽数组各维元素个数的获取只能通过$size()方法,同时在使用这些方法时,需要注意数组元素空间的开辟。





审核编辑:刘清

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

    关注

    28

    文章

    1325

    浏览量

    109298
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18964

原文标题:size()和$size到底用哪个

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请教:这两种方法都可以判断红外线遥控的起始码吗 什么区别

    这两种方法都可以判断红外线遥控的起始码吗 什么区别
    发表于 08-11 15:42

    这两种读法什么区别,可以达到相同的效果吗?求助

    这两种读法什么区别,可以达到相同的效果吗?用串口调试助手(不连接硬件的情况下)是不是只能检测到写指令,而检测不到读指令?
    发表于 08-24 08:48

    这两种整流桥电路图原理图的区别在哪里?

    这两种整流桥电路图原理图的区别在哪里?
    发表于 10-22 11:32

    求助:请问这两种对电源处理方式区别和它们的用法。

    请问这两种对电源处理方式区别和它们的用法。
    发表于 07-24 16:43

    请问C6748下的两种DSP开发方式什么区别

    各位开发者: 大家好。我使用的DSP开发板为TMDXLCDK6748,看了TI公司提供的资料,在开发板上开发程序主要有两种方式:一是裸机开发,需要安装StarterWare,另一
    发表于 01-14 14:12

    在DCDC芯片规格书中遇到电源的整流方式,有的是异步整流有的是同步整流。这两种整流方式什么不同

    经常会在DCDC芯片规格书中遇到电源的整流方式,有的是异步整流有的是同步整流。这两种整流方式什么不同,各自又有什么优缺点
    发表于 03-12 14:05

    电源保护电路的两种PCB Layout方式区别吗?

    一、下图是电源输入部分的电路:见下图二、这部分电路,以下有两种PCB layout,请问:1、这两种方式是否区别?2、
    发表于 03-14 07:35

    请问小车转向两种方式什么优缺点?

    我知道的小车转向常见的两种方式,一是通过舵机控制转向,另一是通过控制个轮子的转速,通过转
    发表于 05-21 02:37

    ADS1146/47/48的两种控制方式什么区别

    读了数据手册后,有如下的困惑:(以ADS1146为例)1、可以通过产生一个START的脉冲来启动一次AD转换,或者将START持续拉高进行连续的AD转换,这两种操作方式和通过SPI写入控制命令
    发表于 05-22 14:07

    这两种放大电路什么区别

    这两种放大电路什么区别
    发表于 07-06 09:23

    请问TPS74201和TPS74301这两种LDO的主要区别是什么?

    小弟问题有点多……1、请问TPS74201和TPS74301这两种LDO的主要区别是什么?我看了datasheet,感觉这两种芯片的性能基本一。2、LDO的静态电流主要影响什么?
    发表于 07-16 11:21

    两种芯片的区别

    我想知道28027和28034这这两种芯片什么区别或者联系?希望各位大佬能够尽量讲解得通俗易懂一些,刚开始学习,有点懵,感谢感谢
    发表于 06-18 20:27

    ROM和RAM这两种寄存器的区别是什么

    ROM或者对于玩电脑的人并不陌生,什么内存3G(内存就是RAM),硬盘100G(硬盘就是ROM)单片机里面和电脑一ROM和RAM之分..那这两种寄存器的区别是什么
    发表于 03-01 07:35

    CH9141的bleuart和wchblelib这两种库都可以用吗,什么区别

    CH9141两种库,bleuart 和 wchblelib,这两种库都可以用吗,什么区别
    发表于 08-03 07:24

    常见的ARM架构分为两种是M系列另外一是A系列,这两种什么区别啊?

    现在市面上常见的ARM架构分为两种是M系列另外一是A系列,这两种什么区别啊,用的时候他们
    发表于 10-26 07:00