我在uvm_do_with
宏的序列中使用了内联约束,我遇到了一些我不太了解的内容。希望有人能够对此有所了解:
假设我的my_seq_item
有2个兰特变量 - data
和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_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;
}
如果这也是真的,那么为什么将变量命名为其他东西呢?
答案 0 :(得分:2)
内联约束具有复杂的标识符搜索语义。它首先搜索调用randomize()
的对象(在这种情况下为item
)。如果未找到标识符,则搜索通常从发生randomize()
的调用点开始(来自body()
任务)。
因此,当项目和正文中都有相同的标识符名称时,约束首先会找到item
标识符。当名称不相同时,您不会遇到此问题。使用local::
可以显示您不希望项目被搜索的意图。我建议您只需要本地范围搜索时使用local::
,无论项目中是否存在具有相同名称的标识符。