我有一个连接到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
如何控制订阅者的订单?我希望他们按顺序排列:
EDA Playground上的示例代码:http://www.edaplayground.com/x/2zQ
答案 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)
订阅者的调用顺序是“未定义”;也就是说,如果你在模拟器之间移动,订单可能会改变。因此,您必须设计代码才能在不依赖订单的情况下工作。
如果订单很重要,请在代码中明确说明(即将您的行为合并到一个较大的记分板中,然后按顺序委托)。不要依赖无证件的行为。