SV中的task和function
SV中class的properties和methods默认都是public的,但是可以声明为local和protected。
⼀个properties声明为local类型的,则只在该class中的methods可以调⽤该变量。即使subclass也不可以调⽤。
local interger i;
⼀个properties或者methods声明为protected,与local类似,但是在subclass中可见。
extern protected virtual automatic task_name();
SV中的Task和Function不需要,必须加⼀个d来指明body,但是需要加⼊标识符。
task    muliple_line;
......
endtask :multiple_line
⼦功能模块(funciton)在执⾏到⼦程序的最后⼀⾏就返回,将返回值赋给与功能同名的变量,也可以显式的调⽤return来返回。
在function中不能再声明⼀个同名的var,会造成冲突。
task内部是不会返回值的,但是也可以调⽤return,但是不带返回值。program直接显⽰调⽤return。
数组变量到function的传递,通过ref模块或者直接数组变量(数据量会⽐较⼤)
SV中module和program,package的⼦程序默认是静态存储的,当需要动态存储时,仍然需要显式的⽤automatic显式指出。(class中默认是automatic的)
SV对task和function的参数声明做了优化,声明需要⽅向声明和类型声明;参数传递可以按port名称对应,也可以按顺序对应。
⼦程序中的参数缺省值是input logic或者与同⼀task/function前⼀个参数的类型相同。⼤⼩可以指定默认值或者参数传递时赋值。
verilog对⼦程序参数的处理是,在进⼊⼦程序时,将input和inout的值赋值给⼦程序本地变量,在⼦程序返回时将output和
inout的值赋值给模块中的变量。SV中增加了⼀种⽅式ref,指定为引⽤⽽不是复制。这种⽅式只能⽤在automatic的⼦程序中,这种参数的好处是在⼦程序中
修改变量对调⽤它的模块随时可见。
task  bus_read(input  logic [31:0] addr,  ref logic [31:0]data);                initial    fork
@(ant)  bus.addr =addr;                                                  thread2:  begin          //使⽤ref类型传递data,这样不需
@(able)  data = bus.data;                                                                @data;    //要等到bus_read进程结束,
.......                                                                                                                      $display; //thread2便可以看见data的变化
endtask:bus_read                                                                                                            end                                                                                                                                join
typeof array
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的维数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。