概述
0、Verilog中函數不能調用任務,SV中允許哈數調用任務,但只能是由fork……join_none語句生成的線程中。
Verilog中函數必須有一個函數名代表的返回值,並且返回值必須被使用,例如用到賦值語句。SV中增加了void 函數
1、一般情況下,不帶參數的子程序在定義或調用時不需要帶空括號()
2、相比於Verilog-1995,在子程序中去掉了begin……end, task/endtask、function/endfunction以及足夠定義子程序的邊界
3、具有C語言風格的子程序參數,如 task mytask (output logic [31:0] x, input logic y)
4、缺省的類型和方向是“logic 輸入”, 如task mytask(a,b,output bit [15:0] u,v); 參數a,b是1比特寬度的logic輸入,u和v是16比特寬度的bit類型輸出
5、具有高級的參數類型,參數的傳遞方式可以指定為引用而不是復制,這種ref參數類型允許將數組傳遞給子程序。如function void print_checksum(const ref bit [31:0] a[]).
向子程序傳遞數組時應該盡量使用ref以獲取最佳性能,否則數組會被復制到堆棧區,這樣的操作代價很高;ref參數的第二個好處是在執行並發線程時共享變量信息
6、可以給參數指定缺省值,如function void print_checksum(const ref bit [31:0] a[],input bit [31:0] low=1, input int high=-1)
7、可以采用名字進行參數傳遞。如 task many(input int a=1,b=2,c=3,d=4);調用時可以只指定c,如many(.c(5));
8、增加了return語句,使子程序的流程控制變得更加方便。
9、Verilog的子程序只能返回一個簡單值,例如比特、整數或是向量,在SV中可以采用引用ref來返回數組
10、增加了自動存儲automatic,防止多個地方調用同一個子程序時串用局部變量(使用共享的靜態存儲區),它會迫使仿真器使用堆棧區存儲局部變量。