Verilog 이해하기 3 - Blocking/Non Blocking Assignment
Procedural Assignment의 두 가지 종류 (Blocking, Non Blocking)
이전 글에서 continuous assignment 와 procedural assignment에 대해 다뤘다. 그중 Procedural assignment의 종류인 Blocking Assignment와 Non Blocking Assignment에 대해 다뤄보려 한다.
1. Blocking Assignment
Blocking은 우선 = 이 사용된다. Blocking은 Blocking이라는 이름 그대로 해당 문장이 할당이 된 다음다음 할당이 시작된다. 예를 들어 설명하면
module tb;
reg [4:0] A,B,C,D;
initial begin
A=3;
B=4;
C=5;
D=6;
A=B+C;
B=D;
C=A;
$display(A);
$display(B);
$display(C);
$display(D);
end
endmodule
결과는 아래와 같다.
결과를 조금 생각해 보면 각각에 assign이 되는 부분이 순서대로 진행된 것을 결과를 보고 확인할 수 있다.
2. Non Blocking Assignment
그렇다면 Non Blocking은 어떤 결과가 나올까? 위에 코드에서 blocking assign만 non blocking assign으로 바꾸어 보자.
module tb;
reg [4:0] A,B,C,D;
initial begin
A=3;
B=4;
C=5;
D=6;
A<=B+C;
B<=D;
C<=A;
$display(A);
$display(B);
$display(C);
$display(D);
end
endmodule
결과가 달라지는 것을 볼 수 있다. 결과를 해석해 보면 Non blocking 같은 경우는 모든 우변(RHS)가 첫 시작할 때 동시에 연산이 되어서 한 번에 좌변(LHS)에 assing 되는 것을 확인할 수 있다.
3. Hardware 적인 차이가 무엇인가?
verilog라는 것 자체가 Hardware를 설계하기 위한 것이다. 그렇다. Blocking과 Non blocking은 단순히 assign만 다르게 되는 것뿐만 아니라 Hardware 적으로 다른 점을 알아야 될 필요가 있다.
보통 Procedural Assignment는 Flip-Flop이 많이 쓰이는데 Non-blocking 같은 경우에 하나의 한 clk에 동시에 data가 전달 된다고 볼 수 있고 blocking 같은 경우 여러 flip-flop이 쓰이는 것을 볼 수 있다.
<함께 읽으면 좋은 글>
2021.10.28 - [IT정보] - verilog 이해하기 1 (verilog module의 몸체)
2021.10.28 - [IT정보] - verilog 이해하기2 (verilog siganl assignment의 종류)