SystemVerilog 验证-测试平台编写指南学习笔记(1):数据类型

1 SystemVerilog引进的新的数据类型的优点?

  1. 双状态数据类型:更好的性能,更低的内存消耗。
  2. 队列、动态和关联数组:减少内存消耗,自带搜索和分类功能。
  3. 类和结构:支持抽象数据结构。
  4. 联合和合并结构:允许对同一数据有多种视图(view)。
  5. 字符串:支持内建的字符序列。
  6. 枚举类型:方便代码编写,增加可读性。

2 Verilog与SystemVerilog内建数据类型的比较?

2.1 Verilog

  • 两种数据类型:变量和线网(net)。
  • 变量:
    • 单bit或多bit无符号数 reg。
    • 32bit 有符号数 interger。
    • 64bit 无符号数 time。
    • 浮点数 real。
  • 所有数据都是静态static类型。

2.2 SystemVerilog

  • 逻辑(logic)类型

    • 为什么创建这个类型? SystemVerilog对经典reg数据类型改进,使得作为一个变量外还可以被连续赋值。为了区分寄存器类型,新建logic类型。
    • logic不能有多个结构性驱动,比如双向总线,其他情况下任何使用线网的地方均可以使用logic。
  • 双状态数据类型

    • 最简单的双状态数据类型:bit。
    • 另4种带符号的双状态数据类型:byte(8bit)、shortint(16bit)、int(32bit)和longint(64bit)。
    • 注意双状态连接到被测设计输出时X或Z会转换成双状态值。$isunknown() 检测到X或Z会返回1。

3 Verilog与SystemVerilog数组的比较

3.1 定宽数组

  • Verilog必须在声明种给出数组的上下界 int data[0:15],SystemVerilog可以只给出数据宽度int data[16]。
  • Verilog-1995数组下标和位下标不能同时使用。Verilog-2001与SystemVerilog可以 src[0][2:1] src数组0的bit2:1。
  • SystemVerilog可以创建多维定宽数组 int array[0:7][0:3] /int array[8][4] 创建一个8行4列的数组。
  • SystemVerilog操作数组最常见的方式是使用for或foreach循环。
  • SystemVerilog可以合并数组 bit [3:0][7:0] bytes,四个8bit数据合并在一起。

3.2 动态数组

  • Verilog数组宽度编译时确定。SystemVerilog 提供了动态数组类型 int data[],可以在仿真时分配空间或调整宽度 data = new[5]。
  • 系统函数$size返回数组宽度。

3.3 关联数组

SystemVerilog 提供了关联数组类型,用来保存稀疏矩阵的元素。当对一个非常大的地址空间进行寻址,只为实际写入的元素分配空间,节省存储空间。

3.4 SystemVerilog定宽数组与动态数组赋值

  • 基本数据类型相同,定宽数组与动态数组之间就可以相互赋值。
  • 元素数目相同,动态数组的值可以复制到定宽数组。
  • 定宽数组复制给动态数组时,SystemVerilog 会调用构造函数new[]来分配空间并复制数值。

3.5 数组的方法

3.5.1 数组缩减方法

功能:把一个数组缩减成一个值。
常用方法:sum,对数组中所有元素求和。

3.5.1 数组定位方法

功能:最大值,特定值
方法:data.min() ; data.max() ; data.unique(); data.find with (item > 3) ,返回一个队列
data.sum with (item > 3) 就可以找出大于3的元素的个数。

3.5.1 数组排序方法

功能:改变数组元素顺序
方法:data.reverse(); data.sort(); data.rsort(); data.shuffle();

4 SystemVerilog 的新数据类型:队列

队列结合链表与数组的优点。
类似链表:可在一个队列中人任何位置增加或删除元素。
类似数组:可用索引访问任一元素。

4.1 队列的操作

声明:q[$] = {0, 2, 5};// 注意队列常量不需要’{}。
插入:q.insert(1,3); // {0, 3, 2, 5} 在索引1前插入3
删除:q.delete(1); // {0, 2, 5} 删除索引1元素
放 在 范 围 表 达 式 左 边 表 示 最 小 值 , 右 边 表 示 最 大 值 。 q [ 放在范围表达式左边表示最小值,右边表示最大值。 q[ q[,2] 代表[0:2],q[1:$] 代表 q[1:2]。
可以把定宽或动态数组的值复制给队列。

5 SystemVerilog 的新数据类型:链表

链表数据结构类似标准模板库(STL)的列表容器。这个容器定义为一个参数化的类,可以根据用户需要存放各种类型的数据。
避免使用,因为 SystemVerilog 队列更高效。

5 SystemVerilog 创建新的类型

typedef reg[7:0] opreg_t;

6 SystemVerilog 创建用户自定义结构

Verilog没有数据结构。SystemVerilog 可以使用struct语句创建结构。
struct 只是把数据组织到一起。

使用struct创建新类型:
struct {bit [7:0] r,g,b} pixel;
struct packed {bit [7:0] r,g,b} pixel; //packed 代表合并结构,以连续bit存放,不然默认存储空间为长字。

对结构进行初始化:
在声明或过程赋值语句把多个值用’{}给结构体赋值,与数组赋值类似。

7 类型转换

如果源变量与目标变量bit位分布完全相同,它们之间可以直接相互赋值。
bit位分布不同,则需要使用流操作符对bit分布重新安排。

7.1 静态转换

静态转换不对值进行检查。
转换时指定目标类型,并在要转换的表达式前加上单引号即可。
int i;
real r;
i = int '{10.0 - 0.1}; // 转换非强制

7.2 动态转换

动态转换函数 $cast 允许对越界的数组进行检查。

7.3 流操作符

流操作符: << 和 >> ,后面带表达式、结构或数组。
可以替换位拼接符{},使代码更简洁。
功能:将其后的数据打包成一个bit流。>> :把数据从左至右变成流。 <<:把数据从右至左变成流。

不能将比特流结果直接赋值给非合并数组,而应该在赋值表达式左边使用流操作符把bit流拆分到非合并数组中。

8 枚举类型

枚举创建了一种强大的变量类型,它仅限于一些特定名称的集合,例如指令中的操作码或者状态机中的状态名。

enum {RED, BLUE=2, GREEN} color; // {RED=0, BLUE=2, GREEN=3}枚举值若缺省从0开始递增,否则从自定义值开始递增。

8.1 枚举类型的子程序

  1. first(): 返回第一个枚举常量。
  2. last(): 返回最后一个枚举常量。
  3. next(): 返回第下一个枚举常量。
  4. next(N): 返回下N个枚举常量。
  5. prev(): 返回前一个枚举常量。
  6. prev(N): 返回前N个枚举常量。

注意next和prev到达头或者尾时会环形绕回。

8.2 枚举类型转换

缺省类型为int
枚举类型可赋值给非枚举变量。
SystemVerilog 不允许在没有进行显示类型转换情况下把整型变量赋值给枚举变量,避免数值越界。

9 常量

Verilog创建常量典型方法:使用文本宏
优点:具有全局作用范围可以用于位段和类型定义。
确定:需要局部变量时会冲突。

SystemVerilog 可以在程序包声明参数,也支持const修饰符。

10 SystemVerilog 的新数据类型:字符串

与C语言string类型的区别:SystemVerilog 字符串结尾不带标识符null。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值