時間単位の設定
シミュレータは暗黙の時刻変数を持っており、Verilog記述上は時間経過を待つ文 #(時間)で使われる。この時刻変数(正の整数)と実際の時間(実数s/ms/us/ns/ps/fs)の対応づけをテストベンチの先頭(moduleの前)で指定する。
`timescale 1ns/1ps // 単位/精度 このとき #(10) 文; は10nsたったら文を実行 #(10/3) 文;は3.333nsたったら文を実行 という意味になる |
数字は1,10,100が指定できるが、例えば1ns/10psと精度を粗くしてもシミュレーション速度はあまり速くならないので、わかりやすい値にする方がよい。
◇
時刻変数の現在値は$timeで参照できる。これはただの整数値なので、時刻を表示するときは$timeformat()で指定するとよい。
`timescale 1ns/1psのとき repeat(3) #(1) $display("--(%t)",$time); と1nsごとに時刻変数を表示すると --( 1000) --( 2000) --( 3000) と、ただの整数値で表示されてわかりにくい。そこで 精度10-6秒,小数部3桁,文字列”us"をつける,表示幅は全10文字 $timeformat(-6,3," us",10); // "000.000 us" と指定した後に実行すると --( 0.001 us) --( 0.002 us) --( 0.003 us) と表示される。 |
整数値の$timeの代わりに実数値に直した$realtimeもある。
// pulse信号の幅を表示する real start_time,end_time; @(posedge pulse) start_time = $realtime; @(negedge pulse) end_time = $realtime; $display("pulse_width = %f ns",(end_time - start_time)); |