SystemVerilog Yapıları ve Kullanıcı Tanımlı Tipler#
🏗️ Struct Nedir?#
SystemVerilog’ta bir struct, farklı veri türlerini tek bir mantıksal grup altında birleştiren bileşik bir veri türüdür. C/C++ dilindeki struct yapısına benzer şekilde, ilişkili değişkenleri tek bir isim altında organize etmeye olanak tanır.
🔹 Struct’ların Temel Özellikleri:#
- Heterojen veri gruplama (farklı türde veriler aynı yapıda)
- Modüler veri organizasyonu
- Kod okunabilirliğini artırır
- Veri paketleme ve protokol modelleme için idealdir
🔹 Struct Temel Sözdizimi:#
struct {
veri_türü1 üye1;
veri_türü2 üye2;
// ...
} struct_adı;
🔹 Struct Örnek Tanımı:#
struct {
string name;
int age;
logic[3:0] id;
bit is_active;
} employee;
🔹 Packed vs. Unpacked Struct:#
Packed Struct: Bit düzeyinde hassas, ardışık bellek yerleşimi
struct packed { logic [7:0] r; logic [7:0] g; logic [7:0] b; } pixel_t;
Unpacked Struct: Varsayılan, daha esnek (üyeler ardışık olmayabilir)
🔹 Struct Üyelerine Erişim:#
employee.name = "Ahmet";
employee.age = 32;
if (employee.is_active) ...
🔹 Struct ile typedef
Kullanımı (En İyi Uygulama):#
typedef struct {
logic [31:0] addr;
logic [63:0] data;
logic valid;
} transaction_t;
transaction_t trx;
Struct yapıları SystemVerilog’ta veri paketleri, protokol mesajları ve karmaşık veri yapıları oluşturmak için yaygın şekilde kullanılır.
🔄 SystemVerilog’ta Union Yapısını Anlamak#
Union yapısı, aynı bellek alanına birden fazla veri türü üzerinden erişilmesini sağlar. Bu sayede aynı veriyi farklı biçimlerde yorumlamak mümkündür.
🔹 Union Temel Özellikleri:#
- Tüm üyeler aynı bellek alanını paylaşır
- Aynı anda yalnızca bir üye aktif olmalıdır
- Alternatif veri temsili için bellek dostu çözümdür
- Protokol işleme ve donanım register modellemede kullanışlıdır
🔹 Temel Union Sözdizimi:#
union {
veri_türü1 üye1;
veri_türü2 üye2;
// ...
} union_adı;
🔹 Packed vs Unpacked Union:#
Packed Union: Tüm üyeler aynı bit genişliğini paylaşır
union packed { logic [31:0] int_val; logic [7:0] byte_arr[4]; } data_u;
Unpacked Union: Üyeler farklı genişlikte olabilir (nadir kullanılır)
🔹 Pratik Union Örneği:#
typedef union {
int as_int;
shortreal as_float;
logic[31:0] as_bits;
} number_u;
number_u num;
num.as_float = 3.14;
$display("Integer view: %0d", num.as_int);
🔹 Union İçinde Struct Kullanımı:#
typedef struct {
logic [7:0] addr;
union {
logic [31:0] data;
logic [7:0] bytes[4];
} payload;
} packet_t;
🔹 Yaygın Kullanım Alanları:#
- Protokol işleme (aynı bitlerin farklı yorumları)
- Donanım register erişimi
- Tür dönüşümü (cast olmadan bit düzeyinde)
- Bellek optimizasyonu (tek varyant kullanıldığında)
🔹 Önemli Notlar:#
- Yalnızca en son yazılan üye okunmalıdır
- Tür kontrolü yapılmaz — geliştirici aktif üyeyi takip etmelidir
- Packed union sentezlenebilir, unpacked genellikle değildir
- Doğrulama sırasında dikkatli kullanılmalıdır (tip güvenliği yok)
🔹 Union vs Struct Karşılaştırması:#
Özellik | Union | Struct |
---|---|---|
Bellek | Paylaşımlı (üst üste biner) | Ayrılmış (ardışık) |
Erişim | Tek üye aynı anda | Tüm üyeler aynı anda erişilir |
Boyut | En büyük üyenin boyutu kadar | Tüm üyelerin toplamı |
Tipik Kullanım | Alternatif veri temsili | Veri gruplama |
🏷️ SystemVerilog Kullanıcı Tanımlı Tipler ve typedef
#
SystemVerilog, typedef
anahtar kelimesiyle kullanıcıların kendi özel veri türlerini tanımlamasına izin verir. Bu özellik, özellikle büyük RTL veya doğrulama projelerinde kodun okunabilirliğini, yeniden kullanılabilirliğini ve tip soyutlamasını artırır.
🔤 typedef
Nedir?#
typedef
, mevcut bir veri türüne veya karmaşık bir yapıya yeni bir takma ad (alias) tanımlar.
Temel Sözdizimi:#
typedef orijinal_tür yeni_ad;
✅ Neden typedef
Kullanılır?#
- Karmaşık türleri daha okunabilir hale getirir
- Fonksiyonlara parametre geçişini sadeleştirir
- Güçlü tip kontrolü ve soyutlama sağlar
- Kod tekrarını azaltır
📌 typedef
Kullanım Örnekleri#
1. Basit Takma Ad#
typedef logic [7:0] byte_t;
byte_t a, b; // Aynı anlama gelir: logic [7:0] a, b;
2. Struct için typedef
#
typedef struct {
string name;
int age;
bit is_valid;
} person_t;
person_t user1;
user1.name = "Kerim";
3. Enum için typedef
#
typedef enum logic [1:0] {
IDLE,
RUN,
DONE
} state_t;
state_t fsm_state;
4. Dizi için typedef
#
typedef logic [15:0] word_t;
typedef word_t mem_array_t [0:255];
mem_array_t my_ram;
5. Union için typedef
#
typedef union packed {
int as_int;
byte_t as_bytes[4];
} data_u;
data_u data;
🔁 Parametreli Tiplerle typedef
Kullanımı#
Modül veya arayüz içinde esnek ve yeniden kullanılabilir tipler tanımlamak için:
module fifo #(parameter WIDTH = 8) ();
typedef logic [WIDTH-1:0] data_t;
data_t buffer;
endmodule
🧩 SystemVerilog’ta Struct Elemanlarına Atama Yöntemleri#
SystemVerilog, struct (yapı) türlerine hem alan bazlı (tek tek) hem de toplu (aggregate) şekilde değer atamayı destekler.
1. Tek Tek Üye Ataması (Member-wise Assignment)#
Her bir struct elemanına ayrı ayrı değer atayabilirsiniz:
employee.name = "Ali";
employee.age = 30;
employee.id = 4'b1100;
employee.is_active = 1;
2. Toplu (Aggregate) Atama#
Bir struct’ın tüm üyelerine aynı anda '{'}
literal sözdizimi ile değer atayabilirsiniz:
employee = '{ "Ayşe", 28, 4'b0011, 1 };
✅ Atama sırası, struct tanımındaki sıra ile birebir aynı olmalıdır.
Daha okunabilir ve güvenli olması için isimli atama da yapabilirsiniz:
employee = '{
name: "Zeynep",
age: 25,
id: 4'b1001,
is_active: 0
};
🧠 İsimli atamalar, kodun kendini açıklayan yapıda olmasını sağlar ve hata riskini azaltır.
3. Varsayılan Değer Atama (default:
)#
Tüm alanlara varsayılan değer atamak için default:
kullanılabilir:
employee = '{logic: 0, default: 0}; // Tüm alanlar sıfırlanır (sayılar 0, string "" olur), tüm logic türleri sıfırlarnı
🚨 Notlar ve En İyi Uygulamalar#
_t
sonekiyle tipleri adlandır (örneğinbyte_t
,state_t
)typedef
ile sınıf tanımlanamaz — sadece temel türler, struct, enum, union veya diziler- Testbench, UVM bileşenleri ve arayüzlerde oldukça kullanışlıdır
📚 Özet Tablosu#
Kullanım Türü | Sözdizimi | Açıklama |
---|---|---|
Temel tür takma adı | typedef logic [7:0] byte_t; | Vektör türleri için kısa isim |
Struct takma adı | typedef struct { ... } my_struct_t; | Modüler veri gruplama |
Enum takma adı | typedef enum {A, B, C} mode_t; | Sonlu durum/mode tanımları |
Dizi takma adı | typedef logic [15:0] mem_t [0:255]; | Bellek/buffer soyutlaması |
Union takma adı | typedef union packed { ... } union_t; | Bit paylaşan veri temsili |