sv11

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的维数

 

猜你喜欢

转载自www.cnblogs.com/superany/p/12215260.html