SystemVerilog - Function

2023-06-26
SystemVerilog

function主要可以輸入參數經作運算之後return一個值,function不能消耗simulation的時間
所以function裡面不能使用任何time controlled的陳述 ,如 @, #, fork, wait 等等
function也不能啟動一個task,因為task可以消耗simulation的時間

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
module tb();

// int result;
int inputa;
int inputb;
int res;

function int sum1(int a, int b);
return a+b;
endfunction

function int sum2(int a, int b);
sum2=a+b;
endfunction

function sum3(int a, int b);
sum3=a+b;
endfunction

function int sum4;
input int a, b;
// output sum4; // Error (suppressible): .\function1.sv(21): (vlog-2388) 'sum4' already declared in this scope (sum4) at .\function1.sv(19).
sum4=a+b;
endfunction

function int sum5(input int a, b, output int res);
res = a+b+1;
return a + b;
endfunction

initial begin
inputa=3;
inputb=3;
// result = sum1(inputa, inputb);
$display("sum1:%0d", sum1(inputa, inputb));
$display("sum2:%0d", sum2(inputa, inputb));
$display("sum3:%0d", sum3(inputa, inputb)); // output is 0
$display("sum4:%0d", sum4(inputa, inputb));

$display("sum5:%0d", sum5(inputa, inputb, res));
$display("res:%0d", res);

$display("inputa:%0d", inputa);
$display("inputb:%0d", inputb);
end
endmodule

Output:

1
2
3
4
5
6
7
8
9
10
# run 1000
# sum1:6
# sum2:6
# sum3:0
# sum4:6
# sum5:6
# res:7
# inputa:3
# inputb:3
# quit -f

call by value & call by reference

如果是用call by value的話,在function裡面改變變數的值,不會改變原本變數的值
如果是用call by reference的話,在function裡面改變變數的值,會改變原本變數的值

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module tb();

int result;
int inputa;
int inputb;

// function int sum(int a, ref int b);
// ** Error (suppressible): .\function2.sv(9): (vlog-2244) Variable 'sumab' is implicitly static. You must either explicitly declare it as static or automatic or remove the initialization in the declaration of variable.
function automatic int sum(int a, ref int b);
int sumab = a+b;
a = a+1;
b = b+1;
return sumab;
endfunction

initial begin
inputa=3;
inputb=3;
result = sum(inputa, inputb);
$display("result:%0d", result);
$display("inputa:%0d", inputa);
$display("inputb:%0d", inputb);
end
endmodule

Output:

1
2
3
4
5
# run 1000
# result:6
# inputa:3
# inputb:4
# quit -f

sum輸入的參數a是 call by value, b是call by reference,a和b都在function裡面都有+1,但只有b的值有改變。
如果輸入的參數有call by reference的話,function的return value前面要加automatic,不過這個我還不知道為什麼,以後再研究。