用户自定义和枚举数据类型

C++语言的数据类型 C++允许程序员定义自己的数据类型,这使得开发者可以为特定问题创建更具表达力的结构。用户自定义数据类型主要包括类、结构体、枚举和联合体。C++中的数据类型是程序设计的基础,选择合适的数据类型可以有效提升程序的执行效率和可读性。从基本数据类型到复合数据类型,每种类型都有其特定的用途和场景。在深入理解数据类型的基础上,开发者可以更好地运用C++进行高效编程。在实际开发中,合理组织和使用数据类型,不仅能够减小内存的使用,确保程序的效率,还能够提高代码的可读性和可维护性。 阅读详情

用户自定义和枚举数据类型

1. 用户自定义类型

用户自定义类型关键字为typedef,例如

typedef int unsigned uint;	//unit是自定义的数据类型

unit	a, b;	//用自定义的数据类型声明两个变量

看一个例子

module type1_tb;
    typedef bit bit_t;  //自定义一个bit_t数据类型
    bit_t   a = 0;

    initial 
        $display("\n\t the value of a is %b",a);
endmodule


module type2_tb;
    bit_t   b = 1;

    initial
        $display("\n\t the value of b is %b", b);
endmodule

在这个例子中,我们只在模块type1_tb自定义了一个bit_t的类型,在模块type2_tb中直接使用bit_t声明变量,看看结果会是怎样的

结果显示变量类型是未知的,如果我们把模块type2_tb注释掉,会不会还有这个结果

结果成功打印

这说明,自定义的数据类型bit_t确实是成功被定义,但他只作用于模块type1_tb,因为我们并没有在模块type2_tb再次定义

那如果想要模块type2_tb也能成功打印,可以在模块type2_tb重新进行一个自定义,像这样

module type1_tb;
    typedef bit bit_t;  //自定义一个bit_t数据类型
    bit_t   a = 0;

    initial 
        $display("\n\t the value of a is %b",a);
endmodule


module type2_tb;
    typedef bit bit_t;  //自定义一个bit_t数据类型
    bit_t   b = 1;

    initial
        $display("\n\t the value of b is %b", b);
endmodule

也可以用之前的编译单元域$unit

package definition;
     typedef bit bit_t;  //自定义一个bit_t数据类型
endpackage

module type1_tb;
    bit_t   a = 0;

    initial 
        $display("\n\t the value of a is %b",a);
endmodule

import	definition :: *;	//通配符导入到$unit

module type2_tb;
    bit_t   b = 1;

    initial
        $display("\n\t the value of b is %b", b);
endmodule

可以看到,用户自定义类型可以局部定义,也可以进行共享定义

为了增加源码的可读性,一般用户自定义的名称后加_t,用以区分

2. 枚举数据类型

2.1 基本内容

枚举数据类型的格式为:

enum {标签名1, 标签名2, ...} 变量名;

枚举可以理解为给标签名赋值,或给这个给数值一个标签

如果没有明确给定数据类型,枚举中的数值是int类型,且数值依次是0, 1, 2…

这个情况是不是很像有限状态机对状态的定义,就像这样:

//状态定义
parameter	S0 = 3'd0;
parameter	S1 = 3'd1;
parameter	S2 = 3'd2;
parameter	S3 = 3'd3;
parameter	S4 = 3'd4;

改成枚举方式表示,会简单很多

//状态定义
enum {S0,S1,S2,S3,S4} state_t;

枚举数据类型中的标签名也可以用向量的方式表示,可以进一步简化

//状态定义
enum {S[5]} state_t;

这三个状态定义是等价的

不仅如此,枚举类型中的数值、数值类型、数值宽度也是可以自己定义的

比如FSM状态定义时,可以用独热码(ont-hot),可以直接定义数值

//状态定义
enum bit [2:0] {
    S0 = 3'b001,
    S1 = 3'b010,
    S2 = 3'b100
} state_t;

这里要注意一点,如果我们给定的位宽为3,那么给数值时不能超出位宽范围

