2

我有一个虚拟定序器,我从中并行执行三个事务,每个事务都在其对应的定序器上。所以我有这样的事情:

class top_vseqr extends uvm_seqr extends uvm_sequencer;
  type_a_seqr seqr_a;
  type_b_seqr seqr_b;
  type_c_seqr seqr_c;

...

endclass: top_vseqr

class simple_vseq extends uvm_sequence;
  `uvm_declare_p_sequencer(top_vseqr)

  type_a_seq seq_a;
  type_b_seq seq_b;
  type_c_seq seq_c;

  ...

  virtual task body();
    fork
      `uvm_do_on(seq_a, p_sequencer.seqr_a)
      `uvm_do_on(seq_b, p_sequencer.seqr_b)
      `uvm_do_on(seq_c, p_sequencer.seqr_c)
    join
  endtask: body

endclass: simple_vseq

但现在我希望能够将特定事务驱动到虚拟定序器中,具体取决于我正在运行的测试。为此,我有一个带有分析导入的类,每次监视器在界面中看到事务时都会更新该导入,以及一个返回要驱动的下一个事务的函数。所以现在我想做如下的事情:

class test extends uvm_test;

  model model_a;
  simple_vseq seq;
  top_vseqr virt_seqr;

  ...

  task run_phase(uvm_phase phase);

    ...

    seq = simple_vseq::type_id::create("seq", this);
    seq.seq_a = model_a.get_sequence();
    seq.start(virt_seqr);

    ...

  endtask: run_phase

浏览 UVM 文档,我看到有一个 'uvm_send 宏,但它不允许您选择音序器来运行序列(即我没有看到 'uvm_send_on 或类似的东西)。我能做些什么?

谢谢!

4

3 回答 3

2

您可以在uvm_do_on macro不调用 to的情况下实现 的内容randomize()(就像您在第二个片段中显示的那样),而无需担心。无论如何,这是一些专家建议的做法,因为定序器/驱动程序握手机制非常简单。`uvm_do*宏不是常态,它们只是在开始时帮助您。

于 2014-03-07T18:10:36.133 回答
0

我不认为有一个`uvm_send_on macro,但有一个`uvm_create_on(SEQ_OR_ITEM, SEQR)你可以使用的宏。从 UVM 文档来看,这与`uvm_create将父序列设置为调用宏的序列相同,并将序列器设置为指定的 ~SEQR~ 参数。实际上,内部`uvm_create macro调用`uvm_create_on macro是通过默认传递 m_sequencer 来实现的。您可以使用 `uvm_create_on 调用覆盖它。

或者,您也可以在您的 sequence_item 对象上执行 set_sequencer ,以便它设置 m_sequencer 变量。

希望这可以帮助。

于 2014-03-08T04:34:47.683 回答
0

`uvm_do_on_with 可能满足您的要求,您也可以删除数据包中的 rand 以禁用随机化或添加约束

于 2016-10-22T03:25:48.653 回答