논블로킹 할당
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 50번째.
이전 레슨에서는 단계별로 실행되는 blocking 할당(=)을 다루었습니다. 이제 모든 명령이 동시에(병렬로) 실행되는 non-blocking 할당(<=)을 알아봅니다.
Non-blocking 할당은 <= 연산자를 사용합니다. 다음 문장의 실행을 차단하지 않기 때문에 "non-blocking"이라고 불립니다. 블록 내의 모든 non-blocking 할당은 동시에 실행됩니다.
구문:
variable <= expression;Non-Blocking Assignment를 사용해야 하는 경우
Non-blocking assignment (<=)는 순차 논리(sequential logic) — 클록을 사용하고 메모리를 갖는 회로 — 에 사용됩니다. 출력은 클록 edge(보통 상승 edge)에서만 변경됩니다.
순서 논리(sequential logic)의 예:
- 플립플롭(Flip-flops)
- 레지스터(Registers)
- 카운터(Counters)
- 상태 머신 (State machines)
- 시프트 레지스터 (Shift registers)
Verilog 예시:
initial begin
a <= 5; // 스케줄되었지만 아직 실행되지 않음
b <= a + 2; // 스케줄됨, a의 이전 값을 사용
c <= b * 3; // 스케줄됨, b의 이전 값을 사용
end세 가지 대입 모두 동시에 old values를 사용하여 일어납니다. 타임 스텝이 끝날 때, 모든 업데이트가 함께 일어납니다.
Always 블록에서의 Non-blocking (순차 논리)
Non-blocking은 클록을 사용하고 메모리(플립플롭, 레지스터, 카운터)를 갖는 회로인 순차 논리에 사용됩니다.
always @(posedge clk) begin
q <= d; // 클록 에지에서 q가 d를 받음
count <= count + 1; // 클록 에지에서 count가 증가함
end두 할당 모두 clock edge 이전의 values를 사용하여 동시에 일어납니다.
요약
| 규칙 | 설명 |
|---|---|
순차 논리(sequential logic)에는 <=를 사용 | always @(posedge clk) |
조합 논리(combinational logic)에는 =를 사용 | always @(*) |
| Non-blocking은 병렬로 실행됨 | All 할당이 한 번에 발생함 |
| Values는 time step의 end에 업데이트됨 | 즉시 업데이트되지 않음 |
챌린지
비블로킹 할당(Non-blocking Assignment) 완성하기
이 2비트 시프트 레지스터가 작동하도록 누락된 비블로킹 할당을 추가하세요.
작동 방식:
- 각 클록 엣지에서
q1은d의 값을 가져옵니다. q2는q1의 이전 값을 가져옵니다.
수행할 작업:
q1에d를 할당합니다 (비블로킹).q2에q1을 할당합니다 (비블로킹).
직접 해보기
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에 할당 (non-blocking)
// 2단계: q1을 q2에 할당 (non-blocking)
end
end
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.