在项目中遇到过明明在uvm_do_with中对transaction的域段做了约束,但在driver获取到seq时却无法生效约束的问题。最后排查发现是变量名的问题,如下约束值的名称var和req的var字段一致时,因为在`uvm_do_with()中,指定的作用域首先找到的是req,如果变量名一致,则会被当成是req的字段,会导致无法识别这个var是外部传入的变量,出现约束失效的情况。
`uvm_do_with(req,
{
req.var == var;
});
以上代码等价于如下代码段,在变量名称相同时,在uvm_do_with内部会默认指定req的作用域,而在this就是req的作用域。
`uvm_do_with(req,
{
req.var == this.var;
});
解决的方法是:
1、避其锋芒。修改变量名var,如修改为var_i,这样在req作用域找不到var_i,自然就可以重定向到外部的作用域,如此则可以识别是外部传入的变量,约束可以生效。
`uvm_do_with(req,
{
req.var == var_i;
});
2、指定this为当前类。
class ex_seq extend base_seq;
function new(string name = "ex_seq");
super.new(name);
ex_seq = this;
endfunction
`uvm_do_with(req,
{
req.var == ex_seq.var;
});
endclass
3、用local指定为本地的变量
class ex_seq extend base_seq;
function new(string name = "ex_seq");
super.new(name);
endfunction
`uvm_do_with(req,
{
req.var == local::var;
});
endclass