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

System verilog UVM虚拟音序器:选择正确的子音序器,system-verilog,uvm,System Verilog,Uvm,我有一个关于UVM中虚拟音序器的问题。假设我有N个相等的接口,由N个相等的驱动程序驱动,每个驱动程序连接到自己的sequencer。我想做的是进行如下交易: class my_transaction extends uvm_sequence_item; logic data; int num_if; endclass 当使用'uvm_do()执行时,将发送到驱动程序编号num_if。我的想法是,对于这种工作,我需要一个虚拟的序列器,它可以将事

我有一个关于UVM中虚拟音序器的问题。假设我有N个相等的接口,由N个相等的驱动程序驱动,每个驱动程序连接到自己的sequencer。我想做的是进行如下交易:

    class my_transaction extends uvm_sequence_item;
         logic data;
         int num_if;
    endclass
当使用'uvm_do()执行时,将发送到驱动程序编号num_if。我的想法是,对于这种工作,我需要一个虚拟的序列器,它可以将事务“转发”到正确的序列器(num_if)。 是这样吗?如果是,如何做?
谢谢。

关于虚拟音序器,你说得对。我将向您展示一个如何做的想法(所有的伪代码,您必须自己处理细节)

假设我们有一个虚拟定序器,其中包含所有总线定序器的阵列:

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\u do
,因为它不知道在哪里调度。我们也不能使用
uvm_do_on
,因为
num_if
字段必须在知道将项目发送到何处之前进行随机分配。

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

在这种情况下,您的事务和都铎序列的变化如下所示:

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
…在虚拟音序器上运行,正如都铎所说:

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

上述方法还允许在正确的位置进行随机化:在start\u item()返回之后,在调用完成序列项的finish\u item()之前。

我也同意
num\u if
参数不属于“总线”事务项。