EDA Playground'da Dene

Diziler (Arrays)

Gün 1: SystemVerilog'a Giriş ve Veri Tipleri | Sabit boyutlu, dinamik ve ilişkisel diziler

Kaynak Kod

// =============================================================================
// GUN 1 - Konu 5: Diziler (Arrays): Sabit, Dinamik, Iliskisel
// =============================================================================

module diziler;

  // -------------------------------------------------------------------------
  // SABIT BOYUTLU DIZILER (Fixed-Size Arrays)
  // -------------------------------------------------------------------------
  int fixed_arr [5];                    // 5 elemanli unpacked dizi
  logic [7:0] packed_arr [3];           // 3 elemanli, her biri 8-bit
  int matrix [3][4];                    // 2 boyutlu dizi (3 satir, 4 sutun)

  // -------------------------------------------------------------------------
  // DINAMIK DIZILER (Dynamic Arrays)
  // -------------------------------------------------------------------------
  int dyn_arr [];                       // Boyut calisma zamaninda belirlenir

  // -------------------------------------------------------------------------
  // ILISKISEL DIZILER (Associative Arrays)
  // -------------------------------------------------------------------------
  int assoc_arr [string];              // String anahtarli
  int sparse_mem [int];                // Int anahtarli

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

    // --- Sabit Boyutlu Dizi ---
    $display("--- Sabit Boyutlu Diziler ---");
    fixed_arr = '{10, 20, 30, 40, 50};
    foreach (fixed_arr[i])
      $display("  fixed_arr[%0d] = %0d", i, fixed_arr[i]);

    // 2D dizi
    $display("\n  2D Matris (3x4):");
    foreach (matrix[i, j])
      matrix[i][j] = (i * 4) + j;
    foreach (matrix[i]) begin
      $write("  Satir %0d: ", i);
      foreach (matrix[i][j])
        $write("%3d ", matrix[i][j]);
      $display();
    end

    // Dizi metodlari
    $display("\n  Dizi Metodlari:");
    $display("  sum     = %0d", fixed_arr.sum());
    $display("  min     = %0d", fixed_arr.min());
    $display("  max     = %0d", fixed_arr.max());
    $display("  unique  = %p",  fixed_arr.unique());

    // Siralama
    fixed_arr.rsort();
    $display("  rsort   = %p", fixed_arr);
    fixed_arr.shuffle();
    $display("  shuffle = %p", fixed_arr);

    // --- Dinamik Dizi ---
    $display("\n--- Dinamik Diziler ---");
    dyn_arr = new[5];
    foreach (dyn_arr[i]) dyn_arr[i] = (i + 1) * 100;
    $display("  Baslangic boyut = %0d", dyn_arr.size());
    foreach (dyn_arr[i]) $display("  dyn_arr[%0d] = %0d", i, dyn_arr[i]);

    // Boyut degistirme (mevcut veriyi koruyarak)
    dyn_arr = new[8](dyn_arr);
    dyn_arr[5] = 600; dyn_arr[6] = 700; dyn_arr[7] = 800;
    $display("\n  Yeni boyut = %0d", dyn_arr.size());
    foreach (dyn_arr[i]) $display("  dyn_arr[%0d] = %0d", i, dyn_arr[i]);

    // Silme
    dyn_arr.delete();
    $display("  Silme sonrasi boyut = %0d", dyn_arr.size());

    // --- Iliskisel Dizi ---
    $display("\n--- Iliskisel Diziler ---");
    
    // String anahtarli
    assoc_arr["sifirlama"]  = 0;
    assoc_arr["baslat"]     = 1;
    assoc_arr["durdur"]     = 2;
    assoc_arr["hata"]       = 99;

    $display("  Eleman sayisi = %0d", assoc_arr.num());
    if (assoc_arr.exists("hata"))
      $display("  'hata' anahtari mevcut, deger = %0d", assoc_arr["hata"]);

    // foreach ile gezinme
    foreach (assoc_arr[key])
      $display("  assoc_arr[\"%s\"] = %0d", key, assoc_arr[key]);

    // Seyrek bellek modeli
    $display("\n  Seyrek Bellek Modeli:");
    sparse_mem[32'h0000] = 'hAA;
    sparse_mem[32'h1000] = 'hBB;
    sparse_mem[32'hFFFF] = 'hCC;
    foreach (sparse_mem[addr])
      $display("  MEM[0x%04h] = 0x%02h", addr, sparse_mem[addr]);

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

endmodule