У меня есть следующий пример дизайна:
module test_module();
logic data;
task set_data(input logic data_i);
data = data_i;
endtask
endmodule
module test();
for (genvar i = 0; i < 2; i++) begin: module_gen
test_module module_instance();
end
endmodule
Мой вопрос: если я хочу вызвать set_data
для всех экземпляров test_module
, есть ли способ использовать какой-то цикл for для выполнения вызова?
Вызов таких задач утомительный:
module_gen[0].module_instance.set_data(1'b0);
module_gen[1].module_instance.set_data(1'b0);
Я хотел бы сделать что-то вроде:
for (int i = 0; i < 2; i++) begin
module_gen[i].module_instance.set_data(1'b0);
end
Я понимаю, почему это невозможно. Но есть ли обходной путь?
P.S: имейте в виду, что это игрушечный пример, объясняющий проблему. Да, легко написать 2 строки вместо 1, но в реальном примере у меня получается слишком много строк.
Поскольку это тестовый стенд, вы можете обернуть задачу в объект класса, а затем создать массив объектов. Теперь вы можете процедурно вызывать задачу в каждом объекте.
module test_module();
logic data;
task set_data(input logic data_i);
data = data_i;
$display("%m data set to %b",data);
endtask
endmodule
module test();
interface class wrapper; // ideally put in a package
pure virtual task set_data(input logic data_i);
endclass
wrapper list[2];
for (genvar i = 0; i < 2; i++) begin: module_gen
class concrete implements wrapper;
virtual task set_data(input logic data_i);
module_instance.set_data(data_i);
endtask
endclass
concrete h = new;
initial list[i] = h;
test_module module_instance();
end
initial #10 foreach(list[i])
#20 list[i].set_data(1);
endmodule