할당 지연
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 69번째.
이전 레슨에서 우리는 일반 지연(general delays)(#10 a = b;)과 게이트 지연(gate delays)(and #5 (out, a, b);)을 다루었습니다. 이제 우리는 할당문의 일부로서 initial 또는 always와 같은 procedural 블록 내부에서 발생하는 지연인 할당 지연(assignment delays)에 대해 알아봅니다.
할당 지연(assignment delay)은 지정된 시간 동안 대기한 후 할당을 수행합니다. 지연은 # 기호 뒤와 할당 전에 위치합니다.
구문:
variable = #delay expression;일반적인 지연 방식인 #10 a = b; (지연 후 할당)와 달리, 할당 지연 방식인 a = #10 b;는 그 시점의 b 값을 취하고, 10 시간 단위만큼 기다린 후 a에 할당합니다.
할당 지연 vs 일반 지연
| 일반 지연 | 할당 지연 | |
|---|---|---|
| 구문 | #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:
b가0으로 변경됩니다 (a1이 여전히 대기 중인 동안). - 시간 10:
a1에0이 아닌1(시간 0에 읽은 값)이 할당됩니다.
별도의 블록에 있는 일반적인 지연 #10 a2 = b;의 경우, b는 시간 10에 읽혀집니다 (값 0).
중요한 규칙
| 규칙 | 설명 |
|---|---|
=는 # 앞에 옵니다 | a = #10 b;이며 a #10 = b;가 아닙니다 |
| 값은 즉시 읽힙니다 | 우변은 즉시 평가됩니다 |
| 할당은 지연 후에 발생합니다 | 좌변은 나중에 값을 갖게 됩니다 |
| 절차적 블록에만 사용됩니다 | initial 또는 always에서 사용됩니다 |
챌린지
수행할 작업:
15 시간 단위 후에 a가 b의 값을 갖도록 하되, b의 값은 즉시 읽을 수 있도록 누락된 할당 지연(assignment delay)을 추가하세요.
치트 시트
할당 지연(Assignment delay)은 우변의 값을 즉시 읽고, 지정된 지연 시간만큼 기다린 후 할당을 수행합니다:
variable = #delay expression;일반 지연과의 주요 차이점:
일반 지연 #10 a = b; | 할당 지연 a = #10 b; | |
|---|---|---|
| b의 값을 읽는 시점 | 지연 후 | 즉시 |
| 값이 할당되는 시점 | 지연 후 | 지연 후 |
지연 시간 동안 b의 값이 변할 때, 결과가 달라집니다:
initial begin
b = 1;
a1 = #10 b; // 지금 b=1을 읽고, 시간 10에 a1=1을 할당함
#5 b = 0; // 시간 5에 b가 변함 — a1은 여전히 1을 할당받음
// #10 a2 = b; 의 경우 → 시간 10에 b=0을 읽으므로, a2=0이 됨
end절차적 블록(initial 또는 always) 내부에서만 유효합니다.
직접 해보기
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이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.