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 사진이다.
먼저, 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가 사용된다.
'공부 기록 > 회로설계' 카테고리의 다른 글
하드웨어 검증 언어, System Verilog 란? - Testbench, DUT (0) | 2022.12.16 |
---|---|
[Verilog] reg vs wire - reg와 wire의 차이점 (0) | 2022.05.05 |
[Verilog] Continuous Assignment vs Procedural Assignment - 베릴로그 연속 할당 vs 절차형 할당 (0) | 2022.04.21 |
[HDL] Behavioral Model vs Structural Model (0) | 2022.04.06 |
조합 논리회로 vs 순차 논리회로 - Combinational vs Sequential Logic Circuit (0) | 2022.04.03 |