uvm_transaction,uvm_sequence

 1.uvm_transaction

1.在uvm环境中,所有组件之间的通信都是通过transaction类型连通;

uvm_transaction,uvm_sequence_第1张图片

 

2.是UVM中事务的基本类,继承uvm_object 的所有方法外,增加了timing和recording的接口

3.uvm_sequence_item – 用户定义的事务的基类,同时也是uvm_sequence的基类。提供了使用强大sequence机制的基本功能。

4.包含内容(成员变量、域的自动化、变量的约束、其他必要内容)uvm_transaction,uvm_sequence_第2张图片

 

5.代码示例

`ifndef _GUARD_HELLO_TRANSACTION_SV_
`define _GUARD_HELLO_TRANSACTION_SV_        //两句连用,防止重复编译(C语言内容)

class hello_transaction extends uvm_sequence_item;

    rand bit [47:0]    dmac;
    rand bit [47:0]    smac;
    rand bit [15:0]    ether_type;
    rand byte          pload[];
    rand bit [31:0]    crc;
//定义激励成员
    
    constraint cons_pload_size{
        pload.size >=46;
        pload.size <=1500;
    }
//约束项

    extern function new(string name="hello_transaction");

    `uvm_object_utils_begin(hello_transaction)
        `uvm_field_int(dmac,UVM_ALL_ON)
        `uvm_field_int(smac,UVM_ALL_ON)
        `uvm_field_int(ether_tpye,UVM_ALL_ON)
        `uvm_field_array_int(pload,UVM_ALL_ON)
        `uvm_field_int(crc,UVM_ALL_ON)
     `uvm_object_utils_end
endclass

function hello_transaction::new(string name="hello_transaction")
    super.new(name);
endfunction
//执行hello_transaction的构造函数


2.uvm_sequence 

uvm_transaction,uvm_sequence_第3张图片

1.uvm_sequence从uvm_sequence_base派生出来, 参数化的类,两个参数REQ, RSP,通常只给一个参数。

uvm_transaction,uvm_sequence_第4张图片

2.uvm_sequence_base提供sequence启动执行流程的方法及一些sequence之间调度的方法

3. sequence控制并产生一系列transaction;

一种sequence一般只用来产生一种类型的transaction,但可以产生多个;

sequence中对事务的控制和产生都是在body()任务中完成的;

sequence与sequence_item的关系:sequence启动后,按照body()任务的功能依次产生多个相同类型的事务对象,可以将sequence看做存储并管理一系列事务的仓库;

4.代码示例

`ifndef _GUARD_HELLO_SEQUENCE_SV_
`define _GUARD_HELLO_SEQUENCE_SV_        //两句连用,防止重复编译(C语言内容)

class hello_sequence extends uvm_sequence#(hello_transaction);
    
    hello_transaction m_trans;
    
    extern virtual function new(string name,uvm_component parent);
    
    extern virtual task body();
        if(starting_phase != null)begin
            starting_phase.raise_objection(this);
            `uvm_info("my_sequence","after starting_phase.raise_objection,beforce repeat 100",UVM_LOW);
        end
    
        repeat(100)begin
            `uvm_do(my_trans);
            `uvm_info("my_sequence","uvm_do m_trans once time",UVM_LOW);
        end
        #100
        if(starting_phase != null)
            starting_phase.drop_objection(this);
        endtask
        `uvm_object_utils(hello_sequence)
endclass

   

function hello_sequence::new(string name="hello_sequence")
    super.new(name);
endfunction
//执行hello_sequence的new函数

3.总结

1.为什么transaction不继承于uvm_transaction,而要从uvm_sequence_item派生?

        uvm_sequence_item是用户定义的事务的基类,同时也是uvm_sequence的基类。提供了使用强大sequence机制的基本功能。

2.body是如何被执行的?

      每个sequence都有一个body任务。当一个sequence启动后,会自动执行sequence的body任务

3.starting_phase何时不为null?

       1.手工启动sequence时为starting_phase赋值

uvm_transaction,uvm_sequence_第5张图片

       2.将此sequence作为sequencer的某动态运行phase的default_phase时,starting_phase不为null。

uvm_transaction,uvm_sequence_第6张图片

        通俗一点,设置默认default_sequence时,会自动赋值phase给starting_phase,如果使用`uvm_do宏将sequence作为参数,则starting_phase为null。

你可能感兴趣的:(每日,学习)