function和task的区别,传参种类,ref类型,传参缺省值、传参方向。
1: 函数和任务的区别在于,任务可以带时序,函数不能。
函数和任务的传参可以在名字后的小括号里,也可以在函数和任务体内。传参是默认顺序,也可以使用.in(addr)这种形参方式。
函数和任务的参数缺省值为方向为input,类型为logic。建议不缺省。
一旦指定一个参数的方向,那它就成为后面参数的缺省方向。
参数方向可以为input、output、inout、ref(传递引用,传递句柄或指针),如果传参为const ref,这函数内部不会改变此参数。ref只能用在automatic的子程序。
传参默认值时,调用此函数时,可以缺少传参。否则,不能缺少传参。
void’( func1()); 忽略func1函数的返回值,仿真器不会告警。
module和program,package的函数和任务默认是静态的,可以使用automatic改为动态的。而在class中的函数和任务默认是动态automatic的。
b: class中有属性(property)和方法(method);他们的作用域分为3种:public,local和protected。(class中默认是automatic的)
1:默认都是public。
2:property声明为local类型的,则只在该class中的methods可以调用该变量。即使subclass也不可以调用。
3:property或者method声明为protected,与local类似,但是在subclass中可见。
c: funciton在执行到子程序的最后一行就返回,将返回值赋给与功能同名变量,也可以显式的调用return来返回。在function中不能再声明一个同名的var,会造成冲突。
task内部是不会返回值的,但是也可以调用return,但是不带返回值。
d: 数组变量到function的传递,通过ref模块或者直接数组变量(数据量会比较大).
e:verilog对子程序参数的处理是,在进入子程序时,将input和inout的值赋值给子程序本地变量,在子程序返回时将output和inout的值赋值给模块中的变量。
SV新增的系统函数
elaborate时的函数:
1)$typeof(data_type), 判断某个data或者expression的类型
bit [12:0] A_bus, B_bus;
parameter type bus_t = $typeof(A_bus);
generate
case ($typeof(bus_t))
$typeof(bit[12:0]): addfixed_int #(bus_t) (A_bus, B_bus);
$typeof(real): add_float #($typeof(A_bus)) (A_bus, B_bus);
endcase
endgenerate
关于array的:
1)$size(), 表示array的元素个数
2)$left()/$low(), 表示array的最小元素索引
3)$right()/$high(), 表示array的最大元素索引
4)$dimensions, 表示array的维数