공부 기록/회로설계

[Verilog] Blocking Assignment vs Non-Blocking Assignment - 베릴로그 절차형 할당문의 종류

tomatt0 2022. 4. 21. 16:51
반응형

Procedural assignment의 종류에는 blocking assignment와 non-blocking assignment가 있다. 각 할당문과 그 차이에 대해 알아보자.

 


1. Blocking Assignment

" 기술된 순서대로 동작하는 할당문 "

Blocking assignment는 그 이름에서도 알 수 있듯, 현재 statement가 수행되는 동안 block 처리가 되어 다음 statement가 수행되지 않는다. 따라서, 다음 statement에서는 업데이트된 값을 사용하며, 기본적으로 zero-delay를 갖는다.

 

할당 연산자 = 을 사용한다.

 


2. Non-Blocking Assignment

" 기술 순서와 무관하게 동시에 수행되는 할당문 "

Non-Blocking assignment는 기술 순서에 상관없이 동시에 여러 개의 statement가 수행된다. 즉, 실제 value update가 아니고 단순히 assignment 구문들을 스케쥴링하며 delta-delay 후에 값이 할당된다. 따라서 다음 statement에서 현재 데이터 값을 사용하게 된다.

 

할당 연산자 <= 를 사용한다.

 

하드웨어를 설계할 때 race condition 때문에 무조건 현재 데이터 값을 전달하는 non-blocking assignment를 사용함이 더 적절하다.

 

※ Race condition이란?

Race condition이란 순서나 타이밍에 의해 시스템 동작이 달라지는 현상이다. 회로설계에서는 signal이 gate를 통과하면서 발생하는 delay에 의해 원치않는 결과가 출력되는 현상을 의미한다.

 


3. 예제

module ba_nba(A, B, C, D);
input A, C;
output B, D;
reg B, D, F, H;	// 값을 hold해야하기 때문에 reg 사용

always @(A) begin	// Blocking_Assignments
    F = ~A;	// BA
    B = ~F;	// BA
end

always @(C) begin	// Non_Blocking_Assignments
    H <= ~C;	// BA
    D <= ~H;	// BA
end
endmodule

위 예시는 ba_nba라는 모듈에서 두 개의 always block에서 각각 blocking assignment와 non-blocking assignment를 사용한 것이다. 아래는 위 코드에 대한 testbench를 설계하고 시뮬레이션한 결과 waveform 사진이다.

 

Simulation Waveform

먼저, blocking assignment를 사용한 첫 번째 always block의 경우 A가 반전된 결과가 F로 할당되고, 변화된 F가 다시 반전된 결과가 B로 할당됨을 볼 수 있다. 즉, 첫 번째 statement인 F = ~A가 먼저 수행되고 그 후, B = ~F가 수행된다.

 

다음으로 non-blocking assignment를 사용한 두 번째 always blcok의 경우 C가 반전된 결과가 H로 할당되고, D에는 변화되기 전의 H signal이 반전된 결과가 할당됨을 확인할 수 있다. 이는 두 개의 statement가 동시에 처리가 되었기 때문에 발생한 결과이다.

 

Combinational logic을 구현할 때에는 blocking assignment가, sequential logic을 구현할 때에는 non-blocking assignment가 사용된다.

 

 

반응형