순차 기능 모델링
동시 시스템의 동작은 현재 값에만 의존하는 출력을 가지기 때문에 조합 논리에 적합했습니다. 이는 신호 할당을 지속적으로 수행하는 모델이 이 회로 동작의 정확한 모델을 제공한다는 것을 의미합니다.
순차 회로(예: D-플립플롭, 레지스터, 유한 상태 기계 및 카운터)를 살펴보기 시작하면 이러한 장치는 이벤트, 가장 자주는 클록 신호의 에지를 기반으로 출력만 업데이트합니다.
절차적 할당
Verilog는 이벤트를 기반으로 하는 신호 할당을 모델링하기 위해 절차적 할당을 사용합니다. 이벤트는 가장 일반적으로 신호의 전환입니다. 이는 클록 에지에서 할당을 트리거하여 D 플립플롭 및 유한 상태 머신과 같은 순차 논리 회로를 모델링하는 기능을 제공합니다. 절차적 할당은 가변 데이터 유형(예: reg, 정수, 실수 및 시간)만 구동할 수 있습니다. 따라서 저장 장치를 모델링하는 데 이상적입니다. 절차적 신호 할당은 나열된 순서대로 평가할 수 있습니다. 따라서 순차적 할당을 모델링할 수 있습니다.
절차 할당은 모델에 대한 입력이 변경될 때 신호 할당을 수행하여 조합 논리 회로를 모델링하는 데 사용할 수도 있습니다. 할당의 왼쪽이 절차 할당에서 와이어 유형이 될 수 없음에도 불구하고 최신 합성기는 적절하게 설계된 조합 논리 모델을 인식하고 올바른 회로 구현을 생성합니다. 절차 할당은 또한 if-else 결정, 케이스 문 및 루프와 같은 표준 프로그래밍 구성을 지원합니다. 이것은 Verilog에서 절차적 할당을 강력한 모델링 접근 방식으로 만들고 디지털 시스템을 설계하고 테스트 벤치를 생성하기 위한 가장 일반적인 기술입니다.
절차 블록
모든 절차적 신호 할당은 절차적 블록 내에 포함되어야 합니다. Verilog에는 initial 및 always의 두 가지 유형의 절차 블록이 있습니다.
1. initial 블록
initial 블록은 시뮬레이션 시작 시 블록 안에 포함된 모든 명령문을 한 번 실행합니다. initial 블록은 합성 가능한 동작을 모델링하는 데 사용되지 않습니다. 대신 테스트 벤치 내에서 반복적인 신호의 초기 값을 설정하거나 단일 전환 세트만 있는 신호의 동작을 모델링하는 데 사용됩니다.
다음은 initial 블록의 구문입니다.
initial
begin
signal_assignment_1
signal_assignment_2
:
end
테스트 벤치에서 리셋 라인을 모델링하기 위해 initial 블록이 어떻게 사용되는지에 대한 간단한 모델을 살펴보겠습니다.
다음 예에서 신호 "Reset_TB"는 DUT로 구동됩니다. 시뮬레이션 시작 시 Reset_TB의 초기 값은 논리 0으로 설정됩니다. 두 번째 할당은 15ns 단위 지연 후에 이루어집니다. 두 번째 할당 문은 Reset_TB를 논리 1로 설정합니다. 이 예의 할당은 지연 연산자로 인해 나열된 순서대로 순서대로 평가됩니다. initial 블록은 한 번만 실행되기 때문에 Reset_TB는 나머지 시뮬레이션 동안 마지막 할당 값을 유지합니다.
initial
begin
Reset_TB = 1’b0;
#15 Reset_TB = 1’b1;
end
2. always 블록
always 블록은 영원히 또는 시뮬레이션 기간 동안 실행됩니다. always 블록을 사용하여 테스트 벤치에서 합성할 수 없는 동작 외에 합성 가능한 회로를 모델링할 수 있습니다.
다음은 always 블록의 구문입니다.
always
begin
signal_assignment_1
signal_assignment_2
:
end
always 블록을 사용하여 테스트 벤치에서 클록 라인을 모델링하는 방법에 대한 간단한 모델을 살펴보겠습니다.
다음 예에서 신호 Clock_TB의 값은 10ns 단위마다 논리 값을 지속적으로 변경합니다.
always
begin
#10 Clock_TB = ~Clock_TB;
end
자체적으로는 위의 always 블록이 작동하지 않을 것입니다. 시뮬레이션이 시작될 때 Clock_TB에 초기 값이 없으므로 시뮬레이터는 Clock_TB의 값이 시간 0에 있는지 알지 못하기 때문입니다. 또한 시간 단위 10에서 부정 연산(~)의 출력이 무엇인지 알 수 없습니다.
다음 예는 initial 블록과 always 블록을 조합하여 클록 신호를 모델링하는 올바른 방법을 보여줍니다. Verilog는 여러 절차 블록에서 동일한 변수에 대한 할당을 허용하므로 다음 예가 유효합니다. 시뮬레이션이 시작되면 Clock_TB에 논리 0이 할당됩니다. 이것은 시간 0에서 신호에 대해 알려진 값을 제공하고 initial 블록 부정이 결정적 값을 가질 수 있도록 합니다.
아래 예는 10ns 단위마다 토글하는 클록 신호를 생성합니다.
initial
begin
Clock_TB = 1’b0;
end
always
begin
#10 Clock_TB = ~Clock_TB;
end
3. 감지신호 목록
감지신호 목록은 블록 내의 할당이 실행될 때 트리거하기 위해 절차 블록과 함께 사용됩니다. @ 기호는 감지신호 목록을 나타내는 데 사용됩니다. 그런 다음 절차 블록을 트리거할 @ 기호 뒤의 괄호 안에 신호를 나열할 수 있습니다. 다음은 감지심호 목록의 기본 구문입니다.
always @ (signal1, signal2)
begin
signal_assignment_1
signal_assignment_2
:
end
이 구문에서 괄호 안에 나열된 신호에 대한 전환은 always 블록이 트리거되고 모든 할당이 한 번 발생하도록 합니다. always 블록이 종료되면 다시 트리거할 감지 목록의 다음 신호 전환을 기다립니다.
다음 예는 간단한 3입력 AND 게이트를 모델링하는 방법을 보여줍니다. 이 예에서 입력 A, B 또는 C에 대한 전환은 블록이 트리거되고 F에 대한 할당이 발생하도록 합니다.
always @ (A, B, C)
begin
F = A & B & C;
end
Verilog는 또한 상승 에지 또는 하강 에지 전환으로만 블록 트리거를 제한하는 키워드를 지원합니다. 키워드는 posedge와 negedge입니다.
다음은 에지 감지 블록의 기본 구문입니다. 이 구문에서 신호1의 상승 에지 전환 또는 신호2의 하강 에지 전환만 블록을 트리거합니다.
always @ (posedge signal1, negedge signal2)
begin
signal_assignment_1
signal_assignment_2
:
end
감지신호 목록에는 동작을 보다 명시적으로 설명하기 위해 부울 연산자가 포함될 수도 있습니다. 다음 구문은 위의 구문과 동일합니다.
always @ (posedge signal1 or negedge signal2)
begin
signal_assignment_1
signal_assignment_2
:
end
에지 감도를 모델링하는 기능을 통해 순차 회로를 모델링할 수 있습니다.
다음 예는 간단한 D-플립플롭을 모델링하는 방법을 보여줍니다.
always @ (posedge Clock)
begin
Q = D;
end
Verilog-2001에서는 블록 내 할당의 오른쪽에 나열된 신호를 기반으로 트리거되는 감지신호 목록을 지원하는 구문이 추가되었습니다. 이 구문은 @*입니다.
다음 예는 이 모델링 접근 방식을 사용하여 3입력 AND 게이트를 모델링하는 방법을 보여줍니다.
always @*
begin
F = A & B & C;
end
'프로그래밍 언어 > Verilog' 카테고리의 다른 글
[Verilog 학습] 조건부 프로그래밍 구조 (0) | 2022.04.01 |
---|---|
[Verilog 학습] 순차 기능 모델링 – 절차적 할당 2 (0) | 2022.03.31 |
[Verilog 학습] 구조 설계 및 계층구조 (0) | 2022.03.29 |
[Verilog 학습] Verilog에서 동시 기능 모델링 (0) | 2022.03.28 |
[Verilog 학습] Verilog 모듈 구조 (0) | 2022.03.27 |