您当前的位置: 首页 > 

lu-ming.xyz

暂无认证

  • 0浏览

    0关注

    115博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

lu-ming.xyz 发布时间:2022-04-21 00:04:52 ,浏览量:0

目录
  • 1 SystemVerilog引进的新的数据类型的优点?
  • 2 Verilog与SystemVerilog内建数据类型的比较?
    • 2.1 Verilog
    • 2.2 SystemVerilog
  • 3 Verilog与SystemVerilog数组的比较
    • 3.1 定宽数组
    • 3.2 动态数组
    • 3.3 关联数组
    • 3.4 SystemVerilog定宽数组与动态数组赋值
    • 3.5 数组的方法
      • 3.5.1 数组缩减方法
      • 3.5.1 数组定位方法
      • 3.5.1 数组排序方法
  • 4 SystemVerilog 的新数据类型:队列
    • 4.1 队列的操作
  • 5 SystemVerilog 的新数据类型:链表
  • 5 SystemVerilog 创建新的类型
  • 6 SystemVerilog 创建用户自定义结构
  • 7 类型转换
    • 7.1 静态转换
    • 7.2 动态转换
    • 7.3 流操作符
  • 8 枚举类型
    • 8.1 枚举类型的子程序
    • 8.2 枚举类型转换
  • 9 常量
  • 10 SystemVerilog 的新数据类型:字符串

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流。>> :把数据从左至右变成流。

关注
打赏
1655639048
查看更多评论
立即登录/注册

微信扫码登录

0.0348s