IC验证零基础学习-System Verilog-(二)数据类型

IC验证零基础学习-System Verilog-(二)数据类型
SV引进了一些新的数据类型,具有如下优点:
(1)双状态数据类型,:更好的性能和更低的内存消耗。
(2)队列,动态和关联数组:减少内存消耗,自带搜索和分类功能。
(3)类和结构:支持抽象数据结构。
(4)联合和合并结构:允许对同一数据有多种视图。
(5)字符串:支持内建的字符序列。
(6)枚举类型:方便代码编写,增强可读性。
1、内建数据类型
1)逻辑类型:logic类型只能有一个驱动,所以你可以使用它来查找网单中的漏洞。
2)双状态数据类型-有利于提高仿真器的性能并减少内存的使用量。
四状态:reg, logic, net_type(无)。integer(有)。
双状态:bit(无)。byte, shortint, int, longint(有) 。
2、定宽数组
1)SV允许只给出数组宽度的便捷声明方式。
2)可以通过在变量名后面指定维度的方式来创建多维定宽数组。
【注】如果你试图从一个越界的地址中读取数据,那么SV将返回一个数组元素的缺省值。四状态类型返回X值,双状态返回0。
仿真器通常使用两个或两个以上连续的字来存放logic和integer等四状态类型,这会比存放双状态变量多占用一倍的空间。
3)常量数组-使用一个单引号加大括号来初始化组数。
4)操作数组的最常见的方式是使用for和foreach循环,SV的 $ size函数返回数组的宽度。foreach使用的方括号[i, j ]。
5)基本的数组操作-复制和比较,对于数组的算术运算不能使用聚合操作,而应该使用循环,例如加法等运算,对于逻辑运算,例如异或等运算,只能使用循环或描述的合并数组。
6)同时使用位下标和数组下标
7)合并数组-既可以作为数组,也可以当成单独的数据。
8)声明合并数组时,合并的位和数组大小作为数据类型的一部分,必须在变量名前面指定。格式必须是[msb:lsb]。
如果你需要等待数组中的变化,则必须使用合并数组。当测试平台需要通过存储器数据的变化来唤醒时,会想到使用@操作符。但是这个操作符只能用于标量或者合并数组。
3、动态数组-在声明时,使用空的下标[ ],开始时空的,必须调用new[ ]操作符来分配空间,同时在方括号中传递数组宽度。可以把数组名传给new[ ]构造符。
系统函数 $size的返回值是数组宽度。动态数组有一些内建的子程序,例如delete和size。
只要基本数据类型相同,例如都是int,定宽数组和动态数组之间就可以相互赋值。在元素数目相同的情况下,可以把动态数组的值复制到定宽数组。
4、队列-声明是使用带有美元符号的下标[ $ ],队列编号从0到 $ 。
队列具有许多常见的操作,在特定值前插入数值;在整个队列前插入值;在队列前面或末尾插入值;删除某个或整个队列;
队列中的元素是连续存放的,所以在队列前面或后面存取数据非常方便。并且队列可以在任意地方增加或删除元素。
使用队列操作读取队列数据时,读取后即不存在于队列。
读取数列:a = q[ i:+14 ];
5、关联数组-SV提供关联数组类型,用来保存稀疏矩阵的元素。
6、链表
7、数组的方法-这些方法可以用于非合并的数组类型,包括定宽数组,动态数组,队列和关联数组。
1)数组缩减的方法:求和(sum),积(product),与(and),或(or),异或(xor)。
2)数组定位的方法:min/max()—找出数组的最大值和最小值。unique()—返回数组中具有唯一值的队列,即排除掉重复数组。
with()—可以指示SV如何进行搜索,其中item被称为重复参数,它代表了数组中一个单独的元素;x表示判断条件真假,返回值为1或0,得到一个序列或者是该序列的相应操作。
3)数组的排序:sort()—从小到大排序。rsort()—从大到小排序。reverse()—颠倒排序。shuffle()—乱序排列。
4)使用数组定位的方法建立记分板
8、选择存储类型
1)灵活性-例如长度可变的数据包使用动态数组存储会很方便。
2)存储器用量-使用双状态类型可以减少仿真器用量;为了避免空间浪费,应尽量选择32比特的整数倍作为数据位宽。
3)速度-定宽和动态数组都是被存放在连续的存储空间里,所以访问其中的任何元素耗时都相同,而与数组的大小无关;队列的读写速度与定宽或动态数组基本相当。
4)排序-
5)选择最优的数据结构
(1)网络数据包。特点:固定长度,顺序存取。
(2)保存期望值的记分板。特点:仿真前长度未知,按值存取,长度经常变化。一般情况可以使用队列,这样方便在仿真期间连续增加和删除元素。
(3)有序结构。如果数据按照可预见的顺序输出,那么可以使用队列;如果输出顺序不确定,则使用关联数组。
(4)对超过百万条目的特大容量存储器进行建模。如果不需要用到所有的存储空间,可以使用关联数组实现稀疏存储。
(5)文件中的命令名或操作码。特点:把字符串换成固定值。
9、使用typedef创建新的类型-用户定义的最有用的类型是双状态的32比特的无符号整数。
10、创建用户自定义结构
可以使用struct语句创建结构,只是一个数据的集合,是可综合的。
11、合并结构
合并与非合并的选择
1)需要经常对整体结构进行复制的,使用合并结构。
2)经常针对结构内的个体成员而非整体,那么就应该使用非合并的结构。
12、类型转换
1)静态转换:不对转换值进行检查。转换时指定目标类型,并在需要转换的表达式前加上单引号即可。
2)动态转换:动态转换函数$cast允许你对越界的数值进行检查。
3)流操作符。
13、枚举类型-仅限于一些特定名称的集合,有利于编写和维护代码。
1)定义枚举值:如果没有特别指出,枚举类型会被当成int类型存储。由于int类型的缺省值是0,所以在给枚举常量赋值时务必小心。
2)枚举类型的子程序。
3)枚举类型转换。
14、常量
15、字符串-可以使用string来保存长度可变的字符串。
16、表达式的位宽

参考书籍《SystemVerilog验证测试平台编写指南》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值