constraint_mode

Gün 3: Rastgele Üretim ve Kısıtlamalar | Çalışma zamanında kısıtlamaları açma/kapatma

Kaynak Kod

// =============================================================================
// GUN 3 - Konu 6: Calisma Zamaninda Kisitlamalari Acma/Kapatma (constraint_mode)
// =============================================================================

class FlexPacket;
  rand bit [15:0] address;
  rand bit [31:0] data;
  rand bit [2:0]  burst_len;
  rand bit        write_en;
  rand bit [1:0]  resp;

  // Adres araligi kisitlamasi
  constraint c_addr_low {
    address inside {[16'h0000:16'h00FF]};
  }

  constraint c_addr_high {
    address inside {[16'hFF00:16'hFFFF]};
  }

  // Veri kisitlamasi
  constraint c_data_nonzero {
    data != 0;
  }

  // Burst kisitlamasi
  constraint c_burst_aligned {
    (burst_len > 0) -> (address[1:0] == 2'b00);  // Hizali
  }

  // Yazma/okuma kisitlamasi
  constraint c_write_mode {
    write_en == 1;
  }

  constraint c_read_mode {
    write_en == 0;
    data == 0;
  }

  // Hata yaniti kisitlamasi
  constraint c_no_error {
    resp == 0;  // OKAY
  }

  constraint c_force_error {
    resp inside {2'b10, 2'b11};  // SLVERR veya DECERR
  }

  function new();
    // Baslangicta cakisan kisitlamalari kapat
    c_addr_high.constraint_mode(0);
    c_read_mode.constraint_mode(0);
    c_force_error.constraint_mode(0);
  endfunction

  function void display();
    $display("  Addr=0x%04h | Data=0x%08h | Burst=%0d | W/R=%s | Resp=%0b",
             address, data, burst_len, write_en ? "WRITE" : "READ", resp);
  endfunction
endclass

module constraint_mode_ornek;
  initial begin
    FlexPacket pkt;
    $display("=== constraint_mode Kullanimi ===\n");

    pkt = new();

    // --- Senaryo 1: Dusuk adres, yazma ---
    $display("--- Senaryo 1: Dusuk Adres Yazma ---");
    repeat (3) begin
      assert(pkt.randomize()) else $fatal(1, "Hata!");
      pkt.display();
    end

    // --- Senaryo 2: Yuksek adres bolgesine gec ---
    $display("\n--- Senaryo 2: Yuksek Adres Bolgesi ---");
    pkt.c_addr_low.constraint_mode(0);   // Dusuk adresi kapat
    pkt.c_addr_high.constraint_mode(1);  // Yuksek adresi ac
    repeat (3) begin
      assert(pkt.randomize()) else $fatal(1, "Hata!");
      pkt.display();
    end

    // --- Senaryo 3: Okuma modu ---
    $display("\n--- Senaryo 3: Okuma Modu ---");
    pkt.c_write_mode.constraint_mode(0); // Yazma kapat
    pkt.c_read_mode.constraint_mode(1);  // Okuma ac
    repeat (3) begin
      assert(pkt.randomize()) else $fatal(1, "Hata!");
      pkt.display();
    end

    // --- Senaryo 4: Hata enjeksiyonu ---
    $display("\n--- Senaryo 4: Hata Yaniti ---");
    pkt.c_read_mode.constraint_mode(0);
    pkt.c_write_mode.constraint_mode(1);
    pkt.c_no_error.constraint_mode(0);    // Normal yaniti kapat
    pkt.c_force_error.constraint_mode(1); // Hata yanitini ac
    repeat (3) begin
      assert(pkt.randomize()) else $fatal(1, "Hata!");
      pkt.display();
    end

    // --- Senaryo 5: Tum kisitlamalari kapat (tam rastgele) ---
    $display("\n--- Senaryo 5: Serbest (Tum constraint kapali) ---");
    pkt.constraint_mode(0);  // TUM kisitlamalari kapat
    repeat (3) begin
      assert(pkt.randomize()) else $fatal(1, "Hata!");
      pkt.display();
    end

    // --- Durumu sorgula ---
    $display("\n--- Constraint Durumlari ---");
    pkt.constraint_mode(1);  // Hepsini ac
    pkt.c_addr_high.constraint_mode(0);
    pkt.c_read_mode.constraint_mode(0);
    pkt.c_force_error.constraint_mode(0);
    $display("  c_addr_low    = %0d", pkt.c_addr_low.constraint_mode());
    $display("  c_addr_high   = %0d", pkt.c_addr_high.constraint_mode());
    $display("  c_write_mode  = %0d", pkt.c_write_mode.constraint_mode());
    $display("  c_read_mode   = %0d", pkt.c_read_mode.constraint_mode());

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