一、数据类型
1、logic
logic类型只能有一个驱动。使用wire和reg的地方均可使用logic,但如双向总线等有多个驱动的地方,则不可使用logic。
2、二值逻辑
对于二值逻辑变量与DUT中的四值逻辑变量连接时,如果DUT中产生了X和Z,会被转换成双状态值。使用($isunknown)操作符,可以在表达式的任意位出现X或Z的时候返回1。用来检查未知值的传播。
3、定宽数组
多维数组的foreach循环,以两维数组为例:foreach(md[i,j])。
数组下标和位下标可以同时使用。
需要等待数组中的变化(@ event)时,必须使用合并数组。
4、动态数组
只要基本数据类型相同,定宽数组和动态数组之间就可以相互赋值,在元素数目相同的情况下,可以把动态数组的值复制到定宽数组。
5、队列
队列的常量初始化中,无需使用单引号。
对于一些非合并的数据类型(非连续存放),需要使用单引号进行标量初始化赋值;对于合并的数据类型(连续存放),不需要使用单引号进行标量初始化赋值
队列中的元素是连续存放的,队头或队尾存取数据非常方便,常用来作为FIFO。
6、数组的方法
1)缩减
sum,product,and,or,xor
对于定宽数组、动态数组、队列和关联数组,从其中随机取数可以使用$urandum_range($size(array)-1);特别地,队列和动态数组可以使用$urandum_range($array.size()-1)。
2)定位
min,max,unique
find:使用with来限定条件;还有find_index,find_first,find_first_index,find_last,find_last_index(返回索引的方法,返回值类型为int)
3)排序
改变了原始的数组,reverse,sort,rsort,shuffle,其中sort和rsort可以带with进行条件选择
7、结构
可以将结构定义为合并结构:typedef struct packed {bit[7:0] r,g,b;} pixel_p_s;
如果需要经常对整个结构体进行复制,那么,合并结构的效率会高一点;但是,对于合并结构中尺寸不规则的元素进行读写,需要移位和屏蔽操作,代价很高。
8、枚举
枚举默认值为从0开始递增的整数,默认类型为int。
可以指定枚举值,如:typedef enum {INIT, DECODE =2 , IDLE} fsmtype_e;
9、字符串
string用来保存长度可变的字符串,结尾不带标识符null
二、过程块和方法
1、函数和任务
参数的默认值和方向为logic输入。
允许不带ref进行数组参数的传递,这时数组会被复制到堆栈区,代价很大。
ref参数在任务里可以修改变量而且修改结果对调用它的函数随时可见。