2.2 枚举类型的赋值

枚举类型只可以进行下列赋值:

  • 枚举类型列表中的一个标签
  • 同类枚举类型的其他变量(用同样枚举类型声明的变量)
  • 通过cast转换成枚举类型变量的数值

用一个枚举类型来解释这点

/*****变量声明*****/
typedef enum {one, two, three}state_t;
state_t state, next_state;
int info;

/*****赋值*****/
state = one; //用枚举列表中的标签赋值

next_state = state;	//同类枚举类型的其他变量

$cast(next_state, state + 1); //通过cast转换成枚举类型变量的数值

这里有一点需要说明,枚举列表中的标签其实是代表一个数值(这点在下文会提到),在这个例子中,数值为int型,和info的数据类型相同,所以存在info = state + 1;的写法,但是,state = info + 1是不可行的,因为枚举赋值并没有给出这种形式

此外,state =state + 1; state ++等都是不允许的

2.3 枚举类型专用任务和方法

<枚举变量名>.first:返回指定变量列表中的第一个成员的值

<枚举变量名>.last:返回指定变量列表中的最后一个成员的值

<枚举变量名>.next():返回指定变量列表中后面第N个成员的值,如果到了列表末尾会返回列表开头

<枚举变量名>.prev():返回指定变量列表中前面第N个成员的值,如果到了列表开头会返回列表末尾

<枚举变量名>.num:返回变量的枚举列表中元素个数

<枚举变量名>.name:返回枚举变量中代表这个值的字符串

下面依次对这几个情况进行仿真

源代码如下:

module enum_tb;
    enum {s[9]} state_t;
    
    initial begin
       state_t = s5; 
    end
    
    initial begin
        $display("\n\t the initial state_t is %0d", state_t); 
        $display("\n\t <变量名>.first is %0d", state_t.first); 
        $display("\n\t <变量名>.last is %0d", state_t.last);
        $display("\n\t <变量名>.prev(3) is %0d", state_t.prev(3)); 
        $display("\n\t <变量名>.prev(7) is %0d", state_t.prev(7));
        $display("\n\t <变量名>.next(3) is %0d", state_t.next(3)); 
        $display("\n\t <变量名>.next(7) is %0d", state_t.next(7));
        $display("\n\t <变量名>.num is %0d", state_t.num);
        $display("\n\t <变量名>.name is %s", state_t.name);        
    end
endmodule

运行结果如下

可以看到,自始至终state_t均为s5,这几个操作都不会改变state_t本身

此外,由<变量名>.prev(7)和<变量名>.next(7)可以看出,这种方式是循环的


本文主要参考《SystemVerilog硬件设计及建模》

VHDL的数据类型之枚举、数组 数组类型是在VHDL中定义的由相同类型元素组成的有序集合。数组允许设计者以结构化和系统化的方式组织和处理数据,如存储器、寄存器文件、数据总线等。type:关键字,用于定义新类型。array_name:自定义数组类型的名称。:数组的索引范围,可以是downto或to。:数组中元素的数据类型。 阅读详情

相关推荐

[SV]SystemVerilog学习笔记之枚举变量

