`uvm_do_with 具有内联约束

`uvm_do_with with inline constraints

我在 uvm_do_with 宏的序列中使用了内联约束,我遇到了一些我不太明白的事情。希望有人能对此有所了解:

假设我的 my_seq_item 有 2 个随机变量 - dataaddr

my_sequence.sv

class my_sequence extends uvm_sequence;
// Constructor, .... etc etc

virtual task body();
  my_sequence_item tx;
  bit [31:0] addr = 'h0101_0101;
  bit [31:0] data = 'hDEAD_BEEF;

  `uvm_do_with(tx , { tx.addr == addr;
                      tx.data == data;
                    });
endtask: body

这玩意不好。相反:

 `uvm_do_with(tx , { tx.addr == local::addr;
                     tx.data == local::data;
                   }

工作正常。

另一个解决方案是将我的 local 变量命名为 addrdata 以外的名称。

uvm_do_with 宏的扩展说它调用 item.randomize(),所以我假设在这种情况下,调用将是

item.randomize(addr, data) with {addr == local::addr;
                                 data == local::data;
                                } 

这是否意味着如果约束块中的变量范围是item而不是当前对象?如果是这种情况,那么我应该可以调用:

 `uvm_do_with(tx , { addr == local::addr;
                     data == local::data;
                   }

如果这也是正确的,那么为什么将变量命名为其他名称有效?

内联约束具有复杂的标识符搜索语义。它首先搜索调用 randomize() 的对象(在本例中为 item)。如果没有找到标识符,搜索通常从调用 randomize() 的点开始(从 body() 任务开始)。

因此,当项目和正文中的标识符名称相同时,约束会首先找到 item 标识符。当名称不相同时,您不会遇到此问题。使用 local:: 是表明您不希望搜索该项目的意图的方式。我建议只要您只想进行本地范围搜索,就使用 local::,无论项目中是否存在具有相同名称的标识符。