首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

贰 | 数据类型8 —— 类型转换与流操作符的使用

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 中。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OO2BGnUbIBgaGzLsephtBe-A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券