🎯 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ım | enum ile Tanım |
---|---|
parameter RED = 0; | enum {RED, GREEN, BLUE} |
Sadece sayı olarak görünür | Anlamlı isimlerle temsil edilir |
Tip güvenliği yok | Değişken sadece enum değerini alır |
default kullanımı zor | Hatalı 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:
Method | Açı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.