SystemVerilog学习笔记(三):结构体与联合体

结构体

结构包含具有不同大小的不同数据类型,这些数据类型分组在一个结构体名称下。默认情况下,结构体最初是未压缩的形式,但可以使用“packed”关键字将其转换为压缩结构。

结构与普通数组不同,因为数组仅使用相同类型和大小的元素,而结构体使用不同的数据类型。使用“struct”关键字声明的非压缩结构。

下图显示了 System Verilog 中不同类型的结构体。

  • 压缩结构体
  • 非压缩结构体

 

非压缩结构体

非压缩结构是默认的结构语法,与普通结构体相同。不同的变量在结构内部保存不同的数据,称为结构成员。结构成员被视为自变量。当我们想给结构体的成员赋值时,可以使’structure name. variable’的方式访问。

赋值给结构体成员:

structure name = ‘{value1, value2, value3};

赋值的替代方法:

structure name = ‘{variable1 : value1 , variable2 : value2 , variable 3 : value3};
该方法一步完成初始化。变量和值可以用冒号“.”分隔。

语法:

struct{
list of different types of variables with sizes
} structure name;

示例:

struct{
string name;
bit[15:0] salary;
byte id;
} employee_s;

下图显示了非压缩结构的数据对齐情况。

image

‘string’ 为 sam 占用 24 位,这里 string 被视为 ascii 字符。然后 16 位表示位[15:0],8 位表示字节。这里比特流大小是 48。未压缩的结构比压缩的结构具有更多的内存占用。

压缩结构体

压缩结构体可以使用 Packed 关键字显式完成。它以指定的顺序以连续形式存储结构体的所有成员。在 RTL 代码中,压缩结构体被视为单个向量,结构体中的每个数据类型都表示为位字段。整个结构体在内存中毫无间隙地压缩在一起。只有压缩数据类型(如 bit , logic and integer 数据类型)才允许在压缩结构体中使用。

注意:如果结构体不能表示为向量,则无法压缩。

语法:

typedef struct packed{
list of different types of variables with sizes
} structure name;

示例:

typedef struct packed{
byte id;
bit[7:0]experience;
logic[15:0]salary;
}employee_ details_s;

下图展示了压缩结构体的数据对齐情况。

image

“字节”占用 8 位,位[7:0] 为 8 位,逻辑[15:0] 为 16 位。这里比特流大小为 32 位。压缩结构比非压缩结构占用空间更小。

压缩结构和非压缩结构的区别

压缩结构非压缩结构
struct Packed 关键字用于定义压缩结构struct 关键字用于定义解包结构
由于单 bit 数据声明,内存占用更小更大的内存占用,因为它包含所有数据类型
不能使用字符串数据类型,仅允许使用压缩数据类型和整数数据类型可以使用所有数据类型。
它用在RTL代码中,因为它可以综合代码它不在RTL代码中使用,因为它无法通过综合工具综合
整个结构体压缩在一起,没有内存间隙未压缩结构体没有压缩

联合体

联合体类似于结构体,但联合体共享内存位置。最大数据类型大小将是联合体中所有成员的内存大小。 “union”关键字用于定义联合体。它们有两种类型:压缩联合体和非压缩联合体。

非压缩联合体

非压缩联合体使用关键字“union”关键字。它使用 int、byte、bit、logic 等数据类型。整个联合成员只应采用最大的数据类型大小。在这种情况下,有时整个内存空间可能不会被所有联合体成员使用。一个变量的值更改也会影响联合体内的其他成员。

语法:

union {
list of elements
} Union_name

示例:

union {
int x;
byte y;
} data_u;

非压缩联合体的数据对齐:

下图展示了非压缩联合体的数据对齐

image

图显示“int”占用 32 位,“byte”占用 8 位。但在非压缩的联合体中,所有成员共享内存。这里“int”是最大的数据类型,因此联合体中的所有其他成员共享 32 位。

压缩联合体

压缩联合体由“union Packed”关键字定义。它仅使用相同类型的元素,例如具有相同大小的 ‘bit’ 、 ’logic’ 、 ‘reg’ 。这是压缩联合体的限制之一。

语法:

typedef union packed {
list of different elements
} Union_name;

示例:

typedef union packed {
bit [7:0];
bit [7:0];
} abc_u ;

非压缩联合体的数据对齐:

下图展示了压缩联合体的数据对齐

image

该图显示使用位数据类型和 8 位大小。在打包联合内部,所有成员应该是相同类型的元素和相同的大小。这里为所有联合成员分配了 8 位大小。

结构体和联合体的区别

结构体联合体
struct关键字用于创建结构体变量union关键字用于定义联合体变量
一次处理不同类型的元素一次处理单一类型的元素
每个结构元素单独获取内存每个元素分别地共享内存空间
其他元素改变时,元素的值不会改元素值改变时,该元素值也会改变
结构体变量大小等于或大于元素之和联合体变量的大小与最大数据类型的大小相同

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无人飞手培训机构大量新增,如何选择好的培训机构?

