要检查保持时间,您必须使用等待语句来实现 DFF。这使您可以手动控制时间进度,以在时钟沿之后和之前检查参数。一个不明显的“技巧”是使用 d'delayed 创建具有 delta 周期延迟的新信号,这使我们能够避免从 d 上的任何同时转换而是从 d 上的先前转换测量保持稳定属性。
我已将 Clock-to-Q 参数作为一个独立的泛型分开,因为这通常与保持时间不同。另请注意,此技术不适用于负保持或设置时间,因此我使用delay_length
.
library ieee;
use ieee.std_logic_1164.all;
entity dff is
generic (
Tsu : delay_length := 8 ns; -- Setup
Thld : delay_length := 5 ns; -- Hold
Tcq : delay_length := 6 ns -- Clock to Q delay
);
port (
clock, d : in std_logic;
q : out std_logic
);
end entity;
architecture behavior of dff is
begin
process
begin
assert Tcq >= Thld report "Tcq must be >= Thld" severity failure;
wait until falling_edge(clock);
if d'stable(Tsu) then
wait for Thld;
if d'delayed'stable(Thld) then
q <= d after Tcq - Thld;
else -- Hold violation
report "Hold violation" severity warning;
q <= 'X' after Tcq - Thld;
end if;
else -- Setup violation
report "Setup violation" severity warning;
q <= 'X' after Tcq;
end if;
end process;
end architecture;