subroutines

김기찬·2024년 7월 2일

Hardware study

목록 보기
3/4

task

  • task는 simulation time제어 관련 구문 사용 가능(#,@,posedge etc) 이때는 합성 불가.
  • return이 없음
  • procedural statement, initial구문처럼 순차적으로 실행됨.
  • 내부에 task, function 호출 가능

선언 방법

task task1 (input logic x, output int y);
...
endtask

task task2;
	input logic x;
    output int y;
    ...
endtask

static, automatic task

  • module, interface, program, package에 정의된 task는 static
  • class 내에 선언된 task는 항상 automatic
  • static: 같은 task가 반복될 때 변수가 공유됨
  • automatic: task가 실행될 때 독립적으로 할당

static task

module tb_top;

  initial begin
    display();  #1;
    display();  #1;
    display();  #1;
    display();  #1;
    $finish;
  end

  task display();    // static 
    integer i = 0;
    i = i + 1;
    $display("i = %d", i);
  endtask
endmodule

결과 
i = 1 
i = 2
i = 3
i = 4

automatic task

module tb_top;

  initial begin
    display();  #1;
    display();  #1;
    display();  #1;
    display();  #1;
    $finish;
  end

  task automatic display();    // automatic 
    integer i = 0;
    i = i + 1;
    $display("i = %d", i);
  endtask
endmodule

결과
i = 1
i = 1
i = 1
i = 1

function

  • 둘 이상의 output을 가질 수 없음
  • time 제어 불가능
  • 내부에 function만 호출 가능
  • 조합회로 모델링에 사용 가능(합성 가능)

function 선언

function type(반환타입) name(변수이름) 으로 구성됨

function logic [15:0] myfunc1(int x, int y);
    ...
endfunction

function logic [15:0] myfunc2;
    input int x;
    input int y;
    ...
endfunction

static, automatic functions

  • module, interface, program, package에 선언된 function은 static
  • static function의 모든 변수는 해당 function의 모든 call에서 공유
  • class에서 선언된 function은 항상 automatic
  • automatic에서 ahems 변수는 function call 시에 dynamic하게 생성

static function

module tb_static;

  initial begin
    $display("i = %d", display_static()); #1;
    $display("i = %d", display_static()); #1;
    $display("i = %d", display_static()); #1;
    $display("i = %d", display_static()); #1;
    $finish;
  end

  function integer display_static();
    static integer i = 0;  // static은 function이 처음 호출될 때만 0으로 초기화
    i = i + 1;
    display_static = i;
  endfunction
endmodule
 
결과
i = 1
i = 2
i = 3
i = 4

automatic function

module tb_automatic;

  initial begin
    $display("i = %d", display_automatic()); #1;
    $display("i = %d", display_automatic()); #1;
    $display("i = %d", display_automatic()); #1;
    $display("i = %d", display_automatic()); #1;
    $finish;
  end

  function automatic integer display_automatic();
    integer i = 0;  // automatic 변수는 각 호출마다 초기화
    i = i + 1;
    display_automatic = i;
  endfunction
endmodule

결과 
i = 1
i = 1
i = 1
i = 1
profile
SoC개발자

0개의 댓글