随着无人机技术的普及和应用领域的拓展,无人机飞手培训机构确实在大量新增。为了选择一家好的培训机构,可以从以下几个方面进行考量: 一、培训资质 官方认证:选择具备中国航空器拥有者及驾驶员协会(AOPA-China&#x…

Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】

1个视频说清楚WIFI:频段/历程/技术参数/常用模块 智能手机拥有率越来越高的今天,大家已经习惯了通过无线网络上网的方式。除了在外面需要用手机流量,我们通常在家里或者机场,商场都可以通过Wi-Fi连接上网。本期文章将为大家介绍Wi…

入门车载以太网(4) -- 传输层(TCP\UDP)

目录 1.ECU通信方式的变化 2.传输层概述 2.1 UDP 2.2 TCP 3. TCP和ISO 15765-2 1.ECU通信方式的变化 我们先回顾下两种通信方式:Signal-Based Messaging、Service-Based Messaging。 Signal-Based Messaging 基于信号的通信方式,例如CAN通信&…

软件测试第二篇软件测试技术

第五章单元测试和集成测试的技术 单元静态测试主要由开发人员完成。 标准:规定什么能做,什么不能做。 规范:建议你要怎么做。 5.1.2 代码评审 代码评审是一种发现代码缺陷的另一种测试方法。 代码审查的最佳实践: 创建代码审…

w035基于web的学科竞赛管理

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件&#xff0…

导航系统非完整性约束汽车运动公约

Back to FDISYSTEMS Knowledge Base 惯性&导航传感器 导航系统&运动约束 数学基础 & 约定 参考坐标系载体 & 传感器坐标系方向/旋转表示非线性卡尔曼滤波器SPKF汽车运动公约船舶运动公约 惯性传感器安装 惯性传感器运行 技术洞察 Knowledge Base /数学基础…

Centos8 安装 JDK / Python / MySQL / Redis / Nginx

安装 JDK 华为镜像 JDK 下载地址:https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 这里安装 JDK8 为例: # 这里直接通过 wget 下载 wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x…

【Qt-ROS开发】使用 Qt Creator 构建和编译含 ROS 库的 Qt 项目

【Qt-ROS】使用 Qt Creator 构建和编译含 ROS 库的项目 网上大多数办法是在 Qt creator中安装 ros_qtc_plugin 插件,项目以 ROS1 工作空间的形式构建,还是使用 catkin 来构建整个项目。但是这种方式局限很大,导入 Qt 的组件反而变得很麻烦&a…

【RabbitMQ】07-业务幂等处理

1. 方式一 序列化设置唯一Id。 Beanpublic MessageConverter messageConverter() {Jackson2JsonMessageConverter jjmc new Jackson2JsonMessageConverter();jjmc.setCreateMessageIds(true);return jjmc;}RabbitListener(bindings QueueBinding(value Queue(name "d…

SparseDrive 论文学习

论文链接:https://arxiv.org/pdf/2405.19620 代码链接:https://github.com/swc-17/SparseDrive 解决了什么问题? 传统模块化的自动驾驶系统可以被解耦为不同的独立模块,如感知、预测和规划,这种范式会面临信息丢失和…

如何提高自动驾驶中惯性和卫星组合导航pbox的精度?

Mems纯惯导里程推算精度做到千分之一,两分钟航向精度保持0.001弧度,是如何做到的? 简单的来说,导航系统的误差来源于这三方面:1.传感器误差 2.时间和迭代频率 3.算法精度。 接下来逐一分析。 1.传感器误差,传感器误差…

机器学习——贝叶斯

🌺历史文章列表🌺 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

20241111,LeetCode 每日一题,用 Go 实现旋转链表

题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 解题思路 计算链表长度:遍历链表来获取链表的长度 n,因为链表的旋转其实是循环移动,所以将 k 对 n 取模 k k % n,这样可以…

Linux驱动开发(4):Linux的设备模型

在前面写的驱动中,我们发现编写驱动有个固定的模式只有往里面套代码就可以了,它们之间的大致流程可以总结如下: 实现入口函数xxx_init()和卸载函数xxx_exit() 申请设备号 register_chrdev_region() 初始化字符设备,cdev_init函数…

在线项目管理系统有哪些选择?2024年9款推荐

本文提及的2024值得关注的9款在线项目管理系统有: 1.PingCode; 2.Worktile; 3.华炎魔方; 4.企业微信; 5.Tapd; 6.青云客; 7.ClickUp; 8.Wrike; 9.Smartsheet。 许多企业在选择在线项…

pytorch量化训练

训练时量化(Quantization-aware Training, QAT)是一种在模型训练过程中,通过模拟低精度量化效应来增强模型对量化操作的鲁棒性的技术。与后训练量化不同,QAT 允许模型在训练过程中考虑到量化引入的误差,从而在实际部署…

datastage在升级版本到11.7之后,部分在11.3上正常执行的SP报错SQLSTATE = 22007: 本机错误代码 = -180

在升级版本到11.7之后,部分在11.3上正常执行的SP开始报错,报的SQL错误是时间参数问题,但是一样的SP可以直接call sp执行,也可以手动调用作业执行,只有设置定时调度时作业会报错, CALLXXX.XXX(1,CURRENT TIM…

Windows VSCode .NET CORE WebAPI Debug配置

1.安装C#插件 全名C# for Visual Studio Code,选择微软的 2. 安装C# Dev Kit插件 全名C# Dev Kit for Visual Studio Code,同样是选择微软的 3.安装Debugger for Unity 4.配置launch.json 文件 {"version": "0.2.0","config…

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子,展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1,准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…

【模块一】kubernetes容器编排进阶实战之k8s基础概念

kubernetes 基本介绍 kubernetes 组件简介 - master: 主人,并不部署服务,而是管理salve节点。 后期更名为: controll plane,控制面板。 etcd: 2379(客户端通信)、2…