`uvm_do_with 具有内联约束
`uvm_do_with with inline constraints
我在 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;
}
如果这也是正确的,那么为什么将变量命名为其他名称有效?
内联约束具有复杂的标识符搜索语义。它首先搜索调用 randomize()
的对象(在本例中为 item
)。如果没有找到标识符,搜索通常从调用 randomize()
的点开始(从 body()
任务开始)。
因此,当项目和正文中的标识符名称相同时,约束会首先找到 item
标识符。当名称不相同时,您不会遇到此问题。使用 local::
是表明您不希望搜索该项目的意图的方式。我建议只要您只想进行本地范围搜索,就使用 local::
,无论项目中是否存在具有相同名称的标识符。
我在 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;
}
如果这也是正确的,那么为什么将变量命名为其他名称有效?
内联约束具有复杂的标识符搜索语义。它首先搜索调用 randomize()
的对象(在本例中为 item
)。如果没有找到标识符,搜索通常从调用 randomize()
的点开始(从 body()
任务开始)。
因此,当项目和正文中的标识符名称相同时,约束会首先找到 item
标识符。当名称不相同时,您不会遇到此问题。使用 local::
是表明您不希望搜索该项目的意图的方式。我建议只要您只想进行本地范围搜索,就使用 local::
,无论项目中是否存在具有相同名称的标识符。