🔎 UVM Monitor Kullanımı ve Toplayıcı (Adder) Örneği#
🚀 Giriş#
uvm_monitor
, bir UVM testbench’inde kritik bir bileşendir ve DUT (Test Edilen Tasarım) üzerinden akan sinyalleri ve verileri gözlemlemekten sorumludur.
Sürücülerden farklı olarak, monitor’lar stimulus üretmez; bunun yerine, DUT’tan verileri pasif olarak yakalar ve bu verileri analysis port kullanarak diğer bileşenlere (örneğin coverage collector veya scoreboard) iletir.
🗂️ uvm_monitor
Nedir?#
uvm_monitor
, DUT sinyallerini okur ve bunları transaction nesnelerine dönüştürür.- Yakalanan verileri bir analysis port ile diğer testbench bileşenlerine gönderir.
- DUT sinyallerine bağlanmak için virtual interface kullanır.
- Coverage ve testbench davranışının debug edilmesinde önemli rol oynar.
📝 Toplayıcı Monitor Örneği#
Aşağıda bir adder_monitor
örneği bulunuyor. Bu monitor, adder_if
virtual interface kullanarak DUT girişlerini ve çıkışını okur, ve yakalanan verileri adder_transaction
nesnesi olarak analysis port üzerinden iletir.
class adder_monitor extends uvm_monitor;
`uvm_component_utils(adder_monitor)
virtual adder_if vif;
uvm_analysis_port #(adder_transaction) analysis_port;
function new(string name = "adder_monitor", uvm_component parent);
super.new(name, parent);
analysis_port = new("analysis_port", this);
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("NO_VIF", "adder_monitor için virtual interface ayarlanmamış!")
endfunction
virtual task run_phase(uvm_phase phase);
adder_transaction tr;
forever begin
tr = adder_transaction::type_id::create("tr");
@(posedge vif.clk);
tr.num1 = vif.num1;
tr.num2 = vif.num2;
@(posedge vif.clk);
tr.result = vif.out;
// Transaction’ı analysis_port üzerinden ilet
analysis_port.write(tr);
// Transaction’ı yazdır
`uvm_info(get_type_name(), $sformatf("Transaction: num1=%0d, num2=%0d, result=%0d", tr.num1, tr.num2, tr.result), UVM_MEDIUM);
end
endtask
endclass
🔍 Açıklamalar#
Virtual Interface (
vif
): Monitor’u DUT clock ve veri portlarına bağlar.analysis_port
: Yakalanan verileri scoreboard veya coverage collector gibi bileşenlere iletir.build_phase()
:uvm_config_db
kullanarak virtual interface’i alır ve bağlar.run_phase()
:- DUT girişlerini (
num1
,num2
) ve çıkışını (out
) okur. analysis_port.write()
ile verileri gönderir.uvm_info()
ile transaction bilgilerini yazdırır.
- DUT girişlerini (
💡 Özet#
🔹 uvm_monitor
, DUT’tan gelen verileri pasif olarak yakalar ve testbench’te diğer bileşenlerin kullanımına sunar.
🔹 Analysis port kullanarak bu verileri scoreboard veya coverage collector’a iletir.
🔹 Bu adder örneğinde, DUT’un toplama girişleri ve çıkışı yakalanır ve testbench’e iletilir.
🔹 Monitörler, sağlam ve izlenebilir bir testbench ortamı oluşturmak için çok önemlidir.