UVM虚拟音序器:选择正确的子音序器

时间:2014-11-12 18:19:38

标签: system-verilog uvm

我对UVM中的虚拟音序器有疑问。让我们认为我有N个相等的接口由N个相等的驱动器驱动,每个驱动器连接到它自己的定序器。我想做的是进行如下交易:

    class my_transaction extends uvm_sequence_item;
         logic data;
         int num_if;
    endclass

用`uvm_do()执行时发送到驱动程序号num_if。我的想法是,对于这种工作,我需要一个虚拟音序器,以及#34;前进"到正确的音序器的事务(号码num_if)。 这是正确的吗?如果是的话,怎么做? 感谢。

2 个答案:

答案 0 :(得分:4)

虽然Tudor的答案在技术上起作用,但概念上决定运行哪个接口(num_if)是一个不属于事务的值,而是属于调用它的序列(当然也应该随机化) )。事务应该只包含从A到B传播的值的表示以及它为该协议传播的方式。 的规范,其中A和B 通常不在交易的责任范围内。

在这种情况下,您的交易和Tudor序列的变体将如下所示:

class my_transaction extends uvm_sequence_item;
   rand logic data;
endclass

.. ..和

class some_virtual_sequence extends uvm_sequence;
  `uvm_declare_p_sequencer(virtual_seqr)
  rand int num_if; constraint.....
  task body();
    my_transaction trans = my_transaction::type_id::create("my_transaction");
    start_item(trans, , p_sequencer.seqrs[num_if]);
    trans.randomize(); // randomization should be done after start_item()
    finish_item(trans);
  endtask
endclass

..正如Tudor所说,在虚拟音序器上运行:

class virtual_seqr extends uvm_sequencer;
  my_sequencer seqrs[10];
endclass

上述方法还允许随机化发生在正确的位置:start_item()返回后,紧接在调用finish_item()之前完成序列项。

答案 1 :(得分:2)

您对虚拟音序器的看法正确。我将向您展示如何做到这一点(所有伪代码,您必须自己处理细节)。

我们假设我们有一个虚拟音序器,其中包含所有总线音序器的数组:

class virtual_seqr extends uvm_sequencer;
  my_sequencer seqrs[10];
endclass

我们假设这些句柄正确通过。在我们的虚拟序列中,我们可以创建一个事务,随机化它然后将它发送到适当的音序器。

class some_virtual_sequence extends uvm_sequence;
  `uvm_declare_p_sequencer(virtual_seqr)

  task body();
    my_transaction trans = my_transaction::type_id::create("my_transaction");
    my_transaction.randomize();
    start_item (my_transaction, , p_sequencer.seqrs[my_transaction.num_if]);
    finish_item(my_transaction);
  endtask
endclass

我们无法使用uvm_do,因为它不知道在哪里发送。我们也无法使用uvm_do_on,因为num_if字段必须先进行随机化才能知道将项目发送到何处。