Teknik Simulasi Verilog untuk Verifikasi RTL yang Handal
Verilog adalah bahasa deskripsi perangkat keras dan tidak ada persyaratan untuk desainer untuk mensimulasikan desain RTL mereka agar dapat mengonversinya menjadi gerbang logika. Jadi apa kebutuhan untuk mensimulasikan?
Simulasi adalah teknik untuk memberikan berbagai stimulus input ke desain pada waktu yang berbeda untuk memeriksa apakah kode RTL berperilaku sesuai yang diinginkan. Pada dasarnya, simulasi adalah teknik yang umum diikuti untuk memverifikasi keandalan desain. Ini juga mirip dengan bagaimana chip yang dibuat akan digunakan di dunia nyata dan bagaimana bereaksi terhadap berbagai input.
Misalnya, desain di atas mewakili detektor tepi positif dengan input clock dan signal yang dievaluasi pada interval berkala untuk menemukan output pe seperti yang ditunjukkan. Simulasi memungkinkan kita untuk melihat diagram waktu sinyal terkait untuk memahami bagaimana deskripsi desain dalam Verilog sebenarnya berperilaku.
Ada beberapa perusahaan EDA yang mengembangkan simulator yang mampu menentukan output untuk berbagai input ke desain. Verilog didefinisikan dalam bentuk model eksekusi discrete event dan simulator berbeda bebas menggunakan algoritma yang berbeda untuk memberikan pengguna serangkaian hasil yang konsisten. Kode Verilog dibagi menjadi beberapa proses dan thread dan mungkin dievaluasi pada waktu yang berbeda selama simulasi, yang akan dibahas nanti.
Contoh
Testbench yang disebut tb adalah wadah untuk menampung modul desain. Namun, dalam contoh ini kami tidak menggunakan instance desain apa pun. Terdapat dua variabel atau sinyal yang dapat ditugaskan nilai tertentu pada waktu tertentu. clk mewakili clock yang dihasilkan dalam testbench. Ini dilakukan oleh pernyataan always dengan bergantinya nilai clock setelah setiap 5ns. Blok initial berisi serangkaian pernyataan yang menugaskan nilai yang berbeda pada kedua sinyal pada waktu yang berbeda.
module tb;
reg clk;
reg sig;
// Clock generation
// Process starts at time 0ns and loops after every 5ns
always #5 clk = ~clk;
// Initial block : Process starts at time 0ns
initial begin
// This system task will print out the signal values everytime they change
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Also called stimulus, we simply assign different values to the variables
// after some simulation "delay"
sig = 0;
#5 clk = 0; // Assign clk to 0 at time 5ns
#15 sig = 1; // Assign sig to 1 at time 20ns (#5 + #15)
#20 sig = 0; // Assign sig to 0 at time 40ns (#5 + #15 + #20)
#15 sig = 1; // Assign sig to 1 at time 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Assign sig to 0 at time 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Finish simulation at time 85ns
end
endmodule
Simulator memberikan output berikut setelah eksekusi testbench di atas.
Log Simulasi
ncsim> run
Time = 0 clk = x sig = 0
Time = 5 clk = 0 sig = 0
Time = 10 clk = 1 sig = 0
Time = 15 clk = 0 sig = 0
Time = 20 clk = 1 sig = 1
Time = 25 clk = 0 sig = 1
Time = 30 clk = 1 sig = 1
Time = 35 clk = 0 sig = 1
Time = 40 clk = 1 sig = 0
Time = 45 clk = 0 sig = 0
Time = 50 clk = 1 sig = 0
Time = 55 clk = 0 sig = 1
Time = 60 clk = 1 sig = 1
Time = 65 clk = 0 sig = 0
Time = 70 clk = 1 sig = 0
Time = 75 clk = 0 sig = 0
Time = 80 clk = 1 sig = 0
Simulation complete via $finish(1) at time 85 NS + 0
Apa itu gelombang simulasi?
Simulasi memungkinkan kami untuk menimpa sinyal desain dan testbench ke dalam gelombang yang dapat direpresentasikan secara grafis untuk menganalisis dan men-debug fungsionalitas desain RTL. Gelombang yang ditunjukkan di bawah ini diperoleh dari alat EDA dan menunjukkan perkembangan setiap sinyal terhadap waktu dan sama dengan diagram waktu yang ditunjukkan sebelumnya.
Setiap perubahan nilai variabel atau jaringan disebut update event. Dan proses sensitif terhadap update events sehingga proses ini dievaluasi setiap kali update event terjadi dan disebut evaluation event. Karena kemungkinan adanya beberapa proses yang dievaluasi secara sembarangan, urutan perubahan harus dilacak dalam sesuatu yang disebut event queue.
Secara alami, mereka diurutkan berdasarkan waktu simulasi. Penempatan peristiwa baru pada antrian disebut scheduling. Waktu simulasi digunakan untuk merujuk pada nilai waktu yang dipertahankan oleh simulator untuk memodelkan waktu aktual yang dibutuhkan oleh rangkaian yang disimulasikan. Nilai waktu untuk contoh di atas ditampilkan dalam nanodetik ns dalam diagram waktu.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c;
// abc is updated via the assign statement (process) whenever a, b or c change -> update event
endmodule
Segarkan Verilog dan lihat contoh !
Wilayah dalam event queue
Antrian peristiwa Verilog secara logis dibagi menjadi lima wilayah, dan peristiwa dapat ditambahkan ke salah satunya. Namun, dapat dihapus hanya dari wilayah active.
Events
Description
Active
Terjadi pada waktu simulasi saat ini, dan dapat diproses dalam urutan apa pun
Inactive
Terjadi pada waktu simulasi saat ini, tetapi diproses setelah semua active events selesai
Nonblocking
Dievaluasi pada waktu sebelumnya, tetapi penugasan dilakukan pada waktu simulasi saat ini setelah active dan inactive events selesai
Monitor
Diproses setelah semua active, inactive dan non-blocking events selesai
Future
Terjadi pada waktu simulasi di masa depan
Siklus simulasi adalah tempat semua active events diproses. Standar menjamin urutan penjadwalan tertentu kecuali beberapa kasus. Misalnya, pernyataan di dalam blok begin-end hanya akan dieksekusi dalam urutan yang muncul.
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin
// Statements are executed one after the other at appropriate simulation times
a = 5; // At time 0ns, a is assigned 5
b = 2; // In the same simulation step (time 0ns), b is assigned 2
#10 a = 7; // When simulation advances to 10ns, a is assigned 7
end
endmodule
Event queue menentukan bahwa penugasan ke b harus terjadi setelah penugasan ke a.