Menu
Coddy logo textTech

논블로킹 할당

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)은 병렬로 실행됩니다모든 할당이 동시에 발생합니다
값은 타임 스텝의 끝에서 업데이트됩니다즉시 업데이트되지 않습니다
challenge icon

챌린지

비차단 할당(Non-Blocking Assignment) 완성하기

이 2비트 시프트 레지스터가 작동하도록 누락된 비차단 할당을 추가하세요.

작동 원리:

  • 각 클록 에지에서, q1d 값을 가집니다.
  • q2q1의 이전 값을 가집니다.

수행할 작업:

  1. dq1에 할당하세요 (비차단 방식)
  2. q1q2에 할당하세요 (비차단 방식)

치트 시트

비차단 할당(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
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