0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM中add_typewide_sequence和add_sequence的区别

冬至子 来源:CSDN 作者:谷公子 2023-05-24 15:21 次阅读

我们在用uvm_sequence_library的时候,会遇到三种方式往uvm_sequence_library添加sequence,分别是:

  1. function void add_sequence(uvm_object_wrapper seq_type);
  2. function void add_typewide_sequence(uvm_object_wrapper seq_type);
  3. function void add_typewide_sequences(uvm_object_wrapper seq_types[$]);

第2和第3种方式类似,第3种是一下子添加多个sequence,它内部原理就是调用第2种的函数,因此在本质上,只有第1和第2种这两类区别。第1种方式是往sequences队列里push sequences。第2种方式是往m_typewide_sequences队列里push sequences。sequences和m_typewide_sequences的定义如下,它们都是uvm_object_wrapper类型,因此sequence在push的时候,要采用sequence_name::get_type()的方式加入。

protected uvm_object_wrapper sequences[$];
static protected uvm_object_wrapper m_typewide_sequences[$];

下面分别说下两种push有何不同。

1. add_sequence(uvm_object_wrapper seq_type)

它的代码如下:

function void add_sequence(uvm_object_wrapper seq_type);
  if (m_dyn_check(seq_type))
    sequences.push_back(seq_type);
endfunction

可以看出add_sequence(xxx)函数很简单,就是往sequences队列里push sequence的uvm_object_wrapper类型。

在m_dyn_check(xxx)函数里会检查push进来的sequence不能是非uvm_sequence_base类型的,且不能重复。只有都不满足以上两者条件,才能被push进sequences队列里。而且我们根据sequences队列的定义可以看出,它没有带static修饰,也就是说,uvm_sequence_library例化多份instance的话,它也会跟着被例化多份,多个instance里的sequences队列互不共享。这一点是和m_typewide_sequences队列有着本质区别的。

function bit m_dyn_check(uvm_object_wrapper seq_type);
  if (!m_check(seq_type,this))
    return 0;
  foreach (sequences[i])
    if (sequences[i] == seq_type)
      return 0;
  return 1;
endfunction

m_check(xxx)函数定义如下,它就是单纯的判断seq_type,如果seq_type是uvm_sequence_base类型的,就返回1,否则返回0。

