奇怪的签名比较结果

在将2位 std_logic_vectorstd_logic_signed 包加载到十六进制常量(如 x"3" )时,我遇到了意外的比较结果 . 当两个位都设置但我总是假的时候,我希望比较是真的 . 可能是因为 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)

2 years ago

当使用signed / unsigned进行比较时,两个操作数都会扩展到最长操作数的长度,然后进行比较 .

因此,对于x“3”的情况,你有一个4位数“0011”= 3

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

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

对于std_logic_signed(非标准VHDL包),3根据函数的工作方式转换为“11” . 因此你得到一个匹配(不正确)

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

numeric_std是VHDL标准 .

道德 - 不要使用std_logic_signed .