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,如:
代码语言:javascript复制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,如:
代码语言:javascript复制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的?这时候就要用到一个很重要的宏定义:
代码语言:javascript复制`uvm_declare_p_sequencer(fish_virtual_sequencer)
//这相当于实例化了一个fish_virtual_sequencer
fish_virtual_sequencer p_sequencer
之后再通过`uvm_do_on或者`uvm_do_with将seq发送给相对应的sqr,如:
代码语言:javascript复制`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的环境中,可能存在下面这种情况:
代码语言:javascript复制`uvm_do_on(fish_config_seq, p_sequencer)
可以看到,并没有指定具体的sequencer接收fish_config_seq,virtual_sequencer中也没有对应的config_sequencer。这是因为,对于一些配置类的seq,或者是某些特殊的seq,并不需要具体的sqr接收,也不需要发送到dut,只是为了进行配置,或者生成某些文件。比如生成.hex、.txt类型的数据文件,进行后门访问,通过其他路径发送激励,它的生命周期,到p_sequencer就停止了。
好了,今天的分享就到这里了,个人愚见,希望对你的学习有一点帮助。持续更新,欢迎关注。觉得有帮助的朋友,希望能够点个赞鼓励一下!!你的每个鼓励都是我持续创作的动力!