数据类型概述:
-
Integer
有四状态和双状态整数型。
四状态 双状态 logic;reg;wire;integer;time shortint;int;longint;byte;bit -
String
可保存长度可变的字符串,单个字符是byte类型。常用字符串方法
-
event
event evt;/*声明evt事件*/ -> evt;/*触发evt*/ @(evt)/*捕获evt触发*/
-
Typedef
用户自定义类型
-
Enumerations
enum {RED,BLUE,GREEN} color;/*包含常量名称列表以及一个或多个变量*/ /*常用函数*/ enum_e.first,last,next,next(N),prev,prev(N) /*通常用do...while遍历*/ do ... while (enmu_e!=enum_e.first)
-
定宽数组
/*操作数组常用for和foreach*/ for (int i=0;i<$size(array);i++) /*$size函数可以返回数组宽度*/ foreach (array[i,j]) /*注意索引方式*/ foreach (array[i]) foreach (array[,j]) /*可以独立遍历维度*/ bit a[5] = '{1,2,3,4,5};/*赋值方式*/ /*两个数组可以直接进行相等比较*/ /*合并数组的声明*/ bit[3:0][7:0] bytes;/*4个字节组装成32比特*/
-
动态数组
int dyn[],d2[];/*声明动态数组*/ dyn=new[5];/*分配5个元素*/ d2=dyn;/*复制动态数组*/ dyn=new[20](dyn)/*分配20个整数值并复制原先的5个元素到相应位置*/ dyn=new[40]/*分配40个新的整数值,舍弃原先的20个元素*/ dyn.delete()/*删除所有元素*/
-
队列
结合链表与数组,可以随地增删元素,可以索引访问。利用[$]进行声明。
q[$]={3,4};/*声明队列*/ int j=1; q.insert(1,j);/*第一个元素后插入j*/ q.delete(1);/*删除第一个元素*/ q=q[0:$-1];/*删掉末尾元素,$表示最大最小的索引,依位置而定*/ q.push_front(6);/*开头插入6*/ q={6,q}; j=q.pop_back;/*末尾值赋予j*/ q.push_back(8);/*末尾插入8*/ q.delete();/*删除整个队列*/ q={};
-
关联数组
可以方便得存储稀疏矩阵的元素,只为实际写入的元素分配空间。保存关联数组时,同时保存其索引。利用索引获取元素,索引不一定是数值,可以是字符串。有点类似Python里的字典。
bit [63:0] assoc[bit[63:0]],idx=1;/*声明关联数组assoc,索引为bit*/ repeat (64) begin assoc[idx] = idx; idx = idx << 1;/*为数组中1,2,4,...等索引位置赋值*/ end /*可以使用foreach遍历数组*/ foreach(assoc[i]) $display("assoc[%h]=%h",i,assoc[i]); /*找到并删除第一个元素*/ assoc.first(idx); assoc.delete(idx);
-
数组的方法
/*缩减方法*/ array.sum() array.product,and,or,xor /*随机取一个元素*/ $urandom_range($size(array)-1) /*数组定位方法,这种方式返回的是一个队列,而非标量*/ array.min,max,unique /*数组搜索*/ array.find with(item>3) array.find(x) with(x>3)/*也可以自定义参数*/ array.find_first with (item==4) array.find_first_index with (item==8) /*数组的排序,会改变原有数组*/ array.reverse,sort,rsort,shuffle
-
结构与联合
与C语言类似,结构是数据的集合,数据存放在不同位置;联合中的数据共用一个位置,互相覆盖。
-
类型转换
a. 静态转换
reala=real'(intb)
b. 动态转换 $cast(a,b);将b赋值给a,成功则返回1,否则返回0
c. 流操作符 « »
/*把其后的数据打包成比特流,<<为从右到左,>>从左到右*/ bit [7:0] j[4]='{8'ha,8'hb,8'hc,8'hd}; >>{j} /*0a0b0c0d*/ <<{j} /*b030d050*/ >>{byte{j}} /*0a,0b,0c,0d 可以拆分赋给新的数组*/
-
选择数据类型
a. 灵活性(数据形式)
b. 存储器用量(数据量)
c. 速度(数组操作是否频繁)
d. 排序(一次性存入还是多次存入)
e. 选择最优的数据结构