Döngüsel Kısıtlamalar

Gün 3: Rastgele Üretim ve Kısıtlamalar | foreach ile dizi kısıtlamaları, unique, matris kısıtlamaları

Kaynak Kod

// =============================================================================
// GUN 3 - Konu 4: Dongusel Kisitlamalar (Iterative Constraints - foreach)
// =============================================================================

class ArrayPacket;
  rand bit [7:0] payload [];      // Dinamik dizi
  rand int       length;
  rand bit [3:0] header [4];      // Sabit boyutlu dizi

  // Dizi boyutu kisitlamasi
  constraint c_length {
    length inside {[4:16]};
    payload.size() == length;
  }

  // foreach ile eleman kisitlamalari
  constraint c_payload {
    foreach (payload[i]) {
      payload[i] inside {[8'h01:8'hFE]};  // 0x00 ve 0xFF haric
      if (i > 0)
        payload[i] != payload[i-1];        // Ardisik elemanlar farkli
    }
  }

  // Header: artan sira
  constraint c_header_ordered {
    foreach (header[i]) {
      if (i > 0)
        header[i] > header[i-1];           // Kesin artan
    }
    header[0] >= 1;
  }

  function void display();
    $display("  Length=%0d", length);
    $write("  Header: ");
    foreach (header[i]) $write("%0d ", header[i]);
    $display();
    $write("  Payload: ");
    foreach (payload[i]) $write("%02h ", payload[i]);
    $display();
  endfunction
endclass

class UniqueArray;
  rand int data [8];

  // Tum elemanlar benzersiz olmali
  constraint c_unique {
    unique {data};
    foreach (data[i])
      data[i] inside {[1:100]};
  }

  function void display();
    $write("  Unique data: ");
    foreach (data[i]) $write("%0d ", data[i]);
    $display();
  endfunction
endclass

class Matrix;
  rand bit [3:0] grid [4][4];

  // Her satir toplami 20'den kucuk
  constraint c_row_sum {
    foreach (grid[i]) {
      grid[i].sum() < 20;
    }
  }

  // Kosegen elemanlari sifir olmasin
  constraint c_diagonal {
    foreach (grid[i]) {
      grid[i][i] > 0;
    }
  }

  function void display();
    $display("  4x4 Matris:");
    foreach (grid[i]) begin
      $write("    [");
      foreach (grid[i][j])
        $write("%2d ", grid[i][j]);
      $display("] toplam=%0d", grid[i].sum());
    end
  endfunction
endclass

module iterative_constraints;
  initial begin
    ArrayPacket apkt;
    UniqueArray uarr;
    Matrix      mat;

    $display("=== Dongusel Kisitlamalar (foreach) ===\n");

    // --- Dizi kisitlamalari ---
    $display("--- ArrayPacket ---");
    apkt = new();
    repeat (3) begin
      assert(apkt.randomize()) else $fatal(1, "Randomize hata!");
      apkt.display();
      $display();
    end

    // --- Benzersiz elemanlar ---
    $display("--- UniqueArray ---");
    uarr = new();
    repeat (3) begin
      assert(uarr.randomize()) else $fatal(1, "Randomize hata!");
      uarr.display();
    end

    // --- Matris kisitlamalari ---
    $display("\n--- Matrix ---");
    mat = new();
    repeat (2) begin
      assert(mat.randomize()) else $fatal(1, "Randomize hata!");
      mat.display();
      $display();
    end

    $display("=== Dongusel Kisitlamalar Sonu ===");
    $finish;
  end
endmodule