What is a UVM sequence?
UVM sequence由多個data item組成,這些data item可以以不同的方式組合在一起以創建出各種scenario。sequence會由指定的sequencer執行,然後sequencer將資料項傳送到driver。所以sequence是verification plan中的最主要的刺激(stimuli)。
Steps to create a UVM sequence
建立一個繼承
uvm_sequence的class,然後註冊到factory上,因為uvm_sequence是繼承自uvm_transactionobject,他的base其實是uvm_object,所以要使用uvm_object_utils而不是使用uvm_component_utils1
2
3
4
5
6
7
8
9
10
11// my_sequence is user-given name for this class that has been derived from "uvm_sequence"
class my_sequence extends uvm_sequence;
// `uvm_object_utils instead of `uvm_component_utils because sequence is a uvm_transaction object
`uvm_object_utils (my_sequence)
function new (string name = "my_sequence");
super.new (name);
endfunction
...
endclass宣告預設的sequencer來執行這個sequence
1
2
3
4
5class my_sequence extends uvm_sequence;
...
`uvm_declare_p_sequencer (my_sequencer)
...
endclass實作body method
class my_sequence extends uvm_sequence;
…
virtual task body ();
// Stimulus for this sequence
endtask
…
endclass
UVM Sequence Example
1 | class my_sequence extends uvm_sequence; |
NOTE:
my_sequence繼承了uvm_sequence。- 它使用``uvm_object_utils
向factory註冊,因為它是一個transaction item,transaction item是繼承uvm_object,而不是繼承uvm_component`。 - 主要的stimulus是寫在
body()task,而如果有需要在執行sequence之前或之後做什麼事情,可以callpre_body()和post_body()callback function - data packet建立好後由
uvm_domacro傳送此data packet並執行
``uvm_domacro不會呼叫pre_body和post_body`。
``uvm_do` macro會allocate my_data類型的object給pkt,將它randomize然後傳送給此sequence關聯的sequencer然後將其執行。使用這個macro可以減少要寫的code。