Verilog elektronik sistemleri modellemek için kullanılan bir donanım tanımlama dilidir. Verilog (bazen “Verilog HDL” olarak da adlandırılır) analog, sayısal ve karışık işaretli devrelerin tasarımını, doğrulanmasını ve yürütülmesini değişik düzeylerde desteklemektedir. Verilog dilinin tasarımcıları dilin C programlama diline yakın bir söz dizimine sahip olmasını istemişlerdir. Böylece bu dile yatkın olan mühendislerin dili kolayca kullanmasını amaçlamışlardır. Dil küçük/büyük harf duyarlılığına sahiptir ve temel denetim akışının “if” ve “while” gibi anahtar kelimeleri, C'ye benzemektedir. Verilog birkaç temel yönde C’den farklıdır. Verilog bir blok kodu tanımlamak için kıvrık parantezler yerine Begin/End kullanmaktadır. Verilog 95 ve 2001 işaretçi veya yinelemeli alt yordamlar yapılarına sahip değildir fakat SystemVerilog bu özelliklere sahiptir. Son olarak DTD’ler için çok önemli olan zaman kavramı C dilinde bulunmamaktadır. Verilog geleneksel programlama dilleri gibi basamaklarını tam olarak ardışık bir şekilde yürütmez. Verilog tasarımı modüller arasında bir hiyerarşi bulundurur. Modüller bir takım giriş, çıkış ve çift yönlü portlar şeklinde tanımlanır. Bir modül içinde yazmaç ve kablo listesi bulunur. Eş zamanlı ve ardışık ifadeler modülün davranışını; portların, kabloların ve yazmaçların arasındaki ilişki ile tanımlar. Ardışık ifadeler bir begin/end bloğuna konur ve blokla beraber ardışık olarak yürütülür. Tüm eş zamanlı ifadeler ve begin/end blokları koşut olarak yürütülür. Bir modül aynı zamanda diğer bir modülün bir veya daha çok örneğini içererek bir alt-davranışı belirtebilir. Eğer tasarımdaki modüller sadece sentezlenebilir ifadeler içeriyorsa bu tasarımın donanımda gerçekleştirilecek temel bileşenlerini ve bağlantılarını içeren netlist, yazılım sayesinde sentezlenebilir. Elde edilen bu netlist bir tümleşik devreyi (örn. ASIC veya FPGA) tanımlamak amacıyla kullanılabilir.
Tarihçe
Başlangıç
Verilog 1983/1984 yıllarında Automated Integrated Design Systems (daha sonraları “ Gateway Design Automation” olarak ismi değiştirildi) Phil Moorby ve Prabhu Goel tarafından icat edilmiştir.1985 yılında ise donanım modelleme dili olarak değiştirilmiştir. Gateway Design Automation firması daha sonra Cadence tarafından 1990 yılında satın alınmıştır. Cadence şu anda Gateway firmasının Verilog diline ve Verilog-XL simülatörünün haklarına tamamen sahiptir.
Verilog-95 [değiştir]
VHDL’in o zamanlar ki yükselen başarısı karşısında Cadence, dili standardlaştırmaya açmaya karar vermiştir. Cadence Verilog’u genel bir alan adresine taşımıştır Open Verilog International (OVI) ( Accellera olarak biliniyor).Verilog daha sonraları IEEE’ye verilmiştir. IEEE Standard 1364-1995 , Verilog-95 olarak referans gösterilir.
Verilog 2001
Orijinal Verilog-95 standardında kullanıcılar tarafından bulunan eksikler kapatılarak IEEE’ye tekrar gönderilen standarttır. Bu eklemeler sonrasında Verilog-2001 IEEE Standard 1364-2001 şeklinde referans gösterilir. Verilog-2001 , Verilog-95’den sonra önemli bir geliştirmedir. Öncelikle ikiye tümleyen ve işaretli değişkenlerle ilgili önemli bir destek eklenmiştir. Daha önceleri kod yazıcılar işaretli işlemleri garip bit işlemleri yaparak gerçekleştiriyorlardı. Dosya giriş/çıkış işlemleri birkaç yeni sistem görevi ile geliştirildi. Son olarak kodun okunabilirliğini artıran birkaç söz dizimi eklentisi yapıldı.(örneğin: always@* ve C dilindekine benzer fonksiyon/görev/modül başlık bildirimi gibi.) Verilog-2001 ticari elektronik tasarım otomasyonu yazılımlarının temel olarak desteklediği Verilog dilidir.
Verilog 2005
Verilog 2005 (IEEE Standard 1364-2005) SystemVerilog ile karıştırılmamalıdır. Verilog’un bu sürümü birkaç küçük düzeltme, özellik açıklaması ve birkaç yeni dil özelliği içermektedir. Verilog standardının ayrı bir parçası olan Verilog-AMS analog ve karışık işaret işlemleri ile geleneksel Verilog’u birleştirme çabasındadır.
SystemVerilog
Systemverilog, Verillog 2005’in bir üst kümesi olarak tasarım doğrulama, tasarım modelleme gibi özellikleri olan bir dildir.
Örnekler
Bir “Merbaha Dünya” programı şu şekildedir.
Kod:
module main;
initial
begin
$display("Merhaba Dunya!");
$finish;
end
endmodule
Kod:
module toplevel(clock,reset);
input clock;
input reset;
reg flop1;
reg flop2;
always @ (posedge reset or posedge clock)
if (reset)
begin
flop1 <= 0;
flop2 <= 1;
end
else
begin
flop1 <= flop2;
flop2 <= flop1;
end
endmodule
Gecikme Örneği:
Kod:
... reg a, b, c, d; wire e; ... always @(b or e) begin a = b & e; b = a | b; #5 c = b; d = #6 c ^ e; end
Sabitlerin Tanımlanması
Temel söz dizimi şu şekildedir. <Genişlik (bit cinsinden)>'<taban harfi><sayı>
Örnekler:
- 12'h123 – 16’lık tabanda 123 (12 bit kullanarak)
- 20'd44 – Ondalık tabanda 44 (20 bit kullanarak - 0 ile otomatik olarak genişletilir.)
- 4'b1010 – ikilik tabanda 1010 (4 bit kullanarak)
- 6'o77 – Sekizlik tabanda 77 (6 bit kullanarak)
Daha önce de belirtildiği gibi, donanımı tanımlamak için birkaç temel taslak kullanılabilir.
Kod:
// Çoklayıcı Örnekleri –Aynı işlemi yapmanın 3 farklı yolu
// İlk örnek sürekli atamayı kullanmaktadır.
wire out ;
assign out = sel ? a : b;
// İkinci örnek aynı işlemi gerçekleştirmek için izlek(prosedür)
// kullanmaktadır.
reg out;
always @(a or b or sel)
begin
case(sel)
1'b0: out = b;
1'b1: out = a;
endcase
end
// İzlek yapısında If/else
// kullanılabilir.
reg out;
always @(a or b or sel)
if (sel)
out = a;
else
out = b;
// Saydam Mandal Örneği
reg out;
always @(gate or din)
if(gate)
out = din; // İlet durumu
// Burada “else” ifadesine gerek yoktur. “Gate” “high” durumdayken “out”
// “din” değişkenini takip edecektir.
// “Gate” “LOW” olduğu zaman “out” durumunu koruyacaktır.
D Flip-Flop en basit yapılardan biridir.
Kod:
reg q; always @(posedge clk) q <= d;
D flip-flop’un bir değişik türü, zamanuyumsuz sıfırlama (asynchronous reset) ile gerçekleştirilendir. Reset ifadesi geleneksel olarak yapı içerisindeki ilk “if” ifadesi olarak tanımlanmaktadır.
Kod:
reg q;
always @(posedge clk or posedge reset)
if(reset)
q <= 0;
else
q <= d;
Kod:
reg q; always @(posedge clk or posedge reset or posedge set) if(reset) q <= 0; else if(set) q <= 1; else q <= d;
// Temel yapı geri besleme ile yapılmaktadır.
always @(posedge clk)
if(gate)
q <= d;
else
q <= q; // açık geri besleme yolu
always @(posedge clk)
if(gate)
q <= d; // “else” çoklayıcı gerçekleştirildi.
Initial ve Always
Verilog işlemini belirtmek için iki tane farklı anahtar kelime bulunmaktadır. Bunlar “always” ve “initial” anahtar kelimeleridir. “Always” kelimesi durum kontrolü (@) ifadesiyle tetiklenen serbest çalışan işlemleri ifade eder.”Initial” anahtar kelimesi sadece bir kere yürütülen işlemler için kullanılır. Her ikiside benzetimlik zamanının 0 anında “begin” yapısını kurar ve blok sonuna kadar yürütülür. Blok sona ulaştığında tekrar sıraya alınır. Genel düşünce “initial” bloğunun, “always’den” önce yürütüleceğinin varsayılmasıdır fakat “initial” bloğunun “always” bloğunun sadece bir kere çalıştıktan sonra duran özel bir durumu olarak düşünülmesi daha doğrudur.
//Örnekler:
Kod:
initial
begin
a = 1; // zaman 0 anında reg tipi değişkene değer ata
#1; // 1 birim zaman bekle
b = a; // reg a’yı reg b’ye ata
end
always @(a or b) // a veya b değiştiğinde aşağıdaki ifadeleri gerçekleştir.
begin
if (a)
c = b;
else
d = ~b;
end // Bu blokla işlem bittiğinde tekrar yukarı dön (@ durum kontrolü)
always @(posedge a)// reg a pozitif kenar değeri aldığında çalıştır
a <= b;
Kod:
always begin // 0 zamanında yürütmeye başla ve hiçbir zaman durma clk = 0; #1; // 1 birim zaman bekle clk = 1; #1; end // Yürütmeye devam ediyor – yukarıdan tekrar başlar.
Kod:
initial forever // 0 zamanında başla ve begin/end’i sürekli tekrarla. begin clk = 0; #1; clk = 1; #1; end
Verilog’da “Fork/Join” yapısı koşut işlemler yaratmak amacıyla kullanılır. Fork/join çiftinin içindeki tüm ifadeler (veya bloklar) “fork” ile eş zamanlı olarak yürütülmeye başlanır. Yürütme “join” ile yürütmenin en uzun süren elemanın tamamlanmasıyla sona erer.
Kod:
initial
fork
$write("A"); // A karakterini yaz
$write("B"); // B karakterini yaz
begin
#1; // 1 birim zaman bekle
$write("C");// C karakterini yaz
end
join
Yarış Koşulları
Verilog’ta yürütüm sırası her zaman aynı olmayabilir. Bu durum iki sonucun çıkışa yarışması gibi düşünülebilir. Bu durum klasik bir örnekle açıklanmaktadır.
Kod:
initial
a = 0;
initial
b = a;
initial
begin
#1;
$display("Value a=%a Value of b=%b",a,b);
end
Sistem görevleri
Sistem görevleri basit giriş/çıkış ve değişik tasarım işlevleri için bulunmaktadır. Tüm sistem görevleri kullanıcı görevleri ve fonksiyonları ile karıştırılmaması amacıyla “$” ön takısını bulundurmaktadır. Bu bölüm çok kullanılan görevlerin kısa bir listesini ele almaktadır yeteri kadar kapsamlı değildir.
- $display – Yeni bir satırla ekrana yazdırma
- $write – Satırbaşı yapmadan ekrana yazdırma
- $swrite – Bir değişkene satırbaşı yapmadan yazdırma
- $fdisplay – Bir dosyaya satırbaşı yaparak yazdırma.
- $fwrite –Bir dosyaya satırbaşı yapmadan yazdırma.
- $readmemh – Hafıza dizisine hex dosyası alınması.
- $readmemb - Hafıza dizisine binary dosyası alınması.
- $monitor – Değerlerinde bir değişiklik olan değişkenlerin yazdırılması.
- $time – Benzetim zamanının değeri.
- $random – Rastgele bir değer döndürülmesi.









Normal
