目录
1. 数据类型
1.1 四状态数据类型
包含0、1、Z(高阻态)、X(未初始化,缺省值)四种状态;
Note:四状态变量驱动二状态变量时,Z和X状态转换成0状态。
logic [3:0] a; //无符号逻辑型变量,不可有多个驱动,不可在双向总线中使用;
integer a; //32比特有符号整数型变量;
time t; //64比特无符号整数型变量;
reg [3:0] a; //存储型无符号变量,时序逻辑中综合成寄存器,sv中比较少用;
wire [3:0] a; //线网型无符号变量,相当于物理连线,双向总线中使用;
1.2 二状态数据类型
只有0、1两种状态,缺省值为0;
bit [3:0] a; //无符号比特变量;
int a; //32比特有符号整数型变量,也可定义成无符号如int unsigned a;
byte a; //8比特有符号整数型变量;
shortint s; //16比特有符号整数型变量;
longint l; //64比特有符号整数型变量;
real r; //64比特双精度浮点有符号实数型变量,驱动整数型变量时会截断小数部分;
2. 数组定义与初始化
2.1 定宽数组定义及初始化
int array[0:15]; or int array[16]; //定义一个包含16个整形元素的一维数组;
int array[0:15] [0:3]; or int array[16] [4]; //定义一个16行4列的二维数组;
//定义时初始化
int array[2] = '{0, 0};
int array[2] = '{2{0}};
int array[2][3] = '{{0, 0, 0}, '{1, 1, 1}};
//使用for,forreach初始化
int array[2][3];
for (int i=0; i<2; i++)
for (int j=0; j<3; j++)
array[i][j] = 1;
foreach (array[i, j])
array[i][j] = 1;
2.3 动态数组
int array[]; //一维动态数组;
int array[][]; //二维动态数组;
//动态数组赋值前需要分配元素数量
array = new[5]; //为动态数组分配5个元素, 0~4;
array[2] = 1;
2.4 关联数组
数组元素下标非连续,稀疏分布,节省存储空间;
Note: 1. 越界访问数组返回值为数据类型的缺省值;
2. 未写入数据时关联数组和动态数组的大小为0;
int assoc[int]; //第一个int为数组存储的数据类型,第二个int为数组索引的数据类型,两者
类型可以不同。
//关联数组初始化
assoc = '{10:2, 15:3, 20:4}; //键值对初始化,下标10的元素为2,以此类推;
3. 队列定义与操作
//队列定义
int queue[$]; //队列元素编号从0~$
//队列操作
queue[$] = {0, 1, 2}; //队列赋值
queue.insert(2, 3); //下标为2的地方插入3,queue:0,1,3,2;
queue.delete(3); //删掉下标为3 的元素,queue:0,1,3;
queue.push_front(5); //在队列前面插入5,queue:5,0,1,3;
queue.push_back(6); //在队列后面插入6,queue:5,0,1,3,6;
i = queue.pop_front; //提取队列前面的元素,i = 5;queue:0,1,3,6;
i = queue.pop_back; //提取队列后面的元素,i = 6;queue:0,1,3;
queue[$:1]; //queue[0:1];
queue[1:$]; //queue[1:2];
queue={}; //删除队列;
4. 枚举类型定义与操作
//枚举类型定义
typedef enum {FIRST, SECOND, THIRD} fsmtype_e; //缺省数据类型为int
fsmtype_e state = FIRST; //初始化
state = state.last; //赋值
5. 字符串类型定义与操作
string str = “Hello”; //字符串定义,单个字符是byte类型,str[0]对应的是“H”字符。
str.len(); //字符串str的长度为5,若为空则返回0;
str.putc(int i, string s); //将str中的第i个字符替换成s中的第一个字符;
//str.putc(j, x)在语义上等价于str[j] = x。
str.getc(i); //返回str中的第 i 个字符的 ASCII 码值;
str.toupper(); //返回一个将str中的字符转换成大写形式字符串,不改变str;
str.tolower(); //返回一个将str中的字符转换成小写形式字符串,不改变str;
str.substr(i,j); //返回str中字节位置i到位j之间的字符串;
//如果 i<0 or j<i or j >=str.len(),那么substr返回空字符串。
str.atoi(); //返回将str中字符串按照ASCII码字符转换成的十进制数;
str.atohex(); //返回将str中字符串按照ASCII码字符转换成的十六进制数;
str.atooct(); //返回将str中字符串按照ASCII码字符转换成的八进制数;
str.atobin(); //返回将str中字符串按照ASCII码字符转换成的二进制数;
6. 创建新类型结构(typedef、struct)
typedef int unsigned uint_t; //uint_t为32比特无符号整型变量;
typedef int array[5] array_int5_t; // array_int5_t为一维5元素的数组类型;
typedef struct {
int a;
byte b;
bit [3:0] c;} struct_s; // struct_s为自定义的结构体类型;
struct_s st = ‘{
32’d1,
8’hcc,
4’b0001}; //结构体类型初始化
st.a = 32’d4;
7. 数组系统函数
$size(array, array_dimension); //可适用于定宽数组,动态数组,关联数组和队列;
//返回指定维度的元素总个数,返回数据类型为integer,默认array_dimension为1;
//$dimensions, $left, $right, $low, $high, $increment用到不多,此处不提;
.size() //返回数组元素的个数,适用于动态数组,队列和链表;
array.size();
.delete() //适用于动态数组,关联数组和队列;
dynamic_array.delete(); //清空动态数组,产生一个0元素的数组;
queue.delete(N); //删除下标为N的元素,若不加下标则删除整个队列;
.exists() //仅适用于关联数组,判断关联数组中是否存在指定索引元素;
i = assoc.exists(10); //关联数组存在索引元素10,返回值为1;
.name() //仅适用于枚举型变量
state.name(); //判断枚举变量当前枚举值,有的话返回1;
.num() //适用于关联数组,枚举型变量;
assoc.num(); //返回关联数组中元素的数量,若为空则返回0;
state.num(); //返回枚举成员的数量;
.first() //适用于关联数组和枚举类型;
assoc.first(index); //返回关联数组assoc的第一个索引值到index,如果数组为空则返回0;
state.first(); //返回枚举类型的第一个枚举值;
.next() //适用于关联数组和枚举类型;
assoc.next(index); //如果关联数组存在下一条目,返回下一个索引值到index,否则返回0;
state.next(); //返回枚举类型当前状态的下一个枚举值,如果没有则返回0;
.prev() //适用于关联数组和枚举类型;
assoc.prev(index); //如果关联数组存在上一条目,返回上一个索引值到index,否则返回0;
state.prev(); //返回枚举类型当前状态的前一个枚举值,如果没有则返回0;
.last() //适用于关联数组和枚举类型;
assoc.last(index); //返回关联数组最后一个索引值到index;
state.last(); //返回枚举类型最后一个枚举值;
8. 数组缩减处理函数
array.sum(); //返回所有数组元素的和;
array.product(); //返回所有数组元素的积;
array.and(); //返回所有数组元素的位与的结果;
array.or(); //返回所有数组元素的位或的结果;
array.xor(); //返回所有数组元素的位异或的结果;
9. 数组排序函数
//适用于数组和队列类型
array.reverse(); //反转数组中元素的顺序;
array.sort(); //升序排列数组中元素;
array.rsort(); //降序排列数组中元素;
array.shuffle() //随机化数组中元素的顺序
10. 数组定位符函数
//为除关联数组外的所有数组返回一个int队列;
//对关联数组返回一个与联合数组索引类型具有相同类型的队列;
.find(); //返回满足指定表达式的所有元素, 需与with连用;
.find_index(); //返回满足指定表达式的所有元素的索引,需与with连用;
.find_first(); // 返回满足指定表达式的第一个元素,需与with连用;
.find_first_index(); //返回满足指定表达式的第一个元素的索引,需与with连用;
.find_last(); //返回满足指定表达式的最后一个元素,需与with连用;
.find_last_index(); //返回满足指定表达式的最后一个元素的索引,需与with连用;
.min(); //返回数组元素最小值;
.max(); //返回数组元素最大值;
.unique(); //返回数组元素唯一值;
.unique_index(); //返回数组元素唯一值的索引;
string SA[10] qs[$];
int IA[*], qi[$];
//找到大于 5 的所有元素
qi = IA.find(x) with (x>5);
// 找到等于 3 的所有元素的索引
qi = IA.find_index with (item == 3);
// 找到等于 Bob 的第一个元素
qs = SA.find_first with (item == "Bob");
// 找到等于 Henry 的最后一个元素
qs = SA.find_last(y) with (y == "Henry");
// 找到大于 Z 的最后一个元素的索引
qi = SA.find_last_index(s) with (s > "Z");
// 找到最小的元素
qi = IA.min();
// 找到具有最大数值的字符串
qs = SA.max() with (item.atoi);
// 找到所有的唯一字符串元素
qs = SA.unique();
// 找到以小写字母表示的所有唯一字符串
qs = SA.unique(s) with (s.tolower);
11. 数据类型转化赋值
11.1 显示转换
需要操作符或者系统函数的介入;
b = int'(a); //静态转换;
c = unsigned'(a); //静态转换;
$cast(tgt,src); //动态转换,将src转换成tgt的数据类型并赋值给tgt;
//作为任务调用$cast时,如果赋值无效则运行报错并且目的变量保持不变;
//作为函数调用$cast时,如果赋值成功返回1,否则返回0,运行不会报错并且目的变量保持不变;
11.2 隐式转换
直接赋值,无需特别的操作符;
1. 四值逻辑的 x或z 赋值给二值逻辑时会变为0;
2. 无符号高位宽变量赋值给低位宽变量时,取低位;