关于联合体的内容

关于联合体的内容

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

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/243291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Point-BERT:一种基于Transformer架构的点云深度网络

目录 1. 前言 2. Point Tokenization 3. Transformer Backbone 4. Masked Point Modeling 5. Experiments Reference 1. 前言 从PointNet [1] 开始,点云深度网络逐渐成为解决点云特征提取与语义分析的主要研究方向。尤其在OpenAI的GPT模型获得了突破性成果后&#…

GNS3 VoIP Lab (Cisco 3725 and CME 4.3)

Here is a simple VoIP Lab in GNS3 environment. It is only used for my lab test and recorded here for future reference. 1. Topology: GNS3 Topology:Logic Topology:xp(192.168.2.60)——–C3725 Router(192.168.2.10) 2. Enviroment: ESXi 5.5 (or Vmware Workstation…

谁知道这个代码片段干嘛的

int value 0xAAAA;for (int i0; i<8; i){int tmp value & 0x3; // 取出第两个比特位置if (tmp 0x0){//}else if (tmp 0x1){//}else if (tmp 0x2){//}else if(tmp 0x3){TRACE0("???");}TRACE1("tmp0x%x\n\n", tmp);value >> 2;}

关于数组的内容

关于数组的内容 Verilog数组声明的基本语法 <data_type><vector_size><array_name><array_dimension> 例如&#xff1a; reg[15:0] RAM [0:4095];//储存器数组SystemVerilog允许任何数据类型的非压缩数组 SystemVerilog将非压缩数组的声明进行了扩展…

Touch Driver介绍

Touch Driver介绍 一&#xff0e;相关知识介绍 1&#xff0e;Touch Driver的加载过程 GWES到[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]的“Driver name”获取Driver DLL的名字&#xff0c;如果没有找到该键值&#xff0c;则使用默认名字Touch.dll。 Touch Driver的加…

BreadCrumb控件

BreadCrumb控件&#xff0c;如上图所示&#xff0c;即面包屑导航控件&#xff0c;类似于TreeCtrl&#xff0c;但不是一次显示所有的Item&#xff0c;VC 2010可以编译通过&#xff0c;稍微修改一下其他的也可以编译&#xff0c;源代码下载&#xff1a; http://download.csdn.net…

foreach数组循环结构体

foreach数组循环结构体 foreach循环遍历任何维数的数组 Systemverilog增加了foreach循环&#xff0c;它可用来对一维或多维数组中的元素进行迭代&#xff0c;而不必指定数组每个维度的宽度。foreach循环的自变量是数组名&#xff0c;它后面是方括号内用逗号隔开的循环变量列表…

Android简介

最近Android很火&#xff0c;小弟也想了解一下它的结构。跟CE或者Mobile比起来&#xff0c;它的结构是有点凌乱&#xff0c;也难怪&#xff0c;毕竟是基于别人的内核在上层开发了一些应用 ---------------------------------------------------------------------------------…

说不尽的刘恒

认识刘恒快三十年了&#xff0c;作为曾经的同事和他小说的责任编辑&#xff0c;我只写过他一篇文章&#xff0c;还是在二十多年前。有时候特别熟悉的人反而不知道从何写起&#xff0c;因为一想起往事&#xff0c;各种记忆像开闸的水一样涌满眼前&#xff0c;让人很难落笔。1985…

印前处理的“发动机”——RIP

对于许多印刷厂来说&#xff0c;数字印前技术仍是个谜&#xff0c;尤其是光栅处理器RIP。除了RIP之处&#xff0c;我们也总听说打印机的内置控制单元。其实&#xff0c;RIP与内置控制单元在本质上是一样的&#xff0c;但也有所不同。听说起来好像有些玄乎&#xff0c;下面我们来…

组合逻辑过程块

组合逻辑过程块 always_comb代表组合逻辑 always_comb过程块表示建立组合逻辑模型 always_comb if(!mode)y a b; elsey a - b;always_comb能推断出其敏感表 与通用always过程块不同&#xff0c;always_comb块的后面不需要指明敏感表。软件工具已经知道设计的意图是建立一个…

外行看Flash的存储原理

突然在网上看到别人两年前写的一篇关于nor和nand的好文章&#xff0c;做为csdn的合法公民&#xff0c;有必要转 一、存储数据的原理 两种闪存都是用三端器件作为存储单元&#xff0c;分别为源极、漏极和栅极&#xff0c;与场效应管的工作原理相同&#xff0c;主要是利用电场的…

数码印刷

数码印刷 目前&#xff0c;RIP已经变成了印前生产的核心问题。它影响到从色彩和文件管理到印刷的整个生产过程的方方面面。而且&#xff0c;像陷印和拼大版这些以前需要单独的应用程序处理的功能&#xff0c;现在也被加到了RIP中。    新的RIP产品和销售商有很多。象Agfa,Ha…

锁存逻辑过程块

锁存逻辑过程块 always_latch描述锁存逻辑 always_latch过程块表示过程块描述的是基于锁存器的逻辑。和always_comb一样&#xff0c;always_latch的敏感表示推断出来的。 always_latchif(enable) q < d;always_latch与always_comb语义相同 always_latch过程的语义规则与al…

一种User Mode下访问物理内存及Kernel Space的简单实现

一种User Mode下访问物理内存及Kernel Space的实现 一&#xff0e;背景 WinCE发展到6.0之后&#xff0c;内存结构和管理方法进行了完善。对应用程序影响比较大的有Virtual Memory Layout的变化&#xff0c;如每个进程的虚拟内存空间扩展为2GB。对驱动程序影响比较大的有Pointe…

什么是ICC曲线

什么是ICC曲线 很多人都问及ICC曲线&#xff0c;但又都很不了解&#xff0c;甚至有些人认为有了ICC曲线就能打印出很漂亮的图片&#xff0c;其实不然&#xff0c;下面就我所掌握的知识给大家做个通俗的理解.国际色彩协会The international Color Consortium简称ICC&#xff0c;…

时序逻辑过程块

时序逻辑过程块 always_ff描述时序逻辑 always_ff专用过程块表示设计的意图是描述可综合的时序逻辑。 always_ff&#xff08;posedge clock,negedge resetN&#xff09;if(!resetN) q <0;else q < d;always_ff过程块的敏感表必须明确列出。这样就可以根据敏感表的内容&…

快速计算整数的二进制表示法中1的个数

快速计算整数的二进制表示法中1的个数 题目&#xff1a;给定一个无符号32位整数x&#xff0c;求x的二进制表示法中含1的个数&#xff1f; 第一种算法&#xff1a; int OneCount(unsigned int x){ for(int count0; x>0; count) x&x-1;//把最后面的1变0 return …

对任务和函数的改进

对任务和函数的改进 1、任务和函数的隐式语句组 SystemVerilog会推断出begin…end SystemVerilog简化了任务和函数的定义&#xff0c;有多条语句时不在需要begin …end对多条语句进行打包。打包省略之后&#xff0c;任务或函数中的语句将会顺序执行&#xff0c;就像仍然在begi…

RAPI简单说明及Sample Code

RAPI简单说明及Sample Code 一&#xff0e;什么是RAPI RAPI用来通过ActiveSync来建立PC与Device的通信。通过RAPI可以实现PC 对Device的控制和同步。 二&#xff0e;使用说明 常用的RAPI包括File I/O的一些操作&#xff0c;以及获取系统信息的一些API。 在使用RAPI来建立PC与…