2015-05-05 2 views
0

Можно ли последовательно выполнять блоки, сгенерированные оператором generate?Последовательная операция в выражении generate

Предположим, что сгенерированный оператор сгенерировал блок a, block b, block c ... Все они работают параллельно, но входные данные блока b зависят от результата блока a, который диктует, что они запускаются последовательно. Есть какой-либо способ сделать это? Я пробовал искать, но ничего не мог найти.

Вот фрагмент кода:

genvar i,j,k; 
generate 
for (k=1;k<6;k=k+1) begin : stepk // number of whole operation reps 
    for (i=k;i<6;i=i+1) begin : stepi // row counter 
    for (j=k+1;j<6;j=j+1) begin : stepj // column counter 
     //res2[i][j] = res[i][j]/ res[i][k] 
     fixed_point_div fpdiv(
        .clk(clk), 
        .dividend_fp(res[k][i][j]), 
        .divisor_fp(res[k][i][k]), 
        .quotient_fp(res[k+1][i][j])); 

     //assign res3[1][j] = res2[1][j]; 
     assign res[k+2][i][j] = (i==k) ? res[k+1][k][j] : (res[k+1][i][j] - res[k+1][k][j]); 

    end 
    end 
end 
endgenerate 
+1

«Выполнять сгенерированные блоки» Похоже, что ваш желаемый экземпляр оборудования должен выполняться подобно программным функциям. Чтобы разделить один аппаратный блок, вам нужно создать один экземпляр и создать контроллер для его последовательности. – Morgan

+0

Генерирующий блок * реплицирует * некоторую структуру оборудования в соответствии с заданным шаблоном. Если вы копируете блоки, которые последовательно связаны друг с другом, последовательность будет выполняться последовательно. –

ответ

0

Это трудно определить только из кода, предоставленной Вами, но если подключить несколько комбинационные модули вместе, каждый из них будет действовать на результат предыдущего. Скажем, у вас есть три комбинационных блоков:

A -> B -> C 

Поскольку каждый модуль является комбинационной, это зависит только от его входов, и так будет эффективно работать «последовательно» - один раз на выходах A решимостью, B обновит, и т. д., пока результаты не распространится на выход модуля C.

Однако это комбинационное обновление может занять довольно много времени, особенно если у вас много блоков в последовательности, что может привести к длительному циклу. Более эффективный подход, который обеспечивает преимущества скорости параллельного выполнения, сохраняя при этом время цикла разумным было бы трубопровода конструкции путем добавления регистров между каждым блоком:

A -> || -> B -> || -> C 

Это позволяет А, В, и С, чтобы выполнить одновременно на последовательные данные. Вы можете легко изменить свой оператор generate, зарегистрировав вывод каждого блока fixed_point_div, прежде чем он будет передан в следующую для конвейера проекта.

Смежные вопросы