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;}