uvm_do更多的是用在一个父sequence对子sequence的启动上:父sequence的do函数会被执行,同时不需要执行子sequence的pre_body()和post_body()。 之所以建议用start(),是因为宏尽管便利,但会隐藏掉一些必要的信息,比如不了解uvm_do宏展开的工程师,他就不知道...
01 Sequence重要成员和方法 uvm_sequence派生自uvm_sequence_item,它有一个重要的任务方法body()和两个重要的成员变量m_sequencer和p_sequencer后面会介绍。 body() 任务方法body()是sequence作为测试序列的主体部分,我们需要在body()方法中定义该sequence的功能和行为。 其实在body()方法的前后,分别还有pre_body()和...
29、sequence中的pre_body()和post_body()函数是什么?它们总是被调用么?**pre_body()是sequence类中的方法,该方法在body()方法之前调用,然后调用post_body()**方法。uvm_sequence:: start()有一个可选参数,如果将其设置为0,将不调用这些方法。以下是sequence中start()方法的参数:virtual task start (uvm_s...
UVM也为用户提供了广义的callback函数/任务:pre_body和post_body,除此之外还有pre_do、mid_do和post_do。 2. 首先定义一个A类: classAextendsuvm_callback;virtualtaskpre_tran(my_driverdrv,refmy_transactiontr);endtaskendclass A类一定要从uvm_callback派生,另外还需要定义一个pre_tran的任务,此任务的类型...
执行pre_start,body等函数。此时就完成了sequence的启动过程。 在start()函数中,首先调用了函数set_item_context()函数,这个函数位于sequence的父类uvm_sequence_item中,负责给成员变量m_sequencer, m_parent_sequence赋值。 如果没有指定挂载的sequencer,则挂载到parent_sequence的sequencer上。
UVM中 test bench及其启动 uvm启动sequence的方法,start():sequence.strat(sequencer,parent_sequence,优先级),第一个参数是需要挂载的sequencer;第二个是parent_sequence,一般传入this或者不传入;第三个是优先级;第四个call_pre_post默认为1,则自动执行pre_body/
这样UVM就会自动把m_sequencer(sequence默认sequencer变量,为uvm_sequencer_base类型)转换为my_sequencer类型,这个过程在pre_body()之前就完成了。这样在sequence中可以直接使用成员变量p_sequencer,从而获取my_sequencer中设置的变量值。这个概念比较难理解,读者可以参考《UVM实战》6.4.4节,结合具体代码理解。
1.sequence没有出现在树形结构中,难以确定路径参数,可以通过set null, ""设定全局scope,这样sequence在哪里都可以访问资源。注意:sequence没有phase,get可以放在pre_body body pre_randomize pre_start中,只要在调用reg_model之前get被调用即可。 # env top_reg_model m_regmodel; ...
sequence启动后,开始执行内部定义的一个task——virtual task body(); 一般定义为virtual类型,方便重载。 还有两个回调函数pre_body(); post_body();来供用户配置。 其中在task body()中,定义的函数有:`uvm_create(m_trans)等价于m_trans=new("m_trans"); ...
在这里, pre_body()和 post_body()并不是一定会被执行,这一点同 UVM 的 phase 顺序执行是有区别的。建议是,用户可以在 base_sequence 中自定义一些方法,确保它们会按照顺序执行,比如下面这段例码,用户可以分别在 user_pre_ body()、user_post_ body()和 user_body0中填充代码,确保这些方***被顺序执行,...