task
- task는 simulation time제어 관련 구문 사용 가능(#,@,posedge etc) 이때는 합성 불가.
- return이 없음
- procedural statement, initial구문처럼 순차적으로 실행됨.
- 내부에 task, function 호출 가능
선언 방법
task task1 (input logic x, output int y);
...
endtask
task task2;
input logic x;
output int y;
...
endtask
static, automatic task
- module, interface, program, package에 정의된 task는 static
- class 내에 선언된 task는 항상 automatic
- static: 같은 task가 반복될 때 변수가 공유됨
- automatic: task가 실행될 때 독립적으로 할당
static task
module tb_top;
initial begin
display(); #1;
display(); #1;
display(); #1;
display(); #1;
$finish;
end
task display(); // static
integer i = 0;
i = i + 1;
$display("i = %d", i);
endtask
endmodule
결과
i = 1
i = 2
i = 3
i = 4
automatic task
module tb_top;
initial begin
display(); #1;
display(); #1;
display(); #1;
display(); #1;
$finish;
end
task automatic display(); // automatic
integer i = 0;
i = i + 1;
$display("i = %d", i);
endtask
endmodule
결과
i = 1
i = 1
i = 1
i = 1
function
- 둘 이상의 output을 가질 수 없음
- time 제어 불가능
- 내부에 function만 호출 가능
- 조합회로 모델링에 사용 가능(합성 가능)
function 선언
function type(반환타입) name(변수이름) 으로 구성됨
function logic [15:0] myfunc1(int x, int y);
...
endfunction
function logic [15:0] myfunc2;
input int x;
input int y;
...
endfunction
static, automatic functions
- module, interface, program, package에 선언된 function은 static
- static function의 모든 변수는 해당 function의 모든 call에서 공유
- class에서 선언된 function은 항상 automatic
- automatic에서 ahems 변수는 function call 시에 dynamic하게 생성
static function
module tb_static;
initial begin
$display("i = %d", display_static()); #1;
$display("i = %d", display_static()); #1;
$display("i = %d", display_static()); #1;
$display("i = %d", display_static()); #1;
$finish;
end
function integer display_static();
static integer i = 0; // static은 function이 처음 호출될 때만 0으로 초기화
i = i + 1;
display_static = i;
endfunction
endmodule
결과
i = 1
i = 2
i = 3
i = 4
automatic function
module tb_automatic;
initial begin
$display("i = %d", display_automatic()); #1;
$display("i = %d", display_automatic()); #1;
$display("i = %d", display_automatic()); #1;
$display("i = %d", display_automatic()); #1;
$finish;
end
function automatic integer display_automatic();
integer i = 0; // automatic 변수는 각 호출마다 초기화
i = i + 1;
display_automatic = i;
endfunction
endmodule
결과
i = 1
i = 1
i = 1
i = 1