VHDL:两个数字相加时的绑定检查错误

时间:2019-08-01 17:29:08

标签: 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;
    signal   arg1     :unsigned(dw-1 downto 0) := to_unsigned(4, dw);       
    signal   result   :unsigned(dw+0 downto 0);
begin
    result <= arg1 + '1';
end architecture;
  

C:> ghdl -a --std = 08 --ieee = synopsys --work = work testbench.vhd

     

C:> ghdl --elab-run --std = 08 --ieee = synopsys测试平台   --ieee-asserts =禁用

     

ghdl.exe:错误:来自以下位置的testbench.vhd:13绑定检查失败:   在testbench.vhd:13处处理work.testbench(sim).P0

     

ghdl.exe:错误:模拟失败

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我想在@renaud的答案中添加注释。 VHDL是强类型语言,也就是说,运算符两侧的每个信号都应具有完全匹配的类型和大小。  因此,必须注意确保在表达式中使用的所有信号的类型和大小都相同。  在代码中,由于您为溢出分配了额外的位,因此您还应该更改输入信号的大小。  但是,这在verilog中不是问题,它通过填充位来解决不匹配问题。  尽管令人沮丧,但VHDL在模拟之前清除许多错误方面非常有帮助。