2

为什么这个 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=disable

ghdl.exe:错误:testbench.vhd:13 的绑定检查失败来自:testbench.vhd:13 处的 process work.testbench(sim).P0

ghdl.exe:错误:模拟失败

4

2 回答 2

4

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

result <= ('0' & arg1) + '1';
于 2019-08-05T06:25:59.923 回答
1

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

于 2019-08-05T10:35:11.867 回答