Desain VLSI - Pengenalan Verilog
Verilog adalah HARDWARE DESCRIPTION LANGUAGE (HDL). Ini adalah bahasa yang digunakan untuk menggambarkan sistem digital seperti sakelar jaringan atau mikroprosesor atau memori atau flip-flop. Artinya, dengan menggunakan HDL kami dapat mendeskripsikan perangkat keras digital apa pun di tingkat mana pun. Desain, yang dijelaskan dalam HDL tidak bergantung pada teknologi, sangat mudah untuk mendesain dan men-debug, dan biasanya lebih berguna daripada skema, terutama untuk sirkuit besar.
Verilog mendukung desain di berbagai tingkat abstraksi. Tiga utama adalah -
- Tingkat perilaku
- Tingkat pendaftaran-transfer
- Tingkat gerbang
Tingkat perilaku
Tingkatan ini menggambarkan sistem dengan algoritma konkuren (Perilaku). Setiap algoritma berurutan, artinya terdiri dari sekumpulan instruksi yang dieksekusi satu per satu. Fungsi, tugas, dan blok adalah elemen utama. Tidak ada perhatian pada realisasi struktural desain.
Daftar − Tingkat Transfer
Desain yang menggunakan Register − Transfer Level menentukan karakteristik rangkaian yang menggunakan operasi dan transfer data antar register. Definisi modern dari kode RTL adalah "Setiap kode yang dapat disintesis disebut kode RTL".
Level Gerbang
Dalam tingkat logika, karakteristik suatu sistem dijelaskan oleh tautan logis dan properti waktunya. Semua sinyal adalah sinyal diskrit. Mereka hanya dapat memiliki nilai logika tertentu (`0 ',` 1', `X ',` Z`). Operasi yang dapat digunakan adalah logika primitif yang telah ditentukan sebelumnya (gerbang dasar). Pemodelan level gerbang mungkin bukan ide yang tepat untuk desain logika. Kode level gerbang dibuat menggunakan alat seperti alat sintesis dan netlistnya digunakan untuk simulasi level gerbang dan untuk backend.
Token Leksikal
File teks sumber bahasa Verilog adalah aliran token leksikal. Token terdiri dari satu atau lebih karakter, dan setiap karakter berada tepat di satu token.
Token leksikal dasar yang digunakan oleh Verilog HDL mirip dengan yang ada di Bahasa Pemrograman C. Verilog peka huruf besar / kecil. Semua kata kunci menggunakan huruf kecil.
Ruang Putih
Spasi putih dapat berisi karakter untuk spasi, tab, baris baru, dan umpan formulir. Karakter ini diabaikan kecuali jika berfungsi untuk memisahkan token.
Karakter spasi putih adalah Ruang kosong, Tab, Pengembalian kereta, Baris baru, dan Umpan formulir.
Komentar
Ada dua bentuk untuk mewakili komentar tersebut
- 1) Komentar baris tunggal dimulai dengan token // dan diakhiri dengan carriage return.
Mis .: // ini adalah sintaks baris tunggal
- 2) Komentar multiline dimulai dengan token / * dan diakhiri dengan token * /
Mis .: / * ini adalah Sintaks multiline * /
Angka
Anda dapat menentukan angka dalam format biner, oktal, desimal, atau heksadesimal. Angka negatif diwakili dalam angka pujian 2. Verilog memungkinkan bilangan bulat, bilangan real dan bilangan bertanda & tidak bertanda tangan.
Sintaksnya diberikan oleh - <size> <radix> <value>
Ukuran atau bilangan tidak berukuran dapat ditentukan dalam <Size> dan <radix> menentukan apakah itu biner, oktal, heksadesimal atau desimal.
Pengenal
Identifier adalah nama yang digunakan untuk mendefinisikan objek, seperti fungsi, modul atau register. Pengidentifikasi harus dimulai dengan karakter alfabet atau karakter garis bawah. Ex. A_Z, a_z, _
Pengenal adalah kombinasi dari karakter alfabet, numerik, garis bawah, dan $. Panjangnya bisa sampai 1024 karakter.
Operator
Operator adalah karakter khusus yang digunakan untuk meletakkan kondisi atau untuk mengoperasikan variabel. Ada satu, dua, dan terkadang tiga karakter yang digunakan untuk menjalankan operasi pada variabel.
Ex. >, +, ~, &! =.
Kata Kunci Verilog
Kata-kata yang memiliki arti khusus di Verilog disebut kata kunci Verilog. Misalnya assign, case, while, wire, reg, and, or, nand, and module. Mereka tidak boleh digunakan sebagai pengenal. Kata kunci Verilog juga mencakup arahan kompiler, serta tugas dan fungsi sistem.
Pemodelan Level Gerbang
Verilog memiliki primitif bawaan seperti gerbang logika, gerbang transmisi, dan sakelar. Ini jarang digunakan untuk pekerjaan desain tetapi mereka digunakan di dunia pasca sintesis untuk pemodelan sel ASIC / FPGA.
Pemodelan level gerbang menunjukkan dua properti -
Drive strength- Kekuatan gerbang keluaran ditentukan oleh kekuatan penggerak. Output terkuat jika ada koneksi langsung ke sumbernya. Kekuatan berkurang jika koneksi melalui transistor konduksi dan paling sedikit ketika terhubung melalui resistif pull-up / down. Kekuatan drive biasanya tidak ditentukan, dalam hal ini kekuatan defaultnya adalah strong1 dan strong0.
Delays- Jika penundaan tidak ditentukan, maka gerbang tidak memiliki penundaan propagasi; jika dua penundaan ditentukan, maka yang pertama mewakili penundaan naik dan yang kedua, penundaan jatuh; jika hanya satu penundaan yang ditentukan, maka naik dan turun keduanya sama. Penundaan dapat diabaikan dalam sintesis.
Gerbang Primitif
Gerbang logika dasar menggunakan satu keluaran dan banyak masukan digunakan di Verilog. GATE menggunakan salah satu kata kunci - dan, nand, atau, nor, xor, xnor untuk digunakan di Verilog untuk jumlah N masukan dan 1 keluaran.
Example:
Module gate()
Wire ot0;
Wire ot1;
Wire ot2;
Reg in0,in1,in2,in3;
Not U1(ot0,in0);
Xor U2(ot1,in1,in2,in3);
And U3(ot2, in2,in3,in0)
Primitif Gerbang Transmisi
Primitif gerbang transmisi mencakup keduanya, buffer dan inverter. Mereka memiliki masukan tunggal dan satu atau lebih keluaran. Dalam sintaks instantiasi gerbang yang ditunjukkan di bawah ini, GATE adalah singkatan dari kata kunci buf atau gerbang NOT.
Contoh: Not, buf, bufif0, bufif1, notif0, notif1
Bukan - n inverter outout
Buf - penyangga keluaran
Bufifo - buffer tristate, aktif rendah aktif
Bufif1 - buffer tristate, aktif tinggi aktif
Notifo - inverter tristate, aktif rendah aktif
Notif1 - inverter tristate, aktif tinggi aktif
Example:
Module gate()
Wire out0;
Wire out1;
Reg in0,in1;
Not U1(out0,in0);
Buf U2(out0,in0);
Jenis Data
Nilai Set
Verilog terutama terdiri dari empat nilai dasar. Semua tipe data Verilog, yang digunakan di Verilog menyimpan nilai-nilai ini -
0 (logika nol, atau kondisi salah)
1 (logika satu, atau kondisi benar)
x (nilai logika tidak diketahui)
z (status impedansi tinggi)
penggunaan x dan z sangat terbatas untuk sintesis.
Kawat
Kawat digunakan untuk mewakili kawat fisik dalam suatu rangkaian dan digunakan untuk koneksi gerbang atau modul. Nilai kabel hanya dapat dibaca dan tidak ditetapkan dalam fungsi atau blok. Sebuah kabel tidak dapat menyimpan nilai tetapi selalu didorong oleh pernyataan penugasan berkelanjutan atau dengan menghubungkan kabel ke keluaran dari sebuah gerbang / modul. Jenis kabel khusus lainnya adalah -
Wand (wired-AND) - di sini nilai Wand bergantung pada logika AND dari semua driver perangkat yang terhubung dengannya.
Wor (wired-OR) - di sini nilai Wor bergantung pada OR logis dari semua driver perangkat yang terhubung dengannya.
Tri (three-state) - disini semua driver yang terhubung ke tri harus z, kecuali hanya satu (yang menentukan nilai tri).
Example:
Wire [msb:lsb] wire_variable_list;
Wirec // simple wire
Wand d;
Assign d = a; // value of d is the logical AND of
Assign d = b; // a and b
Wire [9:0] A; // a cable (vector) of 10 wires.
Wand [msb:lsb] wand_variable_list;
Wor [msb:lsb] wor_variable_list;
Tri [msb:lsb] tri_variable_list;
Daftar
Reg (register) adalah objek data, yang menyimpan nilai dari satu tugas prosedural ke yang berikutnya dan hanya digunakan dalam fungsi dan blok prosedural yang berbeda. Reg adalah Verilog sederhana, register tipe variabel dan tidak dapat menyiratkan register fisik. Pada register multi-bit, data disimpan dalam bentuk unsigned number dan tidak digunakan extension sign.
Contoh -
reg c; // variabel register 1-bit tunggal
reg [5: 0] permata; // vektor 6-bit;
reg [6: 0] d, e; // dua variabel 7-bit
Masukan, Keluaran, Masuk
Kata kunci ini digunakan untuk mendeklarasikan port input, output, dan dua arah dari tugas atau modul. Disini port input dan inout, yang bertipe wire dan port output dikonfigurasi menjadi wire, reg, wand, wor atau tri type. Selalu, defaultnya adalah tipe kabel.
Example
Module sample(a, c, b, d);
Input c; // An input where wire is used.
Output a, b; // Two outputs where wire is used.
Output [2:0] d; /* A three-bit output. One must declare type in a separate statement. */
reg [1:0] a; // The above ‘a’ port is for declaration in reg.
Bilangan bulat
Bilangan bulat digunakan dalam variabel tujuan umum. Mereka digunakan terutama di loop-indikasi, konstanta, dan parameter. Mereka adalah tipe data tipe 'reg'. Mereka menyimpan data sebagai nomor yang ditandatangani sedangkan jenis reg yang dideklarasikan secara eksplisit menyimpannya sebagai data yang tidak ditandatangani. Jika integer tidak ditentukan pada saat kompilasi, maka ukuran defaultnya adalah 32 bit.
Jika integer memiliki konstanta, penyintesis menyesuaikannya dengan lebar minimum yang diperlukan pada saat kompilasi.
Example
Integer c; // single 32-bit integer
Assign a = 63; // 63 defaults to a 7-bit variable.
Pasokan0, Pasokan1
Supply0 mendefinisikan kabel yang diikat ke logika 0 (ground) dan supply1 mendefinisikan kabel yang diikat ke logika 1 (power).
Example
supply0 logic_0_wires;
supply0 gnd1; // equivalent to a wire assigned as 0
supply1 logic_1_wires;
supply1 c, s;
Waktu
Waktu adalah besaran 64-bit yang dapat digunakan bersama dengan tugas sistem waktu $ untuk menahan waktu simulasi. Waktu tidak didukung untuk sintesis dan karenanya hanya digunakan untuk tujuan simulasi.
Example
time time_variable_list;
time c;
c = $time; //c = current simulation time
Parameter
Parameter mendefinisikan konstanta yang dapat disetel saat Anda menggunakan modul, yang memungkinkan penyesuaian modul selama proses pembuatan instance.
Example
Parameter add = 3’b010, sub = 2’b11;
Parameter n = 3;
Parameter [2:0] param2 = 3’b110;
reg [n-1:0] jam; /* A 3-bit register with length of n or above. */
always @(z)
y = {{(add - sub){z}};
if (z)
begin
state = param2[1];
else
state = param2[2];
end
Operator
Operator Aritmatika
Operator ini melakukan operasi aritmatika. Tanda + dan −digunakan sebagai operator uner (x) atau biner (z − y).
Operator yang termasuk dalam operasi aritmatika adalah -
+ (penambahan), - (pengurangan), * (perkalian), / (pembagian),% (modulus)
Example -
parameter v = 5;
reg[3:0] b, d, h, i, count;
h = b + d;
i = d - v;
cnt = (cnt +1)%16; //Can count 0 thru 15.
Operator Relasional
Operator ini membandingkan dua operan dan mengembalikan hasilnya dalam satu bit, 1 atau 0.
Variabel wire dan reg bertanda positif. Jadi (−3'd001) = = 3'd111 dan (−3b001)> 3b110.
Operator yang termasuk dalam operasi relasional adalah -
- == (sama dengan)
- ! = (tidak sama dengan)
- > (lebih dari)
- > = (lebih besar dari atau sama dengan)
- <(kurang dari)
- <= (kurang dari atau sama dengan)
Example
if (z = = y) c = 1;
else c = 0; // Compare in 2’s compliment; d>b
reg [3:0] d,b;
if (d[3]= = b[3]) d[2:0] > b[2:0];
else b[3];
Equivalent Statement
e = (z == y);
Operator yang Bijaksana
Operator bit-bijaksana yang melakukan perbandingan bit-demi-bit antara dua operan.
Operator yang termasuk dalam operasi Bit bijaksana adalah -
- & (bitwise AND)
- | (bitwiseOR)
- ~ (TIDAK bitwise)
- ^ (XOR bitwise)
- ~ ^ atau ^ ~ (bitwise XNOR)
Example
module and2 (d, b, c);
input [1:0] d, b;
output [1:0] c;
assign c = d & b;
end module
Operator Logis
Operator logika adalah operator yang bijak dan hanya digunakan untuk operan bit tunggal. Mereka mengembalikan nilai bit tunggal, 0 atau 1. Mereka dapat bekerja pada bilangan bulat atau sekelompok bit, ekspresi dan memperlakukan semua nilai bukan nol sebagai 1. Operator logika umumnya, digunakan dalam pernyataan bersyarat karena mereka bekerja dengan ekspresi.
Operator yang termasuk dalam operasi Logical adalah -
- ! (logika NOT)
- && (logis AND)
- || (logis ATAU)
Example
wire[7:0] a, b, c; // a, b and c are multibit variables.
reg x;
if ((a == b) && (c)) x = 1; //x = 1 if a equals b, and c is nonzero.
else x = !a; // x =0 if a is anything but zero.
Operator Pengurangan
Operator reduksi adalah bentuk unary dari operator bitwise dan beroperasi pada semua bit vektor operan. Ini juga mengembalikan nilai bit tunggal.
Operator yang termasuk dalam operasi Reduction adalah -
- & (pengurangan AND)
- | (pengurangan ATAU)
- ~ & (pengurangan NAND)
- ~ | (pengurangan NOR)
- ^ (pengurangan XOR)
- ~ ^ atau ^ ~ (pengurangan XNOR)
Example
Module chk_zero (x, z);
Input [2:0] x;
Output z;
Assign z = & x; // Reduction AND
End module
Operator Shift
Operator shift, yang menggeser operan pertama dengan jumlah bit yang ditentukan oleh operan kedua dalam sintaks. Posisi kosong diisi dengan angka nol untuk kedua arah, shift kiri dan kanan (Tidak ada ekstensi rambu).
Operator yang termasuk dalam operasi Shift adalah -
- << (geser kiri)
- >> (geser ke kanan)
Example
Assign z = c << 3; /* z = c shifted left 3 bits;
Posisi kosong diisi dengan 0 * /
Operator Penggabungan
Operator penggabungan menggabungkan dua atau lebih operan untuk membentuk vektor yang lebih besar.
Operator yang termasuk dalam operasi Concatenation adalah - {} (concatenation)
Example
wire [1:0] a, h; wire [2:0] x; wire [3;0] y, Z;
assign x = {1’b0, a}; // x[2] = 0, x[1] = a[1], x[0] = a[0]
assign b = {a, h}; /* b[3] = a[1], b[2] = a[0], b[1] = h[1],
b[0] = h[0] */
assign {cout, b} = x + Z; // Concatenation of a result
Operator Replikasi
Operator replikasi membuat beberapa salinan dari sebuah item.
Operator yang digunakan dalam operasi Replikasi adalah - {n {item}} (n replikasi lipat dari sebuah item)
Example
Wire [1:0] a, f; wire [4:0] x;
Assign x = {2{1’f0}, a}; // Equivalent to x = {0,0,a }
Assign y = {2{a}, 3{f}}; //Equivalent to y = {a,a,f,f}
For synthesis, Synopsis did not like a zero replication.
For example:-
Parameter l = 5, k = 5;
Assign x = {(l-k){a}}
Operator Bersyarat
Operator bersyarat melakukan sintesis ke multiplexer. Ini adalah jenis yang sama seperti yang digunakan di C / C ++ dan mengevaluasi salah satu dari dua ekspresi berdasarkan kondisinya.
Operator yang digunakan dalam operasi Bersyarat adalah -
(Kondisi) ? (Hasil jika kondisi benar) -
(hasil jika kondisi salah)
Example
Assign x = (g) ? a : b;
Assign x = (inc = = 2) ? x+1 : x-1;
/* if (inc), x = x+1, else x = x-1 */
Operand
Literals
Literal adalah operan bernilai konstan yang digunakan dalam ekspresi Verilog. Dua literal Verilog yang umum digunakan adalah -
String - Operand literal string adalah larik karakter satu dimensi, yang diapit oleh tanda kutip ganda ("").
Numeric - Operan bilangan konstan ditentukan dalam Bilangan biner, oktal, desimal atau heksadesimal.
Example
n - integer mewakili jumlah bit
F - salah satu dari empat kemungkinan format dasar -
b untuk biner, o untuk oktal, d untuk desimal, h untuk heksadesimal.
“time is” // string literal
267 // 32-bit decimal number
2’b01 // 2-bit binary
20’hB36F // 20-bit hexadecimal number
‘062 // 32-bit octal number
Kabel, Reg, dan Parameter
Kabel, regs, dan parameter adalah tipe data yang digunakan sebagai operan dalam ekspresi Verilog.
Pilihan Bit "x [2]" dan Pemilihan Bagian "x [4: 2]"
Bit-pilih dan pilih-bagian digunakan untuk memilih satu bit dan beberapa bit, masing-masing, dari kawat, reg atau vektor parameter dengan menggunakan tanda kurung siku "[]". Bit-pilih dan pilih-bagian juga digunakan sebagai operan dalam ekspresi dengan cara yang sama seperti objek data utamanya digunakan.
Example
reg [7:0] x, y;
reg [3:0] z;
reg a;
a = x[7] & y[7]; // bit-selects
z = x[7:4] + y[3:0]; // part-selects
Panggilan Fungsi
Dalam pemanggilan Fungsi, nilai kembalian suatu fungsi digunakan secara langsung dalam ekspresi tanpa perlu menetapkannya terlebih dahulu ke register atau wire. Ini hanya menempatkan pemanggilan fungsi sebagai salah satu jenis operan. Anda perlu memastikan bahwa Anda mengetahui lebar bit dari nilai kembali pemanggilan fungsi.
Example
Assign x = y & z & chk_yz(z, y); // chk_yz is a function
. . ./* Definition of the function */
Function chk_yz; // function definition
Input z,y;
chk_yz = y^z;
End function
Modul
Deklarasi Modul
Di Verilog, modul A adalah entitas desain utama. Ini menunjukkan nama dan daftar port (argumen). Beberapa baris berikutnya yang menentukan jenis input / output (input, output atau inout) dan lebar setiap port. Lebar port default hanya 1 bit. Variabel port harus dideklarasikan dengan wire, wand ,. . ., reg. Variabel port default adalah kabel. Biasanya, input adalah kabel karena datanya terkunci di luar modul. Output bertipe reg jika sinyalnya disimpan di dalam.
Example
module sub_add(add, in1, in2, out);
input add; // defaults to wire
input [7:0] in1, in2; wire in1, in2;
output [7:0] out; reg out;
... statements ...
End module
Penugasan Berkelanjutan
Penugasan berkelanjutan dalam Modul digunakan untuk menetapkan nilai ke kabel, yang merupakan penugasan normal yang digunakan di luar blok selalu atau awal. Penugasan ini dilakukan dengan pernyataan penetapan eksplisit atau untuk menetapkan nilai ke kawat selama deklarasinya. Penugasan berkelanjutan terus dijalankan pada saat simulasi. Urutan pernyataan assign tidak mempengaruhinya. Jika Anda melakukan perubahan pada salah satu sinyal input sisi kanan, ini akan mengubah sinyal output sisi kiri.
Example
Wire [1:0] x = 2’y01; // assigned on declaration
Assign y = c | d; // using assign statement
Assign d = a & b;
/* the order of the assign statements does not matter. */
Modul Instansiasi
Deklarasi modul adalah template untuk membuat objek sebenarnya. Modul dibuat di dalam modul lain, dan setiap instance membuat satu objek dari template itu. Pengecualiannya adalah modul tingkat atas yang merupakan instansinya sendiri. Port modul harus cocok dengan yang ditentukan dalam template. Ini ditentukan -
By name, menggunakan titik ".template port name (nama kabel yang terhubung ke port)". Atau
By position, menempatkan port di tempat yang sama di daftar port dari template dan instance.
Example
MODULE DEFINITION
Module and4 (x, y, z);
Input [3:0] x, y;
Output [3:0] z;
Assign z = x | y;
End module