UVM 虚拟音序器的用途是什么

What is the purpose of UVM Virtual Sequencers

我想弄清楚 UVM 虚拟音序器的用途是什么。

如果你看看验证学院是怎么说的。它基本上是其他音序器的容器class。

class sequencer extends uvm_virtual_sequencer;

`uvm_component_utils(virtual_sequencer)

 sequencer_a m_seq_a;
 sequencer_b m_seq_b;
...
...
endclass 

有人只是在开始他们的序列时异端引用 m_seq_a 或 m_seq_b。

为什么虚拟音序器不只是 uvm_component?有什么 uvm_virtual_sequencer 可以做的吗?无法在虚拟音序器上启动。

有两种启动虚拟序列的方法(这将依次在不同的音序器上启动不同的序列)。

  • 将目标定序器的句柄保留在虚拟序列中,然后在启动序列之前分配这些句柄。

像这样。

vir_seq vira = vir_seq::type_id::create("virtual_sequence");

vira.sequencer_1 = .... ; // sequencer 1 hierarchical path
vira.sequencer_2 = .... ; // sequencer 2 hierarchical path

vira.start(null); // Start the virtual sequence using null
  • 将目标音序器的句柄保留在另一个音序器(虚拟音序器)中,并在该虚拟音序器上启动虚拟音序器。

但不推荐Virtual Sequencer的做法,因为它只是增加了一层层次结构,复用起来很复杂。

还有一点,uvm_virtual_sequencer只是一个uvm_sequencer而已,不可能是uvm_component,虚拟序列会在上面启动。

这是UVM 1.2源代码中的相关代码。

typedef uvm_sequencer #(uvm_sequence_item) uvm_virtual_sequencer

通常,单个驱动程序-定序器对属于一个代理。因此,在创建序列和序列器之后,agent.run_phase() 将在 seq.start(sequencer) 被执行时开始发送 sequence_item。假设我们有两个代理,每个代理都有自己的定序器和驱动程序对。在那种情况下,没有简单的方法来编排两个序列,例如在完成一个序列后开始另一个序列。我相信这是使用虚拟序列(或虚拟音序器)的根本原因。一种方法是使用虚拟序列,它在一个地方(虚拟序列的主体)具有音序器和 运行s(或叉子)seq.start() 的句柄,实现多个序列之间的时序控制。

以下站点有一张您可以想象的漂亮图片。 http://www.learnuvmverification.com/index.php/2016/02/23/how-virtual-sequence-works-part-1/#comment-38603

顺便说一句,我相信如果你不想控制两个序列之间的时序,你就不必使用虚拟序列。您可以将每个音序器驱动程序放在单独的代理中,并让它们 运行 并行。但是,如果您希望在以后的两个序列之间更好地控制时序,则必须修改测试平台。但是您真的不想每次需要时都修改测试台。一旦定义了虚拟序列,您只需修改虚拟序列(或派生子序列)而不是测试平台。这样,就可以同时实现时序控制和可重用测试平台。

如果我弄错了,相信 UVM 的专家会提出问题。