关于联合体的内容

关于联合体的内容

联合体只储存一个值
联合体只存储一个元素,但这个元素可以有多种表示方法,每种表示可以是不同的数据类型。
联合体的声明语法类似于结构体,联合体的成员的引用也跟结构体一样。

union{
	int i;
	int unsigned u;
}data;
...
data.i = -5;
$display("data is %d",data.i);
data.u = -5;
$display("now data is %d",data.u);

联合减少储存,提高性能
尽管声明语法类似,但是联合体和结构体却有很大不同。结构体可以储存很多值,是一个名称下的变量集合。而联合体只储存一个值。联合体的一个典型应用是,当一个值可能有几种不同的数据类型表示方法,但是每次值使用一种类型。
自定义和匿名的联合体
同结构体一样,联合体可以使用typedef来定义,按这种方式定义的是自定义联合体。如果没有使用typedef,就是匿名联合体。

typedef union{  //自定义联合体
		int i;
		int unsigned u;
}data_t;
data_t a,b; //data_t类型的两个变量

1、非压缩联合体
非压缩联合体可以包含任意变量类型,包括real类型、非压缩结构体和非压缩数组。EDA工具可以任意方式储存非压缩联合体中的值,没有要求每个工具按照同样的方式来储存联合体中的不同数据类型。
非压缩联合体是不可综合的。它是一种对高层次系统和交易级建模很有用的抽象类型。因此,可以在联合体中储存任何类型包括四态类型、两态类型以及像real类型这样的不可综合类型。
注意:如果从非压缩联合体中读取的成员不同于上次写入的成员,可能导致不确定的结果。
2、标签联合体
一个联合体可以声明为tagged

union tagged{
	int i;
	real r;
}data;

标签联合体包括一个隐含标签成员
标签联合体包含一个储存“标签”的隐含成员,它代表着储存数值的最后一个联合体成员的名称。当使用标签表达式将一个值储存到标签联合体中时,隐含的标签自动保存关于该值被写到那个成员信息。
使用标签表达式将值储存到标签联合体中
使用标签表达式可以将一个值写入标签联合体中。标签表达式具有关键字tagged,后面是成员名,再后面是要储存的值。标签表达式被赋给联合体名。

data = tagged i 5;//在data.i中存5,并设置隐含标签

使用联合体成员名可以将值从标签联合体中读出来

d_out = data.i;//从联合体中读值

标签联合体检测联合体使用是否一致
标签联合体要求软件工具检测联合体的使用情况,如果一个值从与标签表达式值上次写入的成员不同的成员中读出,就会产生错误消息。

d_out = data.r;//错误:成员与联合体的隐含标签不匹配

使用标签表达式将值赋给标签联合体后,可以使用成员名将值写到相同的联合体成员中,如果指定的成员名与当前联合体标签不匹配,就会产生运行期错误。

data.i = 7;//写到联合体成员中;成员名必须与当前联合体标签匹配

3、压缩联合体
压缩联合体成员都有同样的尺寸
将联合声明为压缩联合体的方式与声明压缩结构体的方式相同。在压缩联合体中,每个联合体成员的位数都必须是相同的。这保证了压缩联合体使用同样的位数进行储存,而不用考虑储存的是哪个成员的值。由于有这个限制,压缩联合体是可综合的。
压缩联合体只能储存整数值,即由一个或多个相邻组成的值。如果压缩联合体任一个成员是四态类型,这个联合体也是四态的。压缩联合体不可以包含real或shortreal变量,或非压缩结构体、非压缩联合体、非压缩数组。
压缩联合体允许数据以一种格式写入。而以另一种不同的格式读取。设计时不需要特别的处理来跟踪数据是怎样储存的。这是因为压缩联合体中的数据总是使用相同的位数进行储存。

typedef struct packed{
	logic[15:0] source_address;
	logic[15:0] desination_address;
	logic[23:0] data;
	logic[7:0] opcode;
}data_packet_t;
union packed{
	data_pack_t packet;//压缩结构体
	logic[7:0][7:0] bytes;//压缩数组
}dreg;

压缩的标签(tagged)联合体
联合体可以声明为既是压缩的有是带标签的。这种情况下,联合体成员的位宽可以不同但还必须是整体类型(1位或多个连续位)。压缩的标签联合体只允许从与上一个标签表达式写入到联合体中的成员相匹配的同一个成员中读值。

union tagged packed{
	logic [15:0] short_word;
	logic[31 :0] word;
	logic[63:0] long_word;
}data_word;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻童:CPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值