행위 수준 모델링에서 가장 기본적으로 사용되는 구문이다.
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가 없으면 클럭 생성기는 계속 동작하게 된다.