vhdl DFF断言语句

vhdl DFF断言语句,vhdl,assert,Vhdl,Assert,说明: 我想包括vhdl assert语句,以报告何时发生set_delay和hold_delay time冲突。我不知道如何用我的代码做到这一点,我去过很多网站,我不明白。请用我的代码举例说明 代码: 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

说明:
我想包括vhdl assert语句,以报告何时发生set_delay和hold_delay time冲突。我不知道如何用我的代码做到这一点,我去过很多网站,我不明白。请用我的代码举例说明

代码:

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;

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

我将引入额外的信号,在其中存储上次操作的时间。然后,我将添加其他进程来管理信号并检查时间:

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;
time\u调试:块
信号t_设置,t_保持:时间:=0 ns;
开始
设置检查:进程(clk)
开始
如果clk'事件和clk='1',则
t\u保持设置延迟报告“违反设置时间”。严重性注释;
如果结束;
结束进程设置检查;
保持检查:过程(d)
开始
如果是d'event那么
t\u设置保持延迟报告“违反保持时间”。严重性注释;
如果结束;
结束过程保持检查;
结束块时间\u调试;
这样做的目的是节省最后一个正时钟边缘的时间和最后一次输入更改的时间。现在,每次d改变或时钟上升时,都会检查延迟。我无法在编译器中验证这一点,因为我没有在这里设置编译器,但如果此解决方案存在问题,我很乐意这样做

我个人喜欢将调试内容保存在一个专用块中,这样我就可以很容易地跟踪我只用于调试的信号,并且以后可以很容易地删除它们。它还可以更容易地将所有调试信号添加到modelsim的wave屏幕中

还请注意,这些断言和报告仅在模拟中有效

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;