2014-03-07 253 views
2

我有一个虚拟音序器,我可以并行执行三个事务,每个事务都在其对应的音序器上执行。所以,我有这样的事情:如何在没有随机化的情况下执行uvm_do_on?

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或类似的东西)。我能做什么?

谢谢!

回答

2

您可以在不调用randomize()的情况下实现uvm_do_on macro的内容(就像您在第二段中展示的那样),不会有任何后顾之忧。无论如何,这是一些专家建议的做法,因为音序器/驱动程序握手机制非常简单。宏并不是常态,它们只是在一开始就帮助你。

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调用覆盖它。

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

希望这会有所帮助。

0

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

相关问题