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
思维导图大纲
静态转换
不检查转换值
转换时指定目标类型
在转换的表达式前加单引号
Verilog 对整数和实数类型,或者不同位宽的向量之间进行隐式转换
动态转换
使用动态转换函数 $cast 进行转换
对越界数值进行检查
流操作符
>> 和 <<
用在赋值表达式右边,后面可带表达式、结构、数组
用于将后边的数据打包成bit流
将数据从左到右变成流
将数据从右到左变成流
不能将 bit 流结果直接赋值给非合并数组(?书中写的是不能(P43),实际运行过程中使用 synopsis 家的仿真器是可以的,见例 2 第 11 行)
bit [3:0][7:0] bytes;
bit [7:0] byte [4];
3
示例
例1:类型转换
静态转换转换时指定目标类型,且需在转换的表达式前加上单引号 ' ,如上第 7 行所示。
静态转换所指定的目标类型,支持使用 typedef 自定义的类型,如上第 8 行所示。
第 9 行显示的是隐式的类型转换。
第 12 行和第 13 行是使用 $cast 进行动态转换,当转换成功时,$cast(dst, src) 返回 1,转换失败时返回 0,如上第 12 行转换失败返回 0,第 13 行转换成功返回 1。
例2:流操作符的基本操作
书中 P43 例2.42。
例3:队列间的流操作1
第 16 行和第 17 行,结果是相同的,但中间的过程是不一样的,第 16 行是先将 Bq 队列以 16 bit 位宽为单位从右向左变为流,得到的流结果再以 8 bit 位宽为单位从右向左得到流结果后再赋值给 Wq,而第 17 行的过程则相反。
第 16 行:{'h12, 'h34, 'h56, 'h78} -> {'h5678, 'h1234} -> { 'h34, 'h12, 'h78, 'h56 }。
第 17 行:{'h12, 'h34, 'h56, 'h78} -> { 'h78, 'h56, 'h34, 'h12 } -> { 'h3412, 'h7856}。
例4:队列间的流操作2
队列 q1 具有一个 17 bit 的元素,将 q1 以小端模式存储到字节队列 bytes 中,如上第 10 行和第 11 行是等价的,观察到直接使用流操作完成上述过程会使得最后一个元素为 'h80,而不是我们所期望的 'h01,所以第 12 行对最后一个元素进行右移 7 位后,bytes 才是我们所期望的结果。
相同的流操作用于左边的源表达式或右边的目的队列效果是一样的,如上第 17 行和第 18 行、第 19 行和第 20 行。
对于流操作的右边表达式流结果宽度与左边队列元素宽度不对齐时,结果的最后一个元素将向右补 0。以第 19 行为例,{8'h12, 8'h34, 8'h56, 8'h78, 8'h9a} -> {'h3456789a, 'h12} -> { 'h12, 'h9a, 'h78, 'h56, 'h34 },赋值给队列 q2 后,得到 { 32'h129a7856, 32'h34000000 } 其中 'h34 的右边自动补 0。注意仅最终结果会向右补 0, 中间过程并不补 0。第 21 行和第 22 行是对第 19 行的操作逐步进行,最终结果与第 19 行大相径庭,原因在于前者相当于后者中间过程补 0 后的结果。
例5:队列间的流操作3
数组下标失配是数组间进行流操作时常见的错误,当数组声明时下标为 [16] 时,等价于 [0:15] 而非 [15:0]。使用流操作将声明时下标为 [15:0] 的数组的流结果赋值给声明时下标为 [16] 的数组将会造成元素倒序。
把声明形式为 bit [7:0] array1 [15:0] 的非合并数组使用流操作赋值给声明形式为 bit [7:0] [15:0] array3,数值的顺序将会被打乱,对于合并的字节数组,正确的声明形式应该是 bit [15:0] [7:0] array4。
例6:结构体的流操作
书中 P43 例2.44。
第 11 行结构体类型变量 st 用小端模式存储到字节队列 bytes 中。
第 14 行将字节队列 bytes 中的数据解析到结构体变量 dest 中。
领取专属 10元无门槛券
私享最新 技术干货