2

我有一个连接到 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

如何控制调用订阅者的顺序?我希望它们按以下顺序排列:

  • 记分牌_3
  • 记分牌_2
  • 记分牌_1

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

4

3 回答 3

3

当您调用connect(). 对它执行 aforeach时(请参阅resolve_bindings()参考资料),您将按字典顺序获得项目。这仅适用于 UVM 的当前实施;未来的实现可能会决定使用对象的关联数组,但没有定义排序。

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

如果您想确保您的写入以特定顺序执行,您应该通过您的测试平台结构强制执行它:要么有一个连接到您的 AP 的顶级记分板,它按特定顺序委派调用,或者将您的记分板链接在一起,所以scoreboard1 执行此操作,然后写入 scoreboard2,执行此操作然后写入 scoreboard3。

于 2014-04-09T15:11:41.247 回答
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 Playground:http ://www.edaplayground.com/x/3bf

于 2014-04-10T20:52:30.660 回答
0

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

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

于 2014-04-15T15:12:26.010 回答