【问题标题】:VHDL: bound check error when adding two numbersVHDL:添加两个数字时的边界检查错误
【发布时间】: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) 指定了更长的长度,这将在运行时产生边界检查错误 - 右侧没有匹配的元素对于分配左侧的每个元素。

标签: vhdl ghdl


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 也就是说,运算符两边的每个信号都应该具有完全匹配的类型和大小。 这不是真的。例如 IEEE Std 1076-2008 9.2.3 关系运算符第 4 段“...相同类型的两个复合值相等当且仅当对于左操作数的每个元素都有一个 匹配元素右操作数,反之亦然,并且匹配元素的值相等,由元素类型的预定义相等运算符给出。特别是,相同类型的两个空数组始终相等。..."。跨度>
    • 还有算术运算符,特别是连接或其他方式以及包 numeric_std 和 numeric_bit 中的乘法运算符作为更多示例。还有杂项指数运算符。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多