1、结构体和联合体(参考黄皮书)
联合体:只存储一个元素,这个元素是不同的数据类型;其本质是提供了一种允许多种方式方式来使用同一块存储空间。典型应用:一个值可能是有符号或没符号的,但每次只使用其中一种。
typedef union{ // 使用了typedef来定义的这种方式,叫自定义联合体;否则就是匿名联合体
int i ;
int unsigned u_i;
} data_t
每一次读联合体的成员与上一次存储联合体的成员,必须相同,否则会报错。
结构体:提供了将相关数据集合在一个相同名字下的机制。
压缩结构体/联合体:所有成员都是整数值,不能包含real、非压缩结构体/联合体/数组/。
数组:所有SV支持的数据类型都可以声明为非压缩数组(黄皮书P88),包括shortreal、real、typedef声明的用户自定义类型、struct、enum;
非压缩数组:元素之间的存储是相互独立的;
压缩数组:所有元素是以类似向量的形式存储的;
数组的索引:非压缩维度的索引优先于压缩维度,非压缩/压缩维度内的索引从左到右(参考黄皮书P97:图5.5)
只有位形式的数据类型(如bit/logic/reg/压缩数组、压缩结构体、压缩联合体)才可以被压缩;
压缩数组可以作为整体、某一位、部分位的索引;
logic [3:0][7:0] data;
int tmp;
tmp = data;//选择整个数组
tmp = data[1][2];//选择这个数组维度1的第2个bit数据(等同于data[1][1:1])
tmp = data[1][4:0];//选择这个数组维度1的4:0部分数据
tmp = data[1];//选择这个数组的维度1
tmp = data[1:0];//选择这个数组的维度0和维度1
符号及名 | 作用 |
`{}:列表操作符 | sv:表述一个值序列,每个值会赋值给左边对应得元素 |
`{n{}}:复制列表操作符 | sv: |
{}:拼接操作符 | verilog/sv:把里面的值拼接为一个整体,再把结果复制给左边的一个元素(左边只能有一个元素) |
{n{}}:复制操作符 | verilog |