我们在sequence中往driver发包时,最常用的方法就是使用uvm_do()系列宏,偶尔会使用方法start_item()和finish_item()的组合,极个别场景下会 使用`uvm_create()和`uvm_send()宏,极极个别场景下还会看到create_item()方法的使用,这些宏和方法有什么区别,各自使用场景有什么局限和注意事项,他们分别定义在了UVM源代码...
Sequence的基本结构如下图所示,主要包含五个部分:对宏的调用,sequence_item的声明,成员变量声明,构造函数,最后是在body中定义sequence的主要逻辑功能。 该示例代码不针对其他sequence的嵌套,以及virtual sequence的使用。关于对sequence的嵌套,仲裁,以及virtual sequence的使用,会在后续文章中专门介绍。 在有些代码实现中会...
在sequence中使用uvm_do等宏时,其默认的sequencer就是此sequence启动时为其指定的sequencer,sequence将这个sequencer的指针放在其成员变量m_sequencer中,uvm_do等价于:`uvm_do_on(tr, this.m_sequencer) `uvm_do(SEQ_OR_ITEM) `uvm_do_pri(SEQ_OR_ITEM, PRIORITY) `uvm_do_with(SEQ_OR_ITEM, CONSTRAINTS) ...
Sequence的基本结构如下图所示,主要包含五个部分:对宏的调用,sequence_item的声明,成员变量声明,构造函数,最后是在body中定义sequence的主要逻辑功能。 该示例代码不针对其他sequence的嵌套,以及virtual sequence的使用。关于对sequence的嵌套,仲裁,以及virtual se...
sequence呢,你可以把它想象成是一个小小的指挥官。它负责告诉uvm里的那些组件,比如说driver啦,该在啥时候干啥事儿。比如说哈,你想让driver发送一组特定的数据,那sequence就会像个小管家一样,把这个任务安排得明明白白的。它就像是一个写好了各种指令的小纸条,driver只要照着上面说的做就行啦。 sequence的创建。
uvm_sequence(生产数据):具有可自动执行的函数,可通过body()函数进行可执行操作,产生数据激励; uvm_sequencer(发送数据):将数据发送给driver; sequence item是每一次driver与DUT互动的最小粒度内容,在sequence与driver之间起到桥梁作用的是sequencer,sequencer与driver均是component组件,它们之间的通信也是通过TLM...
三种sequence的启动方式: 1. start()函数显示调用 使用形式: 在sequence中显示调用strat()函数,第一个参数是需要挂载的sequencer;第二个是parent_sequence,一般传入this或者不传入;第三个是优先级;第四个call_pre_post默认为1,则自动执行pre_body/ post_body()函数 ...
sequencer是uvm组件,一个sequencer可以调用多个sequence uvm_squence class普通成员 sequence执行流程 sequencer和driver是在agent中进行例化的 sequencer中可以设置默认的sequence,设置完成之后,会自动执行sequence中的body(),另外会自动执行driver中的get_next_item() sequencer中的start()函数会调用sequence中的body()函数,...
第一种方法:在sequence_library类被实例化之前,我们可以在test类的build_phase中,将sequence通过LIBTYPE::add_typewide_sequence或者LIBTYPE::add_typewide_sequences这两个静态方法,逐个或者批量添加到LIBTYPE::m_typewide_sequence[$]队列中,作为候选sequence。
引入sequence的原因: 将 生成测试case的语句 从 main_phase 中独立出来,使得使用不同测试用例时,只需要修改sequence部分即可,而不用关注 UVM剩余部分。(提高剩余部分的可复用性)。 引入sequence的仲裁机制的原因: 一个sequencer上通过fork…join可以启动多个sequence,而多个sequence按照什么顺序启动需要一定的仲裁机制来控...