🎲 SystemVerilog Testbench’te Rastgeleleştirme#
SystemVerilog, sınıf tanımı gerektirmeden testbench içinde kullanılabilen birçok yerleşik rastgeleleştirme özelliği sunar.
Bu özellikler, basit uyarıcı (stimulus) üretimi, kontrol sinyalleri, kenar durumu testleri ve veri çeşitliliği için oldukça uygundur.
🧮 $urandom()
ve $urandom_range()
#
En yaygın kullanılan rastgele sayı üreticileri:
$urandom(); // 32-bit unsigned rastgele sayı
$urandom_range(min, max); // Belirtilen aralıkta rastgele değer
✅ Örnek#
initial begin
int rastgele;
rastgele = $urandom();
$display("Rastgele: %0d", rastgele);
int sinirli;
sinirli = $urandom_range(10, 20);
$display("Sınırlandırılmış: %0d", sinirli);
end
⚠️
$urandom()
değeri işaretsizdir. İmzalı işleme ihtiyacınız varsa cast kullanmalısınız.
🎛️ Bitler ve Sinyallerin Rastgeleleştirilmesi#
Testbench içinde değişkenlere doğrudan rastgele değer atayabilirsiniz:
logic [3:0] opcode;
initial opcode = $urandom_range(0, 15); // 4-bit'lik rastgele değer
Veya diziler için:
logic [7:0] data [0:3];
initial begin
foreach (data[i])
data[i] = $urandom_range(0, 255);
end
🔁 randcase
: Ağırlıklı Rastgele Seçim#
randcase
, belirli olasılıklara göre dallanma seçimi yapar:
initial begin
randcase
1: $display("Düşük Olasılık");
3: $display("Orta");
6: $display("Yüksek Olasılık");
endcase
end
✅ Ağırlıkların toplamı 100 olmak zorunda değildir. Oranlar önemlidir.
📜 randsequence
: Rastgele Üretim Kuralları#
randsequence
, belirli kurallara göre rastgele ifade üretimi sağlar:
task automatic rastgele_ifade();
randsequence
expr : a '+' b;
a : 1 | 2 | 3;
b : 4 | 5;
endsequence
endtask
⚠️ Sadece simülasyon amaçlıdır, sentezlenebilir değildir.
📊 Pratik Kullanım: Stimulus Üretimi#
logic [7:0] stimulus;
initial begin
repeat (10) begin
stimulus = $urandom_range(0, 255);
#10;
$display("Stimulus = %0h", stimulus);
end
end
🚫 $random()
(Eski Verilog)#
Verilog’un eski rastgele fonksiyonu $random()
artık önerilmez çünkü:
- Platforma bağlı değişkenlik gösterir
- Tohum kontrolü yoktur
- Tutarsız sonuçlar üretir
✅ Modern testbench’lerde
$urandom()
ve$urandom_range()
tercih edilmelidir.
✅ Özet Tablosu#
Özellik | Söz Dizimi | Kullanım Alanı |
---|---|---|
Temel rastgele değer | $urandom() | Genel amaçlı, imzasız değer üretimi |
Aralıklı değer | $urandom_range(min, max) | Belli sınırlar içinde rastgele değer |
Dizi rastgele doldurma | foreach + $urandom() | Test verisi üretimi |
Ağırlıklı seçim | randcase | Olasılık tabanlı kontrol |
Kurallı üretim | randsequence | Rastgele ifade, komut zinciri üretimi |
SystemVerilog’un bu yerleşik rastgeleleştirme araçları, testbench’lerinize esneklik, çeşitlilik ve dinamik kontrol sağlar. Class yapısı kullanmadan sade test senaryoları üretmek isteyenler için ideal çözümler sunar.
📌 Bir sonraki yazıda class tabanlı
rand
,constraint
, verandomize()
özelliklerini öğreneceğiz.
module tb_randomization;
logic [3:0] opcode;
logic [7:0] data [0:3];
logic [7:0] stimulus;
initial begin
// Basic random values
int r1 = $urandom();
int r2 = $urandom_range(10, 20);
$display("Random : %0d", r1);
$display("Range 10-20: %0d", r2);
// Randomizing signals
opcode = $urandom_range(0, 15);
$display("Opcode : %0b", opcode);
// Randomize array
foreach (data[i]) begin
data[i] = $urandom_range(0, 255);
$display("data[%0d] : %0h", i, data[i]);
end
// Weighted random case
repeat (20) begin
randcase
3: $display("Selected: Low Prob");
7: $display("Selected: Medium Prob");
10: $display("Selected: High Prob");
endcase
end
// Random stimulus loop
repeat (5) begin
stimulus = $urandom_range(0, 255);
#5 $display("Stimulus : %0h", stimulus);
end
end
endmodule