SystemVerilog学习笔记(三) 一、用户自定义和枚举数据类型 1.1.用户自定义类型(typedef) 局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中 共享typedef定义:当在多个模型中使用时,typedef的定义可在包中进行, module,interface,program block可以通过导入包子项来使用typedef定义 Eg: package chip_types; `...

元直的博客 4368

使用易语言完成进程枚举代码分析

相信很多人在易语言编程中包括其他编程中在进行进程方面的操作,特别是进程枚举的时候都会用到别人的代码、公开的dll、类、模块等。 很少有人能自己写出进程枚举操作。特别是对于使用易语言的同学来说更是如此了。你们使用了易语言带来的便利性,却忽视了自己知识的重要性。 下面我就对非常短的进程枚举代码进行一下分析。(仅能枚举普通进程,不能进入内核枚举隐藏进程) 首先讲一下要用...

weixin_33724659的博客 1023

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 411

第八章:枚举,位运算

第15行使用了复合的位运算符"&=“, 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。二、枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说明, 即先定义后说明,同时定义说明或直接说明。枚举值是常量,不是变量。

baron-周贺贺-代码改变世界ctw 251

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4391

通信算法之320:DJI无人机云哨--信息包类型

大疆DJI无人机的云哨信息包主要分为四种类型:1)含经纬度位置、型号及序列号的完整数据包;2)仅含序列号的简化数据包;3)完全加密的数据包;4)加密密钥包。这些信息包格式不同,解析方式和应用场景也各异。如需更详细的技术资料,可联系作者获取。

leegang12的专栏 761

【FPGA】Verilog 中 typedef enum 用法教程

在 Verilog 编程中,typedef enum 是 SystemVerilog (SV) 的一个特性,它提供了一种定义新类型的方法,使得代码更加清晰和易于管理。本教程将介绍 typedef enum 的基本用法。

sqqwm的专栏 5997

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1025

硅芯思见:关于SystemVerilog中枚举类型中枚举值列表的一些事儿

本文示例枚举类型中枚举值列表钟标签赋值一些注意事项

m0_46345246的博客 1063

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

基于C#通过PLCSIM ADV仿真软件实现与西门子1500PLC的S7通信方法演示

Robot_PLC_HMI_Automation 3162

SAM3 几行代码支持任意图像分辨率,减少显存占用(针对transformers库)

几行代码让sam3支持任意图像分辨率

qq_41234663的博客 156

易语言大漠插件模块制作枚举EnumWindow窗口句柄

本课封装的命令有ClientToScreen、EnumProcess、EnumWindow、EnumWindowByProcess、EnumWindowByProcessId、EnumWindowSuper 511遇见大漠模块制作 模块源码 .版本 2 .子程序 ClientToScreen, 整数型, 公开, 把窗口坐标转换为屏幕坐标ClientToScreen(返回值:0失败,1成功) .参数 hwnd, 整数型, , 指定的窗口句柄 .参数 x, 整数型, 参考, 窗口X坐标 ..

511遇见 5764

应用商店评论分析实战:Python逆向工程破解Google Play加密接口与NLP建模

在移动互联网时代,应用商店中的用户评论成为了开发者优化应用、提升用户体验的重要依据。然而,Google Play等应用商店对评论数据进行了加密处理,直接爬取难度较大。本文将介绍如何使用Python逆向工程破解Google Play的加密接口,实现对应用商店评论的实时采集,并结合NLP(自然语言处理)技术进行情感分析和主题建模,为开发者提供有价值的数据支持。

u014481728的博客 1349

【SystemVerilog学习笔记】4-用户自定义和枚举数据类型

目录4.1 typedef4.2 枚举数据类型4.2.1 指定枚举类型标签序列的方式:4.2.2 枚举类型标签作用域:4.2.3 枚举类型值:4.2.4 枚举类型标签值的类型:4.2.5 自定义和匿名枚举4.2.6 枚举类型操作的强类型检验4.2.8 枚举类型的专用系统任务和方法4.2.9 打印枚举类型 SystemVerilog对Verilog的拓展: 使用typedef建立用户自定义类型。 使用enum建立枚举类型。 4.1 typedef 对比 Verilog SystemVerilo

w0shishabi的博客 811

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4917

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

第四章:用户自定义和枚举数据类型

此章一切为了可读性,代码自成文档。 1.typedef 建立用户自定义类型 2.enum建立枚举类型 枚举类型规定了变量取值范围(只能在规定的标签中取值),状态机常用此类型。 枚举类型同数组类似有专用的系统函数。 <枚举变量名>.first – 返回枚举列表第一个成员的值 <枚举变量名>.last – 返回枚举列表最后一个成员的值 <枚举变量名>....

weixin_30471065的博客 251

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

用户自定义数据类型、结构和枚举中的问题

1、无名结构体就是不定义结构名,如需使用需在定义是定义结构变量,并且使用时需要注意结构变量的作用范围。 2、传址调用方式在传递结构时效率高于传值调用方式; 3、传址调用和传值调用区别:内存中需要的结构体变量的副本不同,传值调用需要复制一份结构体变量,传引用调用直接调用原结构体变量。 4、枚举类:关键字是:enum 一般形式:enum 枚举类型名{常数表} 一般将枚举类的每一个列表

飞天剑舞的博客 602

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SV学习——数据类型(1)

enum 结构体

qq_39787102的博客 1830

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

本文全面介绍了枚举(Enum)在编程中的基本概念与用法。首先阐述了枚举的定义及其类型,包括语法格式、枚举元素的特点,并通过案例演示了如何定义枚举类型。接着,深入探讨了枚举变量的概念、定义方式及其实战应用。文章还详细讲解了枚举的遍历方法,包括连续和非连续枚举常量的遍历技巧。此外,还介绍了枚举在 switch 语句中的使用以及枚举数组的相关知识。本文旨在帮助读者深入理解枚举,并能在实际编程中灵活运用。

大模型全栈工程师 · Thanks_ks 6753

平坦枚举与作用枚举的定义以及其相互之间的区别

在上述示例中,`CarState`是一个平坦枚举类型,`Off`、`Running`和`Stopped`是它的成员。`CarStateScoped`是一个作用域枚举类型,`CarStateScoped::Off`、`CarStateScoped::Running`和`CarStateScoped::Stopped`是它的作用域枚举成员。在上面的示例中,`Color`是一个作用域枚举类型,它有三个作用域枚举成员:`Red`、`Green`和`Blue`。平坦枚举中的枚举成员是具有特定命名的命名常量。

Kegi_的博客 958

【SV】枚举类型

1.1. 用户自定义类型(typedef) 局部typedef定义:只用于设计的特定部分时,typedef的定义可在module或interface中 共享typedef定义:当在多个模型中使用时,typedef的定义可在包中进行,module,interface,program block可以通过导入packet子项来使用typedef定义 例如: package chip_types; `ifdef TWO_STATE typedef bit dtype_t; //当宏定义TWO_STATE时

