지연이란 무엇인가
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 67번째.
Verilog에서 delays는 구문이 실행되는 시점이나 신호가 변경되는 시점을 제어합니다. 이는 실제 하드웨어의 타이밍 동작을 모델링하는 데 사용됩니다.
지연 시간이 필요한 이유
실제 하드웨어에서는 신호가 와이어와 게이트를 통해 이동하는 데 시간이 걸립니다. 지연 시간을 사용하면 이러한 타이밍 동작을 시뮬레이션할 수 있습니다.
- 시뮬레이션에서 지연 시간이 없으면 모든 작업이 time 0에 발생합니다
- delay를 사용하면 시간에 따라 이벤트를 간격 두고 배치할 수 있습니다
- 지연 시간은 clock 및 상태 머신과 같이 타이밍에 민감한 설계를 테스트하는 데 도움이 됩니다
지연의 종류
| 지연 유형 | 목적 |
|---|---|
| Gate Delays | 논리 게이트를 통과하는 지연 |
| Assignment Delays | 값을 할당할 때의 지연 |
| Timescale Directive | 시뮬레이션을 위한 시간 단위 설정 |
기본 구문
지연(delay)은 # 뒤에 숫자를 붙여 작성합니다:
#10 clk = ~clk; // 10 시간 단위를 기다린 다음 클록을 토글
#5 a = b; // 5 시간 단위를 기다린 다음 a = b를 할당# 뒤에 오는 숫자는 대기할 시간 단위(time units) 수입니다.
Simple Example
initial begin
a = 0;
#10 a = 1; // 10 시간 단위 후에 a는 1이 됩니다
#5 a = 0; // 또 다른 5 시간 단위 후에 a는 0이 됩니다
end타이밍:
- Time 0:
a = 0 - Time 10:
a = 1 - Time 15:
a = 0
always 블록에서의 delay
always #5 clk = ~clk; // 5 시간 단위마다 클록을 토글이것은 연속적인 clock 신호를 생성합니다(clk가 initial 블록에서 first 0으로 초기화되었다고 가정합니다 — 그렇지 않으면 ~x는 x로 유지됩니다).
중요한 규칙
| 규칙 | 설명 |
|---|---|
# 기호 | 딜레이를 표시함 |
# 뒤의 숫자 | 대기할 시간 단위 수 |
| 딜레이는 누적됨 | #10 후 #20은 총 30을 대기함 |
| 합성 불가능(Not synthesizable) | 딜레이는 시뮬레이션 전용임 |
챌린지
수행할 작업:
이 코드가 0, 10, 25, 40 시간에 메시지를 출력하도록 누락된 지연 시간을 추가하세요.
직접 해보기
module delay_challenge;
initial begin
$display("Time %0t: Start", $time);
// TODO: 시간 10에 도달하도록 지연 추가
$display("Time %0t: After first delay", $time);
// TODO: 시간 25에 도달하도록 지연 추가
$display("Time %0t: After second delay", $time);
// TODO: 시간 40에 도달하도록 지연 추가
$display("Time %0t: End", $time);
$finish;
end
endmodule
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.