VHDL:添加两个数字时发生绑定检查错误

VHDL:添加两个数字时发生绑定检查错误,vhdl,ghdl,Vhdl,Ghdl,为什么此VHDL代码会导致边界检查失败?我的结果信号比正在添加的最宽数字宽1位。。。因此它不应该溢出。。。我错过什么了吗 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity testbench is end entity; architecture sim of testbench is constant dw :natural := 8;

为什么此VHDL代码会导致边界检查失败?我的结果信号比正在添加的最宽数字宽1位。。。因此它不应该溢出。。。我错过什么了吗

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity testbench is
end entity;

architecture sim of testbench is
    constant dw       :natural                 := 8;
    signal   arg1     :unsigned(dw-1 downto 0) := to_unsigned(4, dw);       
    signal   result   :unsigned(dw+0 downto 0);
begin
    result <= arg1 + '1';
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体测试台是
终端实体;
测试台的sim体系结构是
常数dw:自然值:=8;
信号arg1:无符号(dw-1向下至0):=至_无符号(4,dw);
信号结果:无符号(dw+0向下至0);
开始
结果ghdl-a--std=08--ieee=synopsys--work=work testbench.vhd

C:>ghdl--elab运行--std=08--ieee=synopsys测试台 --ieee断言=禁用

ghdl.exe:错误:测试台绑定检查失败。vhd:13发件人: 过程工作。测试台(sim)。测试台P0。vhd:13

ghdl.exe:错误:模拟失败


加法的向量操作数的长度应与赋值目标的长度相同。如果需要,扩展:

result <= ('0' & arg1) + '1';

result我想在@renaud的回答中添加一条注释。VHDL是强类型语言,即运算符两侧的每个信号都应具有精确匹配的类型和大小。
因此,必须注意确保表达式中使用的所有信号的类型具有相同的大小和类型。
在代码中,由于已为溢出分配了额外的位,因此还应更改输入信号的大小。
但这在verilog中不是问题,它通过填充位来处理不匹配。

虽然令人沮丧,但VHDL在模拟前清除许多错误方面非常有用。

是的,您遗漏了一些东西。注意arg1的边界是无符号的(dw-1向下到0),这将定义结果的长度(对于-2008兼容数字_std,-std=08的操作数中的较大值。“+”将右操作数转换为具有左操作数长度的std_ulogic_向量)。结果长度将与左操作数长度匹配,但您已为结果无符号(dw+0向下至0)指定了更长的长度这将在运行时产生绑定检查错误-对于赋值左侧的每个元素,右侧没有匹配的元素。也就是说,运算符两侧的每个信号都应该具有精确的匹配类型和大小。这不是真的。例如,IEEE Std 1076-2008 9.2.3关系运算符第4段"... 相同类型的两个复合值相等当且仅当左操作数的每个元素都有右操作数的匹配元素,反之亦然,并且匹配元素的值相等,如元素类型的预定义相等运算符所示。特别是,同一类型的两个空数组总是相等的。。。“。还有算术运算符,特别是串联运算符或其他运算符,还有包中的乘法运算符numeric_std和numeric_bit作为更多示例。还有杂项求幂运算符。