UVM Sequence

2023-11-29
UVM

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

  1. 建立一個繼承uvm_sequence的class,然後註冊到factory上,因為uvm_sequence是繼承自uvm_transaction object,他的base其實是uvm_object,所以要使用uvm_object_utils而不是使用uvm_component_utils

    1
    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
  2. 宣告預設的sequencer來執行這個sequence

    1
    2
    3
    4
    5
    class my_sequence extends uvm_sequence;
    ...
    `uvm_declare_p_sequencer (my_sequencer)
    ...
    endclass
  3. 實作body method
    class my_sequence extends uvm_sequence;

    virtual task body ();
    // Stimulus for this sequence
    endtask

    endclass

UVM Sequence Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class my_sequence extends uvm_sequence;
`uvm_object_utils (my_sequence)

function new (string name = "my_sequence");
super.new (name);
endfunction

task pre_body ();
// ...
endtask

task body ();
my_data pkt;
`uvm_do (pkt);
endtask

task post_body();
// ...
endtask
endclass

NOTE:

  • my_sequence繼承了 uvm_sequence
  • 它使用``uvm_object_utils向factory註冊,因為它是一個transaction item,transaction item是繼承uvm_object,而不是繼承uvm_component`。
  • 主要的stimulus是寫在body() task,而如果有需要在執行sequence之前或之後做什麼事情,可以call pre_body()post_body() callback function
  • data packet建立好後由uvm_do macro傳送此data packet並執行

``uvm_domacro不會呼叫pre_bodypost_body`。

``uvm_do` macro會allocate my_data類型的object給pkt,將它randomize然後傳送給此sequence關聯的sequencer然後將其執行。使用這個macro可以減少要寫的code。