SoC 설계/Verilog, SystemVerilog

Verilog: timescale, delay

yztech 2021. 10. 16. 13:36
반응형

timescale

timescale은 컴파일러 지시자 중 하나로서, 컴파일러 지시자는 backward quite(`)으로 시작한다
timescale은 합성과 상관없이, 회로를 테스트하기 위한 시뮬레이션에만 영향을 준다.
timescale은 시뮬레이션시 기본적인 시간 단위를 결정하는데, 아래와 같이 설정하는경우, 기본 시뮬레이션 단위인 time unit은 1 ns이고, time precision은 1 ps 가 된다.

// usage: `timescale [time unit]/[time precision]
`timescale 1ns/1ps

timescale 관련하여 몇가지 유용한 시스템 함수들을 알아보면,
시스템 함수인 $printtimescale은 time unit과 time precision을 출력할 수 있다.
$time$realtime 함수들은 현재 시간을 $timeformat이 적용한 포맷으로 반환하는데, $time은 정수로 반올림된 시간을 반환하고, $realtime은 원래 시간을 반환한다.

timescale에 사용될 수 있는 단위들은 아래와 같다.

Character Unit
s seconds
ms miliseconds
us microseconds
ns nanoseconds
ps picoseconds
fs femtoseconds

delay

timescale의 time unit은 시뮬레이션시 time delay 의 기준이 되고, timescale의 time precision은 time delay의 해상도를 결정한다. 시뮬레이션시 # 기호를 이용하여 time delay를 주는 경우, 주어진 time delay 값과 timescale에서 정한 time unit이 곱해져서 최종 delay가 결정된다.
아래 예에서, 최종 delay는 10 * 1ns = 10 ns가 된다.

#10 q = a & b;

time precision은 time delay를 소수점으로 주는 경우, 최종 delay에 사용할 최종 자리수를 결정하는데 사용된다. 그 아래 자리수는 반올림된다. 위에서 time precision = 0.001ns이므로, 아래 예에서 최종 delay는 셋째 자리까지만 사용하여 10.007 ns가 된다.

#10.0073 q = a & b;

예제

아래 두가지 예제 코드들은, timescale만 다르지만, 실행후 실행시간을 출력한 결과는 서로 크게 다르다. 이들은 time precision이 다르게 적용되어, 코드에서 레지스터 R의 값이 변하는 시점이 달리지는 결과를 가지게 된다.

첫번째 예제인 test_timescale1ns_1ns.v 에서는 time unit과 time precision이 모두 1 ns이기 때문에, time delay는 소수점 첫째 자리에서 반올림 된다. 따라서 time delay로 설정한 #1, #1.2, #1.33, #1.444, #1.5555 는 모두 소수점 첫째 자리에서 반올림 되어, #1, #1, #1, #1, #2 가 되고, 출력된 시간은 1, 2, 3, 4, 6 ns가 된다. gtkwave 에서 확인한 waveform결과도 1, 2, 4 ns에서 값이 변하고, 6 ns에서 시뮬레이션이 종료된다.

하지만, test_timescale1ns_1ps.v 에서는 time unit은 1 ns이고, time precision이 1 ps이기 때문에, time delay는 소수점 넷째 자리에서 반올림 된다. 따라서, time delay로 설정한 #1, #1.2, #1.33, #1.444, #1.5555는 모두 소수점 넷째 자리에서 반올림 되어, #1, #1.2, #1.33, #1.444, #1.556이 되고, 출력된 시간은 ps단위로, 1000, 2200, 3530, 4974, 6530 ps가 된다. gtkwave 에서 확인한 waveform결과도 1000, 2200, 3530, 4974 ps에서 값이 변하고, 6530 ps에서 시뮬레이션이 종료된다.

// test_timescale1ns_1ns.v

`timescale 1ns/1ns

module testbench;

    initial begin
        $dumpfile("test_timescale1ns_1ns.vcd");
        $dumpvars(0,testbench);
    end

    reg     R;
    initial begin
        R <= 1'b0;
        #1         $display("%t", $realtime);
        R <= 1'b1;
        #1.2     $display("%t", $realtime);
        R <= 1'b0;
        #1.33     $display("%t", $realtime);
        R <= 1'b1;
        #1.444    $display("%t", $realtime);
        R <= 1'b0;
        #1.5555    $display("%t", $realtime);
    end

endmodule
$ iverilog -o test_timescale1ns_1ns test_timescale1ns_1ns.v 
$ vvp test_timescale1ns_1ns
VCD info: dumpfile test_timescale1ns_1ns.vcd opened for output.
                   1
                   2
                   3
                   4
                   6

 

// test_timescale1ns_1ps.v

`timescale 1ns/1ps

module testbench;

    initial begin
        $dumpfile("test_timescale1ns_1ps.vcd");
        $dumpvars(0,testbench);
    end

    reg     R;
    initial begin
        R <= 1'b0;
        #1         $display("%t", $realtime);
        R <= 1'b1;
        #1.2     $display("%t", $realtime);
        R <= 1'b0;
        #1.33     $display("%t", $realtime);
        R <= 1'b1;
        #1.444    $display("%t", $realtime);
        R <= 1'b0;
        #1.5555    $display("%t", $realtime);
    end

endmodule
$ iverilog -o test_timescale1ns_1ps test_timescale1ns_1ps.v 
$ vvp test_timescale1ns_1ps
VCD info: dumpfile test_timescale1ns_1ps.vcd opened for output.
                1000
                2200
                3530
                4974
                6530

Untitled

주의사항

time delay는 설계시 합성되거나, 실제 HW logic으로 변환되지 않으므로, 시뮬레이션에서만 사용됨을 주의한다.
많은 코드들을 포함한 design의 경우 timescale이 종종 다를 수 있다. 컴파일러는 보통 timescale이 다른 경우, warning 메시지를 출력하는데, 컴파일러마다 이러한 경고 메시지를 없애는 옵션들이 있으므로 확인이 필요하다.
만약 설계를 직접하는 경우에는, 아래와 같이 모든 파일에서 동일한 timescale을 갖도록, 헤더파일을 사용하는 것도 좋다.

`include "timescale.vh"
// timescale.vh
`timescale 1ns/1ps
반응형

'SoC 설계 > Verilog, SystemVerilog' 카테고리의 다른 글

SystemVerilog: Arrays  (0) 2023.03.10
SystemVerilog: modport  (0) 2023.03.10
SystemVerilog: Testbench  (0) 2023.02.23
SystemVerilog: 소개  (0) 2023.02.22
Verilog: Icarus Verilog, GTKwave  (0) 2021.10.16