SystemVerilog学习笔记(一):数据类型
在systemverilog中,主要包含以下数据类型:
- 4值类型
- 2值类型
- 数组
- 字符串
- 结构体和联合体
- 枚举
- 自定义类型
- 无符号数:无符号数的符号不使用任何标志,即无符号数只能存储正数。无符号二进制数的范围从 0 到
((2^n) - 1)
,n 表示位数。 - 有符号数:通过有符号数中的符号标志来区分正值和负值。有符号位的零有两种可能表示形式(正 (0) 和负 (1))。有符号二进制数的范围从
-2^(n-1)
到2^(n-1)-1
,n表示位数。有符号二进制数在计算机系统中,一般用补码来表示。
4 值数据类型
序号 | 数据类型 | 2值/4值 | 位 | 有符号/无符号 |
---|---|---|---|---|
1. | reg | 4 | >=1 | unsigned |
2. | wire | 4 | >=1 | unsigned |
3. | logic | 4 | >=1 | unsigned |
4. | integer | 4 | 32 | signed |
5. | time | 4 | 64 | unsigned |
6. | real | 4 | 64 | unsigned |
状态 | 描述 |
---|---|
0 | 状态 0 |
1 | 状态 1 |
x or X | 未知状态 (与 reg 有关) |
z or Z | 高阻态 (与 wire 有关) |
- reg 变量用于对锁存器、触发器和存储器等存储元件进行建模,它存储一个值并用于程序赋值。 reg 的默认值为 x。
- wire 是一种 Verilog 数据类型,用于连接元件以及连接由单个门或连续分配驱动的网络。导线的默认值为 z。
- Logic 类型是 4 值类型,可以取值 0、1、x 和 z。Logic 类型,可以用来代替 wire 和 reg,因为 wire 数据类型没有多个 driver。默认情况下 Logic 类型是无符号的,其初始值为 x。z。Logic 类型可以在过程块和连续赋值语句中驱动。
- 整数是 4 态数据类型,整数可以是 0,1,x 和 z,表示 32 位有符号数。整数的默认值为 x。整数可以保存范围从 -2^31 到 (2^31)-1 的值。
- time 是用于模拟时间测量的特殊数据类型。它是 4 值类型,表示 64 位无符号整数,可以与 $time 系统函数结合使用来保存当前的仿真时间。
- real 是以 64 位实数实现的实数数据类型。实数可以用十进制记数法 (4.43) 或科学记数法 (42e8) 指定。 real 数据类型的默认值为 0。
2 值数据类型
序号 | 数据类型 | 2值/4值 | 位 | 有符号/无符号 |
---|---|---|---|---|
1. | bit | 2 | >=1 | unsigned |
2. | byte | 2 | 8 | signed |
3. | shortint | 2 | 16 | signed |
4. | int | 2 | 32 | signed |
5. | longint | 2 | 64 | signed |
- bit 可以是 0 或 1,代表单个位。bit 数据类型的默认值为 0。
- byte 可以是 0 或 1,表示 8 位有符号整数。byte 的默认值为0。
- shortint 可以是 0 或 1,表示 16 位有符号整数。 shortint 的默认值为 0。
- int 可以是 0 或 1,表示 32 位有符号整数。 int 的默认值是 0。
- longint 可以是 0 或 1,表示 64 位有符号整数。 longint 的默认值为 0。
数据类型转换
转换意味着将一种数据类型转换为另一种数据类型。 转换有两种类型:
- 静态转换
- 动态转换
静态转换 : 转换发生在编译时,不会出现任何运行时错误。静态转换仅适用于固定数据类型。它不适用于面向对象的编程概念。
语法 :data_type'(variable or expression or value);
动态转换 : 转换发生在运行时。如果转换无效,则会报告错误。动态转换用于将分配的值转换为通常无效的变量。 $cast 是系统方法。 $cast 可以是函数或任务。
语法 :$cast(destination_variable, source_expression_or_variable);
枚举 enum
枚举数据类型定义一组命名值。
- 除非指定为其他类型,否则枚举类型存储为“int”类型。
- 此类型会自动为列表中的每个名称赋予唯一值。
- 值默认为“int”类型,从 0 开始,然后递增 1。
- 如果没有为名称指定值,它将获取列表中前一个名称的值并加 1。
语法 :
enum enum_base_type(optional) {
<enum_name_declaration> = constant_expr(optional)...
}<enum_type_identifier>;
枚举函数:
序号 | 函数 | 描述 |
---|---|---|
1 | first() | 返回枚举的第一个成员的值 |
2 | last() | 返回枚举最后一个成员的值 |
3 | next() | 返回枚举的下一个成员的值 |
4 | prev() | 返回枚举中前一个成员的值 |
5 | num() | 返回给定枚举中的元素数量 |
6 | name() | 返回给定枚举值的字符串表示形式 |
typedef 枚举数据类型
在 typedef 中可以给出类型名称,以便可以在许多地方使用相同的类型。
语法 :
typedef enum enum_base_type(optional) {
<enum_name_declaration> = constant_expr(optional)...
} <enum_type_identifier>;
String
字符串类型是可变长度的有序字符集合。字符串的长度是集合中字符的数量。
- 字符串的内存空间是动态分配的。
- 字符串变量的索引应从 0 到 N–1(其中 N 是字符串的长度)进行编号,以便索引 0 是字符串的第一个(最左边)字符,索引 N–1 是最后一个(最右边)字符字符串的。
- 未初始化或空字符串用特殊值 "" 表示。空字符串的长度为 0。
操作 | 操作符 | 描述 |
---|---|---|
等于 | str1==str2 | 如果两个字符串相等则返回 1,否则返回 0 |
不等 | str1!=str2 | 如果两个字符串不相等则返回 1,如果相等则返回 0 |
比较 | str1 < str2, str1 <= str2, str1 > str2, str1 >= str2 | 如果相应条件为 true,则返回 1;如果为 false,则返回 0 |
级联 | {str1, str2, …, strN} | 所有字符串将连接成一个结果字符串 |
复制 | {N{str}} | 将字符串复制 N 次 |
索引 | str[index] | 返回一个字节,即给定索引处的 ASCII 代码。如果给定索引超出范围,则返回 0 |
函数 | 描述 |
---|---|
str.len() | 返回字符串的长度。 |
str.putc() | 修改字符串的一个字符 |
str.getc() | 返回一个字符。 |
str.tolower() | 返回字符串的小写字母。 |
str.toupper() | 返回字符串的大写字母。 |
str.compare(s) | 以 ascii 值形式返回字符串比较结果。 |
str.icompare(s) | 以 ascii 值的形式返回不区分大小写的字符串比较结果。 |
str.substr(i,j) | 返回主字符串的子字符串。 |