VHDL Fixed_pkg 添加 2 个 ufixed 值时获取绑定检查失败

VHDL Fixed_pkg Getting bound check failure when adding 2 ufixed values

我正在尝试使用 ufixed 数据类型并将 2 个 ufixed 值加在一起,我已经计算出我应该有足够的位来存储结果并且输出应该能够存储在信号中,但是当我尝试执行它我得到一个绑定检查失败。谁能告诉我为什么会收到这个?

代码的重要部分是:

-- definition of parameters used in the failing calculation

input : in ufixed(0 downto -15); -- Q1.15

constant VectorLength : integer := 3;
type vector_ufixed is array(0 to VectorLength-1) of ufixed(1 downto -14);

constant InnerProductArray : vector_ufixed := (to_ufixed(1.2,1,-14), to_ufixed(1.0,1,-14), to_ufixed(0.2,1,-14));

signal InnerProductResult : ufixed(4 downto -29); -- Q5.29

signal counter : integer := 0;


write(l, real'image(to_real(InnerProductResult)));
write(l, string'(", "));
write(l, real'image(to_real(InnerProductResult + input*InnerProductArray(counter))));
writeline(output, l);
InnerProductResult <= InnerProductResult +                                                                            
                      input*InnerProductArray(counter);

当我用 ghdl 模拟这个时,我得到以下结果:

0.0, 6.00006103515625e-1
ghdl:error: bound check failure at InnerProduct.vhd:55
  from: process work.innerproduct(innerproductarchitecture).P0 at InnerProduct.vhd:55
ghdl:error: simulation failed

第 55 行在这种情况下是行 InnerProductResult <= InnerProductResult + input*InnerProductArray(counter);

input取值0.5,从input乘以1.2的结果值6.00006103515625e-1可以看出。

值 6.00006103515625e^-1*2^29 也是 322125824,它是一个小于 2^34 的整数,所以应该没问题,我不明白为什么会这样?

在这种情况下,执行加法和乘法等算术运算时,需要调整运算结果的大小以适应其存储位置。在这种情况下,我们将一个 34 位数字添加到 2 个 16 位数字,因此我们需要将结果调整为 34 位宽,以便精确适合存储位置,即 InnerProductResult。

fixed_pkg 中调整大小的语法似乎与 numeric_std 中用于有符号和无符号数字的语法不同。以下语法对于使用 fixed_pkg 完成的操作是必需的,这是在 http://www.klabs.org/mapld05/presento/189_lewis_p.pdf:

中找到的
InnerProductResult <= resize(                                                                                         
    arg => InnerProductResult + input*InnerProductArray(counter),                                                       
    size_res => InnerProductResult                                                                                      
    );