说明
我想包括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;
我的部分问题是,我不知道在哪里放置这些断言语句,我不知道如何编写它们。
答案 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的波屏。
另请注意,这些断言和报告仅适用于模拟。