time_unit은 지연과 시뮬레이션 시간의 측정 단위이며, time_precision은 시뮬레이션에서 사용되기 전 지연 값이 어떻게 반올림되는지 지정합니다.
동일 설계에서 다른 시간 단위를 사용하려면 다음 timescale 구조를 사용하세요. 설계의 지연 사양은 합성 가능하지 않으며 하드웨어 로직으로 변환될 수 없음을 기억하세요.
`timescale: 시간 측정 기본 단위와 정밀도
$printtimescale 시스템 태스크: 시간 단위와 정밀도 표시
$time과 $realtime 시스템 함수: 현재 시간 반환, 기본 보고 형식은 $timeformat 시스템 태스크로 변경 가능
문자
단위
s
초
ms
밀리초
us
마이크로초
ns
나노초
ps
피코초
fs
펨토초
이 사양의 정수는 1, 10, 100 중 하나일 수 있으며, 단위를 지정하는 문자열은 위 표의 어떤 값이든 취할 수 있습니다.
예제 #1: 1ns/1ns
// time_unit은 1ns, time_precision도 1ns인 timescale 선언
`timescale 1ns/1ns
module tb;
// timescale 효과를 이해하기 위해 신호를 지연 후 값으로 구동
reg val;
initial begin
// 시간 0 단위에서 신호를 0으로 초기화
val <= 0;
// 1 타임 유닛 진행, 메시지 표시, val 토글
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
// 0.49 타임 유닛 진행, val 토글
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
// 정확히 절반 타임 유닛 #0.5 진행, val 토글
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
// 절반보다 큰 0.51 타임 유닛 진행, val 토글
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
// 5 타임 유닛 더 실행 후 종료
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
첫 번째 지연 문은 #1을 사용하여 시뮬레이터가 정확히 1 타임 유닛(1ns) 대기하게 합니다. 두 번째 지연 문은 0.49를 사용하는데 이는 절반 타임 유닛보다 작습니다. 그러나 시간 정밀도가 1ns로 지정되어 시뮬레이터가 1ns보다 작게 갈 수 없어 주어진 지연 문을 반올림하여 0ns가 됩니다. 따라서 두 번째 지연은 시뮬레이션 시간을 진행시키지 못합니다.
세 번째 지연 문은 정확히 절반 타임 유닛 [hl]#0.5[/lh]를 사용하고 다시 시뮬레이터가 값을 반올림하여 #1(한 전체 타임 유닛)이 됩니다. 따라서 T=2ns에 출력됩니다.
네 번째 지연 문은 절반보다 큰 값을 사용하여 역시 반올림되어 T=3ns에 출력됩니다.
시뮬레이션 로그
ncsim> run
T=1 At time #1
T=1 At time #0.49
T=2 At time #0.50
T=3 At time #0.51
T=8 End of simulation
ncsim: *W,RNQUIE: Simulation is complete.
시뮬레이션은 예상대로 8ns 실행되지만, 파형에 각 나노초 사이의 더 작은 구분이 없음에 주목하세요. 이는 시간 정밀도가 시간 단위와 같기 때문입니다.
예제 #2: 10ns/1ns
이 예제에서 이전 예제와 유일한 차이는 timescale이 1ns/1ns에서 10ns/1ns로 변경되었다는 것입니다. 시간 단위는 10ns이고 정밀도는 1ns입니다.
// time_unit은 10ns, time_precision은 1ns인 timescale 선언
`timescale 10ns/1ns
// 테스트벤치는 이전 예제와 동일
module tb;
reg val;
initial begin
val <= 0;
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
실제 시뮬레이션 시간은 #로 지정된 지연에 시간 단위를 곱한 후 정밀도에 따라 반올림하여 얻습니다. 첫 번째 지연 문은 10ns가 되고, 두 번째는 14.9ns가 되어 15ns로 반올림됩니다.
세 번째 문장도 비슷하게 5ns(0.5 * 10ns)를 더해 총 20ns가 됩니다. 네 번째는 5ns(0.51 * 10)를 더해 총 25ns로 진행됩니다.
시뮬레이션 로그
ncsim> run
T=10 At time #1
T=15 At time #0.49
T=20 At time #0.50
T=25 At time #0.51
T=75 End of simulation
ncsim: *W,RNQUIE: Simulation is complete.
파형의 기본 단위가 10나노초 단위이며 정밀도는 1ns임을 알 수 있습니다.
예제 #3: 1ns/1ps
이 예제에서 유일한 변화는 timescale이 1ns/1ns에서 1ns/1ps로 변경되었다는 것입니다. 시간 단위는 1ns이고 정밀도는 1ps입니다.
// time_unit은 1ns, time_precision은 1ps인 timescale 선언
`timescale 1ns/1ps
// 테스트벤치는 이전 예제와 동일
module tb;
reg val;
initial begin
val <= 0;
#1 $display ("T=%0t At time #1", $realtime); val <= 1;
#0.49 $display ("T=%0t At time #0.49", $realtime); val <= 0;
#0.50 $display ("T=%0t At time #0.50", $realtime); val <= 1;
#0.51 $display ("T=%0t At time #0.51", $realtime); val <= 0;
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
시간 단위가 새로운 정밀도 값인 1ps에 맞춰 스케일링됨을 볼 수 있습니다. 또한 시간이 가장 작은 해상도인 피코초로 표현됨을 알 수 있습니다.
시뮬레이션 로그
ncsim> run
T=1000 At time #1
T=1490 At time #0.49
T=1990 At time #0.50
T=2500 At time #0.51
T=7500 End of simulation
ncsim: *W,RNQUIE: Simulation is complete.