Ana içeriğe geç

SystemVerilog Rastgeleleştirme – $urandom, randcase ve randsequence

· loading · loading · ·
Doğrulama Testbench Tasarımı SystemVerilog Randomizasyon Testbench $Urandom Randcase Randsequence Fonksiyonel Doğrulama
Doğrulama Testbench Tasarımı
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 20: This Article

🎲 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
#

ÖzellikSöz DizimiKullanı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 doldurmaforeach + $urandom()Test verisi üretimi
Ağırlıklı seçimrandcaseOlasılık tabanlı kontrol
Kurallı üretimrandsequenceRastgele 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, ve randomize() ö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

SystemVerilog Tasarım Serisi - This article is part of a series.
Part 20: 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 let Kullanımı – RTL ve Assertions için Tekrar Kullanılabilir İfadeler
· loading · loading
Doğrulama RTL Tasarımı SystemVerilog Let Assertion Ifadeleri Yeniden Kullanma Testbench RTL
Doğrulama RTL 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
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
SystemVerilog fork...join Yapısı – Paralel İşlem Mantığı
· loading · loading
Doğrulama SystemVerilog Fork Join Paralel İşlem Testbench Join_any Join_none
Doğrulama