UVM Sequencer

2023-11-27
UVM

A sequencer generates data transactions as class objects and sends it to the Driver for execution. It is recommended to extend uvm_sequencer base class since it contains all of the functionality required to allow a sequence to communicate with a driver. The base class is parameterized by the request and response item types that can be handled by the sequencer.

Sequencer的工作是產生data object 傳送給Driver執行。通常Sequencer會繼承自 uvm_sequencer,就會繼承 uvm_sequencer所有可以與Driver通訊的相關功能。

Usage

預設情況下,request type和response type相同,如果request和reponse不同的話可以在產生instance的時候指定第二個參數。除非有其他額外的port要include進來,不然應該直接將其實例化作為uvm_sequencer所需要的參數帶入。

1
2
3
4
5
// class uvm_sequencer #(type REQ=uvm_sequence_item, RSP=REQ)
// extends uvm_sequencer_param_base #(REQ, RSP);

uvm_sequencer #(my_data) seqr0; // without RSP
uvm_sequencer #(my_data, data_rsp) seqr0; // with RSP

Sequencer生成的object在靈活性(flexibility)和可重用性(re-usability)方面有很大的限制。因此要使用UVM_sequence來克服這個限制。

Custom Sequencer

其實並不需要客製化sequencer來執行每個sequence或agent。但是我們一樣可以建立具有額外自己客製化功能的 UVM sequencer,並在整個testbench中建立它的instance。

1
2
3
4
5
6
class my_sequencer extends uvm_sequencer;
`uvm_component_utils (my_sequencer)
function new (string name="m_sequencer", uvm_component parent);
super.new (name, parent);
endfunction
endclass

Class Hierarchy