반응형
task와 function은 코드 반복을 줄이기 위해서 verilog, systemverilog에서 사용되는 keyword 들 입니다.
동일한 동작이 많은 프로젝트에서는 task, function을 사용하면 코드가 간결해집니다
두가지 keyword의 차이점에 대해서 알아보겠습니다.
1. Task
Task는 정의된 모듈안에서 언제든치 호출이 가능한 서브루틴 keyword 입니다.
Task가 정의되어 있지 않은 파일에서 Task를 호출 할 수도 있습니다.
사용하는 방법은 module 선언하는 것과 같이 task와 endtask로 감싸서 사용합니다.
특징은 아래와 같습니다
- 시간 지연과 관련된 기능들을 포함 시킬 수 있다.(ex. # delay, posedge clk, negedge clk 등)
- input, output 관련 port가 존재 가능하다
- local variable 선언이 가능하며, global variable 사용도 가능하다
- 내부에 task 및 function이 포함 가능하다
- 명령문으로 호출이 가능하며, 표현식 내부에서는 사용이 불가능하다
- 시간지연 기능을 사용하지 않을 경우에만 합성이 가능함
실제로 사용은 아래와 같이 사용합니다
module task_calling (adc_a, adc_b, adc_a_conv, adc_b_conv);
input [7:0] adc_a, adc_b;
output [7:0] adc_a_conv, adc_b_conv;
reg [7:0] adc_a_conv, adc_b_conv;
task convert;
input [7:0] adc_in;
output [7:0] out;
begin //systemverilog에서는 begin end 필요없음
out = (9/5) *( adc_in + 32)
end
endtask
always @ (adc_a)
begin
convert (adc_a, adc_a_conv);
end
always @ (adc_b)
begin
convert (adc_b, adc_b_conv);
end
endmodule
2. Function
Function은 Task와 비슷하지만 약간의 차이가 있습니다.
사용하는 방법은 module 선언하는 것과 같이 function와 endfunction로 감싸서 사용합니다.
아래와 같은 특징을 가지고 있습니다.
- 둘 이상의 output을 가질 수 없습니다(입력은 여러개 가능, 반드시 1개의 output 포함)
- 시간 지연과 관련된 keyword를 포함 할 수 없습니다.
- 내부에 function만 호출이 가능합니다
- local variable 선언이 가능하며, global variable 사용도 가능하다
- 조합회로 모델링에 사용이 가능하다(합성가능)
module function_calling(a, b, c, d, e, f);
input a, b, c, d, e ;
output f;
wire f;
function myfunction;
input a, b, c, d;
begin //systemverilog에서는 begin end 필요없음
myfunction = ((a+b) + (c-d));
end
endfunction
assign f = (myfunction (a,b,c,d)) ? e :0;
endmodule
3. Systemverilog에서의 차이
verilog에서 systemverilog로 넘어오면서 몇가지 부분이 바뀌었다고 하는데 정리를 해봅니다
- begin ~ end 없이 사용가능
- void 함수 추가
- void 함수로 return 값 없이 사용 가능
- array나 queue같은 메모리를 task나 function의 입력으로 전달 가능
- pass by reference 사용 가능
- task의 입력은 default로 logic type
'language > Verilog' 카테고리의 다른 글
[verilog] generate 사용하기 (0) | 2021.01.31 |
---|---|
[systemverilog] automatic keyword (0) | 2021.01.31 |
[verilog] $signed casting logic count (0) | 2021.01.26 |
[verilog] $signed casting 사용 (0) | 2021.01.26 |
[verilog] hardware realtime DCT (0) | 2021.01.26 |
댓글