🔍 Giriş#
UVM Sequence, testbench’te stimulus üretmek için kullanılan temel yapılardan biridir. Sequence başlatma, stimulus akışını kontrol etmek için kritik öneme sahiptir. Bu yazıda uvm_do makrosu ve alternatif yöntemlerle Sequence nasıl başlatılır, hangi fazlarda objection kullanılır ve hangi durumlarda hangi yöntemi tercih etmeliyiz sorularını ele alacağız.
🚀 Sequence Başlatma Yöntemleri#
1️⃣ uvm_do
Makrosu#
UVM’de en yaygın kullanılan makro:
`uvm_do(seq_item)
Bu makro aslında şunları yapar:
create()
çağırarak seq_item nesnesini oluşturur.randomize()
metodunu çağırarak seq_item’i rastgeleleştirir (eğer varsa).start_item()
ile item’i başlatır.finish_item()
ile item’in işlenmesini tamamlar.
👉 Yani uvm_do
, tek satırda hem item’i yaratır hem de gönderir.
2️⃣ Adım Adım Sequence Başlatma (uvm_do’nun yaptığı adımlar)#
Eğer uvm_do
kullanmak istemiyorsak veya adımları kontrol etmek istersek şu şekilde elle adım adım yazabiliriz:
my_item item;
item = my_item::type_id::create("item");
// Rastgeleleştirme (varsa constraint ekleyebilirsin)
if (!item.randomize())
`uvm_error("MY_SEQ", "Randomization failed")
// Item’i başlat
start_item(item);
// (Varsa) field’ları doldur
item.data = 8'hFF;
// Item’i tamamla
finish_item(item);
Bu yöntem özellikle bazı alanları elle set etmek veya özel constraint uygulamak istediğimizde kullanışlıdır.
3️⃣ Sequencer Üzerinden Sequence Başlatma#
Bir sequence’ı doğrudan sequencer’a start ederek de başlatabiliriz:
my_sequence seq;
seq = my_sequence::type_id::create("seq");
seq.start(my_sequencer);
Bu yöntem, genellikle nested sequence veya daha kompleks akışlar için tercih edilir.
🛠️ uvm_send
Kullanımı#
uvm_send
makrosu, sequence içindeki tek item’leri göndermek için kullanılır:
`uvm_send(item)
Arka planda:
start_item(item)
- (randomize veya manual değer ataması)
finish_item(item)
adımlarını tek seferde çalıştırır.
📌 Objection Kullanımı#
UVM’de sequence çalıştırırken simülasyonun bitmesini önlemek için genellikle raise_objection
kullanılır. Bunun yeri:
start_of_simulation_phase
run_phase
main_phase
örnek:
phase.raise_objection(this, "My sequence started");
...
phase.drop_objection(this, "My sequence completed");
💡 Not: Objection’ı sequence içinde ya da test içinde kullanabilirsin. Bu, simülasyonun ne zaman bitmesi gerektiğini kontrol etmeni sağlar.
🎯 Ne Zaman Hangi Yöntemi Kullanmalı?#
Yöntem | Kullanım Durumu |
---|---|
uvm_do | Basit stimulus akışları, hızlı geliştirme |
Adım Adım Başlatma | Alanları elle doldurmak veya özel constraint uygulamak gerektiğinde |
Sequencer ile start | Nested sequence veya akış kontrolü gerektiğinde |
uvm_send | Tek item’ler için hızlı gönderim |
📝 Sonuç#
UVM Sequence başlatma yöntemleri doğrulama ortamına esneklik ve kontrol katar. uvm_do
gibi makrolar hızlı geliştirme sağlarken, adım adım başlatma yöntemleri özel ihtiyaçlar için tercih edilir. Hangi yöntemi seçersen seç, testbench’in yapısına ve akış kontrolüne dikkat etmeyi unutma!