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。
- 字符串使用动态存储,不用关心大小。
![在这里插入图片描述]()
![在这里插入图片描述]()












浙公网安备 33010602011771号