UVM虚拟序列发生器的目的是什么?

时间:2017-09-04 14:30:09

标签: uvm

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

如果你看一下验证学院对它的评价。它基本上是其他序列发生器的容器类。

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可以执行的操作?我们无法在虚拟音序器上开始。

2 个答案:

答案 0 :(得分:1)

启动虚拟序列有两种方法(它们将在不同的序列发生器上启动不同的序列)。

  • 将目标序列发生器的句柄保留在虚拟序列中,然后在开始序列之前分配这些句柄。

喜欢这个。

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

答案 1 :(得分:0)

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

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

顺便说一句,我相信,如果您不想控制两个序列之间的时序,则不必使用虚拟序列。您可以将每个音序器驱动程序放在单独的代理中,并使其并行运行。但是,如果要进一步控制两个序列之间的时序,则必须修改testbench。但是您真的不想每次都需要时修改测试平台。定义虚拟序列后,您只需修改虚拟序列(或派生一个子代)即可,而不是测试台。因此,可以同时实现对时序和可重用测试平台的控制。

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