vhdl DFF声明声明

时间:2014-03-22 20:36:29

标签: vhdl assert

说明
我想包括vhdl assert语句来报告何时发生set_delay和hold_delay时间违规。我不知道如何使用我的代码执行此操作,而且我已经访问过网络上的许多地方而且我不明白。请举例说明我的代码。

代码:

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY dff IS 
GENERIC (set_delay : TIME := 3 NS; prop_delay : TIME := 12 NS; 
        hold_delay : TIME := 5 NS);
PORT (d, set, rst, clk : IN BIT; q : OUT BIT; nq : OUT BIT := '1');
END dff;
--
ARCHITECTURE dff OF dff IS
SIGNAL state : BIT := '0';
BEGIN
 dff: PROCESS
BEGIN
  wait until rst;
  wait until set;
  wait until clk;

IF set = '1' THEN
  q <= '1' AFTER set_delay;
  nq <= '0' AFTER set_delay;
ELSIF rst = '1' THEN
  q <= '0' AFTER prop_delay;
  nq <= '1' AFTER prop_delay;
ELSIF clk = '1' AND clk'EVENT THEN
  q <= d AFTER hold_delay; 
  nq <= NOT d AFTER hold_delay;
END IF;
END PROCESS dff;
END dff;

我明白一般的断言语法是:

ASSERT
condition
REPORT
"message"
SEVERITY
severity level;

我的部分问题是,我不知道在哪里放置这些断言语句,我不知道如何编写它们。

1 个答案:

答案 0 :(得分:0)

我会介绍其他信号,您可以在其中存储上次操作的时间。然后我会添加其他管理信号并检查时间的过程:。

time_debug : block
signal t_setup, t_hold : time := 0 ns;
begin

setup_check : process (clk)
begin
if clk'event and clk = '1' then
  t_hold <= now;
  assert (t_setup - now)>set_delay REPORT "Setup time violated." SEVERITY note;
end if;
end process setup_check;

hold_check: process (d)
begin 
if d'event then
  t_setup <= now;  
  assert (t_hold - now)>hold_delay REPORT "Hold time violated." SEVERITY note;
end if; 
end process hold_check;
end block time_debug;

这样做可以节省上一个正时钟沿的时间和最后一次输入变化的时间。现在,每当d改变或时钟上升时,都会检查延迟。我无法在编译器中验证这一点,因为我没有在此设置,但如果此解决方案存在问题,我很乐意这样做。

我个人喜欢将调试内容保存在专用块中,因此我可以轻松跟踪哪些信号仅用于调试,以后可以轻松删除它们。它还可以更容易地将所有调试信号添加到例如modelsim的波屏。

另请注意,这些断言和报告仅适用于模拟。