System Verilog数据类型及系统函数

目录

1. 数据类型

1.1 四状态数据类型

1.2 二状态数据类型

2. 数组定义与初始化

2.1 定宽数组定义及初始化

2.3 动态数组

2.4 关联数组

3. 队列定义与操作

4. 枚举类型定义与操作

5. 字符串类型定义与操作

6. 创建新类型结构(typedef、struct)

7. 数组系统函数

8. 数组缩减处理函数

9. 数组排序函数

10. 数组定位符函数

11. 数据类型转化赋值

11.1 显示转换             

11.2 隐式转换


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. 无符号高位宽变量赋值给低位宽变量时,取低位;

  • 31
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值