Verilog — Можно ли присваивать значения регистру на основе переменных genvar в блоке генерации

#for-loop #verilog #assign #synthesis

#для цикла #verilog #назначить #синтез

Вопрос:

У меня есть некоторый код, похожий на этот (пример приведен ниже):

 genvar x;
genvar y;
generate
    for (y = -off; y < off; y=y 1) begin
        for (x = -off; x < off; x=x 1) begin
            guassian_kernel[((((y off)*ks) x off 1)*fs)-1:(((y off)*ks) x off)] = x*y; // <- something like this
        end
    end
endgenerate
  

Возможно ли сделать что-то подобное или подобное:

 20'd(x*y) 
  

и т.д.?

Или у меня нет другого выбора, кроме как жестко закодировать все значения регистра? В фактическом коде, который я использую, значения в reg были бы гораздо более сложной функцией x и y.

Спасибо!

Ответ №1:

generate блок, используемый только для генерации регулярных инструкций verilog, таких как экземпляры модулей, всегда блокирует, присваивает операторы, … Это своего рода предварительная обработка.

Итак, ваше назначение должно быть законным оператором verilog, например,

 generate
for (y = -off; y < off; y=y 1) begin
    for (x = -off; x < off; x=x 1) begin
        always @*  // <-- something like this.
             guassian_kernel[((((y off)*ks) x off 1)*fs)-1:(((y off)*ks) x off)] = x*y; 
    end
end
endgenerate