Vivado: Предупреждение Синхронизирующий контакт x_reg.C не доступен для синхронизации (TIMING-17)

Я пытаюсь скомпилировать код FPGA с помощью инструмента Xilinx Vivado. Однако, когда я запускаю «Синтез», а затем выбираю «Методология отчета»… я получаю следующий список плохих практик:


TIMING-17
TIMING #1 Warning The clock pin last_anthony_reg.C is not reached by a timing clock 
TIMING #2 Warning The clock pin last_paul_reg.C is not reached by a timing clock 
TIMING #3 Warning The clock pin last_steven_reg.C is not reached by a timing clock 

Мне интересно, что вызывает это сообщение «ПРЕДУПРЕЖДЕНИЕ»… Я пытался посмотреть на схему… но мне кажется, что все в порядке… просто вижу FDCE и некоторые LUTS, ничего необычного.

Вот мой объект VHDL для верхнего уровня FPGA:

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

entity example1 is
    port(
        clk           :in    std_logic;
        clear         :in    std_logic;

        richard       :out   std_logic;
        james         :in    std_logic;
        michael       :in    std_logic;
        william       :out   std_logic;       
        david         :out   std_logic;       
        robert        :in    std_logic
    );
end entity;

И архитектура VHDL:

architecture rtl of example1 is
    signal matthew                :std_logic_vector(1 downto 0);
    signal anthony, last_anthony  :std_logic;
    signal steven,  last_steven   :std_logic;
    signal paul,    last_paul     :std_logic;    
begin

process(clk)
begin
    if (rising_edge(clk)) then
        last_anthony <= anthony;
        last_steven  <= steven;
        last_paul    <= paul;
    end if;
end process;

matthew <= (michael and not last_paul) & (robert and not last_steven);

process(
    clear,
    matthew,
    james,    
    last_anthony,
    last_steven,
    last_paul    
)
begin

    if (clear = '1') then
        anthony  <= '0';
        steven   <= '0';
        paul     <= '1';          
    else
        --defaults

        case matthew is

        when "00" =>
            anthony  <= james;
            steven   <= '1';
            paul     <= '0';

        when "01" =>
            anthony  <= last_anthony;
            steven   <= last_steven;
            paul     <= last_paul;

        when "10" =>
            anthony  <= james;
            steven   <= '1';
            paul     <= '0';

        when "11" =>
            anthony  <= last_anthony;
            steven   <= '0';
            paul     <= '1';

        --synthesis translate_off                
        when others =>
            anthony  <= 'X';
            steven   <= 'X';
            paul     <= 'X';
        --synthesis translate_on

        end case;            
    end if;
end process;

william   <= steven;
david     <= paul;
richard   <= anthony;    

end architecture;

person pico    schedule 14.08.2019    source источник
comment
TIMING-17: Несинхронизированная последовательная ячейка Тактовый вывод ‹PIN_NAME› не достигнут синхронизирующими часами. Описание: DRC сообщает список последовательных ячеек, не ограниченных синхронизирующими часами, которые влияют на результирующий временной анализ для сообщаемых ячеек. Настоятельно рекомендуется, чтобы все часы были правильно определены, чтобы получить максимальное покрытие пути синхронизации с наилучшей точностью. Следствием этого может быть отсутствие анализа синхронизации, что может привести к аппаратным сбоям.   -  person pico    schedule 14.08.2019
comment
Решение: решение состоит в том, чтобы создать отсутствующие первичные или сгенерированные часы в дереве часов, управляющем неограниченными последовательными ячейками.   -  person pico    schedule 14.08.2019
comment
как это сделать? Кроме того, есть ли способ сделать это с атрибутом vhdl в коде? Я думал, что vivado автоматически помечает все сигналы clk в названии как часы. я просто не предоставляю тактовый период.   -  person pico    schedule 14.08.2019
comment
Разве vivado не может просто сделать вывод, какой сигнал является тактовым, основываясь на том, какой сигнал когда-либо будет позиционным или выражениемrising_edge? это то, что раньше делал ISE, когда вы просто запускали этап синтеза без запуска этапа реализации...   -  person pico    schedule 14.08.2019
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он относится к другому сайту в сети Stack Exchange — Electronics.   -  person Matthew Taylor    schedule 15.08.2019
comment
Оказывается, у Vivado спрятан еще один уровень линтинга кода, который выполняется перед уровнем Synthesis. Доступ к нему можно получить в меню потока... перейдите в Flow->Elaborate Design, затем нажмите RTL Analysis->Open Elaborated Design->Report Methodology... этот уровень линтинга не имеет никаких временных правил...   -  person pico    schedule 16.08.2019


Ответы (1)


Разве vivado не может просто сделать вывод о том, какой сигнал является тактовым, основываясь на том, какой когда-либо сигнал идет на выражение «posedge» или «rising_edge»?

Vivado знает, что такое все часы (в конце концов, он выдает вам предупреждение о вашем тактовом выводе), но он не знает параметры этих часов: частоту, рабочий цикл и т. д. Вот на что он жалуется: до вывода доходит часы, но не часы, которые имеют информацию о времени: «часы времени».

Вы должны указать их в файле ограничений, например:

# define ext pll clock as 100 MHz for timing check
create_clock -period 10.000 -name ext_pll_in [get_ports PL_HP66]

Насколько я знаю, существует «Мастер ограничений», но я никогда им не пользовался.
Вы получаете доступ к опции «Мастер ограничений» после того, как запустите синтез, а затем «откроете синтезированный проект».

person Oldfart    schedule 15.08.2019
comment
вы, вероятно, правы... но, на мой взгляд, у Vivado просто есть некоторые плохие правила линтинга кода, которые необходимо исправить... Xilinx должна просто использовать список часов, которые уже были выведены путем синтеза кода, и удалить эту подделку. предупреждение, заменив его реальным предупреждающим сообщением, например: эй, чувак-дизайнер fpga, ты не сказал нам период часов для этих часов, это вызовет проблемы, когда ты запустишь оптимизацию времени на этапе реализации... и тогда я можно сказать, мне все равно... я запускаю синтез только для проверки кода, а не для установки временных ограничений... - person Bimo; 15.08.2019
comment
@BillMoore Мне приходится (вздох ..) работать с инструментами Xilinx ежедневно. Я перестал удивляться их странным сообщениям и способу работы. Некоторые части отличные, другие просто отстой. - person Oldfart; 15.08.2019