是否已为VHDL numeric_std签名/未签名定义溢出

det*_*tly 5 standards integer-overflow vhdl

如果我有一个unsigned(MAX downto 0)包含该值2**MAX - 1,那么VHDL(87 | 93 | 200X)标准是否定义了当我将其递增1时会发生什么?(或者,类似地,当我从零减去一个?)

wap*_*p26 6

简短回答:

没有溢出处理,溢出进位就丢失了.因此,结果只是您的操作模2 ^ MAX的整数结果.

更长的回答:

numeric_std软件包是标准软件包,但它不是核心VHDL标准(87,93,200X).供参考:numeric_std.vhd

最后+操作员调用ADD_UNSIGNED (L, R : unsigned; C : std_logic)函数(with C = '0').请注意,任何整数/自然操作数首先转换为unsigned.

该函数的定义是:

function ADD_UNSIGNED (L, R : unsigned; C : std_logic) return unsigned is
    constant L_left : integer   := L'length-1;
    alias XL        : unsigned(L_left downto 0) is L;
    alias XR        : unsigned(L_left downto 0) is R;
    variable RESULT : unsigned(L_left downto 0);
    variable CBIT   : std_logic := C;
begin
    for i in 0 to L_left loop
        RESULT(i) := CBIT xor XL(i) xor XR(i);
        CBIT      := (CBIT and XL(i)) or (CBIT and XR(i)) or (XL(i) and XR(i));
    end loop;
    return RESULT;
end ADD_UNSIGNED;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,如果CBIT='1'(携带位)发生"溢出" i = L_left.结果位RESULT(i)正常计算,最后一个进位bot值被忽略.