Можно ли увеличить / инициализировать переменную внутри 'generate' в verilog? - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть сомнения в 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 внутри генерациикаким-то образом (поскольку это то же самое, что умножение на 2)?Если я это сделаю, это приведет к ошибке.

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 19 июля 2013

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

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

Примечание:

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

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

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

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

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

logic [31:0] m = 0;
logic [31:0] power_two_m;
always @* begin
  power_two_m = 2**m;
  power_two_m = 1 << m;
end
0 голосов
/ 13 апреля 2011

Вместо i++ используйте i=i+1

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

...