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

这篇具有很好参考价值的文章主要介绍了SV学习——数据类型(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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
    SV学习——数据类型(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_example

module 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);
	end

endmodule

SV学习——数据类型(1),芯片漫游指南学习,开发语言

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_example

module test_enum ();

	// 默认值:red = 0, yellow = 1, green = 2;
	enum {red, yellow, green} light1, light2;	// 未命名的枚举类型(int类型)
	
	// 正确使用方法:IDLE = 0, S0 = 2, S1 = 3, S2 = x
	enum integer {IDLE, S0 = 'b10, S1 = 'b11, S2 = 'x} state, next;
	
	// 正确定义方法:silver和glod都没有指定大小
	enum {bronze = 3, silver, gold} medal;	// silver = 4, gold = 5

	// c被自动地指定为8
	enum {a = 3, b = 7, c} alphabet1;
	
	// d = 0, e = 7, f = 8
	enum {d, e = 7, f} alphabet2;
	
	   
	initial	begin
		
		light1	=	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 else
	reg	[ 3: 0]	err;
	initial	begin
		err	=	a;
		$display ("err is %0d or %s", err, err);
	end
	
endmodule

SV学习——数据类型(1),芯片漫游指南学习,开发语言

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());

SV学习——数据类型(1),芯片漫游指南学习,开发语言

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

INT = enumenum = ENUM'(INT);

// enum_test

module enum_test ;
	// 默认值:red = 0, green = 1, blue = 2;
	typedef enum {red, green, blue} Colors;
	Colors	my_color;
	
	initial	begin
		my_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);
	end

endmodule

SV学习——数据类型(1),芯片漫游指南学习,开发语言

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

到了这里,关于SV学习——数据类型(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SV芯片验证之验证环境

    声明:本内容来自于学习路科验证发布在B站上的免费视频课程后的笔记 它是整个验证系统的总称,包括: 1、验证结构中的各个组件、组件之间的连接关系、测试平台的配置和控制; 2、编译仿真的流程、结果分析报告和覆盖率检查; 我们主要关注验证平台的结构和组件部分

    2024年02月16日
    浏览(42)
  • SV芯片验证之动态数组、队列、关联数组

    声明:本内容来自于学习路科验证发布在B站上的免费视频课程后的笔记 可以重新确定大小。 1、声明时需要用 [ ] ,表示 不会在编译时为其指定大小,而是在仿真运行时来确定大小 。 它在一开始如果没有做初始化或者赋值,那么就为空,需要使用 new[ ] 来给它分配空间。 

    2024年02月16日
    浏览(29)
  • 读SQL学习指南(第3版)笔记02_数据类型

    Database changed 2.1.1.1. 单字节字符集 2.1.1.2. 字符数量很少,只需要单字节就能存储每个字符 2.1.1.3. 之前版本的MySQL服务器中,默认字符集是latin1 2.1.2.1. 日语 2.1.2.2. 韩语 2.1.2.3. 多字节来存储每个字符 2.1.2.4. 版本8中改为了utf8mb4 2.1.5.1. varchar(20) character set latin1 2.1.6.1. creat

    2024年02月12日
    浏览(42)
  • 【SQL Server】数据库开发指南(二)MSSQL数据库开发对于库、表、数据类型、约束等相关操作

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2023年04月09日
    浏览(342)
  • Linux C语言开发(二)C语言数据类型

    目录 一.C语言概述 1.1 什么是C语言 1.2 C语言与Linux 1.3 C语言的特点 二.数据类型

    2024年01月17日
    浏览(40)
  • C语言学习:8、深入数据类型

    C语言中,如果需要用的整数大于int类型的最大值了怎么办? 我们知道int能表示的最大数是2147483647,最小的数是-2147483648,为什么? 因为字32位系统中,寄存器是32位的,寄存器中最高位表示符号位,0表示整数,1表示负数; 所以32位系统中int的最大值可以表示为0111 1111 1111

    2024年02月09日
    浏览(38)
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(69)
  • (三)SV结构体、枚举类型、字符串

    1、SV结构体与C语言中结构体对应 说明: student:结构体类型名,可以忽略不写的 student1, student2:结构体变量名 内部的变量:成员变量名   但常常用typedef来新定义类型,就是对其他类型取别名,方便定义变量 ,例如:  typedef struct {bit [7:0] r, g, b;} pixel_s1;//pixel_s就是对struct {bit

    2024年02月15日
    浏览(42)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(48)
  • C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)二

    前面我们多次提到了字符串,字符串是多个字符的集合,它们由 \\\" \\\" 包围,例如 \\\"http://c.biancheng.net\\\" 、 \\\"C语言中文网\\\" 。字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存。 当然,字符串也可以只包含一个字符,例如 \\\"A\\\" 、 \\\"6\\\" ;不过为了操作方

    2024年01月17日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包