Ana içeriğe geç

SystemVerilog Struct, Union ve Typedef Kullanımı – Kullanıcı Tanımlı Veri Tipleri

· loading · loading · ·
Donanım Tasarımı Doğrulama SystemVerilog Struct Union Typedef Veri Modelleme RTL Tasarımı
Donanım Tasarımı Doğrulama
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
SystemVerilog Tasarım Serisi - This article is part of a series.
Part 10: This Article

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ı:
#

  1. Protokol işleme (aynı bitlerin farklı yorumları)
  2. Donanım register erişimi
  3. Tür dönüşümü (cast olmadan bit düzeyinde)
  4. 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ı:
#

ÖzellikUnionStruct
BellekPaylaşımlı (üst üste biner)Ayrılmış (ardışık)
ErişimTek üye aynı andaTüm üyeler aynı anda erişilir
BoyutEn büyük üyenin boyutu kadarTüm üyelerin toplamı
Tipik KullanımAlternatif veri temsiliVeri 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ğin byte_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özdizimiAçı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

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 10: This Article

Related

SystemVerilog Interface – modport ve Clocking Block ile Modüler Bağlantı
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Interface Modport Testbench RTL Tasarımı Bağlantı
Donanım Tasarımı Doğrulama
SystemVerilog Clocking Block – Testbench Zamanlama Kontrolü
· loading · loading
Doğrulama Donanım Tasarımı SystemVerilog Clocking Block RTL Tasarımı Testbench UVM Zamanlama
Doğrulama Donanım Tasarımı
SystemVerilog Döngüler ve Kontrol Akışı – for, while, foreach, repeat, break
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Döngüler Kontrol Akışı Testbench RTL Tasarımı Break/Continue
Donanım Tasarımı Doğrulama
SystemVerilog Enum Veri Tipi
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Enum Durum Makinesi RTL Tasarımı Testbench Hata Ayıklama
Donanım Tasarımı Doğrulama
SystemVerilog Giriş
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Verilog RTL Tasarımı UVM Donanım Doğrulama IEEE 1800
Donanım Tasarımı Doğrulama
SystemVerilog Logic Veri Türü
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Logic RTL Tasarımı Verilog Sentezleme Net vs Değişken
Donanım Tasarımı Doğrulama