Странные подписанные результаты сравнения - PullRequest
0 голосов
/ 10 декабря 2018

Я столкнулся с неожиданным результатом сравнения при сравнении 2-битного std_logic_vector с пакетом std_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 Ответ

0 голосов
/ 10 декабря 2018

Когда сравнение выполняется с использованием знака / без знака, оба операнда расширяются до длины самого длинного операнда, а затем сравниваются.

Итак, для случая «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.

...