Ana içeriğe geç

UVM'de uvm_object Sınıfı

· loading · loading · ·
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Uvm_object
Eğitim UVM Doğrulama
Axolot Logic
Yazar
Axolot Logic
Sayısal Tasarım Mühendisi
Table of Contents
UVM Serisi - This article is part of a series.
Part 4: This Article

🧩 UVM Object
#

🚀 Giriş
#

uvm_object, UVM kütüphanesindeki tüm nesnelerin temelini oluşturan temel sınıftır. Bu sınıf, veri nesneleri, transaction’lar, sequence’lar ve konfigürasyon nesneleri gibi yapılar için temel sağlar. Adlandırma, kimlik atama, klonlama, karşılaştırma, serileştirme ve string’e dönüştürme gibi nesne tabanlı özellikler sunarak tekrar kullanılabilir ve esnek doğrulama ortamlarının kurulmasına katkıda bulunur.


🏗️ Sınıf Tanımı
#

Aşağıda uvm_object sınıfının temel metodlarını ve özelliklerini gösteren sadeleştirilmiş bir örnek yer almaktadır:

virtual class uvm_object extends uvm_void;

  // 🔹 Yapıcı (constructor): İsteğe bağlı bir isimle yeni bir nesne oluşturur
  extern function new(string name = "");

  // 🔹 Nesnenin yerel ismini döndürür
  extern virtual function string get_name();

  // 🔹 Nesnenin tam hiyerarşik ismini döndürür
  extern virtual function string get_full_name();

  // 🔹 Nesnenin tür sarmalayıcısını döndürür (not: static)
  extern static function uvm_object_wrapper get_type();

  // 🔹 Fabrika kullanarak dinamik olarak yeni bir nesne oluşturur
  virtual function uvm_object create(string name=""); 
    return null; 
  endfunction

  // 🔹 Nesnenin bir kopyasını (deep copy) oluşturur
  extern virtual function uvm_object clone();

  // 🔹 Aynı tipte başka bir nesneden değerleri kopyalar
  extern function void copy(uvm_object rhs);

  // 🔹 Bu nesneyi başka bir nesne ile karşılaştırır
  extern function bit compare(uvm_object rhs, uvm_comparer comparer=null);

  // 🔹 Nesnenin içeriğini yazdırır
  extern function void print(uvm_printer printer=null);

  // 🔹 Nesneyi string temsiline çevirir
  extern virtual function string convert2string();

  // 🔹 Nesnenin içeriğini bit dizisine paketler
  extern function int pack(ref bit bitstream[], input uvm_packer packer=null);

  // 🔹 Nesnenin içeriğini bit dizisinden açar
  extern function int unpack(ref bit bitstream[], input uvm_packer packer=null);

  // 🔹 Nesnenin benzersiz, sayısal ID’sini döndürür
  // (Bu metod orijinal UVM’de genelde bulunmaz veya uygulama spesifik olabilir. Eklenmek isteniyorsa virtual yazılabilir.)
  // virtual function int get_inst_id(); // Dosyada varsa eklenebilir.

endclass

🔎 Temel Özellikler
#

🆔 Nesne Kimliği
#

Her uvm_object örneği benzersiz bir ID’ye sahiptir ve isteğe bağlı olarak isim verilebilir. Bu özellik, debug, loglama ve testbench içindeki analizler için oldukça faydalıdır.

Instance ID & İsim Yönetimi
#

Nesnelere isim ve ID atayarak debug sürecini kolaylaştırabilir, testlerin okunabilirliğini artırabilirsiniz.

