乍一看有点类似于`uvm_do系列宏后缀的排列组合,但是后缀又有些区别,`uvm_send系列宏一般跟`uvm_create是配合使用的,`uvm_create执行的时候会指定item所在的sequencer,所以在`uvm_send执行的时候就不需要指定sequencer了,所以不需要_on的后缀。_rand表示是否需要随机,_pri指定优先级,_with指定随机约束。`uvm_rand_s...
uvm_component parent = null); super.new(name, parent); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); env_h = env::type_id::create("env_h", this); seq = sequence_in::type_id::create("seq", this...
宏中没有with的,其实是`uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, {}) 一句话总结:就是SEQR的默认参数是m_sequencer, PRIORITY的默认参数是-1, with的默认参数是{},不指明参数的将用默认参数代替。 下面来具体分析`uvm_do_on_pri_with。 源码如下: 里面有个uvm_create_on函数,其定义如下: 这...
create_item函数是uvm_sequence_base类的一个函数,为此,这就说明了uvm_do系列宏只能在sequence类里面用。 create_item宏定义如下: 最终调用factory.create_object_by_type来实例化SEQ_OR_ITEM。并且指定SEQ_OR_ITEM的m_sequencer(SEQR),和parent_sequence(this)。位start_item做准备。 下面回到`uvm_do_on_pri_wi...
uvm_do系列的其他七个宏其实都是用uvm_do_on_pri_with宏来实现的。如uvm_do宏:`define uvm_do(SEQ_OR_ITEM) `uvm_do_on_pri_with(SEQ_OR_ITEM, m_sequencer, -1, {}) uvm_create与uvm_send `uvm_create(m_trans):uvm_create宏的作用是实例化transaction ...
I use the method you suggested, in my sequence, I a child sequence, I create/start it as below ts_mb_seq = ts_mb_base_sequence_c::type_id::create("ts_mb_seq"); ts_mb_seq.randomize() with {req.crc24_error == FALSE;}; ...
5215 full expansion of macro (uvm_do_on_with), error at line 9 5216 … 5217 $cast(i2c_mst_seq , create_item(w_, m_env.i2c_env.i2c_system_env.sequencer.master_sequencer[0], “i2c_mst_seq”)); 5218 end 5219 if (!$cast(__seq,i2c_mst_seq)) start_item(i2c_mst_seq, -1); ...
在一个sequence的body中,除了可以使用uvm_do宏产生transaction外,还可以启动其它sequence,这就是嵌套sequence。 uvm_do系列宏有uvm_do/uvm_do_pri/uvm_do_with/uvm_do_pri_with/uvm_do_on/uvm_do_on_pri/uvm_do_on_with/uvm_do_on_pri_with
在上述代码中,使用了uvm_do宏。uvm_do宏的第一个参数可以是transaction的指针,此时其调用start_item和finish_item;该参数也可以是sequence的指针,此时其调用该sequence的start任务。除了uvm_do外,前述介绍的uvm_send,uvm_rand_send,uvm_create宏等,其第一个参数均可以是sequence的指针。
m_regmodel = top_reg_model::create("m_regmodel"); uvm_config_db #(top_reg_model)::set(this, " agt.sqr.* ","reg_model",m_regmodel); # seq top_reg_model m_regmodel; uvm_config_db #(top_reg_model)::get(null, get_full_name(),"reg_model",m_regmodel); ...