지연이란 무엇인가
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 67번째.
Verilog에서 지연(delays)은 구문이 실행되는 시점이나 신호가 변경되는 시점을 제어합니다. 이들은 실제 하드웨어 타이밍 동작을 모델링하는 데 사용됩니다.
지연이 필요한 이유
실제 하드웨어에서는 신호가 전선과 게이트를 통과하는 데 시간이 걸립니다. 지연을 사용하면 이러한 타이밍 동작을 시뮬레이션할 수 있습니다.
- 시뮬레이션에서 지연(delay)이 없으면 모든 것이 시간 0에 발생합니다
- 지연을 사용하면 이벤트를 시간에 따라 간격을 두고 배치할 수 있습니다
- 클록(clock) 및 상태 머신(state machine)과 같이 타이밍에 민감한 설계를 테스트하는 데 도움이 됩니다
지연의 유형
| 지연 유형 | 목적 |
|---|---|
| 게이트 지연 | 논리 게이트를 통한 지연 |
| 할당 지연 | 값을 할당할 때의 지연 |
| 타임스케일 지시어 | 시뮬레이션을 위한 시간 단위를 설정함 |
기본 구문
지연(delay)은 # 뒤에 숫자를 붙여서 작성합니다:
#10 clk = ~clk; // 10 시간 단위 대기 후, 클록 토글
#5 a = b; // 5 시간 단위 대기 후, a = b 할당# 뒤의 숫자는 대기할 시간 단위의 수입니다.
간단한 예제
initial begin
a = 0;
#10 a = 1; // 10 시간 단위 후에 a는 1이 됩니다
#5 a = 0; // 또 다른 5 시간 단위 후에 a는 0이 됩니다
end타이밍:
- 시간 0:
a = 0 - 시간 10:
a = 1 - 시간 15:
a = 0
Always 블록에서의 지연
always #5 clk = ~clk; // 5 시간 단위마다 클록을 토글함이것은 지속적인 클록 신호를 생성합니다.
중요 규칙
| 규칙 | 설명 |
|---|---|
# 기호 | 지연(delay)을 표시합니다 |
# 뒤의 숫자 | 대기할 시간 단위 수 |
| 지연은 누적됩니다 | #10 이후 #20은 총 30을 대기합니다 |
| 합성 가능하지 않음 | 지연은 시뮬레이션 전용입니다 |
챌린지
수행할 작업:
누락된 지연 시간을 추가하여 이 코드가 "0", "10", "25", "40" 시간에 메시지를 출력하도록 만드세요.
치트 시트
Verilog에서 지연(delays)은 # 뒤에 시간 단위를 붙여 문장이 실행되는 시점을 제어합니다:
#10 a = 1; // 10 시간 단위를 대기한 후, 할당지연은 누적(cumulative)됩니다 — 각 지연은 현재 시간에 더해집니다:
initial begin
a = 0; // 시간 0
#10 a = 1; // 시간 10
#5 a = 0; // 시간 15
end클락을 생성하기 위해 always 블록에서 사용합니다:
always #5 clk = ~clk; // 5 단위마다 토글참고: 지연은 시뮬레이션 전용이며, 합성(synthesis)은 불가능합니다.
직접 해보기
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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.