System Verilog 引进的新的数据类型,他们所具有的优点:
1. 双状态数据类型(bit, byte, shortint, int, longint):具有更好的性能,更低的内存消耗。
2. 队列(int a[$]),动态数组(int a[]),关联数组(int a[string]):减少内存消耗,且自带搜索和分类功能。
3. 类(class)和结构(struct):支持抽象的数据结构。
4. 联合结构和合并结构:允许对统一数据有多种视图(view)。
5. 字符串(string):支持内建的字符序列。
6. 枚举类型(enum):方便代码编写,增加代码可读性。(工程实践中经常使用)
1
思维导图
2
思维导图大纲
数组的方法
SV提供了很多数组的方法,可用于非合并数组类型
不带参数的方法可省略括号
缩减
将数组缩减为一个值
缩减方法
sum
product
and
or
xor
定位
返回值通常是队列
定位方法
min
返回最小值元素队列
max
返回最大值元素队列
unique
排除重复值,返回数组中具有唯一值的队列
find
ex:tp = d.find with (item > 3)
得到所有大于3的元素队列
with
条件语句
item 为重复参数,表示数组中单独的元素
item 缺省名,可通过在数组方法的参数列表中指定其它名
ex:tp = d.find(other) with (other > 3)
ex:tp = d.find_index(other) with (other > 3)
ex:tp = d.find_first(other) with (other > 3)
ex:tp = d.find_first_index(other) with (other == 3)
ex:tp = d.find_last(other) with (other == 3)
ex:tp = d.find_last_index(other) with (other == 3)
返回值是索引的定位方法,返回队列类型是 int 而不是 integer
排序
对数组进行排序
正排序
逆排序
打乱顺序
与定位方法的区别:排序改变了原数组,定位新建了一个队列保存结果
内建函数
.sort();
小到大
.rsort();
大到小
.reverse();
.shuffle();
随机打乱
不能带with,操作范围是整个数组
3
示例
例1:数组缩减方法的使用
定宽数组、动态数组、队列、关联数组都支持数组缩减方法,这个例子测试了 .sum(),.product(),.and(),.or(),.xor() 四种数组缩减方法分别在四种类型的数组上使用。
例2:缩减方法 sum() 的问题
合并数组无法使用数组方法。
对于单 bit 数组使用 .sum() 方法时,其和只保留一位;第 16 行和第 19 行,并不会像我们所期望的那样将位宽与其他参与运算的值位宽对齐。
第 25 行表示可以使用 with 表达式,先将每项转换位宽再求和,以达到单 bit 数组实际求和的目的。
例3:数组定位方法 find
定宽数组、动态数组、队列、关联数组都支持数组定位方法,这个例子测试了一系列 find 数组定位方法分别在四种类型的数组上使用。
例4:with 表达式的使用
第 11 行,使用 find 系列方法返回数组的索引时,除了关联数组外,索引只能是 int 类型,定义成 integer 类型将报上述错误。
例5:数组排序方法
定宽数组、动态数组、队列、关联数组都支持数组排序方法,这个例子测试了 reverse(),sort(),rsort(),shuffle() 数组排序方法分别在四种类型的数组上使用。
关联数组使用排序方法时,同样对值进行排序,键的位置保持不变,排序后,键值对将发生变化。
例6:带 with 的排序方法使用
reverse 和 shuffle 方法不能带 with 条件语句,sort 和 rsort 可以在某些情况下使用 with 表达式,如该例中,以结构中的某一个分量进行排序。
例7:带数组方法的记分板
领取专属 10元无门槛券
私享最新 技术干货