논블로킹 할당
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 50번째.
이전 레슨에서 우리는 단계별로 실행되는 블로킹 할당(=)에 대해 알아보았습니다. 이제 우리는 동시에 — 병렬로 실행되는 논블로킹 할당(<=)에 대해 알아볼 것입니다.
논블로킹 할당(Non-blocking assignment)은 <= 연산자를 사용합니다. 이는 다음 문장의 실행을 차단(block)하지 않기 때문에 "논블로킹"이라고 불립니다. 한 블록 내의 모든 논블로킹 할당은 동시에 실행됩니다.
구문:
variable <= expression;Non-Blocking 할당을 사용하는 시기
Non-blocking 할당(<=)은 순차 논리(sequential logic) — 즉, 클록을 사용하고 메모리를 갖는 회로에 사용됩니다. 출력은 클록 에지(보통 상승 에지)에서만 변경됩니다.
순차 논리의 예:
- 플립플롭
- 레지스터
- 카운터
- 상태 머신
- 시프트 레지스터
Verilog 예제:
initial begin
a <= 5; // 예약되었지만 아직 실행되지 않음
b <= a + 2; // 예약됨, a의 이전(OLD) 값을 사용함
c <= b * 3; // 예약됨, b의 이전(OLD) 값을 사용함
end세 가지 할당 모두 이전 값들을 사용하여 동시에 일어납니다. 타임 스텝의 끝에서 모든 업데이트가 함께 수행됩니다.
Always 블록에서의 논블로킹 (순차 논리)
논블로킹(Non-blocking)은 순차 논리(sequential logic) — 클락을 사용하고 메모리(플립플롭, 레지스터, 카운터)를 가지는 회로 — 에 사용됩니다.
always @(posedge clk) begin
q <= d; // 클록 에지에서 q에 d가 대입됩니다
count <= count + 1; // 클록 에지에서 count가 증가합니다
end두 할당은 클록 에지 이전의 값을 사용하여 동시에 발생합니다.
요약
| 규칙 | 설명 |
|---|---|
순차 로직에는 <=를 사용하세요 | always @(posedge clk) |
조합 로직에는 =를 사용하세요 | always @(*) |
| 논블로킹(Non-blocking)은 병렬로 실행됩니다 | 모든 할당이 동시에 발생합니다 |
| 값은 타임 스텝의 끝에서 업데이트됩니다 | 즉시 업데이트되지 않습니다 |
챌린지
비차단 할당(Non-Blocking Assignment) 완성하기
이 2비트 시프트 레지스터가 작동하도록 누락된 비차단 할당을 추가하세요.
작동 원리:
- 각 클록 에지에서,
q1은d값을 가집니다. q2는q1의 이전 값을 가집니다.
수행할 작업:
d를q1에 할당하세요 (비차단 방식)q1을q2에 할당하세요 (비차단 방식)
치트 시트
비차단 할당(Non-blocking assignment) (<=)은 모든 문을 병렬로 실행합니다. 즉, 이전 값을 사용하며 타임 스텝의 끝에서 업데이트됩니다.
// 모두 a와 b의 이전(OLD) 값을 사용함
a <= 5;
b <= a + 2; // 이전 a를 사용
c <= b * 3; // 이전 b를 사용클록 기반 always 블록 내부의 순차 논리(플립플롭, 레지스터, 카운터)에는 <=를 사용하세요:
always @(posedge clk) begin
q <= d; // 비차단(non-blocking)
count <= count + 1; // 비차단(non-blocking)
end| 할당 | 용도 | 실행 방식 |
|---|---|---|
<= | 순차 논리 (posedge clk) | 병렬 |
= | 조합 논리 (always @(*)) | 순차적 |
직접 해보기
module shift_register (
input clk,
input reset,
input d,
output reg q1,
output reg q2
);
always @(posedge clk or posedge reset) begin
if (reset) begin
q1 <= 0;
q2 <= 0;
end else begin
// TODO: 시프트 로직 추가
// 1단계: d를 q1에 할당 (논블로킹)
// 2단계: q1을 q2에 할당 (논블로킹)
end
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.