奇怪的签名比较结果

时间:2018-12-10 12:17:43

标签: vhdl signed

在比较2位std_logic_vectorstd_logic_signed包并加载到x"3"等十六进制常量时,我​​遇到了意外的比较结果。我期望两个位都置位时比较结果为true,但始终为false。可能是因为std_logic_vector的符号扩展到4位,以便与4位十六进制常量进行比较。但是,真正奇怪的是,使用常量3时,比较可以按预期进行,但是仅当使用std_logic_vector时,而不是使用signed类型时,比较才能正常进行。请参见下面的示例代码。除第一个断言外,所有断言均失败。为什么此断言成功?同样,当不加载std_logic_signed软件包时,vec0 = x"3"比较仍然失败。仅在加载std_logic_unsigned时此比较才能成功。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_signed.all;

entity tb is
end entity;

architecture bhv of tb is
    signal vec0 : std_logic_vector(1 downto 0) := (others => '1');
    signal vec1 : signed(1 downto 0)           := (others => '1');
begin
    process
    begin
        assert vec0 = 3     report "Test 1";
        assert vec0 = x"3"  report "Test 2";
        assert vec1 = 3     report "Test 3";
        assert vec1 = x"3"  report "Test 4";
        wait;
    end process;
end architecture;

1 个答案:

答案 0 :(得分:1)

使用有符号/无符号进行比较时,两个操作数都将扩展为最长操作数的长度,然后进行比较。

因此,对于x“ 3”情况,您有一个4位数字“ 0011” = +3

vec0和vec1 =“ 11” = -1。因为它们被SLV视为已签名或实际已签名,所以将它们扩展为“ 1111”。因此,“ 1111”不等于“ 0011”。

将带符号/ slv与整数进行比较时,该整数将转换为另一个操作数长度的向量。在这两种情况下,文字3都不能转换为带符号的2位(因为范围是-2到+1)

对于std_logic_signed(非标准VHDL软件包),该函数的工作方式将3转换为“ 11”。因此,您会得到一个匹配项(不正确)

Numeric_std具有检查功能,其中有符号(或无符号)操作数范围之外的整数会自动返回false。

numeric_std是VHDL标准。

道德-不要打扰使用std_logic_signed。