uvm_do_with注意事項

来源:互联网 发布:高斯滤波器的算法 编辑:程序博客网 时间:2024/06/09 18:47

Case:

 在上层top_seq调用下层sub-seq或seq_item时,可能会使用`uvm_do_with对下层的random变量进行约束。 通常为了coding的方便,上层和下层seq变量的名字可能是一样的。这样就有一个问题,我们会发现如果使用`uvm_do_with(sub_seq, {var_a == var_a;})

这个约束是无法启作用的,下层的var_a该怎么random还是怎么random,即使上层top_seq将var_a设定为某个固定值也没用。

Reason:

  这是由于作用域的问题,在编译器来看,它不知道两个var_a有什么不同,把他当成sub_seq作用域中的两个相同变量,自然而然这条约束就没用效用

Solution:

  可能有人会想到有this,这正是一个陷阱。在top_seq中使用`uvm_do_with(sub_seq, {sub_seq.var_a == this.var_a}),仿真会发现,同样没有效果,为什么?

  因为被`uvm_do_with中,this指定的作用域首先找到的是sub_seq,而并不是想要的top_seq的this。

  有两种解决方法:

  1.  top_seq使用不同的变量名,`uvm_do_with(sub_seq,{sub_seq.var_a == tmp_var_a}),  这样做就不太方便,如果seq嵌套太多,变量名就一大堆

  2. 使用this,但换个名字,如下

   class top_seq  extends...
        ...
       top_seq    my_seq;

      function new()
             my_seq = this                    ==> 指向自己,其实就是把this换了个名字,
     endfunction

      ...
     `uvm_do_with(sub_seq, {var_a == my_seq.var_a})        ==>原理很简单,就是避免关键字因素的影响
   endclass

0 0
原创粉丝点击