function bit m_check(uvm_object_wrapper seq_type, this_type lib);
  uvm_object obj;
  uvm_sequence_base seq;
  uvm_root top;
  string name;
  string typ;
  obj = seq_type.create_object();
  name = (lib == null) ? type_name : lib.get_full_name();
  typ = (lib == null) ? type_name : lib.get_type_name();
  top = uvm_root::get();
 
  if (!$cast(seq, obj)) begin
    `uvm_error_context("SEQLIB/BAD_SEQ_TYPE",
        {"Object '",obj.get_type_name(),
        "' is not a sequence. Cannot add to sequence library '",name,
        "'"},top)
     return 0;
  end
  return 1;
endfunction

2. add_typewide_sequence(uvm_object_wrapper seq_type)

它的代码如下:

static function void add_typewide_sequence(uvm_object_wrapper seq_type);
  if (m_static_check(seq_type))
    m_typewide_sequences.push_back(seq_type);
endfunction

可以看出add_typewide_sequence(xxx)函数也很简单,就是往m_typewide_sequences队列里push sequence的uvm_object_wrapper类型。

m_static_check(xxx)函数和m_dyn_check(xxx)函数类似,这里面会检查push进来的sequence不能是非uvm_sequence_base类型的,且不能重复。只有都不满足以上两者条件,才能被push进m_typewide_sequences队列里。

function bit m_static_check(uvm_object_wrapper seq_type);
  if (!m_check(seq_type,null))
    return 0;
  foreach (m_typewide_sequences[i])
    if (m_typewide_sequences[i] == seq_type)
      return 0;
  return 1;
endfunction

从m_typewide_sequences队列和add_typewide_sequence(xxx)函数的定义我们可以看出,它们都是static类型的,也就是就算uvm_sequence_library有多份不同的instances,m_typewide_sequences在它们之间是共享的。因此,放在m_typewide_sequences队列里的sequences是打算被多个uvm_sequence_library(包含从它扩展出的子类libraries)共享的话,就可以用add_typewide_sequence(xxx)函数把它们加入到m_typewide_sequences队列里。如果要被某个uvm_sequence_library私自独享的话,就需要用add_sequence(xxx)函数把它们加入到sequences队列中。

3. 注意事项

在uvm_sequence_library调用new(xxx)函数例化的时候,会自动调用init_sequence_library()函数,这个函数的定义如下:

function void init_sequence_library();
  foreach (this_type::m_typewide_sequences[i])
    sequences.push_back(this_type::m_typewide_sequences[i]);
endfunction

init_sequence_library()函数会自动把m_typewide_sequences队列里的内容复制到sequences队列里,因为uvm_sequence_library随机选择sequence时看的是sequences队列里的sequence。

因此大家要注意的是,如果在uvm_sequence_library例化之前,通过uvm_sequence_library::add_typewide_sequence(xxx)方式放到m_typewide_sequences队列里的sequences会自动也复制到sequences队列里。但如果是在uvm_sequence_library例化之后,才调用add_typewide_sequence(xxx)方式放到m_typewide_sequences队列里的sequences,需要自己再调用下init_sequence_library()函数。

下面是一段UVM的例子,selection_mode为UVM_SEQ_LIB_RAND,它会按平均权重随机在sequences队列挑出sequence。

UVM_SEQ_LIB_RAND: begin
        valid_rand_selection.constraint_mode(1);
        valid_sequence_count.constraint_mode(0);
        for (int i=1; i<=sequence_count; i++) begin
          if (!randomize(select_rand)) begin
            `uvm_error("SEQLIB/RAND_FAIL", "Random sequence selection failed")
            break;
          end
          else begin
            wrap = sequences[select_rand];
          end
          execute(wrap);
        end
        valid_rand_selection.constraint_mode(0);
        valid_sequence_count.constraint_mode(1);
      end

下面是另一段UVM的例子,selection_mode为UVM_SEQ_LIB_USER,也是用户可以自动的方式。因此用户需要select_sequence(xxx)函数来完成自己挑选算法

