함수 | 태스크 |
다른 함수 사용 O | |
다른 태스크 사용 X | 다른 태스크 사용 O |
항상 시뮬레이션 시간 0에서 실행 | non-zero 시뮬레이션 시간에서 실행 가능 |
지연, 사건, 타이밍 제어 포함 불가능 | 지연, 사건, 타이밍 제어 포함 가능 |
하나 이상의 input | input, output, inout을 하나도 가지지 않거나 여러개를 가질 수 있음 |
항상 하나의 값을 되돌린다. | 값을 되돌릴 수 업지만 output을 통해 여러 개의 값을 전달 가능 |
지역 변수, 레지스터 등을 가질 수 있지만 wire는 가질 수 없다. | |
always, initial문을 포함하지 않으며 always, initial문 혹은 다른 태스크, 함수로부터 호출됨 | |
행위 수준 문장만 포함해야 한다. |
- 태스크(task)
task ~ endtask 키워드로 선언한다.
프로시저에 지연, 타이밍, 사건 제어 구조가 있거나 출력 인수를 여러 개 혹은 하나도 갖지 않는 경우, 입력 인수를 가지지 않는 경우 태스크를 사용해야 한다.
다음과 같이 선언하고 호출한다.
module testmodule (input clk, input A, output reg q);
always @(posedge clk)
begin
test(A, q); //선언과 같은 순서로 지정해야 함
end
task test; //혹은 task test(input A, output q);
input A;
output q;
begin
//동작
end
endtask
endmodule
- 함수(function)
function ~ endfunction 키워드를 사용해 선언한다.
프로시저에 지연, 타이밍, 사건 제어 구조가 없고, 논블록킹 할당이 없어야 한다.
적어도 하나 이상의 입력 인자가 있어야 하며, 하나의 값을 리턴해야 한다.
함수를 선언할 때, 함수의 이름과 같은 레지스터가 묵시적으로 선언되어야 한다. 이 레지스터가 출력값을 가지는 레지스터가 된다. 따로 지정하지 않는다면 1비트의 부호 없는 레지스터 타입이다.
module parity;
//
reg [31:0] addr;
reg parity;
always @(addr)
parity = calc_parity(addr);
function calc_parity; //function calc_parity(input [31:0] address);
input [31:0] address;
begin
calc_parity = ^address;
end
endfunction
//
endmodule
출력값이 여러 비트의 레지스터 타입이라면 function [ 비트폭 ] < 함수 이름 > 과 같이 선언한다.
부호있는 값이라면 function signed [ 비트폭 ] < 함수 이름 > 과 같이 선언한다.
- automatic 키워드
일반적으로 함수와 태스크는 static하다. 따라서 태스크가 동시적으로 수행되는 경우 모든 사용이 공유된다.
즉, 코드상 다른 두 곳에서 함수나 태스크가 동시에 호출된다면, static한 태스크 변수로 연산이 수행되기 때문에 잘못된 결과를 얻을 수 있다.
이런 문제를 해결하기 위해 automatic 키워드를 사용한다. 이 키워드를 사용하면 태스크와 함수의 모든 선언이 동적으로 할당되어, 각각이 별개의 독립적인 공간에서 수행되게 된다.
이는 태스크와 함수를 재귀적으로 수행되게 하기 위해 사용될 수 있다.
function automatic ~
task automatic ~
위와 같이 선언할 수 있다.
module top;
//
function automatic integer factorial;
input [31:0] oper;
integer i;
begin
if (oper >= 2)
factorial = factorial(oper - 1) * oper;
else
factorial = 1;
end
endfunction
integer result;
initial
begin
result = factorial(4);
end
//
endmodule
'EE > Verilog' 카테고리의 다른 글
[Verilog] 베릴로그 관련 자잘한 거 정리 (0) | 2023.02.15 |
---|---|
[Verilog] F/F 코드 (0) | 2023.02.13 |
비바도 공부 자료 추천 (0) | 2023.02.02 |
[Verilog] 베릴로그에서의 엔디안 (0) | 2023.02.01 |
[Verilog] 중첩된 블록, 명명된 블록, disable (0) | 2023.01.17 |