【发布时间】:2019-08-01 17:29:08
【问题描述】:
为什么这个 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:error: testbench.vhd:13 的绑定检查失败来自: 在 testbench.vhd:13 处理 work.testbench(sim).P0
ghdl.exe:error: 模拟失败
【问题讨论】:
-
是的,你错过了一些东西。请注意,arg1 的边界是无符号的(dw-1 downto 0),它将定义结果的长度(对于-2008 兼容性 numeric_std,--std=08 的任一操作数中的较大者。“+”会将右操作数转换为std_ulogic_vector 具有左操作数的长度)。结果长度将与左操作数长度匹配,但您为结果 unsigned(dw+0 downto 0) 指定了更长的长度,这将在运行时产生边界检查错误 - 右侧没有匹配的元素对于分配左侧的每个元素。