为什么此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:错误:模拟失败
答案 0 :(得分:2)
加法向量操作数的长度应与赋值目标的长度相同。如果需要扩展:
result <= ('0' & arg1) + '1';
答案 1 :(得分:0)
我想在@renaud的答案中添加注释。 VHDL是强类型语言,也就是说,运算符两侧的每个信号都应具有完全匹配的类型和大小。 因此,必须注意确保在表达式中使用的所有信号的类型和大小都相同。 在代码中,由于您为溢出分配了额外的位,因此您还应该更改输入信号的大小。 但是,这在verilog中不是问题,它通过填充位来解决不匹配问题。 尽管令人沮丧,但VHDL在模拟之前清除许多错误方面非常有帮助。