[Verilog] Task / Function
- task
다른 task나 function을 사용할 수 있음
non - zero 시뮬레이션 시간에 수행될 수 있음
지연, 사건 또는 타이밍 제어 문장을 포함할 수 있음 ( #, assign )
input, output 또는 inout을 하나도 가지지 않거나 다수를 가질 수 있음
값을 되돌릴 수 없지만 input과 output을 통해 여러 개의 값을 전달할 수 있음
#SV
static / automatic
module, interface, program, package에 정의된 task는 기본적으로 static
class 내에 선언된 task는 항상 automatic
ex)
tb_
initial begin
display(); #1;
display(); #1;
display(); #1;
end
task display();
integer i = 0;
i = i + 1;
$display("i=%d",i);
endtask
// static
i = 1;
i = 2;
i = 3;
// automatic
i = 1;
i = 1;
i = 1;
- function
다른 function을 사용할 수 있지만, 다른 task는 사용할 수 없음
항상 시뮬레이션 시간 0에 수행됨
어떤 지연, 사건 또는 타이밍 제어문장을 포함할 수 없음
적어도 하나 이상의 input 인수를 가져야만 함
항상 하나의 값을 되돌리지만 output 또는 inout 인수를 가질 수 없음
공통점
wire를 가질 수 없음
행위 수준 문장만 포함함
always 또는 initial 문장을 포함하는 것이 아니며 always 블록, initial 블록 또는 다른 task와 function으로부터 호출
- task
다음 조건 중 하나가 참이면 task를 사용해야 함
프로시저에 지연,타이밍 또는 사건 제어 구조가 존재함
프로시저가 출력 인수를 하나도 가지지 않거나 하나 이상을 가짐
프로시저가 입력 인수를 가지지 않음
task<name_of_task>;
<task_declaration> → 파라미터 선언, i/o 포트 선언, 변수(reg, time, integer) 선언, event 선언
<statements>
endtask
task 호출
task <name_of_task>;
<name_of_task>(<parameter_list>);
ex)
- function
다음 조건이 모두 참이면 함수를 허용함
프로시저에 지연, 타이밍 또는 사건 제어 구조가 없음
프로시저는 하나의 값을 되돌림
적어도 하나의 입력 인자가 있음
output 또는 input 인자가 없음
non-blocking 할당이 없음
function 선언 문장
function [<return_range_or_type>] <function_name>;
<function_declaration> → 파라미터 선언, input선언 (output, inout 선언 X), 변수 선언
<statements>
endfunction
function 호출
<function_name>(<arguments_list>);
result = calc_value(addr);
ex)