반복 코드를 재사용 가능한 단위로 묶는 것
function [반환크기] 함수명;
input [크기] 입력1;
input [크기] 입력2;
// 지역 변수 선언 가능
reg [크기] 지역변수;
begin
// 로직
함수명 = 결과값; // 함수명에 할당 = 반환
end
endfunction
함수는 값 반환이 가능하고, 함수명에 할당하면 그 값이 반환된다.
module max_finder (
input [7:0] a, b, c,
output [7:0] max_val
);
// 함수 정의
function [7:0] max2;
input [7:0] x, y;
begin
max2 = (x > y) ? x : y;
end
endfunction
// 함수 호출 (중첩 가능)
assign max_val = max2(max2(a, b), c);
endmodule
위의 예시는 a,b,c중 가장 큰 값을 반환하는 함수이다.
함수 호출은
함수명(인자)
로 수행한다.
function [2:0] priority_encode;
input [7:0] req;
integer i;
begin
priority_encode = 3'b000;
for (i = 7; i >= 0; i = i - 1) begin
if (req[i])
priority_encode = i[2:0];
end
end
endfunction
위의 예시는 우선 순위 인코더 함수이다.
set된 비트 중 가장 하위 비트의 번호를 반환한다.
일반 함수는 정적 변수(공유되어 사용되는 변수)를 사용해서 재귀 호출 시 문제가 생긴다.
재귀 함수 생성시에는 automation 키워드를 붙여주면, 호출마다 새로운 지연 변수가 생성되어,
해당 문제를 해결할 수 있다.
function automatic [31:0] factorial;
input [3:0] n;
begin
if (n <= 1)
factorial = 1;
else
factorial = n * factorial(n - 1);
end
endfunction
wire [31:0] fact5 = factorial(5); // 결과: 120
이는 Verilog로 구현한 factorial 재귀 함수의 예시이다.
task 태스크명;
input [크기] 입력1;
output [크기] 출력1;
inout [크기] 양방향1;
begin
#10; // 지연 가능
@(posedge clk); // 이벤트 대기 가능
end
endtask
앞서 배운 함수와 다르게 반환값 전달이 불가능하다.
그러나 출력으로 데이터를 내보낼 수 있다.
또한 함수와 다르게 시간 지연, 이벤트 대기가 가능하다는 차이가 있다.
Function 특징
Task 특징
Function을 선택하는 경우
Task를 선택하는 경우