📚 UVM Register Model Oluşturma ve UVM Ortamına Entegrasyon#
UVM RAL (Register Abstraction Layer), tasarımdaki register ve memory yapılarını modellemek ve testbench üzerinden kontrol etmek için kapsamlı bir yapı sunar. Bu sayfa, hem register modelinin oluşturulmasını hem de UVM ortamına entegrasyonunu detaylandırır. Ayrıca, Pre-defined Field Access Policies, map()
ve set_offset()
methodları, adapter kavramı ve bus interface bağlantısı gibi kritik konuları da açıklar.
1️⃣ Register Model Oluşturma#
🔨 Manuel Modelleme#
Register model, manuel olarak uvm_reg
, uvm_reg_field
, uvm_reg_block
, uvm_mem
gibi sınıflar kullanılarak SystemVerilog ile yazılabilir:
class my_reg extends uvm_reg;
rand uvm_reg_field status;
function new(string name = "my_reg");
super.new(name, 32, UVM_NO_COVERAGE);
endfunction
virtual function void build();
status = uvm_reg_field::type_id::create("status");
status.configure(this, 8, 0, "RW", 0, 1, 1, 0);
endfunction
endclass
2️⃣ Pre-defined Field Access Policies#
UVM RAL, register veya field erişimi için hazır (pre-defined) erişim politikaları sunar. Bunlar:
"RW"
: Read-Write"RO"
: Read-Only"WO"
: Write-Only"RC"
: Read-Clear"W1C"
: Write-1-to-Clear
Örneğin:
status.configure(this, 8, 0, "RW", 0, 1, 1, 0);
Burada:
- 8 → Field genişliği (bit sayısı)
- 0 → Offset (field’in register içindeki bit pozisyonu)
"RW"
→ Pre-defined field access policy- Diğer parametreler reset değeri, volatile özelliği gibi kontrol bilgileri içerir.
3️⃣ Register Block Oluşturma ve Haritalama (map() Method)#
Bir uvm_reg_block
, register’ları veya memory’leri tek bir yapıda toplar. Register block içinde map()
methodu ile register’ların fiziksel adresleri tanımlanır:
default_map = create_map("default_map", 'h0, 4, UVM_LITTLE_ENDIAN);
default_map.add_reg(ctrl_reg, 'h00, "RW");
Burada:
'h0
→ Base address4
→ Address strideUVM_LITTLE_ENDIAN
→ Endian formatı
map()
methodu register block seviyesinde mapping oluşturmayı sağlar. create_map()
methodu ile yeni bir map yaratılır, add_reg()
ile register’lar bu haritaya eklenir.
4️⃣ set_offset() Method#
Bazen register veya register field’ların offset adresini dinamik olarak ayarlamak gerekebilir. Bunun için set_offset()
kullanılır:
ctrl_reg.set_offset('h10); // Register offset adresini 'h10 yap
Bu yöntem register modelini dinamikleştirerek farklı adres haritalarını desteklemenizi kolaylaştırır.
5️⃣ Adapter Kavramı ve Detayları#
🔌 Adapter Nedir?#
uvm_reg_adapter
, register model ile bus protokolü arasında köprü kurar. Yani register read/write çağrıları ile sequencer-driver arası bus işlemlerini birbirine bağlar.
Örnek adapter:
class my_adapter extends uvm_reg_adapter;
function new(string name = "my_adapter");
super.new(name);
supports_byte_enable = 0;
provides_responses = 1;
endfunction
virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
// RAL isteğini bus protokolüne dönüştürür
endfunction
virtual function void bus2reg(uvm_sequence_item bus_item, ref uvm_reg_bus_op rw);
// Bus'tan gelen cevabı RAL modeline aktarır
endfunction
endclass
- reg2bus(): RAL modelden bus seviyesine dönüşüm.
- bus2reg(): Bus’tan gelen veriyi RAL modele dönüştürme.
Adapter, UVM environment’da register model ile bus interface arasındaki katmandır.
6️⃣ Map ve Bus Interface’i Bağlama#
Register modelini frontdoor erişimi ile testbench’e bağlamak için:
- Register block’un default map’i ile sequencer eşleştirilir.
- Adapter atanır.
regmodel.default_map.set_sequencer(my_sequencer, my_adapter);
my_sequencer
: Bus protokolünü kontrol eden sequencer.my_adapter
: RAL erişimini bus erişimine dönüştürür.
Bu adım sayesinde:
- RAL üzerinden yapılan register read/write çağrıları, adapter aracılığıyla bus üzerinden driver’a yönlendirilir.
- Bus protokolü ile register modeli entegre edilmiş olur.
7️⃣ Entegre Kullanım Akışı#
🔎 Özetle:
1️⃣ Register Model: Register’lar, field’lar, block’lar tanımlanır ve offsetler set edilir.
2️⃣ Adapter: RAL ile bus protokolü arasında dönüştürücü yazılır.
3️⃣ Sequencer Bağlantısı: set_sequencer()
ile frontdoor erişimi kurulur.
4️⃣ Testbench Entegrasyonu: Environment içinde register model instantiate edilir ve testler yazılır.
✨ Özet Tablosu#
Konu | Açıklama |
---|---|
Pre-defined Policies | Field erişim tipleri (RW , RO , WO , RC , W1C ) |
map() Method | Register’ları adres haritasına ekler |
set_offset() Method | Register veya field adres offsetini dinamik ayarlar |
Adapter | RAL ile bus protokolü arasında köprü kurar |
Bus Interface Bağlantısı | RAL model ile sequencer/driver bağlantısı |