🔧 UVM do_ Metodları#
🚀 Giriş#
UVM’de do_
ile başlayan metodlar, kullanıcı tarafından override edilebilen virtual metodlardır. Bu metodlar, UVM base class’larında tanımlanmış olup kullanıcılara kendi özel implementasyonlarını yazabilmeleri için customization noktası sunar.
Bu yapı, genelde template method pattern kullanılarak, UVM’nin genel akışını bozmadan özelleştirme yapılmasına olanak tanır.
🗂️ uvm_object do_ Metodları#
📝 do_copy()
#
Object kopyalama işlemi için kullanılır ve copy()
metodundan otomatik olarak çağrılır.
class my_transaction extends uvm_sequence_item;
rand bit [31:0] address;
rand bit [31:0] data;
rand opcode_e opcode;
time timestamp;
function void do_copy(uvm_object rhs);
my_transaction rhs_txn;
super.do_copy(rhs);
if (!$cast(rhs_txn, rhs)) begin
`uvm_error("COPY_ERROR", "do_copy içinde cast hatası")
return;
end
// Özel kopyalama mantığı
this.address = rhs_txn.address;
this.data = rhs_txn.data;
this.opcode = rhs_txn.opcode;
this.timestamp = $time; // Kopyalama anındaki zamanı ata
endfunction
`uvm_object_utils(my_transaction)
endclass
🧐 do_compare()
#
Object karşılaştırma işlemi için kullanılır ve compare()
metodundan otomatik olarak çağrılır.
class my_transaction extends uvm_sequence_item;
rand bit [31:0] address;
rand bit [31:0] data;
rand opcode_e opcode;
bit ignore_timestamp = 1; // Kontrol flag'i
function bit do_compare(uvm_object rhs, uvm_comparer comparer);
my_transaction rhs_txn;
bit result = super.do_compare(rhs, comparer);
if (!$cast(rhs_txn, rhs)) begin
`uvm_error("COMPARE_ERROR", "do_compare içinde cast hatası")
return 0;
end
// Özel karşılaştırma mantığı
result &= (this.address == rhs_txn.address);
result &= (this.data == rhs_txn.data);
result &= (this.opcode == rhs_txn.opcode);
// İsteğe bağlı olarak timestamp karşılaştırması
if (!ignore_timestamp)
result &= (this.timestamp == rhs_txn.timestamp);
return result;
endfunction
`uvm_object_utils(my_transaction)
endclass
📋 do_print()
#
Object yazdırma işlemini özelleştirir, print()
ve sprint()
metodları tarafından kullanılır.
class cpu_instruction extends uvm_sequence_item;
rand bit [31:0] instruction;
rand bit [4:0] rs, rt, rd;
string mnemonic;
function void do_print(uvm_printer printer);
super.do_print(printer);
// Özel yazdırma formatı
printer.print_string("mnemonic", mnemonic);
printer.print_field("instruction", instruction, 32, UVM_HEX);
printer.print_field("rs", rs, 5, UVM_DEC);
printer.print_field("rt", rt, 5, UVM_DEC);
printer.print_field("rd", rd, 5, UVM_DEC);
// Decode edilmiş instruction bilgisi
string decoded = decode_instruction();
printer.print_string("decoded", decoded);
endfunction
function string decode_instruction();
return $sformatf("%s r%0d, r%0d, r%0d", mnemonic, rd, rs, rt);
endfunction
`uvm_object_utils(cpu_instruction)
endclass
📦 do_pack()
ve do_unpack()
#
Serialization/deserialization (pack/unpack) işlemleri için kullanılır.
class network_packet extends uvm_sequence_item;
bit [47:0] dest_mac;
bit [47:0] src_mac;
bit [15:0] ethertype;
byte payload[$];
bit [31:0] crc;
function void do_pack(uvm_packer packer);
super.do_pack(packer);
// Network byte order ile pack
packer.pack_field(dest_mac, 48);
packer.pack_field(src_mac, 48);
packer.pack_field(ethertype, 16);
// Payload uzunluğu ve payload'u pack et
packer.pack_field(payload.size(), 32);
foreach (payload[i])
packer.pack_field(payload[i], 8);
packer.pack_field(crc, 32);
endfunction
function void do_unpack(uvm_packer packer);
int payload_size;
super.do_unpack(packer);
dest_mac = packer.unpack_field(48);
src_mac = packer.unpack_field(48);
ethertype = packer.unpack_field(16);
// Payload unpack et
payload_size = packer.unpack_field(32);
payload = new[payload_size];
foreach (payload[i])
payload[i] = packer.unpack_field(8);
crc = packer.unpack_field(32);
endfunction
`uvm_object_utils(network_packet)
endclass
💡 Özet#
🔹 do_
metodları, object davranışını özelleştirmenizi sağlarken UVM’in standart akışını bozmadan esnek bir yapı sunar.
🔹 Bu metodlar genellikle copy()
, compare()
, print()
gibi üst seviye metodlar tarafından otomatik çağrılır.
🔹 Özel ihtiyaçlara göre object’lerinizi geliştirmek ve güçlü verification component’leri oluşturmak için bu metodları kullanabilirsiniz. 🚀