Как заставить 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 содержит более подробную информацию.

Другие вопросы по тегам