공부 기록/회로설계

[Verilog] 베릴로그 function vs task

tomatt0 2024. 8. 5. 23:39
반응형

이번 포스팅에서는 베릴로그에서 functiontask에 대해 정리해보았다.

Function과 task는 반복되는 코드를 줄이기 위해 베릴로그에서 제공하는 기능이다.

비슷한 듯 하지만, function과 task에는 차이가 있으니 이에 유의하여 살펴보자.


0. Overview

베릴로그에서 function/task는 사용하고자 하는 모듈 내 혹은 별도의 파일에 정의할 수 있다. 

별도의 파일에 함수를 define하는 경우, 해당 파일을 `include 구문을 통해 포함시켜야한다.

Function Task
최소 1개 이상의 input 존재함 input 제약없음
output/inout 없음 output/inout 제약없음
return 값 존재함 output port를 통해 값 전달 가능함
다른 function만 호출 가능함 (task 호출 불가능) 다른 function과 task 호출 가능함
delay, wait 등 타이밍 제어가 불가능함 타이밍 제어가 가능함
zero 시뮬레이션 시간 non-zero 시뮬레이션 시간
recursive 가능
대부분 합성 가능함 합성 가능 or 불가능

1. Functions

함수의 가장 큰 특징은, 함수 이름에 특정값을 반환시킨다는 점이다.

함수의 return value는 single bit, multi bit, intger 등 모두 사용 가능하고, 이는 함수 정의 시 함수이름 앞에 명시하여야한다.

 

이외에도 베릴로그 함수는 아래와 같은 규칙을 따른다.

  • Input의 개수에는 제한이 없지만, 오직 하나의 output만을 return한다.
  • 최소 하나 이상의 input을 가진다.
  • inout/output argument를 가질 수 없다.
  • 다른 function을 호출할 수 있지만, task는 호출할 수 없다.
  • 타이밍 제어 혹은 delay 이벤트를 포함할 수 없다.

 

아래 add4_f 함수는 두 개의 4-bit input (A, B)과 carry bit (cin)을 더하는 함수이다.

베릴로그 function은 함수 이름으로 값을 반환하기 때문에, 계산 결과인 sum이 함수의 반환값으로 할당된다.

function [4:0] add4_f (
    input [3:0] A, B,
    input	cin);
	
    reg [4:0] sum;
    reg	cout;
    integer	i;
    begin
    	for (i = 0; i <= 3; i = i + 1) begin
        	cout = A[i] & B[i] | A[i] & cin | B[i] & cin;
            sum[i] = A[i] ^ B[i] ^ cin;
            cin = cout;
        end
        sum[4] = cout;
        add4 = sum;	// return value
    end
endfunction

 

 


2. Tasks 

베릴로그 task는 아래와 같은 규칙을 따른다.

  • Delay, event 등 타이밍 제어가 가능하다. => 타이밍 제어가 없는 경우에만 합성 가능
  • Input/output/inout argument에 제약이 없다.
  • 별도의 값을 반환하지 않지만, output 혹은 inout argument에 값을 전달할 수 있다.
  • Non-zero 시뮬레이션 시간에 수행될 수 있다.
  • 다른 function과 task 모두 호출할 수 있다.

 

아래 add4_t task는 앞서 나왔던 add4_f 함수와 동일한 기능을 하도록 task를 짠 것 이다.

두 개의 4-bit input (A, B)과 carry bit (cin)을 더하는 task이고, 함수와 다르게 sum과 cout을 따로따로 output argument를 통해 확인할 수 있다.

task add4_t;
    input [3:0] A;
    input [3:0] B;
    input cin;
    output [3:0] sum;
    output cout;
    
    reg C;
    integer i;
    
    begin
    	C = cin;
        for (i = 0; i <= 4; i = i + 1) begin
        	sum[i] = A[i] ^ B[i] ^ C;
            C = (A[i] & B[i]) | (A[i] & C) | (B[i] & C);
        end
        cout = C;
    end
endtask

 


3. SystemVerilog 의 function 과 task

시스템 베릴로그는 대체로 검증에 사용되기 때문에 베릴로그에서 지원하는 function과 task에서 아래와 같이 일부 추가적인 기능을 지원한다. 일종의 확장판 느낌..?

  • begin/end 구문 없이 사용 가능하다.
  • void 함수 추가 (return 값 없음)
  • return 구문을 통해 task 종료가 가능하다.
  • array를 input argument로 전달 가능하다.

 


 

반응형