설계자가 알고리즘적 방법으로 설계 기능 기술 가능
회로의 행위 묘사 가능
최상위 추상화 수준에서 회로 표현
디지털 설계의 복잡도에 따라 구조적인 평가 시 사용
C프로그래밍 언어와 많은 면에서 유사
구조적 프로시저
절차적 할당
타이밍 제어
조건문
다중 분기
루프
순차 처리와 병렬 처리 블록
- 구조적 프로시저
initial문 / always문
verilog는 병렬적으로 수행되는 프로그래밍 언어
initial, always문이 분리되어 수행
→ 각 수행은 시뮬레이션 시간 0에서 시작
initial,always 중첩 불가
▶initial문
시간 0에서 시작
일반적으로 초기화, 모니터링, 파형에 사용
시뮬레이션 동안 한번만 수행
여러 개의 initial 블록 존재 시 시간 0에 동시 수행
여러 개의 행위 수준 문장은 begin과 end로 묶어 사용
C프로그래밍의 {}와 유사
▶always문
시간 0에서 시작
블록내 문장을 루프 형식으로 연속 수행
clock 생성과 같은 반복 활동의 블록 모델링 시 사용
수행은 오직 $finish , $stop에 의해 멈춤
- 절차적 할당
reg, integer, real, time 변수의 값을 갱신
변수에 할당된 값은 절차적 할당 방법으로 동일한 값 유지
<변수명>(<)=<할당 변수명>
▶blocking(=) 할당문
begin, end 사이의 순차적 할당
시뮬레이션 시간 값이 누적
현재 할당문 실행 완료될 때까지 다음 할당문 실행되지 않음
▶non-blocking(<=) 할당문
begin, end 사이의 병렬적 할당
하나의 변수에 대한 할당에서는 의미 없음
동일 시점에서 변수들의 순서나 상호 의존성에 의해 할당이 이루어져야 하는 경우 사용
- 조건문
▶if/else문
조건이 참이면 if문 다음 문장이 실행
조건이 거짓(0,x,z)이면 else문 다음 문장을 실행
if문 다음 문장 또는 else문 다음 문장은 한 문장 또는 여러 개의 문장으로 블록이 될 수 있음
블록은 키워드 begin과 end를 사용해서 반드시 묶어야함
if문은 if문안에 if를 중첩하여 사용하는 것이 가능
여러 개의 표현을 if의 조건으로 사용할 때 && 또는 || 논리 연산자 사용
*else가 없으면 래치가 생성됨
▶case/default 문
문장 1,2... 기본 문장은 하나 또는 여러 개의 문장으로 된 블록이 될 수 있음
여러 개의 문장 블록은 키워드 begin과 end를 사용해서 묶어야 함
*default가 없으면 래치가 생성됨
*case문 비교*
case : x와 z값을 구분하여 처리
casex : x와 z값을 비교해서 don't care로 취급
casez : z값을 비교해서 don't care로 취급
- 반복문
▶while문
조건식의 값이 거짓이 될 때가지 문장 반복 실행
조건식의 초기 값이 거짓이면 문장이 실행되지 않음
ex)
integer count;
initial begin
count = 0;
while(count<128) begin
$display ("count = %d",count);
count = count + 1;
end
end
▶for문
반복 횟수를 제어하는 변수에 초기 값이 할당
수식을 평가 ( 결과가 0이 아닌 값이면 반복을 실행, 수식의 결과가 0이면 반복을 멈추고 for 루트로 빠져 나옴,
수식이 x : unknown이거나 z : high impedance 이면 0으로 취급 )
반복을 제어하는 변수의 값을 갱신한 후 2단계를 반복
ex)
integer count;
initial begin
count = 0;
for(count=0; count<128; count = count + 2)
$display ("count = %d",count);
end
▶repeat문
지정된 횟수만큼 문장이 반복 실행
반복 횟수를 나타내는 수식이 x이거나 z로 평가되면 반복 횟수는 0이 되고 문장은 실행되지 않음
ex)
integer count;
initial begin
count = 0;
repeat(128) begin
$display ("count = %d",count);
count = count + 1;
end
end
▶forever문
문장이 무한히 반복적으로 실행
synthesis(합성)이 지원되지 않으므로 testbench에서만 사용
ex)
reg clk;
initial begin
clk = 1'b0;
forever #10 clk <= ~clk;
end
initial
#100 $finish;
- 타이밍 제어
verilog HDL에서는 다양한 행위 수준의 타이밍 제어 구조를 사용할 수 있음
타이밍 제어문이 없으면 시뮬레이션 시간은 진행되지 않음
절차적 문장이 수행되는 시뮬레이션 시간을 제어할 수 있음
▶지연 기반 타이밍 제어(Delay-Based Timing Control)
정규 지연 제어(Regular Delay Control)
→절차적 할당의 왼쪽에 0값이 아닌 (non-zero) 지연이 지정될 때 사용
전체 할당의 수행에 영향을 받음
내부 할당 지연 제어(Intra-Assignment Delay Control)
→지연 제어를 할당의 왼쪽에 지정하는 대신, 오른쪽에 지연을 할당할 수 있음
제로 지연 제어(Zero Delay Control)
→다른 모든 문장이 시뮬레이션 시간에 실행된 후 마지막으로 수행시키는 방법
reg x,y;
initial begin
x=0;
y=0;
end
initial begin
#0 x=1;
#0 y=1;
end
4개의 문장은 시뮬레이션 단위 시간 0에 수행
x=1,y=1은 마지막에 수행
▶사건 기반 타이밍 제어(Event-Based Timing Control)
사건(event) : 레지스터 또는 넷의 값 변화를 의미
문장 또는 문장의 블록 구동을 위해 사용될 수 있음
- 정규 사건 제어
@ 기호는 사건 제어를 지정하는데 사용
문장은 신호값 또는 신호값의 양 또는 음으로 변환될 때 수행
- 명명된 사건 제어
-> 기호는 명명된 사건 제어를 지정하는데 사용
키워드 event에 의해 선언됨
- 사건 OR 제어
다수의 event에 의해 절차형 할당문의 실행이 제어되는 경우 다수의 event들은 키워드 or 또는 콤마(,)로 결합 가능
- 준위-구동 타이밍 제어(Level-Sensitive Timing Control)
특정 상태가 참이 되기를 기다림
키워드 wait에 의해 선언
ex)
always
wait (enable) # 20 count = count + 1;
//enable의 값이 1이면 20단위 시간마다 count값 증가
- 블록문
▶순차(Sequential)처리 블록
순차 처리 블록의 문장들은 지정된 순서에 따라 처리
이전 문장이 완전히 수행을 마치면 다음 문장이 수행
(* 내부-할당 타이밍 제어가 있는 논 블록킹 할당은 제외)
키워드 : begin, end
reg x,y;
reg [1:0] z,w;
initial begin
x = 1'b0;
#5 y = 1'b1; // 5ns 후
#10 z = {x,y}; // 15ns 후
#20 w = {y,x}; // 35ns 후
end
▶병렬(Parallel)처리 블록
병렬 처리 블록의 문장들은 동시에 수행
각 문장에 할당된 지연 기반 또는 사건 기반 제어에 의해서 문장의 순서 조절
지연 기반 또는 사건 기반 제어가 저장되어있다면 블록 안으로 들어가는 시간과 관계가 있음
키워드 : fork, join or <=,
reg x,y;
reg [1:0] z,w;
initial fork
x = 1'b0;
#5 y = 1'b1; // 5ns 후
#10 z = {x,y}; // 10ns 후
#20 w = {y,x}; // 20ns 후
join
'verilog HDL' 카테고리의 다른 글
[Verilog] Task / Function (0) | 2022.03.21 |
---|---|
[Verilog] Behavior modeling 설계 (0) | 2022.03.19 |
[Verilog] Data flow modeling (0) | 2022.03.17 |
[Verilog] Gate level modeling (0) | 2022.03.16 |
[Verilog] (0) | 2022.03.16 |