Menguasai Timescale Verilog: Satuan, Presisi, dan Waktu Simulasi yang Akurat
Simulasi Verilog bergantung pada bagaimana waktu didefinisikan karena simulator perlu mengetahui apa arti #1 dalam hal waktu. Direktif kompiler `timescale menentukan satuan waktu dan presisi untuk modul-modul yang mengikutinya.
Sintaks
`timescale <time_unit>/<time_precision>
// Example
`timescale 1ns/1ps
`timescale 10us/100ns
`timescale 10ns/1ns
time_unit adalah pengukuran penundaan dan waktu simulasi sementara time_precision menentukan cara pembulatan nilai penundaan sebelum digunakan dalam simulasi.
Gunakan konstruk timescale berikut untuk menggunakan satuan waktu yang berbeda dalam desain yang sama. Perhatikan bahwa spesifikasi penundaan dalam desain tidak dapat disintesis dan tidak dapat dikonversi ke logika perangkat keras.
`timescale untuk satuan pengukuran dasar dan presisi waktu
Tugas sistem $printtimescale untuk menampilkan satuan waktu dan presisi
Fungsi sistem $time dan $realtime mengembalikan waktu saat ini dan format pelaporan default dapat diubah dengan tugas sistem lain $timeformat.
Karakter
Satuan
s
detik
ms
milidetik
us
mikrodetik
ns
nanodetik
ps
pikodetik
fs
femtodetik
Bilangan bulat dalam spesifikasi ini dapat berupa 1, 10 atau 100 dan string karakter yang menentukan satuan dapat mengambil nilai apa pun yang disebutkan dalam tabel di atas.
Contoh #1: 1ns/1ns
// Deklarasikan timescale di mana time_unit adalah 1ns
// dan time_precision juga 1ns
`timescale 1ns/1ns
module tb;
// Untuk memahami efek timescale, mari kita
// dorong sinyal dengan beberapa nilai setelah beberapa penundaan
reg val;
initial begin
// Inisialisasi sinyal ke 0 pada waktu 0 unit
val <= 0;
// Maju 1 satuan waktu, tampilkan pesan dan balik val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Maju 0.49 satuan waktu dan balik val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Maju 0.50 satuan waktu dan balik val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Maju 0.51 satuan waktu dan balik val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Biarkan simulasi berjalan selama 5 satuan waktu lagi dan keluar
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Pernyataan penundaan pertama menggunakan #1 yang membuat simulator menunggu tepat 1 satuan waktu yang ditentukan sebagai 1ns dengan direktif `timescale. Pernyataan penundaan kedua menggunakan 0.49 yang kurang dari setengah satuan waktu. Namun presisi waktu ditentukan sebagai 1ns dan oleh karena itu simulator tidak dapat lebih kecil dari 1 ns yang membuatnya membulatkan pernyataan penundaan yang diberikan dan menghasilkan 0ns. Jadi penundaan kedua gagal memajukan waktu simulasi.
Pernyataan penundaan ketiga menggunakan tepat setengah satuan waktu [hl]#0.5[/lh] dan lagi simulator akan membulatkan nilai menjadi #1 yang mewakili satu satuan waktu penuh. Jadi ini dicetak pada T=2ns.
Pernyataan penundaan keempat menggunakan nilai lebih dari setengah satuan waktu dan juga dibulatkan sehingga pernyataan display dicetak pada T=3ns.
Log Simulasi
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.
Simulasi berjalan selama 8ns seperti yang diharapkan, namun perhatikan bahwa gelombang tidak memiliki pembagian yang lebih kecil di antara setiap nanodetik. Ini karena presisi waktu sama dengan satuan waktu.
Contoh #2: 10ns/1ns
Perubahan satu-satunya yang dilakukan dalam contoh ini dibandingkan dengan contoh sebelumnya adalah timescale telah diubah dari 1ns/1ns menjadi 10ns/1ns. Jadi satuan waktu adalah 10ns dan presisi adalah 1ns.
// Deklarasikan timescale di mana time_unit adalah 10ns
// dan time_precision adalah 1ns
`timescale 10ns/1ns
// NOTE: Testbench sama dengan contoh sebelumnya
module tb;
// Untuk memahami efek timescale, mari kita
// dorong sinyal dengan beberapa nilai setelah beberapa penundaan
reg val;
initial begin
// Inisialisasi sinyal ke 0 pada waktu 0 unit
val <= 0;
// Maju 1 satuan waktu, tampilkan pesan dan balik val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Maju 0.49 satuan waktu dan balik val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Maju 0.50 satuan waktu dan balik val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Maju 0.51 satuan waktu dan balik val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Biarkan simulasi berjalan selama 5 satuan waktu lagi dan keluar
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Waktu simulasi aktual diperoleh dengan mengalikan penundaan yang ditentukan menggunakan # dengan satuan waktu dan kemudian dibulatkan berdasarkan presisi. Pernyataan penundaan pertama akan menghasilkan 10ns dan yang kedua menghasilkan 14.9 yang dibulatkan menjadi 15ns.
Pernyataan ketiga sama menambahkan 5ns (0.5 * 10ns) dan total waktu menjadi 20ns. Yang keempat menambahkan 5ns lagi (0.51 * 10) untuk memajukan total waktu ke 25ns.
Log Simulasi
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.
Perhatikan bahwa satuan dasar dalam gelombang adalah dalam puluhan nanodetik dengan presisi 1ns.
Contoh #3: 1ns/1ps
Perubahan satu-satunya yang dilakukan dalam contoh ini dibandingkan dengan contoh sebelumnya adalah timescale telah diubah dari 1ns/1ns menjadi 1ns/1ps. Jadi satuan waktu adalah 1ns dan presisi adalah 1ps.
// Deklarasikan timescale di mana time_unit adalah 1ns
// dan time_precision adalah 1ps
`timescale 1ns/1ps
// NOTE: Testbench sama dengan contoh sebelumnya
module tb;
// Untuk memahami efek timescale, mari kita
// dorong sinyal dengan beberapa nilai setelah beberapa penundaan
reg val;
initial begin
// Inisialisasi sinyal ke 0 pada waktu 0 unit
val <= 0;
// Maju 1 satuan waktu, tampilkan pesan dan balik val
#1 $display ("T=%0t At time #1", $realtime);
val <= 1;
// Maju 0.49 satuan waktu dan balik val
#0.49 $display ("T=%0t At time #0.49", $realtime);
val <= 0;
// Maju 0.50 satuan waktu dan balik val
#0.50 $display ("T=%0t At time #0.50", $realtime);
val <= 1;
// Maju 0.51 satuan waktu dan balik val
#0.51 $display ("T=%0t At time #0.51", $realtime);
val <= 0;
// Biarkan simulasi berjalan selama 5 satuan waktu lagi dan keluar
#5 $display ("T=%0t End of simulation", $realtime);
end
endmodule
Lihat bahwa satuan waktu diskalakan untuk mencocokkan nilai presisi baru 1ps. Juga perhatikan bahwa waktu direpresentasikan dalam resolusi terkecil yang dalam hal ini adalah pikodetik.
Log Simulasi
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.