rand ve randc

Gün 3: Rastgele Üretim ve Kısıtlamalar | Rastgele değişkenler: rand (rastgele) ve randc (döngüsel)

Kaynak Kod

// =============================================================================
// GUN 3 - Konu 1: Rastgele Test ve rand/randc Degiskenleri
// =============================================================================

class Packet;
  // rand: Her randomize() cagrisinda rastgele deger uretir
  rand bit [7:0]  data;
  rand bit [3:0]  addr;
  rand bit [1:0]  burst_type;
  
  // randc: Tum olasi degerleri tuketmeden tekrar etmez (cyclic random)
  randc bit [2:0] priority;  // 0-7 arasi, her biri bir kez, sonra tekrar

  // Rastgele olmayan degiskenler
  int id;
  static int count = 0;

  function new();
    this.id = count++;
  endfunction

  function void display();
    $display("  Paket #%0d: data=0x%02h, addr=0x%01h, burst=%0d, priority=%0d",
             id, data, addr, burst_type, priority);
  endfunction
endclass

module rand_ve_randc;
  initial begin
    Packet pkt;
    
    $display("=== rand ve randc Degiskenleri ===\n");

    pkt = new();

    // --- rand: Her seferinde rastgele ---
    $display("--- rand: 10 rastgele paket ---");
    repeat (10) begin
      if (!pkt.randomize())
        $fatal(1, "Randomize basarisiz!");
      pkt.display();
    end

    // --- randc: Dongusel rastgele ---
    $display("\n--- randc: priority (0-7 dongusel) ---");
    $display("  Ilk dongu (8 deger):");
    repeat (8) begin
      void'(pkt.randomize());
      $display("    priority = %0d", pkt.priority);
    end
    $display("  Ikinci dongu (tekrar 8 deger, farkli sira):");
    repeat (8) begin
      void'(pkt.randomize());
      $display("    priority = %0d", pkt.priority);
    end

    // --- std::randomize (sinif disinda) ---
    $display("\n--- std::randomize (Bagimsiz) ---");
    begin
      int x, y;
      repeat (5) begin
        if (!std::randomize(x, y) with { x inside {[1:100]}; y < x; })
          $fatal(1, "std::randomize basarisiz!");
        $display("  x = %0d, y = %0d", x, y);
      end
    end

    $display("\n=== rand ve randc Sonu ===");
    $finish;
  end
endmodule