🧵 string
Nedir?#
SystemVerilog’daki string
veri türü, değişken uzunlukta karakter dizilerini ifade eder. Yani klasik [7:0] char_array [0:N]
tarzı sabit boyutlu dizilere göre çok daha esnek ve kullanışlıdır.
string message;
message = "Hello, SystemVerilog!";
🧠 Özellikler#
Özellik | Açıklama |
---|---|
Dinamik uzunluk | Karakter sayısına göre bellek dinamik olarak ayarlanır |
Otomatik null sonu | Her string otomatik olarak \0 ile sonlandırılır |
Dahili işleçler | + , == , .len() , .toupper() gibi fonksiyonlar desteklenir |
Testbench odaklı | Özellikle loglama, hata mesajı ve file I/O için yaygın kullanılır |
📦 Temel Kullanım#
string s1, s2, full;
s1 = "Axolot";
s2 = "Logic";
full = {s1 , " " , s2};
$display("✅ Full string: %s", full); // Output: Axolot Logic
🔧 Yaygın String Fonksiyonları#
Fonksiyon | Açıklama | Örnek Kullanım |
---|---|---|
.len() | Karakter uzunluğunu verir | s.len() → 12 |
.toupper() | Büyük harfe çevirir | s.toupper() |
.tolower() | Küçük harfe çevirir | s.tolower() |
.compare() | Karşılaştırma sonucu döner | s1.compare(s2) |
.substr(i, n) | Alt string verir | s.substr(2, 4) |
.getc(i) | Belirli index’teki karakteri döner | s.getc(0) → "H" |
.putc(i) | Belirli index’e karakter yazar | "H" → s.putc(0) |
🧪 Testbenchlerde Kullanımı#
Testbench yazarken string
türü özellikle loglama, dosya çıktısı, isimlendirme ve hata mesajları gibi durumlarda hayat kurtarır.
string filename, test_id = "test.txt";
int file;
filename = $sformatf("results/run_%0d.log", test_id);
file = $fopen(filename, "w");
$fwrite(file, "Simulation started for ID: %0d\n", test_id);
🚫 Sentezlenebilir mi?#
Hayır.
SystemVerilog string
türü yalnızca simülasyon amaçlıdır. Bu türde yazılmış kodlar sentezlenemez, yani FPGA veya ASIC üzerinde donanıma dönüşmez.
🧠 RTL’de sabit uzunluklu
byte
,bit [7:0]
veyalogic [7:0]
dizileri kullanılmalıdır.
module string_demo_tb;
// String değişkenlerini tanımla
string s1, s2, full;
int length;
string upper_str, lower_str, sub_str;
string first_char; // `byte` yerine `string` kullanılmalı
// Dosya işlemleri için değişkenler
string filename;
int file;
int test_id = 42;
initial begin
// Temel atama ve birleştirme
s1 = "Axolot";
s2 = "Logic";
full = {s1 , " " , s2};
$display("✅ Tüm metin: %s", full); // Çıktı: Axolot Logic
// String metodları
length = full.len(); // Uzunluk hesapla
upper_str = full.toupper(); // Büyük harfe çevir
lower_str = full.tolower(); // Küçük harfe çevir
sub_str = full.substr(2, 4); // Alt string çıkar
first_char = full.getc(0); // İlk karakteri al
$display("🔍 Uzunluk : %0d", length);
$display("🔠 Büyük Harf : %s", upper_str);
$display("🔡 Küçük Harf : %s", lower_str);
$display("🔖 Alt Metin : %s", sub_str);
$display("🆎 İlk karakter : %s", first_char);
// String karşılaştırma
if (s1.compare("Axolot") == 0)
$display("✔️ Stringler aynı: %s", s1);
else
$display("❌ Stringler farklı!");
// String ile dosya işlemleri
filename = $sformatf("results/run_%0d.log", test_id); // Dosya ismi oluştur
file = $fopen(filename, "w"); // Yazma modunda dosya aç
if (file) begin
$fwrite(file, "📂 Test ID: %0d için simülasyon başladı\n", test_id);
$fclose(file);
$display("📁 Dosya yazıldı: %s", filename);
end else begin
$display("⚠️ Dosya açılamadı: %s", filename);
end
end
endmodule
📤 Output:#
# ? Tüm metin: Axolot Logic
# ? Uzunluk : 12
# ? Büyük Harf : AXOLOT LOGIC
# ? Küçük Harf : axolot logic
# ? Alt Metin : olo
# ? ?lk karakter : A
# ?? Stringler ayn?: Axolot
📌 Özet#
string
, testbenchlerde metinle çalışmak için idealdir.- Dinamik yapısı sayesinde sabit boyutlu dizilere göre çok daha esnek ve okunabilir.
- Sentezlenemez, sadece simülasyon ve doğrulama amaçlıdır.
✨ Loglama, hata mesajı, dosya ismi oluşturma gibi işlemlerde
string
türü kullan — RTL tarafında değil!
🔖 Not#
string
türü, run-time bellek kullanımı ve dinamik yapı içerdiği için sadece testbench seviyesinde kullanılmalıdır. RTL tasarımlarda logic [7:0]
dizileri tercih edilir.