🚗 UVM Sürücü Kullanımı ve Toplayıcı (Adder) Örneği (Güncel)#
🚀 Giriş#
uvm_driver
, bir UVM testbench’inde sequencer ile DUT (Test Edilen Tasarım) arasındaki köprü görevi gören temel bileşendir.
Sürücü, sequencer‘dan sequence item’ları alır ve bunları virtual interface kullanarak DUT’un girişlerine uygular.
🗂️ uvm_driver
Nedir?#
uvm_driver
,get_next_item()
kullanarak sequencer’dan transaction (işlem) çeker.- Transaction verilerini DUT girişlerine uygular.
- Transaction tamamlandığında sequencer’a
item_done()
ile bildirim yapar. - DUT ile bağlantı kurmak için virtual interface kullanır.
- Simülasyon sırasında önemli mesajlar kaydeder.
📝 Güncel Toplayıcı Sürücü Örneği#
Aşağıda güncellenmiş bir adder_driver
örneği bulunuyor. Bu sürücü, adder_transaction
sequence item’larını sequencer’dan alır ve DUT’a virtual interface üzerinden uygular.
class adder_driver extends uvm_driver #(adder_transaction);
virtual adder_if vif;
adder_config cfg;
`uvm_component_utils(adder_driver)
function new(string name = "adder_driver", uvm_component parent);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if (!uvm_config_db #(virtual adder_if)::get(this, "", "vif", vif))
`uvm_fatal("DRIVER", "No virtual interface specified!");
if (!uvm_config_db #(adder_config)::get(this, "", "cfg", cfg))
`uvm_fatal("DRIVER", "No config specified!");
endfunction
virtual task run_phase(uvm_phase phase);
adder_transaction tr;
forever begin
seq_item_port.get_next_item(tr);
// Delay (use config)
repeat(cfg.delay_min + $urandom_range(0, cfg.delay_max - cfg.delay_min)) // konfigüraston sınıfı tarafından tanımlanan delay kadar bekle
@(posedge vif.clk);
@(posedge vif.clk);
vif.num1 <= tr.num1;
vif.num2 <= tr.num2;
@(posedge vif.clk);
tr.result <= vif.out;
tr.print();
seq_item_port.item_done();
end
endtask
endclass
🔍 Temel Noktalar#
Virtual Interface (
vif
): Sürücüyü DUT’un clock ve veri portlarına bağlar.build_phase()
:uvm_config_db
kullanarak virtual interface’i alır ve bağlar.run_phase()
:seq_item_port.get_next_item()
ile transaction alır.- Girişleri (
num1
,num2
) DUT’a uygular. - Bir clock döngüsü bekler ve DUT sonucunu okur (
vif.out
). - Transaction objesini günceller.
item_done()
ile transaction’ın tamamlandığını bildirir.
💡 Özet#
🔹 uvm_driver
, sequencer’dan gelen stimulus’u DUT’a uygular.
🔹 Bu toplayıcı örneğinde operand değerleri DUT’a gönderilir ve sonuç okunur.
🔹 Virtual interface sayesinde sinyallere kolay erişim sağlanır.
🔹 Sürücü, UVM testbench’inde kritik bir bileşendir ve stimulus teslimini ve sonuç toplamasını düzenler.