#system-verilog #uvm
#system-verilog #uvm
Вопрос:
В моей среде проверки у меня есть несколько общих последовательностей, настроенных для повторного использования:
class common_sequence(type T = uvm_sequence) extends uvm_sequence#(uvm_sequence_item);
`uvm_object_param_utils(common_sequence_t#(T))
function new(string name="common_sequence");
super.new(name);
endfunction
T sequence;
virtual task body();
`uvm_do(sequence);
endtask
endclass
Я хотел бы создать что-то подобное, где я мог бы передать событие.
class common_sequence_with_event(type T = uvm_sequence, type E = uvm_event) extends uvm_sequence#(uvm_sequence_item);
`uvm_object_param_utils(common_sequence_t#(T,E))
function new(string name="common_sequence");
super.new(name);
endfunction
T sequence;
E event;
virtual task body();
event.wait_trigger();
`uvm_do(sequence);
endtask
endclass
Я бы установил это событие из моего теста следующим образом:
class my_test extends uvm_test;
`uvm_component_utils(my_test)
uvm_event my_event;
function new(string name = "my_test", uvm_component parent=null);
super.new(name,parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_event my_event = new ("my_event");
endfunction
virtual function void end_of_elaboration_phase(uvm_phase phase);
super.end_of_elaboration_phase(phase);
// Schedule sequences with sequencers
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.my_agent.sequencer.reset_phase",
"default_sequence",
common_sequence#(reset_sequence)::get_type());
uvm_config_db#(uvm_object_wrapper)::set(this,
"env.my_agent.sequencer.main_phase",
"default_sequence",
common_sequence_with_event#(my_sequence, my_event )::get_type());
endfunction
endclass
Я получаю ошибку компиляции: параметр специализации класса должен быть постоянным для строки common_sequence_with_event#(my_sequence, my_event).
Я предполагаю, что это означает, что параметры, передаваемые классам, должны быть постоянными. Итак, в этом случае, почему он принимает reset_sequence, который также передается в качестве параметра.
Кроме того, есть ли лучший способ сделать то, чего я хочу достичь?
Ответ №1:
Параметры типа должны быть переданными типами. my_event
является переменной, а не типом. Вы не показали объявления для my_sequence
or reset_sequence
, но я предполагаю, что они являются типами классов. Вам вообще нужен параметр E
? Разве так не будет всегда uvm_event
?
Комментарии:
1. my_sequence и reset_sequence объявляются как любая обычная последовательность: my_sequence расширяет uvm_sequence(#транзакция);
2. Итак, все, что вам нужно сделать, это удалить
type E
объявление параметра