SV1 数据类型(下)

SV1 数据类型(下)

7. 数组的方法

  • SV提供了许多数组方法,可用于任何一种非合并数组类型,包括定宽数组、动态数组、队列和关联数组。

7.1数组缩减方法

  • 数组缩减:把一个数组缩减成一个值。
  • 对于数组求和:单比特数组求和,其结果也为单比特;
bit on[10];  //单比特数组
int total[10];  //32比特数组
initial begin
	foreach(on[i]) on[i] = i;    //on[i]的值为0或1
	foreach(total[i]) total[i] = i;    //total[i]的值为0到9
	$display("on.sum = %0d", on.sum);  //on.sum = 1
	$display("total.sum = %0d", total.sum);  //on.sum = 45
end
  • 其他数组缩减方法:product(积),and(与),or(或),xor(异或)。

7.2 数组定位方法 -- 在非合并数组中查找数据

  • min/max:找出数组中的最小值/最大值,返回一个队列。
  • unique:查找数组中的唯一值,返回一个队列。
    在这里插入图片描述
  • find:查找数组中符合条件的元素,用with指定查找条件,返回一个队列。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

7.3 数组的排序

在这里插入图片描述

  • reverse和shuffle方法不能带with条件语句

8 选择存储类型

8.1 灵活性

  • 若数组的索引是连续的非负整数0、1、2、3等,则应该使用定宽或动态数组。
  • 当数组的宽度在编译时可以确定,选择定宽数组,否则选择动态数组。
  • 当数组索引不规则时,选择关联数组。
  • 当数组中元素数量在仿真过程中变化很大时,选择队列。

8.2 存储器用量

  • 使用双状态类型可以减少仿真时的存储器用量。
  • 应尽量选择32比特的整数倍作为数据位宽,使用合并数组有助于节省存储空间。
  • 对于具有一千个元素的数组,数组类型的选择对存储器用量影响不大。
  • 对于具有一千到一百万个活动元素的数组,定宽和动态数组具有最高的存储器使用效率。
  • 对于兆字节量级的存储器建模应该使用关联数组。

8.3 速度

  • 当数组的操作很频繁,则数组的宽度和类型就会变得很关键。
  • 定宽数组与动态数组都是存放在连续的存储器空间,所以访问其中任何元素耗时都相同,与数组的大小无关。
  • 队列读写速度与定宽或动态数组基本相当。当需要在很长的队列中插入或删除元素时,耗时会很大。
  • 关联数组的存取速度是最慢的。

8.4 排序

  • 根据数组中元素增加的频繁程度来选择数组的类型。
  • 如果元素一次性全部加入,选择定宽或动态数组。
  • 如果元素逐个加入,选择队列。

8.5 选择最优的数据结构

  • 网络数据包:针对长度固定或可变的数据包可分别采用定宽或动态数组。
  • 保存期望值的记分板:长度经常变化,一般使用队列。
  • 有序结构:如果数据输出顺序确定,可使用队列;否则可以使用关联数组。
  • 超过百万条目的存储器建模:如果不需要用到所有存储空间,使用关联数组。

9 使用typedef创建新的类型

在这里插入图片描述

10 创建用户自定义结构

10.1 使用struct创建新类型

在这里插入图片描述

10.2 对结构体进行初始化

在这里插入图片描述

10.3 创建可容纳不同类型的联合

在这里插入图片描述

10.4 合并结构

  • 合并结构允许对数据在存储器中的排布方式有更多的控制。
  • 合并结构以连续比特集的方式存放,中间没有闲置的空间。
  • 当希望减少存储器使用或存储器的部分位代表了数值时,可以使用合并结构。
    在这里插入图片描述

10.5 在合并结构和非合并结构之间进行选择

  • 选择中需考虑结构通常的使用方式和元素的对齐方式。
  • 如果对结构的操作很频繁,例如经常对整个结构体进行复制,那么使用合并结构体的效率高。
  • 如果操作经常针对结构内部的个体成员而非整体,那么非合并结构效率高。
  • 对合并结构中尺寸不规则(元素位宽与字节不匹配)的元素进行读写时,需要移位和屏蔽操作,代价很高。

11 类型转换

  • 如果源变量和目标变量的比特位分布完全相同,如整数和枚举类型,则可以直接赋值。
  • 如果比特位分布不同,如字节数组和字数组,则需要使用流操作符重新安排比特分布。

11.1 静态转换

  • 静态转换不对转换值进行检查。
    在这里插入图片描述

11.2 动态转换

  • 动态转换$cast允许对越界的数值进行检查。
$cast(target, source);

11.3 流操作符

  • 用于把其后的数据打包成一个比特流。
  • ">>"用于把数据从左至右变成流。
  • "<<"用于把数据从右至左变成流。
    在这里插入图片描述
    在这里插入图片描述

12 枚举类型

在这里插入图片描述
在这里插入图片描述

12.1 定义枚举值

  • 枚举值缺省为从0开始的整数,可以指定枚举值。
    在这里插入图片描述
    注:第一个枚举值必须为0

12.2 枚举类型的子程序

在这里插入图片描述
在这里插入图片描述

12.3 枚举类型的转换

  • 枚举类型缺省类型为双状态int。
  • 可以直接把枚举类型变量赋值给int类型变量。
  • 不允许直接把整型变量赋值给枚举类型,应使用$cast进行显式转换。
    在这里插入图片描述

13 常量

在这里插入图片描述

14 字符串

  • string类型可以保存长度可变的字符串。
  • 单个字符是byte类型。
  • 长度为N的字符串,元素标号从0到N-1。
  • 字符串结尾不带标识符null。
  • 字符串使用动态存储,不用关心大小。 在这里插入图片描述
    在这里插入图片描述
posted @ 2021-09-23 18:50  thompsonm  阅读(323)  评论(0)    收藏  举报