【发布时间】: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 网络中的另一个站点 - 电子产品。