본문 바로가기

verilog HDL

[Verilog] Behavior modeling

설계자가 알고리즘적 방법으로 설계 기능 기술 가능

회로의 행위 묘사 가능

최상위 추상화 수준에서 회로 표현

디지털 설계의 복잡도에 따라 구조적인 평가 시 사용

 

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