Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

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.

KarakterSatuan
sdetik
msmilidetik
usmikrodetik
nsnanodetik
pspikodetik
fsfemtodetik

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.

Verilog

  1. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  2. Menguasai Konkatenasi Verilog: Panduan Praktis
  3. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  4. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  5. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  6. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
  7. Memahami Semantik Jadwal Verilog: Waktu, Peristiwa, dan Urutan Eksekusi
  8. Generator Jam Verilog: Panduan Desain dan Implementasi
  9. Menguasai Fungsi Matematika Verilog untuk Desain Perangkat Keras yang Efisien
  10. Menguasai $timeformat Verilog: Kontrol Presisi dan Tampilan