【IEEE_SV-7.1/7.2】结构体的使用方法

7. Aggregate data types

7.1 General

本条款描述以下内容:
— 结构定义和用法
— 联合体的定义和使用
— 合并数组、非合并数组、动态数组、关联数组和队列
— 数组查询和操作方法

7.2 Structures

结构体表示可以作为一个整体引用的数据类型的集合,或者组成结构的各个数据类型可以按名称引用。默认情况下,结构是非合并,这意味着数据类型有一个依赖于实现的打包。非合并的结构可以包含任何数据类型。
结构声明遵循C语法,但在"{"之前没有可选的结构标记。结构声明的语法如语法7-1所示。

13)当一个合并结构与struct或union关键字一起使用时,也应使用packed关键字。
16)只有在带标签的联合体中声明一个void struct_union_member才是合法的。仅在非合并结构中声明random_qualifier是合法的。
声明结构体的例子如下:

struct { bit [7:0] opcode; bit [23:0] addr; } IR; // 匿名结构 定义变量 IR
IR.opcode = 1; // 在IR设置字段。
typedef struct {
bit [7:0] opcode;
bit [23:0] addr;
} instruction; // 命名结构体类型
instruction IR; // 定义变量

7.2.1 Packed structures

合并结构是一种将向量细分为子字段的机制,可以方便地访问子字段作为成员。因此,一个合并结构由位域组成,这些位域被压缩在没有间隔内存中。非合并结构具有依赖于实现的封装,通常与C编译器匹配。合并结构与非合并结构的不同之处在于,当合并结构以原始形式出现时,应将其视为单个向量。合并结构也可以作为一个具有算术和逻辑操作符的整体使用,其行为由其有符号决定,默认为无符号的。指定的第一个成员是最重要的,后面的成员的重要性递减。

struct packed signed {
int a;
shortint b;
byte c;
bit [7:0] d;
} pack1; // 有符号, 2-state
struct packed unsigned {
time a;
integer b;
logic [31:0] c;
} pack2; // 无符号, 4-state

不允许对非合并结构进行符号标识。The signing of unpacked structures is not allowed. 下列声明将被认为是非法的:

typedef struct signed {
int f1 ;
logic f2 ;
} sIllegalSignedUnpackedStructType; // 非法声明

如果一个合并结构中的所有数据类型都是2状态的,那么这个结构作为一个整体被视为2状态向量。
如果合并结构中的任何数据类型是4状态的,那么该结构作为一个整体被视为4状态向量。如果结构中也有2态成员,那么在读取这些成员时,将进行从4态到2态的隐式转换,在写入这些成员时,将从2态到4态的转换。
一个合并结构的一个或多个比特位可以被选择,就像它是一个范围为[n-1:0]的合并数组一样:
pack1 [15:8] // c
只有合并数据类型和表6-8(见6.11)中总结的整数数据类型在合并结构中是合法的。
合并结构可以与typedef一起使用。

typedef struct packed { // 默认无符号
bit [3:0] GFC;
bit [7:0] VPI;
bit [11:0] VCI;
bit CLP;
bit [3:0] PT ;
bit [7:0] HEC;
bit [47:0] [7:0] Payload;
bit [2:0] filler;
} s_atmcell;

7.2.2 Assigning to structures

结构体可以作为一个整体赋值,也可以作为一个整体传递给或从一个子例程传递。
通过使用带有每个成员声明的初始赋值,可以为结构体数据类型的成员分配单独的默认成员值。赋值表达式应为常量表达式。
结构体类型的成员初始化示例如下:

typedef struct {
int addr = 1 + constant;
int crc;
byte data [4] = '{4{1}};
} packet1;

然后可以实例化结构。
packet1 p1; // 由typedef定义的初始化。p1.crc 将对int类型使用默认值
如果显式初始值表达式与变量声明一起使用,则结构数据类型中的初始赋值表达式将被忽略。第5.10款讨论了为结构体赋初始值。例如:
packet1 pi = '{1,2,'{2,3,4,5}}; //抑制typedef初始化
不应为包含联合体的非合并结构体的成员以及合并结构的成员赋单独的默认成员值。
当使用数据类型声明一个没有用户定义的nettype的net时,数据类型中的初始赋值表达式应该被忽略(见6.7.1)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值