UVM中sequence的挂载与启动

1. main_phase 是什么?

main_phase是与run_phase并行的12个小的phase中的一个phase,也是一个可以耗时的phase。在UVM验证平台中,只要一个类使用了uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会自动被调用。

2. 通过 start()函数进行挂载

以下代码为UVM实战第44页代码

task my_env::main_phase(uvm_phase phase);
	my_sequence seq;
	phase.raise_objection(this);
	seq=my_sequence::type_id::create("seq");
	seq.start(i_agt.sqr);
	phase.drop_objection(this);
endtask

startrt任务的参数是一个sequencer的指针,如果不指明此指针,则sequence不知道将产生的transaction交给哪一个sequencer。

3. 使用default_sequence的方式进行启动sequence。

将不同的sequence设置为sequencer的main_phase的default_sequence。当sequencer执行到main_phase中时,发现有default_sequence,那么它就启动sequence。
当一个sequence启动后会自动执行sequence的body任务。 以下代码为UVM实战49页代码

module top_tb;
initial begin
	uvm_config_db#(uvm_object_wrapper)::set(null,"uvm_test_top.i_agt.sqr.main_phase","sefault_sequence", my_sequence::type_id::get());
end
endmodule

在uvm_sequence这个基类中,有一个变量名为starting_phase,它的类型是uvm_phase,sequencer在启动default_sequence时,会自动做如下操作:

task my_sequencer::main_phase(uvm_phase phase);
...
seq.starting_phase =phase;
seq.start(this);
...
endtask

因此,可以在sequence中使用starting_phase进行提起和撤销objection。
UVM实战50页代码如下:

class my_sequence extends uvm_sequence #(my_transaction);
	my_transaction m_trans;
virtual task body();
if(starting_phase != null)
	staring_phase.raise_objection(this);
repeat(10) begin
	`uvm_do(m_trans)
end
#1000;
if(starting_phase != null)
	staring_phase.drop_objection(this);
endtask
`uvm_object_utils(my_sequence)
endclass

4. 一个例子

sequence1包含在virtual sequence里面,则sequence1中可以通过以下方式给staring_phase赋值。

uvm_sequence_base parent;
parent = get_parent_sequence();
if(parent != null) begin
	starting_phase = parent.starting_phase;
end

5. m_sequencer与p_sequencer

m_sequencer是每一个sequence的成员变量,它存储是是该sequence所挂载的sequencer的指针,m_sequencer是uvm_sequencer_base(uvm_sequencer的基类)类型的,而不是uvm_sequencer类型。m_sequencer的原型为

procted uvm_sequencer_base m_sequencer;

如果要使用uvm_sequencer的成员变量,需要动态转换将m_sequencer转换为uvm_sequencer类型。UVM考虑到这种情况,内建了一个宏,uvm_declare_p_sequencer(SEQUENCER),这个宏的本质是声明了一个SEQUENCER类型的成员变量。

uvm_declare_p_sequencer(my_sequencer)

相当于

my_sequencer p_sequencer;

6. 使用UVM宏定义来产生sequence

`uvm_do()
`uvm_do_with()
`uvm_do()
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值