В утверждениях VHDL, как бороться с 4-значной логикой?

Я новичок в VHDL, и я работаю над проектом.

но что-то недавно заблокировало меня

   if reset='0' then 
      prstate<="00";
      else if rising_edge(clock)  then
      case  prstate  is
          when "00"=> 
               if wd_link='1'   then
               prstate<="01";
          when "01"=> 
               (do something and) prstate<="10";
          when "10"=> 
                (do something and) prstate<="11";  
          when "11"=> 
                (do something and) prstate<="00";  
          when others=>   prstate<="00"; ----please pay attention to this line

RTL симуляция:

сначала я удалил последнюю строку, но модели сказали, что из 81 только 4 оператора case. Господи, я учил, что 1 бит содержит 9 значений. Может, последняя строка используется для исправления ошибок? возможно, когда prstate имеет значение "0x" или "xx", эта строка переводит его в 00?

после синтеза с помощью Synopsys DC появляется предупреждение (о регистре): ветвь регистра по умолчанию не может быть достигнута. Ха! Я не знаю почему, и мне все равно.

Пост симуляция (с использованием одного и того же тестового стенда и списка соединений):

после того, как я установил и отпустил ввод сброса, modelsim показал, что другой модуль дает wd_link "x", что вызывает большую ошибку => prstate<="xx" и xx, и xx, и заканчивается xx...even wd_link восстанавливается до 0 или 1.

Я предполагаю:DC не согласен с 4-значной логикой (01xz) или 9-значной логикой. Поэтому последняя строка уничтожена. Но что я могу сделать?

Пожалуйста, помогите мне, все вы мой бог. Спасибо! Искренне.

2 ответа

Решение

Если значение prstate всегда должен быть четко определен ("00", "01", "10" или же "11"), то вы можете распространять любые неопределенные значения, если используете:

when others => prstate <= (others => "XX");

Симуляция покажет 'X's в большем количестве мест в случае ошибки, тем самым облегчая ловлю.

Синтез обычно будет использовать 'X's как свобода сделать список соединений меньше или быстрее, в зависимости от требований.

std_logic - это многозначная логическая система с 9 значениями.

Оператор case (IEEE Std 1076-2008 10.9 Case case) требует, чтобы все значения были представлены как варианты (пункт 5).

Есть несколько других вещей, которые вы могли бы сделать, кроме ответа Мортена. Вы можете преобразовать выражение случая std_logic_vector в переменную bit_vector с помощью функции пакета std_logic_1164 to_bitvector (отмечая, что вы не продемонстрировали объявление для prstate).

architecture fum of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
        variable prstate_proxy: bit_vector (1 downto 0); -- locally static range
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            prstate_proxy := to_bitvector(prstate);
            case  prstate_proxy  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               -- when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;
end architecture;

Обратите внимание, что диапазон одномерного массива, используемого в качестве выражения оператора case, должен быть известен во время анализа (локально статический). Это удовлетворяется объявлением переменной.

Вы также можете оставить "последовательность утверждений" для других вариантов выбора пустой со всеми имеющимися вариантами двоичных значений:

library ieee;
use ieee.std_logic_1164.all;

entity others_case is
    port (
        reset:  in  std_logic;
        clock:  in  std_logic
    );
end entity;

architecture foo of others_case is
    signal wd_link:     std_logic;
    signal prstate:     std_logic_vector(1 downto 0);

   function do_something return boolean is
    begin
        return true;
    end function;
begin

    process (reset, clock)
    begin
        if reset = '0' then 
            prstate <= "00";
        elsif rising_edge(clock)  then
            case  prstate  is
                when "00" => 
                    if wd_link = '1'   then
                        prstate <= "01";
                    end if;  -- ADDED
               when "01" => 
                     if do_something then
                         prstate <= "10";
                     end if;
               when "10" => 
                   if do_something then
                       prstate <= "11";
                   end if; 
               when "11" => 
                   if do_something then
                       prstate <= "10";
                   end if; 
               when others =>  ----please pay attention to this line
           end case;
       end if;
    end process;

end architecture;

Обратите внимание на отсутствие точки с запятой (разделитель операторов) в выборе других, когда нет оператора перед конечным оператором. Это обеспечивает эквивалентный эффект ответа Мортена.

Эти архитектуры и декларации сущностей представляют собой пример Minimal, Complete и Verifiable, и, хотя ничего не делает интересного, когда моделируется, он должен быть действительным для синтеза.

Не видя остальную часть вашей спецификации проекта, вам не нужно иметь дело с металогическими значениями в вашем случае, когда вы сбрасываете prstate. Присвоения металогических значений не действительны для синтеза.

Другой выбор обозначает все возможные варианты, не упомянутые конкретно в предыдущих альтернативных случаях, или может отсутствовать.

Представление std_ulogic со значением 9 подразделяется на три класса для синтеза. Значения, которые отображаются в двоичные значения, металогические значения и значение высокого импеданса ('Z').

"H" и "L" отображаются на "1" и "0" соответственно для синтеза.

Металогические значения ("U", "W", "X" и "-") не используются в качестве входных данных для оценки кода VHDL во время синтеза.

"Z" представляет значение, которое может быть переопределено дополнительным драйвером.

Невозможно сделать присваивание или выбор управления на основе значения 'Z' в примитивной библиотеке уровня логических элементов (RTL). Они могли бы так же легко найти другой выбор, который стоял без выбора.

Стандарт IEEE 1076-2008, пункт 10.9, заявление 9:

Выбор других разрешен только для последней альтернативы и как ее единственный выбор; оно обозначает все значения (возможно, ни одного), не указанные в вариантах предыдущих альтернатив.

16.8.2.4.10 Интерпретация значения высокого импеданса ('Z') параграфа 4:

Всякий раз, когда статическое значение высокого импеданса встречается в любом контексте, отличном от выражения значения в операторе присваивания, инструмент синтеза должен рассматривать его как эквивалент статического металогического значения.

16.8.2.4.5 Металогические значения как выбор в описании дела, пункт 1:

Если металогическое значение встречается как выбор или как элемент выбора, в операторе case, который интерпретируется инструментом синтеза, инструмент синтеза должен интерпретировать выбор как тот, который никогда не может произойти. То есть генерируемая интерпретация не обязана содержать какие-либо конструкции, соответствующие наличию или отсутствию последовательности операторов, связанных с выбором.

Synopsys предупреждает о проблеме, которая не существует в синтезе RTL (см. Также отозванный стандарт IEEE Std-1076.6-2004, 5. Методология проверки, подтверждающая синтезированную спецификацию проекта, не зависит от ввода металогических значений).

Другие вопросы по тегам