[Verilog 문법] 4.2 함수와 태스크 (Function vs Task)

YUN·2026년 1월 23일

디지털 회로 설계

목록 보기
15/20

함수/태스크

반복 코드를 재사용 가능한 단위로 묶는 것

함수 (Function)

(1) 문법

function [반환크기] 함수명;
    input [크기] 입력1;
    input [크기] 입력2;
    // 지역 변수 선언 가능
    reg [크기] 지역변수;
    
    begin
        // 로직
        함수명 = 결과값;  // 함수명에 할당 = 반환
    end
endfunction

함수는 값 반환이 가능하고, 함수명에 할당하면 그 값이 반환된다.

(2) 예시

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된 비트 중 가장 하위 비트의 번호를 반환한다.

(3) 재귀 함수

일반 함수는 정적 변수(공유되어 사용되는 변수)를 사용해서 재귀 호출 시 문제가 생긴다.

재귀 함수 생성시에는 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)

(1) 문법

task 태스크명;
    input  [크기] 입력1;
    output [크기] 출력1;
    inout  [크기] 양방향1;
    
    begin
        #10;             // 지연 가능
        @(posedge clk);  // 이벤트 대기 가능
    end
endtask

앞서 배운 함수와 다르게 반환값 전달이 불가능하다.

그러나 출력으로 데이터를 내보낼 수 있다.

또한 함수와 다르게 시간 지연, 이벤트 대기가 가능하다는 차이가 있다.

Function 과 Task의 비교

  • Function 특징

    • 반드시 값을 반환해야 함
    • 조합 논리로 합성됨
    • 시간 제어 불가 (# @ wait 사용 불가)
    • task 호출 불가
    • 다른 function 호출 가능
    • 용도: CRC, 인코딩, 변환 등 순수 계산
  • Task 특징

    • 반환값 없음, output 파라미터 사용
    • 여러 output 가능
    • 시간 제어 가능 (# @ wait)
    • 다른 task와 function 모두 호출 가능
    • 합성이 제한적임
    • 용도: 테스트벤치, 시뮬레이션 시퀀스

Function/Task 선택 가이드

  • Function을 선택하는 경우

    • 순수 계산이 필요할 때
    • 합성이 필요할 때
    • 재귀가 필요하면 automatic 추가
  • Task를 선택하는 경우

    • 시간 지연이 필요할 때
    • 여러 출력이 필요할 때
    • 테스트 시퀀스를 작성할 때
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글