Menu
Coddy logo textTech

논블로킹 할당

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에 업데이트됨즉시 업데이트되지 않음
challenge icon

챌린지

비블로킹 할당(Non-blocking Assignment) 완성하기

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

작동 방식:

  • 각 클록 엣지에서 q1d의 값을 가져옵니다.
  • q2q1의 이전 값을 가져옵니다.

수행할 작업:

  1. q1d를 할당합니다 (비블로킹).
  2. q2q1을 할당합니다 (비블로킹).

직접 해보기

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
quiz icon실력 점검

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

기초의 모든 레슨