[Verilog] initial, always문

준치·2021년 12월 29일

[Verilog]

목록 보기
3/9

행위 수준 모델링에서 가장 기본적으로 사용되는 구문이다.

initial문

initial 블록은 시간 0에서 시작하고, 시뮬레이션 동안 한 번만 수행된다. 여러 블록이 있을경우에도 각각의 블록은 시간 0에서 동시에 독립적으로 수행된다.

예시 코드

module stimulus;

reg x, y, a, b, m;

initial
	m = 1'b0; // 하나의 문장 이므로 begin-end 불필요

initial
begin
    #5  a = 1'b1; // 여러개의 문장 이므로 begin-end로 묶는다.
    #25 b = 1'b0;
end

initial
begin
	#10 x = 1'b0;
    #25 y = 1'b1;
end

initial
	#50 $finish;
    
endmodule

----------------------------------
시간			수행된 문장
0			m = 1'b0;
5			a = 1'b1;
10			x = 1'b0;
30			b = 1'b0;
35			y = 1'b1;
50			$finish;

위 처럼 여러개의 initial문이 있어도 모두 시간0에서 동시에 수행되어 위와 같이 실행순서가 정해진다.

initial블록은 단 한번만 수행되어야 하는 과정들에 사용된다. 예를들어 testbench를 만들 때 값을 초기값화하는 과정에 많이 사용된다.

always문

always문은 시간 0 에서 시작하고, always블록 내의 문장을 루프 형식으로 연속되게 수행한다. 이 구문은 디지털 회로의 연속적으로 반복되는 활동의 블록을 모델링하기 위해 사용된다. 클럭 생성기를 예로 들어 설명하면 다음과 같다.

예시 코드

module clk_gen(
	output reg clk
    );
    
    // 단위 시간 0에 클럭을 초기화 한다.
    initial
    	clk = 1'b0;
        
    // 매 1/2 주기마다 클럭이 바뀐다. (T = 20)
    always
    	#10 clk = ~clk;
    initial
    	#1000 $finish
endmodule

위의 클럭 생성기는 initial블록에서 clk의 초기값을 설정한 후 always블럭을 통해 매 10 단위 시간마다 clk = ~clk이 수행된다. $stop또는 $finish가 없으면 클럭 생성기는 계속 동작하게 된다.

profile
설계 엔지니어 지망생

0개의 댓글