VLSI Tasarımı - Verilog Tanıtımı
Verilog bir DONANIM AÇIKLAMA DİLİ (HDL). Ağ anahtarı veya mikroişlemci veya bellek veya flip flop gibi bir dijital sistemi tanımlamak için kullanılan bir dildir. Bu, bir HDL kullanarak herhangi bir dijital donanımı herhangi bir düzeyde tanımlayabileceğimiz anlamına gelir. HDL'de açıklanan tasarımlar teknolojiden bağımsızdır, tasarımı ve hata ayıklaması çok kolaydır ve özellikle büyük devreler için normalde şemadan daha kullanışlıdır.
Verilog, birçok soyutlama düzeyinde bir tasarımı destekler. Başlıca üçü -
- Davranış düzeyi
- Kayıt aktarım düzeyi
- Kapı seviyesi
Davranış düzeyi
Bu seviye, eşzamanlı algoritmalarla (Davranışsal) bir sistemi açıklar. Her algoritma sıralıdır, yani tek tek yürütülen bir dizi talimattan oluşur. Fonksiyonlar, görevler ve bloklar ana unsurlardır. Tasarımın yapısal olarak gerçekleştirilmesine hiç önem verilmiyor.
Kayıt − Transfer Seviyesi
Register − Transfer Level kullanan tasarımlar, işlemleri kullanan bir devrenin özelliklerini ve kayıtlar arasında veri aktarımını belirtir. Bir RTL kodunun modern tanımı "Sentezlenebilir herhangi bir koda RTL kodu denir".
Kapı Seviyesi
Mantıksal düzeyde, bir sistemin özellikleri mantıksal bağlantılar ve zamanlama özellikleriyle tanımlanır. Tüm sinyaller ayrı sinyallerdir. Yalnızca belirli mantıksal değerlere sahip olabilirler ("0", "1", "X", "Z"). Kullanılabilir işlemler, önceden tanımlanmış mantık ilkellerdir (temel kapılar). Kapı seviyesinde modelleme, mantık tasarımı için doğru bir fikir olmayabilir. Kapı seviyesi kodu, sentez araçları gibi araçlar kullanılarak oluşturulur ve ağ listesi, geçit seviyesi simülasyonu ve arka uç için kullanılır.
Sözcüksel Belirteçler
Verilog dil kaynak metin dosyaları, sözcüksel belirteçlerin bir akışıdır. Bir simge, bir veya daha fazla karakterden oluşur ve her bir karakter tam olarak bir jetonda bulunur.
Verilog HDL tarafından kullanılan temel sözcük simgeleri C Programlama Dilindekilere benzer. Verilog büyük / küçük harfe duyarlıdır. Tüm anahtar sözcükler küçük harftir.
Beyaz boşluk
Beyaz boşluklar, boşluklar, sekmeler, yeni satırlar ve form beslemeleri için karakterler içerebilir. Bu karakterler, jetonları ayırmaya hizmet ettikleri durumlar dışında göz ardı edilir.
Boşluk karakterleri Boş alan, Sekmeler, Satır başları, Yeni satır ve Form beslemeleridir.
Yorumlar
Yorumları temsil etmenin iki biçimi vardır
- 1) Tek satırlı yorumlar jetonla // başlar ve satır başı ile biter.
Ör .: // bu tek satırlık sözdizimidir
- 2) Çok satırlı yorumlar / * simgesi ile başlar ve * / simgesi ile biter
Ör .: / * bu çok satırlı Sözdizimidir * /
Sayılar
İkili, sekizlik, onluk veya onaltılık formatta bir sayı belirtebilirsiniz. Negatif sayılar, 2'nin tamamlayıcı sayılarıyla temsil edilir. Verilog tam sayılara, gerçek sayılara ve işaretli ve işaretsiz sayılara izin verir.
Sözdizimi - <size> <radix> <value> tarafından verilir
Boyut veya boyutlandırılmamış sayı <Size> bölümünde tanımlanabilir ve <radix> ikili, sekizlik, onaltılık veya ondalık olduğunu tanımlar.
Tanımlayıcılar
Tanımlayıcı, bir işlev, modül veya kayıt gibi nesneyi tanımlamak için kullanılan addır. Tanımlayıcılar alfabetik karakterlerle veya alt çizgi karakterleriyle başlamalıdır. Örn. A_Z, a_z, _
Tanımlayıcılar, alfabetik, sayısal, alt çizgi ve $ karakterlerinin birleşimidir. En fazla 1024 karakter uzunluğunda olabilirler.
Operatörler
Operatörler, koşulları koymak veya değişkenleri çalıştırmak için kullanılan özel karakterlerdir. Değişkenler üzerinde işlem yapmak için kullanılan bir, iki ve bazen üç karakter vardır.
Örn. >, +, ~, &! =.
Verilog Anahtar Kelimeleri
Verilog'da özel anlamı olan kelimelere Verilog anahtar sözcükleri denir. Örneğin, atama, durum, while, tel, reg ve veya, nand ve modül. Tanımlayıcı olarak kullanılmamalıdırlar. Verilog anahtar sözcükleri ayrıca derleyici yönergelerini ve sistem görevlerini ve işlevlerini içerir.
Kapı Seviyesi Modelleme
Verilog, mantık kapıları, iletim kapıları ve anahtarlar gibi yerleşik ilkelere sahiptir. Bunlar nadiren tasarım çalışması için kullanılır, ancak ASIC / FPGA hücrelerinin modellenmesi için post sentez dünyasında kullanılırlar.
Kapı seviyesi modelleme iki özellik sergiler -
Drive strength- Çıkış kapılarının gücü, sürücü gücü ile tanımlanır. Kaynağa doğrudan bir bağlantı varsa çıktı en güçlüdür. Bağlantı iletken bir transistör aracılığıyla ve en azından bir çekme / aşağı dirençle bağlandığında güç azalır. Sürücü gücü genellikle belirtilmez, bu durumda güçler varsayılan olarak güçlü1 ve güçlü0 olur.
Delays- Gecikmeler belirtilmezse, kapıların yayılma gecikmeleri olmaz; iki gecikme belirtilmişse, birincisi yükselme gecikmesini ve ikincisi düşme gecikmesini temsil eder; yalnızca bir gecikme belirtilirse, hem yükselme hem de düşme eşittir. Sentezde gecikmeler göz ardı edilebilir.
Gate İlkelleri
Verilog'da tek çıkış ve çok sayıda giriş kullanan temel mantık geçitleri kullanılır. GATE, Verilog'da N sayıda girdi ve 1 çıktı için anahtar sözcüklerden birini kullanır - ve nand veya, nor, xor, xnor.
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)
İletim Kapısı Temelleri
İletim kapısı temelleri hem tamponları hem de eviricileri içerir. Tek girişi ve bir veya daha fazla çıkışı vardır. Aşağıda gösterilen geçit somutlama sözdiziminde, GATE ya buf ya da NOT geçidi anahtar sözcüğünü temsil eder.
Örnek: Not, buf, bufif0, bufif1, notif0, notif1
İnvertör yok
Buf - n çıktı tamponu
Bufifo - tristate tampon, aktif düşük etkinleştir
Bufif1 - tristate buffer, active high enable
Notifo - tristate invertör, aktif düşük etkinleştir
Notif1 - tristate invertör, aktif yüksek etkinleştir
Example:
Module gate()
Wire out0;
Wire out1;
Reg in0,in1;
Not U1(out0,in0);
Buf U2(out0,in0);
Veri tipleri
Değer kümesi
Verilog, temel olarak dört temel değerden oluşur. Verilog'da kullanılan tüm Verilog veri türleri şu değerleri depolar -
0 (mantık sıfır veya yanlış koşul)
1 (mantık bir veya doğru koşul)
x (bilinmeyen mantık değeri)
z (yüksek empedans durumu)
x ve z'nin kullanımı sentez için çok sınırlıdır.
Tel
Bir tel, bir devrede fiziksel bir teli temsil etmek için kullanılır ve kapıların veya modüllerin bağlanması için kullanılır. Bir telin değeri yalnızca okunabilir ve bir işlev veya blokta atanamaz. Bir kablo değeri depolayamaz, ancak her zaman sürekli bir atama ifadesiyle veya kabloyu bir geçidin / modülün çıkışına bağlayarak sürülür. Diğer özel tel türleri şunlardır:
Wand (wired-AND) - Buradaki Değnek değeri, ona bağlı tüm aygıt sürücülerinin mantıksal VE değerine bağlıdır.
Wor (wired-OR) - burada bir Wor değeri, kendisine bağlı tüm aygıt sürücülerinin mantıksal VEYA değerine bağlıdır.
Tri (three-state) - burada bir tri'ye bağlı tüm sürücüler, yalnızca biri (tri'nin değerini belirler) dışında z olmalıdır.
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;
Kayıt ol
Bir reg (kayıt), değeri bir prosedürel atamadan diğerine tutan ve sadece farklı fonksiyonlarda ve prosedür bloklarında kullanılan bir veri nesnesidir. Kayıt, basit bir Verilog, değişken tipli kayıttır ve fiziksel bir kayıt anlamına gelmez. Çok bitli kayıtlarda veriler işaretsiz sayılar şeklinde saklanır ve işaret uzantısı kullanılmaz.
Örnek -
reg c; // tek 1 bitlik kayıt değişkeni
reg [5: 0] gem; // 6 bitlik bir vektör;
reg [6: 0] d, e; // iki 7 bitlik değişken
Giriş, Çıkış, Giriş
Bu anahtar sözcükler, bir görevin veya modülün giriş, çıkış ve çift yönlü bağlantı noktalarını bildirmek için kullanılır. Burada tel tipi ve çıkış portu olan giriş ve çıkış portları tel, reg, wand, wor veya tri tipi olacak şekilde yapılandırılır. Her zaman, varsayılan tel türüdür.
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.
Tamsayı
Tam sayılar genel amaçlı değişkenlerde kullanılır. Genelde döngü göstergelerinde, sabitlerde ve parametrelerde kullanılırlar. 'Reg' tipi veri tipindedirler. Verileri işaretli sayılar olarak saklarlar, oysa açıkça beyan edilen kayıt türleri onları işaretsiz veri olarak saklar. Derleme sırasında tamsayı tanımlanmamışsa, varsayılan boyut 32 bit olacaktır.
Bir tamsayı bir sabit tutuyorsa, sentezleyici bunları derleme sırasında gereken minimum genişliğe ayarlar.
Example
Integer c; // single 32-bit integer
Assign a = 63; // 63 defaults to a 7-bit variable.
Arz0, Arz1
Supply0 mantık 0'a (toprak) bağlı kabloları tanımlar ve kaynak1 mantık 1'e (güç) bağlı kabloları tanımlar.
Example
supply0 logic_0_wires;
supply0 gnd1; // equivalent to a wire assigned as 0
supply1 logic_1_wires;
supply1 c, s;
Zaman
Zaman, simülasyon zamanını tutmak için $ time sistem görevi ile birlikte kullanılabilen 64 bitlik bir miktardır. Zaman sentez için desteklenmez ve bu nedenle yalnızca simülasyon amacıyla kullanılır.
Example
time time_variable_list;
time c;
c = $time; //c = current simulation time
Parametre
Parametre, bir modül kullandığınızda ayarlanabilen ve başlatma işlemi sırasında modülün özelleştirilmesine izin veren bir sabiti tanımlar.
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
Operatörler
Aritmetik operatörler
Bu operatörler aritmetik işlemler gerçekleştirir. + Ve − tekli (x) veya ikili (z − y) operatörler olarak kullanılır.
Aritmetik işleme dahil olan Operatörler şunlardır:
+ (toplama), - (çıkarma), * (çarpma), / (bölme),% (modül)
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.
İlişkisel Operatörler
Bu operatörler iki işleneni karşılaştırır ve sonucu tek bit, 1 veya 0 olarak döndürür.
Wire ve reg değişkenleri pozitiftir. Böylece (−3'd001) = = 3'd111 ve (−3b001)> 3b110.
İlişkisel işleme dahil olan Operatörler:
- == (eşittir)
- ! = (eşit değildir)
- > (büyüktür)
- > = (büyük veya eşit)
- <(küçüktür)
- <= (küçüktür veya eşittir)
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);
Bit-wise Operatörler
İki işlenen arasında bit bazında karşılaştırma yapan bit bazlı operatörler.
Bit wise işlemine dahil olan Operatörler şunlardır:
- & (bitsel VE)
- | (bitsel VEYA)
- ~ (bitsel DEĞİL)
- ^ (bitsel ÖZELVEYA)
- ~ ^ veya ^ ~ (bitsel XNOR)
Example
module and2 (d, b, c);
input [1:0] d, b;
output [1:0] c;
assign c = d & b;
end module
Mantıksal operatörler
Mantıksal operatörler bit bazlı operatörlerdir ve sadece tek bitlik operandler için kullanılır. Tek bir bit değeri, 0 veya 1 döndürürler. Tamsayılar veya bit grubu, ifadeler üzerinde çalışabilir ve sıfır olmayan tüm değerleri 1 olarak kabul edebilirler. Mantıksal operatörler genellikle, ifadelerle çalıştıkları için koşullu ifadelerde kullanılır.
Mantıksal işleme dahil olan operatörler şunlardır:
- ! (mantıksal DEĞİL)
- && (mantıksal AND)
- || (mantıksal OR)
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.
Redüksiyon Operatörleri
İndirgeme operatörleri, bitsel operatörlerin tekli formudur ve bir işlenen vektörün tüm bitleri üzerinde çalışır. Bunlar ayrıca tek bitlik bir değer döndürür.
Azaltma işlemine dahil olan operatörler şunlardır:
- & (azaltma VE)
- | (azaltma VEYA)
- ~ & (NAND azaltma)
- ~ | (azalma NOR)
- ^ (XOR azaltma)
- ~ ^ veya ^ ~ (XNOR azaltma)
Example
Module chk_zero (x, z);
Input [2:0] x;
Output z;
Assign z = & x; // Reduction AND
End module
Vardiya Operatörleri
İlk işleneni sözdiziminde ikinci işlenen tarafından belirtilen bit sayısına göre kaydıran kaydırma operatörleri. Boş pozisyonlar, her iki yöne, sola ve sağa kaydırma için sıfırlarla doldurulur (Kullanım işareti uzantısı yoktur).
Shift işlemine dahil olan Operatörler şunlardır:
- << (sola kaydırma)
- >> (sağa kaydır)
Example
Assign z = c << 3; /* z = c shifted left 3 bits;
Açık pozisyonlar 0'larla doldurulur * /
Birleştirme Operatörü
Birleştirme operatörü, daha büyük bir vektör oluşturmak için iki veya daha fazla işleneni birleştirir.
Birleştirme işlemine dahil edilen operatör - {} (birleştirme)
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
Çoğaltma Operatörü
Çoğaltma operatörü, bir öğenin birden çok kopyasını yapıyor.
Çoğaltma işleminde kullanılan operatör - {n {öğe}} (bir öğenin n kat çoğaltması)
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}}
Koşullu Operatör
Koşullu operatör bir çoklayıcıya sentezler. C / C ++ 'da kullanılanla aynı türdür ve koşula göre iki ifadeden birini değerlendirir.
Koşullu işlemde kullanılan operatör -
(Durum) ? (Koşul doğruysa sonuç) -
(koşul yanlışsa sonuç)
Example
Assign x = (g) ? a : b;
Assign x = (inc = = 2) ? x+1 : x-1;
/* if (inc), x = x+1, else x = x-1 */
Operandlar
Değişmezler
Değişmezler, Verilog ifadelerinde kullanılan sabit değerli işlenenlerdir. Yaygın olarak kullanılan iki Verilog değişmezi şunlardır:
String - Dize değişmez işlenen, çift tırnak ("") içine alınmış tek boyutlu bir karakter dizisidir.
Numeric - İkili, sekizlik, onluk veya onaltılık Sayı olarak sabit sayı işlenen belirtilir.
Example
n - bit sayısını temsil eden tam sayı
F - olası dört temel biçimden biri -
b ikili için, o sekizlik için, d ondalık için, h onaltılık için.
“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
Teller, Kayıtlar ve Parametreler
Teller, regler ve parametreler, Verilog ifadelerinde işlenenler olarak kullanılan veri türleridir.
Bit Seçimi "x [2]" ve Parça Seçimi "x [4: 2]"
Bit seçimleri ve parça seçimleri, köşeli parantez "[]" kullanımıyla bir tel, reg veya parametre vektöründen sırasıyla bir bit ve birden çok bit seçmek için kullanılır. Bit seçimleri ve parça seçmeleri de, ana veri nesnelerinin kullanıldığı gibi, ifadelerde işlenenler olarak kullanılır.
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
İşlev Çağrıları
Fonksiyon çağrılarında, bir fonksiyonun dönüş değeri, bir kayıt veya tele atamaya gerek kalmadan doğrudan bir ifadede kullanılır. İşlev çağrısını işlenen türlerinden biri olarak yerleştirir. İşlev çağrısının dönüş değerinin bit genişliğini bildiğinizden emin olmanız gerekir.
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
Modüller
Modül Beyanı
Verilog'da, bir modül ana tasarım öğesidir. Bu, adı ve bağlantı noktası listesini (bağımsız değişkenler) gösterir. Her bağlantı noktasının giriş / çıkış türünü (giriş, çıkış veya giriş) ve genişliğini belirten sonraki birkaç satır. Varsayılan bağlantı noktası genişliği yalnızca 1 bittir. Bağlantı noktası değişkenleri tel, değnek, ile bildirilmelidir. . ., reg. Varsayılan bağlantı noktası değişkeni teldir. Normalde, girişler teldir çünkü verileri modülün dışında tutulur. Çıkışlar, sinyalleri içeride saklanıyorsa reg tiptedir.
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
Sürekli Atama
Bir Modüldeki sürekli atama, her zaman veya ilk blokların dışında kullanılan normal atama olan bir kabloya bir değer atamak için kullanılır. Bu atama, açık bir atama ifadesiyle veya bildirimi sırasında bir tele bir değer atamak için yapılır. Simülasyon sırasında sürekli atama sürekli olarak yürütülür. Atama ifadelerinin sırası onu etkilemez. Sağ taraftaki giriş sinyallerinden herhangi birinde değişiklik yaparsanız, sol taraftaki çıkış sinyalini değiştirecektir.
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. */
Modül Örnekleri
Modül bildirimleri, gerçek nesneler oluşturmak için kullanılan şablonlardır. Modüller diğer modüllerin içinde somutlaştırılır ve her örnekleme bu şablondan tek bir nesne oluşturur. Bunun istisnası, kendi somutlaştırması olan üst düzey modüldür. Modülün portları, şablonda tanımlananlarla eşleşmelidir. Belirtilir -
By name, nokta ".template bağlantı noktası adı (bağlantı noktasına bağlı telin adı)" kullanarak. Veya
By position, bağlantı noktalarını hem şablonun hem de örneğin bağlantı noktası listelerinde aynı yere yerleştirmek.
Example
MODULE DEFINITION
Module and4 (x, y, z);
Input [3:0] x, y;
Output [3:0] z;
Assign z = x | y;
End module