如何控制UVM分析端口订户的顺序?

时间:2014-04-09 12:52:55

标签: system-verilog uvm

我有一个连接到3个记分板的分析端口。在分析端口上完成写入时,将按特定顺序调用订户(记分板)。但我希望以不同的顺序调用它们。

显式排序的实际用例如下。一个记分板只进行记录,因此应首先调用它。另一个记分板执行非常基本的低级别检查,因此应该将其称为第二个。第三个记分牌执行非常复杂的高级别检查,因此应该最后调用。

SV片段:

sb1 = scoreboard_1::type_id::create("sb1", null);
sb2 = scoreboard_2::type_id::create("sb2", null);
sb3 = scoreboard_3::type_id::create("sb3", null);

// Connect analysis port to scoreboard
m_ap = new("ap", null);
m_ap.connect(sb2.m_imp);
m_ap.connect(sb3.m_imp);
m_ap.connect(sb1.m_imp);
m_ap.resolve_bindings();

// Write
m_ap.write(10);

当前输出:

# UVM_INFO design.sv(15) @ 0: sb1 [write] scoreboard_1
# UVM_INFO design.sv(32) @ 0: sb2 [write] scoreboard_2
# UVM_INFO design.sv(49) @ 0: sb3 [write] scoreboard_3

如何控制订阅者的订单?我希望他们按顺序排列:

  • scoreboard_3
  • scoreboard_2
  • scoreboard_1

EDA Playground上的示例代码:http://www.edaplayground.com/x/2zQ

3 个答案:

答案 0 :(得分:3)

当您调用connect()时,分析端口的提供程序最终会在一个关联的字符串数组中。在对其进行foreach时(请参阅resolve_bindings()),您将按字典顺序获取这些项目。这仅适用于目前实施的UVM;未来的实现可能决定使用对象的关联数组,对此没有定义排序。

分析端口背后的主要思想是它们无需连接。这意味着每个用户应该完全独立于连接到该端口的任何其他用户,因此您不能依赖任何订购。

如果您想确保您的写入按特定顺序执行,您应该通过您的测试平台结构强制执行:要么有一个连接到您的AP的顶级记分板,它按特定顺序委托调用或链接在一起你的记分牌,以便记分板1做它的事情,然后写入记分牌2,然后写入记分板3。

答案 1 :(得分:1)

在主要模拟器(ModelSim / Questa,INCISIV和VCS)中,uvm_port_base.svh中字符串关联数组的顺序是按字母顺序排列的。这意味着分析端口写入的顺序对应于订户名称的字母顺序。

要使用户按要求的顺序写入,请将名称修改为:

sb1 = scoreboard_1::type_id::create("-sb1", null);
sb2 = scoreboard_2::type_id::create("--sb2", null);
sb3 = scoreboard_3::type_id::create("---sb3", null);

您将看到输出更改为:

# UVM_INFO design.sv(49) @ 0: ---sb3 [write] scoreboard_3
# UVM_INFO design.sv(32) @ 0: --sb2 [write] scoreboard_2
# UVM_INFO design.sv(15) @ 0: -sb1 [write] scoreboard_1

修复EDA游乐场:http://www.edaplayground.com/x/3bf

答案 2 :(得分:0)

订阅者的调用顺序是“未定义”;也就是说,如果你在模拟器之间移动,订单可能会改变。因此,您必须设计代码才能在不依赖订单的情况下工作。

如果订单很重要,请在代码中明确说明(即将您的行为合并到一个较大的记分板中,然后按顺序委托)。不要依赖无证件的行为。