我有一个虚拟音序器,我可以从中并行执行三个事务,每个事务都在相应的音序器上。所以我有这样的事情:
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或类似的东西) 。我该怎么办?
谢谢!
答案 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以禁用随机化或添加约束