У меня есть виртуальный секвенсор, из которого я параллельно выполняю три транзакции, каждая на соответствующем секвенсоре. Итак, у меня есть что-то вроде этого:
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 или что-то в этом роде). Что я могу сделать?
Спасибо!