Возможно ли увеличить / инициализировать переменную внутри ‘generate’ в verilog?

#parameters #verilog #increment

#параметры #verilog #увеличить

Вопрос:

Я сомневаюсь в generate , что мой код:

 parameter m=1;

generate 
 for(i=0; i<m; i=i 1) :loopstart
 begin
  statements;
 end
endgenerate
  

Внутри этого цикла m должно быть 2^0, 2^1, 2^2, и так далее. Поскольку
возведение в степень не поддерживается, я думал об инициализации m, а затем
умножая его на 2 на каждой итерации.

У меня есть несколько вопросов:

Возможно ли каким-либо образом использовать m << 1 внутри generate (поскольку это то же самое, что умножение на 2)? Если я это сделаю, это приведет к ошибке.

Я сослался на книгу Самира Пальниткара, в которой говорится, что оператор always работает внутри generate, поэтому я попытался:

 always @(m)
 m <= m*2; // (or m << 1)
  

Это не работает. Я понимаю, что это невозможно сделать, потому что m это параметр, а не переменная.

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

Есть ли альтернатива?

Ответ №1:

Вопрос, похоже, был создан, потому что экспоненты не поддерживаются. Это :

 2**0 => 1
2**1 => 2
2**2 => 4
  

ПРИМЕЧАНИЕ:

 always @(m)
 m <= m*2; // (or m << 1)
  

Это неправильно по нескольким причинам

  1. Не используйте <= в комбинаторных блоках
  2. В приведенном выше выражении m определяет себя и повторно запускает цикл.

Я бы также избегал именованных списков чувствительности и использовал always @* , чтобы избежать несоответствий аппаратного моделирования из неполных списков чувствительности.

параметры и localparams предназначены для определения констант, если они не являются постоянными, используйте что-то другое, например, логический или целочисленный тип.

 logic [31:0] m = 0;
logic [31:0] power_two_m;
always @* begin
  power_two_m = 2**m;
  power_two_m = 1 << m;
end
  

Ответ №2:

Вместо i использования i=i 1

И .. забудьте C.

Комментарии:

1. в no : (я ввел i здесь по ошибке. я правильно ввел ее в программу..

2. Я решил это .. я взял m в другом цикле выше цикла i и выполнил m = m * 2, всем спасибо 🙂

3. @Nandhini пожалуйста, опубликуйте ответ, описывающий, как вы решили проблему

4. @ Andy : Мне пришлось выполнить m = 2 ^ j для j = 0,1,2 и так далее Внутри цикла for внутри ‘generate’ таким образом, чтобы m = 1,2,4,…. Вместо этого я удалил j из цикла и просто взял переменную m внутри цикла for и написал for(m = 1; условие;m = m * 2). таким образом, это работает.