Как заставить MyHDL генерировать переменную с произвольной шириной в процессе?
Я хотел бы сделать сумму сигналов, которые у меня есть в списке, естественно, я использовал переменную и для (как я бы в VHDL):
@always_comb
def sum():
sum = 0
for i in range(len(summands)):
sum = sum + summands[i]
product.next = sum
Проблема в том, что для переменной суммы будет использоваться целое число (в VHDL), что не очень полезно, когда ширина суммы будет больше 32 бит.
Поэтому я попытался сделать что-то вроде этого:
@always_comb
def sum():
sum = intbv(0, min=vmin, max=vmax)
for i in range(len(summands)):
sum = sum + summands[i]
product.next = sum
Я получаю следующую ошибку (при конвертации):
Type mismatch with earlier assignment: sum
Что я не понимаю, как обойти. Я думаю, он получает значение intbv в сумме в виде целого числа и, следовательно, другого типа.
Спасибо за любое предложение
2 ответа
Мне удалось сделать очень уродливый обходной путь:
@always_comb
def sum():
sum = intbv(0, min=vmin, max=vmax)
for i in range(len(summands)):
sum = intbv(sum + summands[i], min=vmin, max=vmax)
product.next = sum
Таким образом, он будет генерировать правильный VHDL:
IIR_SOS_INST_0_PRODUCTS_1_SUM: process (sos_inst_0_products_1_summands) is
variable sum: signed(44 downto 0);
begin
sum := to_signed(0, 45);
for i in 0 to 21-1 loop
sum := to_signed((sum + sos_inst_0_products_1_summands(i)), 45);
end loop;
sos_inst_0_b1p <= sum;
end process IIR_SOS_INST_0_PRODUCTS_1_SUM;
Но производительность симуляции значительно страдает при создании нового объекта intbv при каждом назначении для суммирования.
Для людей, которые столкнутся с этим в будущем. Вы можете создать переменную вне
@always_comb
(или же
@always
) функция:
sum = intbv(0, min=vmin, max=vmax)
Синтаксис для присвоения этой переменной:
sum[:] = 0
В этом случае данный пример будет выглядеть следующим образом:
sum = intbv(0, min=vmin, max=vmax)
@always_comb
def sum():
sum[:] = 0
for i in range(len(summands)):
sum[:] = sum + summands[i]
product.next = sum
Эта страница в руководстве MyHDL содержит более подробную информацию.