Лучшые практики цикла for для генерации HDL-кода

Циклы MATLAB

Некоторые лучшые практики для использования циклов в коде MATLAB для генерации HDL-кода:

  • Использование, монотонно увеличивающее счетчики цикла, с шагом 1, чтобы минимизировать сумму оборудования, сгенерированного в HDL-коде.

  • Если вы хотите использовать оптимизацию потоковой передачи цикла:

    • При присвоении новых значений персистентным переменным в цикле не используйте другие персистентные переменные на правой стороне присвоения. Вместо этого используйте промежуточную переменную.

    • Если цикл изменяет какие-либо элементы в персистентном массиве, цикл должен изменить все элементы в персистентном массиве.

Монотонно увеличивающиеся счетчики цикла

При помощи монотонно увеличения счетчиков цикла с шагом 1, можно уменьшать сумму оборудования в сгенерированном HDL-коде. Следующий цикл является примером монотонно увеличивающегося счетчика цикла с шагом 1.

a=1;
for i=1:10
    a=a+1;
end

Если счетчик цикла увеличивается шагом кроме 1, сгенерированный HDL-код может потребовать дополнительных сумматоров. Из-за этого дополнительного оборудования, не используйте следующий тип цикла.

a=1;
for i=1:2:10
    a=a+1;
end

Если счетчик цикла уменьшается, сгенерированный HDL-код может потребовать дополнительных сумматоров. Из-за этого дополнительного оборудования, не используйте следующий тип цикла.

a=1;
for i=10:-1:1
    a=a+1;
end

Персистентные переменные в циклах

Если цикл содержит несколько персистентных переменных, когда вы присваиваете значения персистентным переменным, используйте промежуточные переменные, которые не являются персистентными на правой стороне присвоения. Эта практика ясно дает понять зависимости к компилятору и помогает внутренней оптимизации во время процесса генерации HDL-кода. Если вы хотите использовать оптимизацию потоковой передачи цикла, чтобы уменьшать сумму сгенерированного оборудования, эта практика рекомендуется.

В следующем примере var1 и var2 являются персистентными переменными. var1 используется на правой стороне присвоения. Поскольку персистентная переменная находится на правой стороне присвоения, не используйте этот тип цикла:

for i=1:10
    var1 = 1 + i;
    var2 = var1 * 2;
end

Вместо того, чтобы использовать var1 на правой стороне присвоения, используйте промежуточную переменную, которая не является персистентной. Этот пример демонстрирует это с промежуточной переменной var_intermediate.

for i=1:10
    var_intermediate = 1 + i;
    var1 = var_intermediate;
    var2 = var_intermediate * 2;
end

Персистентные массивы в циклах

Если цикл изменяет элементы в персистентном массиве, убедитесь, что цикл изменяет все элементы в персистентном массиве. Если все элементы персистентного массива не изменяются в цикле, HDL Coder™ не может выполнить оптимизацию потоковой передачи цикла.

В следующем примере a является персистентным массивом. Первый элемент изменяется за пределами цикла. Не используйте этот тип цикла.

for i=2:10
    a(i)=1+i;
 end
 a(1)=24;

Вместо того, чтобы изменять первый элемент вне цикла, измените все элементы в цикле.

for i=1:10
   if i==1
      a(i)=24;
   else
      a(i)=1+i;
   end
end