🧩 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.