lbt_dvshare的博客 8559

枚举类型enum详解

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解成什么基本类型。好像可以把int型的数据直接赋值给enum变量,实际上是不行的,需要进行强制类型转换,C语言提供了一种称为“枚举”的类型,其中一个枚举常量的占的字节数为4个字节,恰好和int类型的变量占的字节数相同,假设把这些枚举常量说明为整型,字符型或其他类型显然是不妥当的。

让学习成为一种习惯 1万+

System Verilog 系列学习(2)----自定义数据类型和枚举类型

user-defined types Verilog中不支持用户自定义数据类型,verilog中现有的数据类型适用于RTL级和gate级建模,没有类似于C语言中的更高级的抽象数据类型。System Verilog为系统级和架构级别的建模增加了许多新类型。 system verilog使用关键字 typedef 来创建自定义数据类型,一旦新的数据类型被定义,它就可以立即被使用。如: typed...

xie2012302700054的博客 7731

【原创】VBA里的枚举型数据enum

一 比较三种数据类型 enum 枚举型,数值类型 eNum array 数组 dictionary 字典 二 枚举型 1.1 枚举型 enum 需要先用户自定义 放在过程外,模块最前面 只能用public private 声明,不能用 dim Public Enum w1 week1 week2 week3 week4 End Enum S...

奔跑的犀牛先生 5404

用户定义类型:枚举 和共用体

@Chita_ C语言 用户定义类型 枚举(Enumeration) 共用体(Union) 基本数据类型 - int: 整型 - char: 字符型 - float:浮点型 - double: 双精度浮点型

qq_39954858的博客 423
上一篇: SV中$unit编译单元
下一篇: SystemVerilog 结构体
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值