조건부 프로그래밍 구조
Verilog에서 절차 블록이 제공하는 보다 강력한 기능 중 하나는 if-else 결정, case 문 및 루프와 같은 조건부 프로그래밍 구성을 사용하는 기능입니다. 이러한 구성은 절차 블록 내에서만 사용할 수 있으며 조합 논리와 순차 논리를 모두 모델링하는 데 사용할 수 있습니다.
if-else 문
if-else 문은 부울 조건을 기반으로 조건부 신호를 할당하는 방법을 제공합니다. 문의 if 부분 다음에 TRUE로 평가되면 그 뒤에 나열된 신호 할당이 수행되도록 하는 부울 조건이 옵니다. 부울 조건이 FALSE로 평가되면 else 부분 뒤에 나열된 명령문이 실행됩니다. 여러 명령문이 if 또는 else 부분에서 실행되어야 하는 경우 명령문 그룹 키워드 begin/end를 사용해야 합니다. 하나의 명령문만 실행해야 하는 경우 명령문 그룹 키워드가 필요하지 않습니다. 문의 else 부분은 필요하지 않으며 생략하면 부울 조건이 FALSE로 평가될 때 할당이 수행되지 않습니다. if-else 문의 구문은 다음과 같습니다.
if (<boolean_condition>)
true_statement
else
false_statement
여러 true/false 문이 있는 if-else 문의 구문은 다음과 같습니다.
if (<boolean_condition>)
begin
true_statement_1
true_statement_2
end
else
begin
false_statement_1
false_statement_2
end
둘 이상의 부울 조건이 필요한 경우 이전 if 문의 else 절 내에 추가 if-else 문을 포함할 수 있습니다. 다음은 두 개의 부울 조건을 구현하는 if-else 문의 예를 보여줍니다.
if (<boolean_condition_1>)
true_statement_1
else if (<boolean_condition_2>)
true_statement_2
else
false_statement
if-else 문을 사용하여 조합 논리 회로의 동작을 설명하는 방법을 살펴보겠습니다.
조합 논리 회로는 출력이 입력의 순시 값에 의존하는 회로임을 상기하십시오. 이 동작은 회로에 대한 모든 입력을 always 블록의 감지 목록에 배치하고 블로킹 할당을 사용하여 모델링할 수 있습니다.
이 접근 방식을 사용하면 신호감지 목록의 입력이 변경되면 블로킹이 트리거되고 할당이 즉시 수행됩니다.
다음은 절차적 always 블록 내에서 if-else 문을 사용하여 3입력 조합 논리 회로를 모델링하는 방법을 보여줍니다.
case 문
케이스 문은 부울 조건을 기반으로 신호 할당을 모델링하는 또 다른 기술입니다.
if-else 문과 마찬가지로 case 문은 절차 블록 내에서만 사용할 수 있습니다. 명령문은 case 키워드로 시작하고 그 뒤에 괄호로 묶인 할당의 기반이 되는 입력 신호 이름이 옵니다. case 문은 괄호 안에 신호를 연결하여 여러 입력 신호 이름을 기반으로 할 수 있습니다. 그런 다음 해당 할당이 뒤따르는 일련의 입력 코드가 나열됩니다. 키워드 default는 명시적으로 나열되지 않은 입력 코드에 대해 원하는 신호 할당을 제공하는 데 사용할 수 있습니다. 여러 입력 조건에 동일한 지정문이 있는 경우 공간을 절약하기 위해 동일한 줄에 쉼표로 구분하여 나열할 수 있습니다. endcase 키워드는 case 문의 끝을 나타내는 데 사용됩니다. 다음은 case 문의 구문입니다.
case (<input_name>)
input_val_1 : statement_1
input_val_2 : statement_2
:
input_val_n : statement_n
default : default_statement
endcase
다음은 절차 블록 내에서 case 문을 사용하여 3입력 조합 논리 회로를 모델링하는 방법을 보여줍니다. 이 예에서 입력은 스칼라이므로 입력 값이 3비트 벡터로 나열될 수 있도록 연결해야 합니다.
이 예에서는 세 가지 버전의 모델이 제공됩니다. 첫 번째는 모든 이진 입력 코드를 명시적으로 나열합니다. 이 접근 방식은 진리표 형식을 반영하기 때문에 더 읽기 쉽습니다. 두 번째 접근 방식은 하나의 출력에 해당하는 입력 코드만 나열하고 기본 절을 사용하여 다른 모든 입력 코드를 처리합니다. 세 번째 접근 방식은 쉼표로 구분된 계열을 사용하여 같은 줄에 동일한 할당을 가진 여러 입력 코드를 나열하는 방법을 보여줍니다.
if-else 문은 case 문 안에 포함될 수 있고 반대로 case 문은 if-else 문 안에 포함될 수 있습니다.
casez 및 casex 문
Verilog는 입력 조건에서 don't care를 지원하는 두 개의 추가 case 문을 제공합니다. casez 문은 기호 ? 및 Z는 상관 없음을 나타냅니다. casex 문은 X를 don't care로 해석하여 casez 문을 확장합니다. 입력 코드에 don't care를 사용하면 의도하지 않은 로직이 생기기 쉽기 때문에 casez와 casex 문을 사용할 때 주의가 필요하다.
forever 루프
Verilog 내의 루프는 반복 할당을 무한히 수행하는 메커니즘을 제공합니다. 이것은 클록 또는 기타 주기적 신호와 같은 자극을 생성하기 위한 테스트 벤치에서 유용합니다. 우리는 이미 always 블록 형태의 반복 구조를 다루었습니다. 항상 블록은 시작 조건이 있는 루프를 제공합니다. Verilog는 보다 정교한 동작을 모델링하기 위해 추가 루핑 구조를 제공합니다.
모든 루핑 구문은 절차 블록과 함께 있어야 합니다.
가장 간단한 루프 구성은 forever 루프입니다. 다른 조건부 프로그래밍 구성과 마찬가지로 여러 문이 forever 루프와 연결된 경우 문 그룹으로 묶어야 합니다. 하나의 명령문만 사용하는 경우 명령문 그룹이 필요하지 않습니다. 초기 블록 내의 forever 루프는 신호감지 루프가 없는 항상 루프와 동일한 동작을 제공합니다. forever 루프 내에서 시간 단계 이벤트 또는 지연을 제공하는 것이 중요합니다. 그렇지 않으면 시뮬레이션이 중단됩니다. 다음은 Verilog의 영원히 루프 구문입니다.
forever
begin
statement_1
statement_2
:
statement_n
end
10ns 단위의 주기로 클록 신호(CLK)를 생성하는 forever 루프의 다음 예를 고려하십시오. 이 예에서 forever 루프는 초기 블록 내에 포함됩니다. 이것은 시뮬레이션 시작 시 CLK의 초기 값이 0으로 설정되도록 합니다. forever 루프에 들어가면 무기한 실행됩니다. forever 키워드 뒤에 문이 하나만 있기 때문에 문 그룹(즉, 시작/종료)이 필요하지 않습니다.
initial
begin
CLK = 0;
forever
#10 CLK = ~CLK;
end
while 루프
while 루프는 실행을 제어하는 부울 조건이 있는 루프 구조를 제공합니다. 루프는 부울 조건이 true로 평가되는 동안에만 실행됩니다. 다음은 Verilog while 루프의 구문입니다.
while (<boolean_condition>)
begin
statement_1
statement_2
:
statement_n
end
EN = 1인 동안 10ns 단위의 주기로 클록 신호(CLK)를 생성하는 루프의 이전 예를 구현해 보겠습니다. while 루프의 TRUE 부울 조건은 EN = 1입니다. EN = 0일 때 while 루프를 건너뜁니다. 루프가 비활성화되면 CLK는 마지막으로 할당된 값을 유지합니다.
initial
begin
CLK = 0;
while (EN == 1)
#10 CLK = ~CLK;
end
repeat 반복
repeat 루프는 고정된 횟수만큼 실행되는 루핑 구조를 제공합니다. 다음은 Verilog 반복 루프의 구문입니다.
repeat (<number_of_loops>)
begin
statement_1
statement_2
:
statement_n
end
10ns 단위의 주기로 클록 신호(CLK)를 생성하는 루프의 이전 예제를 구현해 보겠습니다. 단, 이번에는 반복 루프를 사용하여 10개의 클록 전환 또는 5개의 전체 CLK 주기만 생성할 것입니다.
initial
begin
CLK = 0;
repeat (10)
#10 CLK = ~CLK;
end
for 루프
for 루프는 내부 변수를 자동으로 업데이트할 수 있는 루프를 생성하는 기능을 제공합니다. for 루프 내의 루프 변수는 단계 할당에 따라 루프를 통해 매번 변경됩니다. 루프 변수의 시작 값은 초기 할당을 사용하여 제공됩니다. 루프 변수와 연결된 부울 조건이 TRUE인 한 루프가 실행됩니다. 다음은 Verilog for 루프의 구문입니다.
for (<initial_assignment>; <Boolean_condition>; <step_assignment>)
begin
statement_1
statement_2
:
statement_n
end
다음은 루프 변수를 이용하여 간단한 카운터를 생성하는 예이다. 루프 변수 i는 이 블록 이전에 정수로 선언되었습니다. 신호 Count도 정수 유형입니다. 루프 변수는 0에서 시작하여 루프를 통과할 때마다 1씩 증가합니다. 루프는 i < 15 또는 총 16배 동안 실행됩니다. For 루프를 사용하면 블록 내에서 신호 할당에 루프 변수를 사용할 수 있습니다.
initial
begin
for (i=0; i<15; i=i+1)
#10 Count = i;
end
disable
Verilog는 키워드 disable을 사용하여 루프를 중지하는 기능을 제공합니다. 비활성화 기능은 명명된 명령문 그룹에서만 작동합니다. 비활성화 기능은 일반적으로 특정 고정 시간 후 또는 제어 신호에 의해 트리거되는 if-else 또는 case 문과 같은 조건부 구성 내에서 사용됩니다.
클록 신호(CLK)를 생성하지만 인에이블(EN)이 어설션된 경우에만 발생하는 다음의 무한 루프 예를 고려하십시오. EN = 0일 때 루프가 비활성화되고 시뮬레이션이 종료됩니다.
initial
begin
CLK = 0;
forever
begin: loop_ex
if (EN == 1)
#10 CLK = ~CLK;
else
disable loop_ex; // The group name to be disabled comes after the keyword
end
end
'프로그래밍 언어 > Verilog' 카테고리의 다른 글
[Verilog 학습] Test Benches (0) | 2022.04.03 |
---|---|
[Verilog 학습] System Tasks (0) | 2022.04.02 |
[Verilog 학습] 순차 기능 모델링 – 절차적 할당 2 (0) | 2022.03.31 |
[Verilog 학습] 순차 기능 모델링 – 절차적 할당 1 (0) | 2022.03.30 |
[Verilog 학습] 구조 설계 및 계층구조 (0) | 2022.03.29 |