본문 바로가기
HW Design/1. Verilog HDL Basic

[Function and Task] 2. Task

by 한PU 2024. 1. 16.
728x90
반응형
  • reusable한 작은 코드 섹션을 작성할 때 사용
  • time consuming constructs 사용 가능.
    • wait
    • posedge
    • delays (#)
  • blocking, non-blocking 할당 모두 사용 가능.
  • 입출력의 개수 제한이 없음.
    • 함수는 single value만 반환 가능
  • 설계에서 여러 번 반복되는 간단한 코드 구현 작업에 가장 적합.
    • SPI, I2C 등
      • 인터페이스에서 핀을 구동 하는것.
  • 모듈에서 task 호출이 가능한 코드 작성
    • 전역 변수에 엑세스 가능.
  • 전역 task를 만들 수도 있음.
    • 모듈 외부에 task 코드 작성.
// inline IO 스타일
task <name> (<IO_list>);
    begin
        // code here
    end
endtask

// inbody IO 스타일
task <name>;
    <IO_list>
    begin
        // code here
    end
endtask
  • <\name>
    • 필수로 지정해야 함.
  • 로컬 변수 선언, 사용 가능.
  • 전역 변수 엑세스 가능.
  • task내에서 다른 task 호출 가능. 함수도 호출 가능.

Verilog Task Example

  • pulse 생성 task 작성
    • 시간단위 선언
    • 글로벌 reg 타입 신호로 펄스를 생성.
      • 출력을 선언할 필요 X
// 전역 변수 선언
reg pulse;

// inline task
task pulse_generate(input time pulse_time);
    begin
        pulse = 1'b1;
        #pulse_time pulse = 1'b0;
    end
endtask

// in body task
task pulse_generate;
    input time pulse_time;
    begin
        pulse = 1'b1;
        #pulse_time pulse = 1'b0;
    end
endtask
  • delay 연산자 사용 가능
  • 반환값 X
    • 대신 입력, 전역 변수로 엑세스 가능한 모든 신호에 값을 할당.

Calling a Task in Verilog

  • task 호출
    • 함수와 같은 방식으로 표현식의 일부로 사용 X
    • 코드 블록을 설계에 포함시키는 shortcut 이라고 생각해야 함.
      • 선언 순서대로 parameters 전달.
generate_pulse(pulse_time);
  • pulse_lengh input은 pulse_time 변수에 매핑.
  • 펄스 출력은 pulse_out 변수에 매핑.

Automatic Tasks in Verilog

  • 2001 Standard에만 사용 가능.
  • 동적 메모리 할당.
task increment(input integer incr);
    integer i = 1;
    i = i + incr;
    $display("Result of increment = %0d", i);
endtask

initial begin
    increment(1);
    increment(2);
    increment(3);
end
  • 결과 출력

    Result of increment = 2
    Result of increment = 4
    Result of increment = 7
  • 로컬 변수 i의 값은 정적이며, 단일 메모리 위치에 저장.

    • i의 값은 영구적.
    • task 호출시에도 그 값을 유지.
      • task를 호출할 때마다 이미 저장된 값을 증가시킴. (i가 계속 쌓임.)
task automatic increment (input integer incr);
    integer i = 1;
    i = i + incr;
    $display("Result of increment = %0d", i);
endtask

initial begin
    increment(1);
    increment(2);
    increment(3);
end
  • 결과 출력

    Result of increment = 2
    Result of increment = 3
    Result of increment = 4
  • i 값 고정 X

    • 동적 할당될 때 마다 1로 선언.
    • 작업 실행이 완료되면 동적 할당 메모리가 해제되고 로컬 변수가 더이상 존재 X
728x90
반응형