p_sequencer的使用

为什么要有p_sequencer?

sequence是从uvm_object拓展而来,所以不能访问uvm_component组成的uvm层次结构的,不能通过组件层次调用访问成员变量(如,在env中访问driver的成员变量htrans,可以通过m_env.m_agt.m_drv.htrans来访问)。那sequence如何访问uvm_component的成员变量呢?通过媒介:sequencer

怎么用?

UVM提供了强大的内建宏`uvm_declare_p_sequencer(SEQUENCER)来解决这个问题。呈上代码:

class case0_sequence extends uvm_sequence #(my_transaction);
	my_trasaction m_trans;
	`uvm_object_utils(case0_squence)
	`uvm_declare_p_sequencer(my_sequencer) //使用宏定义my_sequencer
	...
	
	virtual task body();
		...
	repeat(10) 
		begin
		`uvm_do_with(m_trans,{m_trans.dmac==p_sequencer.dmac;
		                      m_trans.smac==p_sequencer.smac;})
		end
	...
endclass

UVM通过`uvm_declare_p_sequencer宏将p_sequencer定义为my_sequencer,将m_sequencer通过$cast转换为q_sequencer类型(即my_sequencer类型)。

class case0_sequence extends uvm_sequence #(my_transaction);
	my_trasaction m_trans;
	`uvm_object_utils(case0_squence)
	...
	
	virtual task body();
		my_sequencer p_sequencer;
		...
		$cast(p_sequencer,m_sequencer);
		...
	repeat(10) 
		begin
		`uvm_do_with(m_trans,{m_trans.dmac==p_sequencer.dmac;
		                      m_trans.smac==p_sequencer.smac;})
		end
	...
endclass

`uvm_declare_p_sequencer(my_sequencer)宏干了两件事:

1.声明了一个sequencer类型的句柄p_sequencer

2.将m_sequencer句柄通过$cast(p_sequencer,m_sequencer)转化为p_sequencer 类型的句柄。

https://blog.csdn.net/u011177284/article/details/106274611
uvm_sequencer_base->uvm_sequencer_param_base #(REQ,RSP)->uvm_sequencer->my_sequencer,所以m_sequencer一定是my_sequencer的父类,sequence启动以后,m_sequencer会指向挂载的子类也就是p_sequencer的类型my_sequencer,通过宏把句柄cast到my_sequencer赋给p_sequencer,这样才能通过子类句柄引用子类成员。
cast(父类,子类)和cast(子类,父类)都是可以的,但是后者一定要父类句柄指向子类对象才能进行,否则会报错,子类句柄不能指向父类对象

posted @ 2023-07-15 14:06  sky啊哈  阅读(314)  评论(0)    收藏  举报