EDA Playground'da Dene

Kuyruklar (Queues)

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | Kuyruk yapısı ve metodları: push, pop, find, sort

Kaynak Kod

// =============================================================================
// GUN 1 - Konu 6: Kuyruklar (Queues) ve Metodlari
// =============================================================================

module kuyruklar;

  // Kuyruk tanimlama: $ sembolu ile
  int q_int [$];                           // Bos kuyruk
  string q_str [$];                        // String kuyruk
  int bounded_q [$:9];                     // Maksimum 10 elemanli sinirli kuyruk

  typedef struct {
    int    id;
    string name;
    int    data;
  } packet_t;

  packet_t q_pkt [$];                     // Struct kuyruk

  initial begin
    $display("=== SystemVerilog Kuyruklar (Queues) ===\n");

    // --- Temel Islemler ---
    $display("--- Temel Kuyruk Islemleri ---");

    // push_back: Sona ekle
    q_int.push_back(10);
    q_int.push_back(20);
    q_int.push_back(30);
    q_int.push_back(40);
    q_int.push_back(50);
    $display("  push_back sonrasi: %p", q_int);
    $display("  Boyut = %0d", q_int.size());

    // push_front: Basa ekle
    q_int.push_front(5);
    $display("  push_front(5) sonrasi: %p", q_int);

    // pop_front: Bastan cikar
    begin
      int val = q_int.pop_front();
      $display("  pop_front() = %0d, Kuyruk: %p", val, q_int);
    end

    // pop_back: Sondan cikar
    begin
      int val = q_int.pop_back();
      $display("  pop_back()  = %0d, Kuyruk: %p", val, q_int);
    end

    // --- Ekleme ve Silme ---
    $display("\n--- insert ve delete ---");
    q_int.insert(2, 25);  // Indeks 2'ye 25 ekle
    $display("  insert(2, 25): %p", q_int);

    q_int.delete(0);      // Indeks 0'i sil
    $display("  delete(0):     %p", q_int);

    // --- Erisim ---
    $display("\n--- Eleman Erisimi ---");
    $display("  Ilk eleman    q[0]   = %0d", q_int[0]);
    $display("  Son eleman    q[$]   = %0d", q_int[$]);
    $display("  Dilimleme     q[1:2] = %p", q_int[1:2]);

    // --- Arama Metodlari ---
    $display("\n--- Arama Metodlari ---");
    q_int = '{15, 30, 45, 30, 60, 15};
    $display("  Kuyruk = %p", q_int);
    
    begin
      int found [$];
      found = q_int.find with (item == 30);
      $display("  find(==30)        = %p", found);
      
      found = q_int.find_index with (item == 30);
      $display("  find_index(==30)  = %p", found);

      found = q_int.find with (item > 40);
      $display("  find(>40)         = %p", found);

      found = q_int.min();
      $display("  min               = %p", found);

      found = q_int.max();
      $display("  max               = %p", found);

      found = q_int.unique();
      $display("  unique            = %p", found);
    end

    // --- Siralama ---
    $display("\n--- Siralama ---");
    q_int.sort();
    $display("  sort()    = %p", q_int);
    q_int.rsort();
    $display("  rsort()   = %p", q_int);
    q_int.reverse();
    $display("  reverse() = %p", q_int);
    q_int.shuffle();
    $display("  shuffle() = %p", q_int);

    // --- Struct Kuyruk ---
    $display("\n--- Struct Kuyruk ---");
    q_pkt.push_back('{id: 1, name: "READ",  data: 'hAA});
    q_pkt.push_back('{id: 2, name: "WRITE", data: 'hBB});
    q_pkt.push_back('{id: 3, name: "READ",  data: 'hCC});
    
    foreach (q_pkt[i])
      $display("  Paket[%0d]: id=%0d, name=%s, data=0x%02h",
               i, q_pkt[i].id, q_pkt[i].name, q_pkt[i].data);

    // FIFO benzeri kullanim
    $display("\n  FIFO Kullanimi:");
    begin
      packet_t p;
      while (q_pkt.size() > 0) begin
        p = q_pkt.pop_front();
        $display("  Isleniyor: id=%0d, %s (0x%02h)", p.id, p.name, p.data);
      end
    end

    $display("\n=== Kuyruklar Sonu ===");
    $finish;
  end

endmodule