内建数据类型
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 进行许可。转载请注明出处!