Menu
CoddyTech

할당 지연

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

이전 수업에서는 일반 지연(#10 a = b;)과 게이트 지연(and #5 (out, a, b);)을 다루었습니다. 이제 할당문의 일부로 절차적 블록(initial 또는 always와 같은) 내부에서 발생하는 지연인 할당 지연을 다루겠습니다.

할당 지연은 지정된 시간 동안 기다린 다음 할당을 수행합니다. 지연은 # 기호 뒤에, 할당 앞에 둡니다.

구문:

variable = #delay expression;

일반 지연 #10 a = b;(지연한 다음 할당)과 달리, 할당 지연 a = #10 b;은 그 순간의 b 값을 가져와 10시간 단위 동안 기다린 다음 a에 할당합니다.

대입 지연과 일반 지연의 비교

 일반 지연대입 지연
구문#10 a = b;a = #10 b;
값은 언제 읽나요?대입 시점(지연 후)즉시(지연 전)
어떤 값이 대입되나요?그 시점의 b 값시간 0(또는 읽는 시점)의 b 값
값은 언제 대입되나요?지연 후지연 후

예시: 차이점

initial begin
  b = 1;
  #5 b = 0;
  
  // 일반 지연
  #10 a1 = b;     // 10만큼 기다린 뒤 b를 읽음 (b=0) → a1=0
  
  // 할당 지연
  a2 = #10 b;     // 지금 b를 읽고 (b=0), 10만큼 기다린 뒤 할당함 → a2=0
end

여기서는 둘 다 같은 결과를 냅니다. 지연 시간 동안 b가 바뀌면 차이가 나타납니다.

주요 차이점 예시

To show b changing during the delay, we need two separate initial blocks that run in parallel:

initial begin
  b = 1;
  a1 = #10 b;     // 시간 0에 b=1을 읽고, 시간 10에 a1=1을 할당합니다
end

initial begin
  #5 b = 0;       // 시간 5에 b를 0으로 변경합니다(지연 중)
end
  • 시간 0: a1은 b = 1을 읽습니다
  • 시간 5: a1이 아직 기다리는 동안 b가 0으로 바뀝니다
  • 시간 10: a1에는 0이 아니라 시간 0에 읽은 값인 1이 할당됩니다

별도의 블록에서 일반 지연 #10 a2 = b;을 사용하면 시간 10에 b를 읽게 됩니다(값은 0).

중요한 규칙

규칙설명
=는 # 앞에 옵니다a = #10 b;이지 a #10 = b;가 아닙니다
값은 즉시 읽힙니다오른쪽은 곧바로 평가됩니다
할당은 지연된 후에 이루어집니다왼쪽은 나중에 값을 받습니다
절차적 블록에서만 사용됩니다initial 또는 always에서 사용됩니다
challenge icon

챌린지

할 일:

a가 15시간 단위 후에 b의 값을 받도록 대입 지연을 추가하되, b는 즉시 읽도록 하세요.

직접 해보기

module assignment_challenge;
  reg a, b;
  
  // 지연 시간 동안 b를 변경하는 별도의 블록
  initial begin
    b = 1;
    // TODO: 할당 지연 추가
    // a는 15 시간 단위 후에 b 값을 받아야 함
    // 지금 b를 읽고 지연 후 할당

  end
  
  initial begin
    #5 b = 0;      // 지연 시간 동안 b를 변경함
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz icon실력 점검

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

기초의 모든 레슨

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