Ваша проблема в том, что вы разместили объявление x_idx
внутри блока begin/end
, который находится внутри fork/join_none
. Вы не хотите, чтобы инициализация происходила, когда параллельные потоки начинают выполняться; вы хотите, чтобы это происходило при выполнении каждой итерации for l oop. Вы должны записать его как
begin
for(int x=0; x<8; x++)
fork
int x_idx = x;
for(int i=0; i<100; i++) begin
if(!my_sequence[x_idx].randomize() with {...}
my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
end
join_none
end
Кроме того, нет необходимости использовать ключевое слово automatic
внутри класса - все переменные, объявленные внутри метода класса, имеют неявное автоматическое c время жизни.
Обратите внимание, что объявления внутри fork / join инициализируются при попадании в блок fork, а не когда операторы внутри fork начинают свои потоки. Объявления не являются отдельными потоками. Вы также можете записать как:
begin
for(int x=0; x<8; x++) begin
int x_idx = x;
fork
for(int i=0; i<100; i++) begin
if(!my_sequence[x_idx].randomize() with {...}
my_sequence[x_idx].start(p_sequencer.my_sequencer[x_idx];
end
join_none
end
end
В обоих случаях существует новый экземпляр x_idx
для каждой l oop итерации, но операторы внутри fork/join_none
не начинают выполняться до тех пор, пока после все итерации завершены.