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

文章目录

  • 1. 内建数据类型
  • 2. 用户自定义
  • 3. 枚举类型


1. 内建数据类型

SV中引入新的数据类型logic,SV作为侧重于验证的语言,并不十分关切logic对应的逻辑应该被综合位寄存器还是线网,因为logic被使用的场景如果是验证环境,那么它只会作为单纯的变量进行赋值操作。
引入的一个新的四态数据类型logic,可以代替reg;但是不能用在双总线和多驱动的情况下,此时只能使用网线类型,例如wire

logic虽然只是表示数据类型,而在声明时,它默认会表示变量类型(variable),用户也可以显式声明其类型;

var		logic	[63: 0]	addr;	// a 64-bit wide variable
wire	logic	[63: 0]	data;	// a 64-bit wide net

与logic相对应的是bit类型,他们均可以构建矢量类型(vector),区别:

  • logic为四值逻辑,0、1、Z、X
  • bit为二值逻辑,0、1
    在这里插入图片描述
bit					a	;		// 两态,单比特
bit	[31: 0]			b32	;		// 两态,32比特无符号
int					c32	;		// 两态,32比特有符号
byte				d8	;		// 两态,8比特有符号
shortint			e16	;		// 两态,16比特有符号
longint				f64	;		// 两态,64比特有符号

2. 用户自定义

在SV使用typedef关键字进行用户自定义类型的扩展。定义新的数据类型可以提高代码的可读性,复杂的数据类型(结构体、联合体)和特定的数组可以通过使用一个简单易懂的名字(别名)被定义为一个新的数据类型,这个新的类型就可以定义对应的变量:

typedef int my_favorite_type;
my_favorite_type	a, b;

这样的方法不是创建新的数据类型,只是在做文本替换;将一个特定的数组定义为新的数据类型:

parameter	OPSIZE = 8;
typedef reg	[OPSIZE-1: 0]	opreg_t;
opreg_t	op_a, op_b;

如果使用空的typedef事先对一个数据类型作出标识,那么它就可以在其定义之前使用:

typedef foo;
foo	f = 1;
typedef	int	foo;

一个用户自定义类型需要在类型的内容被定义之前声明。这对于由enum、sturct、union、class派生出的用户自定义类型很有用处:

typedef	enum	type_declaration_identifier;
typedef	struct	type_declaration_identifier;
typedef	union	type_declaration_identifier;
typedef	class	type_declaration_identifier;
typedef	type_declaration_identifier;

某些情况下,定义一个新的数据类型是必须的,因为在SV中要用过数据类型的标识符才可以做类型转换:

// typedef_examplemodule test_typedef ();typedef enum {red, green, blue, yellow, white, black} colors;colors my_colors;initial	begin$display ("my_colors's defaut value is %s", my_colors);my_colors = green;// my_colors = 1;			// err 需要做数据类型转换my_colors = colors'(3);		// 通过colors数据类型标识符做类型转换$display ("my_colors is %s", my_colors.name);endendmodule

在这里插入图片描述

3. 枚举类型

规范的操作吗和指令例如ADD、WRITE、IDLE等有利于代码的编写和维护,它比直接使用 'h01 这样的常量使用起来可读性和可维护性更好;
枚举类型enum经常和typedef搭配使用,由此便于用户自定义枚举类型的共享使用;
枚举类型的出现保证了一些非期望值的出现,降低来了设计风险;

enum [data_type] {name1 = value, name2 = value2, ..., nameN = valueN} var_name;enum {red, yellow, green} light1, light2;

无论是枚举名(red/yellow/…)还是他们的(整型)数值都必须是唯一的。他们的值可以被设置为任意整型常量值,或者从初始值0开始递增(默认情况)。

代码示例:

// enum_examplemodule test_enum ();// 默认值:red = 0, yellow = 1, green = 2;enum {red, yellow, green} light1, light2;	// 未命名的枚举类型(int类型)// 正确使用方法:IDLE = 0, S0 = 2, S1 = 3, S2 = xenum integer {IDLE, S0 = 'b10, S1 = 'b11, S2 = 'x} state, next;// 正确定义方法:silver和glod都没有指定大小enum {bronze = 3, silver, gold} medal;	// silver = 4, gold = 5// c被自动地指定为8enum {a = 3, b = 7, c} alphabet1;// d = 0, e = 7, f = 8enum {d, e = 7, f} alphabet2;initial	beginlight1	=	red		;light2	=	green	;// light1	=	gold;		// err$display ("light1 is %0d or %s", light1, light1);$display ("light2 is %0d or %s", light2, light2);state	=	S1;next	=	S2;$display ("state is %0d or %s", state, state);$display ("next is %0d or %s", next,next);medal	=	silver	;$display ("medal is %0d or %s", medal, medal);alphabet1	=	c	;$display ("alphabet1 is %0d or %s", alphabet1, alphabet1);alphabet2	=	d	;$display ("alphabet2 is %0d or %s", alphabet2, alphabet2);end// try something elsereg	[ 3: 0]	err;initial	beginerr	=	a;$display ("err is %0d or %s", err, err);endendmodule

在这里插入图片描述

typedef enum {INIT, DECODE, IDLE} fsmstate_e;
fsmstate_e	pstate, nstate;	// 声明自定义类型变量
case (pstate)IDLE: nstate = INIT;	// 数据赋值INIT: nstate = DECODE;default: nstate = IDLE;
endcase
$display ("Next state is %s", nstate.name());

在这里插入图片描述

**枚举类型可以直接赋值给整型,整型不能直接赋值给枚举类型,需要做一个枚举类型的类型转换,这样在仿真的时候更安全。

INT = enumenum = ENUM'(INT);
// enum_testmodule enum_test ;// 默认值:red = 0, green = 1, blue = 2;typedef enum {red, green, blue} Colors;Colors	my_color;initial	beginmy_color	=	red;$display ("@0 my_color is %d or %s", my_color, my_color);my_color	=	blue;$display ("@1 my_color is %d or %s", my_color, my_color);//		my_color	=	int'(2);		// err
//		// An enum variable 'my_color' of type 'Colors' may only be assigned 
//		// the same enum typed variable or one of its values. 
//		// Value '2' requires an explicit cast.
//		$display ("@2 my_color is %d or %s", my_color, my_color);my_color	=	Colors'(1);$display ("@2 my_color is %d or %s", my_color, my_color);endendmodule

在这里插入图片描述

版权声明:本文为CSDN博主「Bunny9__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Bunny9__/article/details/122494130

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

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

相关文章

【HarmonyOS】体验鸿蒙电商平台的未来之旅!

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

Linux 的提示符太长了,帮你精简一下

普通用户修改文件 ~/.bashrc 修改 50 行左右的代码,将两个w改为大写的W 如果是root用户则修改文件/root/.bashrc,同样的方法。

接口自动化测试框架设计

文章目录 接口测试的定义接口测试的意义接口测试的测试用例设计接口测试的测试用例设计方法postman主要功能请求体分类JSON数据类型postman内置参数postman变量全局变量环境变量 postman断言JSON提取器正则表达式提取器Cookie提取器postman加密接口签名 接口自动化测试基础getp…

从 fatal 错误到 sync.Map:Go中 Map 的并发策略

为什么 Go 语言在多个 goroutine 同时访问和修改同一个 map 时,会报出 fatal 错误而不是 panic?我们该如何应对 map 的数据竞争问题呢? 这篇文章将带你一步步了解背后的原理,并引出解决 map 并发问题的方案。 Map 数据竞争 首先…

node介绍

1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台,是使用事件驱动,异步非阻塞I/O,单线程&…

【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

Undertow web容器的入门实战及调优方案精讲 Undertow web容器Undertow 介绍官网API给出一句话概述Undertow:官网API总结特点:Lightweight(轻量级)HTTP Upgrade Support(支持http升级)、HTTP/2 Support支持H…

提升网站关键词排名的工具

