Verilog HDL 구문 학습(1) - 함수(function)와 작업(task)의 사용

7460 단어 function
Verilog 언어의 모든 프로세스 모듈은 다음 4중 구조에 속하는 설명문에서 따릅니다.
(1): initial 설명문;
(2): always 설명문;
(3):task 설명문;
(4): function 설명 문장;
모든 initial과always 설명문은 모의 시작과 동시에 즉시 실행됩니다. 
  

  
    
1   initial
2
3      begin
4
5       areg = 0 ;                 //
6  
7        for (index = 0 ;index < size;index = index + 1 ' b1)
8  
9         momory[index] = 0 ;         // memory
10  
11      end
12  

이 예에서 initial 문장으로 모방할 때 각 변수를 초기화합니다. 이 초기화 과정은 어떤 모방 시간도 필요하지 않습니다. 즉, 0ns 시간 안에 메모리의 초기화 작업을 완성할 수 있습니다.

  
    
1 always
2 wait (count_enable) # 20 count = count + 1 ' b1;

always 문장은 우리가 잘 알고 있는 대기 신호 값의 변화나 시간 촉발을 제외하고 @ 과 뒤에 있는 민감한 신호 목록을 사용해서 표시합니다.Verilog는 또 다른 형식으로 표시된 전평 민감 시차 제어를 허용합니다. 즉, 뒤에 있는 문장과 문장 블록이 기다려야 하는 어떤 조건이 진실이어야 실행할 수 있습니다.Verilog 언어는 키워드wait로 대기 전평이 민감한 조건을 진짜로 표시하는데, 위의 예는count_enable 신호가 1이면 다음 문장이 실행됩니다.
작업, 함수의 정의와 호출은 모두module 내부에 포함되어 있다. 그들은 일반적으로 행위급 모델링에 사용되며, Testbench를 작성할 때 많이 사용되고, 종합적인 코드를 쓸 때 적게 사용된다.
function 정의:
function<반환값 유형 및 비트 너비><함수 이름>
<포털 참조 및 유형 선언>
<로컬 변수 선언>
행위 문장;
  endfunction
function을 정의할 때 다음 사항에 유의하십시오.
(1): function 정의 구조는 임의의 프로세스 블록(always 블록이나 initial 블록)의 내부에 나타날 수 없습니다.
(2): function 정의는 어떤 시간 제어 문장, 즉 #, @ 또는wait로 표시된 문장을 포함할 수 없습니다.
(3): function을 정의할 때 최소한 하나의 입력 참량이 있어야 한다.
(4): function을 정의할 때 function 내부에서 함수를 은밀하게 하나의 레지스터 변수로 명성을 떨치고 함수체에 이 레지스터 변수에 함수의 결과 값을 부여하여 function을 호출할 때 되돌아오는 함수 값을 얻을 수 있도록 해야 한다.지정한 반환 값의 폭이 없으면,function은 기본적으로 1비트 바이너리를 반환합니다.
function 호출:
<함수 이름>(<입력 표현식 1>,..., <입력 표현식 n>);
입력 표현식은 함수 정의 구조의 각 입력 포트와 일일이 대응하며, 이러한 입력 표현식의 배열 순서는 함수 정의 구조에서 각 입력 포트의 배열 순서와 일치해야 한다.
function의 호출은 프로세스 블록에 나타날 수도 있고 assign 연속 값 부여 문장에 나타날 수도 있다.또한function 정의에서 설명한 모든 국부 변수 레지스터는 정적입니다. 즉function의 국부 레지스터는 function의 여러 호출 사이에서 그들의 값을 유지합니다.
 
작업 (task) 은 일반 프로그래밍 언어의 프로세스 (과정) 와 유사하며, 설명된 서로 다른 위치에서 공통된 코드를 실행할 수 있습니다.일반적으로 공통적으로 사용해야 하는 코드 세그먼트를task로 정의하고task 호출을 통해 사용합니다.task에서 다른task와function도 호출할 수 있습니다.
task의 정의
task<퀘스트 이름>;
포트와 유형 설명;
변수 설명;
문장 1;
    ...
문장 n;
  endtask
task를 정의할 때 다음 사항을 주의해야 합니다.
(1): 작업 정의 구조는 어떤 프로세스 블록에도 나타날 수 없습니다.
(2): 하나의task는 입력/출력 포트가 없을 수도 있고 당연히 있을 수도 있다.
(3): 하나의task는 반환 값이 없을 수도 있고 출력 포트나 양방향 포트를 통해 하나 이상의 값을 반환할 수도 있다.
(4): 작업 매개 변수를 제외하고task는 작업을 설명하는 모듈에 정의된 모든 변수를 인용할 수 있습니다.
task 호출:
task 호출 문장은 전송된 작업의 매개 변수 값과 수신 결과의 변수 값을 제공합니다.
<작업 이름>(포트 1, 포트 2,..., 포트 n);
task를 호출할 때 몇 가지를 주의해야 합니다.
(1):task 호출은 과정적인 문장이기 때문에always 프로세스 블록과 initial 프로세스 블록에만 나타날 수 있으며,task를 호출하는 입력과 출력 매개 변수는 레지스터 형식이어야 한다.
(2): task 호출 문장의 목록은 작업이 정의되었을 때의 입력, 출력, 양방향 포트 매개 변수 설명의 순서와 일치해야 합니다.
(3): task를 호출할 때 매개 변수는 값에 따라 전달해야 하며 주소에 따라 전달할 수 없습니다(다른 언어와 다름).
(4): 하나의task에서 이전 호출 모듈의 모든 레지스터에 직접 접근할 수 있습니다.
(5): 순환 중단 제어 문장disable을 사용하여 작업 실행을 중단할 수 있습니다.task가 중단된 후에 프로그램 프로세스는task 호출을 호출하는 곳으로 돌아가 계속 아래로 실행됩니다.
 
task와 function의 차이점:
(1): function은 주 모듈과 하나의 모의 시간 단위만 사용할 수 있고task는 자신의 모의 시간 단위를 정의할 수 있다.
(2): function은 작업을 호출할 수 없고task는 함수를 호출할 수 있습니다.
(3): function은 최소한 입력 변수가 필요하지만task는 임의의 유형의 변수가 없거나 많을 수 있습니다.
(4): function은 값을 되돌려주고task는 값을 되돌려주지 않습니다.
 
 
전반적으로 말하면, 나는 확실히 이해하지 못했다.

좋은 웹페이지 즐겨찾기