Ana içeriğe geç

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
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 5: This Article

🎯 enum Nedir?
#

SystemVerilog’da enum, birden fazla sabit değeri isimlendirerek gruplayan bir veri türüdür. Kodun okunabilirliğini artırır, hata riskini azaltır ve debug işlemlerini kolaylaştırır.

enum {RED, GREEN, BLUE} led_color;

🧠 Neden enum Kullanılır?
#

parameter ile Tanımenum ile Tanım
parameter RED = 0;enum {RED, GREEN, BLUE}
Sadece sayı olarak görünürAnlamlı isimlerle temsil edilir
Tip güvenliği yokDeğişken sadece enum değerini alır
default kullanımı zorHatalı durumları daha rahat yakalar

✅ Basit Kullanım
#

module led_ctrl;
  enum {RED, GREEN, BLUE} color;

  initial begin
    color = GREEN;
    if (color == RED)
      $display("Red selected!");
  end
endmodule

🔄 Varsayılan olarak RED=0, GREEN=1, BLUE=2 olarak atanır. Kendi değerlerinizi atayabilirsiniz : enum {RED = 5, GREEN =7 , BLUE} color; // mavi default olarak kendinden öncekinden bir sonraki sayı olur yani 8.


🧰 Enum Metodları (Built-in)
#

SystemVerilog’daki enum türleri bazı yararlı metodlar destekler:

MethodAçıklama
first()İlk enum değerini verir
last()Son enum değerini verir
next(value)Verilen değerden sonra geleni verir
prev(value)Verilen değerden önce geleni verir
num()Toplam enum eleman sayısını döner
name(value)Enum sabitinin string adını döner

🧠 Bu metodlar yalnızca sentezlenemeyen, simülasyon odaklı işlemlerde kullanılabilir.


🧪 Tüm Enum Sabitlerini Yazdırma Örneği
#

module enum_list_example;
  enum {IDLE, READ, WRITE, ERROR} state;

  initial begin
    repeat(state.num()) begin
      $display("State = %s", state.name());
    end
  end
endmodule

📤 Çıktı:

State = IDLE
State = READ
State = WRITE
State = ERROR

Bu yöntemle tüm enum sabitleri okunabilir şekilde terminale/log dosyasına yazdırılabilir.


⚠️ Dikkat Edilmesi Gerekenler
#

  • name() gibi metodlar simülasyon için kullanılır, sentezlenebilir değildir.
  • Geniş enum kullanımlarında tür tanımlamak (typedef) önerilir — bu bir sonraki yazının konusudur.

📌 Özet
#

  • enum, sabitleri daha okunabilir ve güvenli tanımlamak için kullanılır.
  • parameter yerine daha anlamlı, debug-dostu çözümler sunar.
  • name() gibi metodlarla simülasyonda isimli yazdırma mümkündür.
  • RTL’de kullanılabilir, ama bazı metodları yalnızca testbench’te geçerlidir.
module enum_demo_tb;

  // Enum tipi tanımı (LED renkleri için)
  typedef enum logic [1:0] {
    RED,
    GREEN,
    BLUE
  } color_t;

  color_t led_color;
  color_t temp;  // Geçici enum değişkeni

  initial begin
    // Temel kullanım
    led_color = GREEN;
    if (led_color == RED)
      $display("🔴 Kırmızı seçildi!");
    else if (led_color == GREEN)
      $display("🟢 Yeşil seçildi!");
    else
      $display("🔵 Mavi seçildi!");

    // Enum metotları
    $display("\n🧪 Enum Yerleşik Metotları:");
    temp = led_color.first();
    $display("İlk değer    : %s", temp.name());
    temp = led_color.last();
    $display("Son değer    : %s", temp.name());
    $display("Toplam enum  : %0d", led_color.num());

    temp = led_color.next(RED);
    $display("RED'den sonraki: %s", temp.name());

    temp = led_color.prev(BLUE);
    $display("BLUE'den önceki: %s", temp.name());

    // Tüm enum sabitlerini listele
    $display("\n📋 Tüm enum sabitleri:");
    for (int i = 0; i < led_color.num(); i++) begin
      temp = color_t'(i);  // Sayısal değeri enum’a çevir (cast)
      $display("Renk %0d = %s", i, temp.name());
    end
  end

endmodule

📤 Output:
#

# ? Ye?il seçildi!
# 
# ? Enum Yerle?ik Metotlar?:
# ?lk de?er    : RED
# Son de?er    : BLUE
# Toplam enum  : 3
# RED'den sonraki: GREEN
# BLUE'den önceki: BLUE
# 
# ? Tüm enum sabitleri:
# Renk 0 = RED
# Renk 1 = GREEN
# Renk 2 = BLUE

🔖 Not
#

Enum türleri name() gibi metodlarla birlikte kullanıldığında, debug ve loglamada büyük kolaylık sağlar. Özellikle durum makineleri ve kontrol sinyallerinde önerilir.

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

Related

SystemVerilog Task ve Function Yapıları
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Task Function RTL Tasarımı Testbench Yeniden Kullanılabilirlik
Donanım Tasarımı Doğrulama
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 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
SystemVerilog Veri Türleri
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Verilog RTL Tasarımı Veri Tipleri Sentezleme Simülasyon
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 Diziler
· loading · loading
Donanım Tasarımı Doğrulama SystemVerilog Diziler Packed Dinamik Dizi Kuyruk (Queue) Testbench
Donanım Tasarımı Doğrulama