如何在没有随机化的情况下执行uvm_do_on?

时间:2014-03-07 16:08:59

标签: uvm

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

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或类似的东西) 。我该怎么办?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我认为没有`uvm_send_on macro,但您可以使用`uvm_create_on(SEQ_OR_ITEM, SEQR)宏。从UVM文档中,这与`uvm_create相同,只是它还将父序列设置为调用宏的序列,并将序列器设置为指定的~SEQR~参数。事实上,`uvm_create macro默认通过传递m_sequencer在内部调用`uvm_create_on macro。您可以使用`uvm_create_on call。

覆盖它

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

希望这有帮助。

答案 2 :(得分:0)

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