0

我想做一个列表中的信号总和,自然我使用了变量和 for(就像我在 VHDL 中一样):

    @always_comb
    def sum():
        sum = 0
        for i in range(len(summands)):
            sum = sum + summands[i]
        product.next = sum

问题是这将使用整数(在 VHDL 中)作为 sum 变量,这在 sum 的宽度超过 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 的值,因此是不同的类型。

感谢您的任何建议

4

2 回答 2

0

我设法做出了非常丑陋的解决方法:

@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 对象时,模拟的性能会受到很大影响。

于 2016-06-07T15:39:30.213 回答
0

对于将来遇到这种情况的人。@always_comb您可以在(or @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 手册中的此页面提供了更多详细信息。

于 2021-07-10T11:31:00.250 回答