zl程序教程

您现在的位置是:首页 >  其它

当前栏目

我眼中的UVM |08.virtual_sequece和virtual_sequencer

08 Virtual 眼中 UVM
2023-06-13 09:14:12 时间

08

我眼中的UVM

写在前面的话

嗨,屏幕前的你还好吗?我是不二鱼,一个不喜欢写技术博客的IC验证工程师,写这个系列,是需要很大的勇气的,因为,写得人很多,但写得好的不多,我也是如此。我一个菜鸡,敢写UVM(应该也不止UVM,我尽量把其他知识杂糅进去),我是疯了吗?至今能有比张强老师写得好的估计也没有,我之所以写,是为了促进自己进步,换了一个新的环境,使用UVM也是日常必备,所以,以写促学,写一写我眼中的UVM,我希望将自己在工作当中遇到的困惑和思考,和大家分享。也希望能和大家一起学习,相互成就,如有错误,欢迎私信我批评指正

在《UVM实战》这本书中,一直说virtual_sequence/sequencer都不是真正的sequence和sequencer,都是起到一个调度的作用。virtual_sequence的出现,是为了调度各种各样的sequence,而作为配套设施出现的virtual_seqencer同样也是为了处理由virtual_sequence发送过来的各类sequence,并且发送到真正的sequencer去。

那么多的sequence,到底是怎么通过virtual_sequence发送到virtual_sequencer,再发送到验证环境当中去的,是不是所有的sequence都要发给virtual sequencer中的某个具体的sequencer,不知道你是否有这样的疑问。

在virtual_sequence中,会看到例化很多的seq,如:

class fish_virtual_sequence extends uvm_sequence;
  fish_clock_sequence  fish_clk_seq;
  fish_reset_sequence  fish_rst_seq;
  fish_data_sequence   fish_data_seq;
  ......
endclass

同样,在virtual_sequencer中会例化很多sqr,如:

class fish_virtual_sequencer extends uvm_sequencer;  fish_clock_sequencer  fish_clk_sqr;  fish_reset_sequencer  fish_rst_sqr;  fish_data_sequencer   fish_data_sqr;  ......endclass

问题来了,seq是怎么发送到对应的sqr的?这时候就要用到一个很重要的宏定义:

`uvm_declare_p_sequencer(fish_virtual_sequencer)
//这相当于实例化了一个fish_virtual_sequencer
fish_virtual_sequencer p_sequencer

之后再通过`uvm_do_on或者`uvm_do_with将seq发送给相对应的sqr,如:

`uvm_do_on(fish_clk_seq,p_sequencer.fish_clk_sqr);
`uvm_do_on(fish_rst_seq,p_sequencer.fish_rst_sqr);
`uvm_do_on(fish_data_seq,p_sequencer.fish_data_sqr);

以上都是很常规的用法,中规中矩。现在回到上面的问题,是不是所有的sequence都要发给virtual sequencer中的某个具体的sequencer,一一对应呢?比如上面的fish_clk_seq,发给fish_clk_sqr。

答案是否定的。

在UVM的环境中,可能存在下面这种情况:

`uvm_do_on(fish_config_seq, p_sequencer)

可以看到,并没有指定具体的sequencer接收fish_config_seq,virtual_sequencer中也没有对应的config_sequencer。这是因为,对于一些配置类的seq,或者是某些特殊的seq,并不需要具体的sqr接收,也不需要发送到dut,只是为了进行配置,或者生成某些文件。比如生成.hex、.txt类型的数据文件,进行后门访问,通过其他路径发送激励,它的生命周期,到p_sequencer就停止了。

好了,今天的分享就到这里了,个人愚见,希望对你的学习有一点帮助。持续更新,欢迎关注。觉得有帮助的朋友,希望能够点个赞鼓励一下!!你的每个鼓励都是我持续创作的动力!