이번 포스팅에서는 베릴로그에서 function과 task에 대해 정리해보았다.
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로 전달 가능하다.
'공부 기록 > 회로설계' 카테고리의 다른 글
반도체 칩 회로설계 Flow, front-end 부터 back-end 까지 (0) | 2024.10.29 |
---|---|
반도체 회로설계 헷갈리지만 중요한 개념, jitter, skew, slack, slew 란? (0) | 2024.07.31 |
Verilog에서 C code 사용이 가능한 Direct Programming Interface (DPI) 개념 및 사용법 (1) | 2023.06.01 |
하드웨어 검증 언어, System Verilog 란? - Testbench, DUT (0) | 2022.12.16 |
[Verilog] reg vs wire - reg와 wire의 차이점 (0) | 2022.05.05 |