class my_data extends uvm_object;
  function new(string name = "my_data");
    super.new(name);
    `uvm_info("CREATE", $sformatf("Created %s with ID %0d",
              get_name(), get_inst_id()), UVM_LOW)
  endfunction
endclass

// Kullanım
my_data data1 = new("packet_data");
my_data data2 = new("config_data");
// Her nesneye benzersiz bir ID atanır

⚙️ Temel Nesne Metodları
#

Bu metodlar, doğrulama ortamlarında nesne yönetimi için kritik işlevler sağlar.

🗂️ clone(), copy(), compare(), print(), convert2string(), pack() ve unpack() Metodları
#

Aşağıda bu temel metodların tek bir uvm_object türevli sınıf içinde nasıl tanımlandığını gösteren örnek bir kullanım yer almaktadır:

class my_packet extends uvm_object;
  rand bit [7:0] data;
  rand bit [31:0] addr;

  `uvm_object_utils_begin(my_packet)
    `uvm_field_int(data, UVM_ALL_ON)
    `uvm_field_int(addr, UVM_ALL_ON)
  `uvm_object_utils_end

  function new(string name = "my_packet");
    super.new(name);
  endfunction

  // 🔹 clone(): Nesneyi derin kopyalar ve yeni nesne döner
  function uvm_object clone();
    my_packet cloned_obj;
    cloned_obj = my_packet::type_id::create(get_name());
    cloned_obj.copy(this);
    return cloned_obj;
  endfunction

  // 🔹 copy(): Başka bir nesneden değerleri kopyalar
  function void copy(uvm_object rhs);
    my_packet rhs_obj;
    if (!$cast(rhs_obj, rhs)) begin
      `uvm_error("COPY", "Kopyalama sırasında tip uyuşmazlığı!")
      return;
    end
    this.data = rhs_obj.data;
    this.addr = rhs_obj.addr;
  endfunction

  // 🔹 compare(): İki nesneyi karşılaştırır
  function bit compare(uvm_object rhs, uvm_comparer comparer = null);
    my_packet rhs_obj;
    if (!$cast(rhs_obj, rhs)) return 0;
    if (this.data != rhs_obj.data) return 0;
    if (this.addr != rhs_obj.addr) return 0;
    return 1;
  endfunction

  // 🔹 print(): Nesnenin içeriğini yazdırır
  function void print(uvm_printer printer = null);
    if (printer == null)
      printer = uvm_default_table_printer;
    super.print(printer);
  endfunction

  // 🔹 convert2string(): Nesneyi tek satırlık string'e dönüştürür
  function string convert2string();
    return $sformatf("Packet[data=0x%0h, addr=0x%0h]", data, addr);
  endfunction

  // 🔹 pack(): Nesneyi bitstream'e paketler (serileştirir)
  function int pack(ref bit bitstream[], input uvm_packer packer = null);
    int num_bits = 0;
    num_bits += uvm_pack_int(data, bitstream, packer);
    num_bits += uvm_pack_int(addr, bitstream, packer);
    return num_bits;
  endfunction

  // 🔹 unpack(): Nesneyi bitstream'den açar (deserileştirir)
  function int unpack(ref bit bitstream[], input uvm_packer packer = null);
    int num_bits = 0;
    num_bits += uvm_unpack_int(data, bitstream, packer);
    num_bits += uvm_unpack_int(addr, bitstream, packer);
    return num_bits;
  endfunction
endclass

📝 Özet
#

Bu temel metodlar sayesinde:
✅ Nesneleri kolayca kopyalayabilir, karşılaştırabilir, yazdırabilir ve string’e dönüştürebilirsiniz.
✅ Nesneleri serileştirebilir ve deserileştirebilir, böylece testbench bileşenleri arasında veri paylaşabilirsiniz.
✅ Tekrarlayan kodlardan kurtularak doğrulama ortamınızı daha hızlı ve bakımı kolay hale getirebilirsiniz.


UVM Serisi - This article is part of a series.
Part 4: This Article

Related

UVM Temel Sınıfları
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Sınıf Hiyerarşisi
Eğitim UVM Doğrulama
UVM Utility Field Makroları
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Utility Makroları
Eğitim UVM Doğrulama
UVM'de Konfigürasyon Sınıfları Kullanımı
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Konfigürasyon Sınıfları Randomizasyon
Eğitim UVM Doğrulama
UVM'de Package Kullanımı ve Önemi
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Package Kullanımı Testbench Organizasyonu
Eğitim UVM Doğrulama
UVM'de Virtual Sequence, Virtual Sequencer, Sequence Library ve Sequence Arbitration
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Virtual Sequence Sequence Arbitration
Eğitim UVM Doğrulama
UVM'de _decl Makrosu Kullanımı
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog _Decl Makrosu Analysis Port
Eğitim UVM Doğrulama