할당 지연
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에서 사용됩니다 |
챌린지
할 일:
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: 온라인 Verilog 컴파일러