проблема в том, что блок foo
разрешается во время компиляции.Таким образом, имена типа foo[0]
, foo[1]
предварительно сгенерированы и являются именами во время компиляции, они не работают с динамическим разрешением индекса во время выполнения.Поэтому foo[j]
не будет работать.
решение в этом случае состоит в использовании другого блока генерирования для их инициализации.Примерно так:
generate
for(jj = 0; jj < N; jj = jj + 1) begin : foo_init
initial begin
// initialization of arrays
for(i=0; i<(2**7); i=i+1) begin
foo[jj].bar.array[i] = 0;
end
end
end
endgenerate
Та же история с массивом экземпляров.
FOO bar[3:0](); // array of instances
int i,j;
generate
for(jj = 0; jj < 4; jj = jj + 1) begin : foo_init
initial begin
for(i=0; i<(2**7); i=i+1) begin
bar[jj].array[i] = 0;
end
end
end
endgenerate
Кстати, в системном журнале вы можете избежать использования пар generate/endgenerate
: