ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Verilog][기초문법] task, function
    개발/Verilog 2022. 1. 9. 02:24

    함수와 태스크를 이용해 반복적인 루틴작업을 모듈화 할 수 있다.

     

    두개의 차이점을 표로 나타내면 다음과 같다

    function task
    function ... endfunction

    시뮬레이션 시간이 0이다.

    딜레이, 타이밍 제어 등의 구문들은 사용할 수 없다.

    하나의 값을 리턴한다

    내부에서 function은 호출되지만, task는 호출할 수 없다.
    task ... endtask

    시뮬레이션 시간은 0 될 수 있다.

    딜레이, 타이밍 요소가 포함될 수 있다.

    리턴값은 없지만, 여러개의 output 포트로 출력을 보낼 수 있다.

    내부에 다른 task, function을 호출할 수 있다.

    둘의 가장 큰 차이점은 바로 타이밍제어 요소가 포함되는지 여부이다.

     

    function은 @(), #(delay) 등의 문장을 넣을 수 없다.

    반면 task는 가능하다. 따라서 task 가 function의 상위호환으로 볼 수 있다.

     

     

    1. task

    태스크는 task , endtask 키워드로 선언한다

    task [automatic] identifier (port list);
    begin
    	...
    end
    endtask
    
    
    // example
    task bit_operation ();
    beging
        input [15:0] a, b;
        output [15:0] and_ab, or_ab, xor_ab;
        
        begin
        	#10;
        	and_ab = a & b;
            or_ab = a | b;
            xor_ab = a ^| b;
        end
    end
    endtask
    
    
    // C style port declarartion
    task bit_operation (input [15:0] a, b, output [15:0] and_ab, or_ab, xor_ab);
    begin
        begin
        	#10;
        	and_ab = a & b;
            or_ab = a | b;
            xor_ab = a ^| b;
        end
    end
    endtask

    task 선언시 [] 안에 있는 키워드는 옵션이다.

     

    automactic 키워드를 넣으면 다이나믹 태스크가 된다. 키워드를 넣지 않으면 기본적으로 static으로 선언된다.

    port 선언하는 방법은 블럭 내부에 선언하는 것과 C 언어처럼 포트 부분에 선언을 하는것 2가지가 있다.

    어느것을 사용해도 무방하다.

     

    task 는 return 값이 없는 대신에, output 포트로 결과를 보내줄 수 있다.

    그리고 여러개의 output을 갖는게 가능하다.

    return 으로 값을 반환하진 못하지만 함수를 종료시키는건 가능하다.

     

     

     

    2. function

     

    함수는 function endfunction 키워드로 선언한다.

    // 함수 형식
    function [automatic] [signed | unsigned ] [range] identifier (port list);
    begin
    	...
    end
    function
    
    
    // example
    funciton automatic reg parity_check ();
    begin
        input [31:0] addr;
        
        // 리턴 방법 1
        parity_check = ^addr;
        
        // 리턴 방법 2
        return ^addr;
    end
    endtask
    
    
    // C style port declarartion
    // example
    funciton automatic reg parity_check (input [31:0] addr;);
    begin
        // 리턴 방법 1
        parity_check = ^addr;
        
        // 리턴 방법 2
        return ^addr;
    end
    endtask

    함수 선언시 리턴값이 음수가 있을땐 signed 키워드로 명시해줄 필요가 있다.

    키워드를 쓰지 않으면 기본적으로 unsigned 이다.

     

    함수는 return 키워드로 값을 반환하거나 함수 이름으로 반환 할 수 있다.

     

    task와 마찬가지로 C 언어 스타일로 입출력 리스트를 선언 할 수 있다.

     

     

     

Designed by Tistory.