Tipe Data Verilog: Bit, Kabel, dan Nilai Logika Dijelaskan
Tujuan utama tipe data dalam bahasa Verilog adalah untuk mewakili elemen penyimpanan data seperti bit dalam flip-flop dan elemen transmisi seperti kabel yang menghubungkan gerbang logika dan struktur sekuensial.
Nilai apa yang dipegang variabel?
Hampir semua tipe data hanya dapat memiliki salah satu dari empat nilai yang berbeda yang diberikan di bawah ini kecuali tipe data real dan event.
0
mewakili logika nol, atau kondisi palsu
1
mewakili logika satu, atau kondisi benar
x
mewakili nilai logika tidak diketahui (bisa nol atau satu)
z
mewakili keadaan high-impedance
Gambar berikut menunjukkan bagaimana nilai-nilai ini direpresentasikan dalam diagram timing dan gelombang simulasi. Sebagian besar simulator menggunakan konvensi ini di mana merah mewakili X dan oranye di tengah mewakili high-impedance atau Z.
Apa implikasi dari nilai-nilai Verilog?
Karena Verilog pada dasarnya digunakan untuk menggambarkan elemen hardware seperti flip-flop dan logika kombinasi seperti NAND dan NOR, ia harus memodelkan sistem nilai yang ditemukan dalam hardware. Logika satu akan mewakili pasokan tegangan Vdd yang dapat berkisar di mana saja antara 0.8V hingga lebih dari 3V berdasarkan node teknologi produksi. Logika nol akan mewakili ground dan hence sebuah nilai 0V.
X atau x berarti nilai tersebut tidak diketahui pada saat itu, dan bisa 0 atau 1. Ini sangat berbeda dari cara X diperlakukan dalam logika boolean, di mana ia berarti "don't care".
Seperti dengan rangkaian listrik yang tidak lengkap, kabel yang tidak terhubung ke apa pun akan memiliki high-impedance pada node tersebut dan direpresentasikan oleh Z atau z. Bahkan dalam verilog, kabel apa pun yang tidak terhubung akan menghasilkan impedansi tinggi.
Nets dan Variabel
Nets dan variabel adalah dua grup utama tipe data yang mewakili struktur hardware yang berbeda dan berbeda dalam cara mereka ditugaskan dan mempertahankan nilai.
Nets
Nets digunakan untuk menghubungkan antara entitas hardware seperti gerbang logika dan hence tidak menyimpan nilai apa pun sendiri. Dalam gambar yang ditunjukkan di bawah ini, sebuah net bernama net_11 digunakan untuk menghubungkan antara output gerbang AND ke input pertama flip-flop bernama data_0. Dengan cara yang sama, dua input gerbang AND terhubung ke net net_45 dan net_67.
Ada berbagai jenis net masing-masing dengan karakteristik yang berbeda, tetapi net yang paling populer dan banyak digunakan dalam desain digital adalah jenis wire. Sebuah wire adalah tipe data Verilog yang digunakan untuk menghubungkan elemen dan untuk menghubungkan net yang didorong oleh satu gerbang atau penugasan berkelanjutan. wire mirip dengan kabel listrik yang digunakan untuk menghubungkan dua komponen pada breadboard.
Jika ada kebutuhan untuk beberapa net, mereka dapat dikelompokkan bersama untuk membentuk satu wire. Dalam gambar yang ditunjukkan di bawah ini, kita memiliki wire 4-bit yang dapat mengirim 4 nilai terpisah pada setiap kabel. Entitas semacam itu dengan lebar lebih dari 1 disebut vektor seperti yang akan kita lihat dalam artikel berikutnya.
wire [3:0] n0; // 4-bit wire -> ini adalah vektor
Ilegal untuk mendeklarasikan ulang nama yang telah dideklarasikan oleh net, parameter, atau variabel seperti yang ditunjukkan dalam kode di bawah ini.
module design; wire abc; wire a; wire b; wire c; wire abc; // Error: Identifier "abc" sebelumnya dideklarasikan assign abc = a & b | c; endmodule
Variabel
Sebuah variabel di sisi lain adalah abstraksi dari elemen penyimpanan data dan dapat menahan nilai. Sebuah flip-flop adalah contoh yang baik dari elemen penyimpanan.
Tipe data Verilog reg dapat digunakan untuk memodelkan register hardware karena dapat menahan nilai antara penugasan. Perhatikan bahwa reg tidak selalu mewakili flip-flop karena juga dapat digunakan untuk mewakili logika kombinasi.
Dalam gambar yang ditampilkan di kiri, kita memiliki flip-flop yang dapat menyimpan 1 bit dan flip-flop di kanan dapat menyimpan 4-bit.
Tipe data lainnya
integer
Sebuah integer adalah variabel tujuan umum 32-bit yang dapat digunakan untuk tujuan lain saat memodelkan hardware dan menyimpan nilai integer.
integer count; // Count adalah nilai integer > 0
time
Variabel time adalah unsigned, 64-bit wide dan dapat digunakan untuk menyimpan kuantitas waktu simulasi untuk tujuan debugging. Variabel realtime secara sederhana menyimpan waktu sebagai kuantitas floating point.
time end_time; // end_time dapat disimpan nilai waktu seperti 50ns realtime rtime; // rtime = 40.25ps
real
Variabel real dapat menyimpan nilai floating point dan dapat ditugaskan dengan cara yang sama seperti integer dan reg.
real float; // float = 12.344 - dapat menyimpan angka floating
Contoh
module testbench; integer int_a; // Variabel integer real real_b; // Variabel real time time_c; // Variabel waktu initial begin int_a = 32'hcafe_1234; // Tetapkan nilai integer real_b = 0.1234567; // Tetapkan nilai floating point #20; // Majukan waktu simulasi sebesar 20 unit time_c = $time; // Tetapkan waktu simulasi saat ini // Sekarang cetak semua variabel menggunakan tugas sistem $display $display ("int_a = 0x%0h", int_a); $display ("real_b = %0.5f", real_b); $display ("time_c = %0t", time_c); end endmodule
String disimpan dalam reg, dan lebar variabel reg harus cukup besar untuk menampung string. Setiap karakter dalam string mewakili nilai ASCII dan membutuhkan 1 byte. Jika ukuran variabel lebih kecil dari string, maka Verilog memotong bit paling kiri string. Jika ukuran variabel lebih besar dari string, maka Verilog menambahkan nol ke kiri string.
// "Hello World" membutuhkan 11 byte reg [8*11:1] str = "Hello World"; // Variabel dapat menyimpan 11 byte, str = "Hello World" reg [8*5:1] str = "Hello World"; // Variabel hanya menyimpan 5 byte (sisa dipotong), str = "World" reg [8*20:1] str = "Hello World"; // Variabel dapat menyimpan 20 byte (sisi dikisi dengan nol), str = " Hello World"
Ini adalah contoh lengkap yang menunjukkan bagaimana tiga variabel di atas dapat disimulasikan.
Perhatikan bahwa str1 memiliki ukuran yang tepat untuk menyimpan semua 11 byte string "Hello World" dan hence seluruh string dicetak. Namun str2 hanya dapat menyimpan 5 byte dan hence 6 byte atas dipotong dan akhirnya hanya menyimpan "World". Variabel ketiga str3 lebih besar dari 11 byte dan menambahkan spasi kosong ke kiri dan hence nilai yang disimpan di dalamnya menjadi " Hello World".
Simulation Log
ncsim> run str1 = Hello World str2 = World str3 = Hello World ncsim: *W,RNQUIE: Simulasi selesai.