提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 结构体与压缩结构体定义
- 一、为什么要用结构体
- 二、为什么要使用压缩结构体
- 三 、结构体与压缩结构体赋值
结构体与压缩结构体定义
前言:我一直认为学习一个东西的最好方法是知道为什么、是什么、怎么做,所以文章的内容也会沿用这种方式阐述。
一、为什么要用结构体
结构体(structure)是一种可以包含不同数据类型元素的集合类型。这一点跟数组、队列等集合类型是不一样的,数组和队列只能包含相同数据类型的元素。结构体在引用的时候,可以对这些元素进行整体引用,也可以通过元素名称来对元素进行单独引用。
设想一下,结构体通常可以用来表征一个包含了诸多不同类型属性的对象。比如,当我们想要表征一个人的所有属性的时候,名字元素可以用string类型,年龄元素可以用int类型,存款元素可以用real类型等等,最后可以通过对整体引用来获得一个人的所有属性,也可以通过元素名称来获得单个属性。
所以说如果没有结构体,那么需要表征一个具有完整的块的功能就会变得很复杂,需要命名多种变量。
结构体具体代码如下:
struct {
int a,b; //32位变量
opcode_t opcode; //用户自定义变量
logic [23:0] address; //24位变量
bit error; //一位两态变量
} Instruction_Word;
引用结构体成员
<结构体名>.<变量名>
Instruction_Word.address=32'hF000001E;
二、为什么要使用压缩结构体
在内存存储一个结构体的时候,SV提供了packed关键字用来区分合并(packed)和非合并(unpacked)存储方式。
合并的结构体,其元素会被无间隙的存放到一块连续的内存空间上。而非合并的结构体,其物理结构一般依赖于C编译器。SV默认是非合并的,这是为了提高内存空间的利用率,如果用户想要用合并的,需要在struct关键字后面加上packed。
第一,合并结构体的整体可以被当成一个向量来看待,这样一来,合并结构体的赋值、读取和数值计算上多了灵活性;第二,合并结构体可以通过在packed关键字后面加signed/unsigned来指定为有无符号类型,排在第一个位置的元素最高位为符号位,相比之下,非合并的结构体是不能被指定为有符号类型的。
压缩结构体的定义如下:
typedef struct packed{
logic valid;
logic [7:0] tag;
logic [31:0] data;
} data_word_t;
data_word_t pocket_in,pocket_out;
压缩结构体的赋值:
pocket_in='{1,'1,1024};
此时1被赋值给valid,把FF(16进制)赋值给tag,
把1024(10进制)赋值给data.
三 、结构体与压缩结构体赋值
结构体赋值的缺省值:
typedef struct{
logic [31:0] a,b;
logic [7:0] opcode;
logic [23:0] address;
} instr_t IW;
IW='{default:0}; //设置IW的所有成员都为0
成员赋值还有优先级问题,default关键字具有最低的优先级,可以被任意指定数据类型的默认值覆盖,指定数据类型的默认值又会被任意显性使用成员名称的赋值覆盖。
具体例子如下:
typedef struct {
real r0,r1;
int i0,i1;
logic [7:0] opcode;
logic [23:0] opcode;
} instruction_word_t;
instruction_word_t IW;
IW='{real:1.0,default:0,r1:3.1415};
赋值优先值:
成员名 > 类型 >default
本文也借鉴了知乎大神的文章,具体链接如下: