IC学习笔记:04.SystemVerilog中的数组维度,$size()函数以及解释填充数组和非填充数组定义的区别

1、多维数组的声明
以二维数组为例,类比矩阵,高维度称之为行,低维度称之为列。

//8行4列
int a[0:7][0:3];
int b[8][4];

int [7:0][3:0] c;
int [8][4] d;

刚开始学的时候会有疑问,什么时候声明用[7:0],何时要用[0:7]?
若矩阵名为a,则写在其右边的用[0:7],左侧则为[7:0]。

2、维度与$size()
先附上SV的IEEE标准文档中的一段代码:

//Dimension numbers
//      3     4       1     2
logic [3:0] [2:1] n [1:5] [2:8];
typedef logic [3:0] [2:1] packed_reg;
packed_reg n [1:5] [2:0]; //same dimensions as in lines above

可见,对于unpacked类型数组n,声明时写在数组名“n”右侧的维度等级高于左侧的维度等级。在同一侧中,位于更左侧"[ ]"中的等级要高。
因此,

int a[0:7][0:3];           //高等级为[0:7],低等级为[0:3]
int [3:0] unpacked_a [0:7];//高等级为[0:7],低等级为[3:0]

而$size()函数可以选择需要计算的维度,例如

$size(a,1);               //数组高维度是几?答案8
$size(a,2);               //数组低维度是几?答案4
$size(a);                 //答案8,默认为高维

3、解释填充数组和非填充数组定义的区别,数据存取的区别?
答:(1)合并数组和非合并数组
①合并数组:存储方式是连续的,中间没有闲置空间。
例如,32bit的寄存器,可以看成是4个8bit的数据,或者也可以看成是1个32bit的数据。
表示方法:数组大小和位,必须在变量名前指定,数组大小必须是【msb:lsb】

bit[3:0] [7:0] bytes ;//[3:0]是位 [7:0]是数组大小

一般仿真器存放数组元素时使用32bit的字边界,byte、shortint、int都放在一个字中。
②非合并数组:字的地位存放变量,高位不用。

bit [7:0] bytes; //表示方法

(2)二维数组和合并数组识别:
合并数组: bit [3:0] [7:0] arrys; 大小在变量名前面放得,且降序
二维数组: int arrays[0:7] [0:3] ; 大小在变量名后面放得,可降序可升序
位宽在变量名前面,用于识别合并和非合并数组,位宽在后面,用于识别数组中元素个数。
(3)合并数组和非合并数组的选择
①当需要以字节或字为单位对存储单元操作。
②当需要等待数组中变化的,则必须使用合并数组。例如测试平台需要通过存储器数据的变化来唤醒,需要用到@,@只能用于标量或者合并数组。

bit [3:0] [7:0] barray[3] ;  /*表示合并数组,合并数组中有3个元素,每个元素时8bit,
4个元素可以组成合并数组,可以使用barry[0]作敏感信号。*/

  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SystemVerilog,有三种类型的数组:静态数组(Static Arrays),动态数组(Dynamic Arrays)和关联数组(Associative Arrays)。它们各自具有不同的用途和特点。 1. 静态数组(Static Arrays): - 静态数组在编译时分配内存空间,并且其大小在声明时被确定。 - 静态数组可以是一维或多维的,元素类型可以是基本数据类型或用户定义类型。 - 静态数组的元素数量是固定的,不支持动态添加或删除元素。 - 静态数组适用于需要事先知道大小的情况,例如存储预定义的数据集。 2. 动态数组(Dynamic Arrays): - 动态数组在运行时动态分配内存空间,其大小可以根据需要进行调整。 - 动态数组只能是一维的,元素类型可以是基本数据类型或用户定义类型。 - 动态数组支持动态添加或删除元素,并且可以使用内置函数进行元素的插入、删除和查找操作。 - 动态数组适用于需要根据运行时条件动态调整大小的情况,例如存储可变长度的数据。 3. 关联数组(Associative Arrays): - 关联数组使用键值对的形式来存储和访问数据,其键和值可以是任意类型。 - 关联数组在运行时动态分配内存空间,并且其大小可以根据需要进行调整。 - 关联数组支持动态添加或删除键值对,并且可以使用内置函数进行键值对的插入、删除和查找操作。 - 关联数组适用于需要根据键来查找和操作数据的情况,例如存储符号表或哈希表。 总之,静态数组适用于大小已知且固定的情况,动态数组适用于大小可变的情况,而关联数组适用于根据键进行访问和操作的情况。根据具体的需求和应用场景,选择合适的数组类型可以提高代码的效率和可读性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值