当前位置: 首页 > 工具软件 > Sequence > 使用案例 >

UVM——Sequence Libirary的运用(sequence的添加、控制执行)

澹台承
2023-12-01


  Sequence library,即 一系列sequence的集合,派生自uvm_sequence,本质上也是一个sequence,其原型如下:

class uvm_sequence_library #(type REQ=uvm_Sequence_item, RSP=REQ) extends uvm_sequence #(REQ, RSP);

一、sequence library的创建

1.1、sequence library的定义

   1)、自定义的sequence library继承自uvm_sequence_library,同时需指明所产生的transaction类型

   2)、自定义的sequence library使用`uvm_object_utils( )宏注册后,还需调用 `uvm_sequence_library_utils( )宏进行注册

   3)、在new()函数中调用init_sequence_library()函数

class simple_seq_library extends uvm_sequence_library #(my_transaction);    //1. 指明数据包的类型
  
  `uvm_object_utils(simple_seq_library)
  `uvm_sequence_library_utils(simple_seq_library)                           //2. 两次注册

  function new(string name="simple_seq_library");
    super.new(name);
    init_sequence_library();                                                //3. 调用函数,初始化sequence library
  endfunction
  
endclass

1.2、sequence的添加

   1)、通过add_typewide_sequence()方法在env或者test的build_phase阶段将sequence添加入sequence library中,其使用方法见 “代码实例六”;

simple_seq_library::add_typewide_sequence(seq0::get_type());   //将seq0加入sequence library序列库中

   2)、也可通过宏`uvm_add_to_seq_lib在自定义的sequence中将其加入sequence library中;uvm_add_to_seq_lib有两个参数,第一个为sequence的名字,第二个为sequence library的名字

class seq0 extends uvm_sequence #(my_transaction);
  ...
  `uvm_object_utils(seq0)
  `uvm_sdd_to_seq_lib(seq0, simple_seq_library)               //1. 调用宏将自定义seq0添加入sequence library中

  virtual task body();
    repeat(10)begin
      `uvm_do(req);
      `uvm_info("seq0", "this is seq0", UVM_MEDIUM);
    end
  endtask
endclass

//同一个seq可以添加到不同的sequence library中
class seq1 extends uvm_sequence #(my_transaction);
  ...
  `uvm_object_utils(seq1)
  `uvm_sdd_to_seq_lib(seq1, simple1_seq_library)             
  `uvm_sdd_to_seq_lib(seq1, simple2_seq_library) 
  ...
endclass

1.3、将sequence library设为sequencer的default sequence

   1)、可在env或者test中进行设置,uvm_config_db::set()的第二个参数路径以main_phase结尾

class test_base extends uvm_test;
  ...
  function void build_phase(uvm_phase phase);
    super.build_phase(phase);

    uvm_config_db #(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", simple_seq_library::get_type());                 // 注意路径的填写(易出错)
  endfunciton
  ...
endclass

二、控制sequence执行顺序的三个变量

   Sequence library中的sequence执行模式、执行次数是可以通过默认的变量进行控制。这些变量属于uvm_sequence_library_cfg类中的默认成员变量

class uvm_sequence_library_cfg extends uvm_object;
  ...
  uvm_sequence_lib_mode      selection_mode;            //枚举变量,控制控制sequence的执行方式
  int unsigned               min_random_count;          // seq的最小启动数量
  int unsigned               max_random_count;          // seq的最大启动数量
endclass

   uvm_sequence_lib_mode这个枚举类型的源码:(selection_mode的取值)

typedef enum{
      UVM_SEQ_LIB_RAND,           // 自定义的seq完全随机
      UVM_SEQ_LIB_RANDC,          // 自定义的seq会先随机排序,然后按照此顺序执行,保证每个seq都执行到
      UVM_SEQ_LIB_ITEM,           // sequence library不执行自定义的sequence,而是自己产生transaction
      UVM_SEQ_LIB_USER            // 用户自定义算法
}uvm_sequence_lib_mode;

三、使用sequence_libaray_cfg类配置sequence执行

   1)、自定义一个配置类(如:test_seq_lib_cfg, 继承自test_base);

   2)、在配置类中声明uvm_sequence_library_cfg的句柄,并进行实例化,实例化的过程中**包括四个参数分别为“实例名”、“selection_mode取值”、“min_random_count取值”、“min_random_count取值”

   3)、调用uvm_config_db::set()进行设置,其中第二个参数路径以main_phase结尾,第三个参数路径以config结尾

class test_seq_lib_cfg extends test_base;                    // 1. 自定义配置类
   uvm_sequence_library_cfg         seq_cfg;                 // 2. 声明uvm_sequence_library_cfg的句柄
  `uvm_component_utils(test_seq_lib_cfg)
  
  function new(string name,uvm_component parent);      
    super.new(name,parent);
  endfunction

  virtual function void build_phase(uvm_phase phase);        
    super.build_phase(phase);
    seq_cfg = new("seq_cfg",UVM_SEQ_LIB_RAND,1,1);          // 3. 实例化seq_cfg,并加入控制变量
    uvm_config_db#(uvm_sequence_library_cfg)::set(this,"env.i_agent*.seqr.main_phase","default_sequence.config",seq_cfg);    
  endfunction                                               // 4. 在config阶段设置

endclass

注:sequence library的详细使用方法参考 “UVM代码实例六”

 类似资料: