Verilog
Verilog (IEEE 1800) adalah bahasa deskripsi perangkat keras yang digunakan untuk merancang, mensimulasikan, dan memverifikasi rangkaian digital. Dengan Verilog, perilaku dan struktur sebuah rangkaian dapat dituliskan dalam bentuk kode teks sebelum diwujudkan ke perangkat keras sesungguhnya.
Alat Praktik
Dua perangkat lunak utama yang dipakai dalam praktik adalah Icarus Verilog dan GTKWave. Icarus Verilog bertugas mengompilasi kode desain dan testbench, lalu menjalankan simulasi serta menampilkan hasilnya dalam bentuk teks di terminal. GTKWave membaca berkas hasil simulasi berformat VCD (Value Change Dump) dan menampilkannya sebagai diagram waktu sehingga perubahan sinyal dapat dianalisis secara visual. Untuk mendapatkan diagram gerbang dari kode Verilog, dapat digunakan alat bantu seperti Yosys yang melakukan sintesis menjadi netlist, lalu netlistsvg yang mengubah netlist tersebut menjadi gambar diagram skematik.
Tingkat Abstraksi Desain
Sebuah rangkaian dapat dinyatakan dalam empat tingkat abstraksi. Berikut penjelasan masing-masing menggunakan inverter (gerbang NOT) sebagai contoh.
Switch-level adalah representasi paling dekat dengan perangkat keras. Inverter dibangun langsung dari transistor PMOS dan NMOS. supply1 (VDD) dan supply0 (GND) menjadi referensi tegangan. Saat masukan rendah, PMOS menghubungkan keluaran ke VDD; saat masukan tinggi, NMOS menarik keluaran ke GND. Model ini lazim dipakai dalam perancangan VLSI.
module inverter_switch (
input logic in,
output logic out
);
supply1 vdd;
supply0 gnd;
pmos p1 (out, vdd, in);
nmos n1 (out, gnd, in);
endmodule
Gate-level meninggalkan transistor, menggunakan gerbang logika primitif bawaan seperti not. Perancang cukup menyambungkan gerbang tanpa memerhatikan struktur di bawahnya. Inverter gate-level hanya memerlukan satu gerbang not.
module inverter_gate (
input logic in,
output logic out
);
not g1 (out, in);
endmodule
Dataflow menitikberatkan aliran data melalui persamaan boolean. Kata kunci assign menciptakan penugasan kontinu sehingga out selalu merupakan kebalikan in. Model ini cocok untuk rangkaian kombinasional yang rumusnya sederhana dan jelas.
module inverter_dataflow (
input logic in,
output logic out
);
assign out = ~in;
endmodule
Behavioral adalah abstraksi tertinggi, hanya menjabarkan perilaku tanpa menyentuh implementasi fisik. Blok always_comb otomatis dievaluasi setiap kali sinyal yang dibaca berubah. Inverter dijelaskan dengan logika if-else: jika masukan 1 maka keluaran 0, dan sebaliknya.
module inverter_behavioral (
input logic in,
output logic out
);
always_comb begin
if (in)
out = 1'b0;
else
out = 1'b1;
end
endmodule
Simulasi dan Verifikasi
Simulasi adalah proses menguji desain dengan memberikan rangsangan dan mengamati keluarannya. Pengujian dilakukan melalui modul terpisah yang disebut testbench. Testbench membangkitkan sinyal masukan, menghubungkannya ke modul yang diuji, dan menjalankan skenario pengujian.
Berikut testbench untuk inverter gate-level. Sinyal masuk dan keluar dideklarasikan bertipe logic. Modul inverter_gate diinstansiasi dengan nama alat_saya, port .in dan .out disambungkan ke masuk serta keluar. Blok initial mengendalikan simulasi: $monitor mencetak setiap perubahan sinyal ke terminal, lalu masuk diberi 0 ditahan 10 satuan waktu, diubah menjadi 1, dan simulasi diakhiri dengan $finish. Agar hasil simulasi dapat dilihat sebagai diagram waktu, ditambahkan $dumpfile untuk menentukan nama berkas VCD dan $dumpvars untuk merekam semua sinyal.
module tb_inverter_gate;
logic masuk, keluar;
inverter_gate alat_saya (
.in(masuk),
.out(keluar)
);
initial begin
$dumpfile("inverter.vcd");
$dumpvars(0, tb_inverter_gate);
$monitor("Input: %b | Output: %b", masuk, keluar);
masuk = 0; #10;
masuk = 1; #10;
$finish;
end
endmodule
Hasil simulasi di terminal menampilkan dua baris yang menegaskan fungsi inverter: masukan 0 menghasilkan keluaran 1, masukan 1 menghasilkan keluaran 0.
Input: 0 | Output: 1
Input: 1 | Output: 0