🔍 Giriş#
UVM Factory, UVM testbench mimarisinde sınıfların esnek ve dinamik şekilde oluşturulmasına olanak tanıyan güçlü bir mekanizmadır. Factory sayesinde komponentlerin veya obje sınıflarının hangi versiyonlarının kullanılacağı simülasyon sırasında kolayca değiştirilebilir. Bu, testbench’in yeniden kullanılabilirliğini ve esnekliğini büyük ölçüde artırır.
🏭 UVM Factory Nedir?#
UVM Factory, aslında bir fabrika tasarım kalıbı (factory design pattern) uygulamasıdır. Bu sayede:
- Bir base sınıf için birden fazla türetilmiş sınıf olabilir.
- Factory, hangi türetilmiş sınıfın üretileceğine runtime’da karar verir.
- Konfigürasyon veya test aşamasında farklı implementasyonlar yüklenebilir.
🔨 Factory Kayıtları#
Bir sınıfı Factory ile kullanılabilir hale getirmek için uvm_component_utils
veya uvm_object_utils
makroları kullanılır:
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
// ...
endclass
Bu makro, my_driver
sınıfını factory’ye kaydeder.
🔄 Factory Override Kullanımı#
UVM Factory’nin en büyük avantajlarından biri, testbench sırasında override yapabilme yeteneğidir:
uvm_factory::get().set_type_override_by_type(base_type::get_type(), derived_type::get_type());
Ya da isim bazlı override:
uvm_factory::get().set_type_override_by_name("base_type", "derived_type");
Bu şekilde, testbench’te base_type istense bile derived_type kullanılır.
📦 Factory Kullanımı Örneği#
Aşağıdaki örnekte bir monitor sınıfının farklı versiyonunu test sırasında nasıl override edebileceğimizi görebilirsin:
initial begin
uvm_factory::get().set_type_override_by_name("my_monitor", "my_coverage_monitor");
end
Bu satır, "my_monitor"
talep edildiğinde "my_coverage_monitor"
sınıfının üretilmesini sağlar.
🎯 Neden UVM Factory Kullanılır?#
✅ Esneklik: Testbench davranışını konfigürasyon değiştirerek runtime’da değiştirebilirsin.
✅ Yeniden Kullanılabilirlik: Aynı base sınıfı kullanarak farklı alt sınıfları denemek mümkün olur.
✅ Bakım Kolaylığı: Kodda değişiklik yapmadan farklı varyantları deneyebilirsin.
🚀 Factory ile Tüketim#
Factory kullanımı sırasında komponentler veya objeler factory aracılığıyla create()
fonksiyonları ile üretilir:
my_driver drv;
drv = my_driver::type_id::create("drv", this);
Bu çağrı, factory’ye kaydedilmiş override’ları da dikkate alarak doğru sınıfın örneğini döndürür.
📌 Sonuç#
UVM Factory, doğrulama ortamına esneklik ve konfigürasyon kolaylığı katar. Testbench’in bileşenlerini dinamik olarak değiştirmek veya genişletmek istediğinde bu mekanizmayı kullanabilirsin.