Menu
Coddy logo textTech

Non Blocking Assignment

Coddy Verilog 여정의 기초 섹션에 포함된 레슨. 90개 중 50번째.

이전 레슨에서는 단계별로 실행되는 blocking assignment(=)을 다뤘습니다. 이제 한 번에, 병렬로 실행되는 non-blocking assignment(<=)을 다루겠습니다.

Non-blocking 할당은 <= 연산자를 uses. 다음 문장의 실행을 차단하지 않기 때문에 “non-blocking”이라고 합니다. 블록 내의 All non-blocking 할당은 동시에 실행됩니다.

구문:

variable <= expression;

Non-Blocking Assignment를 사용하는 경우

Non-blocking assignment(<=)는 순차 논리에 사용됩니다. 순차 논리란 클록을 사용하고 메모리를 갖는 회로입니다. 출력은 클록 edge(일반적으로 상승 edge)에서만 변경됩니다.

순차 논리의 예:

  • 플립플롭
  • 레지스터
  • 카운터
  • 상태 머신
  • 시프트 레지스터

Verilog 예시:

initial begin
  a <= 5;      // 스케줄되었지만 아직 실행되지 않음
  b <= a + 2;  // 스케줄됨, a의 이전 값을 사용
  c <= b * 3;  // 스케줄됨, b의 이전 값을 사용
end

All 세 할당은 old values를 사용하여 at the same time 발생합니다. time step의 end에는 모든 업데이트가 함께 발생합니다.

Always 블록에서의 Non-Blocking (순차 논리)

Non-blocking은 순차 논리에 사용됩니다. 순차 논리란 클록을 사용하고 메모리를 가지는 회로(플립플롭, 레지스터, 카운터)입니다.

always @(posedge clk) begin
  q <= d;           // 클록 에지에서 q가 d를 받음
  count <= count + 1; // 클록 에지에서 count가 증가함
end

두 할당은 모두 클록 edge 이전의 값을 사용하여 동시에 수행됩니다.

요약

규칙설명
순차 논리에는 <= 사용always @(posedge clk)
조합 논리에는 = 사용always @(*)
Non-blocking은 병렬로 실행됨모든 할당이 한 번에 발생함
값은 시간 단계가 끝날 때 업데이트됨즉시 업데이트되지 않음
challenge icon

챌린지

non-Blocking Assign 완료하기

이 2비트 시프트 레지스터가 작동하도록 누락된 non-blocking 할당을 Add하세요.

작동 방식:

  • 각 clock edge에서 q1d를 gets
  • q2q1의 old 값을 gets

해야 할 작업:

  1. dq1에 Assign (non-blocking)
  2. q1q2에 Assign (non-blocking)

직접 해보기

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

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

기초의 모든 레슨

직접 연습해 보세요: 온라인 Verilog 컴파일러