uvm通信-seq与uvc的交互/通信
参考资料
(1) 公众号-杰瑞IC验证;
1. 以sequencer/p_sequencer作为seq与其他uvc沟通的桥梁;
注:p_sequencer也是seq内调用agent中函数的桥梁,通过p_sequencer机制+get_parent()“两步跳跃法”,先获取到seq对应的sequencer,然后通过sequencer.get_parent函数得到UVM树中当前实例的parent,即agent;
2. 直接在seq内获取要交互的uvc的hierarchy
(1) 需要在seq的pkg内include uvc的相关pkg;
(2) 采用uvm_root的find方法以及components例化名,获取uvc的handle.
补充:uvm_root.find/find_all的介绍
find/find_all的源码如下:
3.借助config_db机制
3.1 在sequence中获取参数
(1) 能够调用config_db::get的前提是已经进行了设置;
(2) sequence本身是uvm_object,不能像uvm_component那样出现在UVM树中,在进行config_db::set时很难确定其第二个路径参数;
注1:使用default_sequence启动的sequence的名字是未知的;
注1:也可使用get_sequencer()函数代替get_full_name(),即uvm_config_db#(int)::get(get_sequencer(), "", "count", count);
(3)其实也可以换个角度,依然是采用sequencer作为桥梁,set时将要传递给sequence的参数传递给sequencer(注意get_sequencer的使用);
3.2 在sequence中设置参数
(1) sequence除了向component中传递参数,也可以向sequence传递参数;
注1:上图中sequence向自己传递了一个参数-first_start;
注2:如果该sequence在virtual sequence中被启动,其get_full_name的结果应该是uvm_test_top.v_sqr.*,而不是uvm_test_top.env0.i_agt.sqr.*;
3.3 sequence或uvc内get参数注意事项
(1) get参数的前提是参数已经被设置过,而当设置一个参数的时候,其时间往往是不固定的; 这种情况下,需要借助wait_modified task;
(2) wait_modfied task有三个参数,与config_db::get的前三个参数完全一样,当它检测到第三个参数的值被更新过后,它就返回,否则一直等在那里;
(3) 可以在component和sequence中调用wait_modified任务;