UVM_SEQ_LIB_USER: begin
        for (int i=1; i<=sequence_count; i++) begin
          int user_selection;
          user_selection = select_sequence(sequences.size()-1);
          if (user_selection >= sequences.size()) begin
            `uvm_error("SEQLIB/USER_FAIL", "User sequence selection out of range")
            wrap = REQ::get_type();
          end
          else begin
            wrap = sequences[user_selection];
          end
          execute(wrap);
        end
      end

select_sequence(xxx)函数定义如下,用户用systemverilog语法的virtual override就可以实现自定义挑选sequence的算法了。

function int unsigned select_sequence(int unsigned max);
  static int unsigned counter;
  select_sequence = counter;
  counter++;
  if (counter >= max)
    counter = 0;
endfunction
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18965
  • sequence
    +关注

    关注

    0

    文章

    23

    浏览量

    2807
收藏 人收藏

    评论

    相关推荐

    UVM sequence分层有哪几种方式呢

    种请求下可以使用第一种分层方式,在high-layer sequence依然使用low-layer sequencer进行驱动,同时对low-layer sequence进行更加精细化的控制
    发表于 04-11 16:37

    请问一下在UVM的UVMsequences是什么意思啊

    UVM方法学,UVMsequences 是寿命有限的对象。UVM sequences从uvm_sequence_item基类扩展得到,uvm_s
    发表于 04-11 16:43

    UVM sequence分层的几种体现

    种请求下可以使用第一种分层方式,在high-layer sequence依然使用low-layer sequencer进行驱动,同时对low-layer sequence进行更加精细化的控制。在上面
    发表于 04-14 11:08

    如何配置sequence的仲裁算法和优先级及中断sequence的执行

    01 Arbitrary在UVM,多个sequence可以同时被绑定到相同的sequencer并启动。这种测试场景在实际是存在的,比如在模拟同一个总线master口上的不同类型的数
    发表于 09-23 14:35

    sequence item实际应用应该包含哪些东西

    展开。Sequence item是游走在Sequence-Sequencer-Driver这一基本结构的数据结构类型,在有些地方也直接叫transaction,可以说是UVM的必用品
    发表于 09-23 14:42

    UVMseq.start()和default_sequence执行顺序

      1. 问题  假如用以下两种方式启动sequence,方法1用sequence的start()方法启动seq1,方法2用UVM的default_sequence机制启动seq2。那
    发表于 04-04 17:15

    浅谈UVMsequence/item见解(上)

    item指的是uvm_sequence_item, Sequence Item具备UVM核心基类所必要的数据操作方法,对于激励的生成和场景控制,是由sequence来编织的,item应
    的头像 发表于 02-19 15:52 4795次阅读
    浅谈<b class='flag-5'>UVM</b>之<b class='flag-5'>sequence</b>/item见解(上)

    单片机基础之ADD与ADDC的区别详解

    单片机基础之ADD与ADDC的区别详解ADD 两数相加,不加进位位。ADDC 两数相加,加进位位。进位当时为1就加1,进位为0就加0。一般在多字节数相加时,低字节相加用ADD ,高字节
    发表于 12-17 18:40 11次下载
    单片机基础之<b class='flag-5'>ADD</b>与ADDC的<b class='flag-5'>区别</b>详解

    UVM sequence机制中response的简单使用

    sequence作为UVM几个核心机制之一,它有效地将transaction的产生从driver中剥离出来,并且通过和sequencer相互配合,成功地将driver的负担降低至仅聚焦于根据协议
    的头像 发表于 09-22 09:26 1954次阅读

    start()如何执行uvm_sequence

    要使用start()启动一个sequence,就必须要指定相应的sequencer句柄, **另外的几个选项一般用不上** 。其中
    的头像 发表于 03-21 11:37 508次阅读
    start()如何执行<b class='flag-5'>uvm_sequence</b>

    如何配置sequence的仲裁算法和优先级?

    UVM中,多个sequence可以同时被绑定到相同的sequencer并启动。这种测试场景在实际中是存在的,比如在模拟同一个总线master口上的不同类型的数据流时
    的头像 发表于 04-27 15:20 829次阅读
    如何配置<b class='flag-5'>sequence</b>的仲裁算法和优先级?

    UVMsequence的那些事儿

    将 生成测试case的语句 从 main_phase 中独立出来,使得使用不同测试用例时,只需要修改sequence部分即可,而不用关注 UVM剩余部分。
    的头像 发表于 05-26 15:17 656次阅读
    <b class='flag-5'>UVM</b>中<b class='flag-5'>sequence</b>的那些事儿

    在Sequencer上启动一个Sequence

    Sequencer默认不执行任何Sequence。验证工程师可以通过调用start()启动一个Sequence,也可以通过uvm_config_db指定一个自动启动的Sequence
    的头像 发表于 06-10 09:10 496次阅读
    在Sequencer上启动一个<b class='flag-5'>Sequence</b>

    UVM设计中的sequence启动方式有哪几种呢?

    本篇介绍UVM中的sequence,这是UVM中最基础的部分。对于前面介绍的uvm_callback, uvm_visitor等,很少被使用
    的头像 发表于 08-17 10:07 1517次阅读
    <b class='flag-5'>UVM</b>设计中的<b class='flag-5'>sequence</b>启动方式有哪几种呢?

    如何将sequences类型添加或注册到sequence library里呢?

    uvm_sequence_library是从uvm_sequence扩展而来的,它是一个容纳了一系列其它sequences类型的容器,在启动时,它会根据模式从这系列sequences中选择并执行它们。
    的头像 发表于 09-08 15:06 371次阅读
    如何将sequences类型添加或注册到<b class='flag-5'>sequence</b> library里呢?