System verilog `带内联约束的uvm_do_

System verilog `带内联约束的uvm_do_,system-verilog,uvm,System Verilog,Uvm,我在序列中使用了uvm\u do\u with宏的内联约束,遇到了一些我不太理解的问题。希望有人能对此有所了解: 假设我的my_seq_项目有两个随机变量-数据和addr 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;

我在序列中使用了
uvm\u do\u with
宏的内联约束,遇到了一些我不太理解的问题。希望有人能对此有所了解:

假设我的
my_seq_项目
有两个随机变量-
数据
addr

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
变量命名为
addr
data
以外的其他变量

用宏扩展
uvm\u do\u表示它调用了
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()
任务开始)


因此,当项目和正文中的标识符名称相同时,约束首先查找
项目
标识符。如果名称不相同,则不会出现此问题。使用
local::
可以表明您不希望搜索项目的意图。我建议您在只需要本地范围搜索时使用
local::
,而不管项目中是否有同名的标识符

行内约束具有复杂的标识符搜索语义。它首先搜索调用了
randomize()
的对象(
item
)。如果未找到标识符,则搜索通常从调用
randomize()
的点开始(从
body()
任务开始)


因此,当项目和正文中的标识符名称相同时,约束首先查找
项目
标识符。如果名称不相同,则不会出现此问题。使用
local::
可以表明您不希望搜索项目的意图。我建议您在只需要本地范围搜索时使用
local::
,而不管项目中是否有同名的标识符

感谢您的澄清感谢您的澄清我认为是的,因为当您对任何对象应用内联约束时,您直接访问对象变量,而不是通过它;中国的等级制度。像
item.randomize with{addr==1;data==256;}
我认为是的,因为当你对任何对象应用内联约束时,你直接访问对象变量,而不是通过它;中国的等级制度。类似于
item.randomization与{addr==1;data==256;}