如何使用UVM工厂的set_inst_override_by_name覆盖序列项

时间:2014-12-19 04:03:32

标签: verilog system-verilog uvm

我有两个序列项类a_packet及其扩展类bad_packet。 默认情况下,使用a_packet类型。 尝试使用a_packet覆盖bad_packet实例,我可以在我的uvm测试中使用set_inst_override_by_name成功完成,

factory.set_inst_override_by_name("a_packet","bad_packet", "*");

现在我的问题是:如果我不想使用“*”,如何知道序列项实例的完整层次路径?

我试图在序列项中使用get_full_name(),在驱动程序收到它之后,知道确切的分层路径。它显示:

uvm_test_top.env.a_agt.a_seqr.a_sequence.a_packet

但是当我用上面的路径替换*时,覆盖不会发生。

factory.set_inst_override_by_name("a_packet","bad_packet","uvm_test_top.env.a_agt.a_seqr.a_sequence.a_packet");

我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

在您创建数据包的位置,您需要指定对create(..)的相应调用的完整路径:

packet = a_packet::type_id::create("packet", , get_full_name());

如果您使用的是uvm_do宏,则必须更改为使用显式序列API:

packet = a_packet::type_id::create("packet", , get_full_name());
start_item(packet);
// ... randomize ...
finish_item(packet);

想法来自this DVCon论文,第IV.A部分。