可以看到我们前面经常提到的m_sequencer就是声明在这里的,也就是说到uvm_sequence_item这一层就已经绑定了uvm_seuqencer的概念了,也就是说uvm_sequence_item类型的transaction最终都会给到sequencer再到driver中,关于transaction从产生到driver获取的详细流程参见之前的文章:数字验证大头兵:[UVM源代码研究] sequence、 seq...
Sequence基本的工作流程是通过sequencer将sequence_item发送给driver,那么自然需要有一个sequencer与之关联,而m_sequencer正是关联sequence和sequencer的纽带。 除此之外,m_sequencer可以被用来访问UVM component层次结构中的其他资源或者配置信息等。但有一点需要注意,m_sequencer的类型是uvm_sequencer_base,而我们通常绑定给se...
uvm_sequence_base中的start任务原型如下 因而我们传递给start的参数只要是uvm_sequencer_base类型或者它的子类或者null就可以了。 这里还有一个有趣的现象,就是我们一旦通过uvm_resourece_db#(bit)::set之后就无法unset了,也就是当我们跑某个sequence把相应的寄存器排除了之后,后面是没法跑同样的sequence来取消排除的...
在每个sequence中,都有一个uvm_sequencer_base类型的变量,称为m_sequencer,当需要在sequence和sequencer之间传递值时,可以通过 $cast(x_sequencer, m_sequencer),然后通过x_sequencer直接调用sequencer中的值。 uvm中通过宏定义`uvm_declare_p_sequencer(my_sequencer)进行了封装。之后可以使用p_sequencer 而sequencer可以...
除此之外,m_sequencer可以被用来访问UVM component层次结构中的其他资源或者配置信息等。但有一点需要注意,m_sequencer的类型是uvm_sequencer_base,而我们通常绑定给sequence的sequencer是uvm_sequencer_base的子类,所以,当该句柄引用子类对象时,可引用的资源将受...
类型是uvm_sequencer_base类型,定义在uvm_sequence_item类中,注意:类型很重要。 可以理解为每个sequence中默认都有m_sequencer这一成员变量。 m_sequencer 是一个指向执行当前sequence的sequencer句柄。 p_sequencer: 可以理解为parent_sequencer,父类sequencer
嵌套sequence的启动可以通过start(m_sequencer)来完成,也可以通过uvm_do()系列宏来完成; m_sequencer是base_sequencer启动时所使用的sequencer的指针,也就是说,嵌套的seq启动时所使用的sequencer同所在的sequence所使用的sequencer一致。 classbase_sequenceextendsuvm_sequence#(transaction); ...
在每个sequence中,都有一个uvm_sequencer_base类型的变量,称为m_sequencer,当需要在sequence和sequencer之间传递值时,可以通过 $cast(x_sequencer, m_sequencer),然后通过x_sequencer直接调用sequencer中的值。 uvm中通过宏定义`uvm_declare_p_sequencer(my_sequencer)进行了封装。之后可以使用p_sequencer ...
创建uvm_reg_item实例rw,一般不用指定其uvm_sequence_base型的parent。但是FRONTDOOR形式发送transaction需要通过sequence来协助完成,会自动创建一个sequence。 可以指定map,通过选定的map访问寄存器。举例:CPU的 IBUS 和 SBUS访问的地址范围不同,可以分别建立相对应的uvm_reg_map,通过map的set_sequencer设置对应BUS的seque...
这样UVM就会自动把m_sequencer(sequence默认sequencer变量,为uvm_sequencer_base类型)转换为my_sequencer类型,这个过程在pre_body()之前就完成了。这样在sequence中可以直接使用成员变量p_sequencer,从而获取my_sequencer中设置的变量值。这个概念比较难理解,读者可以参考《UVM实战》6.4.4节,结合具体代码理解。