# SV 之 Function

2022-09-14 21:30:55  阅读：85  来源： 互联网

### 一、简介

#, ##, @, fork..join, fork..join_any, wait, wait_order or expect.

``````function <automatic | static> <data_type_or_implicit_or_void>  function_name
function_body
endfunction``````

``````function logic [2:0] getStatus (int a, int b);
….
endfunction``````

``````function logic [2:0] getStatus (int a, int b);
….
endfunction``````

``````function logic [2:0] getStatus;
input int a;
input int b;
….
endfunction``````

``function logic [2:0] getParity (int a, int b, output logic [2:0] u, v);``

### 二 作为语句调用的函数

``````module mTask( );
function int func1 (inout int dataIO, input int addressIN );
endfunction
initial begin
address = 0; data = 9;
#1; \$display(\$stime,,, "CALL func1");
//function call as a statement
end
endmodule``````

Simulation log:

1 CALL func1

V C S S i m u l a t i o n R e p o r t

### 三、 使用 函数名 或“return”返回值

``````module mFunc( );
int newval;
function int func1 (inout int dataIO, input int addressIN );
//return value assigned to function name
//OR
//return value specified using 'return' statement
endfunction
initial begin
#1;
\$display(\$stime,,, "newval = %0d",newval);
end
endmodule``````

Simulation log:
1 newval = 20
V C S S i m u l a t i o n R e p o r t

### 四、static 和 automatic 函数

``````    module funcAuto;
integer result;
function automatic integer factorial (input [31:0]  operand);
if (operand > 1)
factorial = factorial (operand - 1) * operand;
else
factorial = 1;
endfunction: factorial
initial begin
for (int n = 0; n <= 7; n++) begin
result = factorial(n);
\$display("%0d factorial=%0d", n, result);
end
end
endmodule``````

Simulation log:
Before calling function : a=2 result=0
After calling function : a=2 result=70

### 五 通过值或引用传递参数到任务和函数

SystemVerilog 允许通过两种方式将参数传递给任务和函数：通过值或通过引用。参数可以按名称或位置绑定（就像模块实例化那样）。还可以为任务或函数参数提供默认值。

#### 通过引用传递

``function/task ( ref type argument);``

``````module top;
int a, result;
initial begin
a = \$urandom % 6;
\$display ("Before calling function : a=%0d result=%0d", a, result);
result = mult(a);
\$display ("After calling function : a=%0d result=%0d", a, result);
end
function int mult(ref int a);
a = a + 5;
return a * 10;
endfunction
endmodule``````

Simulation log:
Before calling function : a=2 result=0
After calling function : a=7 result=70

2. 关于本站的所有留言、评论、转载及引用，纯属内容发起人的个人观点，与本站观点和立场无关；
3. 关于本站的所有言论和文字，纯属内容发起人的个人观点，与本站观点和立场无关；
4. 本站文章均是网友提供，不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属；如您发现该文章侵犯了您的权益，可联系我们第一时间进行删除；
5. 本站为非盈利性的个人网站，所有内容不会用来进行牟利，也不会利用任何形式的广告来间接获益，纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。