Verilog HDL 구문 학습(1) - 함수(function)와 작업(task)의 사용
7460 단어 function
(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는 값을 되돌려주지 않습니다.
전반적으로 말하면, 나는 확실히 이해하지 못했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백 함수를 Angular 하위 구성 요소에 전달이 예제는 구성 요소에 함수를 전달하는 것과 관련하여 최근에 직면한 문제를 다룰 것입니다. 국가 목록을 제공하는 콤보 상자 또는 테이블 구성 요소. 지금까지 모든 것이 구성 요소 자체에 캡슐화되었으며 백엔드에 대한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.