🔍 Giriş#
Testbench’ler karmaşıklaştıkça virtual sequence ve virtual sequencer kullanımı, UVM’de farklı arayüzler ve sequencer’lar arasında stimulus’u koordine etmek için çok önemlidir. Sequence library ve sequence arbitration ise sequence yönetimini geliştiren, yeniden kullanım, rastgeleleştirme ve paylaşılan kaynaklara erişimde kontrol sağlayan yapılar sunar.
🚀 Virtual Sequence#
Virtual sequence, kendisi doğrudan transaction üretmeyen ancak diğer sequence’ları başlatan ve koordine eden bir sequence türüdür. Genellikle SoC doğrulamasında, farklı arayüzlerdeki sequencer’lar üzerinde senkronize testler yapmak için kullanılır (ör. UART, SPI, PCIe).
Örnek:
class top_level_virtual_sequence extends uvm_sequence #(uvm_sequence_item);
`uvm_object_utils(top_level_virtual_sequence)
// Alt seviyedeki sequencer handle'ları
virtual_uart_sequencer uart_seqr;
virtual_spi_sequencer spi_seqr;
function new(string name = "top_level_virtual_sequence");
super.new(name);
endfunction
task body();
uart_seq uart_seq_inst = uart_seq::type_id::create("uart_seq_inst");
spi_seq spi_seq_inst = spi_seq::type_id::create("spi_seq_inst");
uart_seq_inst.start(uart_seqr);
spi_seq_inst.start(spi_seqr);
endtask
endclass
🧩 Virtual Sequencer#
Virtual sequencer, driver’a bağlı olmayan ancak alt seviyedeki sequencer handle’larını tutan bir sequencer’dır. Virtual sequence’ların, alt seviyedeki sequencer’lara erişip sequence başlatmasına imkan tanır.
Örnek:
class top_virtual_sequencer extends uvm_sequencer #(uvm_sequence_item);
`uvm_component_utils(top_virtual_sequencer)
uart_sequencer uart_seqr;
spi_sequencer spi_seqr;
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
endclass
📚 Sequence Library#
Sequence library, birden fazla sequence’ı rastgele veya senaryoya göre seçerek çalıştırmak için kullanılan bir yapıdır. Şunlar için kullanışlıdır:
- Farklı test senaryoları üretmek
- Sequence’ları rastgele veya constraint’li seçmek
- Layered test yapıları kurmak
Örnek:
uvm_sequence_library #(my_sequence_base_type) seq_lib;
initial begin
seq_lib = new("seq_lib");
seq_lib.add_sequence(seq1::get_type());
seq_lib.add_sequence(seq2::get_type());
seq_lib.randomize();
seq_lib.start(my_sequencer);
end
🎯 Sequence Arbitration#
Birden fazla sequence aynı sequencer’a erişmek istediğinde, sequence arbitration devreye girer ve paylaşılan kaynaklara erişimi kontrol eder. UVM’de built-in arbitration policy’leri vardır:
- FIFO: Varsayılan, ilk gelen ilk hizmet alır.
- Random: Bekleyen sequence’lar arasından rastgele seçim yapar.
- Priority: Sequence priority değerine göre seçim yapar.
Sequencer üzerinde arbitration policy şu şekilde ayarlanabilir:
my_sequencer.set_arbitration(UVM_SEQ_ARB_RANDOM);
📝 Özet#
Kavram | Açıklama |
---|---|
Virtual Sequence | Birden fazla sequencer’a aynı anda sequence başlatır ve koordine eder. |
Virtual Sequencer | Alt seviyedeki sequencer handle’larını tutar. |
Sequence Library | Sequence’ları gruplayarak rastgele veya senaryoya göre çalıştırır. |
Sequence Arbitration | Paylaşılan sequencer’a aynı anda ulaşmak isteyen sequence’lar arasında seçim yapar. |