随着互联网的蓬勃发展,网站的关键词排名成为衡量网站流量和曝光度的重要指标。在这个竞争激烈的数字时代,站在搜索引擎结果的前列变得至关重要。为了实现这一目标,合理利用关键词排名优化工具是必不可少的。本文将重点介绍147SEO软件&#xf…

《WebKit 技术内幕》之八(1):硬件加速机制

《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…

腾讯云tsf平台-部署微服务项目

腾讯云tsf平台-部署微服务项目 一、腾讯云tsf平台简介二、部署准备0(数据库、中间件等部署)三、部署准备1(创建集群和命名空间)1、准备部署资源--集群2、使用容器部署微服务步骤 1:创建容器集群步骤 2:创建…

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

计算机网络——运输层(2)暨小程送书

计算机网络——运输层(2)暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层(2)TCP/IP对比TCP(传输控制协议):IP(互联网协议):总结 拥塞…

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件: 软件: 操作系统: 操作系统工作流程 操作系统作用 常见的操作系统 PC端: 移动端:(掌上操作系统) 一.初识Linux 2.Linux初识 linu…

【微信小程序独立开发 5】后端搭建联调

前言&#xff1a;上节我们完成了个人信息页的编写&#xff0c;本节完成将个人信息发给后端&#xff0c;并由后端存储 创建Spring Boot项目 配置maven仓库 使用自己下载的maven版本 添加pom文件 <dependencies><dependency><groupId>org.springframework.boo…

【服务器】Xshell与Xftp软件的使用指南

目录 【Xshell软件】 1.1 Xshell软件的功能 1.2 Xshell软件的使用 【Xftp软件】 2.1 Xftp软件的功能 2.2 Xftp软件的使用 可替代产品【FinalShell】 3.1 FinalShell软件的使用 3.2 FinalShell连接服务器失败解决方法 可替代产品【FileZilla】

Java网络编程——UDP通信原理

一、TCP和UDP概述 传输层通常以TCP和UDP协议来控制端点与端点的通信 TCPUDP协议名称传输控制协议用户数据包协议是否连接面向连接的协议。数据必须要建立连接无连接的协议&#xff0c;每个数据报中都给出完整的地址信息&#xff0c;因此不需要事先建立发送方和接受方的连接是…

Java面试题50道

文章目录 1.谈谈你对Spring的理解2.Spring的常用注解有哪些3.Spring中的bean线程安全吗4.Spring中的设计模式有哪些5.Spring事务传播行为有几种6.Spring是怎么解决循环依赖的7.SpringBoot自动配置原理8.SpringBoot配置文件类型以及加载顺序9.SpringCloud的常用组件有哪些10.说一…

toad 库中 iv 计算逻辑

merge 函数默认为决策树合并 决策树叶子结点默认值DEFAULT_BINS 10&#xff0c;可通过 n_bins 人为设置叶子结点数

Eureka整合seata分布式事务

文章目录 一、分布式事务存在的问题二、分布式事务理论三、认识SeataSeata分布式事务解决方案1、XA模式2、AT模式3、SAGA模式4.SAGA模式优缺点&#xff1a;5.四种模式对比 四、微服务整合Seata AT案例Seata配置微服务整合2.1、父工程项目创建引入依赖 2.2、Eureka集群搭建2.3、…

19万9的小米SU7已经彻底被否了

文 | AUTO芯球 作者 | 李诞 雷总 您是真不听劝啊 还要准备和米粉“干一架”啊 我和大家一样啊 这下好了 19万9的小米SU7已经彻底被否了 说实话 我心理真不是滋味 毕竟大家都说了&#xff0c; 9.9是雷爹&#xff0c;9万9是雷帝&#xff0c;15w是雷神 19万是雷总&#x…

Java开发工具:IntelliJ IDEA 2023 for Mac中文激活

IntelliJ IDEA 2023是一款由JetBrains开发的强大的集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;适用于多个编程语言。它旨在提高开发人员的生产力和代码质量。 软件下载&#xff1a;Java开发工具&#xff1a;IntelliJ IDEA 2023 for Mac中文激活 IntelliJ IDEA 20…