内建数据类型
SystemVerilog 支持多种数据类型,分为两类:四状态和双状态。
四状态数据类型
- reg:用于存储值的变量,可以是 1-bit 或多个 bit 的宽度,支持四个状态(
0,1,X,Z)。 - wire:用于连接模块之间的信号,也支持四个状态。
- logic:与
reg类似 - integer:32 位有符号整数,默认值为
x。 - time:表示时间的变量,默认值为
X。
双状态数据类型
- bit:只有两种状态(
0或1),通常用于表示布尔值。 - int、byte、shortint、longint:无符号整数类型,范围根据位宽不同而不同。
- real:浮点数类型,默认值为
0。
有符号数与无符号数
可以使用 unsigned 来声明无符号数,例如:
1 | bit signed [7:0] signed_val; |
$isunknown 操作符
$isunknown 是一个非常有用的操作符,它检查表达式中是否有 X 或 Z 状态。如果表达式的某个位含有 X 或 Z,返回 1,否则返回 0。例如:
1 | if ($isunknown(signal)) begin |
数组操作
数组初始化与操作
在 SystemVerilog 中,数组的初始化、比较、复制和循环是常见的操作,可以使用 for 或 foreach 来遍历数组。
动态数组
动态数组可以使用 new[] 来分配空间,或者复制现有数组:
1 | int arr1[]; |
释放数组
使用 .delete() 来释放动态数组的空间:
1 | arr1.delete(); |
数组宽度
使用 $size 来返回数组的大小:
1 | int arr[10]; |
队列
队列是一个非常灵活的数据结构,支持动态变化的元素。以下是常用的队列操作:
- 声明队列:
q[$],$表示队列的最大或最小索引。 - 插入元素:使用
insert(idx, value)在指定位置插入元素(并非所有仿真器支持插入操作)。 - 删除元素:使用
delete(idx)删除指定位置的元素。 - 前端插入:使用
push_front(value)在队列前面插入元素,等价于q = {value, q}。 - 后端插入:使用
push_back(value)在队列末尾插入元素,等价于q = {q, value}。 - 从队列移除元素:使用
pop_front或pop_back,分别从队列的前端或后端移除元素。
队列的遍历也可以使用 for 或 foreach。
数组常用方法
数组类型提供了一些非常实用的方法,帮助进行数据处理:
arr.sum, 返回数组所有元素和arr.product, 返回数组所有元素积arr.and, 返回数组所有元素的与arr.or, 返回数组所有元素的或arr.xor, 返回数组所有元素的异或arr.min(), 返回数组中的最小值队列(注意:返回的是队列,而不是标量)arr.max(), 返回数组中的最大值队列(注意:返回的是队列,而不是标量)arr.unique(), 返回数组中具有唯一值的队列arr.find with (condition), 返回满足条件元素的队列arr.find_index with (condition), 返回满足条件元素下标的队列arr.find_first with (condition), 返回满足条件第一个元素的队列arr.find_first_index with (condition), 返回满足条件第一个元素下标的队列arr.find_last with (condition), 返回满足条件第最后一个元素的队列arr.find_last_index with (condition), 返回满足条件最后一个元素下标的队列arr.reverse(), 数组反向arr.sort(), 数组从小到大排序arr.rsort(), 数组从大到小排序arr.shuffle(), 数组打乱顺序- 其中
reverse和shuffle方法不能带with条件语句,它们的作用范围是整个数组
字符串
在 SystemVerilog 中,字符串操作非常直观,支持常见的字符串处理功能:
s.getc(N):返回字符串中第 N 位的字符。s.tolower():将字符串转换为小写字母。s.toupper():将字符串转换为大写字母。s.putc(N, C):将字符 C 写入字符串的第 N 位。s.substr(start, end):提取从start到end的子字符串。s.len():返回字符串的长度。
格式化输出
SystemVerilog 提供了 $psprintf() 方法来格式化字符串,可以直接传递给其他函数:
1 | string formatted_str = $psprintf("The value of x is %0d", x); |
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2024/10/19/Programming/SystemVerilog基础/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2024/10/19/Programming/SystemVerilog基础/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!