#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)
Это неправильно по нескольким причинам
- Не используйте
<=
в комбинаторных блоках - В приведенном выше выражении 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). таким образом, это работает.