1)在介绍sequence 时,内部有m_sequencer, 直接使用m_sequencer 得到这两个变量: 编译错误: 因为m_sequencer 是uvm_sequencr_base (uvm_sequencr 的基类)类型,而不是my_sequencer 类型。 所以要cast:把m_sequencer 转换成my_sequencer: 但是好麻烦。所以内建了一个宏:uvm_declare_p_sequencer(SEQUENCER) 相当于...
可以,只是需要将sequencer和driver能够接受的数据类型设置为uvm_sequence_item,这样带来的问题是,由于driver中接收的数据类型是uvm_sequence_item,如果它要使用my_transaction或者your_transaction中的成员变量,必须使用cast转换 p_sequencer的使用 如何在sequence的body中得到sequencer中存在的变量的值呢,UVM考虑到这种情况,内...
`uvm_declare_p_sequencer可以认为就是定义一个SEQUENCER类型的变量p_sequencer,并且定义一个函数m_set_p_sequencer()(这个函数在uvm_sequence类中肯定以经存在了,否则还需要用户再手动调用,而我们从来没有自己调用过,所以UVM源代码中原本应该已经实现了该函数的调用了,这里要做的就是override覆盖原有函数定义),该函...
宏定义:`uvm_declare_p_sequencer(my_sequencer) 宏定义其实就是将上面的操作打了一个报,封装了一下。 m_set_p_seqeuncer():是set_item_context(parent_seq, sqr);的callback函数,(如果没有定义的话,默认为空)也就是说这个uvm_declare_p_sequencer宏只能在uvm_sequence的扩展类中定义。 如果你没有访问my...
可以理解为parent_sequencer,父类sequencer 使用`uvm_declare_p_sequencer(my_sequencer) 宏声明p_sequencer,宏本质是在当前sequence也就是case0_sequence中声明了一个成员变量p_sequencer。 类型为my_sequencer,定义在case0_sequence中。 p_sequencer是my_sequencer的句柄 ...
uvm_sequence派生自uvm_sequence_item,它有一个重要的任务方法body()和两个重要的成员变量m_sequencer和p_sequencer后面会介绍。 body() 任务方法body()是sequence作为测试序列的主体部分,我们需要在body()方法中定义该sequence的功能和行为。 其实在body()方法的前后,分别还有pre_body()和post_body()可能会被调用...
p_sequencer是由uvm_decalre_p_sequencer宏产生的 p_sequencer是用户指定的sequence的成员变量(这里是your_sequence的成员变量,因为`uvm_decalre_p_sequencer宏是在your_sequence中使用的) p_sequencer是指向用户指定的类型的句柄(这里是your_sequencer的成员变量) ...
在前文的UVM验证总结(四)-sequence机制(基础篇)中,我们详细讨论了sequencer和sequence组件,包括启动方式、objection机制、virtual sequence的运用以及p_sequencer的使用。此部分将进一步补充sequence机制的关键内容:1. Sequence的仲裁机制在多sequence并发情况下,sequence如何同步和发送case至关重要。uvm提供...
使用uvm_declare_p_sequencer后,就可以在sequence中调用挂载sequencer的成员函数和成员变量了。 2. `uvm_do()宏 **使用形式: ** UVM中提供了多个宏,uvm_do,uvm_do_with,`uvm_do_on_with等,但最终都是调用了uvm_do_on_pri_with宏。uvm_do_on_pri_with宏第一个参数可以传入sequence,也可以传入transaction...