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,但换个名字,如下
Example 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