Ana içeriğe geç

UVM'de do_ Metodları

· loading · loading · ·
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Do_ Metodları
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 7: This Article

🔧 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. 🚀


UVM Serisi - This article is part of a series.
Part 7: 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 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
UVM'de uvm_agent Kullanımı ve Adder Örneği
· loading · loading
Eğitim UVM Doğrulama UVM Doğrulama SystemVerilog Uvm_agent Testbench Yapısı
Eğitim UVM Doğrulama