提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


文章目录

  • 结构体与压缩结构体定义
  • 一、为什么要用结构体
  • 二、为什么要使用压缩结构体
  • 三 、结构体与压缩结构体赋值



结构体与压缩结构体定义

前言:我一直认为学习一个东西的最好方法是知道为什么、是什么、怎么做,所以文章的内容也会沿用这种方式阐述。



一、为什么要用结构体


 结构体(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
 本文也借鉴了知乎大神的文章,具体链接如下: