Menguasai Sintaks Verilog: Aturan Kunci & Praktik Terbaik
Konvensi leksikal dalam Verilog mirip dengan C dalam arti bahwa itu berisi aliran token. Sebuah token leksikal mungkin terdiri dari satu atau lebih karakter dan token dapat berupa komentar, kata kunci, angka, string, atau spasi putih. Semua baris harus diakhiri dengan titik koma ;.
Verilog bersifat case-sensitive, jadi var_a dan var_A berbeda.
Komentar
Ada dua cara untuk menulis komentar dalam Verilog.
Komentar satu baris dimulai dengan // dan memberitahu kompiler Verilog untuk memperlakukan semua setelah titik ini hingga akhir baris sebagai komentar.
Komentar beberapa baris dimulai dengan /* dan diakhiri dengan */ dan tidak dapat bersarang.
Namun, komentar satu baris dapat bersarang dalam komentar beberapa baris.
// Ini adalah komentar satu baris integer a; // Membuat variabel int bernama a, dan memperlakukan semua ke kanan // sebagai komentar /* Ini adalah komentar beberapa baris atau blok komentar */ /* Ini adalah /* komentar blok bersarang yang tidak valid */ */ /* Namun, // ini satu adalah oke */ // Ini juga oke ///////////// Masih oke
Spasi Putih
Spasi putih adalah istilah yang digunakan untuk mewakili karakter spasi, tab, newline, dan formfeed, dan biasanya diabaikan oleh Verilog kecuali ketika memisahkan token. Faktanya, ini membantu dalam indentasi kode untuk membuatnya lebih mudah dibaca.
module dut; // 'module' adalah kata kunci, // 'dut' adalah pengidentifikasi reg [8*6:1] name = "Hello!"; // 2 spasi di awal diabaikan
Namun spasi (spasi) dan tab (dari kunci TAB) tidak diabaikan dalam string. Dalam contoh di bawah ini, variabel string bernama addr mendapatkan nilai "Earth " karena pelestarian spasi dalam string.
// Tidak ada spasi di awal baris ini, // tapi ada spasi dalam string reg [8*6:1] addr = "Earth "; endmodule
Operator
Ada tiga jenis operator: unary, binary, dan ternary atau kondisional.
Operator unary harus muncul di sisi kiri operandnya
Operator binary harus muncul di antara operandnya
Operator kondisional memiliki dua operator terpisah yang memisahkan tiga operand
x = ~y; // ~ adalah operator unary, dan y adalah operand x = y | z; // | adalah operator binary, di mana y dan z adalah operandnya x = (y > 5) ? w : z; // ?: adalah operator ternary, dan ekspresi (y>5), w dan z adalah operandnya
Jika ekspresi (y > 5) benar, maka variabel x akan mendapatkan nilai di w, jika tidak nilai di z.
Format Angka
Kami paling familiar dengan angka yang direpresentasikan sebagai desimal. Namun, angka juga dapat direpresentasikan dalam biner, oktal dan heksadesimal. Secara default, simulator Verilog memperlakukan angka sebagai desimal. Untuk merepresentasikannya dalam radix yang berbeda, aturan tertentu harus diikuti.
16 // Angka 16 dalam desimal 0x10 // Angka 16 dalam heksadesimal 10000 // Angka 16 dalam biner 20 // Angka 16 dalam oktal
Sized
Angka sized direpresentasikan seperti di bawah ini, di mana size ditulis hanya dalam desimal untuk menentukan jumlah bit dalam angka.
[size]'[base_format][number]
base_format dapat berupa desimal ('d atau 'D), heksadesimal ('h atau 'H) dan oktal ('o atau 'O) dan menentukan basis mana bagian number merepresentasikan.
number ditentukan sebagai digit berurutan dari 0, 1, 2 ... 9 untuk format basis desimal dan 0, 1, 2 .. 9, A, B, C, D, E, F untuk heksadesimal.
3'b010; // size adalah 3, format basis adalah biner ('b), dan angka adalah 010 (menunjukkan nilai 2 dalam biner) 3'd2; // size adalah 3, format basis adalah desimal ('d) dan angka adalah 2 (ditentukan dalam desimal) 8'h70; // size adalah 8, format basis adalah heksadesimal ('h) dan angka adalah 0x70 (dalam heks) untuk merepresentasikan desimal 112 9'h1FA; // size adalah 9, format basis adalah heksadesimal ('h) dan angka adalah 0x1FA (dalam heks) untuk merepresentasikan desimal 506 4'hA = 4'd10 = 4'b1010 = 4'o12 // Desimal 10 dapat direpresentasikan dalam salah satu dari keempat format 8'd234 = 8'D234 // Legal untuk menggunakan huruf kecil atau besar untuk format basis 32'hFACE_47B2; // Underscore (_) dapat digunakan untuk memisahkan angka 16 bit untuk keterbacaan
Huruf besar legal untuk spesifikasi angka ketika format basis adalah heksadesimal.
16'hcafe; // huruf kecil Valid 16'hCAFE; // huruf besar Valid 32'h1D40_CAFE; // underscore dapat digunakan sebagai pemisah antara 4 huruf Valid
Unsized
Angka tanpa spesifikasi base_format adalah angka desimal secara default. Angka tanpa spesifikasi size memiliki jumlah bit default yang bergantung pada jenis simulator dan mesin.
integer a = 5423; // format basis tidak ditentukan, a mendapatkan nilai desimal 5423 integer a = 'h1AD7; // size tidak ditentukan, karena a adalah int (32 bit) nilai yang disimpan dalam a = 32'h0000_1AD7
Negatif
Angka negatif ditetapkan dengan menempatkan tanda minus - sebelum ukuran suatu angka. Ilegal untuk memiliki tanda minus di antara base_format dan number.
-6'd3; // angka negatif 8-bit disimpan sebagai two's complement dari 3 -6'sd9; // Untuk matematika bertanda 8'd-4; // Ilegal
String
Sebuah urutan karakter yang diapit oleh tanda petik ganda " " disebut string. Tidak dapat dibagi menjadi beberapa baris dan setiap karakter dalam string membutuhkan 1 byte untuk disimpan. Jika ukuran variabel lebih kecil dari string, maka Verilog memotong bit terkiri string. Jika ukuran variabel lebih besar dari string, maka Verilog menambahkan nol ke kiri string.
"Hello World!" // String dengan 12 karakter -> membutuhkan 12 byte "x + z" // String dengan 5 karakter "How are you feeling today ?" // Ilegal bagi string untuk dibagi menjadi beberapa baris
Identifikasi
Identifikasi adalah nama variabel sehingga dapat direferensi nanti. Mereka terdiri dari karakter alfanumerik [a-z][A-Z][0-9], underscore _ atau tanda dolar $ dan bersifat case sensitive. Mereka tidak dapat dimulai dengan digit atau tanda dolar.
integer var_a; // Identifikasi berisi alfabet dan underscore -> Valid integer $var_a; // Identifikasi dimulai dengan $ -> Invalid integer v$ar_a; // Identifikasi berisi alfabet dan $ -> Valid integer 2var; // Identifikasi dimulai dengan digit -> Invalid integer var23_g; // Identifikasi berisi karakter alfanumerik dan underscore -> Valid integer 23; // Identifikasi hanya berisi angka -> Invalid
Kata Kunci
Kata kunci adalah pengidentifikasi khusus yang dicadangkan untuk mendefinisikan konstruksi bahasa dan dalam huruf kecil. Daftar kata kunci penting diberikan di bawah ini.
Revisi Verilog
Verilog telah mengalami beberapa revisi selama bertahun-tahun dan lebih banyak penambahan telah dibuat dari 1995 hingga 2001 yang ditunjukkan di bawah ini.