레지스터 a 와 b의 값을 교환하려는 Hardware를 설계할 때, 아래와 같이 서로 다른 Always Block 내부에서 Blocking Assignment를 이용해 값을 교환할 경우 Race Around Condition이 발생한다. Simulator는 clk의 posedge마다 어느 Always Block을 먼저 실행할지 골라야하고, 그에 따라 a와 b의 값이 같아질 것이다. 만약 첫 번째 Always Block을 먼저 실행할 경우 a=b=0이 되고, 두 번째 Always Block을 먼저 실행할 경우 a=b=1이 된다.
reg a,b;
a = 1'b1; b = 1'b0;
always @(posedge clk)
a = b;
always @(posedge clk)
b = a;
위의 코드와 같은 상황을 방지하기 위해서 아래와 같이 Non-Blocking Assignment를 사용한다.
reg a,b;
a = 1'b1; b = 1'b0;
always @(posedge clk)
a <= b;
always @(posedge clk)
b <= a;
만약 Always Block을 여러 개 사용할 때, 아래와 같이 하나의 Signal이 여러 Always Block에서 Driven 되어선 안된다. Multi-Driven Error가 발생하고, Synthesize되지 않는다.
reg out;
always @(posedge clk1)
out <= a | b;
always @(posedge clk2)
out <= c & d;