블로킹 할당
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 49번째.
Verilog에는 두 가지 유형의 절차적 할당(procedural assignments)이 있습니다: 블로킹 (=) 및 논블로킹 (<=). 이 레슨에서는 블로킹 할당에 집중합니다.
블로킹 할당(Blocking assignment)은 = 연산자를 사용합니다. 현재 할당이 완료될 때까지 다음 문장의 실행을 차단(block)하기 때문에 "블로킹"이라고 불립니다. 코드는 순서대로 한 단계씩 실행됩니다.
구문:
variable = expression;블로킹 할당(Blocking Assignment)을 사용하는 경우
블로킹 할당(=)은 조합 논리(combinational logic) — 즉, 클록이나 메모리 없이 입력이 변경되면 출력이 즉시 변경되는 회로에 사용됩니다.
조합 논리의 예:
- AND / OR / XOR 게이트
- 가산기와 감산기
- 멀티플렉서
- 디코더
Verilog 예제:
always @(*) begin
sum = a + b; // 블로킹 할당
carry = a & b; // 블로킹 할당
endAlways 블록에서의 블로킹 (조합 논리)
always @(*) begin
temp = a & b; // 1단계
out = temp | c; // 2단계 (1단계의 temp를 사용)
end순서가 중요합니다. 조합 논리(combinational logic)에서는 이 방식이 적합합니다.
블로킹 vs 넌블로킹
블로킹 (=) | 넌블로킹 (<=) | |
|---|---|---|
| 실행 방식 | 순차적 실행 | 동시 실행 |
| 다음 줄 대기 여부 | 예 | 아니요 |
| 용도 | 조합 논리 (Combinational logic) | 순차 논리 (플립플롭) |
중요: 플립플롭에 블로킹(Blocking)을 사용하지 마십시오
챌린지
임시 변수를 사용하여 x와 y의 값을 서로 바꾸기 위해 누락된 블로킹 할당(blocking assignments)을 추가하세요.
수행할 작업:
x의 값을temp에 할당합니다 (x를 temp에 저장)y의 값을x에 할당합니다 (y를 x로 이동)temp의 값을y에 할당합니다 (저장된 x를 y로 이동)
치트 시트
블로킹 할당 (=)은 순차적으로 실행됩니다 — 각 문장은 다음 문장이 시작되기 전에 완료됩니다. always @(*) 블록 내부의 조합 논리(combinational logic)에 사용됩니다.
always @(*) begin
temp = a & b; // 1단계
out = temp | c; // 2단계 (업데이트된 temp 사용)
end블로킹 (=) |
논블로킹 (<=) |
|
|---|---|---|
| 실행 | 하나씩 차례대로 | 동시에 |
| 용도 | 조합 논리 | 순차 논리 (플립플롭) |
직접 해보기
module swap;
reg x, y;
reg temp;
initial begin
x = 1;
y = 0;
$display("Before swap: x=%d, y=%d", x, y);
// TODO: 1단계 - x를 temp에 할당
// TODO: 2단계 - y를 x에 할당
// TODO: 3단계 - temp를 y에 할당
$display("After swap: x=%d, y=%d", x, y);
$finish;
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.