【问题标题】:Vivado: Warning The clock pin x_reg.C is not reached by a timing clock (TIMING-17)Vivado:警告时钟引脚 x_reg.C 未到达时钟 (TIMING-17)
【发布时间】:2019-08-14 19:30:10
【问题描述】:

我正在尝试使用 Xilinx 的 Vivado 工具编译一些 FPGA 代码。但是,当我运行“综合”然后选择“报告方法”时...我得到以下不良做法列表:


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,那里没有任何异常.

这是我用于 FPGA 顶层的 VHDL 实体:

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;

【问题讨论】:

  • TIMING-17: Non-Clocked Sequential Cell 时钟引脚 未被定时时钟到达。说明:DRC 报告不受时序时钟约束的时序单元列表,这会影响报告单元的结果时序分析。强烈建议正确定义所有时钟,以便以最佳精度获得最大时序路径覆盖。结果可能是缺少时序分析,这可能导致硬件故障。
  • 解决方案:解决方案是在驱动无约束时序单元的时钟树上创建丢失的主时钟或生成时钟
  • 怎么做?另外,有没有办法在代码中使用 vhdl 属性来做到这一点?我以为 vivado 会自动将名称中带有“clk”的所有信号标记为时钟。我只是没有提供时钟周期。
  • 不能 vivado 仅仅根据哪个信号将要“posedge”或“rising_edge”语句来推断哪个信号是时钟吗?当您只运行“综合步骤”而不运行“实施步骤”时,这就是“ISE”过去所做的......
  • 我投票决定将此问题作为题外话结束,因为它属于 Stack Exchange 网络中的另一个站点 - 电子产品。

标签: vhdl fpga xilinx vivado


【解决方案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]

我知道有一个“约束向导”,但我从未使用过它。
运行综合后进入“约束向导”选项,然后“打开综合设计”。

【讨论】:

  • 你可能是对的......但是,在我看来,Vivado 只是有一些糟糕的编码 linting 规则需要修复......Xilinx 应该只使用已经推断出的时钟列表通过合成代码并删除此虚假警告,将其替换为真正的警告消息,例如:“嘿,fpga 设计师老兄,您没有告诉我们此时钟的时钟周期,这会在您运行时序优化时造成麻烦在实现步骤中”...然后我可以说,我不在乎...我只是在运行综合来整理代码而不是设置时序约束...
  • @BillMoore 我必须(叹息..)每天使用 Xilinx 工具。我不再想知道他们奇怪的信息和工作方式。有些部分很棒,有些则很烂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多