📘 Verilog Sözdizimine Genel Bakış #
Verilog sözdizimi C diline benzer ve modüller, portlar, veri tipleri, atamalar ve prosedürel bloklardan oluşur.
📑 Temel Verilog Sözdizimi Kuralları ve Kavramları #
Kavram | Sözdizimi Örneği | Açıklama |
---|---|---|
Modül | module adder(...); ... endmodule |
Temel tasarım birimi |
Portlar | input , output , inout |
Modül arayüz sinyalleri |
Veri Tipleri | wire , reg , integer , real |
Sinyal ve değişken tanımlamaları |
Atama | assign y = a & b; |
Kombinasyonel mantık için sürekli atama |
Prosedürel Blok | always , initial |
Sıralı veya sadece simülasyon amaçlı kod |
Gecikme | #10 |
Zaman gecikmesi (sadece simülasyonda) |
Yazdırma | $display , $monitor , $finish |
Testbench çıktıları için |
Yorumlar | // tek satır , /* çok satır */ |
C/C++ ile aynı |
✅ Başlangıç için Temel Kodlama Kuralları #
- Her tasarım bir
module
içinde tanımlanmalı veendmodule
ile bitmelidir. - Kombinasyonel çıktılar için
wire
,always
içinde atanacak değerler içinreg
kullanın. - Sürekli atamalar için
assign
kullanın,always
içinde değil. always @(*)
veyaalways @(posedge clk)
yapıları doğru duyarlılık listeleriyle kullanılmalıdır.initial
,#delay
,$display
gibi yapılar sentezlenemez, sadece simülasyon içindir.- Kodunuzu girintili yazın ve bolca yorum ekleyin.
- Bit genişlikleri önemlidir:
reg [3:0] a;
4-bit kayıt anlamına gelir.
✨ Örnek (Kombinasyonel ve Sıralı) #
Sıralı #
module example(input clk, input a, b, output reg y);
// Sıralı süreç
always @(posedge clk) begin
y <= a & b; // Engellenmeyen atama
end
endmodule
Kombinasyonel #
module example(input a, b, output reg y);
// Kombinasyonel süreç
always @(*) begin
y = a & b; // Engelleyen atama
end
endmodule
🔢 Verilog’da Boyutlandırılmış ve Boyutlandırılmamış Sabitler #
Verilog’da sayısal sabitler (literaller), boyutlandırılmış veya boyutlandırılmamış olabilir. Bu fark, simülasyon ve sentez davranışlarını etkiler.
📐 Boyutlandırılmış Sabitler #
Biçim: bit_sayısı'taban_değer
Örnekler:
4'b1010 // 4-bit ikili: 1010
8'hA9 // 8-bit onaltılık: A9
-16'sd5 // 16-bit işaretli ondalık: -5
s
öneki (16'sd
gibi) değerin işaretli olduğunu belirtir.
🧩 Boyutlandırılmamış Sabitler #
- Bit genişliği belirtilmez.
- Varsayılan olarak en az 32 bit işaretli kabul edilir.
Örnekler:
12 // 32-bit işaretli olarak değerlendirilir
'd7 // Taban belirtilmiş ama boyut belirtilmemiş
⚠️ Özel Değerler #
Sembol | Anlamı | Örnek |
---|---|---|
x |
Bilinmeyen değer | 4'b10x1 |
z |
Üç durum (float) | 8'bzzzzzzzz |
? |
z için takma ad |
4'b??0? |
🔧 Dolgu (Padding) Davranışı #
Bit sayısından azsa, soldan 0
, x
veya z
ile doldurulur:
4'b1 // 4'b0001 olarak yorumlanır
8'hx // 8'hxx (xxxxxxxx)
❌ Geçersiz Sözdizimi Uyarısı #
8'd -6 // ❌ Hata verir
Doğru kullanımlar:
-8'd6 // ✅ İşaretli sabit
-(8'd6) // ✅ Parantezli hali
🧠 Tavsiye #
RTL tasarımlarda her zaman boyutlandırılmış sabitler kullanın. Böylece bit genişlikleri ve işaret genişlemeleri öngörülebilir olur.
⚙️ Verilog’ta Operatörler #
Verilog birçok kategoriye ayrılmış operatör içerir:
Tür | Örnek | Açıklama | ||
---|---|---|---|---|
Aritmetik | + , - , * , / , % |
Temel matematik işlemleri | ||
Mantıksal | && , || , ! |
Doğru/yanlış kontrolü | ||
Bit düzeyinde | & , | , ^ , ~ |
Tek tek bitler üzerinde işlem yapar | ||
Kaydırma | << , >> |
Bitleri sola/sağa mantıksal kaydırma | ||
Karşılaştırma | == , != , < , >= |
Karşılaştırma (1-bit sonuç döner) | ||
Azaltma (Reduction) | ~& , | , ~| , ^ , ~^ |
Bir vektörün tüm bitleri üzerinde işlem | ||
Birleştirme | {a, b} |
Sinyalleri yan yana birleştirir | ||
Tekrarlama | {3{a}} |
Bir sinyali tekrar eder | ||
Equality | === , !== |
Case equality (X/Z sensitive) | ||
Conditional | durum ? doğru_değer : yanlış_değer |
Ternary (if-else tek satır) |
🧵 String Veri Tipi #
-
Verilog,
string
tipini doğrudan desteklemez; sadece sistem görevleri ($display
,$write
, vs.) için string kullanımı mümkündür. -
C dilindeki gibi yerel bir
string
veri tipi yoktur. -
Kullanım örneği:
$display("Hello = %s", "World");
-
Karakter saklamak için genellikle şöyle yapılır:
reg [8*UZUNLUK-1:0] my_string;
🔍 Örnek:
reg [79:0] message; // 10 karakter
initial message = "Verilog!";
🆔 Verilog’ta Tanımlayıcılar (Identifiers) #
Tanımlayıcılar; modül adları, değişkenler, portlar vb. isimlendirmek için kullanılır.
- Bir harf (
a–z
,A–Z
) ya da alt çizgi (_
) ile başlamalıdır. - Harf, rakam, alt çizgi ve
$
sembolü içerebilir. - Verilog anahtar kelimeleriyle aynı olamaz.
- Büyük/küçük harf duyarlıdır (
data
≠Data
)
✅ Geçerli Örnekler:
wire data_1;
reg _temp;
reg $value;
❌ Geçersiz Örnekler:
reg 2data; // ❌ Rakamla başlıyor
reg module; // ❌ Anahtar kelime
🗂 Verilog Rezerve Edilmiş Anahtar Kelimeleri #
İşte Verilog-2005’teki rezerve edilmiş kelimelerin kısa bir listesi:
always, and, assign, automatic, begin, buf, bufif0, bufif1,
case, casex, casez, cell, cmos, config, deassign, default,
defparam, design, disable, edge, else, end, endcase, endconfig,
endfunction, endgenerate, endif, endmodule, endprimitive,
endspecify, endtable, endtask, event, for, force, forever,
fork, function, generate, genvar, if, ifnone, incdir, include,
initial, inout, input, instance, integer, join, large, liblist,
library, localparam, macromodule, medium, module, nand, negedge,
nmos, nor, not, notif0, notif1, or, output, parameter, pmos,
posedge, primitive, pull0, pull1, pulldown, pullup, rcmos,
real, realtime, reg, release, repeat, rnmos, rpmos, rtran,
rtranif0, rtranif1, scalared, small, specify, specparam,
strong0, strong1, supply0, supply1, table, task, time, tran,
tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg,
unsigned, use, vectored, wait, wand, weak0, weak1, while, wire,
wor, xnor, xor
✅ Bu kelimeleri kendi değişken veya modül ismin olarak kullanamazsın.